From d421ec26e2c34912cb2d8f85e729cd226ba4fe0d Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 13:26:57 +0400 Subject: [PATCH 001/103] Android toolchain: fixed ccache search --- android/android.toolchain.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index 8e653a007..47918ade5 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -692,8 +692,7 @@ endif() # ccache support __INIT_VARIABLE( NDK_CCACHE ENV_NDK_CCACHE ) if( NDK_CCACHE ) - get_filename_component(NDK_CCACHE "${NDK_CCACHE}" ABSOLUTE) - set( NDK_CCACHE "${NDK_CCACHE}" CACHE PATH "The path to ccache binary" FORCE ) + find_program(NDK_CCACHE "${NDK_CCACHE}" DOC "The path to ccache binary") else() unset( NDK_CCACHE ) endif() From 95d54196dbe8a3562feef3cd251e03a7878fec93 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 13:30:11 +0400 Subject: [PATCH 002/103] Android camera: fix logging macro --- modules/androidcamera/src/camera_activity.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/androidcamera/src/camera_activity.cpp b/modules/androidcamera/src/camera_activity.cpp index 23b39a1af..6954e49a5 100644 --- a/modules/androidcamera/src/camera_activity.cpp +++ b/modules/androidcamera/src/camera_activity.cpp @@ -6,10 +6,15 @@ #include "camera_activity.hpp" #include "camera_wrapper.h" -#define LOG_TAG "CAMERA_ACTIVITY" +#undef LOG_TAG +#undef LOGE +#undef LOGD +#undef LOGI + +#define LOG_TAG "OpenCV::camera" +#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) -#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) /////// // Debug From 0bd68a70f141d4f98dbe75339740ef2ad83ff74f Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 28 Aug 2012 13:45:35 +0400 Subject: [PATCH 003/103] fixed #2297, #2300; fixed several warnings --- modules/core/include/opencv2/core/mat.hpp | 2 +- modules/core/include/opencv2/core/operations.hpp | 13 +++++++------ modules/core/src/array.cpp | 2 +- modules/core/src/cmdparser.cpp | 4 +++- modules/core/src/opengl_interop.cpp | 4 ++-- modules/core/src/persistence.cpp | 2 +- modules/core/test/test_ds.cpp | 8 ++++---- modules/core/test/test_rand.cpp | 2 +- modules/flann/include/opencv2/flann/lsh_index.h | 4 ++-- .../photo/src/fast_nlmeans_denoising_invoker.hpp | 2 +- .../src/fast_nlmeans_multi_denoising_invoker.hpp | 2 +- modules/ts/src/ts_gtest.cpp | 4 +++- 12 files changed, 27 insertions(+), 22 deletions(-) diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index ccc02571e..92301cf3b 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -404,7 +404,7 @@ inline bool Mat::empty() const { return data == 0 || total() == 0; } inline size_t Mat::total() const { if( dims <= 2 ) - return rows*cols; + return (size_t)rows*cols; size_t p = 1; for( int i = 0; i < dims; i++ ) p *= size[i]; diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 932d9fbd8..af89bbf3a 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -866,7 +866,7 @@ template struct CV_EXPORTS Matx_FastSolveOp template struct CV_EXPORTS Matx_FastSolveOp<_Tp, 2, 1> { bool operator()(const Matx<_Tp, 2, 2>& a, const Matx<_Tp, 2, 1>& b, - Matx<_Tp, 2, 1>& x, int method) const + Matx<_Tp, 2, 1>& x, int) const { _Tp d = determinant(a); if( d == 0 ) @@ -1244,7 +1244,7 @@ template<> inline Vec Vec::conj() const return conjugate(*this); } -template inline Vec<_Tp, cn> Vec<_Tp, cn>::cross(const Vec<_Tp, cn>& v) const +template inline Vec<_Tp, cn> Vec<_Tp, cn>::cross(const Vec<_Tp, cn>&) const { CV_Error(CV_StsError, "for arbitrary-size vector there is no cross-product defined"); return Vec<_Tp, cn>(); @@ -2466,7 +2466,8 @@ dot(const Vector<_Tp>& v1, const Vector<_Tp>& v2) { const _Tp *ptr1 = &v1[0], *ptr2 = &v2[0]; #if CV_ENABLE_UNROLLED - for(; i <= n - 4; i += 4 ) + const size_t n2 = (n > 4) ? n : 4; + for(; i <= n2 - 4; i += 4 ) s += (_Tw)ptr1[i]*ptr2[i] + (_Tw)ptr1[i+1]*ptr2[i+1] + (_Tw)ptr1[i+2]*ptr2[i+2] + (_Tw)ptr1[i+3]*ptr2[i+3]; #endif @@ -2500,7 +2501,7 @@ inline RNG::operator double() unsigned t = next(); return (((uint64)t << 32) | next())*5.4210108624275221700372640043497e-20; } -inline int RNG::uniform(int a, int b) { return a == b ? a : next()%(b - a) + a; } +inline int RNG::uniform(int a, int b) { return a == b ? a : (int)(next()%(b - a) + a); } inline float RNG::uniform(float a, float b) { return ((float)*this)*(b - a) + a; } inline double RNG::uniform(double a, double b) { return ((double)*this)*(b - a) + a; } @@ -2937,8 +2938,8 @@ inline bool FileNode::isNamed() const { return !node ? false : (node->tag & NAME inline size_t FileNode::size() const { int t = type(); - return t == MAP ? ((CvSet*)node->data.map)->active_count : - t == SEQ ? node->data.seq->total : (size_t)!isNone(); + return t == MAP ? (size_t)((CvSet*)node->data.map)->active_count : + t == SEQ ? (size_t)node->data.seq->total : (size_t)!isNone(); } inline CvFileNode* FileNode::operator *() { return (CvFileNode*)node; } diff --git a/modules/core/src/array.cpp b/modules/core/src/array.cpp index f065a1e41..c9060bf6d 100644 --- a/modules/core/src/array.cpp +++ b/modules/core/src/array.cpp @@ -861,7 +861,7 @@ cvCreateData( CvArr* arr ) if( CV_IS_MAT_CONT( mat->type )) { total_size = (size_t)mat->dim[0].size*(mat->dim[0].step != 0 ? - mat->dim[0].step : total_size); + (size_t)mat->dim[0].step : total_size); } else { diff --git a/modules/core/src/cmdparser.cpp b/modules/core/src/cmdparser.cpp index b5c838c9d..d7be05418 100644 --- a/modules/core/src/cmdparser.cpp +++ b/modules/core/src/cmdparser.cpp @@ -7,7 +7,8 @@ using namespace std; using namespace cv; namespace { -void helpParser() +#if 0 +static void helpParser() { printf("\nThe CommandLineParser class is designed for command line arguments parsing\n" "Keys map: \n" @@ -50,6 +51,7 @@ void helpParser() " It also works with 'unsigned int', 'double', and 'float' types \n" ); } +#endif vector split_string(const string& str, const string& delimiters) { diff --git a/modules/core/src/opengl_interop.cpp b/modules/core/src/opengl_interop.cpp index bf9deaadb..5895363cd 100644 --- a/modules/core/src/opengl_interop.cpp +++ b/modules/core/src/opengl_interop.cpp @@ -113,13 +113,13 @@ namespace const CvOpenGlFuncTab* g_glFuncTab = 0; -//#ifdef HAVE_CUDA +#if defined HAVE_CUDA || defined HAVE_OPENGL const CvOpenGlFuncTab* glFuncTab() { static EmptyGlFuncTab empty; return g_glFuncTab ? g_glFuncTab : ∅ } -//#endif +#endif } CvOpenGlFuncTab::~CvOpenGlFuncTab() diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index 049b7fb7d..d060ac3b0 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -2793,7 +2793,7 @@ cvOpenFileStorage( const char* filename, CvMemStorage* dststorage, int flags, co fs->buffer_end = fs->buffer_start + buf_size; if( fs->fmt == CV_STORAGE_FORMAT_XML ) { - size_t file_size = fs->file ? ftell( fs->file ) : (size_t)0; + size_t file_size = fs->file ? (size_t)ftell( fs->file ) : (size_t)0; fs->strstorage = cvCreateChildMemStorage( fs->memstorage ); if( !append || file_size == 0 ) { diff --git a/modules/core/test/test_ds.cpp b/modules/core/test/test_ds.cpp index 7a5c6f182..d79786054 100644 --- a/modules/core/test/test_ds.cpp +++ b/modules/core/test/test_ds.cpp @@ -845,7 +845,7 @@ int Core_SeqBaseTest::test_seq_ops( int iters ) cvtest::randUni( rng, elem_mat, cvScalarAll(0), cvScalarAll(255) ); whence = op - 7; - pos = whence < 0 ? 0 : whence > 0 ? sseq->count : cvtest::randInt(rng) % (sseq->count+1); + pos = whence < 0 ? 0 : whence > 0 ? sseq->count : (int)(cvtest::randInt(rng) % (sseq->count+1)); if( whence != 0 ) { cvSeqPushMulti( seq, elem, count, whence < 0 ); @@ -866,8 +866,8 @@ int Core_SeqBaseTest::test_seq_ops( int iters ) if( sseq->count > 0 ) { // choose the random element among the added - pos = count > 0 ? cvtest::randInt(rng) % count + pos : MAX(pos-1,0); - elem2 = cvGetSeqElem( seq, pos ); + pos = count > 0 ? (int)(cvtest::randInt(rng) % count + pos) : MAX(pos-1,0); + elem2 = cvGetSeqElem( seq, pos ); CV_TS_SEQ_CHECK_CONDITION( elem2 != 0, "multi push operation doesn't add elements" ); CV_TS_SEQ_CHECK_CONDITION( seq->total == sseq->count && memcmp( elem2, cvTsSimpleSeqElem(sseq,pos), elem_size) == 0, @@ -889,7 +889,7 @@ int Core_SeqBaseTest::test_seq_ops( int iters ) count = cvtest::randInt(rng) % (sseq->count+1); whence = op - 10; pos = whence < 0 ? 0 : whence > 0 ? sseq->count - count : - cvtest::randInt(rng) % (sseq->count - count + 1); + (int)(cvtest::randInt(rng) % (sseq->count - count + 1)); if( whence != 0 ) { diff --git a/modules/core/test/test_rand.cpp b/modules/core/test/test_rand.cpp index 8fab1656b..e93415b3b 100644 --- a/modules/core/test/test_rand.cpp +++ b/modules/core/test/test_rand.cpp @@ -168,7 +168,7 @@ void Core_RandTest::run( int ) int sz = 0, dsz = 0, slice; for( slice = 0; slice < maxSlice; slice++, sz += dsz ) { - dsz = slice+1 < maxSlice ? cvtest::randInt(rng) % (SZ - sz + 1) : SZ - sz; + dsz = slice+1 < maxSlice ? (int)(cvtest::randInt(rng) % (SZ - sz + 1)) : SZ - sz; Mat aslice = arr[k].colRange(sz, sz + dsz); tested_rng.fill(aslice, dist_type, A, B); } diff --git a/modules/flann/include/opencv2/flann/lsh_index.h b/modules/flann/include/opencv2/flann/lsh_index.h index fc4cebb63..13627cabc 100644 --- a/modules/flann/include/opencv2/flann/lsh_index.h +++ b/modules/flann/include/opencv2/flann/lsh_index.h @@ -260,8 +260,8 @@ private: * @param k_nn the number of nearest neighbors * @param checked_average used for debugging */ - void getNeighbors(const ElementType* vec, bool do_radius, float radius, bool do_k, unsigned int k_nn, - float& checked_average) + void getNeighbors(const ElementType* vec, bool /*do_radius*/, float radius, bool do_k, unsigned int k_nn, + float& /*checked_average*/) { static std::vector score_index_heap; diff --git a/modules/photo/src/fast_nlmeans_denoising_invoker.hpp b/modules/photo/src/fast_nlmeans_denoising_invoker.hpp index 6724e8272..82839c98b 100644 --- a/modules/photo/src/fast_nlmeans_denoising_invoker.hpp +++ b/modules/photo/src/fast_nlmeans_denoising_invoker.hpp @@ -62,7 +62,7 @@ struct FastNlMeansDenoisingInvoker { void operator() (const BlockedRange& range) const; - void operator= (const FastNlMeansDenoisingInvoker& invoker) { + void operator= (const FastNlMeansDenoisingInvoker&) { CV_Error(CV_StsNotImplemented, "Assigment operator is not implemented"); } diff --git a/modules/photo/src/fast_nlmeans_multi_denoising_invoker.hpp b/modules/photo/src/fast_nlmeans_multi_denoising_invoker.hpp index 602007e32..f8d387ce7 100644 --- a/modules/photo/src/fast_nlmeans_multi_denoising_invoker.hpp +++ b/modules/photo/src/fast_nlmeans_multi_denoising_invoker.hpp @@ -63,7 +63,7 @@ struct FastNlMeansMultiDenoisingInvoker { void operator() (const BlockedRange& range) const; - void operator= (const FastNlMeansMultiDenoisingInvoker& invoker) { + void operator= (const FastNlMeansMultiDenoisingInvoker&) { CV_Error(CV_StsNotImplemented, "Assigment operator is not implemented"); } diff --git a/modules/ts/src/ts_gtest.cpp b/modules/ts/src/ts_gtest.cpp index f2cd000a2..2a46570cf 100644 --- a/modules/ts/src/ts_gtest.cpp +++ b/modules/ts/src/ts_gtest.cpp @@ -5896,7 +5896,7 @@ bool SkipPrefix(const char* prefix, const char** pstr) { // part can be omitted. // // Returns the value of the flag, or NULL if the parsing failed. -const char* ParseFlagValue(const char* str, +static const char* ParseFlagValue(const char* str, const char* flag, bool def_optional) { // str and flag must not be NULL. @@ -7221,12 +7221,14 @@ void StackLowerThanAddress(const void* ptr, bool* result) { *result = (&dummy < ptr); } +#if GTEST_HAS_CLONE static bool StackGrowsDown() { int dummy; bool result; StackLowerThanAddress(&dummy, &result); return result; } +#endif // Spawns a child process with the same executable as the current process in // a thread-safe manner and instructs it to run the death test. The From e2c9e7c3fbd0d95f78f2e61b41c138daa1f00dc8 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 28 Aug 2012 14:19:34 +0400 Subject: [PATCH 004/103] applied patches from #2311 --- modules/highgui/src/cap_libv4l.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/highgui/src/cap_libv4l.cpp b/modules/highgui/src/cap_libv4l.cpp index c27224d9e..6dcc567ca 100644 --- a/modules/highgui/src/cap_libv4l.cpp +++ b/modules/highgui/src/cap_libv4l.cpp @@ -956,6 +956,7 @@ static int _capture_V4L (CvCaptureCAM_V4L *capture, char *deviceName) if (capture->memoryMap == MAP_FAILED) { fprintf( stderr, "HIGHGUI ERROR: V4L: Mapping Memmory from video source error: %s\n", strerror(errno)); icvCloseCAM_V4L(capture); + return -1; } /* Set up video_mmap structure pointing to this memory mapped area so each image may be @@ -1709,6 +1710,7 @@ static void icvCloseCAM_V4L( CvCaptureCAM_V4L* capture ){ } #endif + free(capture->deviceName); //v4l2_free_ranges(capture); //cvFree((void **)capture); } From a07e33609b737bebae3fb64ddc4c1c37ff9213b1 Mon Sep 17 00:00:00 2001 From: "marina.kolpakova" Date: Tue, 28 Aug 2012 14:45:45 +0400 Subject: [PATCH 005/103] added test for caltech images --- modules/gpu/perf/perf_objdetect.cpp | 41 +++++++++++++++++++++++ modules/gpu/test/test_objdetect.cpp | 51 ++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/modules/gpu/perf/perf_objdetect.cpp b/modules/gpu/perf/perf_objdetect.cpp index 0c4cd5e4c..ec12100a9 100644 --- a/modules/gpu/perf/perf_objdetect.cpp +++ b/modules/gpu/perf/perf_objdetect.cpp @@ -45,6 +45,47 @@ PERF_TEST_P(Image, ObjDetect_HOG, Values("gpu/hog/road.png")) } } +//===========test for CalTech data =============// +DEF_PARAM_TEST_1(HOG, string); + +PERF_TEST_P(HOG, CalTech, Values("gpu/caltech/image_00000009_0.png", "gpu/caltech/image_00000032_0.png", + "gpu/caltech/image_00000165_0.png", "gpu/caltech/image_00000261_0.png", "gpu/caltech/image_00000469_0.png", + "gpu/caltech/image_00000527_0.png", "gpu/caltech/image_00000574_0.png")) +{ + cv::Mat img = readImage(GetParam(), cv::IMREAD_GRAYSCALE); + ASSERT_FALSE(img.empty()); + + std::vector found_locations; + + if (runOnGpu) + { + cv::gpu::GpuMat d_img(img); + + cv::gpu::HOGDescriptor d_hog; + d_hog.setSVMDetector(cv::gpu::HOGDescriptor::getDefaultPeopleDetector()); + + d_hog.detectMultiScale(d_img, found_locations); + + TEST_CYCLE() + { + d_hog.detectMultiScale(d_img, found_locations); + } + } + else + { + cv::HOGDescriptor hog; + hog.setSVMDetector(cv::gpu::HOGDescriptor::getDefaultPeopleDetector()); + + hog.detectMultiScale(img, found_locations); + + TEST_CYCLE() + { + hog.detectMultiScale(img, found_locations); + } + } +} + + /////////////////////////////////////////////////////////////// // HaarClassifier diff --git a/modules/gpu/test/test_objdetect.cpp b/modules/gpu/test/test_objdetect.cpp index b47966d50..8f7ab1eb8 100644 --- a/modules/gpu/test/test_objdetect.cpp +++ b/modules/gpu/test/test_objdetect.cpp @@ -175,7 +175,8 @@ struct HOG : testing::TestWithParam, cv::gpu::HOGDescriptor } }; -TEST_P(HOG, Detect) +// desabled while resize does not fixed +TEST_P(HOG, DISABLED_Detect) { cv::Mat img_rgb = readImage("hog/road.png"); ASSERT_FALSE(img_rgb.empty()); @@ -286,6 +287,54 @@ TEST_P(HOG, GetDescriptors) INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, HOG, ALL_DEVICES); +//============== caltech hog tests =====================// +struct CalTech : public ::testing::TestWithParam > +{ + cv::gpu::DeviceInfo devInfo; + cv::Mat img; + + virtual void SetUp() + { + devInfo = GET_PARAM(0); + cv::gpu::setDevice(devInfo.deviceID()); + + img = readImage(GET_PARAM(1), cv::IMREAD_GRAYSCALE); + ASSERT_FALSE(img.empty()); + } +}; + +TEST_P(CalTech, HOG) +{ + cv::gpu::GpuMat d_img(img); + cv::Mat markedImage(img.clone()); + + cv::gpu::HOGDescriptor d_hog; + d_hog.setSVMDetector(cv::gpu::HOGDescriptor::getDefaultPeopleDetector()); + d_hog.nlevels = d_hog.nlevels + 32; + + std::vector found_locations; + d_hog.detectMultiScale(d_img, found_locations); + +#if defined (LOG_CASCADE_STATISTIC) + for (int i = 0; i < (int)found_locations.size(); i++) + { + cv::Rect r = found_locations[i]; + + std::cout << r.x << " " << r.y << " " << r.width << " " << r.height << std::endl; + cv::rectangle(markedImage, r , CV_RGB(255, 0, 0)); + } + + cv::imshow("Res", markedImage); cv::waitKey(); +#endif +} + +INSTANTIATE_TEST_CASE_P(detect, CalTech, testing::Combine(ALL_DEVICES, + ::testing::Values("caltech/image_00000009_0.png", "caltech/image_00000032_0.png", + "caltech/image_00000165_0.png", "caltech/image_00000261_0.png", "caltech/image_00000469_0.png", + "caltech/image_00000527_0.png", "caltech/image_00000574_0.png"))); + + + ////////////////////////////////////////////////////////////////////////////////////////// /// LBP classifier From 396e4517ffc72283631c7b5b8d2e44366f223141 Mon Sep 17 00:00:00 2001 From: Vsevolod Glumov Date: Tue, 28 Aug 2012 15:01:14 +0400 Subject: [PATCH 006/103] Improved javadoc comments. Draft. --- .../src/java/android+AsyncServiceHelper.java | 4 ++-- .../src/java/android+BaseLoaderCallback.java | 14 ++++++------ .../android+InstallCallbackInterface.java | 10 ++++----- .../java/android+LoaderCallbackInterface.java | 22 +++++++++---------- .../src/java/android+OpenCVLoader.java | 18 +++++++-------- .../src/java/android+StaticHelper.java | 2 +- .../generator/src/java/android+Utils.java | 12 +++++----- .../generator/src/java/core+TermCriteria.java | 10 ++++----- .../java/engine+OpenCVEngineInterface.aidl | 22 +++++++++---------- .../generator/src/java/features2d+DMatch.java | 10 ++++----- .../src/java/features2d+KeyPoint.java | 16 +++++++------- .../src/java/highgui+VideoCapture.java | 16 +++++++------- 12 files changed, 78 insertions(+), 78 deletions(-) diff --git a/modules/java/generator/src/java/android+AsyncServiceHelper.java b/modules/java/generator/src/java/android+AsyncServiceHelper.java index 723a56039..8069f4672 100644 --- a/modules/java/generator/src/java/android+AsyncServiceHelper.java +++ b/modules/java/generator/src/java/android+AsyncServiceHelper.java @@ -105,7 +105,7 @@ class AsyncServiceHelper } /** - * URI for OpenCV Manager on Google Play (Android Market) + * URL of OpenCV Manager page on Google Play Market. */ protected static final String OPEN_CV_SERVICE_URL = "market://details?id=org.opencv.engine"; @@ -263,7 +263,7 @@ class AsyncServiceHelper } else { - // If dependencies list is not defined or empty + // If dependencies list is not defined or empty. String AbsLibraryPath = Path + File.separator + "libopencv_java.so"; result &= loadLibrary(AbsLibraryPath); } diff --git a/modules/java/generator/src/java/android+BaseLoaderCallback.java b/modules/java/generator/src/java/android+BaseLoaderCallback.java index 2936b8a3f..220ca5e01 100644 --- a/modules/java/generator/src/java/android+BaseLoaderCallback.java +++ b/modules/java/generator/src/java/android+BaseLoaderCallback.java @@ -7,7 +7,7 @@ import android.content.DialogInterface.OnClickListener; import android.util.Log; /** - * Basic implementation of LoaderCallbackInterface + * Basic implementation of LoaderCallbackInterface. */ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { @@ -22,9 +22,9 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { /** OpenCV initialization was successful. **/ case LoaderCallbackInterface.SUCCESS: { - /** Application must override this method to handle successful library initialization **/ + /** Application must override this method to handle successful library initialization. **/ } break; - /** OpenCV Manager or library package installation is in progress. Restart of application is required **/ + /** OpenCV Manager or library package installation is in progress. Restart the application. **/ case LoaderCallbackInterface.RESTART_REQUIRED: { Log.d(TAG, "OpenCV downloading. App restart is needed!"); @@ -40,7 +40,7 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { RestartMessage.show(); } break; - /** OpenCV loader cannot start Google Play **/ + /** OpenCV loader cannot start Google Play Market. **/ case LoaderCallbackInterface.MARKET_ERROR: { Log.d(TAG, "Google Play service is not installed! You can get it here"); @@ -55,13 +55,13 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { }); MarketErrorMessage.show(); } break; - /** Package installation was canceled **/ + /** Package installation has been canceled. **/ case LoaderCallbackInterface.INSTALL_CANCELED: { Log.d(TAG, "OpenCV library instalation was canceled by user"); mAppContext.finish(); } break; - /** Application is incompatible with this version of OpenCV Manager. Possible Service update is needed **/ + /** Application is incompatible with this version of OpenCV Manager. Possibly, a service update is required. **/ case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION: { Log.d(TAG, "OpenCV Manager Service is uncompatible with this app!"); @@ -76,7 +76,7 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { }); IncomatibilityMessage.show(); } - /** Other status, i.e. INIT_FAILED **/ + /** Other status, i.e. INIT_FAILED. **/ default: { Log.e(TAG, "OpenCV loading failed!"); diff --git a/modules/java/generator/src/java/android+InstallCallbackInterface.java b/modules/java/generator/src/java/android+InstallCallbackInterface.java index bd477705f..12785d9ac 100644 --- a/modules/java/generator/src/java/android+InstallCallbackInterface.java +++ b/modules/java/generator/src/java/android+InstallCallbackInterface.java @@ -1,21 +1,21 @@ package org.opencv.android; /** - * Installation callback interface + * Installation callback interface. */ public interface InstallCallbackInterface { /** - * Target package name - * @return Return target package name + * Target package name. + * @return Return target package name. */ public String getPackageName(); /** - * Installation of package is approved + * Installation is approved. */ public void install(); /** - * Installation canceled + * Installation is canceled. */ public void cancel(); }; diff --git a/modules/java/generator/src/java/android+LoaderCallbackInterface.java b/modules/java/generator/src/java/android+LoaderCallbackInterface.java index b96cabe4a..56cdf1519 100644 --- a/modules/java/generator/src/java/android+LoaderCallbackInterface.java +++ b/modules/java/generator/src/java/android+LoaderCallbackInterface.java @@ -1,44 +1,44 @@ package org.opencv.android; /** - * Interface for callback object in case of asynchronous initialization of OpenCV + * Interface for callback object in case of asynchronous initialization of OpenCV. */ public interface LoaderCallbackInterface { /** - * OpenCV initialization finished successfully + * OpenCV initialization finished successfully. */ static final int SUCCESS = 0; /** - * OpenCV library installation via Google Play service was initialized. Application restart is required + * OpenCV library installation via Google Play service has been initialized. Restart the application. */ static final int RESTART_REQUIRED = 1; /** - * Google Play (Android Market) cannot be invoked + * Google Play Market cannot be invoked. */ static final int MARKET_ERROR = 2; /** - * OpenCV library installation was canceled by user + * OpenCV library installation has been canceled by user. */ static final int INSTALL_CANCELED = 3; /** - * Version of OpenCV Manager Service is incompatible with this app. Service update is needed + * This version of OpenCV Manager Service is incompatible with the app. Possibly, a service update is required. */ static final int INCOMPATIBLE_MANAGER_VERSION = 4; /** - * OpenCV library initialization failed + * OpenCV library initialization failed. */ static final int INIT_FAILED = 0xff; /** - * Callback method that is called after OpenCV library initialization - * @param status Status of initialization. See Initialization status constants + * This callback method is called after OpenCV library initialization. + * @param status Status of initialization (see Initialization status constants). */ public void onManagerConnected(int status); /** - * Callback method that is called in case when package installation is needed - * @param callback Answer object with approve and cancel methods and package description + * This callback method is called in case the package installation is needed. + * @param callback Answer object with approve and cancel methods and the package description. */ public void onPackageInstall(InstallCallbackInterface callback); }; diff --git a/modules/java/generator/src/java/android+OpenCVLoader.java b/modules/java/generator/src/java/android+OpenCVLoader.java index dd4ee53d5..376d04c73 100644 --- a/modules/java/generator/src/java/android+OpenCVLoader.java +++ b/modules/java/generator/src/java/android+OpenCVLoader.java @@ -3,18 +3,18 @@ package org.opencv.android; import android.content.Context; /** - * Helper class provides common initialization methods for OpenCV library + * Helper class provides common initialization methods for OpenCV library. */ public class OpenCVLoader { /** - * OpenCV Library version 2.4.2 + * OpenCV Library version 2.4.2. */ public static final String OPENCV_VERSION_2_4_2 = "2.4.2"; /** - * Load and initialize OpenCV library from current application package. Roughly it is analog of system.loadLibrary("opencv_java") - * @return Return true is initialization of OpenCV was successful + * Loads and initializes OpenCV library from current application package. Roughly, it's an analog of system.loadLibrary("opencv_java"). + * @return Returns true is initialization of OpenCV was successful. */ public static boolean initDebug() { @@ -22,11 +22,11 @@ public class OpenCVLoader } /** - * Load and initialize OpenCV library using OpenCV Engine service. - * @param Version OpenCV Library version - * @param AppContext Application context for connecting to service - * @param Callback Object, that implements LoaderCallbackInterface for handling Connection status - * @return Return true if initialization of OpenCV starts successfully + * Loads and initializes OpenCV library using OpenCV Engine service. + * @param Version OpenCV Library version. + * @param AppContext Application context for connecting to service. + * @param Callback Object, that implements LoaderCallbackInterface for handling Connection status. + * @return Returns true if initialization of OpenCV is successful. */ public static boolean initAsync(String Version, Context AppContext, LoaderCallbackInterface Callback) diff --git a/modules/java/generator/src/java/android+StaticHelper.java b/modules/java/generator/src/java/android+StaticHelper.java index 8bc04e1fb..3082d2259 100644 --- a/modules/java/generator/src/java/android+StaticHelper.java +++ b/modules/java/generator/src/java/android+StaticHelper.java @@ -76,7 +76,7 @@ class StaticHelper { } else { - // If dependencies list is not defined or empty + // If dependencies list is not defined or empty. result &= loadLibrary("opencv_java"); } diff --git a/modules/java/generator/src/java/android+Utils.java b/modules/java/generator/src/java/android+Utils.java index a990cd10b..ceecf3a63 100644 --- a/modules/java/generator/src/java/android+Utils.java +++ b/modules/java/generator/src/java/android+Utils.java @@ -76,14 +76,14 @@ public class Utils { /** * Converts Android Bitmap to OpenCV Mat. *

- * The function converts an image in the Android Bitmap representation to the OpenCV Mat. + * This function converts an Android Bitmap image to the OpenCV Mat. *
The 'ARGB_8888' and 'RGB_565' input Bitmap formats are supported. *
The output Mat is always created of the same size as the input Bitmap and of the 'CV_8UC4' type, * it keeps the image in RGBA format. - *
The function throws an exception if the conversion fails. + *
This function throws an exception if the conversion fails. * @param bmp is a valid input Bitmap object of the type 'ARGB_8888' or 'RGB_565'. - * @param mat is a valid output Mat object, it will be reallocated if needed, so it's possible to pass an empty Mat. - * @param unPremultiplyAlpha is a flag if the bitmap needs to be converted from alpha premultiplied format (like Android keeps 'ARGB_8888' ones) to regular one. The flag is ignored for 'RGB_565' bitmaps. + * @param mat is a valid output Mat object, it will be reallocated if needed, so it may be empty. + * @param unPremultiplyAlpha is a flag if the bitmap needs to be converted from alpha premultiplied format (like Android keeps 'ARGB_8888' ones) to regular one. This flag is ignored for 'RGB_565' bitmaps. */ public static void bitmapToMat(Bitmap bmp, Mat mat, boolean unPremultiplyAlpha) { if (bmp == null) @@ -94,7 +94,7 @@ public class Utils { } /** - * Shortened form of the bitmapToMat(bmp, mat, unPremultiplyAlpha=false) + * Short form of the bitmapToMat(bmp, mat, unPremultiplyAlpha=false). * @param bmp is a valid input Bitmap object of the type 'ARGB_8888' or 'RGB_565'. * @param mat is a valid output Mat object, it will be reallocated if needed, so it's possible to pass an empty Mat. */ @@ -124,7 +124,7 @@ public class Utils { } /** - * Shortened form of the matToBitmap(mat, bmp, premultiplyAlpha=false) + * Short form of the matToBitmap(mat, bmp, premultiplyAlpha=false) * @param mat is a valid input Mat object of the types 'CV_8UC1', 'CV_8UC3' or 'CV_8UC4'. * @param bmp is a valid Bitmap object of the same size as the Mat m and of type 'ARGB_8888' or 'RGB_565'. */ diff --git a/modules/java/generator/src/java/core+TermCriteria.java b/modules/java/generator/src/java/core+TermCriteria.java index 1717883d1..3c4a8debe 100644 --- a/modules/java/generator/src/java/core+TermCriteria.java +++ b/modules/java/generator/src/java/core+TermCriteria.java @@ -4,15 +4,15 @@ package org.opencv.core; public class TermCriteria { /** - * the maximum number of iterations or elements to compute + * the maximum of iterations or elements to compute */ public static final int COUNT = 1; /** - * the maximum number of iterations or elements to compute + * the maximum of iterations or elements to compute */ public static final int MAX_ITER = COUNT; /** - * the desired accuracy or change in parameters at which the iterative algorithm stops + * the desired accuracy threshold or change in parameters at which the iterative algorithm stops. */ public static final int EPS = 2; @@ -21,7 +21,7 @@ public class TermCriteria { public double epsilon; /** - * Termination criteria in iterative algorithms + * Termination criteria for iterative algorithms. * * @param type * the type of termination criteria: COUNT, EPS or COUNT + EPS @@ -37,7 +37,7 @@ public class TermCriteria { } /** - * Termination criteria in iterative algorithms + * Termination criteria for iterative algorithms */ public TermCriteria() { this(0, 0, 0.0); diff --git a/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl b/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl index d3f216ccd..7bf967fd8 100644 --- a/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl +++ b/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl @@ -1,33 +1,33 @@ package org.opencv.engine; /** -* Class provides Java interface to OpenCV Engine Service. Is synchronous with native OpenCVEngine class. +* Class provides a Java interface for OpenCV Engine Service. It's synchronous with native OpenCVEngine class. */ interface OpenCVEngineInterface { /** - * @return Return service version + * @return Returns service version. */ int getEngineVersion(); /** - * Find installed OpenCV library - * @param OpenCV version - * @return Return path to OpenCV native libs or empty string if OpenCV was not found + * Finds an installed OpenCV library. + * @param OpenCV version. + * @return Returns path to OpenCV native libs or an empty string if OpenCV can not be found. */ String getLibPathByVersion(String version); /** - * Try to install defined version of OpenCV from Google Play (Android Market). - * @param OpenCV version - * @return Return true if installation was successful or OpenCV package has been already installed + * Tries to install defined version of OpenCV from Google Play Market. + * @param OpenCV version. + * @return Returns true if installation was successful or OpenCV package has been already installed. */ boolean installVersion(String version); /** - * Return list of libraries in loading order separated by ";" symbol - * @param OpenCV version - * @return Return OpenCV libraries names separated by symbol ";" in loading order + * Returns list of libraries in loading order, separated by semicolon. + * @param OpenCV version. + * @return Returns names of OpenCV libraries, separated by semicolon. */ String getLibraryList(String version); } \ No newline at end of file diff --git a/modules/java/generator/src/java/features2d+DMatch.java b/modules/java/generator/src/java/features2d+DMatch.java index ac864063e..b93a53335 100644 --- a/modules/java/generator/src/java/features2d+DMatch.java +++ b/modules/java/generator/src/java/features2d+DMatch.java @@ -3,21 +3,21 @@ package org.opencv.features2d; //C++: class DMatch /** - * Struct for matching: query descriptor index, train descriptor index, train + * Structure for matching: query descriptor index, train descriptor index, train * image index and distance between descriptors. */ public class DMatch { /** - * query descriptor index + * Query descriptor index. */ public int queryIdx; /** - * train descriptor index + * Train descriptor index. */ public int trainIdx; /** - * train image index + * Train image index. */ public int imgIdx; @@ -46,7 +46,7 @@ public class DMatch { } /** - * less is better + * Less is better. */ public boolean lessThan(DMatch it) { return distance < it.distance; diff --git a/modules/java/generator/src/java/features2d+KeyPoint.java b/modules/java/generator/src/java/features2d+KeyPoint.java index f141cd16f..352f7cda0 100644 --- a/modules/java/generator/src/java/features2d+KeyPoint.java +++ b/modules/java/generator/src/java/features2d+KeyPoint.java @@ -6,29 +6,29 @@ import org.opencv.core.Point; public class KeyPoint { /** - * coordinates of the keypoint + * Coordinates of the keypoint. */ public Point pt; /** - * diameter of the meaningful keypoint neighborhood + * Diameter of the useful keypoint adjacent area. */ public float size; /** - * computed orientation of the keypoint (-1 if not applicable) + * Computed orientation of the keypoint (-1 if not applicable). */ public float angle; /** - * the response by which the most strong keypoints have been selected. Can - * be used for further sorting or subsampling + * The response, by which the strongest keypoints have been selected. Can + * be used for further sorting or subsampling. */ public float response; /** - * octave (pyramid layer) from which the keypoint has been extracted + * Octave (pyramid layer), from which the keypoint has been extracted. */ public int octave; /** - * object id that can be used to clustered keypoints by an object they - * belong to + * Object ID, that can be used to cluster keypoints by an object they + * belong to. */ public int class_id; diff --git a/modules/java/generator/src/java/highgui+VideoCapture.java b/modules/java/generator/src/java/highgui+VideoCapture.java index bb71fc041..98b911d78 100644 --- a/modules/java/generator/src/java/highgui+VideoCapture.java +++ b/modules/java/generator/src/java/highgui+VideoCapture.java @@ -47,14 +47,14 @@ public class VideoCapture { // /** - * Returns the specified "VideoCapture" property + * Returns the specified "VideoCapture" property. * * Note: When querying a property that is not supported by the backend used by * the "VideoCapture" class, value 0 is returned. * - * @param propId Property identifier. It can be one of the following: - * * CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. - * * CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. + * @param propId Property identifier; it can be one of the following: + * * CV_CAP_PROP_FRAME_WIDTH width of the frames in the video stream. + * * CV_CAP_PROP_FRAME_HEIGHT height of the frames in the video stream. * * @see org.opencv.highgui.VideoCapture.get */ @@ -173,10 +173,10 @@ public class VideoCapture { /** * Sets a property in the "VideoCapture". * - * @param propId Property identifier. It can be one of the following: - * * CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream. - * * CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream. - * @param value Value of the property. + * @param propId Property identifier; it can be one of the following: + * * CV_CAP_PROP_FRAME_WIDTH width of the frames in the video stream. + * * CV_CAP_PROP_FRAME_HEIGHT height of the frames in the video stream. + * @param value value of the property. * * @see org.opencv.highgui.VideoCapture.set */ From 7744b1d6005fa3a503b17d2a12acf0a57125b149 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 14:44:46 +0400 Subject: [PATCH 007/103] Android camera: fix logging macro part 2 --- modules/highgui/src/cap_android.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/highgui/src/cap_android.cpp b/modules/highgui/src/cap_android.cpp index d8513f240..b67e56dff 100644 --- a/modules/highgui/src/cap_android.cpp +++ b/modules/highgui/src/cap_android.cpp @@ -48,15 +48,14 @@ #include #include -//#if !defined(LOGD) && !defined(LOGI) && !defined(LOGE) +#undef LOG_TAG #undef LOGD #undef LOGE #undef LOGI -#define LOG_TAG "CV_CAP" +#define LOG_TAG "OpenCV::camera" #define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) -//#endif class HighguiAndroidCameraActivity; From 47b9640785cb0fe4dce043cb676e687e74704276 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 15:06:47 +0400 Subject: [PATCH 008/103] Updated package version in Android samples --- samples/android/15-puzzle/AndroidManifest.xml | 14 +++++++------- .../color-blob-detection/AndroidManifest.xml | 6 +++--- .../android/face-detection/AndroidManifest.xml | 14 +++++++------- .../image-manipulations/AndroidManifest.xml | 14 +++++++------- .../AndroidManifest.xml | 18 +++++++++--------- .../tutorial-1-addopencv/AndroidManifest.xml | 14 +++++++------- .../AndroidManifest.xml | 14 +++++++------- .../tutorial-3-native/AndroidManifest.xml | 14 +++++++------- .../tutorial-4-mixed/AndroidManifest.xml | 14 +++++++------- 9 files changed, 61 insertions(+), 61 deletions(-) diff --git a/samples/android/15-puzzle/AndroidManifest.xml b/samples/android/15-puzzle/AndroidManifest.xml index dec508ee7..02a6cc975 100644 --- a/samples/android/15-puzzle/AndroidManifest.xml +++ b/samples/android/15-puzzle/AndroidManifest.xml @@ -1,15 +1,15 @@ + android:versionCode="21" + android:versionName="2.1"> - + - + diff --git a/samples/android/color-blob-detection/AndroidManifest.xml b/samples/android/color-blob-detection/AndroidManifest.xml index 83791f06a..a580be645 100644 --- a/samples/android/color-blob-detection/AndroidManifest.xml +++ b/samples/android/color-blob-detection/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="21" + android:versionName="2.1" > @@ -23,5 +23,5 @@ - + \ No newline at end of file diff --git a/samples/android/face-detection/AndroidManifest.xml b/samples/android/face-detection/AndroidManifest.xml index 34ede0562..285bcb9fa 100644 --- a/samples/android/face-detection/AndroidManifest.xml +++ b/samples/android/face-detection/AndroidManifest.xml @@ -1,13 +1,13 @@ + android:versionCode="21" + android:versionName="2.1"> @@ -21,11 +21,11 @@ - + - + diff --git a/samples/android/image-manipulations/AndroidManifest.xml b/samples/android/image-manipulations/AndroidManifest.xml index ab3200318..72df75e44 100644 --- a/samples/android/image-manipulations/AndroidManifest.xml +++ b/samples/android/image-manipulations/AndroidManifest.xml @@ -1,13 +1,13 @@ + android:versionCode="21" + android:versionName="2.1"> @@ -21,11 +21,11 @@ - + - + diff --git a/samples/android/tutorial-0-androidcamera/AndroidManifest.xml b/samples/android/tutorial-0-androidcamera/AndroidManifest.xml index 51aa236ed..714b0095a 100644 --- a/samples/android/tutorial-0-androidcamera/AndroidManifest.xml +++ b/samples/android/tutorial-0-androidcamera/AndroidManifest.xml @@ -1,21 +1,21 @@ + android:versionCode="21" + android:versionName="2.1"> - + - + - - + + diff --git a/samples/android/tutorial-1-addopencv/AndroidManifest.xml b/samples/android/tutorial-1-addopencv/AndroidManifest.xml index 438f09624..51cc50f7f 100644 --- a/samples/android/tutorial-1-addopencv/AndroidManifest.xml +++ b/samples/android/tutorial-1-addopencv/AndroidManifest.xml @@ -1,13 +1,13 @@ + android:versionCode="21" + android:versionName="2.1"> @@ -21,11 +21,11 @@ - + - + diff --git a/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml b/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml index accc3b2cf..7daacd164 100644 --- a/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml +++ b/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml @@ -1,13 +1,13 @@ + android:versionCode="21" + android:versionName="2.1"> @@ -21,11 +21,11 @@ - + - + diff --git a/samples/android/tutorial-3-native/AndroidManifest.xml b/samples/android/tutorial-3-native/AndroidManifest.xml index 145048e7f..8ee38142b 100644 --- a/samples/android/tutorial-3-native/AndroidManifest.xml +++ b/samples/android/tutorial-3-native/AndroidManifest.xml @@ -1,13 +1,13 @@ + android:versionCode="21" + android:versionName="2.1"> @@ -21,11 +21,11 @@ - + - + diff --git a/samples/android/tutorial-4-mixed/AndroidManifest.xml b/samples/android/tutorial-4-mixed/AndroidManifest.xml index 3201f7c04..524c76399 100644 --- a/samples/android/tutorial-4-mixed/AndroidManifest.xml +++ b/samples/android/tutorial-4-mixed/AndroidManifest.xml @@ -1,13 +1,13 @@ + android:versionCode="21" + android:versionName="2.1"> @@ -21,11 +21,11 @@ - + - + From f56432559e9b7607fb70ed0a71b65c4337a82b1e Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Fri, 24 Aug 2012 11:26:34 +0200 Subject: [PATCH 009/103] add conversion from/to Matx --- modules/core/include/opencv2/core/eigen.hpp | 103 ++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/modules/core/include/opencv2/core/eigen.hpp b/modules/core/include/opencv2/core/eigen.hpp index 3051486ea..49bd36ba3 100644 --- a/modules/core/include/opencv2/core/eigen.hpp +++ b/modules/core/include/opencv2/core/eigen.hpp @@ -74,6 +74,21 @@ void eigen2cv( const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCo } } +// Matx case +template +void eigen2cv( const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, + Matx<_Tp, _rows, _cols>& dst ) +{ + if( !(src.Flags & Eigen::RowMajorBit) ) + { + dst = Matx<_Tp, _cols, _rows>(static_cast(src.data())).t(); + } + else + { + dst = Matx<_Tp, _rows, _cols>(static_cast(src.data())); + } +} + template void cv2eigen( const Mat& src, Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst ) @@ -103,6 +118,27 @@ void cv2eigen( const Mat& src, } } +// Matx case +template +void cv2eigen( const Matx<_Tp, _rows, _cols>& src, + Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst ) +{ + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + Mat _dst(_cols, _rows, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + transpose(src, _dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } + else + { + Mat _dst(_rows, _cols, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + Mat(src).copyTo(_dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } +} + template void cv2eigen( const Mat& src, Eigen::Matrix<_Tp, Eigen::Dynamic, Eigen::Dynamic>& dst ) @@ -132,6 +168,27 @@ void cv2eigen( const Mat& src, } } +// Matx case +template +void cv2eigen( const Matx<_Tp, _rows, _cols>& src, + Eigen::Matrix<_Tp, Eigen::Dynamic, Eigen::Dynamic>& dst ) +{ + dst.resize(_rows, _cols); + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + Mat _dst(_cols, _rows, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + transpose(src, _dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } + else + { + Mat _dst(_rows, _cols, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + Mat(src).copyTo(_dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } +} template void cv2eigen( const Mat& src, @@ -159,6 +216,29 @@ void cv2eigen( const Mat& src, } } +// Matx case +template +void cv2eigen( const Matx<_Tp, _rows, 1>& src, + Eigen::Matrix<_Tp, Eigen::Dynamic, 1>& dst ) +{ + dst.resize(_rows); + + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + Mat _dst(1, _rows, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + transpose(src, _dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } + else + { + Mat _dst(_rows, 1, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + src.copyTo(_dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } +} + template void cv2eigen( const Mat& src, @@ -185,6 +265,29 @@ void cv2eigen( const Mat& src, } } +//Matx +template +void cv2eigen( const Matx<_Tp, 1, _cols>& src, + Eigen::Matrix<_Tp, 1, Eigen::Dynamic>& dst ) +{ + dst.resize(_cols); + if( !(dst.Flags & Eigen::RowMajorBit) ) + { + Mat _dst(_cols, 1, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + transpose(src, _dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } + else + { + Mat _dst(1, _cols, DataType<_Tp>::type, + dst.data(), (size_t)(dst.stride()*sizeof(_Tp))); + Mat(src).copyTo(_dst); + CV_DbgAssert(_dst.data == (uchar*)dst.data()); + } +} + + } #endif From dc6fa94118860ddbb31f1141834b90af14afc3f9 Mon Sep 17 00:00:00 2001 From: Vsevolod Glumov Date: Tue, 28 Aug 2012 15:49:50 +0400 Subject: [PATCH 010/103] Improved javadoc comments. --- .../src/java/android+AsyncServiceHelper.java | 2 +- .../src/java/android+BaseLoaderCallback.java | 2 +- .../java/android+LoaderCallbackInterface.java | 12 ++++++------ .../src/java/android+OpenCVLoader.java | 10 +++++----- .../java/generator/src/java/android+Utils.java | 18 +++++++++--------- .../generator/src/java/core+TermCriteria.java | 14 +++++++------- .../src/java/engine+OpenCVEngineInterface.aidl | 8 ++++---- .../src/java/highgui+VideoCapture.java | 4 ++-- 8 files changed, 35 insertions(+), 35 deletions(-) diff --git a/modules/java/generator/src/java/android+AsyncServiceHelper.java b/modules/java/generator/src/java/android+AsyncServiceHelper.java index 8069f4672..b5487b9c6 100644 --- a/modules/java/generator/src/java/android+AsyncServiceHelper.java +++ b/modules/java/generator/src/java/android+AsyncServiceHelper.java @@ -263,7 +263,7 @@ class AsyncServiceHelper } else { - // If dependencies list is not defined or empty. + // If the dependencies list is not defined or empty. String AbsLibraryPath = Path + File.separator + "libopencv_java.so"; result &= loadLibrary(AbsLibraryPath); } diff --git a/modules/java/generator/src/java/android+BaseLoaderCallback.java b/modules/java/generator/src/java/android+BaseLoaderCallback.java index 220ca5e01..4fb5a23ae 100644 --- a/modules/java/generator/src/java/android+BaseLoaderCallback.java +++ b/modules/java/generator/src/java/android+BaseLoaderCallback.java @@ -40,7 +40,7 @@ public abstract class BaseLoaderCallback implements LoaderCallbackInterface { RestartMessage.show(); } break; - /** OpenCV loader cannot start Google Play Market. **/ + /** OpenCV loader can not start Google Play Market. **/ case LoaderCallbackInterface.MARKET_ERROR: { Log.d(TAG, "Google Play service is not installed! You can get it here"); diff --git a/modules/java/generator/src/java/android+LoaderCallbackInterface.java b/modules/java/generator/src/java/android+LoaderCallbackInterface.java index 56cdf1519..0d932c7cd 100644 --- a/modules/java/generator/src/java/android+LoaderCallbackInterface.java +++ b/modules/java/generator/src/java/android+LoaderCallbackInterface.java @@ -18,7 +18,7 @@ public interface LoaderCallbackInterface */ static final int MARKET_ERROR = 2; /** - * OpenCV library installation has been canceled by user. + * OpenCV library installation has been canceled by the user. */ static final int INSTALL_CANCELED = 3; /** @@ -26,19 +26,19 @@ public interface LoaderCallbackInterface */ static final int INCOMPATIBLE_MANAGER_VERSION = 4; /** - * OpenCV library initialization failed. + * OpenCV library initialization has failed. */ static final int INIT_FAILED = 0xff; /** - * This callback method is called after OpenCV library initialization. - * @param status Status of initialization (see Initialization status constants). + * Callback method, called after OpenCV library initialization. + * @param status status of initialization (see initialization status constants). */ public void onManagerConnected(int status); /** - * This callback method is called in case the package installation is needed. - * @param callback Answer object with approve and cancel methods and the package description. + * Callback method, called in case the package installation is needed. + * @param callback answer object with approve and cancel methods and the package description. */ public void onPackageInstall(InstallCallbackInterface callback); }; diff --git a/modules/java/generator/src/java/android+OpenCVLoader.java b/modules/java/generator/src/java/android+OpenCVLoader.java index 376d04c73..b3025a9aa 100644 --- a/modules/java/generator/src/java/android+OpenCVLoader.java +++ b/modules/java/generator/src/java/android+OpenCVLoader.java @@ -14,7 +14,7 @@ public class OpenCVLoader /** * Loads and initializes OpenCV library from current application package. Roughly, it's an analog of system.loadLibrary("opencv_java"). - * @return Returns true is initialization of OpenCV was successful. + * @return returns true is initialization of OpenCV was successful. */ public static boolean initDebug() { @@ -23,10 +23,10 @@ public class OpenCVLoader /** * Loads and initializes OpenCV library using OpenCV Engine service. - * @param Version OpenCV Library version. - * @param AppContext Application context for connecting to service. - * @param Callback Object, that implements LoaderCallbackInterface for handling Connection status. - * @return Returns true if initialization of OpenCV is successful. + * @param Version OpenCV library version. + * @param AppContext application context for connecting to the service. + * @param Callback object, that implements LoaderCallbackInterface for handling the connection status. + * @return returns true if initialization of OpenCV is successful. */ public static boolean initAsync(String Version, Context AppContext, LoaderCallbackInterface Callback) diff --git a/modules/java/generator/src/java/android+Utils.java b/modules/java/generator/src/java/android+Utils.java index ceecf3a63..e40630b83 100644 --- a/modules/java/generator/src/java/android+Utils.java +++ b/modules/java/generator/src/java/android+Utils.java @@ -77,13 +77,13 @@ public class Utils { * Converts Android Bitmap to OpenCV Mat. *

* This function converts an Android Bitmap image to the OpenCV Mat. - *
The 'ARGB_8888' and 'RGB_565' input Bitmap formats are supported. + *
'ARGB_8888' and 'RGB_565' input Bitmap formats are supported. *
The output Mat is always created of the same size as the input Bitmap and of the 'CV_8UC4' type, * it keeps the image in RGBA format. *
This function throws an exception if the conversion fails. * @param bmp is a valid input Bitmap object of the type 'ARGB_8888' or 'RGB_565'. * @param mat is a valid output Mat object, it will be reallocated if needed, so it may be empty. - * @param unPremultiplyAlpha is a flag if the bitmap needs to be converted from alpha premultiplied format (like Android keeps 'ARGB_8888' ones) to regular one. This flag is ignored for 'RGB_565' bitmaps. + * @param unPremultiplyAlpha is a flag, that determines, whether the bitmap needs to be converted from alpha premultiplied format (like Android keeps 'ARGB_8888' ones) to regular one; this flag is ignored for 'RGB_565' bitmaps. */ public static void bitmapToMat(Bitmap bmp, Mat mat, boolean unPremultiplyAlpha) { if (bmp == null) @@ -96,7 +96,7 @@ public class Utils { /** * Short form of the bitmapToMat(bmp, mat, unPremultiplyAlpha=false). * @param bmp is a valid input Bitmap object of the type 'ARGB_8888' or 'RGB_565'. - * @param mat is a valid output Mat object, it will be reallocated if needed, so it's possible to pass an empty Mat. + * @param mat is a valid output Mat object, it will be reallocated if needed, so Mat may be empty. */ public static void bitmapToMat(Bitmap bmp, Mat mat) { bitmapToMat(bmp, mat, false); @@ -106,14 +106,14 @@ public class Utils { /** * Converts OpenCV Mat to Android Bitmap. *

- *
The function converts an image in the OpenCV Mat representation to the Android Bitmap. + *
This function converts an image in the OpenCV Mat representation to the Android Bitmap. *
The input Mat object has to be of the types 'CV_8UC1' (gray-scale), 'CV_8UC3' (RGB) or 'CV_8UC4' (RGBA). *
The output Bitmap object has to be of the same size as the input Mat and of the types 'ARGB_8888' or 'RGB_565'. - *
The function throws an exception if the conversion fails. + *
This function throws an exception if the conversion fails. * - * @param mat is a valid input Mat object of the types 'CV_8UC1', 'CV_8UC3' or 'CV_8UC4'. - * @param bmp is a valid Bitmap object of the same size as the Mat m and of type 'ARGB_8888' or 'RGB_565'. - * @param premultiplyAlpha is a flag if the Mat needs to be converted to alpha premultiplied format (like Android keeps 'ARGB_8888' bitmaps). The flag is ignored for 'RGB_565' bitmaps. + * @param mat is a valid input Mat object of types 'CV_8UC1', 'CV_8UC3' or 'CV_8UC4'. + * @param bmp is a valid Bitmap object of the same size as the Mat and of type 'ARGB_8888' or 'RGB_565'. + * @param premultiplyAlpha is a flag, that determines, whether the Mat needs to be converted to alpha premultiplied format (like Android keeps 'ARGB_8888' bitmaps); the flag is ignored for 'RGB_565' bitmaps. */ public static void matToBitmap(Mat mat, Bitmap bmp, boolean premultiplyAlpha) { if (mat == null) @@ -126,7 +126,7 @@ public class Utils { /** * Short form of the matToBitmap(mat, bmp, premultiplyAlpha=false) * @param mat is a valid input Mat object of the types 'CV_8UC1', 'CV_8UC3' or 'CV_8UC4'. - * @param bmp is a valid Bitmap object of the same size as the Mat m and of type 'ARGB_8888' or 'RGB_565'. + * @param bmp is a valid Bitmap object of the same size as the Mat and of type 'ARGB_8888' or 'RGB_565'. */ public static void matToBitmap(Mat mat, Bitmap bmp) { matToBitmap(mat, bmp, false); diff --git a/modules/java/generator/src/java/core+TermCriteria.java b/modules/java/generator/src/java/core+TermCriteria.java index 3c4a8debe..aaee88d78 100644 --- a/modules/java/generator/src/java/core+TermCriteria.java +++ b/modules/java/generator/src/java/core+TermCriteria.java @@ -4,15 +4,15 @@ package org.opencv.core; public class TermCriteria { /** - * the maximum of iterations or elements to compute + * The maximum number of iterations or elements to compute */ public static final int COUNT = 1; /** - * the maximum of iterations or elements to compute + * The maximum number of iterations or elements to compute */ public static final int MAX_ITER = COUNT; /** - * the desired accuracy threshold or change in parameters at which the iterative algorithm stops. + * The desired accuracy threshold or change in parameters at which the iterative algorithm is terminated. */ public static final int EPS = 2; @@ -24,11 +24,11 @@ public class TermCriteria { * Termination criteria for iterative algorithms. * * @param type - * the type of termination criteria: COUNT, EPS or COUNT + EPS + * the type of termination criteria: COUNT, EPS or COUNT + EPS. * @param maxCount - * the maximum number of iterations/elements + * the maximum number of iterations/elements. * @param epsilon - * the desired accuracy + * the desired accuracy. */ public TermCriteria(int type, int maxCount, double epsilon) { this.type = type; @@ -37,7 +37,7 @@ public class TermCriteria { } /** - * Termination criteria for iterative algorithms + * Termination criteria for iterative algorithms. */ public TermCriteria() { this(0, 0, 0.0); diff --git a/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl b/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl index 7bf967fd8..7949b3160 100644 --- a/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl +++ b/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl @@ -6,28 +6,28 @@ package org.opencv.engine; interface OpenCVEngineInterface { /** - * @return Returns service version. + * @return returns service version. */ int getEngineVersion(); /** * Finds an installed OpenCV library. * @param OpenCV version. - * @return Returns path to OpenCV native libs or an empty string if OpenCV can not be found. + * @return returns path to OpenCV native libs or an empty string if OpenCV can not be found. */ String getLibPathByVersion(String version); /** * Tries to install defined version of OpenCV from Google Play Market. * @param OpenCV version. - * @return Returns true if installation was successful or OpenCV package has been already installed. + * @return returns true if installation was successful or OpenCV package has been already installed. */ boolean installVersion(String version); /** * Returns list of libraries in loading order, separated by semicolon. * @param OpenCV version. - * @return Returns names of OpenCV libraries, separated by semicolon. + * @return returns names of OpenCV libraries, separated by semicolon. */ String getLibraryList(String version); } \ No newline at end of file diff --git a/modules/java/generator/src/java/highgui+VideoCapture.java b/modules/java/generator/src/java/highgui+VideoCapture.java index 98b911d78..b8569bb9c 100644 --- a/modules/java/generator/src/java/highgui+VideoCapture.java +++ b/modules/java/generator/src/java/highgui+VideoCapture.java @@ -52,7 +52,7 @@ public class VideoCapture { * Note: When querying a property that is not supported by the backend used by * the "VideoCapture" class, value 0 is returned. * - * @param propId Property identifier; it can be one of the following: + * @param propId property identifier; it can be one of the following: * * CV_CAP_PROP_FRAME_WIDTH width of the frames in the video stream. * * CV_CAP_PROP_FRAME_HEIGHT height of the frames in the video stream. * @@ -173,7 +173,7 @@ public class VideoCapture { /** * Sets a property in the "VideoCapture". * - * @param propId Property identifier; it can be one of the following: + * @param propId property identifier; it can be one of the following: * * CV_CAP_PROP_FRAME_WIDTH width of the frames in the video stream. * * CV_CAP_PROP_FRAME_HEIGHT height of the frames in the video stream. * @param value value of the property. From 18fc11bc0464a8c84ea93dcb77c4957e715f1779 Mon Sep 17 00:00:00 2001 From: Corentin Wallez Date: Tue, 21 Aug 2012 23:45:12 +0200 Subject: [PATCH 011/103] Fix fixed-point arithmetics in FREAK::meanIntensity --- modules/features2d/src/freak.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/features2d/src/freak.cpp b/modules/features2d/src/freak.cpp index 26ded8547..4e1e6411f 100644 --- a/modules/features2d/src/freak.cpp +++ b/modules/features2d/src/freak.cpp @@ -455,7 +455,6 @@ uchar FREAK::meanIntensity( const cv::Mat& image, const cv::Mat& integral, const float radius = FreakPoint.sigma; // calculate output: - int ret_val; if( radius < 0.5 ) { // interpolation multipliers: const int r_x = static_cast((xf-x)*1024); @@ -463,6 +462,7 @@ uchar FREAK::meanIntensity( const cv::Mat& image, const cv::Mat& integral, const int r_x_1 = (1024-r_x); const int r_y_1 = (1024-r_y); uchar* ptr = image.data+x+y*imagecols; + unsigned int ret_val; // linear interpolation: ret_val = (r_x_1*r_y_1*int(*ptr)); ptr++; @@ -471,7 +471,9 @@ uchar FREAK::meanIntensity( const cv::Mat& image, const cv::Mat& integral, ret_val += (r_x*r_y*int(*ptr)); ptr--; ret_val += (r_x_1*r_y*int(*ptr)); - return static_cast((ret_val+512)/1024); + //return the rounded mean + ret_val += 2 * 1024 * 1024; + return static_cast(ret_val / (4 * 1024 * 1024)); } // expected case: @@ -481,6 +483,7 @@ uchar FREAK::meanIntensity( const cv::Mat& image, const cv::Mat& integral, const int y_top = int(yf-radius+0.5); const int x_right = int(xf+radius+1.5);//integral image is 1px wider const int y_bottom = int(yf+radius+1.5);//integral image is 1px higher + int ret_val; ret_val = integral.at(y_bottom,x_right);//bottom right corner ret_val -= integral.at(y_bottom,x_left); From 8dcf52c90b1340b9aadd3c8b7eae50302efb7b4c Mon Sep 17 00:00:00 2001 From: Leonid Beynenson Date: Tue, 28 Aug 2012 17:44:33 +0400 Subject: [PATCH 012/103] Added possibility to make subfolders in modules' folders "src/". --- cmake/OpenCVModule.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake index 018a46730..72c7fc830 100644 --- a/cmake/OpenCVModule.cmake +++ b/cmake/OpenCVModule.cmake @@ -422,8 +422,8 @@ endmacro() # Usage: # ocv_glob_module_sources() macro(ocv_glob_module_sources) - file(GLOB lib_srcs "src/*.cpp") - file(GLOB lib_int_hdrs "src/*.hpp" "src/*.h") + file(GLOB_RECURSE lib_srcs "src/*.cpp") + file(GLOB_RECURSE lib_int_hdrs "src/*.hpp" "src/*.h") file(GLOB lib_hdrs "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h") file(GLOB lib_hdrs_detail "include/opencv2/${name}/detail/*.hpp" "include/opencv2/${name}/detail/*.h") From aa2524f41e509dc990388ca4c4a343117ffec20b Mon Sep 17 00:00:00 2001 From: Leonid Beynenson Date: Tue, 28 Aug 2012 17:46:45 +0400 Subject: [PATCH 013/103] Changed the file .gitignore (added vim swap files and tag files) --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index dd15dac16..0a19f3cee 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ refman.rst OpenCV4Tegra/ *.user +.sw[a-z] +.*.swp +tags From 633a8bfaccfad935f7bf2f969c97dfe3091109ac Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 28 Aug 2012 18:15:14 +0400 Subject: [PATCH 014/103] fixed many warnings (modified pull request 13) --- 3rdparty/libtiff/tif_stream.cxx | 1 + apps/traincascade/HOGfeatures.h | 8 +-- apps/traincascade/lbpfeatures.h | 20 ++++---- modules/contrib/src/chamfermatching.cpp | 51 ++++++++++--------- .../include/opencv2/features2d/features2d.hpp | 5 +- modules/features2d/src/fast.cpp | 5 ++ modules/gpu/perf/perf_imgproc.cpp | 8 +-- modules/gpu/perf/perf_labeling.cpp | 2 +- modules/highgui/src/cap_ffmpeg_impl.hpp | 2 +- modules/ml/src/tree.cpp | 2 +- modules/objdetect/src/cascadedetect.hpp | 44 ++++++++-------- modules/stitching/src/seam_finders.cpp | 4 +- modules/video/src/bgfg_gmg.cpp | 2 +- 13 files changed, 82 insertions(+), 72 deletions(-) diff --git a/3rdparty/libtiff/tif_stream.cxx b/3rdparty/libtiff/tif_stream.cxx index 163447ebd..7d0f3c036 100644 --- a/3rdparty/libtiff/tif_stream.cxx +++ b/3rdparty/libtiff/tif_stream.cxx @@ -28,6 +28,7 @@ * TIFF Library UNIX-specific Routines. */ #include "tiffiop.h" +#include "tiffio.hxx" #include #ifndef __VMS diff --git a/apps/traincascade/HOGfeatures.h b/apps/traincascade/HOGfeatures.h index 56b269e22..3de3ab2ff 100644 --- a/apps/traincascade/HOGfeatures.h +++ b/apps/traincascade/HOGfeatures.h @@ -65,11 +65,11 @@ inline float CvHOGEvaluator::Feature::calc( const vector& _hists, const Mat int binIdx = featComponent % N_BINS; int cellIdx = featComponent / N_BINS; - const float *hist = _hists[binIdx].ptr((int)y); - res = hist[fastRect[cellIdx].p0] - hist[fastRect[cellIdx].p1] - hist[fastRect[cellIdx].p2] + hist[fastRect[cellIdx].p3]; + const float *phist = _hists[binIdx].ptr((int)y); + res = phist[fastRect[cellIdx].p0] - phist[fastRect[cellIdx].p1] - phist[fastRect[cellIdx].p2] + phist[fastRect[cellIdx].p3]; - const float *normSum = _normSum.ptr((int)y); - normFactor = (float)(normSum[fastRect[0].p0] - normSum[fastRect[1].p1] - normSum[fastRect[2].p2] + normSum[fastRect[3].p3]); + const float *pnormSum = _normSum.ptr((int)y); + normFactor = (float)(pnormSum[fastRect[0].p0] - pnormSum[fastRect[1].p1] - pnormSum[fastRect[2].p2] + pnormSum[fastRect[3].p3]); res = (res > 0.001f) ? ( res / (normFactor + 0.001f) ) : 0.f; //for cutting negative values, which apper due to floating precision return res; diff --git a/apps/traincascade/lbpfeatures.h b/apps/traincascade/lbpfeatures.h index 7c41f9097..5937f0850 100644 --- a/apps/traincascade/lbpfeatures.h +++ b/apps/traincascade/lbpfeatures.h @@ -41,17 +41,17 @@ protected: inline uchar CvLBPEvaluator::Feature::calc(const Mat &_sum, size_t y) const { - const int* sum = _sum.ptr((int)y); - int cval = sum[p[5]] - sum[p[6]] - sum[p[9]] + sum[p[10]]; + const int* psum = _sum.ptr((int)y); + int cval = psum[p[5]] - psum[p[6]] - psum[p[9]] + psum[p[10]]; - return (uchar)((sum[p[0]] - sum[p[1]] - sum[p[4]] + sum[p[5]] >= cval ? 128 : 0) | // 0 - (sum[p[1]] - sum[p[2]] - sum[p[5]] + sum[p[6]] >= cval ? 64 : 0) | // 1 - (sum[p[2]] - sum[p[3]] - sum[p[6]] + sum[p[7]] >= cval ? 32 : 0) | // 2 - (sum[p[6]] - sum[p[7]] - sum[p[10]] + sum[p[11]] >= cval ? 16 : 0) | // 5 - (sum[p[10]] - sum[p[11]] - sum[p[14]] + sum[p[15]] >= cval ? 8 : 0) | // 8 - (sum[p[9]] - sum[p[10]] - sum[p[13]] + sum[p[14]] >= cval ? 4 : 0) | // 7 - (sum[p[8]] - sum[p[9]] - sum[p[12]] + sum[p[13]] >= cval ? 2 : 0) | // 6 - (sum[p[4]] - sum[p[5]] - sum[p[8]] + sum[p[9]] >= cval ? 1 : 0)); // 3 + return (uchar)((psum[p[0]] - psum[p[1]] - psum[p[4]] + psum[p[5]] >= cval ? 128 : 0) | // 0 + (psum[p[1]] - psum[p[2]] - psum[p[5]] + psum[p[6]] >= cval ? 64 : 0) | // 1 + (psum[p[2]] - psum[p[3]] - psum[p[6]] + psum[p[7]] >= cval ? 32 : 0) | // 2 + (psum[p[6]] - psum[p[7]] - psum[p[10]] + psum[p[11]] >= cval ? 16 : 0) | // 5 + (psum[p[10]] - psum[p[11]] - psum[p[14]] + psum[p[15]] >= cval ? 8 : 0) | // 8 + (psum[p[9]] - psum[p[10]] - psum[p[13]] + psum[p[14]] >= cval ? 4 : 0) | // 7 + (psum[p[8]] - psum[p[9]] - psum[p[12]] + psum[p[13]] >= cval ? 2 : 0) | // 6 + (psum[p[4]] - psum[p[5]] - psum[p[8]] + psum[p[9]] >= cval ? 1 : 0)); // 3 } #endif diff --git a/modules/contrib/src/chamfermatching.cpp b/modules/contrib/src/chamfermatching.cpp index 09d589e5d..386b5ef16 100644 --- a/modules/contrib/src/chamfermatching.cpp +++ b/modules/contrib/src/chamfermatching.cpp @@ -100,8 +100,8 @@ private: float max_scale_; public: - SlidingWindowImageRange(int width, int height, int x_step = 3, int y_step = 3, int scales = 5, float min_scale = 0.6, float max_scale = 1.6) : - width_(width), height_(height), x_step_(x_step),y_step_(y_step), scales_(scales), min_scale_(min_scale), max_scale_(max_scale) + SlidingWindowImageRange(int width, int height, int x_step = 3, int y_step = 3, int _scales = 5, float min_scale = 0.6, float max_scale = 1.6) : + width_(width), height_(height), x_step_(x_step),y_step_(y_step), scales_(_scales), min_scale_(min_scale), max_scale_(max_scale) { } @@ -121,8 +121,8 @@ private: LocationImageRange& operator=(const LocationImageRange&); public: - LocationImageRange(const std::vector& locations, int scales = 5, float min_scale = 0.6, float max_scale = 1.6) : - locations_(locations), scales_(scales), min_scale_(min_scale), max_scale_(max_scale) + LocationImageRange(const std::vector& locations, int _scales = 5, float min_scale = 0.6, float max_scale = 1.6) : + locations_(locations), scales_(_scales), min_scale_(min_scale), max_scale_(max_scale) { } @@ -141,10 +141,10 @@ private: LocationScaleImageRange(const LocationScaleImageRange&); LocationScaleImageRange& operator=(const LocationScaleImageRange&); public: - LocationScaleImageRange(const std::vector& locations, const std::vector& scales) : - locations_(locations), scales_(scales) + LocationScaleImageRange(const std::vector& locations, const std::vector& _scales) : + locations_(locations), scales_(_scales) { - assert(locations.size()==scales.size()); + assert(locations.size()==_scales.size()); } ImageIterator* iterator() const @@ -237,7 +237,7 @@ private: std::vector templates; public: - Matching(bool use_orientation = true, float truncate = 10) : truncate_(truncate), use_orientation_(use_orientation) + Matching(bool use_orientation = true, float _truncate = 10) : truncate_(_truncate), use_orientation_(use_orientation) { } @@ -370,7 +370,7 @@ private: LocationImageIterator& operator=(const LocationImageIterator&); public: - LocationImageIterator(const std::vector& locations, int scales, float min_scale, float max_scale); + LocationImageIterator(const std::vector& locations, int _scales, float min_scale, float max_scale); bool hasNext() const { return has_next_; @@ -392,10 +392,10 @@ private: LocationScaleImageIterator& operator=(const LocationScaleImageIterator&); public: - LocationScaleImageIterator(const std::vector& locations, const std::vector& scales) : - locations_(locations), scales_(scales) + LocationScaleImageIterator(const std::vector& locations, const std::vector& _scales) : + locations_(locations), scales_(_scales) { - assert(locations.size()==scales.size()); + assert(locations.size()==_scales.size()); reset(); } @@ -494,7 +494,7 @@ ChamferMatcher::SlidingWindowImageIterator::SlidingWindowImageIterator( int widt int height, int x_step = 3, int y_step = 3, - int scales = 5, + int _scales = 5, float min_scale = 0.6, float max_scale = 1.6) : @@ -502,7 +502,7 @@ ChamferMatcher::SlidingWindowImageIterator::SlidingWindowImageIterator( int widt height_(height), x_step_(x_step), y_step_(y_step), - scales_(scales), + scales_(_scales), min_scale_(min_scale), max_scale_(max_scale) { @@ -550,11 +550,11 @@ ChamferMatcher::ImageIterator* ChamferMatcher::SlidingWindowImageRange::iterator ChamferMatcher::LocationImageIterator::LocationImageIterator(const std::vector& locations, - int scales = 5, + int _scales = 5, float min_scale = 0.6, float max_scale = 1.6) : locations_(locations), - scales_(scales), + scales_(_scales), min_scale_(min_scale), max_scale_(max_scale) { @@ -1138,10 +1138,10 @@ ChamferMatcher::Match* ChamferMatcher::Matching::localChamferDistance(Point offs } -ChamferMatcher::Matches* ChamferMatcher::Matching::matchTemplates(Mat& dist_img, Mat& orientation_img, const ImageRange& range, float orientation_weight) +ChamferMatcher::Matches* ChamferMatcher::Matching::matchTemplates(Mat& dist_img, Mat& orientation_img, const ImageRange& range, float _orientation_weight) { - ChamferMatcher::Matches* matches(new Matches()); + ChamferMatcher::Matches* pmatches(new Matches()); // try each template for(size_t i = 0; i < templates.size(); i++) { ImageIterator* it = range.iterator(); @@ -1156,17 +1156,17 @@ ChamferMatcher::Matches* ChamferMatcher::Matching::matchTemplates(Mat& dist_img, if (loc.x-tpl->center.x<0 || loc.x+tpl->size.width/2>=dist_img.cols) continue; if (loc.y-tpl->center.y<0 || loc.y+tpl->size.height/2>=dist_img.rows) continue; - ChamferMatcher::Match* is = localChamferDistance(loc, dist_img, orientation_img, tpl, orientation_weight); + ChamferMatcher::Match* is = localChamferDistance(loc, dist_img, orientation_img, tpl, _orientation_weight); if(is) { - matches->push_back(*is); + pmatches->push_back(*is); delete is; } } delete it; } - return matches; + return pmatches; } @@ -1176,7 +1176,8 @@ ChamferMatcher::Matches* ChamferMatcher::Matching::matchTemplates(Mat& dist_img, * @param edge_img Edge image * @return a match object */ -ChamferMatcher::Matches* ChamferMatcher::Matching::matchEdgeImage(Mat& edge_img, const ImageRange& range, float orientation_weight, int /*max_matches*/, float /*min_match_distance*/) +ChamferMatcher::Matches* ChamferMatcher::Matching::matchEdgeImage(Mat& edge_img, const ImageRange& range, + float _orientation_weight, int /*max_matches*/, float /*min_match_distance*/) { CV_Assert(edge_img.channels()==1); @@ -1203,10 +1204,10 @@ ChamferMatcher::Matches* ChamferMatcher::Matching::matchEdgeImage(Mat& edge_img, // Template matching - ChamferMatcher::Matches* matches = matchTemplates( dist_img, + ChamferMatcher::Matches* pmatches = matchTemplates( dist_img, orientation_img, range, - orientation_weight); + _orientation_weight); if (use_orientation_) { @@ -1215,7 +1216,7 @@ ChamferMatcher::Matches* ChamferMatcher::Matching::matchEdgeImage(Mat& edge_img, dist_img.release(); annotated_img.release(); - return matches; + return pmatches; } diff --git a/modules/features2d/include/opencv2/features2d/features2d.hpp b/modules/features2d/include/opencv2/features2d/features2d.hpp index a191ca223..ff52822ed 100644 --- a/modules/features2d/include/opencv2/features2d/features2d.hpp +++ b/modules/features2d/include/opencv2/features2d/features2d.hpp @@ -473,7 +473,10 @@ protected: //! detects corners using FAST algorithm by E. Rosten CV_EXPORTS void FAST( InputArray image, CV_OUT vector& keypoints, - int threshold, bool nonmaxSupression=true, int type = 2 ); + int threshold, bool nonmaxSupression=true ); + +CV_EXPORTS void FAST( InputArray image, CV_OUT vector& keypoints, + int threshold, bool nonmaxSupression, int type ); class CV_EXPORTS_W FastFeatureDetector : public FeatureDetector { diff --git a/modules/features2d/src/fast.cpp b/modules/features2d/src/fast.cpp index fe496762e..b9834bbf0 100644 --- a/modules/features2d/src/fast.cpp +++ b/modules/features2d/src/fast.cpp @@ -578,6 +578,11 @@ void FAST(InputArray _img, std::vector& keypoints, int threshold, bool break; } } + +void FAST(InputArray _img, std::vector& keypoints, int threshold, bool nonmax_suppression) +{ + FAST(_img, keypoints, threshold, nonmax_suppression, FastFeatureDetector::TYPE_9_16); +} /* * FastFeatureDetector */ diff --git a/modules/gpu/perf/perf_imgproc.cpp b/modules/gpu/perf/perf_imgproc.cpp index ba864afc9..80d4af54d 100644 --- a/modules/gpu/perf/perf_imgproc.cpp +++ b/modules/gpu/perf/perf_imgproc.cpp @@ -23,13 +23,13 @@ void generateMap(cv::Mat& map_x, cv::Mat& map_y, int remapMode) case HALF_SIZE: if (i > map_x.cols*0.25 && i < map_x.cols*0.75 && j > map_x.rows*0.25 && j < map_x.rows*0.75) { - map_x.at(j,i) = 2 * (i - map_x.cols * 0.25f) + 0.5f; - map_y.at(j,i) = 2 * (j - map_x.rows * 0.25f) + 0.5f; + map_x.at(j,i) = 2.f * (i - map_x.cols * 0.25f) + 0.5f; + map_y.at(j,i) = 2.f * (j - map_x.rows * 0.25f) + 0.5f; } else { - map_x.at(j,i) = 0; - map_y.at(j,i) = 0; + map_x.at(j,i) = 0.f; + map_y.at(j,i) = 0.f; } break; case UPSIDE_DOWN: diff --git a/modules/gpu/perf/perf_labeling.cpp b/modules/gpu/perf/perf_labeling.cpp index bbab5ecfa..1a812652d 100644 --- a/modules/gpu/perf/perf_labeling.cpp +++ b/modules/gpu/perf/perf_labeling.cpp @@ -23,7 +23,7 @@ struct GreedyLabeling struct InInterval { - InInterval(const int& _lo, const int& _hi) : lo(-_lo), hi(_hi) {}; + InInterval(const int& _lo, const int& _hi) : lo(-_lo), hi(_hi) {} const int lo, hi; bool operator() (const unsigned char a, const unsigned char b) const diff --git a/modules/highgui/src/cap_ffmpeg_impl.hpp b/modules/highgui/src/cap_ffmpeg_impl.hpp index fc9ace54a..d3a5ed3ad 100644 --- a/modules/highgui/src/cap_ffmpeg_impl.hpp +++ b/modules/highgui/src/cap_ffmpeg_impl.hpp @@ -2050,7 +2050,7 @@ bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFi if (ret < 0) { - if (ret == (int64_t)AVERROR_EOF) + if ((int64_t)ret == (int64_t)AVERROR_EOF) *endOfFile = true; return false; } diff --git a/modules/ml/src/tree.cpp b/modules/ml/src/tree.cpp index 936f552d3..0da24d66a 100644 --- a/modules/ml/src/tree.cpp +++ b/modules/ml/src/tree.cpp @@ -2069,7 +2069,7 @@ void CvDTree::cluster_categories( const int* vectors, int n, int m, { int sum = 0; const int* v = vectors + i*m; - labels[i] = i < k ? i : (*r)(k); + labels[i] = i < k ? i : r->uniform(0, k); // compute weight of each vector for( j = 0; j < m; j++ ) diff --git a/modules/objdetect/src/cascadedetect.hpp b/modules/objdetect/src/cascadedetect.hpp index ec208c1ba..904c207b3 100644 --- a/modules/objdetect/src/cascadedetect.hpp +++ b/modules/objdetect/src/cascadedetect.hpp @@ -128,20 +128,20 @@ inline HaarEvaluator::Feature :: Feature() p[2][0] = p[2][1] = p[2][2] = p[2][3] = 0; } -inline float HaarEvaluator::Feature :: calc( int offset ) const +inline float HaarEvaluator::Feature :: calc( int _offset ) const { - float ret = rect[0].weight * CALC_SUM(p[0], offset) + rect[1].weight * CALC_SUM(p[1], offset); + float ret = rect[0].weight * CALC_SUM(p[0], _offset) + rect[1].weight * CALC_SUM(p[1], _offset); if( rect[2].weight != 0.0f ) - ret += rect[2].weight * CALC_SUM(p[2], offset); + ret += rect[2].weight * CALC_SUM(p[2], _offset); return ret; } -inline void HaarEvaluator::Feature :: updatePtrs( const Mat& sum ) +inline void HaarEvaluator::Feature :: updatePtrs( const Mat& _sum ) { - const int* ptr = (const int*)sum.data; - size_t step = sum.step/sizeof(ptr[0]); + const int* ptr = (const int*)_sum.data; + size_t step = _sum.step/sizeof(ptr[0]); if (tilted) { CV_TILTED_PTRS( p[0][0], p[0][1], p[0][2], p[0][3], ptr, rect[0].r, step ); @@ -210,24 +210,24 @@ inline LBPEvaluator::Feature :: Feature() p[i] = 0; } -inline int LBPEvaluator::Feature :: calc( int offset ) const +inline int LBPEvaluator::Feature :: calc( int _offset ) const { - int cval = CALC_SUM_( p[5], p[6], p[9], p[10], offset ); + int cval = CALC_SUM_( p[5], p[6], p[9], p[10], _offset ); - return (CALC_SUM_( p[0], p[1], p[4], p[5], offset ) >= cval ? 128 : 0) | // 0 - (CALC_SUM_( p[1], p[2], p[5], p[6], offset ) >= cval ? 64 : 0) | // 1 - (CALC_SUM_( p[2], p[3], p[6], p[7], offset ) >= cval ? 32 : 0) | // 2 - (CALC_SUM_( p[6], p[7], p[10], p[11], offset ) >= cval ? 16 : 0) | // 5 - (CALC_SUM_( p[10], p[11], p[14], p[15], offset ) >= cval ? 8 : 0)| // 8 - (CALC_SUM_( p[9], p[10], p[13], p[14], offset ) >= cval ? 4 : 0)| // 7 - (CALC_SUM_( p[8], p[9], p[12], p[13], offset ) >= cval ? 2 : 0)| // 6 - (CALC_SUM_( p[4], p[5], p[8], p[9], offset ) >= cval ? 1 : 0); + return (CALC_SUM_( p[0], p[1], p[4], p[5], _offset ) >= cval ? 128 : 0) | // 0 + (CALC_SUM_( p[1], p[2], p[5], p[6], _offset ) >= cval ? 64 : 0) | // 1 + (CALC_SUM_( p[2], p[3], p[6], p[7], _offset ) >= cval ? 32 : 0) | // 2 + (CALC_SUM_( p[6], p[7], p[10], p[11], _offset ) >= cval ? 16 : 0) | // 5 + (CALC_SUM_( p[10], p[11], p[14], p[15], _offset ) >= cval ? 8 : 0)| // 8 + (CALC_SUM_( p[9], p[10], p[13], p[14], _offset ) >= cval ? 4 : 0)| // 7 + (CALC_SUM_( p[8], p[9], p[12], p[13], _offset ) >= cval ? 2 : 0)| // 6 + (CALC_SUM_( p[4], p[5], p[8], p[9], _offset ) >= cval ? 1 : 0); } -inline void LBPEvaluator::Feature :: updatePtrs( const Mat& sum ) +inline void LBPEvaluator::Feature :: updatePtrs( const Mat& _sum ) { - const int* ptr = (const int*)sum.data; - size_t step = sum.step/sizeof(ptr[0]); + const int* ptr = (const int*)_sum.data; + size_t step = _sum.step/sizeof(ptr[0]); Rect tr = rect; CV_SUM_PTRS( p[0], p[1], p[4], p[5], ptr, tr, step ); tr.x += 2*rect.width; @@ -292,10 +292,10 @@ inline HOGEvaluator::Feature :: Feature() featComponent = 0; } -inline float HOGEvaluator::Feature :: calc( int offset ) const +inline float HOGEvaluator::Feature :: calc( int _offset ) const { - float res = CALC_SUM(pF, offset); - float normFactor = CALC_SUM(pN, offset); + float res = CALC_SUM(pF, _offset); + float normFactor = CALC_SUM(pN, _offset); res = (res > 0.001f) ? (res / ( normFactor + 0.001f) ) : 0.f; return res; } diff --git a/modules/stitching/src/seam_finders.cpp b/modules/stitching/src/seam_finders.cpp index 3e10398ee..e568a6a03 100644 --- a/modules/stitching/src/seam_finders.cpp +++ b/modules/stitching/src/seam_finders.cpp @@ -817,7 +817,7 @@ bool DpSeamFinder::estimateSeam( { pair opt = *min_element(steps, steps + nsteps); cost(y, x) = opt.first; - control(y, x) = opt.second; + control(y, x) = (uchar)opt.second; reachable(y, x) = 255; } } @@ -847,7 +847,7 @@ bool DpSeamFinder::estimateSeam( { pair opt = *min_element(steps, steps + nsteps); cost(y, x) = opt.first; - control(y, x) = opt.second; + control(y, x) = (uchar)opt.second; reachable(y, x) = 255; } } diff --git a/modules/video/src/bgfg_gmg.cpp b/modules/video/src/bgfg_gmg.cpp index 02b708e25..e3574b78f 100644 --- a/modules/video/src/bgfg_gmg.cpp +++ b/modules/video/src/bgfg_gmg.cpp @@ -269,7 +269,7 @@ namespace if (updateBackgroundModel_) { for (int i = 0; i < nfeatures; ++i) - weights[i] *= 1.0f - learningRate_; + weights[i] *= (float)(1.0f - learningRate_); bool inserted = insertFeature(newFeatureColor, (float)learningRate_, colors, weights, nfeatures, maxFeatures_); From 4d6730dc68ea69843eb30c449882b5284d76dd49 Mon Sep 17 00:00:00 2001 From: Vsevolod Glumov Date: Tue, 28 Aug 2012 18:51:34 +0400 Subject: [PATCH 015/103] Improved javadoc comments. Minor formatting fix. --- modules/java/generator/src/java/android+OpenCVLoader.java | 4 ++-- .../generator/src/java/engine+OpenCVEngineInterface.aidl | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/java/generator/src/java/android+OpenCVLoader.java b/modules/java/generator/src/java/android+OpenCVLoader.java index b3025a9aa..e754a995f 100644 --- a/modules/java/generator/src/java/android+OpenCVLoader.java +++ b/modules/java/generator/src/java/android+OpenCVLoader.java @@ -14,7 +14,7 @@ public class OpenCVLoader /** * Loads and initializes OpenCV library from current application package. Roughly, it's an analog of system.loadLibrary("opencv_java"). - * @return returns true is initialization of OpenCV was successful. + * @return Returns true is initialization of OpenCV was successful. */ public static boolean initDebug() { @@ -26,7 +26,7 @@ public class OpenCVLoader * @param Version OpenCV library version. * @param AppContext application context for connecting to the service. * @param Callback object, that implements LoaderCallbackInterface for handling the connection status. - * @return returns true if initialization of OpenCV is successful. + * @return Returns true if initialization of OpenCV is successful. */ public static boolean initAsync(String Version, Context AppContext, LoaderCallbackInterface Callback) diff --git a/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl b/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl index 7949b3160..7bf967fd8 100644 --- a/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl +++ b/modules/java/generator/src/java/engine+OpenCVEngineInterface.aidl @@ -6,28 +6,28 @@ package org.opencv.engine; interface OpenCVEngineInterface { /** - * @return returns service version. + * @return Returns service version. */ int getEngineVersion(); /** * Finds an installed OpenCV library. * @param OpenCV version. - * @return returns path to OpenCV native libs or an empty string if OpenCV can not be found. + * @return Returns path to OpenCV native libs or an empty string if OpenCV can not be found. */ String getLibPathByVersion(String version); /** * Tries to install defined version of OpenCV from Google Play Market. * @param OpenCV version. - * @return returns true if installation was successful or OpenCV package has been already installed. + * @return Returns true if installation was successful or OpenCV package has been already installed. */ boolean installVersion(String version); /** * Returns list of libraries in loading order, separated by semicolon. * @param OpenCV version. - * @return returns names of OpenCV libraries, separated by semicolon. + * @return Returns names of OpenCV libraries, separated by semicolon. */ String getLibraryList(String version); } \ No newline at end of file From 6c3e769f328d6930f989b54eba9dcdc48257c0fe Mon Sep 17 00:00:00 2001 From: Sergiu Dotenco Date: Tue, 28 Aug 2012 17:21:06 +0200 Subject: [PATCH 016/103] eliminated type conversion warnings --- modules/imgproc/src/smooth.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/imgproc/src/smooth.cpp b/modules/imgproc/src/smooth.cpp index 0fe1b6be4..8ec6f6d79 100644 --- a/modules/imgproc/src/smooth.cpp +++ b/modules/imgproc/src/smooth.cpp @@ -1325,7 +1325,7 @@ public: #if CV_SSE3 if( haveSSE3 ) { - __m128 _val0 = _mm_set1_ps(val0); + __m128 _val0 = _mm_set1_ps(static_cast(val0)); const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); for( ; k <= maxk - 4; k += 4 ) @@ -1373,9 +1373,9 @@ public: #if CV_SSE3 if( haveSSE3 ) { - const __m128 _b0 = _mm_set1_ps(b0); - const __m128 _g0 = _mm_set1_ps(g0); - const __m128 _r0 = _mm_set1_ps(r0); + const __m128 _b0 = _mm_set1_ps(static_cast(b0)); + const __m128 _g0 = _mm_set1_ps(static_cast(g0)); + const __m128 _r0 = _mm_set1_ps(static_cast(r0)); const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); for( ; k <= maxk - 4; k += 4 ) From cd59cf3ab5c37d1db53394f5143cd87f9047547f Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 17:23:33 +0400 Subject: [PATCH 017/103] Fixed java camera release in Android tutorial-0 sample --- .../opencv/samples/tutorial0/Sample0View.java | 2 +- .../samples/tutorial0/SampleViewBase.java | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java index 769c34c36..a0278187c 100644 --- a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java +++ b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java @@ -6,7 +6,7 @@ import android.util.Log; class Sample0View extends SampleViewBase { - private static final String TAG = "Sample0View"; + private static final String TAG = "Sample::View"; int mSize; int[] mRGBA; private Bitmap mBitmap; diff --git a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java index 376c86adb..c1cc15872 100644 --- a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java +++ b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java @@ -23,7 +23,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde private int mFrameWidth; private int mFrameHeight; private byte[] mFrame; - private boolean mThreadRun; + private volatile boolean mThreadRun; private byte[] mBuffer; private SurfaceTexture mSf; @@ -55,9 +55,16 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde public boolean openCamera() { Log.i(TAG, "openCamera"); - mCamera = Camera.open(); + mCamera = null; + try { + mCamera = Camera.open(); + } + catch (Exception e){ + Log.e(TAG, "Camera is not available (in use or does not exist)"); + e.printStackTrace(); + } if(mCamera == null) { - Log.e(TAG, "Can't open camera!"); + Log.e(TAG, "Failed to open camera"); return false; } @@ -79,7 +86,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde synchronized (this) { if (mCamera != null) { mCamera.stopPreview(); - mCamera.setPreviewCallback(null); mCamera.release(); mCamera = null; } @@ -91,6 +97,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde Log.i(TAG, "setupCamera"); synchronized (this) { if (mCamera != null) { + Log.i(TAG, "setupCamera - " + width + "x" + height); Camera.Parameters params = mCamera.getParameters(); List sizes = params.getSupportedPreviewSizes(); mFrameWidth = width; @@ -144,6 +151,14 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { Log.i(TAG, "surfaceChanged"); + // stop preview before making changes + try { + mCamera.stopPreview(); + } catch (Exception e){ + // ignore: tried to stop a non-existent preview + } + + // start preview with new settings setupCamera(width, height); } @@ -154,7 +169,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde public void surfaceDestroyed(SurfaceHolder holder) { Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); } /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */ @@ -184,6 +198,8 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde synchronized (this) { try { this.wait(); + if (!mThreadRun) + break; bmp = processFrame(mFrame); } catch (InterruptedException e) { e.printStackTrace(); From 0adbead654e49ec352ab4bb21cf112d47a44ab71 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 20:39:10 +0400 Subject: [PATCH 018/103] Android toolchain: fix CCache program search --- android/android.toolchain.cmake | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index 47918ade5..b4d498fc3 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -690,12 +690,13 @@ if( BUILD_WITH_ANDROID_NDK ) endif() # ccache support -__INIT_VARIABLE( NDK_CCACHE ENV_NDK_CCACHE ) -if( NDK_CCACHE ) - find_program(NDK_CCACHE "${NDK_CCACHE}" DOC "The path to ccache binary") +__INIT_VARIABLE( _ndk_ccache NDK_CCACHE ENV_NDK_CCACHE ) +if( _ndk_ccache ) + find_program( NDK_CCACHE "${_ndk_ccache}" DOC "The path to ccache binary") else() - unset( NDK_CCACHE ) + unset( NDK_CCACHE CACHE ) endif() +unset( _ndk_ccache ) # specify the cross compiler if( NDK_CCACHE ) From 14694343cba605aa0bed6e3af0925cc63ec9d033 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Wed, 29 Aug 2012 10:51:40 +0400 Subject: [PATCH 019/103] fixed gpu PyrLKSparse perf test --- modules/gpu/perf/perf_video.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gpu/perf/perf_video.cpp b/modules/gpu/perf/perf_video.cpp index 8346d25f4..aa802fbf5 100644 --- a/modules/gpu/perf/perf_video.cpp +++ b/modules/gpu/perf/perf_video.cpp @@ -219,7 +219,7 @@ PERF_TEST_P(ImagePair_Gray_NPts_WinSz_Levels_Iters, Video_PyrLKOpticalFlowSparse if (runOnGpu) { - cv::gpu::GpuMat d_pts(pts); + cv::gpu::GpuMat d_pts(pts.reshape(2, 1)); cv::gpu::PyrLKOpticalFlow d_pyrLK; d_pyrLK.winSize = cv::Size(winSize, winSize); From ee2bebf5f7a9fda0e3aac9d5edd35d7f58ac3939 Mon Sep 17 00:00:00 2001 From: OpenCV Buildbot Date: Wed, 29 Aug 2012 18:59:21 +0400 Subject: [PATCH 020/103] update FFMPEG wrapper binaries --- 3rdparty/ffmpeg/opencv_ffmpeg.dll | Bin 9161356 -> 9161356 bytes 3rdparty/ffmpeg/opencv_ffmpeg_64.dll | Bin 9219038 -> 9219038 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3rdparty/ffmpeg/opencv_ffmpeg.dll b/3rdparty/ffmpeg/opencv_ffmpeg.dll index 056295fef85329261c0f48b7fba88629f8f24865..2063af43c263b5b1d14f2090a45fc86fe8aca0a1 100644 GIT binary patch delta 465 zcmWN=*)|k#0KnnHOpR8wsFWmSOOqB_XcA4R>`_UJA}y9eWl2%}3~`YQ&*94P1i9)7 zeoy27o%5}%tw&eFzl)J%Jh8gmoc@1sUQEMuj9?UZ;7*KT2JXV$xCi&*KHQI)n1$JR z01x6JJd8Pb1drk|%*Eq)0`u@B=Hn?Wz|&ZWXYec*VKJ6qDVE_mEXVU0#|v127x5Ba z#w%EfRd^Mz;dQ)$)mVc!F@d+R7H?x6*5e&a;$3XOMr^`+cpo2NGqzwWwqZMVU?)Dr zF6_of_!ysH4?e|Se1^~Q1-`^Se1)&E9|!Oa4&qyUhwt$N4&gA4;3$5?PdJ9-IDwz> z3x35(oWg0G!EYPRmi>#=#}ld8)@=Aa{1MKD^Wo3%SNJ<5TnJO)Vz?Ck*^F&16Ws=q CN%6)2 delta 465 zcmWN=={6K#0D$4cjHY5RDwKpaC0d1wvQ%0Kt+u93WhvSeN*Q_)e(=L}_|pn z7x!U47GNRn#{*b|2eB9rVF{LE86L(XcodJ}aV*CZcoHk{6jovtp2jnH7SG{%ynxks z5o@p(>+lj@#w%El4R{r=VIwwSGq&J$yn#2d6>s5fyn}bK4cqY^c3>xV;eC975AhK` z#wXZ~J=lwV*pE*!iO=vkzQC9G3J35tzQMORh(kDxBlr&A<0y{d2mFYi@H2kFar}zk zZ~`ZB3curzzfM>Di^P+Oh1k|~_%r+!&V;FOHk=E8hlKOtLbw?I370lwTgybZ0d*?y A_y7O^ diff --git a/3rdparty/ffmpeg/opencv_ffmpeg_64.dll b/3rdparty/ffmpeg/opencv_ffmpeg_64.dll index c7aed0dc59fd2e593fa1d2ea4717b3e27ace957a..5a75816df44fbfc5b9460ddecea3c7f9167c1dc1 100644 GIT binary patch delta 467 zcmWN=SyRn%0D$4i|LCZ+kd!54tEiJKrRd0d3TaW6LZ$44HcL1quTJWMPvPE7PRGit#n1{f2#{(4sO5*W4IA>F^-!s5A(4AH)A0dVKJ8A z7Tk)ZxDCs2JC9Zm2oGa5)?h6j!J}A*^_aj0Jcf;U z98cg$JcUizjHj^$Tk#B@#WqahIc&%CcmXfsCA^GRFohl1iC6I&UdJxHf!)}Hz1W90 zu^$KU7T(4?cozq82=C#2e1O9^f}{8l$8a1U;bVM)Pw^Q(#~1h#U*QD4#y9vDCvgg= zaRz7c9lpm8_z~yu6Mn`om|kZ z&RmP156=}m#lr7cF__CmiEMH{pNamYe@%-^a4AL@!)3S}VhOIoQe2H?xCRrL z#B!{_O02@QxDMB2HP+w;+=!cSGj74HSc}_mJMO?b+==zL3sblo8?X`gU=!}eeYhVF z;6Xfuhp`!tU<)3_V|W}}@dUQvNo>bc*nypR8qeTa?7}pj!}HjUJ($4@co8q*W$eX1 z?8hs36|dm{4&rsZfj99MW^o8_;~l(<_wYVGz=!woL|$8iED@$;fnspx;lY&4iDN09#;kNqqx F`~#IL>&O5A From 3d9018f0191304c3f24816530a3552d57a557428 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 19:16:11 +0400 Subject: [PATCH 021/103] Fix run.py version control detection when used outide of OpenCV build --- modules/ts/misc/run.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ts/misc/run.py b/modules/ts/misc/run.py index f2c213ed1..09db7dc79 100644 --- a/modules/ts/misc/run.py +++ b/modules/ts/misc/run.py @@ -339,6 +339,8 @@ class RunInfo(object): self.tests = self.getAvailableTestApps() def getVCVersion(self, root_path): + if not root_path: + return None if os.path.isdir(os.path.join(root_path, ".svn")): return self.getSvnVersion(root_path) elif os.path.isdir(os.path.join(root_path, ".git")): From a09679044e5334aebe3dbd1929a950ccee40ac56 Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev Date: Mon, 27 Aug 2012 14:27:13 +0400 Subject: [PATCH 022/103] renamed device::bilaterl_filter kernel to device::disp_bilaterl_filter for correct naming fixed some warnings --- modules/gpu/src/bilateral_filter.cpp | 18 +- modules/gpu/src/cuda/disp_bilateral_filter.cu | 219 ++++++++++++++++++ 2 files changed, 228 insertions(+), 9 deletions(-) create mode 100644 modules/gpu/src/cuda/disp_bilateral_filter.cu diff --git a/modules/gpu/src/bilateral_filter.cpp b/modules/gpu/src/bilateral_filter.cpp index 04c312688..facd1ee08 100644 --- a/modules/gpu/src/bilateral_filter.cpp +++ b/modules/gpu/src/bilateral_filter.cpp @@ -57,16 +57,16 @@ void cv::gpu::DisparityBilateralFilter::operator()(const GpuMat&, const GpuMat&, namespace cv { namespace gpu { namespace device { - namespace bilateral_filter + namespace disp_bilateral_filter { - void load_constants(float* table_color, PtrStepSzf table_space, int ndisp, int radius, short edge_disc, short max_disc); + void disp_load_constants(float* table_color, PtrStepSzf table_space, int ndisp, int radius, short edge_disc, short max_disc); - void bilateral_filter_gpu(PtrStepSzb disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream); - void bilateral_filter_gpu(PtrStepSz disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream); + template + void disp_bilateral_filter(PtrStepSz disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream); } }}} -using namespace ::cv::gpu::device::bilateral_filter; +using namespace ::cv::gpu::device::disp_bilateral_filter; namespace { @@ -103,14 +103,14 @@ namespace } template - void bilateral_filter_operator(int ndisp, int radius, int iters, float edge_threshold,float max_disc_threshold, + void disp_bilateral_filter_operator(int ndisp, int radius, int iters, float edge_threshold,float max_disc_threshold, GpuMat& table_color, GpuMat& table_space, const GpuMat& disp, const GpuMat& img, GpuMat& dst, Stream& stream) { short edge_disc = max(short(1), short(ndisp * edge_threshold + 0.5)); short max_disc = short(ndisp * max_disc_threshold + 0.5); - load_constants(table_color.ptr(), table_space, ndisp, radius, edge_disc, max_disc); + disp_load_constants(table_color.ptr(), table_space, ndisp, radius, edge_disc, max_disc); if (&dst != &disp) { @@ -120,7 +120,7 @@ namespace disp.copyTo(dst); } - bilateral_filter_gpu((PtrStepSz)dst, img, img.channels(), iters, StreamAccessor::getStream(stream)); + disp_bilateral_filter(dst, img, img.channels(), iters, StreamAccessor::getStream(stream)); } typedef void (*bilateral_filter_operator_t)(int ndisp, int radius, int iters, float edge_threshold, float max_disc_threshold, @@ -128,7 +128,7 @@ namespace const GpuMat& disp, const GpuMat& img, GpuMat& dst, Stream& stream); const bilateral_filter_operator_t operators[] = - {bilateral_filter_operator, 0, 0, bilateral_filter_operator, 0, 0, 0, 0}; + {disp_bilateral_filter_operator, 0, 0, disp_bilateral_filter_operator, 0, 0, 0, 0}; } cv::gpu::DisparityBilateralFilter::DisparityBilateralFilter(int ndisp_, int radius_, int iters_) diff --git a/modules/gpu/src/cuda/disp_bilateral_filter.cu b/modules/gpu/src/cuda/disp_bilateral_filter.cu new file mode 100644 index 000000000..e91cf9cc3 --- /dev/null +++ b/modules/gpu/src/cuda/disp_bilateral_filter.cu @@ -0,0 +1,219 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "internal_shared.hpp" +#include "opencv2/gpu/device/limits.hpp" + +namespace cv { namespace gpu { namespace device +{ + namespace disp_bilateral_filter + { + __constant__ float* ctable_color; + __constant__ float* ctable_space; + __constant__ size_t ctable_space_step; + + __constant__ int cndisp; + __constant__ int cradius; + + __constant__ short cedge_disc; + __constant__ short cmax_disc; + + void disp_load_constants(float* table_color, PtrStepSzf table_space, int ndisp, int radius, short edge_disc, short max_disc) + { + cudaSafeCall( cudaMemcpyToSymbol(ctable_color, &table_color, sizeof(table_color)) ); + cudaSafeCall( cudaMemcpyToSymbol(ctable_space, &table_space.data, sizeof(table_space.data)) ); + size_t table_space_step = table_space.step / sizeof(float); + cudaSafeCall( cudaMemcpyToSymbol(ctable_space_step, &table_space_step, sizeof(size_t)) ); + + cudaSafeCall( cudaMemcpyToSymbol(cndisp, &ndisp, sizeof(int)) ); + cudaSafeCall( cudaMemcpyToSymbol(cradius, &radius, sizeof(int)) ); + + cudaSafeCall( cudaMemcpyToSymbol(cedge_disc, &edge_disc, sizeof(short)) ); + cudaSafeCall( cudaMemcpyToSymbol(cmax_disc, &max_disc, sizeof(short)) ); + } + + template + struct DistRgbMax + { + static __device__ __forceinline__ uchar calc(const uchar* a, const uchar* b) + { + uchar x = ::abs(a[0] - b[0]); + uchar y = ::abs(a[1] - b[1]); + uchar z = ::abs(a[2] - b[2]); + return (::max(::max(x, y), z)); + } + }; + + template <> + struct DistRgbMax<1> + { + static __device__ __forceinline__ uchar calc(const uchar* a, const uchar* b) + { + return ::abs(a[0] - b[0]); + } + }; + + template + __global__ void disp_bilateral_filter(int t, T* disp, size_t disp_step, const uchar* img, size_t img_step, int h, int w) + { + const int y = blockIdx.y * blockDim.y + threadIdx.y; + const int x = ((blockIdx.x * blockDim.x + threadIdx.x) << 1) + ((y + t) & 1); + + T dp[5]; + + if (y > 0 && y < h - 1 && x > 0 && x < w - 1) + { + dp[0] = *(disp + (y ) * disp_step + x + 0); + dp[1] = *(disp + (y-1) * disp_step + x + 0); + dp[2] = *(disp + (y ) * disp_step + x - 1); + dp[3] = *(disp + (y+1) * disp_step + x + 0); + dp[4] = *(disp + (y ) * disp_step + x + 1); + + if(::abs(dp[1] - dp[0]) >= cedge_disc || ::abs(dp[2] - dp[0]) >= cedge_disc || ::abs(dp[3] - dp[0]) >= cedge_disc || ::abs(dp[4] - dp[0]) >= cedge_disc) + { + const int ymin = ::max(0, y - cradius); + const int xmin = ::max(0, x - cradius); + const int ymax = ::min(h - 1, y + cradius); + const int xmax = ::min(w - 1, x + cradius); + + float cost[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; + + const uchar* ic = img + y * img_step + channels * x; + + for(int yi = ymin; yi <= ymax; yi++) + { + const T* disp_y = disp + yi * disp_step; + + for(int xi = xmin; xi <= xmax; xi++) + { + const uchar* in = img + yi * img_step + channels * xi; + + uchar dist_rgb = DistRgbMax::calc(in, ic); + + const float weight = ctable_color[dist_rgb] * (ctable_space + ::abs(y-yi)* ctable_space_step)[::abs(x-xi)]; + + const T disp_reg = disp_y[xi]; + + cost[0] += ::min(cmax_disc, ::abs(disp_reg - dp[0])) * weight; + cost[1] += ::min(cmax_disc, ::abs(disp_reg - dp[1])) * weight; + cost[2] += ::min(cmax_disc, ::abs(disp_reg - dp[2])) * weight; + cost[3] += ::min(cmax_disc, ::abs(disp_reg - dp[3])) * weight; + cost[4] += ::min(cmax_disc, ::abs(disp_reg - dp[4])) * weight; + } + } + + float minimum = numeric_limits::max(); + int id = 0; + + if (cost[0] < minimum) + { + minimum = cost[0]; + id = 0; + } + if (cost[1] < minimum) + { + minimum = cost[1]; + id = 1; + } + if (cost[2] < minimum) + { + minimum = cost[2]; + id = 2; + } + if (cost[3] < minimum) + { + minimum = cost[3]; + id = 3; + } + if (cost[4] < minimum) + { + minimum = cost[4]; + id = 4; + } + + *(disp + y * disp_step + x) = dp[id]; + } + } + } + + template + void disp_bilateral_filter(PtrStepSz disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream) + { + dim3 threads(32, 8, 1); + dim3 grid(1, 1, 1); + grid.x = divUp(disp.cols, threads.x << 1); + grid.y = divUp(disp.rows, threads.y); + + switch (channels) + { + case 1: + for (int i = 0; i < iters; ++i) + { + disp_bilateral_filter<1><<>>(0, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); + cudaSafeCall( cudaGetLastError() ); + + disp_bilateral_filter<1><<>>(1, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); + cudaSafeCall( cudaGetLastError() ); + } + break; + case 3: + for (int i = 0; i < iters; ++i) + { + disp_bilateral_filter<3><<>>(0, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); + cudaSafeCall( cudaGetLastError() ); + + disp_bilateral_filter<3><<>>(1, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); + cudaSafeCall( cudaGetLastError() ); + } + break; + default: + cv::gpu::error("Unsupported channels count", __FILE__, __LINE__, "disp_bilateral_filter"); + } + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } + + template void disp_bilateral_filter(PtrStepSz disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream); + template void disp_bilateral_filter(PtrStepSz disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream); + } // namespace bilateral_filter +}}} // namespace cv { namespace gpu { namespace device From 0ba01afd83d16d8ba2cfbf98dd46debe569b69cd Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev Date: Wed, 29 Aug 2012 16:49:07 +0400 Subject: [PATCH 023/103] added GPU bilateral filter + tests added GPU non local means brute force filter + tests --- CMakeLists.txt | 1 - cmake/OpenCVCompilerOptions.cmake | 7 +- modules/gpu/doc/image_processing.rst | 48 +++ modules/gpu/include/opencv2/gpu/gpu.hpp | 8 + modules/gpu/perf/perf_core.cpp | 18 +- modules/gpu/perf/perf_denoising.cpp | 98 ++++++ modules/gpu/perf/perf_imgproc.cpp | 28 +- modules/gpu/perf/perf_matop.cpp | 6 +- modules/gpu/perf/perf_video.cpp | 10 +- modules/gpu/perf/utility.hpp | 1 + modules/gpu/src/cuda/bilateral_filter.cu | 292 ++++++++---------- modules/gpu/src/cuda/nlm.cu | 143 +++++++++ modules/gpu/src/denoising.cpp | 135 ++++++++ modules/gpu/src/hough.cpp | 4 +- .../gpu/src/opencv2/gpu/device/functional.hpp | 2 + modules/gpu/test/test_denoising.cpp | 140 +++++++++ modules/gpu/test/utility.cpp | 8 + modules/gpu/test/utility.hpp | 5 + modules/imgproc/src/smooth.cpp | 2 + 19 files changed, 755 insertions(+), 201 deletions(-) create mode 100644 modules/gpu/perf/perf_denoising.cpp create mode 100644 modules/gpu/src/cuda/nlm.cu create mode 100644 modules/gpu/src/denoising.cpp create mode 100644 modules/gpu/test/test_denoising.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c87d6fbf9..f9baf672e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,7 +197,6 @@ OCV_OPTION(ENABLE_SSE41 "Enable SSE4.1 instructions" OCV_OPTION(ENABLE_SSE42 "Enable SSE4.2 instructions" OFF IF (CMAKE_COMPILER_IS_GNUCXX AND (X86 OR X86_64)) ) OCV_OPTION(ENABLE_NOISY_WARNINGS "Show all warnings even if they are too noisy" OFF ) OCV_OPTION(OPENCV_WARNINGS_ARE_ERRORS "Treat warnings as errors" OFF ) -OCV_OPTION(ENABLE_MULTI_PROCESSOR_COMPILATION "Enabling multi-processory compilation" OFF IF MSVC) # uncategorized options diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index b3d71c8c8..191352745 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -282,9 +282,4 @@ if(MSVC) if(NOT ENABLE_NOISY_WARNINGS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251") #class 'std::XXX' needs to have dll-interface to be used by clients of YYY endif() -endif() - - -if (MSVC AND ENABLE_MULTI_PROCESSOR_COMPILATION) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") -endif() +endif() \ No newline at end of file diff --git a/modules/gpu/doc/image_processing.rst b/modules/gpu/doc/image_processing.rst index 858b707ba..c8fd7491e 100644 --- a/modules/gpu/doc/image_processing.rst +++ b/modules/gpu/doc/image_processing.rst @@ -818,9 +818,57 @@ Performs linear blending of two images. :param result: Destination image. :param stream: Stream for the asynchronous version. + + +gpu::bilateralFilter +------------------- +Performs bilateral filtering of passed image +.. ocv:function:: void gpu::bilateralFilter(const GpuMat& src, GpuMat& dst, int kernel_size, float sigma_color, float sigma_spatial, int borderMode, Stream& stream = Stream::Null()); + + :param src: Source image. Supports only (channles != 2 && depth() != CV_8S && depth() != CV_32S && depth() != CV_64F). + :param dst: Destination imagwe. + :param kernel_size: Kernel window size. + + :param sigma_color: Filter sigma in the color space. + + :param sigma_spatial: Filter sigma in the coordinate space. + + :param borderMode: Border type. See :ocv:func:`borderInterpolate` for details. ``BORDER_REFLECT101`` , ``BORDER_REPLICATE`` , ``BORDER_CONSTANT`` , ``BORDER_REFLECT`` and ``BORDER_WRAP`` are supported for now. + + :param stream: Stream for the asynchronous version. + +.. seealso:: + + :ocv:func:`bilateralFilter`, + + +gpu::nonLocalMeans +------------------- +Performs pure non local means denoising without any simplification, and thus it is not fast. + +.. ocv:function:: void nonLocalMeans(const GpuMat& src, GpuMat& dst, float h, int search_widow_size = 11, int block_size = 7, int borderMode = BORDER_DEFAULT, Stream& s = Stream::Null()); + + :param src: Source image. Supports only CV_8UC1, CV_8UC3. + + :param dst: Destination imagwe. + + :param h: Filter sigma regulating filter strength for color. + + :param search_widow_size: Size of search window. + + :param block_size: Size of block used for computing weights. + + :param borderMode: Border type. See :ocv:func:`borderInterpolate` for details. ``BORDER_REFLECT101`` , ``BORDER_REPLICATE`` , ``BORDER_CONSTANT`` , ``BORDER_REFLECT`` and ``BORDER_WRAP`` are supported for now. + + :param stream: Stream for the asynchronous version. + +.. seealso:: + + :ocv:func:`fastNlMeansDenoising` + gpu::alphaComp ------------------- Composites two images using alpha opacity values contained in each image. diff --git a/modules/gpu/include/opencv2/gpu/gpu.hpp b/modules/gpu/include/opencv2/gpu/gpu.hpp index c2fcc31a2..2faa1751d 100644 --- a/modules/gpu/include/opencv2/gpu/gpu.hpp +++ b/modules/gpu/include/opencv2/gpu/gpu.hpp @@ -769,6 +769,14 @@ CV_EXPORTS void pyrUp(const GpuMat& src, GpuMat& dst, Stream& stream = Stream::N CV_EXPORTS void blendLinear(const GpuMat& img1, const GpuMat& img2, const GpuMat& weights1, const GpuMat& weights2, GpuMat& result, Stream& stream = Stream::Null()); +//! Performa bilateral filtering of passsed image +CV_EXPORTS void bilateralFilter(const GpuMat& src, GpuMat& dst, int kernel_size, float sigma_color, float sigma_spatial, + int borderMode = BORDER_DEFAULT, Stream& stream = Stream::Null()); + +//! Brute force non-local means algorith (slow but universal) +CV_EXPORTS void nonLocalMeans(const GpuMat& src, GpuMat& dst, float h, + int search_widow_size = 11, int block_size = 7, int borderMode = BORDER_DEFAULT, Stream& s = Stream::Null()); + struct CV_EXPORTS CannyBuf; diff --git a/modules/gpu/perf/perf_core.cpp b/modules/gpu/perf/perf_core.cpp index b638fbf4a..915a9a20b 100644 --- a/modules/gpu/perf/perf_core.cpp +++ b/modules/gpu/perf/perf_core.cpp @@ -882,7 +882,7 @@ PERF_TEST_P(Sz_Depth, Core_BitwiseAndMat, Combine(GPU_TYPICAL_MAT_SIZES, Values( ////////////////////////////////////////////////////////////////////// // BitwiseAndScalar -PERF_TEST_P(Sz_Depth_Cn, Core_BitwiseAndScalar, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, Core_BitwiseAndScalar, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), GPU_CHANNELS_1_3_4)) { const cv::Size size = GET_PARAM(0); const int depth = GET_PARAM(1); @@ -963,7 +963,7 @@ PERF_TEST_P(Sz_Depth, Core_BitwiseOrMat, Combine(GPU_TYPICAL_MAT_SIZES, Values(C ////////////////////////////////////////////////////////////////////// // BitwiseOrScalar -PERF_TEST_P(Sz_Depth_Cn, Core_BitwiseOrScalar, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, Core_BitwiseOrScalar, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), GPU_CHANNELS_1_3_4)) { const cv::Size size = GET_PARAM(0); const int depth = GET_PARAM(1); @@ -1044,7 +1044,7 @@ PERF_TEST_P(Sz_Depth, Core_BitwiseXorMat, Combine(GPU_TYPICAL_MAT_SIZES, Values( ////////////////////////////////////////////////////////////////////// // BitwiseXorScalar -PERF_TEST_P(Sz_Depth_Cn, Core_BitwiseXorScalar, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, Core_BitwiseXorScalar, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), GPU_CHANNELS_1_3_4)) { const cv::Size size = GET_PARAM(0); const int depth = GET_PARAM(1); @@ -1085,7 +1085,7 @@ PERF_TEST_P(Sz_Depth_Cn, Core_BitwiseXorScalar, Combine(GPU_TYPICAL_MAT_SIZES, V ////////////////////////////////////////////////////////////////////// // RShift -PERF_TEST_P(Sz_Depth_Cn, Core_RShift, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, Core_RShift, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), GPU_CHANNELS_1_3_4)) { const cv::Size size = GET_PARAM(0); const int depth = GET_PARAM(1); @@ -1119,7 +1119,7 @@ PERF_TEST_P(Sz_Depth_Cn, Core_RShift, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8 ////////////////////////////////////////////////////////////////////// // LShift -PERF_TEST_P(Sz_Depth_Cn, Core_LShift, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, Core_LShift, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32S), GPU_CHANNELS_1_3_4)) { const cv::Size size = GET_PARAM(0); const int depth = GET_PARAM(1); @@ -1461,7 +1461,7 @@ DEF_PARAM_TEST(Sz_Depth_Cn_Code, cv::Size, MatDepth, int, FlipCode); PERF_TEST_P(Sz_Depth_Cn_Code, Core_Flip, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, ALL_FLIP_CODES)) { cv::Size size = GET_PARAM(0); @@ -1973,7 +1973,7 @@ PERF_TEST_P(Sz_Norm, Core_NormDiff, Combine( PERF_TEST_P(Sz_Depth_Cn, Core_Sum, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4))) + GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -2015,7 +2015,7 @@ PERF_TEST_P(Sz_Depth_Cn, Core_Sum, Combine( PERF_TEST_P(Sz_Depth_Cn, Core_SumAbs, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4))) + GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -2052,7 +2052,7 @@ PERF_TEST_P(Sz_Depth_Cn, Core_SumAbs, Combine( PERF_TEST_P(Sz_Depth_Cn, Core_SumSqr, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4))) + GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); diff --git a/modules/gpu/perf/perf_denoising.cpp b/modules/gpu/perf/perf_denoising.cpp new file mode 100644 index 000000000..ee76b5594 --- /dev/null +++ b/modules/gpu/perf/perf_denoising.cpp @@ -0,0 +1,98 @@ +#include "perf_precomp.hpp" + +using namespace std; +using namespace testing; + + +////////////////////////////////////////////////////////////////////// +// BilateralFilter + +DEF_PARAM_TEST(Sz_Depth_Cn_KernelSz, cv::Size, MatDepth , int, int); + +PERF_TEST_P(Sz_Depth_Cn_KernelSz, Denoising_BilateralFilter, + Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), GPU_CHANNELS_1_3_4, Values(3, 5, 9))) +{ + declare.time(30.0); + + cv::Size size = GET_PARAM(0); + int depth = GET_PARAM(1); + int channels = GET_PARAM(2); + int kernel_size = GET_PARAM(3); + + float sigma_color = 7; + float sigma_spatial = 5; + int borderMode = cv::BORDER_REFLECT101; + + int type = CV_MAKE_TYPE(depth, channels); + + cv::Mat src(size, type); + fillRandom(src); + + if (runOnGpu) + { + cv::gpu::GpuMat d_src(src); + cv::gpu::GpuMat d_dst; + + cv::gpu::bilateralFilter(d_src, d_dst, kernel_size, sigma_color, sigma_spatial, borderMode); + + TEST_CYCLE() + { + cv::gpu::bilateralFilter(d_src, d_dst, kernel_size, sigma_color, sigma_spatial, borderMode); + } + } + else + { + cv::Mat dst; + + cv::bilateralFilter(src, dst, kernel_size, sigma_color, sigma_spatial, borderMode); + + TEST_CYCLE() + { + cv::bilateralFilter(src, dst, kernel_size, sigma_color, sigma_spatial, borderMode); + } + } +} + + +////////////////////////////////////////////////////////////////////// +// nonLocalMeans + +DEF_PARAM_TEST(Sz_Depth_Cn_WinSz_BlockSz, cv::Size, MatDepth , int, int, int); + +PERF_TEST_P(Sz_Depth_Cn_WinSz_BlockSz, Denoising_NonLocalMeans, + Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U), Values(1), Values(21), Values(5, 7))) +{ + declare.time(30.0); + + cv::Size size = GET_PARAM(0); + int depth = GET_PARAM(1); + int channels = GET_PARAM(2); + + int search_widow_size = GET_PARAM(3); + int block_size = GET_PARAM(4); + + float h = 10; + int borderMode = cv::BORDER_REFLECT101; + + int type = CV_MAKE_TYPE(depth, channels); + + cv::Mat src(size, type); + fillRandom(src); + + if (runOnGpu) + { + cv::gpu::GpuMat d_src(src); + cv::gpu::GpuMat d_dst; + + cv::gpu::nonLocalMeans(d_src, d_dst, h, search_widow_size, block_size, borderMode); + + TEST_CYCLE() + { + cv::gpu::nonLocalMeans(d_src, d_dst, h, search_widow_size, block_size, borderMode); + } + } + else + { + FAIL(); + } +} \ No newline at end of file diff --git a/modules/gpu/perf/perf_imgproc.cpp b/modules/gpu/perf/perf_imgproc.cpp index 80d4af54d..761510da3 100644 --- a/modules/gpu/perf/perf_imgproc.cpp +++ b/modules/gpu/perf/perf_imgproc.cpp @@ -54,7 +54,7 @@ DEF_PARAM_TEST(Sz_Depth_Cn_Inter_Border_Mode, cv::Size, MatDepth, int, Interpola PERF_TEST_P(Sz_Depth_Cn_Inter_Border_Mode, ImgProc_Remap, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)), ALL_BORDER_MODES, ALL_REMAP_MODES)) @@ -113,7 +113,7 @@ DEF_PARAM_TEST(Sz_Depth_Cn_Inter_Scale, cv::Size, MatDepth, int, Interpolation, PERF_TEST_P(Sz_Depth_Cn_Inter_Scale, ImgProc_Resize, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, ALL_INTERPOLATIONS, Values(0.5, 0.3, 2.0))) { @@ -163,7 +163,7 @@ DEF_PARAM_TEST(Sz_Depth_Cn_Scale, cv::Size, MatDepth, int, double); PERF_TEST_P(Sz_Depth_Cn_Scale, ImgProc_ResizeArea, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, Values(0.2, 0.1, 0.05))) { declare.time(1.0); @@ -212,7 +212,7 @@ DEF_PARAM_TEST(Sz_Depth_Cn_Inter_Border, cv::Size, MatDepth, int, Interpolation, PERF_TEST_P(Sz_Depth_Cn_Inter_Border, ImgProc_WarpAffine, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)), ALL_BORDER_MODES)) { @@ -265,7 +265,7 @@ PERF_TEST_P(Sz_Depth_Cn_Inter_Border, ImgProc_WarpAffine, Combine( PERF_TEST_P(Sz_Depth_Cn_Inter_Border, ImgProc_WarpPerspective, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)), ALL_BORDER_MODES)) { @@ -321,7 +321,7 @@ DEF_PARAM_TEST(Sz_Depth_Cn_Border, cv::Size, MatDepth, int, BorderMode); PERF_TEST_P(Sz_Depth_Cn_Border, ImgProc_CopyMakeBorder, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, ALL_BORDER_MODES)) { cv::Size size = GET_PARAM(0); @@ -789,7 +789,7 @@ PERF_TEST_P(Image, ImgProc_MeanShiftSegmentation, Values("gpu/meanshift/ ////////////////////////////////////////////////////////////////////// // BlendLinear -PERF_TEST_P(Sz_Depth_Cn, ImgProc_BlendLinear, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_32F), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, ImgProc_BlendLinear, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_32F), GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -887,7 +887,7 @@ DEF_PARAM_TEST(Sz_TemplateSz_Cn_Method, cv::Size, cv::Size, int, TemplateMethod) PERF_TEST_P(Sz_TemplateSz_Cn_Method, ImgProc_MatchTemplate8U, Combine( GPU_TYPICAL_MAT_SIZES, Values(cv::Size(5, 5), cv::Size(16, 16), cv::Size(30, 30)), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, ALL_TEMPLATE_METHODS)) { cv::Size size = GET_PARAM(0); @@ -933,7 +933,7 @@ PERF_TEST_P(Sz_TemplateSz_Cn_Method, ImgProc_MatchTemplate8U, Combine( PERF_TEST_P(Sz_TemplateSz_Cn_Method, ImgProc_MatchTemplate32F, Combine( GPU_TYPICAL_MAT_SIZES, Values(cv::Size(5, 5), cv::Size(16, 16), cv::Size(30, 30)), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR)))) { cv::Size size = GET_PARAM(0); @@ -1287,7 +1287,7 @@ DEF_PARAM_TEST(Sz_Depth_Cn_Inter, cv::Size, MatDepth, int, Interpolation); PERF_TEST_P(Sz_Depth_Cn_Inter, ImgProc_Rotate, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4), + GPU_CHANNELS_1_3_4, Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)))) { cv::Size size = GET_PARAM(0); @@ -1324,7 +1324,7 @@ PERF_TEST_P(Sz_Depth_Cn_Inter, ImgProc_Rotate, Combine( PERF_TEST_P(Sz_Depth_Cn, ImgProc_PyrDown, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4))) + GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -1366,7 +1366,7 @@ PERF_TEST_P(Sz_Depth_Cn, ImgProc_PyrDown, Combine( PERF_TEST_P(Sz_Depth_Cn, ImgProc_PyrUp, Combine( GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), - Values(1, 3, 4))) + GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -1540,7 +1540,7 @@ PERF_TEST_P(Sz_Type_Op, ImgProc_AlphaComp, Combine(GPU_TYPICAL_MAT_SIZES, Values ////////////////////////////////////////////////////////////////////// // ImagePyramidBuild -PERF_TEST_P(Sz_Depth_Cn, ImgProc_ImagePyramidBuild, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, ImgProc_ImagePyramidBuild, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -1573,7 +1573,7 @@ PERF_TEST_P(Sz_Depth_Cn, ImgProc_ImagePyramidBuild, Combine(GPU_TYPICAL_MAT_SIZE ////////////////////////////////////////////////////////////////////// // ImagePyramidGetLayer -PERF_TEST_P(Sz_Depth_Cn, ImgProc_ImagePyramidGetLayer, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, ImgProc_ImagePyramidGetLayer, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F), GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); diff --git a/modules/gpu/perf/perf_matop.cpp b/modules/gpu/perf/perf_matop.cpp index cdae962f2..83e27875a 100644 --- a/modules/gpu/perf/perf_matop.cpp +++ b/modules/gpu/perf/perf_matop.cpp @@ -8,7 +8,7 @@ namespace { ////////////////////////////////////////////////////////////////////// // SetTo -PERF_TEST_P(Sz_Depth_Cn, MatOp_SetTo, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F, CV_64F), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, MatOp_SetTo, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F, CV_64F), GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -45,7 +45,7 @@ PERF_TEST_P(Sz_Depth_Cn, MatOp_SetTo, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8 ////////////////////////////////////////////////////////////////////// // SetToMasked -PERF_TEST_P(Sz_Depth_Cn, MatOp_SetToMasked, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F, CV_64F), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, MatOp_SetToMasked, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F, CV_64F), GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); @@ -87,7 +87,7 @@ PERF_TEST_P(Sz_Depth_Cn, MatOp_SetToMasked, Combine(GPU_TYPICAL_MAT_SIZES, Value ////////////////////////////////////////////////////////////////////// // CopyToMasked -PERF_TEST_P(Sz_Depth_Cn, MatOp_CopyToMasked, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F, CV_64F), Values(1, 3, 4))) +PERF_TEST_P(Sz_Depth_Cn, MatOp_CopyToMasked, Combine(GPU_TYPICAL_MAT_SIZES, Values(CV_8U, CV_16U, CV_32F, CV_64F), GPU_CHANNELS_1_3_4)) { cv::Size size = GET_PARAM(0); int depth = GET_PARAM(1); diff --git a/modules/gpu/perf/perf_video.cpp b/modules/gpu/perf/perf_video.cpp index aa802fbf5..7a6403469 100644 --- a/modules/gpu/perf/perf_video.cpp +++ b/modules/gpu/perf/perf_video.cpp @@ -423,7 +423,7 @@ PERF_TEST_P(Video, Video_FGDStatModel, Values("gpu/video/768x576.avi", "gpu/vide DEF_PARAM_TEST(Video_Cn_LearningRate, string, int, double); -PERF_TEST_P(Video_Cn_LearningRate, Video_MOG, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1, 3, 4), Values(0.0, 0.01))) +PERF_TEST_P(Video_Cn_LearningRate, Video_MOG, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), GPU_CHANNELS_1_3_4, Values(0.0, 0.01))) { string inputFile = perf::TestBase::getDataPath(GET_PARAM(0)); int cn = GET_PARAM(1); @@ -511,7 +511,7 @@ PERF_TEST_P(Video_Cn_LearningRate, Video_MOG, Combine(Values("gpu/video/768x576. DEF_PARAM_TEST(Video_Cn, string, int); -PERF_TEST_P(Video_Cn, Video_MOG2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1, 3, 4))) +PERF_TEST_P(Video_Cn, Video_MOG2, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), GPU_CHANNELS_1_3_4)) { string inputFile = perf::TestBase::getDataPath(GET_PARAM(0)); int cn = GET_PARAM(1); @@ -596,7 +596,7 @@ PERF_TEST_P(Video_Cn, Video_MOG2, Combine(Values("gpu/video/768x576.avi", "gpu/v ////////////////////////////////////////////////////// // MOG2GetBackgroundImage -PERF_TEST_P(Video_Cn, Video_MOG2GetBackgroundImage, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1, 3, 4))) +PERF_TEST_P(Video_Cn, Video_MOG2GetBackgroundImage, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), GPU_CHANNELS_1_3_4)) { string inputFile = perf::TestBase::getDataPath(GET_PARAM(0)); int cn = GET_PARAM(1); @@ -676,7 +676,7 @@ PERF_TEST_P(Video_Cn, Video_MOG2GetBackgroundImage, Combine(Values("gpu/video/76 ////////////////////////////////////////////////////// // VIBE -PERF_TEST_P(Video_Cn, Video_VIBE, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1, 3, 4))) +PERF_TEST_P(Video_Cn, Video_VIBE, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), GPU_CHANNELS_1_3_4)) { string inputFile = perf::TestBase::getDataPath(GET_PARAM(0)); int cn = GET_PARAM(1); @@ -739,7 +739,7 @@ PERF_TEST_P(Video_Cn, Video_VIBE, Combine(Values("gpu/video/768x576.avi", "gpu/v DEF_PARAM_TEST(Video_Cn_MaxFeatures, string, int, int); -PERF_TEST_P(Video_Cn_MaxFeatures, Video_GMG, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), Values(1, 3, 4), Values(20, 40, 60))) +PERF_TEST_P(Video_Cn_MaxFeatures, Video_GMG, Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), GPU_CHANNELS_1_3_4, Values(20, 40, 60))) { std::string inputFile = perf::TestBase::getDataPath(GET_PARAM(0)); int cn = GET_PARAM(1); diff --git a/modules/gpu/perf/utility.hpp b/modules/gpu/perf/utility.hpp index 441d32adb..d2e3a070f 100644 --- a/modules/gpu/perf/utility.hpp +++ b/modules/gpu/perf/utility.hpp @@ -41,5 +41,6 @@ DEF_PARAM_TEST(Sz_Depth, cv::Size, MatDepth); DEF_PARAM_TEST(Sz_Depth_Cn, cv::Size, MatDepth, int); #define GPU_TYPICAL_MAT_SIZES testing::Values(perf::sz720p, perf::szSXGA, perf::sz1080p) +#define GPU_CHANNELS_1_3_4 testing::Values(1, 3, 4) #endif // __OPENCV_PERF_GPU_UTILITY_HPP__ diff --git a/modules/gpu/src/cuda/bilateral_filter.cu b/modules/gpu/src/cuda/bilateral_filter.cu index abae91d2c..9e9135e10 100644 --- a/modules/gpu/src/cuda/bilateral_filter.cu +++ b/modules/gpu/src/cuda/bilateral_filter.cu @@ -12,6 +12,7 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 1993-2011, NVIDIA Corporation, all rights reserved. // Third party copyrights are property of their respective owners. // // Redistribution and use in source and binary forms, with or without modification, @@ -28,7 +29,7 @@ // 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 +// any express or bpied warranties, including, but not limited to, the bpied // warranties of merchantability and fitness for a particular purpose are disclaimed. // In no event shall the Intel Corporation or contributors be liable for any direct, // indirect, incidental, special, exemplary, or consequential damages @@ -41,186 +42,155 @@ //M*/ #include "internal_shared.hpp" -#include "opencv2/gpu/device/limits.hpp" + +#include "opencv2/gpu/device/vec_traits.hpp" +#include "opencv2/gpu/device/vec_math.hpp" +#include "opencv2/gpu/device/border_interpolate.hpp" + +using namespace cv::gpu; + +typedef unsigned char uchar; +typedef unsigned short ushort; + +////////////////////////////////////////////////////////////////////////////////// +/// Bilateral filtering namespace cv { namespace gpu { namespace device { - namespace bilateral_filter + namespace imgproc { - __constant__ float* ctable_color; - __constant__ float* ctable_space; - __constant__ size_t ctable_space_step; + __device__ __forceinline__ float norm_l1(const float& a) { return ::fabs(a); } + __device__ __forceinline__ float norm_l1(const float2& a) { return ::fabs(a.x) + ::fabs(a.y); } + __device__ __forceinline__ float norm_l1(const float3& a) { return ::fabs(a.x) + ::fabs(a.y) + ::fabs(a.z); } + __device__ __forceinline__ float norm_l1(const float4& a) { return ::fabs(a.x) + ::fabs(a.y) + ::fabs(a.z) + ::fabs(a.w); } - __constant__ int cndisp; - __constant__ int cradius; + __device__ __forceinline__ float sqr(const float& a) { return a * a; } - __constant__ short cedge_disc; - __constant__ short cmax_disc; - - void load_constants(float* table_color, PtrStepSzf table_space, int ndisp, int radius, short edge_disc, short max_disc) + template + __global__ void bilateral_kernel(const PtrStepSz src, PtrStep dst, const B b, const int ksz, const float sigma_spatial2_inv_half, const float sigma_color2_inv_half) { - cudaSafeCall( cudaMemcpyToSymbol(ctable_color, &table_color, sizeof(table_color)) ); - cudaSafeCall( cudaMemcpyToSymbol(ctable_space, &table_space.data, sizeof(table_space.data)) ); - size_t table_space_step = table_space.step / sizeof(float); - cudaSafeCall( cudaMemcpyToSymbol(ctable_space_step, &table_space_step, sizeof(size_t)) ); + typedef typename TypeVec::cn>::vec_type value_type; + + int x = threadIdx.x + blockIdx.x * blockDim.x; + int y = threadIdx.y + blockIdx.y * blockDim.y; - cudaSafeCall( cudaMemcpyToSymbol(cndisp, &ndisp, sizeof(int)) ); - cudaSafeCall( cudaMemcpyToSymbol(cradius, &radius, sizeof(int)) ); + if (x >= src.cols || y >= src.rows) + return; - cudaSafeCall( cudaMemcpyToSymbol(cedge_disc, &edge_disc, sizeof(short)) ); - cudaSafeCall( cudaMemcpyToSymbol(cmax_disc, &max_disc, sizeof(short)) ); + value_type center = saturate_cast(src(y, x)); + + value_type sum1 = VecTraits::all(0); + float sum2 = 0; + + int r = ksz / 2; + float r2 = (float)(r * r); + + int tx = x - r + ksz; + int ty = y - r + ksz; + + if (x - ksz/2 >=0 && y - ksz/2 >=0 && tx < src.cols && ty < src.rows) + { + for (int cy = y - r; cy < ty; ++cy) + for (int cx = x - r; cx < tx; ++cx) + { + float space2 = (x - cx) * (x - cx) + (y - cy) * (y - cy); + if (space2 > r2) + continue; + + value_type value = saturate_cast(src(cy, cx)); + + float weight = ::exp(space2 * sigma_spatial2_inv_half + sqr(norm_l1(value - center)) * sigma_color2_inv_half); + sum1 = sum1 + weight * value; + sum2 = sum2 + weight; + } + } + else + { + for (int cy = y - r; cy < ty; ++cy) + for (int cx = x - r; cx < tx; ++cx) + { + float space2 = (x - cx) * (x - cx) + (y - cy) * (y - cy); + if (space2 > r2) + continue; + + value_type value = saturate_cast(b.at(cy, cx, src.data, src.step)); + + float weight = ::exp(space2 * sigma_spatial2_inv_half + sqr(norm_l1(value - center)) * sigma_color2_inv_half); + + sum1 = sum1 + weight * value; + sum2 = sum2 + weight; + } + } + dst(y, x) = saturate_cast(sum1 / sum2); } - template - struct DistRgbMax + template class B> + void bilateral_caller(const PtrStepSzb& src, PtrStepSzb dst, int kernel_size, float sigma_spatial, float sigma_color, cudaStream_t stream) { - static __device__ __forceinline__ uchar calc(const uchar* a, const uchar* b) - { - uchar x = ::abs(a[0] - b[0]); - uchar y = ::abs(a[1] - b[1]); - uchar z = ::abs(a[2] - b[2]); - return (::max(::max(x, y), z)); - } - }; + dim3 block (32, 8); + dim3 grid (divUp (src.cols, block.x), divUp (src.rows, block.y)); - template <> - struct DistRgbMax<1> - { - static __device__ __forceinline__ uchar calc(const uchar* a, const uchar* b) - { - return ::abs(a[0] - b[0]); - } - }; + B b(src.rows, src.cols); - template - __global__ void bilateral_filter(int t, T* disp, size_t disp_step, const uchar* img, size_t img_step, int h, int w) - { - const int y = blockIdx.y * blockDim.y + threadIdx.y; - const int x = ((blockIdx.x * blockDim.x + threadIdx.x) << 1) + ((y + t) & 1); + float sigma_spatial2_inv_half = -0.5f/(sigma_spatial * sigma_spatial); + float sigma_color2_inv_half = -0.5f/(sigma_color * sigma_color); - T dp[5]; - - if (y > 0 && y < h - 1 && x > 0 && x < w - 1) - { - dp[0] = *(disp + (y ) * disp_step + x + 0); - dp[1] = *(disp + (y-1) * disp_step + x + 0); - dp[2] = *(disp + (y ) * disp_step + x - 1); - dp[3] = *(disp + (y+1) * disp_step + x + 0); - dp[4] = *(disp + (y ) * disp_step + x + 1); - - if(::abs(dp[1] - dp[0]) >= cedge_disc || ::abs(dp[2] - dp[0]) >= cedge_disc || ::abs(dp[3] - dp[0]) >= cedge_disc || ::abs(dp[4] - dp[0]) >= cedge_disc) - { - const int ymin = ::max(0, y - cradius); - const int xmin = ::max(0, x - cradius); - const int ymax = ::min(h - 1, y + cradius); - const int xmax = ::min(w - 1, x + cradius); - - float cost[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; - - const uchar* ic = img + y * img_step + channels * x; - - for(int yi = ymin; yi <= ymax; yi++) - { - const T* disp_y = disp + yi * disp_step; - - for(int xi = xmin; xi <= xmax; xi++) - { - const uchar* in = img + yi * img_step + channels * xi; - - uchar dist_rgb = DistRgbMax::calc(in, ic); - - const float weight = ctable_color[dist_rgb] * (ctable_space + ::abs(y-yi)* ctable_space_step)[::abs(x-xi)]; - - const T disp_reg = disp_y[xi]; - - cost[0] += ::min(cmax_disc, ::abs(disp_reg - dp[0])) * weight; - cost[1] += ::min(cmax_disc, ::abs(disp_reg - dp[1])) * weight; - cost[2] += ::min(cmax_disc, ::abs(disp_reg - dp[2])) * weight; - cost[3] += ::min(cmax_disc, ::abs(disp_reg - dp[3])) * weight; - cost[4] += ::min(cmax_disc, ::abs(disp_reg - dp[4])) * weight; - } - } - - float minimum = numeric_limits::max(); - int id = 0; - - if (cost[0] < minimum) - { - minimum = cost[0]; - id = 0; - } - if (cost[1] < minimum) - { - minimum = cost[1]; - id = 1; - } - if (cost[2] < minimum) - { - minimum = cost[2]; - id = 2; - } - if (cost[3] < minimum) - { - minimum = cost[3]; - id = 3; - } - if (cost[4] < minimum) - { - minimum = cost[4]; - id = 4; - } - - *(disp + y * disp_step + x) = dp[id]; - } - } - } - - template - void bilateral_filter_caller(PtrStepSz disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream) - { - dim3 threads(32, 8, 1); - dim3 grid(1, 1, 1); - grid.x = divUp(disp.cols, threads.x << 1); - grid.y = divUp(disp.rows, threads.y); - - switch (channels) - { - case 1: - for (int i = 0; i < iters; ++i) - { - bilateral_filter<1><<>>(0, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); - cudaSafeCall( cudaGetLastError() ); - - bilateral_filter<1><<>>(1, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); - cudaSafeCall( cudaGetLastError() ); - } - break; - case 3: - for (int i = 0; i < iters; ++i) - { - bilateral_filter<3><<>>(0, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); - cudaSafeCall( cudaGetLastError() ); - - bilateral_filter<3><<>>(1, disp.data, disp.step/sizeof(T), img.data, img.step, disp.rows, disp.cols); - cudaSafeCall( cudaGetLastError() ); - } - break; - default: - cv::gpu::error("Unsupported channels count", __FILE__, __LINE__, "bilateral_filter_caller"); - } + cudaSafeCall( cudaFuncSetCacheConfig (bilateral_kernel >, cudaFuncCachePreferL1) ); + bilateral_kernel<<>>((PtrStepSz)src, (PtrStepSz)dst, b, kernel_size, sigma_spatial2_inv_half, sigma_color2_inv_half); + cudaSafeCall ( cudaGetLastError () ); if (stream == 0) cudaSafeCall( cudaDeviceSynchronize() ); } - void bilateral_filter_gpu(PtrStepSzb disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream) + template + void bilateral_filter_gpu(const PtrStepSzb& src, PtrStepSzb dst, int kernel_size, float gauss_spatial_coeff, float gauss_color_coeff, int borderMode, cudaStream_t stream) { - bilateral_filter_caller(disp, img, channels, iters, stream); - } + typedef void (*caller_t)(const PtrStepSzb& src, PtrStepSzb dst, int kernel_size, float sigma_spatial, float sigma_color, cudaStream_t stream); - void bilateral_filter_gpu(PtrStepSz disp, PtrStepSzb img, int channels, int iters, cudaStream_t stream) - { - bilateral_filter_caller(disp, img, channels, iters, stream); + static caller_t funcs[] = + { + bilateral_caller, + bilateral_caller, + bilateral_caller, + bilateral_caller, + bilateral_caller, + }; + funcs[borderMode](src, dst, kernel_size, gauss_spatial_coeff, gauss_color_coeff, stream); } - } // namespace bilateral_filter -}}} // namespace cv { namespace gpu { namespace device + } +}}} + + +#define OCV_INSTANTIATE_BILATERAL_FILTER(T) \ + template void cv::gpu::device::imgproc::bilateral_filter_gpu(const PtrStepSzb&, PtrStepSzb, int, float, float, int, cudaStream_t); + +OCV_INSTANTIATE_BILATERAL_FILTER(uchar) +//OCV_INSTANTIATE_BILATERAL_FILTER(uchar2) +OCV_INSTANTIATE_BILATERAL_FILTER(uchar3) +OCV_INSTANTIATE_BILATERAL_FILTER(uchar4) + +//OCV_INSTANTIATE_BILATERAL_FILTER(schar) +//OCV_INSTANTIATE_BILATERAL_FILTER(schar2) +//OCV_INSTANTIATE_BILATERAL_FILTER(schar3) +//OCV_INSTANTIATE_BILATERAL_FILTER(schar4) + +OCV_INSTANTIATE_BILATERAL_FILTER(short) +//OCV_INSTANTIATE_BILATERAL_FILTER(short2) +OCV_INSTANTIATE_BILATERAL_FILTER(short3) +OCV_INSTANTIATE_BILATERAL_FILTER(short4) + +OCV_INSTANTIATE_BILATERAL_FILTER(ushort) +//OCV_INSTANTIATE_BILATERAL_FILTER(ushort2) +OCV_INSTANTIATE_BILATERAL_FILTER(ushort3) +OCV_INSTANTIATE_BILATERAL_FILTER(ushort4) + +//OCV_INSTANTIATE_BILATERAL_FILTER(int) +//OCV_INSTANTIATE_BILATERAL_FILTER(int2) +//OCV_INSTANTIATE_BILATERAL_FILTER(int3) +//OCV_INSTANTIATE_BILATERAL_FILTER(int4) + +OCV_INSTANTIATE_BILATERAL_FILTER(float) +//OCV_INSTANTIATE_BILATERAL_FILTER(float2) +OCV_INSTANTIATE_BILATERAL_FILTER(float3) +OCV_INSTANTIATE_BILATERAL_FILTER(float4) diff --git a/modules/gpu/src/cuda/nlm.cu b/modules/gpu/src/cuda/nlm.cu new file mode 100644 index 000000000..1acbe7fe7 --- /dev/null +++ b/modules/gpu/src/cuda/nlm.cu @@ -0,0 +1,143 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Copyright (C) 1993-2011, NVIDIA Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 bpied warranties, including, but not limited to, the bpied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation 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. +// +//M*/ + +#include "internal_shared.hpp" + +#include "opencv2/gpu/device/vec_traits.hpp" +#include "opencv2/gpu/device/vec_math.hpp" +#include "opencv2/gpu/device/border_interpolate.hpp" + +using namespace cv::gpu; + +typedef unsigned char uchar; +typedef unsigned short ushort; + +////////////////////////////////////////////////////////////////////////////////// +/// Non local means denosings + +namespace cv { namespace gpu { namespace device +{ + namespace imgproc + { + __device__ __forceinline__ float norm2(const float& v) { return v*v; } + __device__ __forceinline__ float norm2(const float2& v) { return v.x*v.x + v.y*v.y; } + __device__ __forceinline__ float norm2(const float3& v) { return v.x*v.x + v.y*v.y + v.z*v.z; } + __device__ __forceinline__ float norm2(const float4& v) { return v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; } + + template + __global__ void nlm_kernel(const PtrStepSz src, PtrStep dst, const B b, int search_radius, int block_radius, float h2_inv_half) + { + typedef typename TypeVec::cn>::vec_type value_type; + + const int x = blockDim.x * blockIdx.x + threadIdx.x; + const int y = blockDim.y * blockIdx.y + threadIdx.y; + + if (x >= src.cols || y >= src.rows) + return; + + float block_radius2_inv = -1.f/(block_radius * block_radius); + + value_type sum1 = VecTraits::all(0); + float sum2 = 0.f; + + for(float cy = -search_radius; cy <= search_radius; ++cy) + for(float cx = -search_radius; cx <= search_radius; ++cx) + { + float color2 = 0; + for(float by = -block_radius; by <= block_radius; ++by) + for(float bx = -block_radius; bx <= block_radius; ++bx) + { + value_type v1 = saturate_cast(src(y + by, x + bx)); + value_type v2 = saturate_cast(src(y + cy + by, x + cx + bx)); + color2 += norm2(v1 - v2); + } + + float dist2 = cx * cx + cy * cy; + float w = __expf(color2 * h2_inv_half + dist2 * block_radius2_inv); + + sum1 = sum1 + saturate_cast(src(y + cy, x + cy)) * w; + sum2 += w; + } + + dst(y, x) = saturate_cast(sum1 / sum2); + + } + + template class B> + void nlm_caller(const PtrStepSzb src, PtrStepSzb dst, int search_radius, int block_radius, float h, cudaStream_t stream) + { + dim3 block (32, 8); + dim3 grid (divUp (src.cols, block.x), divUp (src.rows, block.y)); + + B b(src.rows, src.cols); + + float h2_inv_half = -0.5f/(h * h * VecTraits::cn); + + cudaSafeCall( cudaFuncSetCacheConfig (nlm_kernel >, cudaFuncCachePreferL1) ); + nlm_kernel<<>>((PtrStepSz)src, (PtrStepSz)dst, b, search_radius, block_radius, h2_inv_half); + cudaSafeCall ( cudaGetLastError () ); + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } + + template + void nlm_bruteforce_gpu(const PtrStepSzb& src, PtrStepSzb dst, int search_radius, int block_radius, float h, int borderMode, cudaStream_t stream) + { + typedef void (*func_t)(const PtrStepSzb src, PtrStepSzb dst, int search_radius, int block_radius, float h, cudaStream_t stream); + + static func_t funcs[] = + { + nlm_caller, + nlm_caller, + nlm_caller, + nlm_caller, + nlm_caller, + }; + funcs[borderMode](src, dst, search_radius, block_radius, h, stream); + } + + template void nlm_bruteforce_gpu(const PtrStepSzb&, PtrStepSzb, int, int, float, int, cudaStream_t); + template void nlm_bruteforce_gpu(const PtrStepSzb&, PtrStepSzb, int, int, float, int, cudaStream_t); + } +}}} diff --git a/modules/gpu/src/denoising.cpp b/modules/gpu/src/denoising.cpp new file mode 100644 index 000000000..f7dd2fbfa --- /dev/null +++ b/modules/gpu/src/denoising.cpp @@ -0,0 +1,135 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other GpuMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 bpied warranties, including, but not limited to, the bpied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" + +using namespace cv; +using namespace cv::gpu; + +#if !defined (HAVE_CUDA) + +cv::gpu::bilateralFilter(const GpuMat&, GpuMat&, int, float, float, int, Stream&) { throw_nogpu(); } + +#else + + +namespace cv { namespace gpu { namespace device +{ + namespace imgproc + { + template + void bilateral_filter_gpu(const PtrStepSzb& src, PtrStepSzb dst, int kernel_size, float sigma_spatial, float sigma_color, int borderMode, cudaStream_t stream); + + template + void nlm_bruteforce_gpu(const PtrStepSzb& src, PtrStepSzb dst, int search_radius, int block_radius, float h, int borderMode, cudaStream_t stream); + } +}}} + +void cv::gpu::bilateralFilter(const GpuMat& src, GpuMat& dst, int kernel_size, float sigma_color, float sigma_spatial, int borderMode, Stream& s) +{ + using cv::gpu::device::imgproc::bilateral_filter_gpu; + + typedef void (*func_t)(const PtrStepSzb& src, PtrStepSzb dst, int kernel_size, float sigma_spatial, float sigma_color, int borderMode, cudaStream_t s); + + static const func_t funcs[6][4] = + { + {bilateral_filter_gpu , 0 /*bilateral_filter_gpu*/ , bilateral_filter_gpu , bilateral_filter_gpu }, + {0 /*bilateral_filter_gpu*/, 0 /*bilateral_filter_gpu*/ , 0 /*bilateral_filter_gpu*/, 0 /*bilateral_filter_gpu*/}, + {bilateral_filter_gpu , 0 /*bilateral_filter_gpu*/, bilateral_filter_gpu , bilateral_filter_gpu }, + {bilateral_filter_gpu , 0 /*bilateral_filter_gpu*/ , bilateral_filter_gpu , bilateral_filter_gpu }, + {0 /*bilateral_filter_gpu*/ , 0 /*bilateral_filter_gpu*/ , 0 /*bilateral_filter_gpu*/ , 0 /*bilateral_filter_gpu*/ }, + {bilateral_filter_gpu , 0 /*bilateral_filter_gpu*/ , bilateral_filter_gpu , bilateral_filter_gpu } + }; + + sigma_color = (sigma_color <= 0 ) ? 1 : sigma_color; + sigma_spatial = (sigma_spatial <= 0 ) ? 1 : sigma_spatial; + + + int radius = (kernel_size <= 0) ? cvRound(sigma_spatial*1.5) : kernel_size/2; + kernel_size = std::max(radius, 1)*2 + 1; + + CV_Assert(src.depth() <= CV_32F && src.channels() <= 4); + const func_t func = funcs[src.depth()][src.channels() - 1]; + CV_Assert(func != 0); + + CV_Assert(borderMode == BORDER_REFLECT101 || borderMode == BORDER_REPLICATE || borderMode == BORDER_CONSTANT || borderMode == BORDER_REFLECT || borderMode == BORDER_WRAP); + + int gpuBorderType; + CV_Assert(tryConvertToGpuBorderType(borderMode, gpuBorderType)); + + dst.create(src.size(), src.type()); + func(src, dst, kernel_size, sigma_spatial, sigma_color, gpuBorderType, StreamAccessor::getStream(s)); +} + +void cv::gpu::nonLocalMeans(const GpuMat& src, GpuMat& dst, float h, int search_window_size, int block_size, int borderMode, Stream& s) +{ + using cv::gpu::device::imgproc::nlm_bruteforce_gpu; + typedef void (*func_t)(const PtrStepSzb& src, PtrStepSzb dst, int search_radius, int block_radius, float h, int borderMode, cudaStream_t stream); + + static const func_t funcs[4] = { nlm_bruteforce_gpu, 0 /*nlm_bruteforce_gpu*/ , nlm_bruteforce_gpu, 0/*nlm_bruteforce_gpu,*/ }; + + CV_Assert(src.type() == CV_8U || src.type() == CV_8UC3); + + const func_t func = funcs[src.channels() - 1]; + CV_Assert(func != 0); + + int b = borderMode; + CV_Assert(b == BORDER_REFLECT101 || b == BORDER_REPLICATE || b == BORDER_CONSTANT || b == BORDER_REFLECT || b == BORDER_WRAP); + + int gpuBorderType; + CV_Assert(tryConvertToGpuBorderType(borderMode, gpuBorderType)); + + int search_radius = search_window_size/2; + int block_radius = block_size/2; + + dst.create(src.size(), src.type()); + func(src, dst, search_radius, block_radius, h, gpuBorderType, StreamAccessor::getStream(s)); +} + + + + + + + + +#endif \ No newline at end of file diff --git a/modules/gpu/src/hough.cpp b/modules/gpu/src/hough.cpp index fd5305700..399de3684 100644 --- a/modules/gpu/src/hough.cpp +++ b/modules/gpu/src/hough.cpp @@ -239,8 +239,8 @@ void cv::gpu::HoughCircles(const GpuMat& src, GpuMat& circles, HoughCirclesBuf& for(size_t j = 0; j < m.size(); ++j) { - float dx = p.x - m[j].x; - float dy = p.y - m[j].y; + float dx = (float)(p.x - m[j].x); + float dy = (float)(p.y - m[j].y); if (dx * dx + dy * dy < minDist) { diff --git a/modules/gpu/src/opencv2/gpu/device/functional.hpp b/modules/gpu/src/opencv2/gpu/device/functional.hpp index 1b836c7a5..96e96bded 100644 --- a/modules/gpu/src/opencv2/gpu/device/functional.hpp +++ b/modules/gpu/src/opencv2/gpu/device/functional.hpp @@ -47,6 +47,7 @@ #include "saturate_cast.hpp" #include "vec_traits.hpp" #include "type_traits.hpp" +#include "device_functions.h" namespace cv { namespace gpu { namespace device { @@ -408,6 +409,7 @@ namespace cv { namespace gpu { namespace device OPENCV_GPU_IMPLEMENT_BIN_FUNCTOR(pow, ::pow) #undef OPENCV_GPU_IMPLEMENT_UN_FUNCTOR + #undef OPENCV_GPU_IMPLEMENT_UN_FUNCTOR_NO_DOUBLE #undef OPENCV_GPU_IMPLEMENT_BIN_FUNCTOR template struct hypot_sqr_func : binary_function diff --git a/modules/gpu/test/test_denoising.cpp b/modules/gpu/test/test_denoising.cpp new file mode 100644 index 000000000..0f6cd69c5 --- /dev/null +++ b/modules/gpu/test/test_denoising.cpp @@ -0,0 +1,140 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of Intel Corporation may not 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 Intel Corporation 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. +// +//M*/ + +#include "test_precomp.hpp" + +#ifdef HAVE_CUDA + +//////////////////////////////////////////////////////// +// BilateralFilter + +PARAM_TEST_CASE(BilateralFilter, cv::gpu::DeviceInfo, cv::Size, MatType) +{ + cv::gpu::DeviceInfo devInfo; + cv::Size size; + int type; + int kernel_size; + float sigma_color; + float sigma_spatial; + + virtual void SetUp() + { + devInfo = GET_PARAM(0); + size = GET_PARAM(1); + type = GET_PARAM(2); + + kernel_size = 5; + sigma_color = 10.f; + sigma_spatial = 3.5f; + + cv::gpu::setDevice(devInfo.deviceID()); + } +}; + +TEST_P(BilateralFilter, Accuracy) +{ + cv::Mat src = randomMat(size, type); + //cv::Mat src = readImage("hog/road.png", cv::IMREAD_GRAYSCALE); + //cv::Mat src = readImage("csstereobp/aloe-R.png", cv::IMREAD_GRAYSCALE); + + src.convertTo(src, type); + cv::gpu::GpuMat dst; + + cv::gpu::bilateralFilter(loadMat(src), dst, kernel_size, sigma_color, sigma_spatial); + + cv::Mat dst_gold; + cv::bilateralFilter(src, dst_gold, kernel_size, sigma_color, sigma_spatial); + + EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-3 : 1.0); +} + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, BilateralFilter, testing::Combine( + ALL_DEVICES, + testing::Values(cv::Size(128, 128), cv::Size(113, 113), cv::Size(639, 481)), + testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_32FC1), MatType(CV_32FC3)) + )); + + +//////////////////////////////////////////////////////// +// Brute Force Non local means + +struct NonLocalMeans: testing::TestWithParam +{ + cv::gpu::DeviceInfo devInfo; + + virtual void SetUp() + { + devInfo = GetParam(); + cv::gpu::setDevice(devInfo.deviceID()); + } +}; + +TEST_P(NonLocalMeans, Regression) +{ + using cv::gpu::GpuMat; + + cv::Mat bgr = readImage("denoising/lena_noised_gaussian_sigma=20_multi_0.png", cv::IMREAD_COLOR); + ASSERT_FALSE(bgr.empty()); + + cv::Mat gray; + cv::cvtColor(bgr, gray, CV_BGR2GRAY); + + GpuMat dbgr, dgray; + cv::gpu::nonLocalMeans(GpuMat(bgr), dbgr, 10); + cv::gpu::nonLocalMeans(GpuMat(gray), dgray, 10); + +#if 0 + dumpImage("denoising/denoised_lena_bgr.png", cv::Mat(dbgr)); + dumpImage("denoising/denoised_lena_gray.png", cv::Mat(dgray)); +#endif + + cv::Mat bgr_gold = readImage("denoising/denoised_lena_bgr.png", cv::IMREAD_COLOR); + cv::Mat gray_gold = readImage("denoising/denoised_lena_gray.png", cv::IMREAD_GRAYSCALE); + ASSERT_FALSE(bgr_gold.empty() || gray_gold.empty()); + + EXPECT_MAT_NEAR(bgr_gold, dbgr, 1e-4); + EXPECT_MAT_NEAR(gray_gold, dgray, 1e-4); +} + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, NonLocalMeans, ALL_DEVICES); + + +#endif // HAVE_CUDA \ No newline at end of file diff --git a/modules/gpu/test/utility.cpp b/modules/gpu/test/utility.cpp index cf3b0fc8c..a92d2c52f 100644 --- a/modules/gpu/test/utility.cpp +++ b/modules/gpu/test/utility.cpp @@ -127,6 +127,14 @@ Mat readImageType(const std::string& fname, int type) return src; } +////////////////////////////////////////////////////////////////////// +// Image dumping + +void dumpImage(const std::string& fileName, const cv::Mat& image) +{ + cv::imwrite(TS::ptr()->get_data_path() + fileName, image); +} + ////////////////////////////////////////////////////////////////////// // Gpu devices diff --git a/modules/gpu/test/utility.hpp b/modules/gpu/test/utility.hpp index f509b786a..1d153fcf0 100644 --- a/modules/gpu/test/utility.hpp +++ b/modules/gpu/test/utility.hpp @@ -74,6 +74,11 @@ cv::Mat readImage(const std::string& fileName, int flags = cv::IMREAD_COLOR); //! read image from testdata folder and convert it to specified type cv::Mat readImageType(const std::string& fname, int type); +////////////////////////////////////////////////////////////////////// +// Image dumping + +void dumpImage(const std::string& fileName, const cv::Mat& image); + ////////////////////////////////////////////////////////////////////// // Gpu devices diff --git a/modules/imgproc/src/smooth.cpp b/modules/imgproc/src/smooth.cpp index 8ec6f6d79..13340511f 100644 --- a/modules/imgproc/src/smooth.cpp +++ b/modules/imgproc/src/smooth.cpp @@ -1285,6 +1285,8 @@ void cv::medianBlur( InputArray _src0, OutputArray _dst, int ksize ) Bilateral Filtering \****************************************************************************************/ +#undef CV_SSE3 + namespace cv { From 424bc609b6f352a2b10f2a01ffcd037483e3591f Mon Sep 17 00:00:00 2001 From: noob Date: Wed, 29 Aug 2012 17:44:21 +0200 Subject: [PATCH 024/103] Retina module is now parallelized thanks to the TBB library. Speed increase expected on multicore plateforms --- modules/contrib/src/basicretinafilter.cpp | 120 ++++++---- modules/contrib/src/basicretinafilter.hpp | 277 +++++++++++++++++++--- modules/contrib/src/magnoretinafilter.cpp | 4 + modules/contrib/src/magnoretinafilter.hpp | 46 +++- modules/contrib/src/parvoretinafilter.cpp | 18 +- modules/contrib/src/parvoretinafilter.hpp | 39 +++ modules/contrib/src/retinacolor.cpp | 96 +++----- modules/contrib/src/retinacolor.hpp | 82 ++++++- modules/contrib/src/templatebuffer.hpp | 64 +++-- 9 files changed, 577 insertions(+), 169 deletions(-) diff --git a/modules/contrib/src/basicretinafilter.cpp b/modules/contrib/src/basicretinafilter.cpp index 06320f811..a4270aa74 100644 --- a/modules/contrib/src/basicretinafilter.cpp +++ b/modules/contrib/src/basicretinafilter.cpp @@ -316,28 +316,50 @@ void BasicRetinaFilter::runFilter_LocalAdapdation_autonomous(const std::valarray _spatiotemporalLPfilter(get_data(inputFrame), &_filterOutput[0]); _localLuminanceAdaptation(get_data(inputFrame), &_filterOutput[0], &outputFrame[0]); } -// local luminance adaptation of the input in regard of localLuminance buffer -void BasicRetinaFilter::_localLuminanceAdaptation(const float *inputFrame, const float *localLuminance, float *outputFrame) -{ - float meanLuminance=0; - const float *luminancePTR=inputFrame; - for (unsigned int i=0;i<_filterOutput.getNBpixels();++i) - meanLuminance+=*(luminancePTR++); - meanLuminance/=_filterOutput.getNBpixels(); - //float tempMeanValue=meanLuminance+_meanInputValue*_tau; - updateCompressionParameter(meanLuminance); +// local luminance adaptation of the input in regard of localLuminance buffer, the input is rewrited and becomes the output +void BasicRetinaFilter::_localLuminanceAdaptation(float *inputOutputFrame, const float *localLuminance) +{ + _localLuminanceAdaptation(inputOutputFrame, localLuminance, inputOutputFrame, false); + + /* const float *localLuminancePTR=localLuminance; + float *inputOutputFramePTR=inputOutputFrame; + + for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel, ++inputOutputFramePTR) + { + float X0=*(localLuminancePTR++)*_localLuminanceFactor+_localLuminanceAddon; + *(inputOutputFramePTR) = (_maxInputValue+X0)**inputOutputFramePTR/(*inputOutputFramePTR +X0+0.00000000001); + } + */ +} + +// local luminance adaptation of the input in regard of localLuminance buffer +void BasicRetinaFilter::_localLuminanceAdaptation(const float *inputFrame, const float *localLuminance, float *outputFrame, const bool updateLuminanceMean) +{ + if (updateLuminanceMean) + { float meanLuminance=0; + const float *luminancePTR=inputFrame; + for (unsigned int i=0;i<_filterOutput.getNBpixels();++i) + meanLuminance+=*(luminancePTR++); + meanLuminance/=_filterOutput.getNBpixels(); + //float tempMeanValue=meanLuminance+_meanInputValue*_tau; + updateCompressionParameter(meanLuminance); + } +#ifdef HAVE_TBB + tbb::parallel_for(tbb::blocked_range(0,_filterOutput.getNBpixels()), Parallel_localAdaptation(localLuminance, inputFrame, outputFrame, _localLuminanceFactor, _localLuminanceAddon, _maxInputValue), tbb::auto_partitioner()); +#else //std::cout<(IDrowStart,IDrowEnd), Parallel_horizontalCausalFilter_addInput(inputFrame, outputFrame, IDrowStart, _filterOutput.getNBcolumns(), _a, _tau), tbb::auto_partitioner()); +#else for (unsigned int IDrow=IDrowStart; IDrow(IDrowStart,IDrowEnd), Parallel_horizontalAnticausalFilter(outputFrame, IDrowEnd, _filterOutput.getNBcolumns(), _a ), tbb::auto_partitioner()); +#else for (unsigned int IDrow=IDrowStart; IDrow(IDcolumnStart,IDcolumnEnd), Parallel_verticalCausalFilter(outputFrame, _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _a ), tbb::auto_partitioner()); +#else + for (unsigned int IDcolumn=IDcolumnStart; IDcolumn(IDcolumnStart,IDcolumnEnd), Parallel_verticalAnticausalFilter_multGain(outputFrame, _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _a, _gain ), tbb::auto_partitioner()); +#else + float* offset=outputFrame+_filterOutput.getNBpixels()-_filterOutput.getNBcolumns(); //#pragma omp parallel for for (unsigned int IDcolumn=IDcolumnStart; IDcolumn(IDrowStart,IDrowEnd), Parallel_horizontalAnticausalFilter_Irregular(outputFrame, spatialConstantBuffer, IDrowEnd, _filterOutput.getNBcolumns()), tbb::auto_partitioner()); +#else register float* outputPTR=outputFrame+IDrowEnd*(_filterOutput.getNBcolumns())-1; - register const float* spatialConstantPTR=&_progressiveSpatialConstant[0]+IDrowEnd*(_filterOutput.getNBcolumns())-1; + register const float* spatialConstantPTR=spatialConstantBuffer+IDrowEnd*(_filterOutput.getNBcolumns())-1; for (unsigned int IDrow=IDrowStart; IDrow(IDcolumnStart,IDcolumnEnd), Parallel_verticalCausalFilter_Irregular(outputFrame, spatialConstantBuffer, _filterOutput.getNBrows(), _filterOutput.getNBcolumns()), tbb::auto_partitioner()); +#else for (unsigned int IDcolumn=IDcolumnStart; IDcolumn main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary +** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised +** ==> functors constructors can differ from the parameters used with their related serial functions +*/ + +#define _DEBUG_TBB // define DEBUG_TBB in order to display additionnal data on stdout + class Parallel_horizontalAnticausalFilter + { + private: + float *outputFrame; + const unsigned int IDrowEnd, nbColumns; + const float filterParam_a; + public: + // constructor which takes the input image pointer reference reference and limits + Parallel_horizontalAnticausalFilter(float *bufferToProcess, const unsigned int idEnd, const unsigned int nbCols, const float a ) + :outputFrame(bufferToProcess), IDrowEnd(idEnd), nbColumns(nbCols), filterParam_a(a) + { +#ifdef DEBUG_TBB + std::cout<<"Parallel_horizontalAnticausalFilter::Parallel_horizontalAnticausalFilter :" + <<"\n\t idEnd="<& r ) const { + + for (size_t IDrow=r.begin(); IDrow!=r.end(); ++IDrow) + { + register float* outputPTR=outputFrame+(IDrowEnd-IDrow)*(nbColumns)-1; + register const float* spatialConstantPTR=spatialConstantBuffer+(IDrowEnd-IDrow)*(nbColumns)-1; + register float result=0; + for (unsigned int index=0; index& r ) const { + for (unsigned int IDcolumn=r.begin(); IDcolumn!=r.end(); ++IDcolumn) + { + register float result=0; + register float *outputPTR=outputFrame+IDcolumn; + register const float* spatialConstantPTR=spatialConstantBuffer+IDcolumn; + for (unsigned int index=0; index(0,_filterOutput.getNBpixels()), Parallel_amacrineCellsComputing(OPL_ON, OPL_OFF, &_previousInput_ON[0], &_previousInput_OFF[0], &_amacrinCellsTempOutput_ON[0], &_amacrinCellsTempOutput_OFF[0], _temporalCoefficient), tbb::auto_partitioner()); +#else register const float *OPL_ON_PTR=OPL_ON; register const float *OPL_OFF_PTR=OPL_OFF; register float *previousInput_ON_PTR= &_previousInput_ON[0]; @@ -175,6 +178,7 @@ void MagnoRetinaFilter::_amacrineCellsComputing(const float *OPL_ON, const float *(previousInput_OFF_PTR++)=*(OPL_OFF_PTR++); } +#endif } // launch filter that runs all the IPL filter diff --git a/modules/contrib/src/magnoretinafilter.hpp b/modules/contrib/src/magnoretinafilter.hpp index b5c9015ac..daefb7448 100644 --- a/modules/contrib/src/magnoretinafilter.hpp +++ b/modules/contrib/src/magnoretinafilter.hpp @@ -190,10 +190,52 @@ private: // varialbles float _temporalCoefficient; - // amacrine cells filter : high pass temporal filter - void _amacrineCellsComputing(const float *ONinput, const float *OFFinput); + // amacrine cells filter : high pass temporal filter + void _amacrineCellsComputing(const float *ONinput, const float *OFFinput); +#ifdef HAVE_TBB +/****************************************************** +** IF TBB is useable, then, main loops are parallelized using these functors +** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary +** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised +** ==> functors constructors can differ from the parameters used with their related serial functions +*/ + class Parallel_amacrineCellsComputing + { + private: + const float *OPL_ON, *OPL_OFF; + float *previousInput_ON, *previousInput_OFF, *amacrinCellsTempOutput_ON, *amacrinCellsTempOutput_OFF; + const float temporalCoefficient; + public: + Parallel_amacrineCellsComputing(const float *OPL_ON_PTR, const float *OPL_OFF_PTR, float *previousInput_ON_PTR, float *previousInput_OFF_PTR, float *amacrinCellsTempOutput_ON_PTR, float *amacrinCellsTempOutput_OFF_PTR, float temporalCoefficientVal) + :OPL_ON(OPL_ON_PTR), OPL_OFF(OPL_OFF_PTR), previousInput_ON(previousInput_ON_PTR), previousInput_OFF(previousInput_OFF_PTR), amacrinCellsTempOutput_ON(amacrinCellsTempOutput_ON_PTR), amacrinCellsTempOutput_OFF(amacrinCellsTempOutput_OFF_PTR), temporalCoefficient(temporalCoefficientVal) {} + + void operator()( const tbb::blocked_range& r ) const { + register const float *OPL_ON_PTR=OPL_ON+r.begin(); + register const float *OPL_OFF_PTR=OPL_OFF+r.begin(); + register float *previousInput_ON_PTR= previousInput_ON+r.begin(); + register float *previousInput_OFF_PTR= previousInput_OFF+r.begin(); + register float *amacrinCellsTempOutput_ON_PTR= amacrinCellsTempOutput_ON+r.begin(); + register float *amacrinCellsTempOutput_OFF_PTR= amacrinCellsTempOutput_OFF+r.begin(); + for (unsigned int IDpixel=r.begin() ; IDpixel!=r.end(); ++IDpixel) + { + /* Compute ON and OFF amacrin cells high pass temporal filter */ + float magnoXonPixelResult = temporalCoefficient*(*amacrinCellsTempOutput_ON_PTR+ *OPL_ON_PTR-*previousInput_ON_PTR); + *(amacrinCellsTempOutput_ON_PTR++)=((float)(magnoXonPixelResult>0))*magnoXonPixelResult; + + float magnoXoffPixelResult = temporalCoefficient*(*amacrinCellsTempOutput_OFF_PTR+ *OPL_OFF_PTR-*previousInput_OFF_PTR); + *(amacrinCellsTempOutput_OFF_PTR++)=((float)(magnoXoffPixelResult>0))*magnoXoffPixelResult; + + /* prepare next loop */ + *(previousInput_ON_PTR++)=*(OPL_ON_PTR++); + *(previousInput_OFF_PTR++)=*(OPL_OFF_PTR++); + + } + } + + }; +#endif }; } diff --git a/modules/contrib/src/parvoretinafilter.cpp b/modules/contrib/src/parvoretinafilter.cpp index a6cbf1b80..50d1b0ba6 100644 --- a/modules/contrib/src/parvoretinafilter.cpp +++ b/modules/contrib/src/parvoretinafilter.cpp @@ -199,17 +199,20 @@ const std::valarray &ParvoRetinaFilter::runFilter(const std::valarray(0,_filterOutput.getNBpixels()), Parallel_OPL_OnOffWaysComputing(&_photoreceptorsOutput[0], &_horizontalCellsOutput[0], &_bipolarCellsOutputON[0], &_bipolarCellsOutputOFF[0], &_parvocellularOutputON[0], &_parvocellularOutputOFF[0]), tbb::auto_partitioner()); +#else + float *photoreceptorsOutput_PTR= &_photoreceptorsOutput[0]; + float *horizontalCellsOutput_PTR= &_horizontalCellsOutput[0]; + float *bipolarCellsON_PTR = &_bipolarCellsOutputON[0]; + float *bipolarCellsOFF_PTR = &_bipolarCellsOutputOFF[0]; + float *parvocellularOutputON_PTR= &_parvocellularOutputON[0]; + float *parvocellularOutputOFF_PTR= &_parvocellularOutputOFF[0]; // compute bipolar cells response equal to photoreceptors minus horizontal cells response // and copy the result on parvo cellular outputs... keeping time before their local contrast adaptation for final result for (register unsigned int IDpixel=0 ; IDpixel<_filterOutput.getNBpixels() ; ++IDpixel) @@ -222,6 +225,7 @@ void ParvoRetinaFilter::_OPL_OnOffWaysComputing() *(parvocellularOutputON_PTR++)=*(bipolarCellsON_PTR++) = isPositive*pixelDifference; *(parvocellularOutputOFF_PTR++)=*(bipolarCellsOFF_PTR++)= (isPositive-1.0f)*pixelDifference; } +#endif } } diff --git a/modules/contrib/src/parvoretinafilter.hpp b/modules/contrib/src/parvoretinafilter.hpp index 54521b17b..76f550685 100644 --- a/modules/contrib/src/parvoretinafilter.hpp +++ b/modules/contrib/src/parvoretinafilter.hpp @@ -216,6 +216,45 @@ private: // private functions void _OPL_OnOffWaysComputing(); +#ifdef HAVE_TBB +/****************************************************** +** IF TBB is useable, then, main loops are parallelized using these functors +** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary +** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised +** ==> functors constructors can differ from the parameters used with their related serial functions +*/ + class Parallel_OPL_OnOffWaysComputing + { + private: + float *photoreceptorsOutput, *horizontalCellsOutput, *bipolarCellsON, *bipolarCellsOFF, *parvocellularOutputON, *parvocellularOutputOFF; + public: + Parallel_OPL_OnOffWaysComputing(float *photoreceptorsOutput_PTR, float *horizontalCellsOutput_PTR, float *bipolarCellsON_PTR, float *bipolarCellsOFF_PTR, float *parvocellularOutputON_PTR, float *parvocellularOutputOFF_PTR) + :photoreceptorsOutput(photoreceptorsOutput_PTR), horizontalCellsOutput(horizontalCellsOutput_PTR), bipolarCellsON(bipolarCellsON_PTR), bipolarCellsOFF(bipolarCellsOFF_PTR), parvocellularOutputON(parvocellularOutputON_PTR), parvocellularOutputOFF(parvocellularOutputOFF_PTR) {} + + void operator()( const tbb::blocked_range& r ) const { + // compute bipolar cells response equal to photoreceptors minus horizontal cells response + // and copy the result on parvo cellular outputs... keeping time before their local contrast adaptation for final result + float *photoreceptorsOutput_PTR= photoreceptorsOutput+r.begin(); + float *horizontalCellsOutput_PTR= horizontalCellsOutput+r.begin(); + float *bipolarCellsON_PTR = bipolarCellsON+r.begin(); + float *bipolarCellsOFF_PTR = bipolarCellsOFF+r.begin(); + float *parvocellularOutputON_PTR= parvocellularOutputON+r.begin(); + float *parvocellularOutputOFF_PTR= parvocellularOutputOFF+r.begin(); + + for (register unsigned int IDpixel=r.begin() ; IDpixel!=r.end() ; ++IDpixel) + { + float pixelDifference = *(photoreceptorsOutput_PTR++) -*(horizontalCellsOutput_PTR++); + // test condition to allow write pixelDifference in ON or OFF buffer and 0 in the over + float isPositive=(float) (pixelDifference>0.0f); + + // ON and OFF channels writing step + *(parvocellularOutputON_PTR++)=*(bipolarCellsON_PTR++) = isPositive*pixelDifference; + *(parvocellularOutputOFF_PTR++)=*(bipolarCellsOFF_PTR++)= (isPositive-1.0f)*pixelDifference; + } + } + }; +#endif + }; } #endif diff --git a/modules/contrib/src/retinacolor.cpp b/modules/contrib/src/retinacolor.cpp index f98b0507d..b45295699 100644 --- a/modules/contrib/src/retinacolor.cpp +++ b/modules/contrib/src/retinacolor.cpp @@ -89,7 +89,7 @@ RetinaColor::RetinaColor(const unsigned int NBrows, const unsigned int NBcolumns _demultiplexedColorFrame(NBrows*NBcolumns*3), _chrominance(NBrows*NBcolumns*3), _colorLocalDensity(NBrows*NBcolumns*3), - _imageGradient(NBrows*NBcolumns*3) + _imageGradient(NBrows*NBcolumns*2) { // link to parent buffers (let's recycle !) _luminance=&_filterOutput; @@ -126,12 +126,12 @@ RetinaColor::~RetinaColor() void RetinaColor::clearAllBuffers() { BasicRetinaFilter::clearAllBuffers(); - _tempMultiplexedFrame=0; - _demultiplexedTempBuffer=0; + _tempMultiplexedFrame=0.f; + _demultiplexedTempBuffer=0.f; - _demultiplexedColorFrame=0; - _chrominance=0; - _imageGradient=1; + _demultiplexedColorFrame=0.f; + _chrominance=0.f; + _imageGradient=0.57f; } /** @@ -149,7 +149,7 @@ void RetinaColor::resize(const unsigned int NBrows, const unsigned int NBcolumns _demultiplexedColorFrame.resize(NBrows*NBcolumns*3); _chrominance.resize(NBrows*NBcolumns*3); _colorLocalDensity.resize(NBrows*NBcolumns*3); - _imageGradient.resize(NBrows*NBcolumns*3); + _imageGradient.resize(NBrows*NBcolumns*2); // link to parent buffers (let's recycle !) _luminance=&_filterOutput; @@ -325,15 +325,15 @@ void RetinaColor::runColorDemultiplexing(const std::valarray &multiplexed }else { - register const float *multiplexedColorFramePTR1= get_data(multiplexedColorFrame); - for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance, ++multiplexedColorFramePTR1) + register const float *multiplexedColorFramePTR= get_data(multiplexedColorFrame); + for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance, ++multiplexedColorFramePTR) { // normalize by photoreceptors density float Cr=*(chrominancePTR)*_colorLocalDensity[indexc]; float Cg=*(chrominancePTR+_filterOutput.getNBpixels())*_colorLocalDensity[indexc+_filterOutput.getNBpixels()]; float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels())*_colorLocalDensity[indexc+_filterOutput.getDoubleNBpixels()]; *luminance=(Cr+Cg+Cb)*_pG; - _demultiplexedTempBuffer[_colorSampling[indexc]] = *multiplexedColorFramePTR1 - *luminance; + _demultiplexedTempBuffer[_colorSampling[indexc]] = *multiplexedColorFramePTR - *luminance; } @@ -349,8 +349,9 @@ void RetinaColor::runColorDemultiplexing(const std::valarray &multiplexed _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels()); _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getDoubleNBpixels()); - for (unsigned int index=0; index<_filterOutput.getNBpixels()*3 ; ++index) // cette boucle pourrait �tre supprimee en passant la densit� � la fonction de filtrage - _demultiplexedColorFrame[index] /= _chrominance[index]; +/* for (unsigned int index=0; index<_filterOutput.getNBpixels()*3 ; ++index) // cette boucle pourrait �tre supprimee en passant la densit� � la fonction de filtrage + _demultiplexedColorFrame[index] /= _chrominance[index];*/ + _demultiplexedColorFrame/=_chrominance; // more optimal ;o) // compute and substract the residual luminance for (unsigned int index=0; index<_filterOutput.getNBpixels() ; ++index) @@ -432,6 +433,9 @@ void RetinaColor::clipRGBOutput_0_maxInputValue(float *inputOutputBuffer, const if (inputOutputBuffer==NULL) inputOutputBuffer= &_demultiplexedColorFrame[0]; +#ifdef HAVE_TBB // call the TemplateBuffer TBB clipping method + tbb::parallel_for(tbb::blocked_range(0,_filterOutput.getNBpixels()*3), Parallel_clipBufferValues(inputOutputBuffer, 0, maxInputValue), tbb::auto_partitioner()); +#else register float *inputOutputBufferPTR=inputOutputBuffer; for (register unsigned int jf = 0; jf < _filterOutput.getNBpixels()*3; ++jf, ++inputOutputBufferPTR) { @@ -440,6 +444,7 @@ void RetinaColor::clipRGBOutput_0_maxInputValue(float *inputOutputBuffer, const else if (*inputOutputBufferPTR<0) *inputOutputBufferPTR=0; } +#endif //std::cout<<"RetinaColor::...normalizing RGB frame OK"< horizontal filters work with the first layer of imageGradient _adaptiveHorizontalCausalFilter_addInput(inputFrame, outputFrame, 0, _filterOutput.getNBrows()); - _adaptiveHorizontalAnticausalFilter(outputFrame, 0, _filterOutput.getNBrows()); - _adaptiveVerticalCausalFilter(outputFrame, 0, _filterOutput.getNBcolumns()); + _horizontalAnticausalFilter_Irregular(outputFrame, 0, _filterOutput.getNBrows(), &_imageGradient[0]); + // -> horizontal filters work with the second layer of imageGradient + _verticalCausalFilter_Irregular(outputFrame, 0, _filterOutput.getNBcolumns(), &_imageGradient[0]+_filterOutput.getNBpixels()); _adaptiveVerticalAnticausalFilter_multGain(outputFrame, 0, _filterOutput.getNBcolumns()); - } -// horizontal causal filter which adds the input inside +// horizontal causal filter which adds the input inside... replaces the parent _horizontalCausalFilter_Irregular_addInput by avoiding a product for each pixel void RetinaColor::_adaptiveHorizontalCausalFilter_addInput(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd) { +#ifdef HAVE_TBB + tbb::parallel_for(tbb::blocked_range(IDrowStart,IDrowEnd), Parallel_adaptiveHorizontalCausalFilter_addInput(inputFrame, outputFrame, &_imageGradient[0], _filterOutput.getNBcolumns()), tbb::auto_partitioner()); +#else register float* outputPTR=outputFrame+IDrowStart*_filterOutput.getNBcolumns(); register const float* inputPTR=inputFrame+IDrowStart*_filterOutput.getNBcolumns(); - register float *imageGradientPTR= &_imageGradient[0]+IDrowStart*_filterOutput.getNBcolumns(); + register const float *imageGradientPTR= &_imageGradient[0]+IDrowStart*_filterOutput.getNBcolumns(); for (unsigned int IDrow=IDrowStart; IDrow(IDcolumnStart,IDcolumnEnd), Parallel_adaptiveVerticalAnticausalFilter_multGain(outputFrame, &_imageGradient[0]+_filterOutput.getNBpixels(), _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _gain), tbb::auto_partitioner()); +#else float* outputOffset=outputFrame+_filterOutput.getNBpixels()-_filterOutput.getNBcolumns(); - float* gradOffset= &_imageGradient[0]+_filterOutput.getNBpixels()-_filterOutput.getNBcolumns(); + float* gradOffset= &_imageGradient[0]+_filterOutput.getNBpixels()*2-_filterOutput.getNBcolumns(); for (unsigned int IDcolumn=IDcolumnStart; IDcolumn special adaptive filters dedicated to low pass filtering on the chrominance (skeeps filtering on the edges) void _adaptiveSpatialLPfilter(const float *inputFrame, float *outputFrame); - void _adaptiveHorizontalCausalFilter_addInput(const float *inputFrame, float *outputFrame, const unsigned int IDrowStart, const unsigned int IDrowEnd); - void _adaptiveHorizontalAnticausalFilter(float *outputFrame, const unsigned int IDrowStart, const unsigned int IDrowEnd); - void _adaptiveVerticalCausalFilter(float *outputFrame, const unsigned int IDcolumnStart, const unsigned int IDcolumnEnd); + void _adaptiveHorizontalCausalFilter_addInput(const float *inputFrame, float *outputFrame, const unsigned int IDrowStart, const unsigned int IDrowEnd); // TBB parallelized void _adaptiveVerticalAnticausalFilter_multGain(float *outputFrame, const unsigned int IDcolumnStart, const unsigned int IDcolumnEnd); void _computeGradient(const float *luminance); void _normalizeOutputs_0_maxOutputValue(void); @@ -258,6 +256,84 @@ protected: // color space transform void _applyImageColorSpaceConversion(const std::valarray &inputFrame, std::valarray &outputFrame, const float *transformTable); +#ifdef HAVE_TBB +/****************************************************** +** IF TBB is useable, then, main loops are parallelized using these functors +** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary +** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised +** ==> functors constructors can differ from the parameters used with their related serial functions +*/ + +/* Template : + class + { + private: + + public: + Parallel_() + : {} + + void operator()( const tbb::blocked_range& r ) const { + + } + }: +*/ + class Parallel_adaptiveHorizontalCausalFilter_addInput + { + private: + float *outputFrame; + const float *inputFrame, *imageGradient; + const unsigned int nbColumns; + public: + Parallel_adaptiveHorizontalCausalFilter_addInput(const float *inputImg, float *bufferToProcess, const float *imageGrad, const unsigned int nbCols) + :outputFrame(bufferToProcess), inputFrame(inputImg), imageGradient(imageGrad), nbColumns(nbCols) {}; + + void operator()( const tbb::blocked_range& r ) const { + register float* outputPTR=outputFrame+r.begin()*nbColumns; + register const float* inputPTR=inputFrame+r.begin()*nbColumns; + register const float *imageGradientPTR= imageGradient+r.begin()*nbColumns; + for (unsigned int IDrow=r.begin(); IDrow!=r.end(); ++IDrow) + { + register float result=0; + for (unsigned int index=0; index& r ) const { + float* offset=outputFrame+nbColumns*nbRows-nbColumns; + const float* gradOffset= imageGradient+nbColumns*nbRows-nbColumns; + for (unsigned int IDcolumn=r.begin(); IDcolumn!=r.end(); ++IDcolumn) + { + register float result=0; + register float *outputPTR=offset+IDcolumn; + register const float *imageGradientPTR=gradOffset+IDcolumn; + for (unsigned int index=0; index #include + +//// If TBB is used +// ==> then include required includes +#ifdef HAVE_TBB +#include "tbb/parallel_for.h" +#include "tbb/blocked_range.h" + +// ==> declare usefull generic tools +template +class Parallel_clipBufferValues +{ +private: + type *bufferToClip; + const type minValue, maxValue; + +public: + Parallel_clipBufferValues(type* bufferToProcess, const type min, const type max) + : bufferToClip(bufferToProcess), minValue(min), maxValue(max){} + + void operator()( const tbb::blocked_range& r ) const { + register type *inputOutputBufferPTR=bufferToClip+r.begin(); + for (register unsigned int jf = r.begin(); jf != r.end(); ++jf, ++inputOutputBufferPTR) + { + if (*inputOutputBufferPTR>maxValue) + *inputOutputBufferPTR=maxValue; + else if (*inputOutputBufferPTRmax()"<max()<<"maxThreshold="<min()"<min()<<"minThreshold="<Buffer(); - for (unsigned int i=0;isize();++i, ++bufferPTR) - { - if (*bufferPTRupdatedHighValue) - *bufferPTR=updatedHighValue; - } + std::cout<<"Tdebug"<max()"<max()<<"maxThreshold="<min()"<min()<<"minThreshold="<Buffer(); +#ifdef HAVE_TBB // call the TemplateBuffer TBB clipping method + tbb::parallel_for(tbb::blocked_range(0,this->size()), Parallel_clipBufferValues(bufferPTR, updatedLowValue, updatedHighValue), tbb::auto_partitioner()); +#else - normalizeGrayOutput_0_maxOutputValue(this->Buffer(), this->size(), maxOutputValue); + for (unsigned int i=0;isize();++i, ++bufferPTR) + { + if (*bufferPTRupdatedHighValue) + *bufferPTR=updatedHighValue; + } +#endif + normalizeGrayOutput_0_maxOutputValue(this->Buffer(), this->size(), maxOutputValue); } From 3456238c1655118e3459d78f9895b4e27d0b990e Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev Date: Wed, 29 Aug 2012 21:25:35 +0400 Subject: [PATCH 025/103] minor --- modules/gpu/test/test_denoising.cpp | 4 +- modules/imgproc/src/smooth.cpp | 286 ++++++++++++++-------------- 2 files changed, 144 insertions(+), 146 deletions(-) diff --git a/modules/gpu/test/test_denoising.cpp b/modules/gpu/test/test_denoising.cpp index 0f6cd69c5..f46c87671 100644 --- a/modules/gpu/test/test_denoising.cpp +++ b/modules/gpu/test/test_denoising.cpp @@ -86,7 +86,7 @@ TEST_P(BilateralFilter, Accuracy) EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-3 : 1.0); } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, BilateralFilter, testing::Combine( +INSTANTIATE_TEST_CASE_P(GPU_Denoising, BilateralFilter, testing::Combine( ALL_DEVICES, testing::Values(cv::Size(128, 128), cv::Size(113, 113), cv::Size(639, 481)), testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_32FC1), MatType(CV_32FC3)) @@ -134,7 +134,7 @@ TEST_P(NonLocalMeans, Regression) EXPECT_MAT_NEAR(gray_gold, dgray, 1e-4); } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, NonLocalMeans, ALL_DEVICES); +INSTANTIATE_TEST_CASE_P(GPU_Denoising, NonLocalMeans, ALL_DEVICES); #endif // HAVE_CUDA \ No newline at end of file diff --git a/modules/imgproc/src/smooth.cpp b/modules/imgproc/src/smooth.cpp index 13340511f..7b3fd6ea8 100644 --- a/modules/imgproc/src/smooth.cpp +++ b/modules/imgproc/src/smooth.cpp @@ -1285,8 +1285,6 @@ void cv::medianBlur( InputArray _src0, OutputArray _dst, int ksize ) Bilateral Filtering \****************************************************************************************/ -#undef CV_SSE3 - namespace cv { @@ -1305,12 +1303,12 @@ public: { int i, j, cn = dest->channels(), k; Size size = dest->size(); - #if CV_SSE3 + #if CV_SSE3 int CV_DECL_ALIGNED(16) buf[4]; float CV_DECL_ALIGNED(16) bufSum[4]; static const int CV_DECL_ALIGNED(16) bufSignMask[] = { 0x80000000, 0x80000000, 0x80000000, 0x80000000 }; bool haveSSE3 = checkHardwareSupport(CV_CPU_SSE3); - #endif + #endif for( i = range.start; i < range.end; i++ ) { @@ -1323,36 +1321,36 @@ public: { float sum = 0, wsum = 0; int val0 = sptr[j]; - k = 0; - #if CV_SSE3 - if( haveSSE3 ) - { - __m128 _val0 = _mm_set1_ps(static_cast(val0)); - const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); + k = 0; + #if CV_SSE3 + if( haveSSE3 ) + { + __m128 _val0 = _mm_set1_ps(static_cast(val0)); + const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); - for( ; k <= maxk - 4; k += 4 ) - { - __m128 _valF = _mm_set_ps(sptr[j + space_ofs[k+3]], sptr[j + space_ofs[k+2]], + for( ; k <= maxk - 4; k += 4 ) + { + __m128 _valF = _mm_set_ps(sptr[j + space_ofs[k+3]], sptr[j + space_ofs[k+2]], sptr[j + space_ofs[k+1]], sptr[j + space_ofs[k]]); - - __m128 _val = _mm_andnot_ps(_signMask, _mm_sub_ps(_valF, _val0)); - _mm_store_si128((__m128i*)buf, _mm_cvtps_epi32(_val)); + + __m128 _val = _mm_andnot_ps(_signMask, _mm_sub_ps(_valF, _val0)); + _mm_store_si128((__m128i*)buf, _mm_cvtps_epi32(_val)); - __m128 _cw = _mm_set_ps(color_weight[buf[3]],color_weight[buf[2]], + __m128 _cw = _mm_set_ps(color_weight[buf[3]],color_weight[buf[2]], color_weight[buf[1]],color_weight[buf[0]]); - __m128 _sw = _mm_loadu_ps(space_weight+k); - __m128 _w = _mm_mul_ps(_cw, _sw); - _cw = _mm_mul_ps(_w, _valF); + __m128 _sw = _mm_loadu_ps(space_weight+k); + __m128 _w = _mm_mul_ps(_cw, _sw); + _cw = _mm_mul_ps(_w, _valF); - _sw = _mm_hadd_ps(_w, _cw); - _sw = _mm_hadd_ps(_sw, _sw); - _mm_storel_pi((__m64*)bufSum, _sw); + _sw = _mm_hadd_ps(_w, _cw); + _sw = _mm_hadd_ps(_sw, _sw); + _mm_storel_pi((__m64*)bufSum, _sw); - sum += bufSum[1]; - wsum += bufSum[0]; - } - } - #endif + sum += bufSum[1]; + wsum += bufSum[0]; + } + } + #endif for( ; k < maxk; k++ ) { int val = sptr[j + space_ofs[k]]; @@ -1371,55 +1369,55 @@ public: { float sum_b = 0, sum_g = 0, sum_r = 0, wsum = 0; int b0 = sptr[j], g0 = sptr[j+1], r0 = sptr[j+2]; - k = 0; - #if CV_SSE3 - if( haveSSE3 ) - { - const __m128 _b0 = _mm_set1_ps(static_cast(b0)); - const __m128 _g0 = _mm_set1_ps(static_cast(g0)); - const __m128 _r0 = _mm_set1_ps(static_cast(r0)); - const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); + k = 0; + #if CV_SSE3 + if( haveSSE3 ) + { + const __m128 _b0 = _mm_set1_ps(static_cast(b0)); + const __m128 _g0 = _mm_set1_ps(static_cast(g0)); + const __m128 _r0 = _mm_set1_ps(static_cast(r0)); + const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); for( ; k <= maxk - 4; k += 4 ) { - const uchar* sptr_k = sptr + j + space_ofs[k]; - const uchar* sptr_k1 = sptr + j + space_ofs[k+1]; - const uchar* sptr_k2 = sptr + j + space_ofs[k+2]; - const uchar* sptr_k3 = sptr + j + space_ofs[k+3]; + const uchar* sptr_k = sptr + j + space_ofs[k]; + const uchar* sptr_k1 = sptr + j + space_ofs[k+1]; + const uchar* sptr_k2 = sptr + j + space_ofs[k+2]; + const uchar* sptr_k3 = sptr + j + space_ofs[k+3]; - __m128 _b = _mm_set_ps(sptr_k3[0],sptr_k2[0],sptr_k1[0],sptr_k[0]); - __m128 _g = _mm_set_ps(sptr_k3[1],sptr_k2[1],sptr_k1[1],sptr_k[1]); - __m128 _r = _mm_set_ps(sptr_k3[2],sptr_k2[2],sptr_k1[2],sptr_k[2]); + __m128 _b = _mm_set_ps(sptr_k3[0],sptr_k2[0],sptr_k1[0],sptr_k[0]); + __m128 _g = _mm_set_ps(sptr_k3[1],sptr_k2[1],sptr_k1[1],sptr_k[1]); + __m128 _r = _mm_set_ps(sptr_k3[2],sptr_k2[2],sptr_k1[2],sptr_k[2]); - __m128 bt = _mm_andnot_ps(_signMask, _mm_sub_ps(_b,_b0)); - __m128 gt = _mm_andnot_ps(_signMask, _mm_sub_ps(_g,_g0)); - __m128 rt = _mm_andnot_ps(_signMask, _mm_sub_ps(_r,_r0)); + __m128 bt = _mm_andnot_ps(_signMask, _mm_sub_ps(_b,_b0)); + __m128 gt = _mm_andnot_ps(_signMask, _mm_sub_ps(_g,_g0)); + __m128 rt = _mm_andnot_ps(_signMask, _mm_sub_ps(_r,_r0)); - bt =_mm_add_ps(rt, _mm_add_ps(bt, gt)); - _mm_store_si128((__m128i*)buf, _mm_cvtps_epi32(bt)); + bt =_mm_add_ps(rt, _mm_add_ps(bt, gt)); + _mm_store_si128((__m128i*)buf, _mm_cvtps_epi32(bt)); - __m128 _w = _mm_set_ps(color_weight[buf[3]],color_weight[buf[2]], + __m128 _w = _mm_set_ps(color_weight[buf[3]],color_weight[buf[2]], color_weight[buf[1]],color_weight[buf[0]]); - __m128 _sw = _mm_loadu_ps(space_weight+k); + __m128 _sw = _mm_loadu_ps(space_weight+k); - _w = _mm_mul_ps(_w,_sw); - _b = _mm_mul_ps(_b, _w); - _g = _mm_mul_ps(_g, _w); - _r = _mm_mul_ps(_r, _w); + _w = _mm_mul_ps(_w,_sw); + _b = _mm_mul_ps(_b, _w); + _g = _mm_mul_ps(_g, _w); + _r = _mm_mul_ps(_r, _w); - _w = _mm_hadd_ps(_w, _b); - _g = _mm_hadd_ps(_g, _r); + _w = _mm_hadd_ps(_w, _b); + _g = _mm_hadd_ps(_g, _r); - _w = _mm_hadd_ps(_w, _g); - _mm_store_ps(bufSum, _w); + _w = _mm_hadd_ps(_w, _g); + _mm_store_ps(bufSum, _w); - wsum += bufSum[0]; - sum_b += bufSum[1]; - sum_g += bufSum[2]; - sum_r += bufSum[3]; - } - } - #endif + wsum += bufSum[0]; + sum_b += bufSum[1]; + sum_g += bufSum[2]; + sum_r += bufSum[3]; + } + } + #endif for( ; k < maxk; k++ ) { @@ -1493,8 +1491,8 @@ bilateralFilter_8u( const Mat& src, Mat& dst, int d, // initialize space-related bilateral filter coefficients for( i = -radius, maxk = 0; i <= radius; i++ ) - { - j = -radius; + { + j = -radius; for( ;j <= radius; j++ ) { @@ -1504,7 +1502,7 @@ bilateralFilter_8u( const Mat& src, Mat& dst, int d, space_weight[maxk] = (float)std::exp(r*r*gauss_space_coeff); space_ofs[maxk++] = (int)(i*temp.step + j*cn); } - } + } BilateralFilter_8u_Invoker body(dst, temp, radius, maxk, space_ofs, space_weight, color_weight); parallel_for_(Range(0, size.height), body); @@ -1527,12 +1525,12 @@ public: { int i, j, k; Size size = dest->size(); - #if CV_SSE3 + #if CV_SSE3 int CV_DECL_ALIGNED(16) idxBuf[4]; float CV_DECL_ALIGNED(16) bufSum32[4]; static const int CV_DECL_ALIGNED(16) bufSignMask[] = { 0x80000000, 0x80000000, 0x80000000, 0x80000000 }; bool haveSSE3 = checkHardwareSupport(CV_CPU_SSE3); - #endif + #endif for( i = range.start; i < range.end; i++ ) { @@ -1545,42 +1543,42 @@ public: { float sum = 0, wsum = 0; float val0 = sptr[j]; - k = 0; - #if CV_SSE3 - if( haveSSE3 ) - { - const __m128 _val0 = _mm_set1_ps(sptr[j]); - const __m128 _scale_index = _mm_set1_ps(scale_index); - const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); - - for( ; k <= maxk - 4 ; k += 4 ) - { - __m128 _sw = _mm_loadu_ps(space_weight + k); - __m128 _val = _mm_set_ps(sptr[j + space_ofs[k+3]], sptr[j + space_ofs[k+2]], + k = 0; + #if CV_SSE3 + if( haveSSE3 ) + { + const __m128 _val0 = _mm_set1_ps(sptr[j]); + const __m128 _scale_index = _mm_set1_ps(scale_index); + const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); + + for( ; k <= maxk - 4 ; k += 4 ) + { + __m128 _sw = _mm_loadu_ps(space_weight + k); + __m128 _val = _mm_set_ps(sptr[j + space_ofs[k+3]], sptr[j + space_ofs[k+2]], sptr[j + space_ofs[k+1]], sptr[j + space_ofs[k]]); - __m128 _alpha = _mm_mul_ps(_mm_andnot_ps( _signMask, _mm_sub_ps(_val,_val0)), _scale_index); + __m128 _alpha = _mm_mul_ps(_mm_andnot_ps( _signMask, _mm_sub_ps(_val,_val0)), _scale_index); - __m128i _idx = _mm_cvtps_epi32(_alpha); - _mm_store_si128((__m128i*)idxBuf, _idx); - _alpha = _mm_sub_ps(_alpha, _mm_cvtepi32_ps(_idx)); + __m128i _idx = _mm_cvtps_epi32(_alpha); + _mm_store_si128((__m128i*)idxBuf, _idx); + _alpha = _mm_sub_ps(_alpha, _mm_cvtepi32_ps(_idx)); - __m128 _explut = _mm_set_ps(expLUT[idxBuf[3]], expLUT[idxBuf[2]], + __m128 _explut = _mm_set_ps(expLUT[idxBuf[3]], expLUT[idxBuf[2]], expLUT[idxBuf[1]], expLUT[idxBuf[0]]); - __m128 _explut1 = _mm_set_ps(expLUT[idxBuf[3]+1], expLUT[idxBuf[2]+1], + __m128 _explut1 = _mm_set_ps(expLUT[idxBuf[3]+1], expLUT[idxBuf[2]+1], expLUT[idxBuf[1]+1], expLUT[idxBuf[0]+1]); - - __m128 _w = _mm_mul_ps(_sw, _mm_add_ps(_explut, _mm_mul_ps(_alpha, _mm_sub_ps(_explut1, _explut)))); - _val = _mm_mul_ps(_w, _val); + + __m128 _w = _mm_mul_ps(_sw, _mm_add_ps(_explut, _mm_mul_ps(_alpha, _mm_sub_ps(_explut1, _explut)))); + _val = _mm_mul_ps(_w, _val); - _sw = _mm_hadd_ps(_w, _val); - _sw = _mm_hadd_ps(_sw, _sw); - _mm_storel_pi((__m64*)bufSum32, _sw); + _sw = _mm_hadd_ps(_w, _val); + _sw = _mm_hadd_ps(_sw, _sw); + _mm_storel_pi((__m64*)bufSum32, _sw); - sum += bufSum32[1]; - wsum += bufSum32[0]; - } - } - #endif + sum += bufSum32[1]; + wsum += bufSum32[0]; + } + } + #endif for( ; k < maxk; k++ ) { @@ -1602,63 +1600,63 @@ public: { float sum_b = 0, sum_g = 0, sum_r = 0, wsum = 0; float b0 = sptr[j], g0 = sptr[j+1], r0 = sptr[j+2]; - k = 0; - #if CV_SSE3 - if( haveSSE3 ) - { - const __m128 _b0 = _mm_set1_ps(b0); - const __m128 _g0 = _mm_set1_ps(g0); - const __m128 _r0 = _mm_set1_ps(r0); - const __m128 _scale_index = _mm_set1_ps(scale_index); + k = 0; + #if CV_SSE3 + if( haveSSE3 ) + { + const __m128 _b0 = _mm_set1_ps(b0); + const __m128 _g0 = _mm_set1_ps(g0); + const __m128 _r0 = _mm_set1_ps(r0); + const __m128 _scale_index = _mm_set1_ps(scale_index); const __m128 _signMask = _mm_load_ps((const float*)bufSignMask); - - for( ; k <= maxk-4; k += 4 ) - { - __m128 _sw = _mm_loadu_ps(space_weight + k); + + for( ; k <= maxk-4; k += 4 ) + { + __m128 _sw = _mm_loadu_ps(space_weight + k); - const float* sptr_k = sptr + j + space_ofs[k]; - const float* sptr_k1 = sptr + j + space_ofs[k+1]; - const float* sptr_k2 = sptr + j + space_ofs[k+2]; - const float* sptr_k3 = sptr + j + space_ofs[k+3]; + const float* sptr_k = sptr + j + space_ofs[k]; + const float* sptr_k1 = sptr + j + space_ofs[k+1]; + const float* sptr_k2 = sptr + j + space_ofs[k+2]; + const float* sptr_k3 = sptr + j + space_ofs[k+3]; - __m128 _b = _mm_set_ps(sptr_k3[0], sptr_k2[0], sptr_k1[0], sptr_k[0]); - __m128 _g = _mm_set_ps(sptr_k3[1], sptr_k2[1], sptr_k1[1], sptr_k[1]); - __m128 _r = _mm_set_ps(sptr_k3[2], sptr_k2[2], sptr_k1[2], sptr_k[2]); + __m128 _b = _mm_set_ps(sptr_k3[0], sptr_k2[0], sptr_k1[0], sptr_k[0]); + __m128 _g = _mm_set_ps(sptr_k3[1], sptr_k2[1], sptr_k1[1], sptr_k[1]); + __m128 _r = _mm_set_ps(sptr_k3[2], sptr_k2[2], sptr_k1[2], sptr_k[2]); - __m128 _bt = _mm_andnot_ps(_signMask,_mm_sub_ps(_b,_b0)); - __m128 _gt = _mm_andnot_ps(_signMask,_mm_sub_ps(_g,_g0)); - __m128 _rt = _mm_andnot_ps(_signMask,_mm_sub_ps(_r,_r0)); + __m128 _bt = _mm_andnot_ps(_signMask,_mm_sub_ps(_b,_b0)); + __m128 _gt = _mm_andnot_ps(_signMask,_mm_sub_ps(_g,_g0)); + __m128 _rt = _mm_andnot_ps(_signMask,_mm_sub_ps(_r,_r0)); - __m128 _alpha = _mm_mul_ps(_scale_index, _mm_add_ps(_rt,_mm_add_ps(_bt, _gt))); + __m128 _alpha = _mm_mul_ps(_scale_index, _mm_add_ps(_rt,_mm_add_ps(_bt, _gt))); - __m128i _idx = _mm_cvtps_epi32(_alpha); - _mm_store_si128((__m128i*)idxBuf, _idx); - _alpha = _mm_sub_ps(_alpha, _mm_cvtepi32_ps(_idx)); + __m128i _idx = _mm_cvtps_epi32(_alpha); + _mm_store_si128((__m128i*)idxBuf, _idx); + _alpha = _mm_sub_ps(_alpha, _mm_cvtepi32_ps(_idx)); - __m128 _explut = _mm_set_ps(expLUT[idxBuf[3]], expLUT[idxBuf[2]], expLUT[idxBuf[1]], expLUT[idxBuf[0]]); - __m128 _explut1 = _mm_set_ps(expLUT[idxBuf[3]+1], expLUT[idxBuf[2]+1], expLUT[idxBuf[1]+1], expLUT[idxBuf[0]+1]); - - __m128 _w = _mm_mul_ps(_sw, _mm_add_ps(_explut, _mm_mul_ps(_alpha, _mm_sub_ps(_explut1, _explut)))); + __m128 _explut = _mm_set_ps(expLUT[idxBuf[3]], expLUT[idxBuf[2]], expLUT[idxBuf[1]], expLUT[idxBuf[0]]); + __m128 _explut1 = _mm_set_ps(expLUT[idxBuf[3]+1], expLUT[idxBuf[2]+1], expLUT[idxBuf[1]+1], expLUT[idxBuf[0]+1]); + + __m128 _w = _mm_mul_ps(_sw, _mm_add_ps(_explut, _mm_mul_ps(_alpha, _mm_sub_ps(_explut1, _explut)))); - _b = _mm_mul_ps(_b, _w); - _g = _mm_mul_ps(_g, _w); - _r = _mm_mul_ps(_r, _w); + _b = _mm_mul_ps(_b, _w); + _g = _mm_mul_ps(_g, _w); + _r = _mm_mul_ps(_r, _w); - _w = _mm_hadd_ps(_w, _b); - _g = _mm_hadd_ps(_g, _r); + _w = _mm_hadd_ps(_w, _b); + _g = _mm_hadd_ps(_g, _r); - _w = _mm_hadd_ps(_w, _g); - _mm_store_ps(bufSum32, _w); + _w = _mm_hadd_ps(_w, _g); + _mm_store_ps(bufSum32, _w); - wsum += bufSum32[0]; - sum_b += bufSum32[1]; - sum_g += bufSum32[2]; - sum_r += bufSum32[3]; - } + wsum += bufSum32[0]; + sum_b += bufSum32[1]; + sum_g += bufSum32[2]; + sum_r += bufSum32[3]; + } - } - #endif - + } + #endif + for(; k < maxk; k++ ) { const float* sptr_k = sptr + j + space_ofs[k]; From ae4718558d50bd23e83f12a20545e924677f32ba Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 04:23:47 +0400 Subject: [PATCH 026/103] Update zlib to release v1.2.7 --- 3rdparty/zlib/CMakeLists.txt | 2 +- 3rdparty/zlib/ChangeLog | 1409 +++++++++++++++++++++++++++++++++ 3rdparty/zlib/README | 4 +- 3rdparty/zlib/crc32.c | 74 +- 3rdparty/zlib/crc32.h | 2 +- 3rdparty/zlib/deflate.c | 2 +- 3rdparty/zlib/gzguts.h | 11 +- 3rdparty/zlib/gzlib.c | 90 ++- 3rdparty/zlib/gzread.c | 23 +- 3rdparty/zlib/gzwrite.c | 68 +- 3rdparty/zlib/inflate.c | 21 +- 3rdparty/zlib/inftrees.c | 4 +- 3rdparty/zlib/zconf.h.cmakein | 88 +- 3rdparty/zlib/zlib.h | 62 +- 3rdparty/zlib/zutil.c | 31 +- 3rdparty/zlib/zutil.h | 8 +- 16 files changed, 1695 insertions(+), 204 deletions(-) create mode 100644 3rdparty/zlib/ChangeLog diff --git a/3rdparty/zlib/CMakeLists.txt b/3rdparty/zlib/CMakeLists.txt index 72b33093e..537690ce9 100644 --- a/3rdparty/zlib/CMakeLists.txt +++ b/3rdparty/zlib/CMakeLists.txt @@ -82,7 +82,7 @@ if(UNIX) endif() endif() -ocv_warnings_disable(CMAKE_C_FLAGS /wd4013 -Wattributes -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations) +ocv_warnings_disable(CMAKE_C_FLAGS -Wattributes -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations) set_target_properties(${ZLIB_LIBRARY} PROPERTIES OUTPUT_NAME ${ZLIB_LIBRARY} diff --git a/3rdparty/zlib/ChangeLog b/3rdparty/zlib/ChangeLog new file mode 100644 index 000000000..c2c643a1a --- /dev/null +++ b/3rdparty/zlib/ChangeLog @@ -0,0 +1,1409 @@ + + ChangeLog file for zlib + +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no libary use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + +Changes in 1.2.5 (19 Apr 2010) +- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] +- Default to libdir as sharedlibdir in configure [Nieder] +- Update copyright dates on modified source files +- Update trees.c to be able to generate modified trees.h +- Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] + +Changes in 1.2.4.5 (18 Apr 2010) +- Set sharedlibdir in configure [Torok] +- Set LDFLAGS in Makefile.in [Bar-Lev] +- Avoid mkdir objs race condition in Makefile.in [Bowler] +- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays +- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C +- Don't use hidden attribute when it is a warning generator (e.g. Solaris) + +Changes in 1.2.4.4 (18 Apr 2010) +- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] +- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty +- Try to use bash or ksh regardless of functionality of /bin/sh +- Fix configure incompatibility with NetBSD sh +- Remove attempt to run under bash or ksh since have better NetBSD fix +- Fix win32/Makefile.gcc for MinGW [Bar-Lev] +- Add diagnostic messages when using CROSS_PREFIX in configure +- Added --sharedlibdir option to configure [Weigelt] +- Use hidden visibility attribute when available [Frysinger] + +Changes in 1.2.4.3 (10 Apr 2010) +- Only use CROSS_PREFIX in configure for ar and ranlib if they exist +- Use CROSS_PREFIX for nm [Bar-Lev] +- Assume _LARGEFILE64_SOURCE defined is equivalent to true +- Avoid use of undefined symbols in #if with && and || +- Make *64 prototypes in gzguts.h consistent with functions +- Add -shared load option for MinGW in configure [Bowler] +- Move z_off64_t to public interface, use instead of off64_t +- Remove ! from shell test in configure (not portable to Solaris) +- Change +0 macro tests to -0 for possibly increased portability + +Changes in 1.2.4.2 (9 Apr 2010) +- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 +- Really provide prototypes for *64 functions when building without LFS +- Only define unlink() in minigzip.c if unistd.h not included +- Update README to point to contrib/vstudio project files +- Move projects/vc6 to old/ and remove projects/ +- Include stdlib.h in minigzip.c for setmode() definition under WinCE +- Clean up assembler builds in win32/Makefile.msc [Rowe] +- Include sys/types.h for Microsoft for off_t definition +- Fix memory leak on error in gz_open() +- Symbolize nm as $NM in configure [Weigelt] +- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] +- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined +- Fix bug in gzeof() to take into account unused input data +- Avoid initialization of structures with variables in puff.c +- Updated win32/README-WIN32.txt [Rowe] + +Changes in 1.2.4.1 (28 Mar 2010) +- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] +- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] +- Restore "for debugging" comment on sprintf() in gzlib.c +- Remove fdopen for MVS from gzguts.h +- Put new README-WIN32.txt in win32 [Rowe] +- Add check for shell to configure and invoke another shell if needed +- Fix big fat stinking bug in gzseek() on uncompressed files +- Remove vestigial F_OPEN64 define in zutil.h +- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE +- Avoid errors on non-LFS systems when applications define LFS macros +- Set EXE to ".exe" in configure for MINGW [Kahle] +- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] +- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] +- Add DLL install in win32/makefile.gcc [Bar-Lev] +- Allow Linux* or linux* from uname in configure [Bar-Lev] +- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] +- Add cross-compilation prefixes to configure [Bar-Lev] +- Match type exactly in gz_load() invocation in gzread.c +- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func +- Provide prototypes for *64 functions when building zlib without LFS +- Don't use -lc when linking shared library on MinGW +- Remove errno.h check in configure and vestigial errno code in zutil.h + +Changes in 1.2.4 (14 Mar 2010) +- Fix VER3 extraction in configure for no fourth subversion +- Update zlib.3, add docs to Makefile.in to make .pdf out of it +- Add zlib.3.pdf to distribution +- Don't set error code in gzerror() if passed pointer is NULL +- Apply destination directory fixes to CMakeLists.txt [Lowman] +- Move #cmakedefine's to a new zconf.in.cmakein +- Restore zconf.h for builds that don't use configure or cmake +- Add distclean to dummy Makefile for convenience +- Update and improve INDEX, README, and FAQ +- Update CMakeLists.txt for the return of zconf.h [Lowman] +- Update contrib/vstudio/vc9 and vc10 [Vollant] +- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc +- Apply license and readme changes to contrib/asm686 [Raiter] +- Check file name lengths and add -c option in minigzip.c [Li] +- Update contrib/amd64 and contrib/masmx86/ [Vollant] +- Avoid use of "eof" parameter in trees.c to not shadow library variable +- Update make_vms.com for removal of zlibdefs.h [Zinser] +- Update assembler code and vstudio projects in contrib [Vollant] +- Remove outdated assembler code contrib/masm686 and contrib/asm586 +- Remove old vc7 and vc8 from contrib/vstudio +- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] +- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() +- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] +- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) +- Fix bug in void-returning vsprintf() case in gzwrite.c +- Fix name change from inflate.h in contrib/inflate86/inffas86.c +- Check if temporary file exists before removing in make_vms.com [Zinser] +- Fix make install and uninstall for --static option +- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] +- Update readme.txt in contrib/masmx64 and masmx86 to assemble + +Changes in 1.2.3.9 (21 Feb 2010) +- Expunge gzio.c +- Move as400 build information to old +- Fix updates in contrib/minizip and contrib/vstudio +- Add const to vsnprintf test in configure to avoid warnings [Weigelt] +- Delete zconf.h (made by configure) [Weigelt] +- Change zconf.in.h to zconf.h.in per convention [Weigelt] +- Check for NULL buf in gzgets() +- Return empty string for gzgets() with len == 1 (like fgets()) +- Fix description of gzgets() in zlib.h for end-of-file, NULL return +- Update minizip to 1.1 [Vollant] +- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c +- Note in zlib.h that gzerror() should be used to distinguish from EOF +- Remove use of snprintf() from gzlib.c +- Fix bug in gzseek() +- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] +- Fix zconf.h generation in CMakeLists.txt [Lowman] +- Improve comments in zconf.h where modified by configure + +Changes in 1.2.3.8 (13 Feb 2010) +- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] +- Use z_off64_t in gz_zero() and gz_skip() to match state->skip +- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) +- Revert to Makefile.in from 1.2.3.6 (live with the clutter) +- Fix missing error return in gzflush(), add zlib.h note +- Add *64 functions to zlib.map [Levin] +- Fix signed/unsigned comparison in gz_comp() +- Use SFLAGS when testing shared linking in configure +- Add --64 option to ./configure to use -m64 with gcc +- Fix ./configure --help to correctly name options +- Have make fail if a test fails [Levin] +- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] +- Remove assembler object files from contrib + +Changes in 1.2.3.7 (24 Jan 2010) +- Always gzopen() with O_LARGEFILE if available +- Fix gzdirect() to work immediately after gzopen() or gzdopen() +- Make gzdirect() more precise when the state changes while reading +- Improve zlib.h documentation in many places +- Catch memory allocation failure in gz_open() +- Complete close operation if seek forward in gzclose_w() fails +- Return Z_ERRNO from gzclose_r() if close() fails +- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL +- Return zero for gzwrite() errors to match zlib.h description +- Return -1 on gzputs() error to match zlib.h description +- Add zconf.in.h to allow recovery from configure modification [Weigelt] +- Fix static library permissions in Makefile.in [Weigelt] +- Avoid warnings in configure tests that hide functionality [Weigelt] +- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] +- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] +- Avoid access of uninitialized data for first inflateReset2 call [Gomes] +- Keep object files in subdirectories to reduce the clutter somewhat +- Remove default Makefile and zlibdefs.h, add dummy Makefile +- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ +- Remove zlibdefs.h completely -- modify zconf.h instead + +Changes in 1.2.3.6 (17 Jan 2010) +- Avoid void * arithmetic in gzread.c and gzwrite.c +- Make compilers happier with const char * for gz_error message +- Avoid unused parameter warning in inflate.c +- Avoid signed-unsigned comparison warning in inflate.c +- Indent #pragma's for traditional C +- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() +- Correct email address in configure for system options +- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] +- Update zlib.map [Brown] +- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] +- Apply various fixes to CMakeLists.txt [Lowman] +- Add checks on len in gzread() and gzwrite() +- Add error message for no more room for gzungetc() +- Remove zlib version check in gzwrite() +- Defer compression of gzprintf() result until need to +- Use snprintf() in gzdopen() if available +- Remove USE_MMAP configuration determination (only used by minigzip) +- Remove examples/pigz.c (available separately) +- Update examples/gun.c to 1.6 + +Changes in 1.2.3.5 (8 Jan 2010) +- Add space after #if in zutil.h for some compilers +- Fix relatively harmless bug in deflate_fast() [Exarevsky] +- Fix same problem in deflate_slow() +- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] +- Add deflate_rle() for faster Z_RLE strategy run-length encoding +- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding +- Change name of "write" variable in inffast.c to avoid library collisions +- Fix premature EOF from gzread() in gzio.c [Brown] +- Use zlib header window size if windowBits is 0 in inflateInit2() +- Remove compressBound() call in deflate.c to avoid linking compress.o +- Replace use of errno in gz* with functions, support WinCE [Alves] +- Provide alternative to perror() in minigzip.c for WinCE [Alves] +- Don't use _vsnprintf on later versions of MSVC [Lowman] +- Add CMake build script and input file [Lowman] +- Update contrib/minizip to 1.1 [Svensson, Vollant] +- Moved nintendods directory from contrib to . +- Replace gzio.c with a new set of routines with the same functionality +- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above +- Update contrib/minizip to 1.1b +- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h + +Changes in 1.2.3.4 (21 Dec 2009) +- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility +- Update comments in configure and Makefile.in for default --shared +- Fix test -z's in configure [Marquess] +- Build examplesh and minigzipsh when not testing +- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h +- Import LDFLAGS from the environment in configure +- Fix configure to populate SFLAGS with discovered CFLAGS options +- Adapt make_vms.com to the new Makefile.in [Zinser] +- Add zlib2ansi script for C++ compilation [Marquess] +- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) +- Add AMD64 assembler code for longest match to contrib [Teterin] +- Include options from $SFLAGS when doing $LDSHARED +- Simplify 64-bit file support by introducing z_off64_t type +- Make shared object files in objs directory to work around old Sun cc +- Use only three-part version number for Darwin shared compiles +- Add rc option to ar in Makefile.in for when ./configure not run +- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* +- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile +- Protect against _FILE_OFFSET_BITS being defined when compiling zlib +- Rename Makefile.in targets allstatic to static and allshared to shared +- Fix static and shared Makefile.in targets to be independent +- Correct error return bug in gz_open() by setting state [Brown] +- Put spaces before ;;'s in configure for better sh compatibility +- Add pigz.c (parallel implementation of gzip) to examples/ +- Correct constant in crc32.c to UL [Leventhal] +- Reject negative lengths in crc32_combine() +- Add inflateReset2() function to work like inflateEnd()/inflateInit2() +- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] +- Correct typo in doc/algorithm.txt [Janik] +- Fix bug in adler32_combine() [Zhu] +- Catch missing-end-of-block-code error in all inflates and in puff + Assures that random input to inflate eventually results in an error +- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ +- Update ENOUGH and its usage to reflect discovered bounds +- Fix gzerror() error report on empty input file [Brown] +- Add ush casts in trees.c to avoid pedantic runtime errors +- Fix typo in zlib.h uncompress() description [Reiss] +- Correct inflate() comments with regard to automatic header detection +- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) +- Put new version of gzlog (2.0) in examples with interruption recovery +- Add puff compile option to permit invalid distance-too-far streams +- Add puff TEST command options, ability to read piped input +- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but + _LARGEFILE64_SOURCE not defined +- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart +- Fix deflateSetDictionary() to use all 32K for output consistency +- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) +- Clear bytes after deflate lookahead to avoid use of uninitialized data +- Change a limit in inftrees.c to be more transparent to Coverity Prevent +- Update win32/zlib.def with exported symbols from zlib.h +- Correct spelling errors in zlib.h [Willem, Sobrado] +- Allow Z_BLOCK for deflate() to force a new block +- Allow negative bits in inflatePrime() to delete existing bit buffer +- Add Z_TREES flush option to inflate() to return at end of trees +- Add inflateMark() to return current state information for random access +- Add Makefile for NintendoDS to contrib [Costa] +- Add -w in configure compile tests to avoid spurious warnings [Beucler] +- Fix typos in zlib.h comments for deflateSetDictionary() +- Fix EOF detection in transparent gzread() [Maier] + +Changes in 1.2.3.3 (2 October 2006) +- Make --shared the default for configure, add a --static option +- Add compile option to permit invalid distance-too-far streams +- Add inflateUndermine() function which is required to enable above +- Remove use of "this" variable name for C++ compatibility [Marquess] +- Add testing of shared library in make test, if shared library built +- Use ftello() and fseeko() if available instead of ftell() and fseek() +- Provide two versions of all functions that use the z_off_t type for + binary compatibility -- a normal version and a 64-bit offset version, + per the Large File Support Extension when _LARGEFILE64_SOURCE is + defined; use the 64-bit versions by default when _FILE_OFFSET_BITS + is defined to be 64 +- Add a --uname= option to configure to perhaps help with cross-compiling + +Changes in 1.2.3.2 (3 September 2006) +- Turn off silly Borland warnings [Hay] +- Use off64_t and define _LARGEFILE64_SOURCE when present +- Fix missing dependency on inffixed.h in Makefile.in +- Rig configure --shared to build both shared and static [Teredesai, Truta] +- Remove zconf.in.h and instead create a new zlibdefs.h file +- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] +- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] + +Changes in 1.2.3.1 (16 August 2006) +- Add watcom directory with OpenWatcom make files [Daniel] +- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] +- Update make_vms.com [Zinser] +- Use -fPIC for shared build in configure [Teredesai, Nicholson] +- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] +- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck] +- Add some FAQ entries about the contrib directory +- Update the MVS question in the FAQ +- Avoid extraneous reads after EOF in gzio.c [Brown] +- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] +- Add comments to zlib.h about gzerror() usage [Brown] +- Set extra flags in gzip header in gzopen() like deflate() does +- Make configure options more compatible with double-dash conventions + [Weigelt] +- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] +- Fix uninstall target in Makefile.in [Truta] +- Add pkgconfig support [Weigelt] +- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] +- Replace set_data_type() with a more accurate detect_data_type() in + trees.c, according to the txtvsbin.txt document [Truta] +- Swap the order of #include and #include "zlib.h" in + gzio.c, example.c and minigzip.c [Truta] +- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, + Truta] (where?) +- Fix target "clean" from win32/Makefile.bor [Truta] +- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] +- Update zlib www home address in win32/DLL_FAQ.txt [Truta] +- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] +- Enable browse info in the "Debug" and "ASM Debug" configurations in + the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] +- Add pkgconfig support [Weigelt] +- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, + for use in win32/zlib1.rc [Polushin, Rowe, Truta] +- Add a document that explains the new text detection scheme to + doc/txtvsbin.txt [Truta] +- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] +- Move algorithm.txt into doc/ [Truta] +- Synchronize FAQ with website +- Fix compressBound(), was low for some pathological cases [Fearnley] +- Take into account wrapper variations in deflateBound() +- Set examples/zpipe.c input and output to binary mode for Windows +- Update examples/zlib_how.html with new zpipe.c (also web site) +- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems + that gcc became pickier in 4.0) +- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain + un-versioned, the patch adds versioning only for symbols introduced in + zlib-1.2.0 or later. It also declares as local those symbols which are + not designed to be exported." [Levin] +- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure +- Do not initialize global static by default in trees.c, add a response + NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] +- Don't use strerror() in gzio.c under WinCE [Yakimov] +- Don't use errno.h in zutil.h under WinCE [Yakimov] +- Move arguments for AR to its usage to allow replacing ar [Marot] +- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] +- Improve inflateInit() and inflateInit2() documentation +- Fix structure size comment in inflate.h +- Change configure help option from --h* to --help [Santos] + +Changes in 1.2.3 (18 July 2005) +- Apply security vulnerability fixes to contrib/infback9 as well +- Clean up some text files (carriage returns, trailing space) +- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] + +Changes in 1.2.2.4 (11 July 2005) +- Add inflatePrime() function for starting inflation at bit boundary +- Avoid some Visual C warnings in deflate.c +- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit + compile +- Fix some spelling errors in comments [Betts] +- Correct inflateInit2() error return documentation in zlib.h +- Add zran.c example of compressed data random access to examples + directory, shows use of inflatePrime() +- Fix cast for assignments to strm->state in inflate.c and infback.c +- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] +- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] +- Add cast in trees.c t avoid a warning [Oberhumer] +- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] +- Update make_vms.com [Zinser] +- Initialize state->write in inflateReset() since copied in inflate_fast() +- Be more strict on incomplete code sets in inflate_table() and increase + ENOUGH and MAXD -- this repairs a possible security vulnerability for + invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for + discovering the vulnerability and providing test cases. +- Add ia64 support to configure for HP-UX [Smith] +- Add error return to gzread() for format or i/o error [Levin] +- Use malloc.h for OS/2 [Necasek] + +Changes in 1.2.2.3 (27 May 2005) +- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile +- Typecast fread() return values in gzio.c [Vollant] +- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) +- Fix crc check bug in gzread() after gzungetc() [Heiner] +- Add the deflateTune() function to adjust internal compression parameters +- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) +- Remove an incorrect assertion in examples/zpipe.c +- Add C++ wrapper in infback9.h [Donais] +- Fix bug in inflateCopy() when decoding fixed codes +- Note in zlib.h how much deflateSetDictionary() actually uses +- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) +- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] +- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] +- Add gzdirect() function to indicate transparent reads +- Update contrib/minizip [Vollant] +- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] +- Add casts in crc32.c to avoid warnings [Oberhumer] +- Add contrib/masmx64 [Vollant] +- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] + +Changes in 1.2.2.2 (30 December 2004) +- Replace structure assignments in deflate.c and inflate.c with zmemcpy to + avoid implicit memcpy calls (portability for no-library compilation) +- Increase sprintf() buffer size in gzdopen() to allow for large numbers +- Add INFLATE_STRICT to check distances against zlib header +- Improve WinCE errno handling and comments [Chang] +- Remove comment about no gzip header processing in FAQ +- Add Z_FIXED strategy option to deflateInit2() to force fixed trees +- Add updated make_vms.com [Coghlan], update README +- Create a new "examples" directory, move gzappend.c there, add zpipe.c, + fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. +- Add FAQ entry and comments in deflate.c on uninitialized memory access +- Add Solaris 9 make options in configure [Gilbert] +- Allow strerror() usage in gzio.c for STDC +- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] +- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] +- Use z_off_t for adler32_combine() and crc32_combine() lengths +- Make adler32() much faster for small len +- Use OS_CODE in deflate() default gzip header + +Changes in 1.2.2.1 (31 October 2004) +- Allow inflateSetDictionary() call for raw inflate +- Fix inflate header crc check bug for file names and comments +- Add deflateSetHeader() and gz_header structure for custom gzip headers +- Add inflateGetheader() to retrieve gzip headers +- Add crc32_combine() and adler32_combine() functions +- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list +- Use zstreamp consistently in zlib.h (inflate_back functions) +- Remove GUNZIP condition from definition of inflate_mode in inflate.h + and in contrib/inflate86/inffast.S [Truta, Anderson] +- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] +- Update projects/README.projects and projects/visualc6 [Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] +- Deprecate Z_ASCII; use Z_TEXT instead [Truta] +- Use a new algorithm for setting strm->data_type in trees.c [Truta] +- Do not define an exit() prototype in zutil.c unless DEBUG defined +- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] +- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() +- Fix Darwin build version identification [Peterson] + +Changes in 1.2.2 (3 October 2004) +- Update zlib.h comments on gzip in-memory processing +- Set adler to 1 in inflateReset() to support Java test suite [Walles] +- Add contrib/dotzlib [Ravn] +- Update win32/DLL_FAQ.txt [Truta] +- Update contrib/minizip [Vollant] +- Move contrib/visual-basic.txt to old/ [Truta] +- Fix assembler builds in projects/visualc6/ [Truta] + +Changes in 1.2.1.2 (9 September 2004) +- Update INDEX file +- Fix trees.c to update strm->data_type (no one ever noticed!) +- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] +- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) +- Add limited multitasking protection to DYNAMIC_CRC_TABLE +- Add NO_vsnprintf for VMS in zutil.h [Mozilla] +- Don't declare strerror() under VMS [Mozilla] +- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize +- Update contrib/ada [Anisimkov] +- Update contrib/minizip [Vollant] +- Fix configure to not hardcode directories for Darwin [Peterson] +- Fix gzio.c to not return error on empty files [Brown] +- Fix indentation; update version in contrib/delphi/ZLib.pas and + contrib/pascal/zlibpas.pas [Truta] +- Update mkasm.bat in contrib/masmx86 [Truta] +- Update contrib/untgz [Truta] +- Add projects/README.projects [Truta] +- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] +- Remove an unnecessary assignment to curr in inftrees.c [Truta] +- Add OS/2 to exe builds in configure [Poltorak] +- Remove err dummy parameter in zlib.h [Kientzle] + +Changes in 1.2.1.1 (9 January 2004) +- Update email address in README +- Several FAQ updates +- Fix a big fat bug in inftrees.c that prevented decoding valid + dynamic blocks with only literals and no distance codes -- + Thanks to "Hot Emu" for the bug report and sample file +- Add a note to puff.c on no distance codes case. + +Changes in 1.2.1 (17 November 2003) +- Remove a tab in contrib/gzappend/gzappend.c +- Update some interfaces in contrib for new zlib functions +- Update zlib version number in some contrib entries +- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] +- Support shared libraries on Hurd and KFreeBSD [Brown] +- Fix error in NO_DIVIDE option of adler32.c + +Changes in 1.2.0.8 (4 November 2003) +- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas +- Add experimental NO_DIVIDE #define in adler32.c + - Possibly faster on some processors (let me know if it is) +- Correct Z_BLOCK to not return on first inflate call if no wrap +- Fix strm->data_type on inflate() return to correctly indicate EOB +- Add deflatePrime() function for appending in the middle of a byte +- Add contrib/gzappend for an example of appending to a stream +- Update win32/DLL_FAQ.txt [Truta] +- Delete Turbo C comment in README [Truta] +- Improve some indentation in zconf.h [Truta] +- Fix infinite loop on bad input in configure script [Church] +- Fix gzeof() for concatenated gzip files [Johnson] +- Add example to contrib/visual-basic.txt [Michael B.] +- Add -p to mkdir's in Makefile.in [vda] +- Fix configure to properly detect presence or lack of printf functions +- Add AS400 support [Monnerat] +- Add a little Cygwin support [Wilson] + +Changes in 1.2.0.7 (21 September 2003) +- Correct some debug formats in contrib/infback9 +- Cast a type in a debug statement in trees.c +- Change search and replace delimiter in configure from % to # [Beebe] +- Update contrib/untgz to 0.2 with various fixes [Truta] +- Add build support for Amiga [Nikl] +- Remove some directories in old that have been updated to 1.2 +- Add dylib building for Mac OS X in configure and Makefile.in +- Remove old distribution stuff from Makefile +- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X +- Update links in README + +Changes in 1.2.0.6 (13 September 2003) +- Minor FAQ updates +- Update contrib/minizip to 1.00 [Vollant] +- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] +- Update POSTINC comment for 68060 [Nikl] +- Add contrib/infback9 with deflate64 decoding (unsupported) +- For MVS define NO_vsnprintf and undefine FAR [van Burik] +- Add pragma for fdopen on MVS [van Burik] + +Changes in 1.2.0.5 (8 September 2003) +- Add OF to inflateBackEnd() declaration in zlib.h +- Remember start when using gzdopen in the middle of a file +- Use internal off_t counters in gz* functions to properly handle seeks +- Perform more rigorous check for distance-too-far in inffast.c +- Add Z_BLOCK flush option to return from inflate at block boundary +- Set strm->data_type on return from inflate + - Indicate bits unused, if at block boundary, and if in last block +- Replace size_t with ptrdiff_t in crc32.c, and check for correct size +- Add condition so old NO_DEFLATE define still works for compatibility +- FAQ update regarding the Windows DLL [Truta] +- INDEX update: add qnx entry, remove aix entry [Truta] +- Install zlib.3 into mandir [Wilson] +- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] +- Adapt the zlib interface to the new DLL convention guidelines [Truta] +- Introduce ZLIB_WINAPI macro to allow the export of functions using + the WINAPI calling convention, for Visual Basic [Vollant, Truta] +- Update msdos and win32 scripts and makefiles [Truta] +- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] +- Add contrib/ada [Anisimkov] +- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] +- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] +- Add contrib/masm686 [Truta] +- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm + [Truta, Vollant] +- Update contrib/delphi; rename to contrib/pascal; add example [Truta] +- Remove contrib/delphi2; add a new contrib/delphi [Truta] +- Avoid inclusion of the nonstandard in contrib/iostream, + and fix some method prototypes [Truta] +- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip + [Truta] +- Avoid the use of backslash (\) in contrib/minizip [Vollant] +- Fix file time handling in contrib/untgz; update makefiles [Truta] +- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines + [Vollant] +- Remove contrib/vstudio/vc15_16 [Vollant] +- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] +- Update README.contrib [Truta] +- Invert the assignment order of match_head and s->prev[...] in + INSERT_STRING [Truta] +- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings + [Truta] +- Compare function pointers with 0, not with NULL or Z_NULL [Truta] +- Fix prototype of syncsearch in inflate.c [Truta] +- Introduce ASMINF macro to be enabled when using an ASM implementation + of inflate_fast [Truta] +- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] +- Modify test_gzio in example.c to take a single file name as a + parameter [Truta] +- Exit the example.c program if gzopen fails [Truta] +- Add type casts around strlen in example.c [Truta] +- Remove casting to sizeof in minigzip.c; give a proper type + to the variable compared with SUFFIX_LEN [Truta] +- Update definitions of STDC and STDC99 in zconf.h [Truta] +- Synchronize zconf.h with the new Windows DLL interface [Truta] +- Use SYS16BIT instead of __32BIT__ to distinguish between + 16- and 32-bit platforms [Truta] +- Use far memory allocators in small 16-bit memory models for + Turbo C [Truta] +- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in + zlibCompileFlags [Truta] +- Cygwin has vsnprintf [Wilson] +- In Windows16, OS_CODE is 0, as in MSDOS [Truta] +- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] + +Changes in 1.2.0.4 (10 August 2003) +- Minor FAQ updates +- Be more strict when checking inflateInit2's windowBits parameter +- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well +- Add gzip wrapper option to deflateInit2 using windowBits +- Add updated QNX rule in configure and qnx directory [Bonnefoy] +- Make inflate distance-too-far checks more rigorous +- Clean up FAR usage in inflate +- Add casting to sizeof() in gzio.c and minigzip.c + +Changes in 1.2.0.3 (19 July 2003) +- Fix silly error in gzungetc() implementation [Vollant] +- Update contrib/minizip and contrib/vstudio [Vollant] +- Fix printf format in example.c +- Correct cdecl support in zconf.in.h [Anisimkov] +- Minor FAQ updates + +Changes in 1.2.0.2 (13 July 2003) +- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons +- Attempt to avoid warnings in crc32.c for pointer-int conversion +- Add AIX to configure, remove aix directory [Bakker] +- Add some casts to minigzip.c +- Improve checking after insecure sprintf() or vsprintf() calls +- Remove #elif's from crc32.c +- Change leave label to inf_leave in inflate.c and infback.c to avoid + library conflicts +- Remove inflate gzip decoding by default--only enable gzip decoding by + special request for stricter backward compatibility +- Add zlibCompileFlags() function to return compilation information +- More typecasting in deflate.c to avoid warnings +- Remove leading underscore from _Capital #defines [Truta] +- Fix configure to link shared library when testing +- Add some Windows CE target adjustments [Mai] +- Remove #define ZLIB_DLL in zconf.h [Vollant] +- Add zlib.3 [Rodgers] +- Update RFC URL in deflate.c and algorithm.txt [Mai] +- Add zlib_dll_FAQ.txt to contrib [Truta] +- Add UL to some constants [Truta] +- Update minizip and vstudio [Vollant] +- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h +- Expand use of NO_DUMMY_DECL to avoid all dummy structures +- Added iostream3 to contrib [Schwardt] +- Replace rewind() with fseek() for WinCE [Truta] +- Improve setting of zlib format compression level flags + - Report 0 for huffman and rle strategies and for level == 0 or 1 + - Report 2 only for level == 6 +- Only deal with 64K limit when necessary at compile time [Truta] +- Allow TOO_FAR check to be turned off at compile time [Truta] +- Add gzclearerr() function [Souza] +- Add gzungetc() function + +Changes in 1.2.0.1 (17 March 2003) +- Add Z_RLE strategy for run-length encoding [Truta] + - When Z_RLE requested, restrict matches to distance one + - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE +- Correct FASTEST compilation to allow level == 0 +- Clean up what gets compiled for FASTEST +- Incorporate changes to zconf.in.h [Vollant] + - Refine detection of Turbo C need for dummy returns + - Refine ZLIB_DLL compilation + - Include additional header file on VMS for off_t typedef +- Try to use _vsnprintf where it supplants vsprintf [Vollant] +- Add some casts in inffast.c +- Enchance comments in zlib.h on what happens if gzprintf() tries to + write more than 4095 bytes before compression +- Remove unused state from inflateBackEnd() +- Remove exit(0) from minigzip.c, example.c +- Get rid of all those darn tabs +- Add "check" target to Makefile.in that does the same thing as "test" +- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in +- Update contrib/inflate86 [Anderson] +- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] +- Add msdos and win32 directories with makefiles [Truta] +- More additions and improvements to the FAQ + +Changes in 1.2.0 (9 March 2003) +- New and improved inflate code + - About 20% faster + - Does not allocate 32K window unless and until needed + - Automatically detects and decompresses gzip streams + - Raw inflate no longer needs an extra dummy byte at end + - Added inflateBack functions using a callback interface--even faster + than inflate, useful for file utilities (gzip, zip) + - Added inflateCopy() function to record state for random access on + externally generated deflate streams (e.g. in gzip files) + - More readable code (I hope) +- New and improved crc32() + - About 50% faster, thanks to suggestions from Rodney Brown +- Add deflateBound() and compressBound() functions +- Fix memory leak in deflateInit2() +- Permit setting dictionary for raw deflate (for parallel deflate) +- Fix const declaration for gzwrite() +- Check for some malloc() failures in gzio.c +- Fix bug in gzopen() on single-byte file 0x1f +- Fix bug in gzread() on concatenated file with 0x1f at end of buffer + and next buffer doesn't start with 0x8b +- Fix uncompress() to return Z_DATA_ERROR on truncated input +- Free memory at end of example.c +- Remove MAX #define in trees.c (conflicted with some libraries) +- Fix static const's in deflate.c, gzio.c, and zutil.[ch] +- Declare malloc() and free() in gzio.c if STDC not defined +- Use malloc() instead of calloc() in zutil.c if int big enough +- Define STDC for AIX +- Add aix/ with approach for compiling shared library on AIX +- Add HP-UX support for shared libraries in configure +- Add OpenUNIX support for shared libraries in configure +- Use $cc instead of gcc to build shared library +- Make prefix directory if needed when installing +- Correct Macintosh avoidance of typedef Byte in zconf.h +- Correct Turbo C memory allocation when under Linux +- Use libz.a instead of -lz in Makefile (assure use of compiled library) +- Update configure to check for snprintf or vsnprintf functions and their + return value, warn during make if using an insecure function +- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that + is lost when library is used--resolution is to build new zconf.h +- Documentation improvements (in zlib.h): + - Document raw deflate and inflate + - Update RFCs URL + - Point out that zlib and gzip formats are different + - Note that Z_BUF_ERROR is not fatal + - Document string limit for gzprintf() and possible buffer overflow + - Note requirement on avail_out when flushing + - Note permitted values of flush parameter of inflate() +- Add some FAQs (and even answers) to the FAQ +- Add contrib/inflate86/ for x86 faster inflate +- Add contrib/blast/ for PKWare Data Compression Library decompression +- Add contrib/puff/ simple inflate for deflate format description + +Changes in 1.1.4 (11 March 2002) +- ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in + http://www.zlib.org/advisory-2002-03-11.txt +- Returned incorrect error (Z_MEM_ERROR) on some invalid data +- Avoid accesses before window for invalid distances with inflate window + less than 32K. +- force windowBits > 8 to avoid a bug in the encoder for a window size + of 256 bytes. (A complete fix will be available in 1.1.5). + +Changes in 1.1.3 (9 July 1998) +- fix "an inflate input buffer bug that shows up on rare but persistent + occasions" (Mark) +- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) +- fix gzseek(..., SEEK_SET) in write mode +- fix crc check after a gzeek (Frank Faubert) +- fix miniunzip when the last entry in a zip file is itself a zip file + (J Lillge) +- add contrib/asm586 and contrib/asm686 (Brian Raiter) + See http://www.muppetlabs.com/~breadbox/software/assembly.html +- add support for Delphi 3 in contrib/delphi (Bob Dellaca) +- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) +- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) +- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) +- added a FAQ file + +- Support gzdopen on Mac with Metrowerks (Jason Linhart) +- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) +- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) +- avoid some warnings with Borland C (Tom Tanner) +- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) +- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) +- allow several arguments to configure (Tim Mooney, Frodo Looijaard) +- use libdir and includedir in Makefile.in (Tim Mooney) +- support shared libraries on OSF1 V4 (Tim Mooney) +- remove so_locations in "make clean" (Tim Mooney) +- fix maketree.c compilation error (Glenn, Mark) +- Python interface to zlib now in Python 1.5 (Jeremy Hylton) +- new Makefile.riscos (Rich Walker) +- initialize static descriptors in trees.c for embedded targets (Nick Smith) +- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) +- add the OS/2 files in Makefile.in too (Andrew Zabolotny) +- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) +- fix maketree.c to allow clean compilation of inffixed.h (Mark) +- fix parameter check in deflateCopy (Gunther Nikl) +- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) +- Many portability patches by Christian Spieler: + . zutil.c, zutil.h: added "const" for zmem* + . Make_vms.com: fixed some typos + . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists + . msdos/Makefile.msc: remove "default rtl link library" info from obj files + . msdos/Makefile.*: use model-dependent name for the built zlib library + . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: + new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) +- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) +- replace __far with _far for better portability (Christian Spieler, Tom Lane) +- fix test for errno.h in configure (Tim Newsham) + +Changes in 1.1.2 (19 March 98) +- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) + See http://www.winimage.com/zLibDll/unzip.html +- preinitialize the inflate tables for fixed codes, to make the code + completely thread safe (Mark) +- some simplifications and slight speed-up to the inflate code (Mark) +- fix gzeof on non-compressed files (Allan Schrum) +- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) +- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) +- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) +- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) +- do not wrap extern "C" around system includes (Tom Lane) +- mention zlib binding for TCL in README (Andreas Kupries) +- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) +- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) +- allow "configure --prefix $HOME" (Tim Mooney) +- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) +- move Makefile.sas to amiga/Makefile.sas + +Changes in 1.1.1 (27 Feb 98) +- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) +- remove block truncation heuristic which had very marginal effect for zlib + (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the + compression ratio on some files. This also allows inlining _tr_tally for + matches in deflate_slow. +- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) + +Changes in 1.1.0 (24 Feb 98) +- do not return STREAM_END prematurely in inflate (John Bowler) +- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) +- compile with -DFASTEST to get compression code optimized for speed only +- in minigzip, try mmap'ing the input file first (Miguel Albrecht) +- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain + on Sun but significant on HP) + +- add a pointer to experimental unzip library in README (Gilles Vollant) +- initialize variable gcc in configure (Chris Herborth) + +Changes in 1.0.9 (17 Feb 1998) +- added gzputs and gzgets functions +- do not clear eof flag in gzseek (Mark Diekhans) +- fix gzseek for files in transparent mode (Mark Diekhans) +- do not assume that vsprintf returns the number of bytes written (Jens Krinke) +- replace EXPORT with ZEXPORT to avoid conflict with other programs +- added compress2 in zconf.h, zlib.def, zlib.dnt +- new asm code from Gilles Vollant in contrib/asm386 +- simplify the inflate code (Mark): + . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() + . ZALLOC the length list in inflate_trees_fixed() instead of using stack + . ZALLOC the value area for huft_build() instead of using stack + . Simplify Z_FINISH check in inflate() + +- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 +- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) +- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with + the declaration of FAR (Gilles VOllant) +- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) +- read_buf buf parameter of type Bytef* instead of charf* +- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) +- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) +- fix check for presence of directories in "make install" (Ian Willis) + +Changes in 1.0.8 (27 Jan 1998) +- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) +- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) +- added compress2() to allow setting the compression level +- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) +- use constant arrays for the static trees in trees.c instead of computing + them at run time (thanks to Ken Raeburn for this suggestion). To create + trees.h, compile with GEN_TREES_H and run "make test". +- check return code of example in "make test" and display result +- pass minigzip command line options to file_compress +- simplifying code of inflateSync to avoid gcc 2.8 bug + +- support CC="gcc -Wall" in configure -s (QingLong) +- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) +- fix test for shared library support to avoid compiler warnings +- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) +- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) +- do not use fdopen for Metrowerks on Mac (Brad Pettit)) +- add checks for gzputc and gzputc in example.c +- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) +- use const for the CRC table (Ken Raeburn) +- fixed "make uninstall" for shared libraries +- use Tracev instead of Trace in infblock.c +- in example.c use correct compressed length for test_sync +- suppress +vnocompatwarnings in configure for HPUX (not always supported) + +Changes in 1.0.7 (20 Jan 1998) +- fix gzseek which was broken in write mode +- return error for gzseek to negative absolute position +- fix configure for Linux (Chun-Chung Chen) +- increase stack space for MSC (Tim Wegner) +- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) +- define EXPORTVA for gzprintf (Gilles Vollant) +- added man page zlib.3 (Rick Rodgers) +- for contrib/untgz, fix makedir() and improve Makefile + +- check gzseek in write mode in example.c +- allocate extra buffer for seeks only if gzseek is actually called +- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) +- add inflateSyncPoint in zconf.h +- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def + +Changes in 1.0.6 (19 Jan 1998) +- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and + gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) +- Fix a deflate bug occurring only with compression level 0 (thanks to + Andy Buckler for finding this one). +- In minigzip, pass transparently also the first byte for .Z files. +- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() +- check Z_FINISH in inflate (thanks to Marc Schluper) +- Implement deflateCopy (thanks to Adam Costello) +- make static libraries by default in configure, add --shared option. +- move MSDOS or Windows specific files to directory msdos +- suppress the notion of partial flush to simplify the interface + (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) +- suppress history buffer provided by application to simplify the interface + (this feature was not implemented anyway in 1.0.4) +- next_in and avail_in must be initialized before calling inflateInit or + inflateInit2 +- add EXPORT in all exported functions (for Windows DLL) +- added Makefile.nt (thanks to Stephen Williams) +- added the unsupported "contrib" directory: + contrib/asm386/ by Gilles Vollant + 386 asm code replacing longest_match(). + contrib/iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + contrib/iostream2/ by Tyge Løvset + Another C++ I/O streams interface + contrib/untgz/ by "Pedro A. Aranda Guti\irrez" + A very simple tar.gz file extractor using zlib + contrib/visual-basic.txt by Carlos Rios + How to use compress(), uncompress() and the gz* functions from VB. +- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression + level) in minigzip (thanks to Tom Lane) + +- use const for rommable constants in deflate +- added test for gzseek and gztell in example.c +- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) +- add undocumented function zError to convert error code to string + (for Tim Smithers) +- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. +- Use default memcpy for Symantec MSDOS compiler. +- Add EXPORT keyword for check_func (needed for Windows DLL) +- add current directory to LD_LIBRARY_PATH for "make test" +- create also a link for libz.so.1 +- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) +- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) +- added -soname for Linux in configure (Chun-Chung Chen, +- assign numbers to the exported functions in zlib.def (for Windows DLL) +- add advice in zlib.h for best usage of deflateSetDictionary +- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) +- allow compilation with ANSI keywords only enabled for TurboC in large model +- avoid "versionString"[0] (Borland bug) +- add NEED_DUMMY_RETURN for Borland +- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +- allow compilation with CC +- defined STDC for OS/2 (David Charlap) +- limit external names to 8 chars for MVS (Thomas Lund) +- in minigzip.c, use static buffers only for 16-bit systems +- fix suffix check for "minigzip -d foo.gz" +- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) +- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) +- added makelcc.bat for lcc-win32 (Tom St Denis) +- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) +- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +- check for unistd.h in configure (for off_t) +- remove useless check parameter in inflate_blocks_free +- avoid useless assignment of s->check to itself in inflate_blocks_new +- do not flush twice in gzclose (thanks to Ken Raeburn) +- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h +- use NO_ERRNO_H instead of enumeration of operating systems with errno.h +- work around buggy fclose on pipes for HP/UX +- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) +- fix configure if CC is already equal to gcc + +Changes in 1.0.5 (3 Jan 98) +- Fix inflate to terminate gracefully when fed corrupted or invalid data +- Use const for rommable constants in inflate +- Eliminate memory leaks on error conditions in inflate +- Removed some vestigial code in inflate +- Update web address in README + +Changes in 1.0.4 (24 Jul 96) +- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF + bit, so the decompressor could decompress all the correct data but went + on to attempt decompressing extra garbage data. This affected minigzip too. +- zlibVersion and gzerror return const char* (needed for DLL) +- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) +- use z_error only for DEBUG (avoid problem with DLLs) + +Changes in 1.0.3 (2 Jul 96) +- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS + small and medium models; this makes the library incompatible with previous + versions for these models. (No effect in large model or on other systems.) +- return OK instead of BUF_ERROR if previous deflate call returned with + avail_out as zero but there is nothing to do +- added memcmp for non STDC compilers +- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) +- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) +- better check for 16-bit mode MSC (avoids problem with Symantec) + +Changes in 1.0.2 (23 May 96) +- added Windows DLL support +- added a function zlibVersion (for the DLL support) +- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) +- Bytef is define's instead of typedef'd only for Borland C +- avoid reading uninitialized memory in example.c +- mention in README that the zlib format is now RFC1950 +- updated Makefile.dj2 +- added algorithm.doc + +Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] +- fix array overlay in deflate.c which sometimes caused bad compressed data +- fix inflate bug with empty stored block +- fix MSDOS medium model which was broken in 0.99 +- fix deflateParams() which could generated bad compressed data. +- Bytef is define'd instead of typedef'ed (work around Borland bug) +- added an INDEX file +- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), + Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) +- speed up adler32 for modern machines without auto-increment +- added -ansi for IRIX in configure +- static_init_done in trees.c is an int +- define unlink as delete for VMS +- fix configure for QNX +- add configure branch for SCO and HPUX +- avoid many warnings (unused variables, dead assignments, etc...) +- no fdopen for BeOS +- fix the Watcom fix for 32 bit mode (define FAR as empty) +- removed redefinition of Byte for MKWERKS +- work around an MWKERKS bug (incorrect merge of all .h files) + +Changes in 0.99 (27 Jan 96) +- allow preset dictionary shared between compressor and decompressor +- allow compression level 0 (no compression) +- add deflateParams in zlib.h: allow dynamic change of compression level + and compression strategy. +- test large buffers and deflateParams in example.c +- add optional "configure" to build zlib as a shared library +- suppress Makefile.qnx, use configure instead +- fixed deflate for 64-bit systems (detected on Cray) +- fixed inflate_blocks for 64-bit systems (detected on Alpha) +- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) +- always return Z_BUF_ERROR when deflate() has nothing to do +- deflateInit and inflateInit are now macros to allow version checking +- prefix all global functions and types with z_ with -DZ_PREFIX +- make falloc completely reentrant (inftrees.c) +- fixed very unlikely race condition in ct_static_init +- free in reverse order of allocation to help memory manager +- use zlib-1.0/* instead of zlib/* inside the tar.gz +- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith + -Wconversion -Wstrict-prototypes -Wmissing-prototypes" +- allow gzread on concatenated .gz files +- deflateEnd now returns Z_DATA_ERROR if it was premature +- deflate is finally (?) fully deterministic (no matches beyond end of input) +- Document Z_SYNC_FLUSH +- add uninstall in Makefile +- Check for __cpluplus in zlib.h +- Better test in ct_align for partial flush +- avoid harmless warnings for Borland C++ +- initialize hash_head in deflate.c +- avoid warning on fdopen (gzio.c) for HP cc -Aa +- include stdlib.h for STDC compilers +- include errno.h for Cray +- ignore error if ranlib doesn't exist +- call ranlib twice for NeXTSTEP +- use exec_prefix instead of prefix for libz.a +- renamed ct_* as _tr_* to avoid conflict with applications +- clear z->msg in inflateInit2 before any error return +- initialize opaque in example.c, gzio.c, deflate.c and inflate.c +- fixed typo in zconf.h (_GNUC__ => __GNUC__) +- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) +- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) +- in fcalloc, normalize pointer if size > 65520 bytes +- don't use special fcalloc for 32 bit Borland C++ +- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +- use Z_BINARY instead of BINARY +- document that gzclose after gzdopen will close the file +- allow "a" as mode in gzopen. +- fix error checking in gzread +- allow skipping .gz extra-field on pipes +- added reference to Perl interface in README +- put the crc table in FAR data (I dislike more and more the medium model :) +- added get_crc_table +- added a dimension to all arrays (Borland C can't count). +- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast +- guard against multiple inclusion of *.h (for precompiled header on Mac) +- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +- don't use unsized arrays to avoid silly warnings by Visual C++: + warning C4746: 'inflate_mask' : unsized array treated as '__far' + (what's wrong with far data in far model?). +- define enum out of inflate_blocks_state to allow compilation with C++ + +Changes in 0.95 (16 Aug 95) +- fix MSDOS small and medium model (now easier to adapt to any compiler) +- inlined send_bits +- fix the final (:-) bug for deflate with flush (output was correct but + not completely flushed in rare occasions). +- default window size is same for compression and decompression + (it's now sufficient to set MAX_WBITS in zconf.h). +- voidp -> voidpf and voidnp -> voidp (for consistency with other + typedefs and because voidnp was not near in large model). + +Changes in 0.94 (13 Aug 95) +- support MSDOS medium model +- fix deflate with flush (could sometimes generate bad output) +- fix deflateReset (zlib header was incorrectly suppressed) +- added support for VMS +- allow a compression level in gzopen() +- gzflush now calls fflush +- For deflate with flush, flush even if no more input is provided. +- rename libgz.a as libz.a +- avoid complex expression in infcodes.c triggering Turbo C bug +- work around a problem with gcc on Alpha (in INSERT_STRING) +- don't use inline functions (problem with some gcc versions) +- allow renaming of Byte, uInt, etc... with #define. +- avoid warning about (unused) pointer before start of array in deflate.c +- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c +- avoid reserved word 'new' in trees.c + +Changes in 0.93 (25 June 95) +- temporarily disable inline functions +- make deflate deterministic +- give enough lookahead for PARTIAL_FLUSH +- Set binary mode for stdin/stdout in minigzip.c for OS/2 +- don't even use signed char in inflate (not portable enough) +- fix inflate memory leak for segmented architectures + +Changes in 0.92 (3 May 95) +- don't assume that char is signed (problem on SGI) +- Clear bit buffer when starting a stored block +- no memcpy on Pyramid +- suppressed inftest.c +- optimized fill_window, put longest_match inline for gcc +- optimized inflate on stored blocks. +- untabify all sources to simplify patches + +Changes in 0.91 (2 May 95) +- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h +- Document the memory requirements in zconf.h +- added "make install" +- fix sync search logic in inflateSync +- deflate(Z_FULL_FLUSH) now works even if output buffer too short +- after inflateSync, don't scare people with just "lo world" +- added support for DJGPP + +Changes in 0.9 (1 May 95) +- don't assume that zalloc clears the allocated memory (the TurboC bug + was Mark's bug after all :) +- let again gzread copy uncompressed data unchanged (was working in 0.71) +- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented +- added a test of inflateSync in example.c +- moved MAX_WBITS to zconf.h because users might want to change that. +- document explicitly that zalloc(64K) on MSDOS must return a normalized + pointer (zero offset) +- added Makefiles for Microsoft C, Turbo C, Borland C++ +- faster crc32() + +Changes in 0.8 (29 April 95) +- added fast inflate (inffast.c) +- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this + is incompatible with previous versions of zlib which returned Z_OK. +- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) + (actually that was not a compiler bug, see 0.81 above) +- gzread no longer reads one extra byte in certain cases +- In gzio destroy(), don't reference a freed structure +- avoid many warnings for MSDOS +- avoid the ERROR symbol which is used by MS Windows + +Changes in 0.71 (14 April 95) +- Fixed more MSDOS compilation problems :( There is still a bug with + TurboC large model. + +Changes in 0.7 (14 April 95) +- Added full inflate support. +- Simplified the crc32() interface. The pre- and post-conditioning + (one's complement) is now done inside crc32(). WARNING: this is + incompatible with previous versions; see zlib.h for the new usage. + +Changes in 0.61 (12 April 95) +- workaround for a bug in TurboC. example and minigzip now work on MSDOS. + +Changes in 0.6 (11 April 95) +- added minigzip.c +- added gzdopen to reopen a file descriptor as gzFile +- added transparent reading of non-gziped files in gzread. +- fixed bug in gzread (don't read crc as data) +- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +- don't allocate big arrays in the stack (for MSDOS) +- fix some MSDOS compilation problems + +Changes in 0.5: +- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but + not yet Z_FULL_FLUSH. +- support decompression but only in a single step (forced Z_FINISH) +- added opaque object for zalloc and zfree. +- added deflateReset and inflateReset +- added a variable zlib_version for consistency checking. +- renamed the 'filter' parameter of deflateInit2 as 'strategy'. + Added Z_FILTERED and Z_HUFFMAN_ONLY constants. + +Changes in 0.4: +- avoid "zip" everywhere, use zlib instead of ziplib. +- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush + if compression method == 8. +- added adler32 and crc32 +- renamed deflateOptions as deflateInit2, call one or the other but not both +- added the method parameter for deflateInit2. +- added inflateInit2 +- simplied considerably deflateInit and inflateInit by not supporting + user-provided history buffer. This is supported only in deflateInit2 + and inflateInit2. + +Changes in 0.3: +- prefix all macro names with Z_ +- use Z_FINISH instead of deflateEnd to finish compression. +- added Z_HUFFMAN_ONLY +- added gzerror() diff --git a/3rdparty/zlib/README b/3rdparty/zlib/README index 09070e2c0..6f1255ffe 100644 --- a/3rdparty/zlib/README +++ b/3rdparty/zlib/README @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.6 is a general purpose data compression library. All the code is +zlib 1.2.7 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and @@ -31,7 +31,7 @@ Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at http://marknelson.us/1997/01/01/zlib-engine/ . -The changes made in version 1.2.6 are documented in the file ChangeLog. +The changes made in version 1.2.7 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . diff --git a/3rdparty/zlib/crc32.c b/3rdparty/zlib/crc32.c index c12471e61..979a7190a 100644 --- a/3rdparty/zlib/crc32.c +++ b/3rdparty/zlib/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011 Mark Adler + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster @@ -32,39 +32,17 @@ #define local static -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - /* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif #ifdef BYFOUR - typedef u4 crc_table_t; -# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, unsigned)); # define TBLS 8 #else - typedef unsigned long crc_table_t; # define TBLS 1 #endif /* BYFOUR */ @@ -78,10 +56,10 @@ local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); #ifdef DYNAMIC_CRC_TABLE local volatile int crc_table_empty = 1; -local crc_table_t FAR crc_table[TBLS][256]; +local z_crc_t FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH - local void write_table OF((FILE *, const crc_table_t FAR *)); + local void write_table OF((FILE *, const z_crc_t FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: @@ -111,9 +89,9 @@ local void make_crc_table OF((void)); */ local void make_crc_table() { - crc_table_t c; + z_crc_t c; int n, k; - crc_table_t poly; /* polynomial exclusive-or pattern */ + z_crc_t poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static volatile int first = 1; /* flag to limit concurrent making */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; @@ -127,11 +105,11 @@ local void make_crc_table() /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0; for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (crc_table_t)1 << (31 - p[n]); + poly |= (z_crc_t)1 << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { - c = (crc_table_t)n; + c = (z_crc_t)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; @@ -142,11 +120,11 @@ local void make_crc_table() and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; - crc_table[4][n] = REV(c); + crc_table[4][n] = ZSWAP32(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); + crc_table[k + 4][n] = ZSWAP32(c); } } #endif /* BYFOUR */ @@ -168,7 +146,7 @@ local void make_crc_table() if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const crc_table_t FAR "); + fprintf(out, "local const z_crc_t FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR @@ -188,7 +166,7 @@ local void make_crc_table() #ifdef MAKECRCH local void write_table(out, table) FILE *out; - const crc_table_t FAR *table; + const z_crc_t FAR *table; { int n; @@ -209,13 +187,13 @@ local void write_table(out, table) /* ========================================================================= * This function can be used by asm versions of crc32() */ -const unsigned long FAR * ZEXPORT get_crc_table() +const z_crc_t FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; + return (const z_crc_t FAR *)crc_table; } /* ========================================================================= */ @@ -237,7 +215,7 @@ unsigned long ZEXPORT crc32(crc, buf, len) #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; + z_crc_t endian; endian = 1; if (*((unsigned char *)(&endian))) @@ -271,17 +249,17 @@ local unsigned long crc32_little(crc, buf, len) const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = (u4)crc; + c = (z_crc_t)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; @@ -311,17 +289,17 @@ local unsigned long crc32_big(crc, buf, len) const unsigned char FAR *buf; unsigned len; { - register u4 c; - register const u4 FAR *buf4; + register z_crc_t c; + register const z_crc_t FAR *buf4; - c = REV((u4)crc); + c = ZSWAP32((z_crc_t)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } - buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; buf4--; while (len >= 32) { DOBIG32; @@ -338,7 +316,7 @@ local unsigned long crc32_big(crc, buf, len) c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; - return (unsigned long)(REV(c)); + return (unsigned long)(ZSWAP32(c)); } #endif /* BYFOUR */ diff --git a/3rdparty/zlib/crc32.h b/3rdparty/zlib/crc32.h index c3e7171c5..9e0c77810 100644 --- a/3rdparty/zlib/crc32.h +++ b/3rdparty/zlib/crc32.h @@ -2,7 +2,7 @@ * Generated automatically by crc32.c */ -local const crc_table_t FAR crc_table[TBLS][256] = +local const z_crc_t FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, diff --git a/3rdparty/zlib/deflate.c b/3rdparty/zlib/deflate.c index 8bd480eb6..9e4c2cbc8 100644 --- a/3rdparty/zlib/deflate.c +++ b/3rdparty/zlib/deflate.c @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.6 Copyright 1995-2012 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.7 Copyright 1995-2012 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot diff --git a/3rdparty/zlib/gzguts.h b/3rdparty/zlib/gzguts.h index 3107c363b..ee3f281aa 100644 --- a/3rdparty/zlib/gzguts.h +++ b/3rdparty/zlib/gzguts.h @@ -12,7 +12,7 @@ # endif #endif -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -27,7 +27,11 @@ #endif #include -#ifdef __TURBOC__ +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) # include #endif @@ -66,7 +70,6 @@ /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) # if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) -# include # define vsnprintf _vsnprintf # endif # endif @@ -101,7 +104,7 @@ # include # define zstrerror() gz_strwinerror((DWORD)GetLastError()) #else -# ifdef STDC +# ifndef NO_STRERROR # include # define zstrerror() strerror(errno) # else diff --git a/3rdparty/zlib/gzlib.c b/3rdparty/zlib/gzlib.c index 7aedab8e2..ca55c6ea9 100644 --- a/3rdparty/zlib/gzlib.c +++ b/3rdparty/zlib/gzlib.c @@ -1,5 +1,5 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010, 2011 Mark Adler + * Copyright (C) 2004, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -17,7 +17,7 @@ /* Local functions */ local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const char *, int, const char *)); +local gzFile gz_open OF((const void *, int, const char *)); #if defined UNDER_CE @@ -89,11 +89,19 @@ local void gz_reset(state) /* Open a gzip file either by name or file descriptor. */ local gzFile gz_open(path, fd, mode) - const char *path; + const void *path; int fd; const char *mode; { gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif /* check input */ if (path == NULL) @@ -133,6 +141,16 @@ local gzFile gz_open(path, fd, mode) return NULL; case 'b': /* ignore -- will request binary anyway */ break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif case 'f': state->strategy = Z_FILTERED; break; @@ -168,29 +186,57 @@ local gzFile gz_open(path, fd, mode) } /* save the path name for error messages */ - state->path = malloc(strlen(path) + 1); +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen(path); + state->path = malloc(len + 1); if (state->path == NULL) { free(state); return NULL; } - strcpy(state->path, path); +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif + strcpy(state->path, path); - /* open the file with the appropriate mode (or just use fd) */ - state->fd = fd != -1 ? fd : - open(path, + /* compute the flags for open() */ + oflag = #ifdef O_LARGEFILE - O_LARGEFILE | + O_LARGEFILE | #endif #ifdef O_BINARY - O_BINARY | + O_BINARY | #endif - (state->mode == GZ_READ ? - O_RDONLY : - (O_WRONLY | O_CREAT | ( - state->mode == GZ_WRITE ? - O_TRUNC : - O_APPEND))), - 0666); +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open(path, oflag, 0666)); if (state->fd == -1) { free(state->path); free(state); @@ -244,6 +290,16 @@ gzFile ZEXPORT gzdopen(fd, mode) return gz; } +/* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + /* -- see zlib.h -- */ int ZEXPORT gzbuffer(file, size) gzFile file; diff --git a/3rdparty/zlib/gzread.c b/3rdparty/zlib/gzread.c index 46d40e0bb..3493d34d4 100644 --- a/3rdparty/zlib/gzread.c +++ b/3rdparty/zlib/gzread.c @@ -1,5 +1,5 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -57,8 +57,13 @@ local int gz_avail(state) if (state->err != Z_OK && state->err != Z_BUF_ERROR) return -1; if (state->eof == 0) { - if (strm->avail_in) - memmove(state->in, strm->next_in, strm->avail_in); + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in, *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } if (gz_load(state, state->in + strm->avail_in, state->size - strm->avail_in, &got) == -1) return -1; @@ -340,7 +345,7 @@ int ZEXPORT gzread(file, buf, len) /* get more output, looking for header if required */ if (gz_fetch(state) == -1) return -1; - continue; /* no progress yet -- go back to memcpy() above */ + continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ } @@ -373,7 +378,8 @@ int ZEXPORT gzread(file, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzgetc_(file) +#undef gzgetc +int ZEXPORT gzgetc(file) gzFile file; { int ret; @@ -402,12 +408,11 @@ int ZEXPORT gzgetc_(file) return ret < 1 ? -1 : buf[0]; } -#undef gzgetc -int ZEXPORT gzgetc(file) +int ZEXPORT gzgetc_(file) gzFile file; { - return gzgetc_(file); -} + return gzgetc(file); +} /* -- see zlib.h -- */ int ZEXPORT gzungetc(c, file) diff --git a/3rdparty/zlib/gzwrite.c b/3rdparty/zlib/gzwrite.c index caa35b61a..27cb3428e 100644 --- a/3rdparty/zlib/gzwrite.c +++ b/3rdparty/zlib/gzwrite.c @@ -338,19 +338,19 @@ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void - (void)vsprintf(state->in, format, va); + (void)vsprintf((char *)(state->in), format, va); va_end(va); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else - len = vsprintf(state->in, format, va); + len = vsprintf((char *)(state->in), format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void - (void)vsnprintf(state->in, size, format, va); + (void)vsnprintf((char *)(state->in), size, format, va); va_end(va); - len = strlen(state->in); + len = strlen((char *)(state->in)); # else len = vsnprintf((char *)(state->in), size, format, va); va_end(va); @@ -416,22 +416,23 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, state->in[size - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void - sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < size; len++) if (state->in[len] == 0) break; # else - len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void - snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(state->in); + len = strlen((char *)(state->in)); # else - len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); # endif #endif @@ -546,13 +547,15 @@ int ZEXPORT gzclose_w(file) } /* flush, free memory, and close file */ - if (gz_comp(state, Z_FINISH) == -1) - ret = state->err; - if (!state->direct) { - (void)deflateEnd(&(state->strm)); - free(state->out); + if (state->size) { + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); } - free(state->in); gz_error(state, Z_OK, NULL); free(state->path); if (close(state->fd) == -1) @@ -560,34 +563,3 @@ int ZEXPORT gzclose_w(file) free(state); return ret; } - -/* used by zlibVersion() to get the vsnprintf story from the horse's mouth */ -unsigned long ZEXPORT gzflags() -{ - unsigned long flags = 0; -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -} diff --git a/3rdparty/zlib/inflate.c b/3rdparty/zlib/inflate.c index cc89517bc..47418a1e1 100644 --- a/3rdparty/zlib/inflate.c +++ b/3rdparty/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2011 Mark Adler + * Copyright (C) 1995-2012 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -519,11 +519,6 @@ unsigned out; bits -= bits & 7; \ } while (0) -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is @@ -817,7 +812,7 @@ int flush; #endif case DICTID: NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); + strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; case DICT: @@ -1189,7 +1184,7 @@ int flush; #ifdef GUNZIP state->flags ? hold : #endif - REVERSE(hold)) != state->check) { + ZSWAP32(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; @@ -1275,7 +1270,7 @@ const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; - unsigned long id; + unsigned long dictid; unsigned char *next; unsigned avail; int ret; @@ -1286,11 +1281,11 @@ uInt dictLength; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; - /* check for correct dictionary id */ + /* check for correct dictionary identifier */ if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) return Z_DATA_ERROR; } diff --git a/3rdparty/zlib/inftrees.c b/3rdparty/zlib/inftrees.c index 60bbd58bf..abcd7c45e 100644 --- a/3rdparty/zlib/inftrees.c +++ b/3rdparty/zlib/inftrees.c @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.6 Copyright 1995-2012 Mark Adler "; + " inflate 1.2.7 Copyright 1995-2012 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 69}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 78, 68}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/3rdparty/zlib/zconf.h.cmakein b/3rdparty/zlib/zconf.h.cmakein index 6d3ea59ea..1e4e14045 100644 --- a/3rdparty/zlib/zconf.h.cmakein +++ b/3rdparty/zlib/zconf.h.cmakein @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2011 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -67,7 +67,6 @@ # define gzdopen z_gzdopen # define gzeof z_gzeof # define gzerror z_gzerror -# define gzflags z_gzflags # define gzflush z_gzflush # define gzgetc z_gzgetc # define gzgetc_ z_gzgetc_ @@ -76,6 +75,9 @@ # define gzoffset64 z_gzoffset64 # define gzopen z_gzopen # define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif # define gzprintf z_gzprintf # define gzputc z_gzputc # define gzputs z_gzputs @@ -129,9 +131,9 @@ # define free_func z_free_func # ifndef Z_SOLO # define gzFile z_gzFile -# define gz_header z_gz_header -# define gz_headerp z_gz_headerp # endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp # define in_func z_in_func # define intf z_intf # define out_func z_out_func @@ -144,9 +146,7 @@ # define voidpf z_voidpf /* all zlib structs in zlib.h and zconf.h */ -# ifndef Z_SOLO -# define gz_header_s z_gz_header_s -# endif +# define gz_header_s z_gz_header_s # define internal_state z_internal_state #endif @@ -390,6 +390,29 @@ typedef uLong FAR uLongf; typedef Byte *voidp; #endif +/* ./configure may #define Z_U4 here */ + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# else +# if (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# else +# if (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +# endif +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif @@ -404,36 +427,47 @@ typedef uLong FAR uLongf; # endif #endif +#ifdef _WIN32 +# include /* for wchar_t */ +#endif + /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even * though the former does not conform to the LFS document), but considering * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ -#if defined _LARGEFILE64_SOURCE && -_LARGEFILE64_SOURCE - -1 == 1 +#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif -#ifndef _LFS64_LARGEFILE +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#else # define _LFS64_LARGEFILE 0 #endif -#ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 0 +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 #endif -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 -# define Z_LARGE -#endif - -#if (defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE)) && !defined(Z_SOLO) -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t -# endif +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 #endif #if !defined(SEEK_SET) && !defined(Z_SOLO) @@ -446,14 +480,14 @@ typedef uLong FAR uLongf; # define z_off_t long #endif -#if !defined(_WIN32) && (defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0) +#if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# if defined(_WIN32) +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) # define z_off64_t __int64 # else -# define z_off64_t z_off_t -#endif +# define z_off64_t z_off_t +# endif #endif /* MVS linker does not support external names larger than 8 bytes */ diff --git a/3rdparty/zlib/zlib.h b/3rdparty/zlib/zlib.h index 79142d117..3edf3acdb 100644 --- a/3rdparty/zlib/zlib.h +++ b/3rdparty/zlib/zlib.h @@ -1,5 +1,5 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.6, January 29th, 2012 + version 1.2.7, May 2nd, 2012 Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.6" -#define ZLIB_VERNUM 0x1260 +#define ZLIB_VERSION "1.2.7" +#define ZLIB_VERNUM 0x1270 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 6 +#define ZLIB_VER_REVISION 7 #define ZLIB_VER_SUBREVISION 0 /* @@ -452,14 +452,17 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all the uncompressed data. (The size - of the uncompressed data may have been saved by the compressor for this - purpose.) The next operation on this stream must be inflateEnd to deallocate - the decompression state. The use of Z_FINISH is not required to perform an - inflation in one step. However it may be used to inform inflate that a - faster approach can be used for the single inflate() call. Z_FINISH also - informs inflate to not maintain a sliding window if the stream completes, - which reduces inflate's memory footprint. + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the @@ -1217,7 +1220,10 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since - reading and writing to the same gzip file is not supported. + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. These functions, as well as gzip, will read and decode a sequence of gzip streams in a file. The append function of gzopen() can be used to create @@ -1578,9 +1584,8 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the for the crc. Pre- and post-conditioning (one's - complement) is performed within this function so it shouldn't be done by the - application. + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. Usage example: @@ -1650,9 +1655,15 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); -#define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc_(g)) +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if @@ -1660,7 +1671,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); * functions are changed to 64 bits) -- in case these are set on systems * without large file support, _LFS64_LARGEFILE must also be true */ -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +#ifdef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); @@ -1669,7 +1680,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif -#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) # ifdef Z_PREFIX_SET # define z_gzopen z_gzopen64 # define z_gzseek z_gzseek64 @@ -1685,7 +1696,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 # endif -# ifndef _LARGEFILE64_SOURCE +# ifndef Z_LARGE64 ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); @@ -1717,12 +1728,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#ifndef Z_SOLO - ZEXTERN unsigned long ZEXPORT gzflags OF((void)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); #endif #ifdef __cplusplus diff --git a/3rdparty/zlib/zutil.c b/3rdparty/zlib/zutil.c index 8a1d24209..65e0d3b72 100644 --- a/3rdparty/zlib/zutil.c +++ b/3rdparty/zlib/zutil.c @@ -1,11 +1,14 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010, 2011 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ @@ -85,11 +88,31 @@ uLong ZEXPORT zlibCompileFlags() #ifdef FASTEST flags += 1L << 21; #endif -#ifdef Z_SOLO - return flags; +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif #else - return flags + gzflags(); + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif #endif + return flags; } #ifdef DEBUG diff --git a/3rdparty/zlib/zutil.h b/3rdparty/zlib/zutil.h index dff1112fe..4e3dcc6ae 100644 --- a/3rdparty/zlib/zutil.h +++ b/3rdparty/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2011 Jean-loup Gailly. + * Copyright (C) 1995-2012 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -13,7 +13,7 @@ #ifndef ZUTIL_H #define ZUTIL_H -#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +#ifdef HAVE_HIDDEN # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) #else # define ZLIB_INTERNAL @@ -245,4 +245,8 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + #endif /* ZUTIL_H */ From c6d1421f9be64953353b39e5ab56f83f037fd41e Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 04:44:09 +0400 Subject: [PATCH 027/103] Update libpng to release v1.5.12 --- 3rdparty/libpng/CHANGES | 3906 +++++++++++++++++++++++++++++ 3rdparty/libpng/CMakeLists.txt | 6 + 3rdparty/libpng/LICENSE | 111 + 3rdparty/libpng/README | 2 +- 3rdparty/libpng/arm/filter_neon.S | 225 ++ 3rdparty/libpng/png.c | 40 +- 3rdparty/libpng/png.h | 41 +- 3rdparty/libpng/pngconf.h | 8 +- 3rdparty/libpng/pngerror.c | 2 +- 3rdparty/libpng/pnglibconf.h | 11 +- 3rdparty/libpng/pngpread.c | 566 +---- 3rdparty/libpng/pngpriv.h | 54 +- 3rdparty/libpng/pngread.c | 21 +- 3rdparty/libpng/pngrtran.c | 22 +- 3rdparty/libpng/pngrutil.c | 19 +- 3rdparty/libpng/pngset.c | 41 +- 3rdparty/libpng/pngstruct.h | 16 +- 3rdparty/libpng/pngtest.c | 1820 -------------- 3rdparty/libpng/pngtest.png | Bin 8695 -> 0 bytes 3rdparty/libpng/pngtrans.c | 107 +- 3rdparty/libpng/pngwrite.c | 17 +- 3rdparty/libpng/pngwutil.c | 19 +- 22 files changed, 4583 insertions(+), 2471 deletions(-) create mode 100644 3rdparty/libpng/CHANGES create mode 100644 3rdparty/libpng/LICENSE create mode 100644 3rdparty/libpng/arm/filter_neon.S delete mode 100644 3rdparty/libpng/pngtest.c delete mode 100644 3rdparty/libpng/pngtest.png diff --git a/3rdparty/libpng/CHANGES b/3rdparty/libpng/CHANGES new file mode 100644 index 000000000..83f8f0846 --- /dev/null +++ b/3rdparty/libpng/CHANGES @@ -0,0 +1,3906 @@ +#if 0 +CHANGES - changes for libpng + +Version 0.2 + added reader into png.h + fixed small problems in stub file + +Version 0.3 + added pull reader + split up pngwrite.c to several files + added pnglib.txt + added example.c + cleaned up writer, adding a few new transformations + fixed some bugs in writer + interfaced with zlib 0.5 + added K&R support + added check for 64 KB blocks for 16-bit machines + +Version 0.4 + cleaned up code and commented code + simplified time handling into png_time + created png_color_16 and png_color_8 to handle color needs + cleaned up color type defines + fixed various bugs + made various names more consistent + interfaced with zlib 0.71 + cleaned up zTXt reader and writer (using zlib's Reset functions) + split transformations into pngrtran.c and pngwtran.c + +Version 0.5 + interfaced with zlib 0.8 + fixed many reading and writing bugs + saved using 3 spaces instead of tabs + +Version 0.6 + added png_large_malloc() and png_large_free() + added png_size_t + cleaned up some compiler warnings + added png_start_read_image() + +Version 0.7 + cleaned up lots of bugs + finished dithering and other stuff + added test program + changed name from pnglib to libpng + +Version 0.71 [June, 1995] + changed pngtest.png for zlib 0.93 + fixed error in libpng.txt and example.c + +Version 0.8 + cleaned up some bugs + added png_set_filler() + split up pngstub.c into pngmem.c, pngio.c, and pngerror.c + added #define's to remove unwanted code + moved png_info_init() to png.c + added old_size into png_realloc() + added functions to manually set filtering and compression info + changed compression parameters based on image type + optimized filter selection code + added version info + changed external functions passing floats to doubles (k&r problems?) + put all the configurable stuff in pngconf.h + enabled png_set_shift to work with paletted images on read + added png_read_update_info() - updates info structure with transformations + +Version 0.81 [August, 1995] + incorporated Tim Wegner's medium model code (thanks, Tim) + +Version 0.82 [September, 1995] + [unspecified changes] + +Version 0.85 [December, 1995] + added more medium model code (almost everything's a far) + added i/o, error, and memory callback functions + fixed some bugs (16-bit, 4-bit interlaced, etc.) + added first run progressive reader (barely tested) + +Version 0.86 [January, 1996] + fixed bugs + improved documentation + +Version 0.87 [January, 1996] + fixed medium model bugs + fixed other bugs introduced in 0.85 and 0.86 + added some minor documentation + +Version 0.88 [January, 1996] + fixed progressive bugs + replaced tabs with spaces + cleaned up documentation + added callbacks for read/write and warning/error functions + +Version 0.89 [July, 1996] + Added new initialization API to make libpng work better with shared libs + we now have png_create_read_struct(), png_create_write_struct(), + png_create_info_struct(), png_destroy_read_struct(), and + png_destroy_write_struct() instead of the separate calls to + malloc and png_read_init(), png_info_init(), and png_write_init() + Changed warning/error callback functions to fix bug - this means you + should use the new initialization API if you were using the old + png_set_message_fn() calls, and that the old API no longer exists + so that people are aware that they need to change their code + Changed filter selection API to allow selection of multiple filters + since it didn't work in previous versions of libpng anyways + Optimized filter selection code + Fixed png_set_background() to allow using an arbitrary RGB color for + paletted images + Fixed gamma and background correction for paletted images, so + png_correct_palette is not needed unless you are correcting an + external palette (you will need to #define PNG_CORRECT_PALETTE_SUPPORTED + in pngconf.h) - if nobody uses this, it may disappear in the future. + Fixed bug with Borland 64K memory allocation (Alexander Lehmann) + Fixed bug in interlace handling (Smarasderagd, I think) + Added more error checking for writing and image to reduce invalid files + Separated read and write functions so that they won't both be linked + into a binary when only reading or writing functionality is used + New pngtest image also has interlacing and zTXt + Updated documentation to reflect new API + +Version 0.90 [January, 1997] + Made CRC errors/warnings on critical and ancillary chunks configurable + libpng will use the zlib CRC routines by (compile-time) default + Changed DOS small/medium model memory support - needs zlib 1.04 (Tim Wegner) + Added external C++ wrapper statements to png.h (Gilles Dauphin) + Allow PNG file to be read when some or all of file signature has already + been read from the beginning of the stream. ****This affects the size + of info_struct and invalidates all programs that use a shared libpng**** + Fixed png_filler() declarations + Fixed? background color conversions + Fixed order of error function pointers to match documentation + Current chunk name is now available in png_struct to reduce the number + of nearly identical error messages (will simplify multi-lingual + support when available) + Try to get ready for unknown-chunk callback functions: + - previously read critical chunks are flagged, so the chunk handling + routines can determine if the chunk is in the right place + - all chunk handling routines have the same prototypes, so we will + be able to handle all chunks via a callback mechanism + Try to fix Linux "setjmp" buffer size problems + Removed png_large_malloc, png_large_free, and png_realloc functions. + +Version 0.95 [March, 1997] + Fixed bug in pngwutil.c allocating "up_row" twice and "avg_row" never + Fixed bug in PNG file signature compares when start != 0 + Changed parameter type of png_set_filler(...filler...) from png_byte + to png_uint_32 + Added test for MACOS to ensure that both math.h and fp.h are not #included + Added macros for libpng to be compiled as a Windows DLL (Andreas Kupries) + Added "packswap" transformation, which changes the endianness of + packed-pixel bytes (Kevin Bracey) + Added "strip_alpha" transformation, which removes the alpha channel of + input images without using it (not necessarily a good idea) + Added "swap_alpha" transformation, which puts the alpha channel in front + of the color bytes instead of after + Removed all implicit variable tests which assume NULL == 0 (I think) + Changed several variables to "png_size_t" to show 16/32-bit limitations + Added new pCAL chunk read/write support + Added experimental filter selection weighting (Greg Roelofs) + Removed old png_set_rgbx() and png_set_xrgb() functions that have been + obsolete for about 2 years now (use png_set_filler() instead) + Added macros to read 16- and 32-bit ints directly from buffer, to be + used only on those systems that support it (namely PowerPC and 680x0) + With some testing, this may become the default for MACOS/PPC systems. + Only calculate CRC on data if we are going to use it + Added macros for zTXt compression type PNG_zTXt_COMPRESSION_??? + Added macros for simple libpng debugging output selectable at compile time + Removed PNG_READ_END_MODE in progressive reader (Smarasderagd) + More description of info_struct in libpng.txt and png.h + More instructions in example.c + More chunk types tested in pngtest.c + Renamed pngrcb.c to pngset.c, and all png_read_ functions to be + png_set_. We now have corresponding png_get_ + functions in pngget.c to get information in info_ptr. This isolates + the application from the internal organization of png_info_struct + (good for shared library implementations). + +Version 0.96 [May, 1997] + Fixed serious bug with < 8bpp images introduced in 0.95 + Fixed 256-color transparency bug (Greg Roelofs) + Fixed up documentation (Greg Roelofs, Laszlo Nyul) + Fixed "error" in pngconf.h for Linux setjmp() behavior + Fixed DOS medium model support (Tim Wegner) + Fixed png_check_keyword() for case with error in static string text + Added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul) + Added typecasts to quiet compiler errors + Added more debugging info + +Version 0.97 [January, 1998] + Removed PNG_USE_OWN_CRC capability + Relocated png_set_crc_action from pngrutil.c to pngrtran.c + Fixed typecasts of "new_key", etc. (Andreas Dilger) + Added RFC 1152 [sic] date support + Fixed bug in gamma handling of 4-bit grayscale + Added 2-bit grayscale gamma handling (Glenn R-P) + Added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P) + Minor corrections in libpng.txt + Added simple sRGB support (Glenn R-P) + Easier conditional compiling, e.g., + define PNG_READ/WRITE_NOT_FULLY_SUPPORTED; + all configurable options can be selected from command-line instead + of having to edit pngconf.h (Glenn R-P) + Fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P) + Added more conditions for png_do_background, to avoid changing + black pixels to background when a background is supplied and + no pixels are transparent + Repaired PNG_NO_STDIO behavior + Tested NODIV support and made it default behavior (Greg Roelofs) + Added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler) + Regularized version numbering scheme and bumped shared-library major + version number to 2 to avoid problems with libpng 0.89 apps + (Greg Roelofs) + +Version 0.98 [January, 1998] + Cleaned up some typos in libpng.txt and in code documentation + Fixed memory leaks in pCAL chunk processing (Glenn R-P and John Bowler) + Cosmetic change "display_gamma" to "screen_gamma" in pngrtran.c + Changed recommendation about file_gamma for PC images to .51 from .45, + in example.c and libpng.txt, added comments to distinguish between + screen_gamma, viewing_gamma, and display_gamma. + Changed all references to RFC1152 to read RFC1123 and changed the + PNG_TIME_RFC1152_SUPPORTED macro to PNG_TIME_RFC1123_SUPPORTED + Added png_invert_alpha capability (Glenn R-P -- suggestion by Jon Vincent) + Changed srgb_intent from png_byte to int to avoid compiler bugs + +Version 0.99 [January 30, 1998] + Free info_ptr->text instead of end_info_ptr->text in pngread.c (John Bowler) + Fixed a longstanding "packswap" bug in pngtrans.c + Fixed some inconsistencies in pngconf.h that prevented compiling with + PNG_READ_GAMMA_SUPPORTED and PNG_READ_hIST_SUPPORTED undefined + Fixed some typos and made other minor rearrangement of libpng.txt (Andreas) + Changed recommendation about file_gamma for PC images to .50 from .51 in + example.c and libpng.txt, and changed file_gamma for sRGB images to .45 + Added a number of functions to access information from the png structure + png_get_image_height(), etc. (Glenn R-P, suggestion by Brad Pettit) + Added TARGET_MACOS similar to zlib-1.0.8 + Define PNG_ALWAYS_EXTERN when __MWERKS__ && WIN32 are defined + Added type casting to all png_malloc() function calls + +Version 0.99a [January 31, 1998] + Added type casts and parentheses to all returns that return a value.(Tim W.) + +Version 0.99b [February 4, 1998] + Added type cast png_uint_32 on malloc function calls where needed. + Changed type of num_hist from png_uint_32 to int (same as num_palette). + Added checks for rowbytes overflow, in case png_size_t is less than 32 bits. + Renamed makefile.elf to makefile.lnx. + +Version 0.99c [February 7, 1998] + More type casting. Removed erroneous overflow test in pngmem.c. + Added png_buffered_memcpy() and png_buffered_memset(), apply them to rowbytes. + Added UNIX manual pages libpng.3 (incorporating libpng.txt) and png.5. + +Version 0.99d [February 11, 1998] + Renamed "far_to_near()" "png_far_to_near()" + Revised libpng.3 + Version 99c "buffered" operations didn't work as intended. Replaced them + with png_memcpy_check() and png_memset_check(). + Added many "if (png_ptr == NULL) return" to quell compiler warnings about + unused png_ptr, mostly in pngget.c and pngset.c. + Check for overlength tRNS chunk present when indexed-color PLTE is read. + Cleaned up spelling errors in libpng.3/libpng.txt + Corrected a problem with png_get_tRNS() which returned undefined trans array + +Version 0.99e [February 28, 1998] + Corrected png_get_tRNS() again. + Add parentheses for easier reading of pngget.c, fixed "||" should be "&&". + Touched up example.c to make more of it compileable, although the entire + file still can't be compiled (Willem van Schaik) + Fixed a bug in png_do_shift() (Bryan Tsai) + Added a space in png.h prototype for png_write_chunk_start() + Replaced pngtest.png with one created with zlib 1.1.1 + Changed pngtest to report PASS even when file size is different (Jean-loup G.) + Corrected some logic errors in png_do_invert_alpha() (Chris Patterson) + +Version 0.99f [March 5, 1998] + Corrected a bug in pngpread() introduced in version 99c (Kevin Bracey) + Moved makefiles into a "scripts" directory, and added INSTALL instruction file + Added makefile.os2 and pngos2.def (A. Zabolotny) and makefile.s2x (W. Sebok) + Added pointers to "note on libpng versions" in makefile.lnx and README + Added row callback feature when reading and writing nonprogressive rows + and added a test of this feature in pngtest.c + Added user transform callbacks, with test of the feature in pngtest.c + +Version 0.99g [March 6, 1998, morning] + Minor changes to pngtest.c to suppress compiler warnings. + Removed "beta" language from documentation. + +Version 0.99h [March 6, 1998, evening] + Minor changes to previous minor changes to pngtest.c + Changed PNG_READ_NOT_FULLY_SUPPORTED to PNG_READ_TRANSFORMS_NOT_SUPPORTED + and added PNG_PROGRESSIVE_READ_NOT_SUPPORTED macro + Added user transform capability + +Version 1.00 [March 7, 1998] + Changed several typedefs in pngrutil.c + Added makefile.wat (Pawel Mrochen), updated makefile.tc3 (Willem van Schaik) + Replaced "while(1)" with "for(;;)" + Added PNGARG() to prototypes in pngtest.c and removed some prototypes + Updated some of the makefiles (Tom Lane) + Changed some typedefs (s_start, etc.) in pngrutil.c + Fixed dimensions of "short_months" array in pngwrite.c + Replaced ansi2knr.c with the one from jpeg-v6 + +Version 1.0.0 [March 8, 1998] + Changed name from 1.00 to 1.0.0 (Adam Costello) + Added smakefile.ppc (with SCOPTIONS.ppc) for Amiga PPC (Andreas Kleinert) + +Version 1.0.0a [March 9, 1998] + Fixed three bugs in pngrtran.c to make gamma+background handling consistent + (Greg Roelofs) + Changed format of the PNG_LIBPNG_VER integer to xyyzz instead of xyz + for major, minor, and bugfix releases. This is 10001. (Adam Costello, + Tom Lane) + Make months range from 1-12 in png_convert_to_rfc1123 + +Version 1.0.0b [March 13, 1998] + Quieted compiler complaints about two empty "for" loops in pngrutil.c + Minor changes to makefile.s2x + Removed #ifdef/#endif around a png_free() in pngread.c + +Version 1.0.1 [March 14, 1998] + Changed makefile.s2x to reduce security risk of using a relative pathname + Fixed some typos in the documentation (Greg). + Fixed a problem with value of "channels" returned by png_read_update_info() + +Version 1.0.1a [April 21, 1998] + Optimized Paeth calculations by replacing abs() function calls with intrinsics + plus other loop optimizations. Improves avg decoding speed by about 20%. + Commented out i386istic "align" compiler flags in makefile.lnx. + Reduced the default warning level in some makefiles, to make them consistent. + Removed references to IJG and JPEG in the ansi2knr.c copyright statement. + Fixed a bug in png_do_strip_filler with XXRRGGBB => RRGGBB transformation. + Added grayscale and 16-bit capability to png_do_read_filler(). + Fixed a bug in pngset.c, introduced in version 0.99c, that sets rowbytes + too large when writing an image with bit_depth < 8 (Bob Dellaca). + Corrected some bugs in the experimental weighted filtering heuristics. + Moved a misplaced pngrutil code block that truncates tRNS if it has more + than num_palette entries -- test was done before num_palette was defined. + Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins). + Changed compiler flags in makefile.wat for better optimization + (Pawel Mrochen). + +Version 1.0.1b [May 2, 1998] + Relocated png_do_gray_to_rgb() within png_do_read_transformations() (Greg). + Relocated the png_composite macros from pngrtran.c to png.h (Greg). + Added makefile.sco (contributed by Mike Hopkirk). + Fixed two bugs (missing definitions of "istop") introduced in libpng-1.0.1a. + Fixed a bug in pngrtran.c that would set channels=5 under some circumstances. + More work on the Paeth-filtering, achieving imperceptible speedup + (A Kleinert). + More work on loop optimization which may help when compiled with C++ + compilers. + Added warnings when people try to use transforms they've defined out. + Collapsed 4 "i" and "c" loops into single "i" loops in pngrtran and pngwtran. + Revised paragraph about png_set_expand() in libpng.txt and libpng.3 (Greg) + +Version 1.0.1c [May 11, 1998] + Fixed a bug in pngrtran.c (introduced in libpng-1.0.1a) where the masks for + filler bytes should have been 0xff instead of 0xf. + Added max_pixel_depth=32 in pngrutil.c when using FILLER with palette images. + Moved PNG_WRITE_WEIGHTED_FILTER_SUPPORTED and PNG_WRITE_FLUSH_SUPPORTED + out of the PNG_WRITE_TRANSFORMS_NOT_SUPPORTED block of pngconf.h + Added "PNG_NO_WRITE_TRANSFORMS" etc., as alternatives for *_NOT_SUPPORTED, + for consistency, in pngconf.h + Added individual "ifndef PNG_NO_[CAPABILITY]" in pngconf.h to make it easier + to remove unwanted capabilities via the compile line + Made some corrections to grammar (which, it's) in documentation (Greg). + Corrected example.c, use of row_pointers in png_write_image(). + +Version 1.0.1d [May 24, 1998] + Corrected several statements that used side effects illegally in pngrutil.c + and pngtrans.c, that were introduced in version 1.0.1b + Revised png_read_rows() to avoid repeated if-testing for NULL (A Kleinert) + More corrections to example.c, use of row_pointers in png_write_image() + and png_read_rows(). + Added pngdll.mak and pngdef.pas to scripts directory, contributed by + Bob Dellaca, to make a png32bd.dll with Borland C++ 4.5 + Fixed error in example.c with png_set_text: num_text is 3, not 2 (Guido V.) + Changed several loops from count-down to count-up, for consistency. + +Version 1.0.1e [June 6, 1998] + Revised libpng.txt and libpng.3 description of png_set_read|write_fn(), and + added warnings when people try to set png_read_fn and png_write_fn in + the same structure. + Added a test such that png_do_gamma will be done when num_trans==0 + for truecolor images that have defined a background. This corrects an + error that was introduced in libpng-0.90 that can cause gamma processing + to be skipped. + Added tests in png.h to include "trans" and "trans_values" in structures + when PNG_READ_BACKGROUND_SUPPORTED or PNG_READ_EXPAND_SUPPORTED is defined. + Add png_free(png_ptr->time_buffer) in png_destroy_read_struct() + Moved png_convert_to_rfc_1123() from pngwrite.c to png.c + Added capability for user-provided malloc_fn() and free_fn() functions, + and revised pngtest.c to demonstrate their use, replacing the + PNGTEST_DEBUG_MEM feature. + Added makefile.w32, for Microsoft C++ 4.0 and later (Tim Wegner). + +Version 1.0.2 [June 14, 1998] + Fixed two bugs in makefile.bor . + +Version 1.0.2a [December 30, 1998] + Replaced and extended code that was removed from png_set_filler() in 1.0.1a. + Fixed a bug in png_do_filler() that made it fail to write filler bytes in + the left-most pixel of each row (Kevin Bracey). + Changed "static pngcharp tIME_string" to "static char tIME_string[30]" + in pngtest.c (Duncan Simpson). + Fixed a bug in pngtest.c that caused pngtest to try to write a tIME chunk + even when no tIME chunk was present in the source file. + Fixed a problem in pngrutil.c: gray_to_rgb didn't always work with 16-bit. + Fixed a problem in png_read_push_finish_row(), which would not skip some + passes that it should skip, for images that are less than 3 pixels high. + Interchanged the order of calls to png_do_swap() and png_do_shift() + in pngwtran.c (John Cromer). + Added #ifdef PNG_DEBUG/#endif surrounding use of PNG_DEBUG in png.h . + Changed "bad adaptive filter type" from error to warning in pngrutil.c . + Fixed a documentation error about default filtering with 8-bit indexed-color. + Separated the PNG_NO_STDIO macro into PNG_NO_STDIO and PNG_NO_CONSOLE_IO + (L. Peter Deutsch). + Added png_set_rgb_to_gray() and png_get_rgb_to_gray_status() functions. + Added png_get_copyright() and png_get_header_version() functions. + Revised comments on png_set_progressive_read_fn() in libpng.txt and example.c + Added information about debugging in libpng.txt and libpng.3 . + Changed "ln -sf" to "ln -s -f" in makefile.s2x, makefile.lnx, and + makefile.sco. + Removed lines after Dynamic Dependencies" in makefile.aco . + Revised makefile.dec to make a shared library (Jeremie Petit). + Removed trailing blanks from all files. + +Version 1.0.2a [January 6, 1999] + Removed misplaced #endif and #ifdef PNG_NO_EXTERN near the end of png.h + Added "if" tests to silence complaints about unused png_ptr in png.h and png.c + Changed "check_if_png" function in example.c to return true (nonzero) if PNG. + Changed libpng.txt to demonstrate png_sig_cmp() instead of png_check_sig() + which is obsolete. + +Version 1.0.3 [January 14, 1999] + Added makefile.hux, for Hewlett Packard HPUX 10.20 and 11.00 (Jim Rice) + Added a statement of Y2K compliance in png.h, libpng.3, and Y2KINFO. + +Version 1.0.3a [August 12, 1999] + Added check for PNG_READ_INTERLACE_SUPPORTED in pngread.c; issue a warning + if an attempt is made to read an interlaced image when it's not supported. + Added check if png_ptr->trans is defined before freeing it in pngread.c + Modified the Y2K statement to include versions back to version 0.71 + Fixed a bug in the check for valid IHDR bit_depth/color_types in pngrutil.c + Modified makefile.wat (added -zp8 flag, ".symbolic", changed some comments) + Replaced leading blanks with tab characters in makefile.hux + Changed "dworkin.wustl.edu" to "ccrc.wustl.edu" in various documents. + Changed (float)red and (float)green to (double)red, (double)green + in png_set_rgb_to_gray() to avoid "promotion" problems in AIX. + Fixed a bug in pngconf.h that omitted when PNG_DEBUG==0 (K Bracey). + Reformatted libpng.3 and libpngpf.3 with proper fonts (script by J. vanZandt). + Updated documentation to refer to the PNG-1.2 specification. + Removed ansi2knr.c and left pointers to the latest source for ansi2knr.c + in makefile.knr, INSTALL, and README (L. Peter Deutsch) + Fixed bugs in calculation of the length of rowbytes when adding alpha + channels to 16-bit images, in pngrtran.c (Chris Nokleberg) + Added function png_set_user_transform_info() to store user_transform_ptr, + user_depth, and user_channels into the png_struct, and a function + png_get_user_transform_ptr() to retrieve the pointer (Chris Nokleberg) + Added function png_set_empty_plte_permitted() to make libpng useable + in MNG applications. + Corrected the typedef for png_free_ptr in png.h (Jesse Jones). + Correct gamma with srgb is 45455 instead of 45000 in pngrutil.c, to be + consistent with PNG-1.2, and allow variance of 500 before complaining. + Added assembler code contributed by Intel in file pngvcrd.c and modified + makefile.w32 to use it (Nirav Chhatrapati, INTEL Corporation, + Gilles Vollant) + Changed "ln -s -f" to "ln -f -s" in the makefiles to make Solaris happy. + Added some aliases for png_set_expand() in pngrtran.c, namely + png_set_expand_PLTE(), png_set_expand_depth(), and png_set_expand_tRNS() + (Greg Roelofs, in "PNG: The Definitive Guide"). + Added makefile.beo for BEOS on X86, contributed by Sander Stok. + +Version 1.0.3b [August 26, 1999] + Replaced 2147483647L several places with PNG_MAX_UINT macro, defined in png.h + Changed leading blanks to tabs in all makefiles. + Define PNG_USE_PNGVCRD in makefile.w32, to get MMX assembler code. + Made alternate versions of png_set_expand() in pngrtran.c, namely + png_set_gray_1_2_4_to_8, png_set_palette_to_rgb, and png_set_tRNS_to_alpha + (Greg Roelofs, in "PNG: The Definitive Guide"). Deleted the 1.0.3a aliases. + Relocated start of 'extern "C"' block in png.h so it doesn't include pngconf.h + Revised calculation of num_blocks in pngmem.c to avoid a potentially + negative shift distance, whose results are undefined in the C language. + Added a check in pngset.c to prevent writing multiple tIME chunks. + Added a check in pngwrite.c to detect invalid small window_bits sizes. + +Version 1.0.3d [September 4, 1999] + Fixed type casting of igamma in pngrutil.c + Added new png_expand functions to scripts/pngdef.pas and pngos2.def + Added a demo read_user_transform_fn that examines the row filters in pngtest.c + +Version 1.0.4 [September 24, 1999] + Define PNG_ALWAYS_EXTERN in pngconf.h if __STDC__ is defined + Delete #define PNG_INTERNAL and include "png.h" from pngasmrd.h + Made several minor corrections to pngtest.c + Renamed the makefiles with longer but more user friendly extensions. + Copied the PNG copyright and license to a separate LICENSE file. + Revised documentation, png.h, and example.c to remove reference to + "viewing_gamma" which no longer appears in the PNG specification. + Revised pngvcrd.c to use MMX code for interlacing only on the final pass. + Updated pngvcrd.c to use the faster C filter algorithms from libpng-1.0.1a + Split makefile.win32vc into two versions, makefile.vcawin32 (uses MMX + assembler code) and makefile.vcwin32 (doesn't). + Added a CPU timing report to pngtest.c (enabled by defining PNGTEST_TIMING) + Added a copy of pngnow.png to the distribution. + +Version 1.0.4a [September 25, 1999] + Increase max_pixel_depth in pngrutil.c if a user transform needs it. + Changed several division operations to right-shifts in pngvcrd.c + +Version 1.0.4b [September 30, 1999] + Added parentheses in line 3732 of pngvcrd.c + Added a comment in makefile.linux warning about buggy -O3 in pgcc 2.95.1 + +Version 1.0.4c [October 1, 1999] + Added a "png_check_version" function in png.c and pngtest.c that will generate + a helpful compiler error if an old png.h is found in the search path. + Changed type of png_user_transform_depth|channels from int to png_byte. + +Version 1.0.4d [October 6, 1999] + Changed 0.45 to 0.45455 in png_set_sRGB() + Removed unused PLTE entries from pngnow.png + Re-enabled some parts of pngvcrd.c (png_combine_row) that work properly. + +Version 1.0.4e [October 10, 1999] + Fixed sign error in pngvcrd.c (Greg Roelofs) + Replaced some instances of memcpy with simple assignments in pngvcrd (GR-P) + +Version 1.0.4f [October 15, 1999] + Surrounded example.c code with #if 0 .. #endif to prevent people from + inadvertently trying to compile it. + Changed png_get_header_version() from a function to a macro in png.h + Added type casting mostly in pngrtran.c and pngwtran.c + Removed some pointless "ptr = NULL" in pngmem.c + Added a "contrib" directory containing the source code from Greg's book. + +Version 1.0.5 [October 15, 1999] + Minor editing of the INSTALL and README files. + +Version 1.0.5a [October 23, 1999] + Added contrib/pngsuite and contrib/pngminus (Willem van Schaik) + Fixed a typo in the png_set_sRGB() function call in example.c (Jan Nijtmans) + Further optimization and bugfix of pngvcrd.c + Revised pngset.c so that it does not allocate or free memory in the user's + text_ptr structure. Instead, it makes its own copy. + Created separate write_end_info_struct in pngtest.c for a more severe test. + Added code in pngwrite.c to free info_ptr->text[i].key to stop a memory leak. + +Version 1.0.5b [November 23, 1999] + Moved PNG_FLAG_HAVE_CHUNK_HEADER, PNG_FLAG_BACKGROUND_IS_GRAY and + PNG_FLAG_WROTE_tIME from flags to mode. + Added png_write_info_before_PLTE() function. + Fixed some typecasting in contrib/gregbook/*.c + Updated scripts/makevms.com and added makevms.com to contrib/gregbook + and contrib/pngminus (Martin Zinser) + +Version 1.0.5c [November 26, 1999] + Moved png_get_header_version from png.h to png.c, to accommodate ansi2knr. + Removed all global arrays (according to PNG_NO_GLOBAL_ARRAYS macro), to + accommodate making DLL's: Moved usr_png_ver from global variable to function + png_get_header_ver() in png.c. Moved png_sig to png_sig_bytes in png.c and + eliminated use of png_sig in pngwutil.c. Moved the various png_CHNK arrays + into pngtypes.h. Eliminated use of global png_pass arrays. Declared the + png_CHNK and png_pass arrays to be "const". Made the global arrays + available to applications (although none are used in libpng itself) when + PNG_NO_GLOBAL_ARRAYS is not defined or when PNG_GLOBAL_ARRAYS is defined. + Removed some extraneous "-I" from contrib/pngminus/makefile.std + Changed the PNG_sRGB_INTENT macros in png.h to be consistent with PNG-1.2. + Change PNG_SRGB_INTENT to PNG_sRGB_INTENT in libpng.txt and libpng.3 + +Version 1.0.5d [November 29, 1999] + Add type cast (png_const_charp) two places in png.c + Eliminated pngtypes.h; use macros instead to declare PNG_CHNK arrays. + Renamed "PNG_GLOBAL_ARRAYS" to "PNG_USE_GLOBAL_ARRAYS" and made available + to applications a macro "PNG_USE_LOCAL_ARRAYS". + comment out (with #ifdef) all the new declarations when + PNG_USE_GLOBAL_ARRAYS is defined. + Added PNG_EXPORT_VAR macro to accommodate making DLL's. + +Version 1.0.5e [November 30, 1999] + Added iCCP, iTXt, and sPLT support; added "lang" member to the png_text + structure; refactored the inflate/deflate support to make adding new chunks + with trailing compressed parts easier in the future, and added new functions + png_free_iCCP, png_free_pCAL, png_free_sPLT, png_free_text, png_get_iCCP, + png_get_spalettes, png_set_iCCP, png_set_spalettes (Eric S. Raymond). + NOTE: Applications that write text chunks MUST define png_text->lang + before calling png_set_text(). It must be set to NULL if you want to + write tEXt or zTXt chunks. If you want your application to be able to + run with older versions of libpng, use + + #ifdef PNG_iTXt_SUPPORTED + png_text[i].lang = NULL; + #endif + + Changed png_get_oFFs() and png_set_oFFs() to use signed rather than unsigned + offsets (Eric S. Raymond). + Combined PNG_READ_cHNK_SUPPORTED and PNG_WRITE_cHNK_SUPPORTED macros into + PNG_cHNK_SUPPORTED and combined the three types of PNG_text_SUPPORTED + macros, leaving the separate macros also available. + Removed comments on #endifs at the end of many short, non-nested #if-blocks. + +Version 1.0.5f [December 6, 1999] + Changed makefile.solaris to issue a warning about potential problems when + the ucb "ld" is in the path ahead of the ccs "ld". + Removed "- [date]" from the "synopsis" line in libpng.3 and libpngpf.3. + Added sCAL chunk support (Eric S. Raymond). + +Version 1.0.5g [December 7, 1999] + Fixed "png_free_spallettes" typo in png.h + Added code to handle new chunks in pngpread.c + Moved PNG_CHNK string macro definitions outside of PNG_NO_EXTERN block + Added "translated_key" to png_text structure and png_write_iTXt(). + Added code in pngwrite.c to work around a newly discovered zlib bug. + +Version 1.0.5h [December 10, 1999] + NOTE: regarding the note for version 1.0.5e, the following must also + be included in your code: + png_text[i].translated_key = NULL; + Unknown chunk handling is now supported. + Option to eliminate all floating point support was added. Some new + fixed-point functions such as png_set_gAMA_fixed() were added. + Expanded tabs and removed trailing blanks in source files. + +Version 1.0.5i [December 13, 1999] + Added some type casts to silence compiler warnings. + Renamed "png_free_spalette" to "png_free_spalettes" for consistency. + Removed leading blanks from a #define in pngvcrd.c + Added some parameters to the new png_set_keep_unknown_chunks() function. + Added a test for up->location != 0 in the first instance of writing + unknown chunks in pngwrite.c + Changed "num" to "i" in png_free_spalettes() and png_free_unknowns() to + prevent recursion. + Added png_free_hIST() function. + Various patches to fix bugs in the sCAL and integer cHRM processing, + and to add some convenience macros for use with sCAL. + +Version 1.0.5j [December 21, 1999] + Changed "unit" parameter of png_write_sCAL from png_byte to int, to work + around buggy compilers. + Added new type "png_fixed_point" for integers that hold float*100000 values + Restored backward compatibility of tEXt/zTXt chunk processing: + Restored the first four members of png_text to the same order as v.1.0.5d. + Added members "lang_key" and "itxt_length" to png_text struct. Set + text_length=0 when "text" contains iTXt data. Use the "compression" + member to distinguish among tEXt/zTXt/iTXt types. Added + PNG_ITXT_COMPRESSION_NONE (1) and PNG_ITXT_COMPRESSION_zTXt(2) macros. + The "Note" above, about backward incompatibility of libpng-1.0.5e, no + longer applies. + Fixed png_read|write_iTXt() to read|write parameters in the right order, + and to write the iTXt chunk after IDAT if it appears in the end_ptr. + Added pnggccrd.c, version of pngvcrd.c Intel assembler for gcc (Greg Roelofs) + Reversed the order of trying to write floating-point and fixed-point gAMA. + +Version 1.0.5k [December 27, 1999] + Added many parentheses, e.g., "if (a && b & c)" becomes "if (a && (b & c))" + Added png_handle_as_unknown() function (Glenn) + Added png_free_chunk_list() function and chunk_list and num_chunk_list members + of png_ptr. + Eliminated erroneous warnings about multiple sPLT chunks and sPLT-after-PLTE. + Fixed a libpng-1.0.5h bug in pngrutil.c that was issuing erroneous warnings + about ignoring incorrect gAMA with sRGB (gAMA was in fact not ignored) + Added png_free_tRNS(); png_set_tRNS() now malloc's its own trans array (ESR). + Define png_get_int_32 when oFFs chunk is supported as well as when pCAL is. + Changed type of proflen from png_int_32 to png_uint_32 in png_get_iCCP(). + +Version 1.0.5l [January 1, 2000] + Added functions png_set_read_user_chunk_fn() and png_get_user_chunk_ptr() + for setting a callback function to handle unknown chunks and for + retrieving the associated user pointer (Glenn). + +Version 1.0.5m [January 7, 2000] + Added high-level functions png_read_png(), png_write_png(), png_free_pixels(). + +Version 1.0.5n [January 9, 2000] + Added png_free_PLTE() function, and modified png_set_PLTE() to malloc its + own memory for info_ptr->palette. This makes it safe for the calling + application to free its copy of the palette any time after it calls + png_set_PLTE(). + +Version 1.0.5o [January 20, 2000] + Cosmetic changes only (removed some trailing blanks and TABs) + +Version 1.0.5p [January 31, 2000] + Renamed pngdll.mak to makefile.bd32 + Cosmetic changes in pngtest.c + +Version 1.0.5q [February 5, 2000] + Relocated the makefile.solaris warning about PATH problems. + Fixed pngvcrd.c bug by pushing/popping registers in mmxsupport (Bruce Oberg) + Revised makefile.gcmmx + Added PNG_SETJMP_SUPPORTED, PNG_SETJMP_NOT_SUPPORTED, and PNG_ABORT() macros + +Version 1.0.5r [February 7, 2000] + Removed superfluous prototype for png_get_itxt from png.h + Fixed a bug in pngrtran.c that improperly expanded the background color. + Return *num_text=0 from png_get_text() when appropriate, and fix documentation + of png_get_text() in libpng.txt/libpng.3. + +Version 1.0.5s [February 18, 2000] + Added "png_jmp_env()" macro to pngconf.h, to help people migrate to the + new error handler that's planned for the next libpng release, and changed + example.c, pngtest.c, and contrib programs to use this macro. + Revised some of the DLL-export macros in pngconf.h (Greg Roelofs) + Fixed a bug in png_read_png() that caused it to fail to expand some images + that it should have expanded. + Fixed some mistakes in the unused and undocumented INCH_CONVERSIONS functions + in pngget.c + Changed the allocation of palette, history, and trans arrays back to + the version 1.0.5 method (linking instead of copying) which restores + backward compatibility with version 1.0.5. Added some remarks about + that in example.c. Added "free_me" member to info_ptr and png_ptr + and added png_free_data() function. + Updated makefile.linux and makefile.gccmmx to make directories conditionally. + Made cosmetic changes to pngasmrd.h + Added png_set_rows() and png_get_rows(), for use with png_read|write_png(). + Modified png_read_png() to allocate info_ptr->row_pointers only if it + hasn't already been allocated. + +Version 1.0.5t [March 4, 2000] + Changed png_jmp_env() migration aiding macro to png_jmpbuf(). + Fixed "interlace" typo (should be "interlaced") in contrib/gregbook/read2-x.c + Fixed bug with use of PNG_BEFORE_IHDR bit in png_ptr->mode, introduced when + PNG_FLAG_HAVE_CHUNK_HEADER was moved into png_ptr->mode in version 1.0.5b + Files in contrib/gregbook were revised to use png_jmpbuf() and to select + a 24-bit visual if one is available, and to allow abbreviated options. + Files in contrib/pngminus were revised to use the png_jmpbuf() macro. + Removed spaces in makefile.linux and makefile.gcmmx, introduced in 1.0.5s + +Version 1.0.5u [March 5, 2000] + Simplified the code that detects old png.h in png.c and pngtest.c + Renamed png_spalette (_p, _pp) to png_sPLT_t (_tp, _tpp) + Increased precision of rgb_to_gray calculations from 8 to 15 bits and + added png_set_rgb_to_gray_fixed() function. + Added makefile.bc32 (32-bit Borland C++, C mode) + +Version 1.0.5v [March 11, 2000] + Added some parentheses to the png_jmpbuf macro definition. + Updated references to the zlib home page, which has moved to freesoftware.com. + Corrected bugs in documentation regarding png_read_row() and png_write_row(). + Updated documentation of png_rgb_to_gray calculations in libpng.3/libpng.txt. + Renamed makefile.borland,turboc3 back to makefile.bor,tc3 as in version 1.0.3, + revised borland makefiles; added makefile.ibmvac3 and makefile.gcc (Cosmin) + +Version 1.0.6 [March 20, 2000] + Minor revisions of makefile.bor, libpng.txt, and gregbook/rpng2-win.c + Added makefile.sggcc (SGI IRIX with gcc) + +Version 1.0.6d [April 7, 2000] + Changed sprintf() to strcpy() in png_write_sCAL_s() to work without STDIO + Added data_length parameter to png_decompress_chunk() function + Revised documentation to remove reference to abandoned png_free_chnk functions + Fixed an error in png_rgb_to_gray_fixed() + Revised example.c, usage of png_destroy_write_struct(). + Renamed makefile.ibmvac3 to makefile.ibmc, added libpng.icc IBM project file + Added a check for info_ptr->free_me&PNG_FREE_TEXT when freeing text in png.c + Simplify png_sig_bytes() function to remove use of non-ISO-C strdup(). + +Version 1.0.6e [April 9, 2000] + Added png_data_freer() function. + In the code that checks for over-length tRNS chunks, added check of + info_ptr->num_trans as well as png_ptr->num_trans (Matthias Benckmann) + Minor revisions of libpng.txt/libpng.3. + Check for existing data and free it if the free_me flag is set, in png_set_*() + and png_handle_*(). + Only define PNG_WEIGHTED_FILTERS_SUPPORTED when PNG_FLOATING_POINT_SUPPORTED + is defined. + Changed several instances of PNG_NO_CONSOLE_ID to PNG_NO_STDIO in pngrutil.c + and mentioned the purposes of the two macros in libpng.txt/libpng.3. + +Version 1.0.6f [April 14, 2000] + Revised png_set_iCCP() and png_set_rows() to avoid prematurely freeing data. + Add checks in png_set_text() for NULL members of the input text structure. + Revised libpng.txt/libpng.3. + Removed superfluous prototype for png_set_iTXt from png.h + Removed "else" from pngread.c, after png_error(), and changed "0" to "length". + Changed several png_errors about malformed ancillary chunks to png_warnings. + +Version 1.0.6g [April 24, 2000] + Added png_pass-* arrays to pnggccrd.c when PNG_USE_LOCAL_ARRAYS is defined. + Relocated paragraph about png_set_background() in libpng.3/libpng.txt + and other revisions (Matthias Benckmann) + Relocated info_ptr->free_me, png_ptr->free_me, and other info_ptr and + png_ptr members to restore binary compatibility with libpng-1.0.5 + (breaks compatibility with libpng-1.0.6). + +Version 1.0.6h [April 24, 2000] + Changed shared library so-number pattern from 2.x.y.z to xy.z (this builds + libpng.so.10 & libpng.so.10.6h instead of libpng.so.2 & libpng.so.2.1.0.6h) + This is a temporary change for test purposes. + +Version 1.0.6i [May 2, 2000] + Rearranged some members at the end of png_info and png_struct, to put + unknown_chunks_num and free_me within the original size of the png_structs + and free_me, png_read_user_fn, and png_free_fn within the original png_info, + because some old applications allocate the structs directly instead of + using png_create_*(). + Added documentation of user memory functions in libpng.txt/libpng.3 + Modified png_read_png so that it will use user_allocated row_pointers + if present, unless free_me directs that it be freed, and added description + of the use of png_set_rows() and png_get_rows() in libpng.txt/libpng.3. + Added PNG_LEGACY_SUPPORTED macro, and #ifdef out all new (since version + 1.00) members of png_struct and png_info, to regain binary compatibility + when you define this macro. Capabilities lost in this event + are user transforms (new in version 1.0.0),the user transform pointer + (new in version 1.0.2), rgb_to_gray (new in 1.0.5), iCCP, sCAL, sPLT, + the high-level interface, and unknown chunks support (all new in 1.0.6). + This was necessary because of old applications that allocate the structs + directly as authors were instructed to do in libpng-0.88 and earlier, + instead of using png_create_*(). + Added modes PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT which + can be used to detect codes that directly allocate the structs, and + code to check these modes in png_read_init() and png_write_init() and + generate a libpng error if the modes aren't set and PNG_LEGACY_SUPPORTED + was not defined. + Added makefile.intel and updated makefile.watcom (Pawel Mrochen) + +Version 1.0.6j [May 3, 2000] + Overloaded png_read_init() and png_write_init() with macros that convert + calls to png_read_init_2() or png_write_init_2() that check the version + and structure sizes. + +Version 1.0.7beta11 [May 7, 2000] + Removed the new PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT modes + which are no longer used. + Eliminated the three new members of png_text when PNG_LEGACY_SUPPORTED is + defined or when neither PNG_READ_iTXt_SUPPORTED nor PNG_WRITE_iTXT_SUPPORTED + is defined. + Made PNG_NO_READ|WRITE_iTXt the default setting, to avoid memory + overrun when old applications fill the info_ptr->text structure directly. + Added PNGAPI macro, and added it to the definitions of all exported functions. + Relocated version macro definitions ahead of the includes of zlib.h and + pngconf.h in png.h. + +Version 1.0.7beta12 [May 12, 2000] + Revised pngset.c to avoid a problem with expanding the png_debug macro. + Deleted some extraneous defines from pngconf.h + Made PNG_NO_CONSOLE_IO the default condition when PNG_BUILD_DLL is defined. + Use MSC _RPTn debugging instead of fprintf if _MSC_VER is defined. + Added png_access_version_number() function. + Check for mask&PNG_FREE_CHNK (for TEXT, SCAL, PCAL) in png_free_data(). + Expanded libpng.3/libpng.txt information about png_data_freer(). + +Version 1.0.7beta14 [May 17, 2000] (beta13 was not published) + Changed pnggccrd.c and pngvcrd.c to handle bad adaptive filter types as + warnings instead of errors, as pngrutil.c does. + Set the PNG_INFO_IDAT valid flag in png_set_rows() so png_write_png() + will actually write IDATs. + Made the default PNG_USE_LOCAL_ARRAYS depend on PNG_DLL instead of WIN32. + Make png_free_data() ignore its final parameter except when freeing data + that can have multiple instances (text, sPLT, unknowns). + Fixed a new bug in png_set_rows(). + Removed info_ptr->valid tests from png_free_data(), as in version 1.0.5. + Added png_set_invalid() function. + Fixed incorrect illustrations of png_destroy_write_struct() in example.c. + +Version 1.0.7beta15 [May 30, 2000] + Revised the deliberately erroneous Linux setjmp code in pngconf.h to produce + fewer error messages. + Rearranged checks for Z_OK to check the most likely path first in pngpread.c + and pngwutil.c. + Added checks in pngtest.c for png_create_*() returning NULL, and mentioned + in libpng.txt/libpng.3 the need for applications to check this. + Changed names of png_default_*() functions in pngtest to pngtest_*(). + Changed return type of png_get_x|y_offset_*() from png_uint_32 to png_int_32. + Fixed some bugs in the unused PNG_INCH_CONVERSIONS functions in pngget.c + Set each pointer to NULL after freeing it in png_free_data(). + Worked around a problem in pngconf.h; AIX's strings.h defines an "index" + macro that conflicts with libpng's png_color_16.index. (Dimitri + Papadapoulos) + Added "msvc" directory with MSVC++ project files (Simon-Pierre Cadieux). + +Version 1.0.7beta16 [June 4, 2000] + Revised the workaround of AIX string.h "index" bug. + Added a check for overlength PLTE chunk in pngrutil.c. + Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer + indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler. + Added a warning in png_decompress_chunk() when it runs out of data, e.g. + when it tries to read an erroneous PhotoShop iCCP chunk. + Added PNG_USE_DLL macro. + Revised the copyright/disclaimer/license notice. + Added contrib/msvctest directory + +Version 1.0.7rc1 [June 9, 2000] + Corrected the definition of PNG_TRANSFORM_INVERT_ALPHA (0x0400 not 0x0200) + Added contrib/visupng directory (Willem van Schaik) + +Version 1.0.7beta18 [June 23, 2000] + Revised PNGAPI definition, and pngvcrd.c to work with __GCC__ + and do not redefine PNGAPI if it is passed in via a compiler directive. + Revised visupng/PngFile.c to remove returns from within the Try block. + Removed leading underscores from "_PNG_H" and "_PNG_SAVE_BSD_SOURCE" macros. + Updated contrib/visupng/cexcept.h to version 1.0.0. + Fixed bugs in pngwrite.c and pngwutil.c that prevented writing iCCP chunks. + +Version 1.0.7rc2 [June 28, 2000] + Updated license to include disclaimers required by UCITA. + Fixed "DJBPP" typo in pnggccrd.c introduced in beta18. + +Version 1.0.7 [July 1, 2000] + Revised the definition of "trans_values" in libpng.3/libpng.txt + +Version 1.0.8beta1 [July 8, 2000] + Added png_free(png_ptr, key) two places in pngpread.c to stop memory leaks. + Changed PNG_NO_STDIO to PNG_NO_CONSOLE_IO, several places in pngrutil.c and + pngwutil.c. + Changed PNG_EXPORT_VAR to use PNG_IMPEXP, in pngconf.h. + Removed unused "#include " from png.c + Added WindowsCE support. + Revised pnggccrd.c to work with gcc-2.95.2 and in the Cygwin environment. + +Version 1.0.8beta2 [July 10, 2000] + Added project files to the wince directory and made further revisions + of pngtest.c, pngrio.c, and pngwio.c in support of WindowsCE. + +Version 1.0.8beta3 [July 11, 2000] + Only set the PNG_FLAG_FREE_TRNS or PNG_FREE_TRNS flag in png_handle_tRNS() + for indexed-color input files to avoid potential double-freeing trans array + under some unusual conditions; problem was introduced in version 1.0.6f. + Further revisions to pngtest.c and files in the wince subdirectory. + +Version 1.0.8beta4 [July 14, 2000] + Added the files pngbar.png and pngbar.jpg to the distribution. + Added makefile.cygwin, and cygwin support in pngconf.h + Added PNG_NO_ZALLOC_ZERO macro (makes png_zalloc skip zeroing memory) + +Version 1.0.8rc1 [July 16, 2000] + Revised png_debug() macros and statements to eliminate compiler warnings. + +Version 1.0.8 [July 24, 2000] + Added png_flush() in pngwrite.c, after png_write_IEND(). + Updated makefile.hpux to build a shared library. + +Version 1.0.9beta1 [November 10, 2000] + Fixed typo in scripts/makefile.hpux + Updated makevms.com in scripts and contrib/* and contrib/* (Martin Zinser) + Fixed seqence-point bug in contrib/pngminus/png2pnm (Martin Zinser) + Changed "cdrom.com" in documentation to "libpng.org" + Revised pnggccrd.c to get it all working, and updated makefile.gcmmx (Greg). + Changed type of "params" from voidp to png_voidp in png_read|write_png(). + Make sure PNGAPI and PNG_IMPEXP are defined in pngconf.h. + Revised the 3 instances of WRITEFILE in pngtest.c. + Relocated "msvc" and "wince" project subdirectories into "dll" subdirectory. + Updated png.rc in dll/msvc project + Revised makefile.dec to define and use LIBPATH and INCPATH + Increased size of global png_libpng_ver[] array from 12 to 18 chars. + Made global png_libpng_ver[], png_sig[] and png_pass_*[] arrays const. + Removed duplicate png_crc_finish() from png_handle_bKGD() function. + Added a warning when application calls png_read_update_info() multiple times. + Revised makefile.cygwin + Fixed bugs in iCCP support in pngrutil.c and pngwutil.c. + Replaced png_set_empty_plte_permitted() with png_permit_mng_features(). + +Version 1.0.9beta2 [November 19, 2000] + Renamed the "dll" subdirectory "projects". + Added borland project files to "projects" subdirectory. + Set VS_FF_PRERELEASE and VS_FF_PATCHED flags in msvc/png.rc when appropriate. + Add error message in png_set_compression_buffer_size() when malloc fails. + +Version 1.0.9beta3 [November 23, 2000] + Revised PNG_LIBPNG_BUILD_TYPE macro in png.h, used in the msvc project. + Removed the png_flush() in pngwrite.c that crashes some applications + that don't set png_output_flush_fn. + Added makefile.macosx and makefile.aix to scripts directory. + +Version 1.0.9beta4 [December 1, 2000] + Change png_chunk_warning to png_warning in png_check_keyword(). + Increased the first part of msg buffer from 16 to 18 in png_chunk_error(). + +Version 1.0.9beta5 [December 15, 2000] + Added support for filter method 64 (for PNG datastreams embedded in MNG). + +Version 1.0.9beta6 [December 18, 2000] + Revised png_set_filter() to accept filter method 64 when appropriate. + Added new PNG_HAVE_PNG_SIGNATURE bit to png_ptr->mode and use it to + help prevent applications from using MNG features in PNG datastreams. + Added png_permit_mng_features() function. + Revised libpng.3/libpng.txt. Changed "filter type" to "filter method". + +Version 1.0.9rc1 [December 23, 2000] + Revised test for PNG_HAVE_PNG_SIGNATURE in pngrutil.c + Fixed error handling of unknown compression type in png_decompress_chunk(). + In pngconf.h, define __cdecl when _MSC_VER is defined. + +Version 1.0.9beta7 [December 28, 2000] + Changed PNG_TEXT_COMPRESSION_zTXt to PNG_COMPRESSION_TYPE_BASE several places. + Revised memory management in png_set_hIST and png_handle_hIST in a backward + compatible manner. PLTE and tRNS were revised similarly. + Revised the iCCP chunk reader to ignore trailing garbage. + +Version 1.0.9beta8 [January 12, 2001] + Moved pngasmrd.h into pngconf.h. + Improved handling of out-of-spec garbage iCCP chunks generated by PhotoShop. + +Version 1.0.9beta9 [January 15, 2001] + Added png_set_invalid, png_permit_mng_features, and png_mmx_supported to + wince and msvc project module definition files. + Minor revision of makefile.cygwin. + Fixed bug with progressive reading of narrow interlaced images in pngpread.c + +Version 1.0.9beta10 [January 16, 2001] + Do not typedef png_FILE_p in pngconf.h when PNG_NO_STDIO is defined. + Fixed "png_mmx_supported" typo in project definition files. + +Version 1.0.9beta11 [January 19, 2001] + Updated makefile.sgi to make shared library. + Removed png_mmx_support() function and disabled PNG_MNG_FEATURES_SUPPORTED + by default, for the benefit of DLL forward compatibility. These will + be re-enabled in version 1.2.0. + +Version 1.0.9rc2 [January 22, 2001] + Revised cygwin support. + +Version 1.0.9 [January 31, 2001] + Added check of cygwin's ALL_STATIC in pngconf.h + Added "-nommx" parameter to contrib/gregbook/rpng2-win and rpng2-x demos. + +Version 1.0.10beta1 [March 14, 2001] + Revised makefile.dec, makefile.sgi, and makefile.sggcc; added makefile.hpgcc. + Reformatted libpng.3 to eliminate bad line breaks. + Added checks for _mmx_supported in the read_filter_row function of pnggccrd.c + Added prototype for png_mmx_support() near the top of pnggccrd.c + Moved some error checking from png_handle_IHDR to png_set_IHDR. + Added PNG_NO_READ_SUPPORTED and PNG_NO_WRITE_SUPPORTED macros. + Revised png_mmx_support() function in pnggccrd.c + Restored version 1.0.8 PNG_WRITE_EMPTY_PLTE_SUPPORTED behavior in pngwutil.c + Fixed memory leak in contrib/visupng/PngFile.c + Fixed bugs in png_combine_row() in pnggccrd.c and pngvcrd.c (C version) + Added warnings when retrieving or setting gamma=0. + Increased the first part of msg buffer from 16 to 18 in png_chunk_warning(). + +Version 1.0.10rc1 [March 23, 2001] + Changed all instances of memcpy, strcpy, and strlen to png_memcpy, png_strcpy, + and png_strlen. + Revised png_mmx_supported() function in pnggccrd.c to return proper value. + Fixed bug in progressive reading (pngpread.c) with small images (height < 8). + +Version 1.0.10 [March 30, 2001] + Deleted extraneous space (introduced in 1.0.9) from line 42 of makefile.cygwin + Added beos project files (Chris Herborth) + +Version 1.0.11beta1 [April 3, 2001] + Added type casts on several png_malloc() calls (Dimitri Papadapoulos). + Removed a no-longer needed AIX work-around from pngconf.h + Changed several "//" single-line comments to C-style in pnggccrd.c + +Version 1.0.11beta2 [April 11, 2001] + Removed PNGAPI from several functions whose prototypes did not have PNGAPI. + Updated scripts/pngos2.def + +Version 1.0.11beta3 [April 14, 2001] + Added checking the results of many instances of png_malloc() for NULL + +Version 1.0.11beta4 [April 20, 2001] + Undid the changes from version 1.0.11beta3. Added a check for NULL return + from user's malloc_fn(). + Removed some useless type casts of the NULL pointer. + Added makefile.netbsd + +Version 1.0.11 [April 27, 2001] + Revised makefile.netbsd + +Version 1.0.12beta1 [May 14, 2001] + Test for Windows platform in pngconf.h when including malloc.h (Emmanuel Blot) + Updated makefile.cygwin and handling of Cygwin's ALL_STATIC in pngconf.h + Added some never-to-be-executed code in pnggccrd.c to quiet compiler warnings. + Eliminated the png_error about apps using png_read|write_init(). Instead, + libpng will reallocate the png_struct and info_struct if they are too small. + This retains future binary compatibility for old applications written for + libpng-0.88 and earlier. + +Version 1.2.0beta1 [May 6, 2001] + Bumped DLLNUM to 2. + Re-enabled PNG_MNG_FEATURES_SUPPORTED and enabled PNG_ASSEMBLER_CODE_SUPPORTED + by default. + Added runtime selection of MMX features. + Added png_set_strip_error_numbers function and related macros. + +Version 1.2.0beta2 [May 7, 2001] + Finished merging 1.2.0beta1 with version 1.0.11 + Added a check for attempts to read or write PLTE in grayscale PNG datastreams. + +Version 1.2.0beta3 [May 17, 2001] + Enabled user memory function by default. + Modified png_create_struct so it passes user mem_ptr to user memory allocator. + Increased png_mng_features flag from png_byte to png_uint_32. + Bumped shared-library (so-number) and dll-number to 3. + +Version 1.2.0beta4 [June 23, 2001] + Check for missing profile length field in iCCP chunk and free chunk_data + in case of truncated iCCP chunk. + Bumped shared-library number to 3 in makefile.sgi and makefile.sggcc + Bumped dll-number from 2 to 3 in makefile.cygwin + Revised contrib/gregbook/rpng*-x.c to avoid a memory leak and to exit cleanly + if user attempts to run it on an 8-bit display. + Updated contrib/gregbook + Use png_malloc instead of png_zalloc to allocate palette in pngset.c + Updated makefile.ibmc + Added some typecasts to eliminate gcc 3.0 warnings. Changed prototypes + of png_write_oFFS width and height from png_uint_32 to png_int_32. + Updated example.c + Revised prototypes for png_debug_malloc and png_debug_free in pngtest.c + +Version 1.2.0beta5 [August 8, 2001] + Revised contrib/gregbook + Revised makefile.gcmmx + Revised pnggccrd.c to conditionally compile some thread-unsafe code only + when PNG_THREAD_UNSAFE_OK is defined. + Added tests to prevent pngwutil.c from writing a bKGD or tRNS chunk with + value exceeding 2^bit_depth-1 + Revised makefile.sgi and makefile.sggcc + Replaced calls to fprintf(stderr,...) with png_warning() in pnggccrd.c + Removed restriction that do_invert_mono only operate on 1-bit opaque files + +Version 1.2.0 [September 1, 2001] + Changed a png_warning() to png_debug() in pnggccrd.c + Fixed contrib/gregbook/rpng-x.c, rpng2-x.c to avoid crash with XFreeGC(). + +Version 1.2.1beta1 [October 19, 2001] + Revised makefile.std in contrib/pngminus + Include background_1 in png_struct regardless of gamma support. + Revised makefile.netbsd and makefile.macosx, added makefile.darwin. + Revised example.c to provide more details about using row_callback(). + +Version 1.2.1beta2 [October 25, 2001] + Added type cast to each NULL appearing in a function call, except for + WINCE functions. + Added makefile.so9. + +Version 1.2.1beta3 [October 27, 2001] + Removed type casts from all NULLs. + Simplified png_create_struct_2(). + +Version 1.2.1beta4 [November 7, 2001] + Revised png_create_info_struct() and png_creat_struct_2(). + Added error message if png_write_info() was omitted. + Type cast NULLs appearing in function calls when _NO_PROTO or + PNG_TYPECAST_NULL is defined. + +Version 1.2.1rc1 [November 24, 2001] + Type cast NULLs appearing in function calls except when PNG_NO_TYPECAST_NULL + is defined. + Changed typecast of "size" argument to png_size_t in pngmem.c calls to + the user malloc_fn, to agree with the prototype in png.h + Added a pop/push operation to pnggccrd.c, to preserve Eflag (Maxim Sobolev) + Updated makefile.sgi to recognize LIBPATH and INCPATH. + Updated various makefiles so "make clean" does not remove previous major + version of the shared library. + +Version 1.2.1rc2 [December 4, 2001] + Always allocate 256-entry internal palette, hist, and trans arrays, to + avoid out-of-bounds memory reference caused by invalid PNG datastreams. + Added a check for prefix_length > data_length in iCCP chunk handler. + +Version 1.2.1 [December 7, 2001] + None. + +Version 1.2.2beta1 [February 22, 2002] + Fixed a bug with reading the length of iCCP profiles (Larry Reeves). + Revised makefile.linux, makefile.gcmmx, and makefile.sgi to generate + libpng.a, libpng12.so (not libpng.so.3), and libpng12/png.h + Revised makefile.darwin to remove "-undefined suppress" option. + Added checks for gamma and chromaticity values over 21474.83, which exceed + the limit for PNG unsigned 32-bit integers when encoded. + Revised calls to png_create_read_struct() and png_create_write_struct() + for simpler debugging. + Revised png_zalloc() so zlib handles errors (uses PNG_FLAG_MALLOC_NULL_MEM_OK) + +Version 1.2.2beta2 [February 23, 2002] + Check chunk_length and idat_size for invalid (over PNG_MAX_UINT) lengths. + Check for invalid image dimensions in png_get_IHDR. + Added missing "fi;" in the install target of the SGI makefiles. + Added install-static to all makefiles that make shared libraries. + Always do gamma compensation when image is partially transparent. + +Version 1.2.2beta3 [March 7, 2002] + Compute background.gray and background_1.gray even when color_type is RGB + in case image gets reduced to gray later. + Modified shared-library makefiles to install pkgconfig/libpngNN.pc. + Export (with PNGAPI) png_zalloc, png_zfree, and png_handle_as_unknown + Removed unused png_write_destroy_info prototype from png.h + Eliminated incorrect use of width_mmx from pnggccrd.c in pixel_bytes == 8 case + Added install-shared target to all makefiles that make shared libraries. + Stopped a double free of palette, hist, and trans when not using free_me. + Added makefile.32sunu for Sun Ultra 32 and makefile.64sunu for Sun Ultra 64. + +Version 1.2.2beta4 [March 8, 2002] + Compute background.gray and background_1.gray even when color_type is RGB + in case image gets reduced to gray later (Jason Summers). + Relocated a misplaced /bin/rm in the "install-shared" makefile targets + Added PNG_1_0_X macro which can be used to build a 1.0.x-compatible library. + +Version 1.2.2beta5 [March 26, 2002] + Added missing PNGAPI to several function definitions. + Check for invalid bit_depth or color_type in png_get_IHDR(), and + check for missing PLTE or IHDR in png_push_read_chunk() (Matthias Clasen). + Revised iTXt support to accept NULL for lang and lang_key. + Compute gamma for color components of background even when color_type is gray. + Changed "()" to "{}" in scripts/libpng.pc.in. + Revised makefiles to put png.h and pngconf.h only in $prefix/include/libpngNN + Revised makefiles to make symlink to libpng.so.NN in addition to libpngNN.so + +Version 1.2.2beta6 [March 31, 2002] + +Version 1.0.13beta1 [March 31, 2002] + Prevent png_zalloc() from trying to memset memory that it failed to acquire. + Add typecasts of PNG_MAX_UINT in pngset_cHRM_fixed() (Matt Holgate). + Ensure that the right function (user or default) is used to free the + png_struct after an error in png_create_read_struct_2(). + +Version 1.2.2rc1 [April 7, 2002] + +Version 1.0.13rc1 [April 7, 2002] + Save the ebx register in pnggccrd.c (Sami Farin) + Add "mem_ptr = png_ptr->mem_ptr" in png_destroy_write_struct() (Paul Gardner). + Updated makefiles to put headers in include/libpng and remove old include/*.h. + +Version 1.2.2 [April 15, 2002] + +Version 1.0.13 [April 15, 2002] + Revised description of png_set_filter() in libpng.3/libpng.txt. + Revised makefile.netbsd and added makefile.neNNbsd and makefile.freebsd + +Version 1.0.13patch01 [April 17, 2002] + +Version 1.2.2patch01 [April 17, 2002] + Changed ${PNGMAJ}.${PNGVER} bug to ${PNGVER} in makefile.sgi and + makefile.sggcc + Fixed VER -> PNGVER typo in makefile.macosx and added install-static to + install + Added install: target to makefile.32sunu and makefile.64sunu + +Version 1.0.13patch03 [April 18, 2002] + +Version 1.2.2patch03 [April 18, 2002] + Revised 15 makefiles to link libpng.a to libpngNN.a and the include libpng + subdirectory to libpngNN subdirectory without the full pathname. + Moved generation of libpng.pc from "install" to "all" in 15 makefiles. + +Version 1.2.3rc1 [April 28, 2002] + Added install-man target to 15 makefiles (Dimitri Papadopolous-Orfanos). + Added $(DESTDIR) feature to 24 makefiles (Tim Mooney) + Fixed bug with $prefix, should be $(prefix) in makefile.hpux. + Updated cygwin-specific portion of pngconf.h and revised makefile.cygwin + Added a link from libpngNN.pc to libpng.pc in 15 makefiles. + Added links from include/libpngNN/*.h to include/*.h in 24 makefiles. + Revised makefile.darwin to make relative links without full pathname. + Added setjmp() at the end of png_create_*_struct_2() in case user forgets + to put one in their application. + Restored png_zalloc() and png_zfree() prototypes to version 1.2.1 and + removed them from module definition files. + +Version 1.2.3rc2 [May 1, 2002] + Fixed bug in reporting number of channels in pngget.c and pngset.c, + that was introduced in version 1.2.2beta5. + Exported png_zalloc(), png_zfree(), png_default_read(), png_default_write(), + png_default_flush(), and png_push_fill_buffer() and included them in + module definition files. + Added "libpng.pc" dependency to the "install-shared" target in 15 makefiles. + +Version 1.2.3rc3 [May 1, 2002] + Revised prototype for png_default_flush() + Remove old libpng.pc and libpngNN.pc before installing new ones. + +Version 1.2.3rc4 [May 2, 2002] + Typos in *.def files (png_default_read|write -> png_default_read|write_data) + In makefiles, changed rm libpng.NN.pc to rm libpngNN.pc + Added libpng-config and libpngNN-config and modified makefiles to install + them. + Changed $(MANPATH) to $(DESTDIR)$(MANPATH) in makefiles + Added "Win32 DLL VB" configuration to projects/msvc/libpng.dsp + +Version 1.2.3rc5 [May 11, 2002] + Changed "error" and "message" in prototypes to "error_message" and + "warning_message" to avoid namespace conflict. + Revised 15 makefiles to build libpng-config from libpng-config-*.in + Once more restored png_zalloc and png_zfree to regular nonexported form. + Restored png_default_read|write_data, png_default_flush, png_read_fill_buffer + to nonexported form, but with PNGAPI, and removed them from module def + files. + +Version 1.2.3rc6 [May 14, 2002] + Removed "PNGAPI" from png_zalloc() and png_zfree() in png.c + Changed "Gz" to "Gd" in projects/msvc/libpng.dsp and zlib.dsp. + Removed leftover libpng-config "sed" script from four makefiles. + Revised libpng-config creating script in 16 makefiles. + +Version 1.2.3 [May 22, 2002] + Revised libpng-config target in makefile.cygwin. + Removed description of png_set_mem_fn() from documentation. + Revised makefile.freebsd. + Minor cosmetic changes to 15 makefiles, e.g., $(DI) = $(DESTDIR)/$(INCDIR). + Revised projects/msvc/README.txt + Changed -lpng to -lpngNN in LDFLAGS in several makefiles. + +Version 1.2.4beta1 [May 24, 2002] + Added libpng.pc and libpng-config to "all:" target in 16 makefiles. + Fixed bug in 16 makefiles: $(DESTDIR)/$(LIBPATH) to $(DESTDIR)$(LIBPATH) + Added missing "\" before closing double quote in makefile.gcmmx. + Plugged various memory leaks; added png_malloc_warn() and png_set_text_2() + functions. + +Version 1.2.4beta2 [June 25, 2002] + Plugged memory leak of png_ptr->current_text (Matt Holgate). + Check for buffer overflow before reading CRC in pngpread.c (Warwick Allison) + Added -soname to the loader flags in makefile.dec, makefile.sgi, and + makefile.sggcc. + Added "test-installed" target to makefile.linux, makefile.gcmmx, + makefile.sgi, and makefile.sggcc. + +Version 1.2.4beta3 [June 28, 2002] + Plugged memory leak of row_buf in pngtest.c when there is a png_error(). + Detect buffer overflow in pngpread.c when IDAT is corrupted with extra data. + Added "test-installed" target to makefile.32sunu, makefile.64sunu, + makefile.beos, makefile.darwin, makefile.dec, makefile.macosx, + makefile.solaris, makefile.hpux, makefile.hpgcc, and makefile.so9. + +Version 1.2.4rc1 and 1.0.14rc1 [July 2, 2002] + Added "test-installed" target to makefile.cygwin and makefile.sco. + Revised pnggccrd.c to be able to back out version 1.0.x via PNG_1_0_X macro. + +Version 1.2.4 and 1.0.14 [July 8, 2002] + Changed png_warning() to png_error() when width is too large to process. + +Version 1.2.4patch01 [July 20, 2002] + Revised makefile.cygwin to use DLL number 12 instead of 13. + +Version 1.2.5beta1 [August 6, 2002] + Added code to contrib/gregbook/readpng2.c to ignore unused chunks. + Replaced toucan.png in contrib/gregbook (it has been corrupt since 1.0.11) + Removed some stray *.o files from contrib/gregbook. + Changed png_error() to png_warning() about "Too much data" in pngpread.c + and about "Extra compressed data" in pngrutil.c. + Prevent png_ptr->pass from exceeding 7 in png_push_finish_row(). + Updated makefile.hpgcc + Updated png.c and pnggccrd.c handling of return from png_mmx_support() + +Version 1.2.5beta2 [August 15, 2002] + Only issue png_warning() about "Too much data" in pngpread.c when avail_in + is nonzero. + Updated makefiles to install a separate libpng.so.3 with its own rpath. + +Version 1.2.5rc1 and 1.0.15rc1 [August 24, 2002] + Revised makefiles to not remove previous minor versions of shared libraries. + +Version 1.2.5rc2 and 1.0.15rc2 [September 16, 2002] + Revised 13 makefiles to remove "-lz" and "-L$(ZLIBLIB)", etc., from shared + library loader directive. + Added missing "$OBJSDLL" line to makefile.gcmmx. + Added missing "; fi" to makefile.32sunu. + +Version 1.2.5rc3 and 1.0.15rc3 [September 18, 2002] + Revised libpng-config script. + +Version 1.2.5 and 1.0.15 [October 3, 2002] + Revised makefile.macosx, makefile.darwin, makefile.hpgcc, and makefile.hpux, + and makefile.aix. + Relocated two misplaced PNGAPI lines in pngtest.c + +Version 1.2.6beta1 [October 22, 2002] + Commented out warning about uninitialized mmx_support in pnggccrd.c. + Changed "IBMCPP__" flag to "__IBMCPP__" in pngconf.h. + Relocated two more misplaced PNGAPI lines in pngtest.c + Fixed memory overrun bug in png_do_read_filler() with 16-bit datastreams, + introduced in version 1.0.2. + Revised makefile.macosx, makefile.dec, makefile.aix, and makefile.32sunu. + +Version 1.2.6beta2 [November 1, 2002] + Added libpng-config "--ldopts" output. + Added "AR=ar" and "ARFLAGS=rc" and changed "ar rc" to "$(AR) $(ARFLAGS)" + in makefiles. + +Version 1.2.6beta3 [July 18, 2004] + Reverted makefile changes from version 1.2.6beta2 and some of the changes + from version 1.2.6beta1; these will be postponed until version 1.2.7. + Version 1.2.6 is going to be a simple bugfix release. + Changed the one instance of "ln -sf" to "ln -f -s" in each Sun makefile. + Fixed potential overrun in pngerror.c by using strncpy instead of memcpy. + Added "#!/bin/sh" at the top of configure, for recognition of the + 'x' flag under Cygwin (Cosmin). + Optimized vacuous tests that silence compiler warnings, in png.c (Cosmin). + Added support for PNG_USER_CONFIG, in pngconf.h (Cosmin). + Fixed the special memory handler for Borland C under DOS, in pngmem.c + (Cosmin). + Removed some spurious assignments in pngrutil.c (Cosmin). + Replaced 65536 with 65536L, and 0xffff with 0xffffL, to silence warnings + on 16-bit platforms (Cosmin). + Enclosed shift op expressions in parentheses, to silence warnings (Cosmin). + Used proper type png_fixed_point, to avoid problems on 16-bit platforms, + in png_handle_sRGB() (Cosmin). + Added compression_type to png_struct, and optimized the window size + inside the deflate stream (Cosmin). + Fixed definition of isnonalpha(), in pngerror.c and pngrutil.c (Cosmin). + Fixed handling of unknown chunks that come after IDAT (Cosmin). + Allowed png_error() and png_warning() to work even if png_ptr == NULL + (Cosmin). + Replaced row_info->rowbytes with row_bytes in png_write_find_filter() + (Cosmin). + Fixed definition of PNG_LIBPNG_VER_DLLNUM (Simon-Pierre). + Used PNG_LIBPNG_VER and PNG_LIBPNG_VER_STRING instead of the hardcoded + values in png.c (Simon-Pierre, Cosmin). + Initialized png_libpng_ver[] with PNG_LIBPNG_VER_STRING (Simon-Pierre). + Replaced PNG_LIBPNG_VER_MAJOR with PNG_LIBPNG_VER_DLLNUM in png.rc + (Simon-Pierre). + Moved the definition of PNG_HEADER_VERSION_STRING near the definitions + of the other PNG_LIBPNG_VER_... symbols in png.h (Cosmin). + Relocated #ifndef PNGAPI guards in pngconf.h (Simon-Pierre, Cosmin). + Updated scripts/makefile.vc(a)win32 (Cosmin). + Updated the MSVC project (Simon-Pierre, Cosmin). + Updated the Borland C++ Builder project (Cosmin). + Avoided access to asm_flags in pngvcrd.c, if PNG_1_0_X is defined (Cosmin). + Commented out warning about uninitialized mmx_support in pngvcrd.c (Cosmin). + Removed scripts/makefile.bd32 and scripts/pngdef.pas (Cosmin). + Added extra guard around inclusion of Turbo C memory headers, in pngconf.h + (Cosmin). + Renamed projects/msvc/ to projects/visualc6/, and projects/borland/ to + projects/cbuilder5/ (Cosmin). + Moved projects/visualc6/png32ms.def to scripts/pngw32.def, + and projects/visualc6/png.rc to scripts/pngw32.rc (Cosmin). + Added projects/visualc6/pngtest.dsp; removed contrib/msvctest/ (Cosmin). + Changed line endings to DOS style in cbuilder5 and visualc6 files, even + in the tar.* distributions (Cosmin). + Updated contrib/visupng/VisualPng.dsp (Cosmin). + Updated contrib/visupng/cexcept.h to version 2.0.0 (Cosmin). + Added a separate distribution with "configure" and supporting files (Junichi). + +Version 1.2.6beta4 [July 28, 2004] + Added user ability to change png_size_t via a PNG_SIZE_T macro. + Added png_sizeof() and png_convert_size() functions. + Added PNG_SIZE_MAX (maximum value of a png_size_t variable. + Added check in png_malloc_default() for (size_t)size != (png_uint_32)size + which would indicate an overflow. + Changed sPLT failure action from png_error to png_warning and abandon chunk. + Changed sCAL and iCCP failures from png_error to png_warning and abandon. + Added png_get_uint_31(png_ptr, buf) function. + Added PNG_UINT_32_MAX macro. + Renamed PNG_MAX_UINT to PNG_UINT_31_MAX. + Made png_zalloc() issue a png_warning and return NULL on potential + overflow. + Turn on PNG_NO_ZALLOC_ZERO by default in version 1.2.x + Revised "clobber list" in pnggccrd.c so it will compile under gcc-3.4. + Revised Borland portion of png_malloc() to return NULL or issue + png_error() according to setting of PNG_FLAG_MALLOC_NULL_MEM_OK. + Added PNG_NO_SEQUENTIAL_READ_SUPPORTED macro to conditionally remove + sequential read support. + Added some "#if PNG_WRITE_SUPPORTED" blocks. + Added #ifdef to remove some redundancy in png_malloc_default(). + Use png_malloc instead of png_zalloc to allocate the pallete. + +Version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004] + Fixed buffer overflow vulnerability in png_handle_tRNS() + Fixed integer arithmetic overflow vulnerability in png_read_png(). + Fixed some harmless bugs in png_handle_sBIT, etc, that would cause + duplicate chunk types to go undetected. + Fixed some timestamps in the -config version + Rearranged order of processing of color types in png_handle_tRNS(). + Added ROWBYTES macro to calculate rowbytes without integer overflow. + Updated makefile.darwin and removed makefile.macosx from scripts directory. + Imposed default one million column, one-million row limits on the image + dimensions, and added png_set_user_limits() function to override them. + Revised use of PNG_SET_USER_LIMITS_SUPPORTED macro. + Fixed wrong cast of returns from png_get_user_width|height_max(). + Changed some "keep the compiler happy" from empty statements to returns, + Revised libpng.txt to remove 1.2.x stuff from the 1.0.x distribution + +Version 1.0.16rc2 and 1.2.6rc2 [August 7, 2004] + Revised makefile.darwin and makefile.solaris. Removed makefile.macosx. + Revised pngtest's png_debug_malloc() to use png_malloc() instead of + png_malloc_default() which is not supposed to be exported. + Fixed off-by-one error in one of the conversions to PNG_ROWBYTES() in + pngpread.c. Bug was introduced in 1.2.6rc1. + Fixed bug in RGB to RGBX transformation introduced in 1.2.6rc1. + Fixed old bug in RGB to Gray transformation. + Fixed problem with 64-bit compilers by casting arguments to abs() + to png_int_32. + Changed "ln -sf" to "ln -f -s" in three makefiles (solaris, sco, so9). + Changed "HANDLE_CHUNK_*" to "PNG_HANDLE_CHUNK_*" (Cosmin) + Added "-@/bin/rm -f $(DL)/$(LIBNAME).so.$(PNGMAJ)" to 15 *NIX makefiles. + Added code to update the row_info->colortype in png_do_read_filler() (MSB). + +Version 1.0.16rc3 and 1.2.6rc3 [August 9, 2004] + Eliminated use of "abs()" in testing cHRM and gAMA values, to avoid + trouble with some 64-bit compilers. Created PNG_OUT_OF_RANGE() macro. + Revised documentation of png_set_keep_unknown_chunks(). + Check handle_as_unknown status in pngpread.c, as in pngread.c previously. + Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_INTERNAL section of png.h + Added "rim" definitions for CONST4 and CONST6 in pnggccrd.c + +Version 1.0.16rc4 and 1.2.6rc4 [August 10, 2004] + Fixed mistake in pngtest.c introduced in 1.2.6rc2 (declaration of + "pinfo" was out of place). + +Version 1.0.16rc5 and 1.2.6rc5 [August 10, 2004] + Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_ASSEMBLER_CODE_SUPPORTED + section of png.h where they were inadvertently placed in version rc3. + +Version 1.2.6 and 1.0.16 [August 15, 2004] + Revised pngtest so memory allocation testing is only done when PNG_DEBUG==1. + +Version 1.2.7beta1 [August 26, 2004] + Removed unused pngasmrd.h file. + Removed references to uu.net for archived files. Added references to + PNG Spec (second edition) and the PNG ISO/IEC Standard. + Added "test-dd" target in 15 makefiles, to run pngtest in DESTDIR. + Fixed bug with "optimized window size" in the IDAT datastream, that + causes libpng to write PNG files with incorrect zlib header bytes. + +Version 1.2.7beta2 [August 28, 2004] + Fixed bug with sCAL chunk and big-endian machines (David Munro). + Undid new code added in 1.2.6rc2 to update the color_type in + png_set_filler(). + Added png_set_add_alpha() that updates color type. + +Version 1.0.17rc1 and 1.2.7rc1 [September 4, 2004] + Revised png_set_strip_filler() to not remove alpha if color_type has alpha. + +Version 1.2.7 and 1.0.17 [September 12, 2004] + Added makefile.hp64 + Changed projects/msvc/png32ms.def to scripts/png32ms.def in makefile.cygwin + +Version 1.2.8beta1 [November 1, 2004] + Fixed bug in png_text_compress() that would fail to complete a large block. + Fixed bug, introduced in libpng-1.2.7, that overruns a buffer during + strip alpha operation in png_do_strip_filler(). + Added PNG_1_2_X definition in pngconf.h + Use #ifdef to comment out png_info_init in png.c and png_read_init in + pngread.c (as of 1.3.0) + +Version 1.2.8beta2 [November 2, 2004] + Reduce color_type to a nonalpha type after strip alpha operation in + png_do_strip_filler(). + +Version 1.2.8beta3 [November 3, 2004] + Revised definitions of PNG_MAX_UINT_32, PNG_MAX_SIZE, and PNG_MAXSUM + +Version 1.2.8beta4 [November 12, 2004] + Fixed (again) definition of PNG_LIBPNG_VER_DLLNUM in png.h (Cosmin). + Added PNG_LIBPNG_BUILD_PRIVATE in png.h (Cosmin). + Set png_ptr->zstream.data_type to Z_BINARY, to avoid unnecessary detection + of data type in deflate (Cosmin). + Deprecated but continue to support SPECIALBUILD and PRIVATEBUILD in favor of + PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. + +Version 1.2.8beta5 [November 20, 2004] + Use png_ptr->flags instead of png_ptr->transformations to pass + PNG_STRIP_ALPHA info to png_do_strip_filler(), to preserve ABI + compatibility. + Revised handling of SPECIALBUILD, PRIVATEBUILD, + PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. + +Version 1.2.8rc1 [November 24, 2004] + Moved handling of BUILD macros from pngconf.h to png.h + Added definition of PNG_LIBPNG_BASE_TYPE in png.h, inadvertently + omitted from beta5. + Revised scripts/pngw32.rc + Despammed mailing addresses by masking "@" with "at". + Inadvertently installed a supposedly faster test version of pngrutil.c + +Version 1.2.8rc2 [November 26, 2004] + Added two missing "\" in png.h + Change tests in pngread.c and pngpread.c to + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); + +Version 1.2.8rc3 [November 28, 2004] + Reverted pngrutil.c to version libpng-1.2.8beta5. + Added scripts/makefile.elf with supporting code in pngconf.h for symbol + versioning (John Bowler). + +Version 1.2.8rc4 [November 29, 2004] + Added projects/visualc7 (Simon-pierre). + +Version 1.2.8rc5 [November 29, 2004] + Fixed new typo in scripts/pngw32.rc + +Version 1.2.8 [December 3, 2004] + Removed projects/visualc7, added projects/visualc71. + +Version 1.2.9beta1 [February 21, 2006] + Initialized some structure members in pngwutil.c to avoid gcc-4.0.0 complaints + Revised man page and libpng.txt to make it clear that one should not call + png_read_end or png_write_end after png_read_png or png_write_png. + Updated references to png-mng-implement mailing list. + Fixed an incorrect typecast in pngrutil.c + Added PNG_NO_READ_SUPPORTED conditional for making a write-only library. + Added PNG_NO_WRITE_INTERLACING_SUPPORTED conditional. + Optimized alpha-inversion loops in pngwtran.c + Moved test for nonzero gamma outside of png_build_gamma_table() in pngrtran.c + Make sure num_trans is <= 256 before copying data in png_set_tRNS(). + Make sure num_palette is <= 256 before copying data in png_set_PLTE(). + Interchanged order of write_swap_alpha and write_invert_alpha transforms. + Added parentheses in the definition of PNG_LIBPNG_BUILD_TYPE (Cosmin). + Optimized zlib window flag (CINFO) in contrib/pngsuite/*.png (Cosmin). + Updated scripts/makefile.bc32 for Borland C++ 5.6 (Cosmin). + Exported png_get_uint_32, png_save_uint_32, png_get_uint_16, png_save_uint_16, + png_get_int_32, png_save_int_32, png_get_uint_31 (Cosmin). + Added type cast (png_byte) in png_write_sCAL() (Cosmin). + Fixed scripts/makefile.cygwin (Christian Biesinger, Cosmin). + Default iTXt support was inadvertently enabled. + +Version 1.2.9beta2 [February 21, 2006] + Check for png_rgb_to_gray and png_gray_to_rgb read transformations before + checking for png_read_dither in pngrtran.c + Revised checking of chromaticity limits to accommodate extended RGB + colorspace (John Denker). + Changed line endings in some of the project files to CRLF, even in the + "Unix" tar distributions (Cosmin). + Made png_get_int_32 and png_save_int_32 always available (Cosmin). + Updated scripts/pngos2.def, scripts/pngw32.def and projects/wince/png32ce.def + with the newly exported functions. + Eliminated distributions without the "configure" script. + Updated INSTALL instructions. + +Version 1.2.9beta3 [February 24, 2006] + Fixed CRCRLF line endings in contrib/visupng/VisualPng.dsp + Made libpng.pc respect EXEC_PREFIX (D. P. Kreil, J. Bowler) + Removed reference to pngasmrd.h from Makefile.am + Renamed CHANGES to ChangeLog. + Renamed LICENSE to COPYING. + Renamed ANNOUNCE to NEWS. + Created AUTHORS file. + +Version 1.2.9beta4 [March 3, 2006] + Changed definition of PKGCONFIG from $prefix/lib to $libdir in configure.ac + Reverted to filenames LICENSE and ANNOUNCE; removed AUTHORS and COPYING. + Removed newline from the end of some error and warning messages. + Removed test for sqrt() from configure.ac and configure. + Made swap tables in pngtrans.c PNG_CONST (Carlo Bramix). + Disabled default iTXt support that was inadvertently enabled in + libpng-1.2.9beta1. + Added "OS2" to list of systems that don't need underscores, in pnggccrd.c + Removed libpng version and date from *.c files. + +Version 1.2.9beta5 [March 4, 2006] + Removed trailing blanks from source files. + Put version and date of latest change in each source file, and changed + copyright year accordingly. + More cleanup of configure.ac, Makefile.am, and associated scripts. + Restored scripts/makefile.elf which was inadvertently deleted. + +Version 1.2.9beta6 [March 6, 2006] + Fixed typo (RELEASE) in configuration files. + +Version 1.2.9beta7 [March 7, 2006] + Removed libpng.vers and libpng.sym from libpng12_la_SOURCES in Makefile.am + Fixed inconsistent #ifdef's around png_sig_bytes() and png_set_sCAL_s() + in png.h. + Updated makefile.elf as suggested by debian. + Made cosmetic changes to some makefiles, adding LN_SF and other macros. + Made some makefiles accept "exec_prefix". + +Version 1.2.9beta8 [March 9, 2006] + Fixed some "#if defined (..." which should be "#if defined(..." + Bug introduced in libpng-1.2.8. + Fixed inconsistency in definition of png_default_read_data() + Restored blank that was lost from makefile.sggcc "clean" target in beta7. + Revised calculation of "current" and "major" for irix in ltmain.sh + Changed "mkdir" to "MKDIR_P" in some makefiles. + Separated PNG_EXPAND and PNG_EXPAND_tRNS. + Added png_set_expand_gray_1_2_4_to_8() and deprecated + png_set_gray_1_2_4_to_8() which also expands tRNS to alpha. + +Version 1.2.9beta9 [March 10, 2006] + Include "config.h" in pngconf.h when available. + Added some checks for NULL png_ptr or NULL info_ptr (timeless) + +Version 1.2.9beta10 [March 20, 2006] + Removed extra CR from contrib/visualpng/VisualPng.dsw (Cosmin) + Made pnggccrd.c PIC-compliant (Christian Aichinger). + Added makefile.mingw (Wolfgang Glas). + Revised pngconf.h MMX checking. + +Version 1.2.9beta11 [March 22, 2006] + Fixed out-of-order declaration in pngwrite.c that was introduced in beta9 + Simplified some makefiles by using LIBSO, LIBSOMAJ, and LIBSOVER macros. + +Version 1.2.9rc1 [March 31, 2006] + Defined PNG_USER_PRIVATEBUILD when including "pngusr.h" (Cosmin). + Removed nonsensical assertion check from pngtest.c (Cosmin). + +Version 1.2.9 [April 14, 2006] + Revised makefile.beos and added "none" selector in ltmain.sh + +Version 1.2.10beta1 [April 15, 2006] + Renamed "config.h" to "png_conf.h" and revised Makefile.am to add + -DPNG_BUILDING_LIBPNG to compile directive, and modified pngconf.h + to include png_conf.h only when PNG_BUILDING_LIBPNG is defined. + +Version 1.2.10beta2 [April 15, 2006] + Manually updated Makefile.in and configure. Changed png_conf.h.in + back to config.h. + +Version 1.2.10beta3 [April 15, 2006] + Change png_conf.h back to config.h in pngconf.h. + +Version 1.2.10beta4 [April 16, 2006] + Change PNG_BUILDING_LIBPNG to PNG_CONFIGURE_LIBPNG in config/Makefile*. + +Version 1.2.10beta5 [April 16, 2006] + Added a configure check for compiling assembler code in pnggccrd.c + +Version 1.2.10beta6 [April 17, 2006] + Revised the configure check for pnggccrd.c + Moved -DPNG_CONFIGURE_LIBPNG into @LIBPNG_DEFINES@ + Added @LIBPNG_DEFINES@ to arguments when building libpng.sym + +Version 1.2.10beta7 [April 18, 2006] + Change "exec_prefix=$prefix" to "exec_prefix=$(prefix)" in makefiles. + +Version 1.2.10rc1 [April 19, 2006] + Ensure pngconf.h doesn't define both PNG_USE_PNGGCCRD and PNG_USE_PNGVCRD + Fixed "LN_FS" typo in makefile.sco and makefile.solaris. + +Version 1.2.10rc2 [April 20, 2006] + Added a backslash between -DPNG_CONFIGURE_LIBPNG and -DPNG_NO_ASSEMBLER_CODE + in configure.ac and configure + Made the configure warning about versioned symbols less arrogant. + +Version 1.2.10rc3 [April 21, 2006] + Added a note in libpng.txt that png_set_sig_bytes(8) can be used when + writing an embedded PNG without the 8-byte signature. + Revised makefiles and configure to avoid making links to libpng.so.* + +Version 1.2.10 [April 23, 2006] + Reverted configure to "rc2" state. + +Version 1.2.11beta1 [May 31, 2006] + scripts/libpng.pc.in contained "configure" style version info and would + not work with makefiles. + The shared-library makefiles were linking to libpng.so.0 instead of + libpng.so.3 compatibility as the library. + +Version 1.2.11beta2 [June 2, 2006] + Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + Fixed bug in example.c (png_set_palette_rgb -> png_set_palette_to_rgb) + +Version 1.2.11beta3 [June 5, 2006] + Prepended "#! /bin/sh" to ltmail.sh and contrib/pngminus/*.sh (Cosmin). + Removed the accidental leftover Makefile.in~ (Cosmin). + Avoided potential buffer overflow and optimized buffer in + png_write_sCAL(), png_write_sCAL_s() (Cosmin). + Removed the include directories and libraries from CFLAGS and LDFLAGS + in scripts/makefile.gcc (Nelson A. de Oliveira, Cosmin). + +Version 1.2.11beta4 [June 6, 2006] + Allow zero-length IDAT chunks after the entire zlib datastream, but not + after another intervening chunk type. + +Version 1.0.19rc1, 1.2.11rc1 [June 13, 2006] + Deleted extraneous square brackets from [config.h] in configure.ac + +Version 1.0.19rc2, 1.2.11rc2 [June 14, 2006] + Added prototypes for PNG_INCH_CONVERSIONS functions to png.h + Revised INSTALL and autogen.sh + Fixed typo in several makefiles (-W1 should be -Wl) + Added typedef for png_int_32 and png_uint_32 on 64-bit systems. + +Version 1.0.19rc3, 1.2.11rc3 [June 15, 2006] + Removed the new typedefs for 64-bit systems (delay until version 1.4.0) + Added one zero element to png_gamma_shift[] array in pngrtran.c to avoid + reading out of bounds. + +Version 1.0.19rc4, 1.2.11rc4 [June 15, 2006] + Really removed the new typedefs for 64-bit systems. + +Version 1.0.19rc5, 1.2.11rc5 [June 22, 2006] + Removed png_sig_bytes entry from scripts/pngw32.def + +Version 1.0.19, 1.2.11 [June 26, 2006] + None. + +Version 1.0.20, 1.2.12 [June 27, 2006] + Really increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + +Version 1.2.13beta1 [October 2, 2006] + Removed AC_FUNC_MALLOC from configure.ac + Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h + Change "logical" to "bitwise" throughout documentation. + Detect and fix attempt to write wrong iCCP profile length (CVE-2006-7244) + +Version 1.0.21, 1.2.13 [November 14, 2006] + Fix potential buffer overflow in sPLT chunk handler. + Fix Makefile.am to not try to link to noexistent files. + Check all exported functions for NULL png_ptr. + +Version 1.2.14beta1 [November 17, 2006] + Relocated three misplaced tests for NULL png_ptr. + Built Makefile.in with automake-1.9.6 instead of 1.9.2. + Build configure with autoconf-2.60 instead of 2.59 + +Version 1.2.14beta2 [November 17, 2006] + Added some typecasts in png_zalloc(). + +Version 1.2.14rc1 [November 20, 2006] + Changed "strtod" to "png_strtod" in pngrutil.c + +Version 1.0.22, 1.2.14 [November 27, 2006] + Added missing "$(srcdir)" in Makefile.am and Makefile.in + +Version 1.2.15beta1 [December 3, 2006] + Generated configure with autoconf-2.61 instead of 2.60 + Revised configure.ac to update libpng.pc and libpng-config. + +Version 1.2.15beta2 [December 3, 2006] + Always export MMX asm functions, just stubs if not building pnggccrd.c + +Version 1.2.15beta3 [December 4, 2006] + Add "png_bytep" typecast to profile while calculating length in pngwutil.c + +Version 1.2.15beta4 [December 7, 2006] + Added scripts/CMakeLists.txt + Changed PNG_NO_ASSEMBLER_CODE to PNG_NO_MMX_CODE in scripts, like 1.4.0beta + +Version 1.2.15beta5 [December 7, 2006] + Changed some instances of PNG_ASSEMBLER_* to PNG_MMX_* in pnggccrd.c + Revised scripts/CMakeLists.txt + +Version 1.2.15beta6 [December 13, 2006] + Revised scripts/CMakeLists.txt and configure.ac + +Version 1.2.15rc1 [December 18, 2006] + Revised scripts/CMakeLists.txt + +Version 1.2.15rc2 [December 21, 2006] + Added conditional #undef jmpbuf in pngtest.c to undo #define in AIX headers. + Added scripts/makefile.nommx + +Version 1.2.15rc3 [December 25, 2006] + Fixed shared library numbering error that was introduced in 1.2.15beta6. + +Version 1.2.15rc4 [December 27, 2006] + Fixed handling of rgb_to_gray when png_ptr->color.gray isn't set. + +Version 1.2.15rc5 [December 31, 2006] + Revised handling of rgb_to_gray. + +Version 1.2.15 [January 5, 2007] + Added some (unsigned long) typecasts in pngtest.c to avoid printing errors. + +Version 1.2.16beta1 [January 6, 2007] + Fix bugs in makefile.nommx + +Version 1.2.16beta2 [January 16, 2007] + Revised scripts/CMakeLists.txt + +Version 1.2.16 [January 31, 2007] + No changes. + +Version 1.2.17beta1 [March 6, 2007] + Revised scripts/CMakeLists.txt to install both shared and static libraries. + Deleted a redundant line from pngset.c. + +Version 1.2.17beta2 [April 26, 2007] + Relocated misplaced test for png_ptr == NULL in pngpread.c + Change "==" to "&" for testing PNG_RGB_TO_GRAY_ERR & PNG_RGB_TO_GRAY_WARN + flags. + Changed remaining instances of PNG_ASSEMBLER_* to PNG_MMX_* + Added pngerror() when write_IHDR fails in deflateInit2(). + Added "const" to some array declarations. + Mention examples of libpng usage in the libpng*.txt and libpng.3 documents. + +Version 1.2.17rc1 [May 4, 2007] + No changes. + +Version 1.2.17rc2 [May 8, 2007] + Moved several PNG_HAVE_* macros out of PNG_INTERNAL because applications + calling set_unknown_chunk_location() need them. + Changed transformation flag from PNG_EXPAND_tRNS to PNG_EXPAND in + png_set_expand_gray_1_2_4_to_8(). + Added png_ptr->unknown_chunk to hold working unknown chunk data, so it + can be free'ed in case of error. Revised unknown chunk handling in + pngrutil.c and pngpread.c to use this structure. + +Version 1.2.17rc3 [May 8, 2007] + Revised symbol-handling in configure script. + +Version 1.2.17rc4 [May 10, 2007] + Revised unknown chunk handling to avoid storing unknown critical chunks. + +Version 1.0.25 [May 15, 2007] +Version 1.2.17 [May 15, 2007] + Added "png_ptr->num_trans=0" before error return in png_handle_tRNS, + to eliminate a vulnerability (CVE-2007-2445, CERT VU#684664) + +Version 1.0.26 [May 15, 2007] +Version 1.2.18 [May 15, 2007] + Reverted the libpng-1.2.17rc3 change to symbol-handling in configure script + +Version 1.2.19beta1 [May 18, 2007] + Changed "const static" to "static PNG_CONST" everywhere, mostly undoing + change of libpng-1.2.17beta2. Changed other "const" to "PNG_CONST" + Changed some handling of unused parameters, to avoid compiler warnings. + "if (unused == NULL) return;" becomes "unused = unused". + +Version 1.2.19beta2 [May 18, 2007] + Only use the valid bits of tRNS value in png_do_expand() (Brian Cartier) + +Version 1.2.19beta3 [May 19, 2007] + Add some "png_byte" typecasts in png_check_keyword() and write new_key + instead of key in zTXt chunk (Kevin Ryde). + +Version 1.2.19beta4 [May 21, 2007] + Add png_snprintf() function and use it in place of sprint() for improved + defense against buffer overflows. + +Version 1.2.19beta5 [May 21, 2007] + Fixed png_handle_tRNS() to only use the valid bits of tRNS value. + Changed handling of more unused parameters, to avoid compiler warnings. + Removed some PNG_CONST in pngwutil.c to avoid compiler warnings. + +Version 1.2.19beta6 [May 22, 2007] + Added some #ifdef PNG_MMX_CODE_SUPPORTED where needed in pngvcrd.c + Added a special "_MSC_VER" case that defines png_snprintf to _snprintf + +Version 1.2.19beta7 [May 22, 2007] + Squelched png_squelch_warnings() in pnggccrd.c and added + an #ifdef PNG_MMX_CODE_SUPPORTED block around the declarations that caused + the warnings that png_squelch_warnings was squelching. + +Version 1.2.19beta8 [May 22, 2007] + Removed __MMX__ from test in pngconf.h. + +Version 1.2.19beta9 [May 23, 2007] + Made png_squelch_warnings() available via PNG_SQUELCH_WARNINGS macro. + Revised png_squelch_warnings() so it might work. + Updated makefile.sgcc and makefile.solaris; added makefile.solaris-x86. + +Version 1.2.19beta10 [May 24, 2007] + Resquelched png_squelch_warnings(), use "__attribute__((used))" instead. + +Version 1.4.0beta1 [April 20, 2006] + Enabled iTXt support (changes png_struct, thus requires so-number change). + Cleaned up PNG_ASSEMBLER_CODE_SUPPORTED vs PNG_MMX_CODE_SUPPORTED + Eliminated PNG_1_0_X and PNG_1_2_X macros. + Removed deprecated functions png_read_init, png_write_init, png_info_init, + png_permit_empty_plte, png_set_gray_1_2_4_to_8, png_check_sig, and + removed the deprecated macro PNG_MAX_UINT. + Moved "PNG_INTERNAL" parts of png.h and pngconf.h into pngintrn.h + Removed many WIN32_WCE #ifdefs (Cosmin). + Reduced dependency on C-runtime library when on Windows (Simon-Pierre) + Replaced sprintf() with png_sprintf() (Simon-Pierre) + +Version 1.4.0beta2 [April 20, 2006] + Revised makefiles and configure to avoid making links to libpng.so.* + Moved some leftover MMX-related defines from pngconf.h to pngintrn.h + Updated scripts/pngos2.def, pngw32.def, and projects/wince/png32ce.def + +Version 1.4.0beta3 [May 10, 2006] + Updated scripts/pngw32.def to comment out MMX functions. + Added PNG_NO_GET_INT_32 and PNG_NO_SAVE_INT_32 macros. + Scripts/libpng.pc.in contained "configure" style version info and would + not work with makefiles. + Revised pngconf.h and added pngconf.h.in, so makefiles and configure can + pass defines to libpng and applications. + +Version 1.4.0beta4 [May 11, 2006] + Revised configure.ac, Makefile.am, and many of the makefiles to write + their defines in pngconf.h. + +Version 1.4.0beta5 [May 15, 2006] + Added a missing semicolon in Makefile.am and Makefile.in + Deleted extraneous square brackets from configure.ac + +Version 1.4.0beta6 [June 2, 2006] + Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + Changed sonum from 0 to 1. + Removed unused prototype for png_check_sig() from png.h + +Version 1.4.0beta7 [June 16, 2006] + Exported png_write_sig (Cosmin). + Optimized buffer in png_handle_cHRM() (Cosmin). + Set pHYs = 2835 x 2835 pixels per meter, and added + sCAL = 0.352778e-3 x 0.352778e-3 meters, in pngtest.png (Cosmin). + Added png_set_benign_errors(), png_benign_error(), png_chunk_benign_error(). + Added typedef for png_int_32 and png_uint_32 on 64-bit systems. + Added "(unsigned long)" typecast on png_uint_32 variables in printf lists. + +Version 1.4.0beta8 [June 22, 2006] + Added demonstration of user chunk support in pngtest.c, to support the + public sTER chunk and a private vpAg chunk. + +Version 1.4.0beta9 [July 3, 2006] + Removed ordinals from scripts/pngw32.def and removed png_info_int and + png_set_gray_1_2_4_to_8 entries. + Inline call of png_get_uint_32() in png_get_uint_31(). + Use png_get_uint_31() to get vpAg width and height in pngtest.c + Removed WINCE and Netware projects. + Removed standalone Y2KINFO file. + +Version 1.4.0beta10 [July 12, 2006] + Eliminated automatic copy of pngconf.h to pngconf.h.in from configure and + some makefiles, because it was not working reliably. Instead, distribute + pngconf.h.in along with pngconf.h and cause configure and some of the + makefiles to update pngconf.h from pngconf.h.in. + Added pngconf.h to DEPENDENCIES in Makefile.am + +Version 1.4.0beta11 [August 19, 2006] + Removed AC_FUNC_MALLOC from configure.ac. + Added a warning when writing iCCP profile with mismatched profile length. + Patched pnggccrd.c to assemble on x86_64 platforms. + Moved chunk header reading into a separate function png_read_chunk_header() + in pngrutil.c. The chunk header (len+sig) is now serialized in a single + operation (Cosmin). + Implemented support for I/O states. Added png_ptr member io_state, and + functions png_get_io_chunk_name() and png_get_io_state() in pngget.c + (Cosmin). + Added png_get_io_chunk_name and png_get_io_state to scripts/*.def (Cosmin). + Renamed scripts/pngw32.* to scripts/pngwin.* (Cosmin). + Removed the include directories and libraries from CFLAGS and LDFLAGS + in scripts/makefile.gcc (Cosmin). + Used png_save_uint_32() to set vpAg width and height in pngtest.c (Cosmin). + Cast to proper type when getting/setting vpAg units in pngtest.c (Cosmin). + Added pngintrn.h to the Visual C++ projects (Cosmin). + Removed scripts/list (Cosmin). + Updated copyright year in scripts/pngwin.def (Cosmin). + Removed PNG_TYPECAST_NULL and used standard NULL consistently (Cosmin). + Disallowed the user to redefine png_size_t, and enforced a consistent use + of png_size_t across libpng (Cosmin). + Changed the type of png_ptr->rowbytes, PNG_ROWBYTES() and friends + to png_size_t (Cosmin). + Removed png_convert_size() and replaced png_sizeof with sizeof (Cosmin). + Removed some unnecessary type casts (Cosmin). + Changed prototype of png_get_compression_buffer_size() and + png_set_compression_buffer_size() to work with png_size_t instead of + png_uint_32 (Cosmin). + Removed png_memcpy_check() and png_memset_check() (Cosmin). + Fixed a typo (png_byte --> png_bytep) in libpng.3 and libpng.txt (Cosmin). + Clarified that png_zalloc() does not clear the allocated memory, + and png_zalloc() and png_zfree() cannot be PNGAPI (Cosmin). + Renamed png_mem_size_t to png_alloc_size_t, fixed its definition in + pngconf.h, and used it in all memory allocation functions (Cosmin). + Renamed pngintrn.h to pngpriv.h, added a comment at the top of the file + mentioning that the symbols declared in that file are private, and + updated the scripts and the Visual C++ projects accordingly (Cosmin). + Removed circular references between pngconf.h and pngconf.h.in in + scripts/makefile.vc*win32 (Cosmin). + Removing trailing '.' from the warning and error messages (Cosmin). + Added pngdefs.h that is built by makefile or configure, instead of + pngconf.h.in (Glenn). + Detect and fix attempt to write wrong iCCP profile length. + +Version 1.4.0beta12 [October 19, 2006] + Changed "logical" to "bitwise" in the documentation. + Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h + Add a typecast to stifle compiler warning in pngrutil.c + +Version 1.4.0beta13 [November 10, 2006] + Fix potential buffer overflow in sPLT chunk handler. + Fix Makefile.am to not try to link to noexistent files. + +Version 1.4.0beta14 [November 15, 2006] + Check all exported functions for NULL png_ptr. + +Version 1.4.0beta15 [November 17, 2006] + Relocated two misplaced tests for NULL png_ptr. + Built Makefile.in with automake-1.9.6 instead of 1.9.2. + Build configure with autoconf-2.60 instead of 2.59 + Add "install: all" in Makefile.am so "configure; make install" will work. + +Version 1.4.0beta16 [November 17, 2006] + Added a typecast in png_zalloc(). + +Version 1.4.0beta17 [December 4, 2006] + Changed "new_key[79] = '\0';" to "(*new_key)[79] = '\0';" in pngwutil.c + Add "png_bytep" typecast to profile while calculating length in pngwutil.c + +Version 1.4.0beta18 [December 7, 2006] + Added scripts/CMakeLists.txt + +Version 1.4.0beta19 [May 16, 2007] + Revised scripts/CMakeLists.txt + Rebuilt configure and Makefile.in with newer tools. + Added conditional #undef jmpbuf in pngtest.c to undo #define in AIX headers. + Added scripts/makefile.nommx + +Version 1.4.0beta20 [July 9, 2008] + Moved several PNG_HAVE_* macros from pngpriv.h to png.h because applications + calling set_unknown_chunk_location() need them. + Moved several macro definitions from pngpriv.h to pngconf.h + Merge with changes to the 1.2.X branch, as of 1.2.30beta04. + Deleted all use of the MMX assembler code and Intel-licensed optimizations. + Revised makefile.mingw + +Version 1.4.0beta21 [July 21, 2008] + Moved local array "chunkdata" from pngrutil.c to the png_struct, so + it will be freed by png_read_destroy() in case of a read error (Kurt + Christensen). + +Version 1.4.0beta22 [July 21, 2008] + Change "purpose" and "buffer" to png_ptr->chunkdata to avoid memory leaking. + +Version 1.4.0beta23 [July 22, 2008] + Change "chunkdata = NULL" to "png_ptr->chunkdata = NULL" several places in + png_decompress_chunk(). + +Version 1.4.0beta24 [July 25, 2008] + Change all remaining "chunkdata" to "png_ptr->chunkdata" in + png_decompress_chunk(), and remove "chunkdata" from parameter list. + Put a call to png_check_chunk_name() in png_read_chunk_header(). + Revised png_check_chunk_name() to reject a name with a lowercase 3rd byte. + Removed two calls to png_check_chunk_name() occuring later in the process. + Define PNG_NO_ERROR_NUMBERS by default in pngconf.h + +Version 1.4.0beta25 [July 30, 2008] + Added a call to png_check_chunk_name() in pngpread.c + Reverted png_check_chunk_name() to accept a name with a lowercase 3rd byte. + Added png_push_have_buffer() function to pngpread.c + Eliminated PNG_BIG_ENDIAN_SUPPORTED and associated png_get_* macros. + Made inline expansion of png_get_*() optional with PNG_USE_READ_MACROS. + Eliminated all PNG_USELESS_TESTS and PNG_CORRECT_PALETTE_SUPPORTED code. + Synced contrib directory and configure files with libpng-1.2.30beta06. + Eliminated no-longer-used pngdefs.h (but it's still built in the makefiles) + Relocated a misplaced "#endif /* PNG_NO_WRITE_FILTER */" in pngwutil.c + +Version 1.4.0beta26 [August 4, 2008] + Removed png_push_have_buffer() function in pngpread.c. It increased the + compiled library size slightly. + Changed "-Wall" to "-W -Wall" in the CFLAGS in all makefiles (Cosmin Truta) + Declared png_ptr "volatile" in pngread.c and pngwrite.c to avoid warnings. + Updated contrib/visupng/cexcept.h to version 2.0.1 + Added PNG_LITERAL_CHARACTER macros for #, [, and ]. + +Version 1.4.0beta27 [August 5, 2008] + Revised usage of PNG_LITERAL_SHARP in pngerror.c. + Moved newline character from individual png_debug messages into the + png_debug macros. + Allow user to #define their own png_debug, png_debug1, and png_debug2. + +Version 1.4.0beta28 [August 5, 2008] + Revised usage of PNG_LITERAL_SHARP in pngerror.c. + Added PNG_STRING_NEWLINE macro + +Version 1.4.0beta29 [August 9, 2008] + Revised usage of PNG_STRING_NEWLINE to work on non-ISO compilers. + Added PNG_STRING_COPYRIGHT macro. + Added non-ISO versions of png_debug macros. + +Version 1.4.0beta30 [August 14, 2008] + Added premultiplied alpha feature (Volker Wiendl). + +Version 1.4.0beta31 [August 18, 2008] + Moved png_set_premultiply_alpha from pngtrans.c to pngrtran.c + Removed extra crc check at the end of png_handle_cHRM(). Bug introduced + in libpng-1.4.0beta20. + +Version 1.4.0beta32 [August 19, 2008] + Added PNG_WRITE_FLUSH_SUPPORTED block around new png_flush() call. + Revised PNG_NO_STDIO version of png_write_flush() + +Version 1.4.0beta33 [August 20, 2008] + Added png_get|set_chunk_cache_max() to limit the total number of sPLT, + text, and unknown chunks that can be stored. + +Version 1.4.0beta34 [September 6, 2008] + Shortened tIME_string to 29 bytes in pngtest.c + Fixed off-by-one error introduced in png_push_read_zTXt() function in + libpng-1.2.30beta04/pngpread.c (Harald van Dijk) + +Version 1.4.0beta35 [October 6, 2008] + Changed "trans_values" to "trans_color". + Changed so-number from 0 to 14. Some OS do not like 0. + Revised makefile.darwin to fix shared library numbering. + Change png_set_gray_1_2_4_to_8() to png_set_expand_gray_1_2_4_to_8() + in example.c (debian bug report) + +Version 1.4.0beta36 [October 25, 2008] + Sync with tEXt vulnerability fix in libpng-1.2.33rc02. + +Version 1.4.0beta37 [November 13, 2008] + Added png_check_cHRM in png.c and moved checking from pngget.c, pngrutil.c, + and pngwrite.c + +Version 1.4.0beta38 [November 22, 2008] + Added check for zero-area RGB cHRM triangle in png_check_cHRM() and + png_check_cHRM_fixed(). + +Version 1.4.0beta39 [November 23, 2008] + Revised png_warning() to write its message on standard output by default + when warning_fn is NULL. + +Version 1.4.0beta40 [November 24, 2008] + Eliminated png_check_cHRM(). Instead, always use png_check_cHRM_fixed(). + In png_check_cHRM_fixed(), ensure white_y is > 0, and removed redundant + check for all-zero coordinates that is detected by the triangle check. + +Version 1.4.0beta41 [November 26, 2008] + Fixed string vs pointer-to-string error in png_check_keyword(). + Rearranged test expressions in png_check_cHRM_fixed() to avoid internal + overflows. + Added PNG_NO_CHECK_cHRM conditional. + +Version 1.4.0beta42, 43 [December 1, 2008] + Merge png_debug with version 1.2.34beta04. + +Version 1.4.0beta44 [December 6, 2008] + Removed redundant check for key==NULL before calling png_check_keyword() + to ensure that new_key gets initialized and removed extra warning + (Merge with version 1.2.34beta05 -- Arvan Pritchard). + +Version 1.4.0beta45 [December 9, 2008] + In png_write_png(), respect the placement of the filler bytes in an earlier + call to png_set_filler() (Jim Barry). + +Version 1.4.0beta46 [December 10, 2008] + Undid previous change and added PNG_TRANSFORM_STRIP_FILLER_BEFORE and + PNG_TRANSFORM_STRIP_FILLER_AFTER conditionals and deprecated + PNG_TRANSFORM_STRIP_FILLER (Jim Barry). + +Version 1.4.0beta47 [December 15, 2008] + Support for dithering was disabled by default, because it has never + been well tested and doesn't work very well. The code has not + been removed, however, and can be enabled by building libpng with + PNG_READ_DITHER_SUPPORTED defined. + +Version 1.4.0beta48 [February 14, 2009] + Added new exported function png_calloc(). + Combined several instances of png_malloc(); png_memset() into png_calloc(). + Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24 + but was never defined. + +Version 1.4.0beta49 [February 28, 2009] + Added png_fileno() macro to pngconf.h, used in pngwio.c + Corrected order of #ifdef's in png_debug definition in png.h + Fixed bug introduced in libpng-1.4.0beta48 with the memset arguments + for pcal_params. + Fixed order of #ifdef directives in the png_debug defines in png.h + (bug introduced in libpng-1.2.34/1.4.0beta29). + Revised comments in png_set_read_fn() and png_set_write_fn(). + +Version 1.4.0beta50 [March 18, 2009] + Use png_calloc() instead of png_malloc() to allocate big_row_buf when + reading an interlaced file, to avoid a possible UMR. + Undid revision of PNG_NO_STDIO version of png_write_flush(). Users + having trouble with fflush() can build with PNG_NO_WRITE_FLUSH defined + or supply their own flush_fn() replacement. + Revised libpng*.txt and png.h documentation about use of png_write_flush() + and png_set_write_fn(). + Removed fflush() from pngtest.c. + Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h + +Version 1.4.0beta51 [March 21, 2009] + Removed new png_fileno() macro from pngconf.h . + +Version 1.4.0beta52 [March 27, 2009] + Relocated png_do_chop() ahead of building gamma tables in pngrtran.c + This avoids building 16-bit gamma tables unnecessarily. + Removed fflush() from pngtest.c. + Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h + Added a section on differences between 1.0.x and 1.2.x to libpng.3/libpng.txt + +Version 1.4.0beta53 [April 1, 2009] + Removed some remaining MMX macros from pngpriv.h + Fixed potential memory leak of "new_name" in png_write_iCCP() (Ralph Giles) + +Version 1.4.0beta54 [April 13, 2009] + Added "ifndef PNG_SKIP_SETJMP_CHECK" block in pngconf.h to allow + application code writers to bypass the check for multiple inclusion + of setjmp.h when they know that it is safe to ignore the situation. + Eliminated internal use of setjmp() in pngread.c and pngwrite.c + Reordered ancillary chunks in pngtest.png to be the same as what + pngtest now produces, and made some cosmetic changes to pngtest output. + Eliminated deprecated png_read_init_3() and png_write_init_3() functions. + +Version 1.4.0beta55 [April 15, 2009] + Simplified error handling in pngread.c and pngwrite.c by putting + the new png_read_cleanup() and png_write_cleanup() functions inline. + +Version 1.4.0beta56 [April 25, 2009] + Renamed "user_chunk_data" to "my_user_chunk_data" in pngtest.c to suppress + "shadowed declaration" warning from gcc-4.3.3. + Renamed "gamma" to "png_gamma" in pngset.c to avoid "shadowed declaration" + warning about a global "gamma" variable in math.h on some platforms. + +Version 1.4.0beta57 [May 2, 2009] + Removed prototype for png_freeptr() that was added in libpng-1.4.0beta24 + but was never defined (again). + Rebuilt configure scripts with autoconf-2.63 instead of 2.62 + Removed pngprefs.h and MMX from makefiles + +Version 1.4.0beta58 [May 14, 2009] + Changed pngw32.def to pngwin.def in makefile.mingw (typo was introduced + in beta57). + Clarified usage of sig_bit versus sig_bit_p in example.c (Vincent Torri) + +Version 1.4.0beta59 [May 15, 2009] + Reformated sources in libpng style (3-space intentation, comment format) + Fixed typo in libpng docs (PNG_FILTER_AVE should be PNG_FILTER_AVG) + Added sections about the git repository and our coding style to the + documentation + Relocated misplaced #endif in pngwrite.c, sCAL chunk handler. + +Version 1.4.0beta60 [May 19, 2009] + Conditionally compile png_read_finish_row() which is not used by + progressive readers. + Added contrib/pngminim/preader to demonstrate building minimal progressive + decoder, based on contrib/gregbook with embedded libpng and zlib. + +Version 1.4.0beta61 [May 20, 2009] + In contrib/pngminim/*, renamed "makefile.std" to "makefile", since there + is only one makefile in those directories, and revised the README files + accordingly. + More reformatting of comments, mostly to capitalize sentences. + +Version 1.4.0beta62 [June 2, 2009] + Added "#define PNG_NO_WRITE_SWAP" to contrib/pngminim/encoder/pngusr.h + and "define PNG_NO_READ_SWAP" to decoder/pngusr.h and preader/pngusr.h + Reformatted several remaining "else statement" into two lines. + Added a section to the libpng documentation about using png_get_io_ptr() + in configure scripts to detect the presence of libpng. + +Version 1.4.0beta63 [June 15, 2009] + Revised libpng*.txt and libpng.3 to mention calling png_set_IHDR() + multiple times and to specify the sample order in the tRNS chunk, + because the ISO PNG specification has a typo in the tRNS table. + Changed several PNG_UNKNOWN_CHUNK_SUPPORTED to + PNG_HANDLE_AS_UNKNOWN_SUPPORTED, to make the png_set_keep mechanism + available for ignoring known chunks even when not saving unknown chunks. + Adopted preference for consistent use of "#ifdef" and "#ifndef" versus + "#if defined()" and "if !defined()" where possible. + +Version 1.4.0beta64 [June 24, 2009] + Eliminated PNG_LEGACY_SUPPORTED code. + Moved the various unknown chunk macro definitions outside of the + PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks. + +Version 1.4.0beta65 [June 26, 2009] + Added a reference to the libpng license in each file. + +Version 1.4.0beta66 [June 27, 2009] + Refer to the libpng license instead of the libpng license in each file. + +Version 1.4.0beta67 [July 6, 2009] + Relocated INVERT_ALPHA within png_read_png() and png_write_png(). + Added high-level API transform PNG_TRANSFORM_GRAY_TO_RGB. + Added an "xcode" project to the projects directory (Alam Arias). + +Version 1.4.0beta68 [July 19, 2009] + Avoid some tests in filter selection in pngwutil.c + +Version 1.4.0beta69 [July 25, 2009] + Simplified the new filter-selection test. This runs faster in the + common "PNG_ALL_FILTERS" and PNG_FILTER_NONE cases. + Removed extraneous declaration from the new call to png_read_gray_to_rgb() + (bug introduced in libpng-1.4.0beta67). + Fixed up xcode project (Alam Arias) + Added a prototype for png_64bit_product() in png.c + +Version 1.4.0beta70 [July 27, 2009] + Avoid a possible NULL dereference in debug build, in png_set_text_2(). + (bug introduced in libpng-0.95, discovered by Evan Rouault) + +Version 1.4.0beta71 [July 29, 2009] + Rebuilt configure scripts with autoconf-2.64. + +Version 1.4.0beta72 [August 1, 2009] + Replaced *.tar.lzma with *.tar.xz in distribution. Get the xz codec + from . + +Version 1.4.0beta73 [August 1, 2009] + Reject attempt to write iCCP chunk with negative embedded profile length + (JD Chen) (CVE-2009-5063). + +Version 1.4.0beta74 [August 8, 2009] + Changed png_ptr and info_ptr member "trans" to "trans_alpha". + +Version 1.4.0beta75 [August 21, 2009] + Removed an extra png_debug() recently added to png_write_find_filter(). + Fixed incorrect #ifdef in pngset.c regarding unknown chunk support. + +Version 1.4.0beta76 [August 22, 2009] + Moved an incorrectly located test in png_read_row() in pngread.c + +Version 1.4.0beta77 [August 27, 2009] + Removed lpXYZ.tar.bz2 (with CRLF), KNOWNBUG, libpng-x.y.z-KNOWNBUG.txt, + and the "noconfig" files from the distribution. + Moved CMakeLists.txt from scripts into the main libpng directory. + Various bugfixes and improvements to CMakeLists.txt (Philip Lowman) + +Version 1.4.0beta78 [August 31, 2009] + Converted all PNG_NO_* tests to PNG_*_SUPPORTED everywhere except pngconf.h + Eliminated PNG_NO_FREE_ME and PNG_FREE_ME_SUPPORTED macros. + Use png_malloc plus a loop instead of png_calloc() to initialize + row_pointers in png_read_png(). + +Version 1.4.0beta79 [September 1, 2009] + Eliminated PNG_GLOBAL_ARRAYS and PNG_LOCAL_ARRAYS; always use local arrays. + Eliminated PNG_CALLOC_SUPPORTED macro and always provide png_calloc(). + +Version 1.4.0beta80 [September 17, 2009] + Removed scripts/libpng.icc + Changed typecast of filler from png_byte to png_uint_16 in png_set_filler(). + (Dennis Gustafsson) + Fixed typo introduced in beta78 in pngtest.c ("#if def " should be "#ifdef ") + +Version 1.4.0beta81 [September 23, 2009] + Eliminated unused PNG_FLAG_FREE_* defines from pngpriv.h + Expanded TAB characters in pngrtran.c + Removed PNG_CONST from all "PNG_CONST PNG_CHNK" declarations to avoid + compiler complaints about doubly declaring things "const". + Changed all "#if [!]defined(X)" to "if[n]def X" where possible. + Eliminated unused png_ptr->row_buf_size + +Version 1.4.0beta82 [September 25, 2009] + Moved redundant IHDR checking into new png_check_IHDR() in png.c + and report all errors found in the IHDR data. + Eliminated useless call to png_check_cHRM() from pngset.c + +Version 1.4.0beta83 [September 25, 2009] + Revised png_check_IHDR() to eliminate bogus complaint about filter_type. + +Version 1.4.0beta84 [September 30, 2009] + Fixed some inconsistent indentation in pngconf.h + Revised png_check_IHDR() to add a test for width variable less than 32-bit. + +Version 1.4.0beta85 [October 1, 2009] + Revised png_check_IHDR() again, to check info_ptr members instead of + the contents of the returned parameters. + +Version 1.4.0beta86 [October 9, 2009] + Updated the "xcode" project (Alam Arias). + Eliminated a shadowed declaration of "pp" in png_handle_sPLT(). + +Version 1.4.0rc01 [October 19, 2009] + Trivial cosmetic changes. + +Version 1.4.0beta87 [October 30, 2009] + Moved version 1.4.0 back into beta. + +Version 1.4.0beta88 [October 30, 2009] + Revised libpng*.txt section about differences between 1.2.x and 1.4.0 + because most of the new features have now been ported back to 1.2.41 + +Version 1.4.0beta89 [November 1, 2009] + More bugfixes and improvements to CMakeLists.txt (Philip Lowman) + Removed a harmless extra png_set_invert_alpha() from pngwrite.c + Apply png_user_chunk_cache_max within png_decompress_chunk(). + Merged libpng-1.2.41.txt with libpng-1.4.0.txt where appropriate. + +Version 1.4.0beta90 [November 2, 2009] + Removed all remaining WIN32_WCE #ifdefs except those involving the + time.h "tm" structure + +Version 1.4.0beta91 [November 3, 2009] + Updated scripts/pngw32.def and projects/wince/png32ce.def + Copied projects/wince/png32ce.def to the scripts directory. + Added scripts/makefile.wce + Patched ltmain.sh for wince support. + Added PNG_CONVERT_tIME_SUPPORTED macro. + +Version 1.4.0beta92 [November 4, 2009] + Make inclusion of time.h in pngconf.h depend on PNG_CONVERT_tIME_SUPPORTED + Make #define PNG_CONVERT_tIME_SUPPORTED depend on PNG_WRITE_tIME_SUPPORTED + Revised libpng*.txt to describe differences from 1.2.40 to 1.4.0 (instead + of differences from 1.2.41 to 1.4.0) + +Version 1.4.0beta93 [November 7, 2009] + Added PNG_DEPSTRUCT, PNG_DEPRECATED, PNG_USE_RESULT, PNG_NORETURN, and + PNG_ALLOCATED macros to detect deprecated direct access to the + png_struct or info_struct members and other deprecated usage in + applications (John Bowler). + Updated scripts/makefile* to add "-DPNG_CONFIGURE_LIBPNG" to CFLAGS, + to prevent warnings about direct access to png structs by libpng + functions while building libpng. They need to be tested, especially + those using compilers other than gcc. + Updated projects/visualc6 and visualc71 with "/d PNG_CONFIGURE_LIBPNG". + They should work but still need to be updated to remove + references to pnggccrd.c or pngvcrd.c and ASM building. + Added README.txt to the beos, cbuilder5, netware, and xcode projects warning + that they need to be updated, to remove references to pnggccrd.c and + pngvcrd.c and to depend on pngpriv.h + Removed three direct references to read_info_ptr members in pngtest.c + that were detected by the new PNG_DEPSTRUCT macro. + Moved the png_debug macro definitions and the png_read_destroy(), + png_write_destroy() and png_far_to_near() prototypes from png.h + to pngpriv.h (John Bowler) + Moved the synopsis lines for png_read_destroy(), png_write_destroy() + png_debug(), png_debug1(), and png_debug2() from libpng.3 to libpngpf.3. + +Version 1.4.0beta94 [November 9, 2009] + Removed the obsolete, unused pnggccrd.c and pngvcrd.c files. + Updated CMakeLists.txt to add "-DPNG_CONFIGURE_LIBPNG" to the definitions. + Removed dependency of pngtest.o on pngpriv.h in the makefiles. + Only #define PNG_DEPSTRUCT, etc. in pngconf.h if not already defined. + +Version 1.4.0beta95 [November 10, 2009] + Changed png_check_sig() to !png_sig_cmp() in contrib programs. + Added -DPNG_CONFIGURE_LIBPNG to contrib/pngminm/*/makefile + Changed png_check_sig() to !png_sig_cmp() in contrib programs. + Corrected the png_get_IHDR() call in contrib/gregbook/readpng2.c + Changed pngminim/*/gather.sh to stop trying to remove pnggccrd.c and pngvcrd.c + Added dependency on pngpriv.h in contrib/pngminim/*/makefile + +Version 1.4.0beta96 [November 12, 2009] + Renamed scripts/makefile.wce to scripts/makefile.cegcc + Revised Makefile.am to use libpng.sys while building libpng.so + so that only PNG_EXPORT functions are exported. + Removed the deprecated png_check_sig() function/macro. + Removed recently removed function names from scripts/*.def + Revised pngtest.png to put chunks in the same order written by pngtest + (evidently the same change made in libpng-1.0beta54 was lost). + Added PNG_PRIVATE macro definition in pngconf.h for possible future use. + +Version 1.4.0beta97 [November 13, 2009] + Restored pngtest.png to the libpng-1.4.0beta7 version. + Removed projects/beos and netware.txt; no one seems to be supporting them. + Revised Makefile.in + +Version 1.4.0beta98 [November 13, 2009] + Added the "xcode" project to zip distributions, + Fixed a typo in scripts/pngwin.def introduced in beta97. + +Version 1.4.0beta99 [November 14, 2009] + Moved libpng-config.in and libpng.pc-configure.in out of the scripts + directory, to libpng-config.in and libpng-pc.in, respectively, and + modified Makefile.am and configure.ac accordingly. Now "configure" + needs nothing from the "scripts" directory. + Avoid redefining PNG_CONST in pngconf.h + +Version 1.4.0beta100 [November 14, 2009] + Removed ASM builds from projects/visualc6 and projects/visualc71 + Removed scripts/makefile.nommx and makefile.vcawin32 + Revised CMakeLists.txt to account for new location of libpng-config.in + and libpng-pc.in + Updated INSTALL to reflect removal and relocation of files. + +Version 1.4.0beta101 [November 14, 2009] + Restored the binary files (*.jpg, *.png, some project files) that were + accidentally deleted from the zip and 7z distributions when the xcode + project was added. + +Version 1.4.0beta102 [November 18, 2009] + Added libpng-config.in and libpng-pc.in to the zip and 7z distributions. + Fixed a typo in projects/visualc6/pngtest.dsp, introduced in beta100. + Moved descriptions of makefiles and other scripts out of INSTALL into + scripts/README.txt + Updated the copyright year in scripts/pngwin.rc from 2006 to 2009. + +Version 1.4.0beta103 [November 21, 2009] + Removed obsolete comments about ASM from projects/visualc71/README_zlib.txt + Align row_buf on 16-byte boundary in memory. + Restored the PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED guard around the call + to png_flush() after png_write_IEND(). See 1.4.0beta32, 1.4.0beta50 + changes above and 1.2.30, 1.2.30rc01 and rc03 in 1.2.41 CHANGES. Someone + needs this feature. + Make the 'png_jmpbuf' macro expand to a call that records the correct + longjmp function as well as returning a pointer to the setjmp + jmp_buf buffer, and marked direct access to jmpbuf 'deprecated'. + (John Bowler) + +Version 1.4.0beta104 [November 22, 2009] + Removed png_longjmp_ptr from scripts/*.def and libpng.3 + Rebuilt configure scripts with autoconf-2.65 + +Version 1.4.0beta105 [November 25, 2009] + Use fast integer PNG_DIVIDE_BY_255() or PNG_DIVIDE_BY_65535() + to accomplish alpha premultiplication when + PNG_READ_COMPOSITE_NODIV_SUPPORTED is defined. + Changed "/255" to "/255.0" in background calculations to make it clear + that the 255 is used as a double. + +Version 1.4.0beta106 [November 27, 2009] + Removed premultiplied alpha feature. + +Version 1.4.0beta107 [December 4, 2009] + Updated README + Added "#define PNG_NO_PEDANTIC_WARNINGS" in the libpng source files. + Removed "-DPNG_CONFIGURE_LIBPNG" from the makefiles and projects. + Revised scripts/makefile.netbsd, makefile.openbsd, and makefile.sco + to put png.h and pngconf.h in $prefix/include, like the other scripts, + instead of in $prefix/include/libpng. Also revised makefile.sco + to put them in $prefix/include/libpng15 instead of in + $prefix/include/libpng/libpng15. + +Version 1.4.0beta108 [December 11, 2009] + Removed leftover "-DPNG_CONFIGURE_LIBPNG" from contrib/pngminim/*/makefile + Relocated png_do_chop() to its original position in pngrtran.c; the + change in version 1.2.41beta08 caused transparency to be handled wrong + in some 16-bit datastreams (Yusaku Sugai). + +Version 1.4.0beta109 [December 13, 2009] + Added "bit_depth" parameter to the private png_build_gamma_table() function. + Pass bit_depth=8 to png_build_gamma_table() when bit_depth is 16 but the + PNG_16_TO_8 transform has been set, to avoid unnecessary build of 16-bit + tables. + +Version 1.4.0rc02 [December 20, 2009] + Declared png_cleanup_needed "volatile" in pngread.c and pngwrite.c + +Version 1.4.0rc03 [December 22, 2009] + Renamed libpng-pc.in back to libpng.pc.in and revised CMakeLists.txt + (revising the change in 1.4.0beta99) + +Version 1.4.0rc04 [December 25, 2009] + Swapped PNG_UNKNOWN_CHUNKS_SUPPORTED and PNG_HANDLE_AS_UNKNOWN_SUPPORTED + in pngset.c to be consistent with other changes in version 1.2.38. + +Version 1.4.0rc05 [December 25, 2009] + Changed "libpng-pc.in" to "libpng.pc.in" in configure.ac, configure, and + Makefile.in to be consistent with changes in libpng-1.4.0rc03 + +Version 1.4.0rc06 [December 29, 2009] + Reverted the gamma_table changes from libpng-1.4.0beta109. + Fixed some indentation errors. + +Version 1.4.0rc07 [January 1, 2010] + Revised libpng*.txt and libpng.3 about 1.2.x->1.4.x differences. + Use png_calloc() instead of png_malloc(); png_memset() in pngrutil.c + Update copyright year to 2010. + +Version 1.4.0rc08 [January 2, 2010] + Avoid deprecated references to png_ptr-io_ptr and png_ptr->error_ptr + in pngtest.c + +Version 1.4.0 [January 3, 2010] + No changes. + +Version 1.4.1beta01 [January 8, 2010] + Updated CMakeLists.txt for consistent indentation and to avoid an + unclosed if-statement warning (Philip Lowman). + Revised Makefile.am and Makefile.in to remove references to Y2KINFO, + KNOWNBUG, and libpng.la (Robert Schwebel). + Revised the makefiles to install the same files and symbolic + links as configure, except for libpng.la and libpng14.la. + Make png_set|get_compression_buffer_size() available even when + PNG_WRITE_SUPPORTED is not enabled. + Revised Makefile.am and Makefile.in to simplify their maintenance. + Revised scripts/makefile.linux to install a link to libpng14.so.14.1 + +Version 1.4.1beta02 [January 9, 2010] + Revised the rest of the makefiles to install a link to libpng14.so.14.1 + +Version 1.4.1beta03 [January 10, 2010] + Removed png_set_premultiply_alpha() from scripts/*.def + +Version 1.4.1rc01 [January 16, 2010] + No changes. + +Version 1.4.1beta04 [January 23, 2010] + Revised png_decompress_chunk() to improve speed and memory usage when + decoding large chunks. + Added png_set|get_chunk_malloc_max() functions. + +Version 1.4.1beta05 [January 26, 2010] + Relocated "int k" declaration in pngtest.c to minimize its scope. + +Version 1.4.1beta06 [January 28, 2010] + Revised png_decompress_chunk() to use a two-pass method suggested by + John Bowler. + +Version 1.4.1beta07 [February 6, 2010] + Folded some long lines in the source files. + Added defineable PNG_USER_CHUNK_CACHE_MAX, PNG_USER_CHUNK_MALLOC_MAX, + and a PNG_USER_LIMITS_SUPPORTED flag. + Eliminated use of png_ptr->irowbytes and reused the slot in png_ptr as + png_ptr->png_user_chunk_malloc_max. + Revised png_push_save_buffer() to do fewer but larger png_malloc() calls. + +Version 1.4.1beta08 [February 6, 2010] + Minor cleanup and updating of dates and copyright year. + +Version 1.5.0beta01 [February 7, 2010] + Moved declaration of png_struct into private pngstruct.h and png_info + into pnginfo.h + +Version 1.4.1beta09 and 1.5.0beta02 [February 7, 2010] + Reverted to original png_push_save_buffer() code. + +Version 1.4.1beta10 and 1.5.0beta03 [February 8, 2010] + Return allocated "old_buffer" in png_push_save_buffer() before + calling png_error(), to avoid a potential memory leak. + Updated configure script to use SO number 15. + +Version 1.5.0beta04 [February 9, 2010] + Removed malformed "incomplete struct declaration" of png_info from png.h + +Version 1.5.0beta05 [February 12, 2010] + Removed PNG_DEPSTRUCT markup in pngstruct.h and pnginfo.h, and undid the + linewrapping that it entailed. + Revised comments in pngstruct.h and pnginfo.h and added pointers to + the libpng license. + Changed PNG_INTERNAL to PNG_EXPOSE_INTERNAL_STRUCTURES + Removed the cbuilder5 project, which has not been updated to 1.4.0. + +Version 1.4.1beta12 and 1.5.0beta06 [February 14, 2010] + Fixed type declaration of png_get_chunk_malloc_max() in pngget.c (Daisuke + Nishikawa) + +Version 1.5.0beta07 [omitted] + +Version 1.5.0beta08 [February 19, 2010] + Changed #ifdef PNG_NO_STDIO_SUPPORTED to #ifdef PNG_NO_CONSOLE_IO_SUPPORTED + wherever png_snprintf() is used to construct error and warning messages. + Noted in scripts/makefile.mingw that it expects to be run under MSYS. + Removed obsolete unused MMX-querying support from contrib/gregbook + Added exported png_longjmp() function. + Removed the AIX redefinition of jmpbuf in png.h + Added -D_ALLSOURCE in configure.ac, makefile.aix, and CMakeLists.txt + when building on AIX. + +Version 1.5.0beta09 [February 19, 2010] + Removed -D_ALLSOURCE from configure.ac, makefile.aix, and CMakeLists.txt. + Changed the name of png_ptr->jmpbuf to png_ptr->png_jmpbuf in pngstruct.h + +Version 1.5.0beta10 [February 25, 2010] + Removed unused gzio.c from contrib/pngminim gather and makefile scripts + Removed replacement error handlers from contrib/gregbook. Because of + the new png_longjmp() function they are no longer needed. + +Version 1.5.0beta11 [March 6, 2010] + Removed checking for already-included setjmp.h from pngconf.h + Fixed inconsistent indentations and made numerous cosmetic changes. + Revised the "SEE ALSO" style of libpng.3, libpngpf.3, and png.5 + +Version 1.5.0beta12 [March 9, 2010] + Moved "#include png.h" inside pngpriv.h and removed "#include png.h" from + the source files, along with "#define PNG_EXPOSE_INTERNAL_STRUCTURES" + and "#define PNG_NO_PEDANTIC_WARNINGS" (John Bowler). + Created new pngdebug.h and moved debug definitions there. + +Version 1.5.0beta13 [March 10, 2010] + Protect pngstruct.h, pnginfo.h, and pngdebug.h from being included twice. + Revise the "#ifdef" blocks in png_inflate() so it will compile when neither + PNG_USER_CHUNK_MALLOC_MAX nor PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED + is defined. + Removed unused png_measure_compressed_chunk() from pngpriv.h and libpngpf.3 + Moved the 'config.h' support from pngconf.h to pngpriv.h + Removed PNGAPI from the png_longjmp_ptr typedef. + Eliminated dependence of pngtest.c on the private pngdebug.h file. + Make all png_debug macros into *unterminated* statements or + expressions (i.e. a trailing ';' must always be added) and correct + the format statements in various png_debug messages. + +Version 1.5.0beta14 [March 14, 2010] + Removed direct access to png_ptr->io_ptr from the Windows code in pngtest.c + Revised Makefile.am to account for recent additions and replacements. + Corrected CE and OS/2 DEF files (scripts/png*def) for symbols removed and + added ordinal numbers to the Windows DEF file and corrected the duplicated + ordinal numbers on CE symbols that are commented out. + Added back in export symbols that can be present in the Windows build but + are disabled by default. + PNG_EXPORT changed to include an 'ordinal' field for DEF file generation. + PNG_CALLBACK added to make callback definitions uniform. PNGAPI split + into PNGCAPI (base C form), PNGAPI (exports) and PNGCBAPI (callbacks), + and appropriate changes made to all files. Cygwin builds re-hinged to + allow procedure call standard changes and to remove the need for the DEF + file (fixes build on Cygwin). + Enabled 'attribute' warnings that are relevant to library APIs and callbacks. + Changed rules for generation of the various symbol files and added a new + rule for a DEF file (which is also added to the distribution). + Updated the symbol file generation to stop it adding spurious spaces + to EOL (coming from preprocessor macro expansion). Added a facility + to join tokens in the output and rewrite *.dfn to use this. + Eliminated scripts/*.def in favor of libpng.def; updated projects/visualc71 + and removed scripts/makefile.cygwin. + Made PNG_BUILD_DLL safe: it can be set whenever a DLL is being built. + Removed the include of sys/types.h - apparently unnecessary now on the + platforms on which it happened (all but Mac OS and RISC OS). + Moved the Mac OS test into pngpriv.h (the only place it is used.) + +Version 1.5.0beta15 [March 17, 2010] + Added symbols.chk target to Makefile.am to validate the symbols in png.h + against the new DEF file scripts/symbols.def. + Changed the default DEF file back to pngwin.def. + Removed makefile.mingw. + Eliminated PNG_NO_EXTERN and PNG_ALL_EXTERN + +Version 1.5.0beta16 [April 1, 2010] + Make png_text_struct independent of PNG_iTXt_SUPPORTED, so that + fields are initialized in all configurations. The READ/WRITE + macros (PNG_(READ|WRITE)_iTXt_SUPPORTED) still function as + before to disable code to actually read or write iTXt chunks + and iTXt_SUPPORTED can be used to detect presence of either + read or write support (but it is probably better to check for + the one actually required - read or write.) + Combined multiple png_warning() calls for a single error. + Restored the macro definition of png_check_sig(). + +Version 1.5.0beta17 [April 17, 2010] + Added some "(long)" typecasts to printf calls in png_handle_cHRM(). + Documented the fact that png_set_dither() was disabled since libpng-1.4.0. + Reenabled png_set_dither() but renamed it to png_set_quantize() to reflect + more accurately what it actually does. At the same time, renamed + the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros to + PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS. + Added some "(long)" typecasts to printf calls in png_handle_cHRM(). + Freeze build-time only configuration in the build. + In all prior versions of libpng most configuration options + controlled by compiler #defines had to be repeated by the + application code that used libpng. This patch changes this + so that compilation options that can only be changed at build + time are frozen in the build. Options that are compiler + dependent (and those that are system dependent) are evaluated + each time - pngconf.h holds these. Options that can be changed + per-file in the application are in png.h. Frozen options are + in the new installed header file pnglibconf.h (John Bowler) + Removed the xcode project because it has not been updated to work + with libpng-1.5.0. + Removed the ability to include optional pngusr.h + +Version 1.5.0beta18 [April 17, 2010] + Restored the ability to include optional pngusr.h + Moved replacements for png_error() and png_warning() from the + contrib/pngminim project to pngerror.c, for use when warnings or + errors are disabled via PNG_NO_WARN or PNG_NO_ERROR_TEXT, to avoid + storing unneeded error/warning text. + Updated contrib/pngminim project to work with the new pnglibconf.h + Added some PNG_NO_* defines to contrib/pngminim/*/pngusr.h to save space. + +Version 1.5.0beta19 [April 24, 2010] + Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the functions + to read and write ints to be disabled independently of PNG_USE_READ_MACROS, + which allows libpng to be built with the functions even though the default + is to use the macros - this allows applications to choose at app build + time whether or not to use macros (previously impossible because the + functions weren't in the default build.) + Changed Windows calling convention back to __cdecl for API functions. + For Windows/x86 platforms only: + __stdcall is no longer needed for Visual Basic, so libpng-1.5.0 uses + __cdecl throughout (both API functions and callbacks) on Windows/x86 + platforms. + Replaced visualc6 and visualc71 projects with new vstudio project + Relaxed the overly-restrictive permissions of some files. + +Version 1.5.0beta20 [April 24, 2010] + Relaxed more overly-restrictive permissions of some files. + +Version 1.5.0beta21 [April 27, 2010] + Removed some unwanted binary bytes and changed CRLF to NEWLINE in the new + vstudio project files, and some trivial editing of some files in the + scripts directory. + Set PNG_NO_READ_BGR, PNG_NO_IO_STATE, and PNG_NO_TIME_RFC1123 in + contrib/pngminim/decoder/pngusr.h to make a smaller decoder application. + +Version 1.5.0beta22 [April 28, 2010] + Fixed dependencies of GET_INT_32 - it does not require READ_INT_FUNCTIONS + because it has a macro equivalent. + Improved the options.awk script; added an "everything off" option. + Revised contrib/pngminim to use the "everything off" option in pngusr.dfa. + +Version 1.5.0beta23 [April 29, 2010] + Corrected PNG_REMOVED macro to take five arguments. + The macro was documented with two arguments (name,ordinal), however + the symbol checking .dfn files assumed five arguments. The five + argument form seems more useful so it is changed to that. + Corrected PNG_UNKNOWN_CHUNKS_SUPPORTED to PNG_HANDLE_AS_UNKNOWN_SUPPORTED + in gregbook/readpng2.c + Corrected protection of png_get_user_transform_ptr. The API declaration in + png.h is removed if both READ and WRITE USER_TRANSFORM are turned off + but was left defined in pngtrans.c + Added logunsupported=1 to cause pnglibconf.h to document disabled options. + This makes the installed pnglibconf.h more readable but causes no + other change. The intention is that users of libpng will find it + easier to understand if an API they need is missing. + Include png_reset_zstream() in png.c only when PNG_READ_SUPPORTED is defined. + Removed dummy_inflate.c from contrib/pngminim/encoder + Removed contrib/pngminim/*/gather.sh; gathering is now done in the makefile. + +Version 1.5.0beta24 [May 7, 2010] + Use bitwise "&" instead of arithmetic mod in pngrutil.c calculation of the + offset of the png_ptr->rowbuf pointer into png_ptr->big_row_buf. + Added more blank lines for readability. + +Version 1.5.0beta25 [June 18, 2010] + In pngpread.c: png_push_have_row() add check for new_row > height + Removed the now-redundant check for out-of-bounds new_row from example.c + +Version 1.5.0beta26 [June 18, 2010] + In pngpread.c: png_push_process_row() add check for too many rows. + +Version 1.5.0beta27 [June 18, 2010] + Removed the check added in beta25 as it is now redundant. + +Version 1.5.0beta28 [June 20, 2010] + Rewrote png_process_IDAT_data to consistently treat extra data as warnings + and handle end conditions more cleanly. + Removed the new (beta26) check in png_push_process_row(). + +Version 1.5.0beta29 [June 21, 2010] + Revised scripts/options.awk to work on Sunos (but still doesn't work) + Added comment to options.awk and contrib/pngminim/*/makefile to try nawk. + +Version 1.5.0beta30 [June 22, 2010] + Stop memory leak when reading a malformed sCAL chunk. + +Version 1.5.0beta31 [June 26, 2010] + Revised pngpread.c patch of beta28 to avoid an endless loop. + Removed some trailing blanks. + +Version 1.5.0beta32 [June 26, 2010] + Removed leftover scripts/options.patch and scripts/options.rej + +Version 1.5.0beta33 [July 6, 3010] + Made FIXED and FLOATING options consistent in the APIs they enable and + disable. Corrected scripts/options.awk to handle both command line + options and options specified in the .dfa files. + Changed char *msg to PNG_CONST char *msg in pngrutil.c + Make png_set_sRGB_gAMA_and_cHRM set values using either the fixed or + floating point APIs, but not both. + Reversed patch to remove error handler when the jmp_buf is stored in the + main program structure, not the png_struct. + The error handler is needed because the default handler in libpng will + always use the jmp_buf in the library control structure; this is never + set. The gregbook code is a useful example because, even though it + uses setjmp/longjmp, it shows how error handling can be implemented + using control mechanisms not directly supported by libpng. The + technique will work correctly with mechanisms such as Microsoft + Structure Exceptions or C++ exceptions (compiler willing - note that gcc + does not by default support interworking of C and C++ error handling.) + Reverted changes to call png_longjmp in contrib/gregbook where it is not + appropriate. If mainprog->jmpbuf is used by setjmp, then png_longjmp + cannot be used. + Changed "extern PNG_EXPORT" to "PNG_EXPORT" in png.h (Jan Nijtmans) + Changed "extern" to "PNG_EXTERN" in pngpriv.h (except for the 'extern "C" {') + +Version 1.5.0beta34 [July 12, 2010] + Put #ifndef PNG_EXTERN, #endif around the define PNG_EXTERN in pngpriv.h + +Version 1.5.0beta35 [July 24, 2010] + Removed some newly-added TAB characters. + Added -DNO_PNG_SNPRINTF to CFLAGS in scripts/makefile.dj2 + Moved the definition of png_snprintf() outside of the enclosing + #ifdef blocks in pngconf.h + +Version 1.5.0beta36 [July 29, 2010] + Patches by John Bowler: + Fixed point APIs are now supported throughout (no missing APIs). + Internal fixed point arithmetic support exists for all internal floating + point operations. + sCAL validates the floating point strings it is passed. + Safe, albeit rudimentary, Watcom support is provided by PNG_API_RULE==2 + Two new APIs exist to get the number of passes without turning on the + PNG_INTERLACE transform and to get the number of rows in the current + pass. + A new test program, pngvalid.c, validates the gamma code. + Errors in the 16-bit gamma correction (overflows) have been corrected. + cHRM chunk testing is done consistently (previously the floating point + API bypassed it, because the test really didn't work on FP, now the test + is performed on the actual values to be stored in the PNG file so it + works in the FP case too.) + Most floating point APIs now simply call the fixed point APIs after + converting the values to the fixed point form used in the PNG file. + The standard headers no longer include zlib.h, which is currently only + required for pngstruct.h and can therefore be internal. + Revised png_get_int_32 to undo the PNG two's complement representation of + negative numbers. + +Version 1.5.0beta37 [July 30, 2010] + Added a typecast in png_get_int_32() in png.h and pngrutil.h to avoid + a compiler warning. + Replaced oFFs 0,0 with oFFs -10,20 in pngtest.png + +Version 1.5.0beta38 [July 31, 2010] + Implemented remaining "_fixed" functions. + Corrected a number of recently introduced warnings mostly resulting from + safe but uncast assignments to shorter integers. Also added a zlib + VStudio release library project because the latest zlib Official Windows + build does not include such a thing. + Revised png_get_int_16() to be similar to png_get_int_32(). + Restored projects/visualc71. + +Version 1.5.0beta39 [August 2, 2010] + VisualC/GCC warning fixes, VisualC build fixes + The changes include support for function attributes in VC in addition to + those already present in GCC - necessary because without these some + warnings are unavoidable. Fixes include signed/unsigned fixes in + pngvalid and checks with gcc -Wall -Wextra -Wunused. + VC requires function attributes on function definitions as well as + declarations, PNG_FUNCTION has been added to enable this and the + relevant function definitions changed. + +Version 1.5.0beta40 [August 6, 2010] + Correct use of _WINDOWS_ in pngconf.h + Removed png_mem_ #defines; they are no longer used. + Added the sRGB chunk to pngtest.png + +Version 1.5.0beta41 [August 11, 2010] + Added the cHRM chunk to pngtest.png + Don't try to use version-script with cygwin/mingw. + Revised contrib/gregbook to work under cygwin/mingw. + +Version 1.5.0beta42 [August 18, 2010] + Add .dll.a to the list of extensions to be symlinked by Makefile.am (Yaakov) + Made all API functions that have const arguments and constant string + literal pointers declare them (John Bowler). + +Version 1.5.0beta43 [August 20, 2010] + Removed spurious tabs, shorten long lines (no source change) + Also added scripts/chkfmt to validate the format of all the files that can + reasonably be validated (it is suggested to run "make distclean" before + checking, because some machine generated files have long lines.) + Reformatted the CHANGES file to be more consistent throughout. + Made changes to address various issues identified by GCC, mostly + signed/unsigned and shortening problems on assignment but also a few + difficult to optimize (for GCC) loops. + Fixed non-GCC fixed point builds. In png.c a declaration was misplaced + in an earlier update. Fixed to declare the auto variables at the head. + Use cexcept.h in pngvalid.c. + +Version 1.5.0beta44 [August 24, 2010] + Updated CMakeLists.txt to use CMAKE_INSTALL_LIBDIR variable; useful for + installing libpng in /usr/lib64 (Funda Wang). + Revised CMakeLists.txt to put the man pages in share/man/man* not man/man* + Revised CMakeLists.txt to make symlinks instead of copies when installing. + Changed PNG_LIB_NAME from pngNN to libpngNN in CMakeLists.txt (Philip Lowman) + Implemented memory checks within pngvalid + Reformatted/rearranged pngvalid.c to assist use of progressive reader. + Check interlaced images in pngvalid + Clarified pngusr.h comments in pnglibconf.dfa + Simplified the pngvalid error-handling code now that cexcept.h is in place. + Implemented progressive reader in pngvalid.c for standard tests + Implemented progressive read in pngvalid.c gamma tests + Turn on progressive reader in pngvalid.c by default and tidy code. + +Version 1.5.0beta45 [August 26, 2010] + Added an explicit make step to projects/vstudio for pnglibconf.h + Also corrected zlib.vcxproj into which Visual Studio had introduced + what it calls an "authoring error". The change to make pnglibconf.h + simply copies the file; in the future it may actually generate the + file from scripts/pnglibconf.dfa as the other build systems do. + Changed pngvalid to work when floating point APIs are disabled + Renamed the prebuilt scripts/pnglibconf.h to scripts/pnglibconf.h.prebuilt + Supply default values for PNG_USER_PRIVATEBUILD and PNG_USER_DLLFNAME_POSTFIX + in pngpriv.h in case the user neglected to define them in their pngusr.h + +Version 1.5.0beta46 [August 28, 2010] + Added new private header files to libpng_sources in CMakeLists.txt + Added PNG_READ_16BIT, PNG_WRITE_16BIT, and PNG_16BIT options. + Added reference to scripts/pnglibconf.h.prebuilt in the visualc71 project. + +Version 1.5.0beta47 [September 11, 2010] + Fixed a number of problems with 64-bit compilation reported by Visual + Studio 2010 (John Bowler). + +Version 1.5.0beta48 [October 4, 2010] + Updated CMakeLists.txt (Philip Lowman). + Revised autogen.sh to recognize and use $AUTOCONF, $AUTOMAKE, $AUTOHEADER, + $AUTOPOINT, $ACLOCAL and $LIBTOOLIZE + Fixed problem with symbols creation in Makefile.am which was assuming that + all versions of ccp write to standard output by default (Martin Banky). The + bug was introduced in libpng-1.2.9beta5. + Removed unused mkinstalldirs. + +Version 1.5.0beta49 [October 8, 2010] + Undid Makefile.am revision of 1.5.0beta48. + +Version 1.5.0beta50 [October 14, 2010] + Revised Makefile.in to account for mkinstalldirs being removed. + Added some "(unsigned long)" typecasts in printf statements in pngvalid.c. + Suppressed a compiler warning in png_handle_sPLT(). + Check for out-of-range text compression mode in png_set_text(). + +Version 1.5.0beta51 [October 15, 2010] + Changed embedded dates to "(PENDING RELEASE) in beta releases (and future + rc releases) to minimize the difference between releases. + +Version 1.5.0beta52 [October 16, 2010] + Restored some of the embedded dates (in png.h, png.c, documentation, etc.) + +Version 1.5.0beta53 [October 18, 2010] + Updated INSTALL to mention using "make maintainer-clean" and to remove + obsolete statement about a custom ltmain.sh + Disabled "color-tests" by default in Makefile.am so it will work with + automake versions earlier than 1.11.1 + Use document name "libpng-manual.txt" instead of "libpng-.txt" + to simplify version differences. + Removed obsolete remarks about setjmp handling from INSTALL. + Revised and renamed the typedef in png.h and png.c that was designed + to catch library and header mismatch. + +Version 1.5.0beta54 [November 10, 2010] + Require 48 bytes, not 64 bytes, for big_row_buf in overflow checks. + Used a consistent structure for the pngget.c functions. + +Version 1.5.0beta55 [November 21, 2010] + Revised png_get_uint_32, png_get_int_32, png_get_uint_16 (Cosmin) + Moved reading of file signature into png_read_sig (Cosmin) + Fixed atomicity of chunk header serialization (Cosmin) + Added test for io_state in pngtest.c (Cosmin) + Added "#!/bin/sh" at the top of contrib/pngminim/*/gather.sh scripts. + Changes to remove gcc warnings (John Bowler) + Certain optional gcc warning flags resulted in warnings in libpng code. + With these changes only -Wconversion and -Wcast-qual cannot be turned on. + Changes are trivial rearrangements of code. -Wconversion is not possible + for pngrutil.c (because of the widespread use of += et al on variables + smaller than (int) or (unsigned int)) and -Wcast-qual is not possible + with pngwio.c and pngwutil.c because the 'write' callback and zlib + compression both fail to declare their input buffers with 'const'. + +Version 1.5.0beta56 [December 7, 2010] + Added the private PNG_UNUSED() macro definition in pngpriv.h. + Added some commentary about PNG_EXPORT in png.h and pngconf.h + Revised PNG_EXPORT() macro and added PNG_EXPORTA() macro, with the + objective of simplifying and improving the cosmetic appearance of png.h. + Fixed some incorrect "=" macro names in pnglibconf.dfa + Included documentation of changes in 1.5.0 from 1.4.x in libpng-manual.txt + +Version 1.5.0beta57 [December 9, 2010] + Documented the pngvalid gamma error summary with additional comments and + print statements. + Improved missing symbol handling in checksym.awk; symbols missing in both + the old and new files can now be optionally ignored, treated as errors + or warnings. + Removed references to pngvcrd.c and pnggccrd.c from the vstudio project. + Updated "libpng14" to "libpng15" in the visualc71 project. + Enabled the strip16 tests in pngvalid.` + Don't display test results (except PASS/FAIL) when running "make test". + Instead put them in pngtest-log.txt + Added "--with-zprefix=" to configure.ac + Updated the prebuilt configuration files to autoconf version 2.68 + +Version 1.5.0beta58 [December 19, 2010] + Fixed interlace image handling and add test cases (John Bowler) + Fixed the clean rule in Makefile.am to remove pngtest-log.txt + Made minor changes to work around warnings in gcc 3.4 + +Version 1.5.0rc01 [December 27, 2010] + No changes. + +Version 1.5.0rc02 [December 27, 2010] + Eliminated references to the scripts/*.def files in project/visualc71. + +Version 1.5.0rc03 [December 28, 2010] + Eliminated scripts/*.def and revised Makefile.am accordingly + +Version 1.5.0rc04 [December 29, 2010] + Fixed bug in background transformation handling in pngrtran.c (it was + looking for the flag in png_ptr->transformations instead of in + png_ptr->flags) (David Raymond). + +Version 1.5.0rc05 [December 31, 2010] + Fixed typo in a comment in CMakeLists.txt (libpng14 => libpng15) (Cosmin) + +Version 1.5.0rc06 [January 4, 2011] + Changed the new configure option "zprefix=string" to "zlib-prefix=string" + +Version 1.5.0rc07 [January 4, 2011] + Updated copyright year. + +Version 1.5.0 [January 6, 2011] + No changes. + +version 1.5.1beta01 [January 8, 2011] + Added description of png_set_crc_action() to the manual. + Added a note in the manual that the type of the iCCP profile was changed + from png_charpp to png_bytepp in png_get_iCCP(). This change happened + in version 1.5.0beta36 but is not noted in the CHANGES. Similarly, + it was changed from png_charpp to png_const_bytepp in png_set_iCCP(). + Ensure that png_rgb_to_gray ignores palette mapped images, if libpng + internally happens to call it with one, and fixed a failure to handle + palette mapped images correctly. This fixes CVE-2690. + +Version 1.5.1beta02 [January 14, 2011] + Fixed a bug in handling of interlaced images (bero at arklinux.org). + Updated CMakeLists.txt (Clifford Yapp) + +Version 1.5.1beta03 [January 14, 2011] + Fixed typecasting of some png_debug() statements (Cosmin) + +Version 1.5.1beta04 [January 16, 2011] + Updated documentation of png_set|get_tRNS() (Thomas Klausner). + Mentioned in the documentation that applications must #include "zlib.h" + if they need access to anything in zlib.h, and that a number of + macros such as png_memset() are no longer accessible by applications. + Corrected pngvalid gamma test "sample" function to access all of the color + samples of each pixel, instead of sampling the red channel three times. + Prefixed variable names index, div, exp, gamma with "png_" to avoid "shadow" + warnings, and (mistakenly) changed png_exp() to exp(). + +Version 1.5.1beta05 [January 16, 2011] + Changed variable names png_index, png_div, png_exp, and png_gamma to + char_index, divisor, exp_b10, and gamma_val, respectively, and + changed exp() back to png_exp(). + +Version 1.5.1beta06 [January 20, 2011] + Prevent png_push_crc_skip() from hanging while reading an unknown chunk + or an over-large compressed zTXt chunk with the progressive reader. + Eliminated more GCC "shadow" warnings. + Revised png_fixed() in png.c to avoid compiler warning about reaching the + end without returning anything. + +Version 1.5.1beta07 [January 22, 2011] + In the manual, describe the png_get_IHDR() arguments in the correct order. + Added const_png_structp and const_png_infop types, and used them in + prototypes for most png_get_*() functions. + +Version 1.5.1beta08 [January 23, 2011] + Added png_get_io_chunk_type() and deprecated png_get_io_chunk_name() + Added synopses for the IO_STATE functions and other missing synopses + to the manual. Removed the synopses from libpngpf.3 because they + were out of date and no longer useful. Better information can be + obtained by reading the prototypes and comments in pngpriv.h + Attempted to fix cpp on Solaris with S. Studio 12 cc, fix build + Added a make macro DFNCPP that is a CPP that will accept the tokens in + a .dfn file and adds configure stuff to test for such a CPP. ./configure + should fail if one is not available. + Corrected const_png_ in png.h to png_const_ to avoid polluting the namespace. + Added png_get_current_row_number and png_get_current_pass_number for the + benefit of the user transform callback. + Added png_process_data_pause and png_process_data_skip for the benefit of + progressive readers that need to stop data processing or want to optimize + skipping of unread data (e.g., if the reader marks a chunk to be skipped.) + +Version 1.5.1beta09 [January 24, 2011] + Enhanced pngvalid, corrected an error in gray_to_rgb, corrected doc error. + pngvalid contains tests of transforms, which tests are currently disabled + because they are incompletely tested. gray_to_rgb was failing to expand + the bit depth for smaller bit depth images; this seems to be a long + standing error and resulted, apparently, in invalid output + (CVE-2011-0408, CERT VU#643140). The documentation did not accurately + describe what libpng really does when converting RGB to gray. + +Version 1.5.1beta10 [January 27, 2010] + Fixed incorrect examples of callback prototypes in the manual, that were + introduced in libpng-1.0.0. + In addition the order of the png_get_uint macros with respect to the + relevant function definitions has been reversed. This helps the + preprocessing of the symbol files be more robust. Furthermore, the + symbol file preprocessing now uses -DPNG_NO_USE_READ_MACROS even when + the library may actually be built with PNG_USE_READ_MACROS; this stops + the read macros interfering with the symbol file format. + Made the manual, synopses, and function prototypes use the function + argument names file_gamma, int_file_gamma, and srgb_intent consistently. + +Version 1.5.1beta11 [January 28, 2011] + Changed PNG_UNUSED from "param=param;" to "{if(param){}}". + Corrected local variable type in new API png_process_data_skip() + The type was self-evidently incorrect but only causes problems on 64-bit + architectures. + Added transform tests to pngvalid and simplified the arguments. + +Version 1.5.1rc01 [January 29, 2011] + No changes. + +Version 1.5.1rc02 [January 31, 2011] + Added a request in the manual that applications do not use "png_" or + "PNG_" to begin any of their own symbols. + Changed PNG_UNUSED to "(void)param;" and updated the commentary in pngpriv.h + +Version 1.5.1 [February 3, 2011] + No changes. + +Version 1.5.2beta01 [February 13, 2011] + More -Wshadow fixes for older gcc compilers. Older gcc versions apparently + check formal parameters names in function declarations (as well as + definitions) to see if they match a name in the global namespace. + Revised PNG_EXPORTA macro to not use an empty parameter, to accommodate the + old VisualC++ preprocessor. + Turned on interlace handling in png_read_png(). + Fixed gcc pendantic warnings. + Handle longjmp in Cygwin. + Fixed png_get_current_row_number() in the interlaced case. + Cleaned up ALPHA flags and transformations. + Implemented expansion to 16 bits. + +Version 1.5.2beta02 [February 19, 2011] + Fixed mistake in the descriptions of user read_transform and write_transform + function prototypes in the manual. The row_info struct is png_row_infop. + Reverted png_get_current_row_number() to previous (1.5.2beta01) behavior. + Corrected png_get_current_row_number documentation + Fixed the read/write row callback documentation. + This documents the current behavior, where the callback is called after + every row with information pertaining to the next row. + +Version 1.5.2beta03 [March 3, 2011] + Fixed scripts/makefile.vcwin32 + Updated contrib/pngsuite/README to add the word "modify". + Define PNG_ALLOCATED to blank when _MSC_VER<1300. + +Version 1.5.2rc01 [March 19, 2011] + Define remaining attributes to blank when MSC_VER<1300. + ifdef out mask arrays in pngread.c when interlacing is not supported. + +Version 1.5.2rc02 [March 22, 2011] + Added a hint to try CPP=/bin/cpp if "cpp -E" fails in scripts/pnglibconf.mak + and in contrib/pngminim/*/makefile, eg., on SunOS 5.10, and removed "strip" + from the makefiles. + Fixed a bug (present since libpng-1.0.7) that makes png_handle_sPLT() fail + to compile when PNG_NO_POINTER_INDEXING is defined (Chubanov Kirill) + +Version 1.5.2rc03 [March 24, 2011] + Don't include standard header files in png.h while building the symbol table, + to avoid cpp failure on SunOS (introduced PNG_BUILDING_SYMBOL_TABLE macro). + +Version 1.5.2 [March 31, 2011] + No changes. + +Version 1.5.3beta01 [April 1, 2011] + Re-initialize the zlib compressor before compressing non-IDAT chunks. + Added API functions (png_set_text_compression_level() and four others) to + set parameters for zlib compression of non-IDAT chunks. + +Version 1.5.3beta02 [April 3, 2011] + Updated scripts/symbols.def with new API functions. + Only compile the new zlib re-initializing code when text or iCCP is + supported, using PNG_WRITE_COMPRESSED_TEXT_SUPPORTED macro. + Improved the optimization of the zlib CMF byte (see libpng-1.2.6beta03). + Optimize the zlib CMF byte in non-IDAT compressed chunks + +Version 1.5.3beta03 [April 16, 2011] + Fixed gcc -ansi -pedantic compile. A strict ANSI system does not have + snprintf, and the "__STRICT_ANSI__" detects that condition more reliably + than __STDC__ (John Bowler). + Removed the PNG_PTR_NORETURN attribute because it too dangerous. It tells + the compiler that a user supplied callback (the error handler) does not + return, yet there is no guarantee in practice that the application code + will correctly implement the error handler because the compiler only + issues a warning if there is a mistake (John Bowler). + Removed the no-longer-used PNG_DEPSTRUCT macro. + Updated the zlib version to 1.2.5 in the VStudio project. + Fixed 64-bit builds where png_uint_32 is smaller than png_size_t in + pngwutil.c (John Bowler). + Fixed bug with stripping the filler or alpha channel when writing, that + was introduced in libpng-1.5.2beta01 (bug report by Andrew Church). + +Version 1.5.3beta04 [April 27, 2011] + Updated pngtest.png with the new zlib CMF optimization. + Cleaned up conditional compilation code and of background/gamma handling + Internal changes only except a new option to avoid compiling the + png_build_grayscale_palette API (which is not used at all internally.) + The main change is to move the transform tests (READ_TRANSFORMS, + WRITE_TRANSFORMS) up one level to the caller of the APIs. This avoids + calls to spurious functions if all transforms are disabled and slightly + simplifies those functions. Pngvalid modified to handle this. + A minor change is to stop the strip_16 and expand_16 interfaces from + disabling each other; this allows the future alpha premultiplication + code to use 16-bit intermediate values while still producing 8-bit output. + png_do_background and png_do_gamma have been simplified to take a single + pointer to the png_struct rather than pointers to every item required + from the png_struct. This makes no practical difference to the internal + code. + A serious bug in the pngvalid internal routine 'standard_display_init' has + been fixed - this failed to initialize the red channel and accidentally + initialized the alpha channel twice. + Changed png_struct jmp_buf member name from png_jmpbuf to tmp_jmpbuf to + avoid a possible clash with the png_jmpbuf macro on some platforms. + +Version 1.5.3beta05 [May 6, 2011] + Added the "_POSIX_SOURCE" feature test macro to ensure libpng sees the + correct API. _POSIX_SOURCE is defined in pngpriv.h, pngtest.c and + pngvalid.c to ensure that POSIX conformant systems disable non-POSIX APIs. + Removed png_snprintf and added formatted warning messages. This change adds + internal APIs to allow png_warning messages to have parameters without + requiring the host OS to implement snprintf. As a side effect the + dependency of the tIME-supporting RFC1132 code on stdio is removed and + PNG_NO_WARNINGS does actually work now. + Pass "" instead of '\0' to png_default_error() in png_err(). This mistake + was introduced in libpng-1.2.20beta01. This fixes CVE-2011-2691. + Added PNG_WRITE_OPTIMIZE_CMF_SUPPORTED macro to make the zlib "CMF" byte + optimization configureable. + IDAT compression failed if preceded by a compressed text chunk (bug + introduced in libpng-1.5.3beta01-02). This was because the attempt to + reset the zlib stream in png_write_IDAT happened after the first IDAT + chunk had been deflated - much too late. In this change internal + functions were added to claim/release the z_stream and, hopefully, make + the code more robust. Also deflateEnd checking is added - previously + libpng would ignore an error at the end of the stream. + +Version 1.5.3beta06 [May 8, 2011] + Removed the -D_ALL_SOURCE from definitions for AIX in CMakeLists.txt + Implemented premultiplied alpha support: png_set_alpha_mode API + +Version 1.5.3beta07 [May 11, 2011] + Added expand_16 support to the high level interface. + Added named value and 'flag' gamma support to png_set_gamma. Made a minor + change from the previous (unreleased) ABI/API to hide the exact value used + for Macs - it's not a good idea to embed this in the ABI! + Moved macro definitions for PNG_HAVE_IHDR, PNG_HAVE_PLTE, and PNG_AFTER_IDAT + from pngpriv.h to png.h because they must be visible to applications + that call png_set_unknown_chunks(). + Check for up->location !PNG_AFTER_IDAT when writing unknown chunks + before IDAT. + +Version 1.5.3beta08 [May 16, 2011] + Improved "pngvalid --speed" to exclude more of pngvalid from the time. + Documented png_set_alpha_mode(), other changes in libpng.3/libpng-manual.txt + The cHRM chunk now sets the defaults for png_set_rgb_to_gray() (when negative + parameters are supplied by the caller), while in the absence of cHRM + sRGB/Rec 709 values are still used. This introduced a divide-by-zero + bug in png_handle_cHRM(). + The bKGD chunk no longer overwrites the background value set by + png_set_background(), allowing the latter to be used before the file + header is read. It never performed any useful function to override + the default anyway. + Added memory overwrite and palette image checks to pngvalid.c + Previously palette image code was poorly checked. Since the transformation + code has a special palette path in most cases this was a severe weakness. + Minor cleanup and some extra checking in pngrutil.c and pngrtran.c. When + expanding an indexed image, always expand to RGBA if transparency is + present. + +Version 1.5.3beta09 [May 17, 2011] + Reversed earlier 1.5.3 change of transformation order; move png_expand_16 + back where it was. The change doesn't work because it requires 16-bit + gamma tables when the code only generates 8-bit ones. This fails + silently; the libpng code just doesn't do any gamma correction. Moving + the tests back leaves the old, inaccurate, 8-bit gamma calculations, but + these are clearly better than none! + +Version 1.5.3beta10 [May 20, 2011] + + png_set_background() and png_expand_16() did not work together correctly. + This problem is present in 1.5.2; if png_set_background is called with + need_expand false and the matching 16 bit color libpng erroneously just + treats it as an 8-bit color because of where png_do_expand_16 is in the + transform list. This simple fix reduces the supplied colour to 8-bits, + so it gets smashed, but this is better than the current behavior. + Added tests for expand16, more fixes for palette image tests to pngvalid. + Corrects the code for palette image tests and disables attempts to + validate palette colors. + +Version 1.5.3rc01 [June 3, 2011] + No changes. + +Version 1.5.3rc02 [June 8, 2011] + Fixed uninitialized memory read in png_format_buffer() (Bug report by + Frank Busse, CVE-2011-2501, related to CVE-2004-0421). + +Version 1.5.3beta11 [June 11, 2011] + Fixed png_handle_sCAL which is broken in 1.5. This fixes CVE 2011-2692. + Added sCAL to pngtest.png + Revised documentation about png_set_user_limits() to say that it also affects + png writing. + Revised handling of png_set_user_limits() so that it can increase the + limit beyond the PNG_USER_WIDTH|HEIGHT_MAX; previously it could only + reduce it. + Make the 16-to-8 scaling accurate. Dividing by 256 with no rounding is + wrong (high by one) 25% of the time. Dividing by 257 with rounding is + wrong in 128 out of 65536 cases. Getting the right answer all the time + without division is easy. + Added "_SUPPORTED" to the PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION macro. + Added projects/owatcom, an IDE project for OpenWatcom to replace + scripts/makefile.watcom. This project works with OpenWatcom 1.9. The + IDE autogenerates appropriate makefiles (libpng.mk) for batch processing. + The project is configurable, unlike the Visual Studio project, so long + as the developer has an awk. + Changed png_set_gAMA to limit the gamma value range so that the inverse + of the stored value cannot overflow the fixed point representation, + and changed other things OpenWatcom warns about. + Revised pngvalid.c to test PNG_ALPHA_MODE_SUPPORTED correctly. This allows + pngvalid to build when ALPHA_MODE is not supported, which is required if + it is to build on libpng 1.4. + Removed string/memory macros that are no longer used and are not + necessarily fully supportable, particularly png_strncpy and png_snprintf. + Added log option to pngvalid.c and attempted to improve gamma messages. + +Version 1.5.3 [omitted] + People found the presence of a beta release following an rc release + to be confusing; therefore we bump the version to libpng-1.5.4beta01 + and there will be no libpng-1.5.3 release. + +Version 1.5.4beta01 [June 14, 2011] + Made it possible to undefine PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED + to get the same (inaccurate) output as libpng-1.5.2 and earlier. + Moved definitions of PNG_HAVE_IHDR, PNG_AFTER_IDAT, and PNG_HAVE_PLTE + outside of an unknown-chunk block in png.h because they are also + needed for other uses. + +Version 1.5.4beta02 [June 14, 2011] + Fixed and clarified LEGACY 16-to-8 scaling code. + Added png_set_chop_16() API, to match inaccurate results from previous + libpng versions. + Removed the ACCURATE and LEGACY options (they are no longer useable) + Use the old scaling method for background if png_set_chop_16() was + called. + Made png_set_chop_16() API removeable by disabling PNG_CHOP_16_TO_8_SUPPORTED + +Version 1.5.4beta03 [June 15, 2011] + Fixed a problem in png_do_expand_palette() exposed by optimization in + 1.5.3beta06 + Also removed a spurious and confusing "trans" member ("trans") from png_info. + The palette expand optimization prevented expansion to an intermediate RGBA + form if tRNS was present but alpha was marked to be stripped; this exposed + a check for tRNS in png_do_expand_palette() which is inconsistent with the + code elsewhere in libpng. + Correction to the expand_16 code; removed extra instance of + png_set_scale_16_to_8 from pngpriv.h + +Version 1.5.4beta04 [June 16, 2011] + Added a missing "#ifdef PNG_READ_BACKGROUND_SUPPORTED/#endif" in pngrtran.c + Added PNG_TRANSFORM_CHOP_16 to the high-level read transforms. + Made PNG_READ_16_TO_8_ACCURATE_SCALE configurable again. If this is + not enabled, png_set_strip_16() and png_do_scale_16_to_8() aren't built. + Revised contrib/visupng, gregbook, and pngminim to demonstrate chop_16_to_8 + +Version 1.5.4beta05 [June 16, 2011] + Renamed png_set_strip_16() to png_set_scale_16() and renamed + png_set_chop_16() to png_set_strip(16) in an attempt to minimize the + behavior changes between libpng14 and libpng15. + +Version 1.5.4beta06 [June 18, 2011] + Fixed new bug that was causing both strip_16 and scale_16 to be applied. + +Version 1.5.4beta07 [June 19, 2011] + Fixed pngvalid, simplified macros, added checking for 0 in sCAL. + The ACCURATE scale macro is no longer defined in 1.5 - call the + png_scale_16_to_8 API. Made sure that PNG_READ_16_TO_8 is still defined + if the png_strip_16_to_8 API is present. png_check_fp_number now + maintains some state so that positive, negative and zero values are + identified. sCAL uses these to be strictly spec conformant. + +Version 1.5.4beta08 [June 23, 2011] + Fixed pngvalid if ACCURATE_SCALE is defined. + Updated scripts/pnglibconf.h.prebuilt. + +Version 1.5.4rc01 [June 30, 2011] + Define PNG_ALLOCATED to "restrict" only if MSC_VER >= 1400. + +Version 1.5.4 [July 7, 2011] + No changes. + +Version 1.5.5beta01 [July 13, 2011] + Fixed some typos and made other minor changes in the manual. + Updated contrib/pngminus/makefile.std (Samuli Souminen) + +Version 1.5.5beta02 [July 14, 2011] + Revised Makefile.am and Makefile.in to look in the right directory for + pnglibconf.h.prebuilt + +Version 1.5.5beta03 [July 27, 2011] + Enabled compilation with g++ compiler. This compiler does not recognize + the file extension, so it always compiles with C++ rules. Made minor + changes to pngrutil.c to cast results where C++ expects it but C does not. + Minor editing of libpng.3 and libpng-manual.txt. + +Version 1.5.5beta04 [July 29, 2011] + Revised CMakeLists.txt (Clifford Yapp) + Updated commentary about the png_rgb_to_gray() default coefficients + in the manual and in pngrtran.c + +Version 1.5.5beta05 [August 17, 2011] + Prevent unexpected API exports from non-libpng DLLs on Windows. The "_DLL" + is removed from the test of whether a DLL is being built (this erroneously + caused the libpng APIs to be marked as DLL exports in static builds under + Microsoft Visual Studio). Almost all of the libpng building configuration + is moved from pngconf.h to pngpriv.h, but PNG_DLL_EXPORT remains in + pngconf.h, though, so that it is colocated with the import definition (it + is no longer used anywhere in the installed headers). The VStudio project + definitions have been cleaned up: "_USRDLL" has been removed from the + static library builds (this was incorrect), and PNG_USE_DLL has been added + to pngvalid to test the functionality (pngtest does not supply it, + deliberately). The spurious "_EXPORTS" has been removed from the + libpng build (all these errors were a result of copy/paste between project + configurations.) + Added new types and internal functions for CIE RGB end point handling to + pngpriv.h (functions yet to be implemented). + +Version 1.5.5beta06 [August 26, 2011] + Ensure the CMAKE_LIBRARY_OUTPUT_DIRECTORY is set in CMakeLists.txt + (Clifford Yap) + Fixes to rgb_to_gray and cHRM XYZ APIs (John Bowler): + The rgb_to_gray code had errors when combined with gamma correction. + Some pixels were treated as true grey when they weren't and such pixels + and true grey ones were not gamma corrected (the original value of the + red component was used instead). APIs to get and set cHRM using color + space end points have been added and the rgb_to_gray code that defaults + based on cHRM, and the divide-by-zero bug in png_handle_cHRM (CERT + VU#477046, CVE-2011-3328, introduced in 1.5.4) have been corrected. + A considerable number of tests has been added to pngvalid for the + rgb_to_gray transform. + Arithmetic errors in rgb_to_gray whereby the calculated gray value was + truncated to the bit depth rather than rounded have been fixed except in + the 8-bit non-gamma-corrected case (where consistency seems more important + than correctness.) The code still has considerable inaccuracies in the + 8-bit case because 8-bit linear arithmetic is used. + +Version 1.5.5beta07 [September 7, 2011] + Added "$(ARCH)" option to makefile.darwin + Added SunOS support to configure.ac and Makefile.am + Changed png_chunk_benign_error() to png_warning() in png.c, in + png_XYZ_from_xy_checked(). + +Version 1.5.5beta08 [September 10, 2011] + Fixed 64-bit compilation errors (gcc). The errors fixed relate + to conditions where types that are 32 bits in the GCC 32-bit + world (uLong and png_size_t) become 64 bits in the 64-bit + world. This produces potential truncation errors which the + compiler correctly flags. + Relocated new HAVE_SOLARIS_LD definition in configure.ac + Constant changes for 64-bit compatibility (removal of L suffixes). The + 16-bit cases still use "L" as we don't have a 16-bit test system. + +Version 1.5.5rc01 [September 15, 2011] + Removed "L" suffixes in pngpriv.h + +Version 1.5.5 [September 22, 2011] + No changes. + +Version 1.5.6beta01 [September 22, 2011] + Fixed some 64-bit type conversion warnings in pngrtran.c + Moved row_info from png_struct to a local variable. + The various interlace mask arrays have been made into arrays of + bytes and made PNG_CONST and static (previously some arrays were + marked PNG_CONST and some weren't). + Additional checks have been added to the transform code to validate the + pixel depths after the transforms on both read and write. + Removed some redundant code from pngwrite.c, in png_destroy_write_struct(). + Changed chunk reading/writing code to use png_uint_32 instead of png_byte[4]. + This removes the need to allocate temporary strings for chunk names on + the stack in the read/write code. Unknown chunk handling still uses the + string form because this is exposed in the API. + +Version 1.5.6beta02 [September 26, 2011] + Added a note in the manual the png_read_update_info() must be called only + once with a particular info_ptr. + Fixed a typo in the definition of the new PNG_STRING_FROM_CHUNK(s,c) macro. + +Version 1.5.6beta03 [September 28, 2011] + Revised test-pngtest.sh to report FAIL when pngtest fails. + Added "--strict" option to pngtest, to report FAIL when the failure is + only because the resulting valid files are different. + Revised CMakeLists.txt to work with mingw and removed some material from + CMakeLists.txt that is no longer useful in libpng-1.5. + +Version 1.5.6beta04 [October 5, 2011] + Fixed typo in Makefile.in and Makefile.am ("-M Wl" should be "-M -Wl")." + +Version 1.5.6beta05 [October 12, 2011] + Speed up png_combine_row() for interlaced images. This reduces the generality + of the code, allowing it to be optimized for Adam7 interlace. The masks + passed to png_combine_row() are now generated internally, avoiding + some code duplication and localizing the interlace handling somewhat. + Align png_struct::row_buf - previously it was always unaligned, caused by + a bug in the code that attempted to align it; the code needs to subtract + one from the pointer to take account of the filter byte prepended to + each row. + Optimized png_combine_row() when rows are aligned. This gains a small + percentage for 16-bit and 32-bit pixels in the typical case where the + output row buffers are appropriately aligned. The optimization was not + previously possible because the png_struct buffer was always misaligned. + Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01. + +Version 1.5.6beta06 [October 17, 2011] + Removed two redundant tests for unitialized row. + Fixed a relatively harmless memory overwrite in compressed text writing + with a 1 byte zlib buffer. + Add ability to call png_read_update_info multiple times to pngvalid.c. + Fixes for multiple calls to png_read_update_info. These fixes attend to + most of the errors revealed in pngvalid, however doing the gamma work + twice results in inaccuracies that can't be easily fixed. There is now + a warning in the code if this is going to happen. + Turned on multiple png_read_update_info in pngvalid transform tests. + Prevent libpng from overwriting unused bits at the end of the image when + it is not byte aligned, while reading. Prior to libpng-1.5.6 libpng would + overwrite the partial byte at the end of each row if the row width was not + an exact multiple of 8 bits and the image is not interlaced. + +Version 1.5.6beta07 [October 21, 2011] + Made png_ptr->prev_row an aligned pointer into png_ptr->big_prev_row + (Mans Rullgard). + +Version 1.5.6rc01 [October 26, 2011] + Changed misleading "Missing PLTE before cHRM" warning to "Out of place cHRM" + +Version 1.5.6rc02 [October 27, 2011] + Added LSR() macro to defend against buggy compilers that evaluate non-taken + code branches and complain about out-of-range shifts. + +Version 1.5.6rc03 [October 28, 2011] + Renamed the LSR() macro to PNG_LSR() and added PNG_LSL() macro. + Fixed compiler warnings with Intel and MSYS compilers. The logical shift + fix for Microsoft Visual C is required by other compilers, so this + enables that fix for all compilers when using compile-time constants. + Under MSYS 'byte' is a name declared in a system header file, so we + changed the name of a local variable to avoid the warnings that result. + Added #define PNG_ALIGN_TYPE PNG_ALIGN_NONE to contrib/pngminim/*/pngusr.h + +Version 1.5.6 [November 3, 2011] + No changes. + +Version 1.5.7beta01 [November 4, 2011] + Added support for ARM processor (Mans Rullgard) + Fixed bug in pngvalid on early allocation failure; fixed type cast in + pngmem.c; pngvalid would attempt to call png_error() if the allocation + of a png_struct or png_info failed. This would probably have led to a + crash. The pngmem.c implementation of png_malloc() included a cast + to png_size_t which would fail on large allocations on 16-bit systems. + Fix for the preprocessor of the Intel C compiler. The preprocessor + splits adjacent @ signs with a space; this changes the concatentation + token from @-@-@ to PNG_JOIN; that should work with all compiler + preprocessors. + Paeth filter speed improvements from work by Siarhei Siamashka. This + changes the 'Paeth' reconstruction function to improve the GCC code + generation on x86. The changes are only part of the suggested ones; + just the changes that definitely improve speed and remain simple. + The changes also slightly increase the clarity of the code. + +Version 1.5.7beta02 [November 11, 2011] + Check compression_type parameter in png_get_iCCP and remove spurious + casts. The compression_type parameter is always assigned to, so must + be non-NULL. The cast of the profile length potentially truncated the + value unnecessarily on a 16-bit int system, so the cast of the (byte) + compression type to (int) is specified by ANSI-C anyway. + Fixed FP division by zero in pngvalid.c; the 'test_pixel' code left + the sBIT fields in the test pixel as 0, which resulted in a floating + point division by zero which was irrelevant but causes systems where + FP exceptions cause a crash. Added code to pngvalid to turn on FP + exceptions if the appropriate glibc support is there to ensure this is + tested in the future. + Updated scripts/pnglibconf.mak and scripts/makefile.std to handle the + new PNG_JOIN macro. + Added versioning to pnglibconf.h comments. + Simplified read/write API initial version; basic read/write tested on + a variety of images, limited documentation (in the header file.) + Installed more accurate linear to sRGB conversion tables. The slightly + modified tables reduce the number of 16-bit values that + convert to an off-by-one 8-bit value. The "makesRGB.c" code that was used + to generate the tables is now in a contrib/sRGBtables sub-directory. + +Version 1.5.7beta03 [November 17, 2011] + Removed PNG_CONST from the sRGB table declarations in pngpriv.h and png.c + Added run-time detection of NEON support. + Added contrib/libtests; includes simplified API test and timing test and + a color conversion utility for rapid checking of failed 'pngstest' results. + Multiple transform bug fixes plus a work-round for double gamma correction. + libpng does not support more than one transform that requires linear data + at once - if this is tried typically the results is double gamma + correction. Since the simplified APIs can need rgb to gray combined with + a compose operation it is necessary to do one of these outside the main + libpng transform code. This check-in also contains fixes to various bugs + in the simplified APIs themselves and to some bugs in compose and rgb to + gray (on palette) itself. + Fixes for C++ compilation using g++ When libpng source is compiled + using g++. The compiler imposes C++ rules on the C source; thus it + is desireable to make the source work with either C or C++ rules + without throwing away useful error information. This change adds + png_voidcast to allow C semantic (void*) cases or the corresponding + C++ static_cast operation, as appropriate. + Added --noexecstack to assembler file compilation. GCC does not set + this on assembler compilation, even though it does on C compilation. + This creates security issues if assembler code is enabled; the + work-around is to set it by default in the flags for $(CCAS) + Work around compilers that don't support declaration of const data. Some + compilers fault 'extern const' data declarations (because the data is + not initialized); this turns on const-ness only for compilers where + this is known to work. + +Version 1.5.7beta04 [November 17, 2011] + Since the gcc driver does not recognize the --noexecstack flag, we must + use the -Wa prefix to have it passed through to the assembler. + Also removed a duplicate setting of this flag. + Added files that were omitted from the libpng-1.5.7beta03 zip distribution. + +Version 1.5.7beta05 [November 25, 2011] + Removed "zTXt" from warning in generic chunk decompression function. + Validate time settings passed to pngset() and png_convert_to_rfc1123() + (Frank Busse). + Added MINGW support to CMakeLists.txt + Reject invalid compression flag or method when reading the iTXt chunk. + Backed out 'simplified' API changes. The API seems too complex and there + is a lack of consensus or enthusiasm for the proposals. The API also + reveals significant bugs inside libpng (double gamma correction and the + known bug of being unable to retrieve a corrected palette). It seems + better to wait until the bugs, at least, are corrected. + Moved pngvalid.c into contrib/libtests + Rebuilt Makefile.in, configure, etc., with autoconf-2.68 + +Version 1.5.7rc01 [December 1, 2011] + Replaced an "#if" with "#ifdef" in pngrtran.c + Revised #if PNG_DO_BC block in png.c (use #ifdef and add #else) + +Version 1.5.7rc02 [December 5, 2011] + Revised project files and contrib/pngvalid/pngvalid.c to account for + the relocation of pngvalid into contrib/libtests. + Revised pngconf.h to use " __declspec(restrict)" only when MSC_VER >= 1400, + as in libpng-1.5.4. + Put CRLF line endings in the owatcom project files. + +Version 1.5.7rc03 [December 7, 2011] + Updated CMakeLists.txt to account for the relocation of pngvalid.c + +Version 1.5.7 [December 15, 2011] + Minor fixes to pngvalid.c for gcc 4.6.2 compatibility to remove warnings + reported by earlier versions. + +Version 1.5.8beta01 [January 15, 2011] + Removed '#include config.h"' from contrib/libtests/pngvalid.c. It's not + needed and causes trouble for VPATH building. + Moved AC_MSG_CHECKING([if libraries can be versioned]) later to the proper + location in configure.ac (Gilles Espinasse). + Fix bug in pngerror.c: some long warnings were being improperly truncated + (CVE-2011-3464, bug introduced in libpng-1.5.3beta05). + +Version 1.5.8rc01 [January 21, 2012] + No changes. + +Version 1.5.8rc02 [January 25, 2012] + Fixed Min/GW uninstall to remove libpng.dll.a + Conditionalize the install rules for MINGW and CYGWIN in CMakeLists.txt + +Version 1.5.8 [February 1, 2012] + No changes. + +Version 1.5.9beta01 [February 3, 2012] + Rebuilt configure scripts in the tar distributions. + +Version 1.5.9beta02 [February 16, 2012] + Removed two unused definitions from scripts/pnglibconf.h.prebuilt + Removed some unused arrays (with #ifdef) from png_read_push_finish_row(). + Removed tests for no-longer-used *_EMPTY_PLTE_SUPPORTED from pngstruct.h + +Version 1.5.9rc01 [February 17, 2012] + Fixed CVE-2011-3026 buffer overrun bug. This bug was introduced when + iCCP chunk support was added at libpng-1.0.6. Deal more correctly with the + test on iCCP chunk length. Also removed spurious casts that may hide + problems on 16-bit systems. + +Version 1.5.9 [February 18, 2012] + No changes. + +Version 1.5.10beta01 [February 24, 2012] + Removed two useless #ifdef directives from pngread.c and one from pngrutil.c + Always put the CMAKE_LIBRARY in "lib" (removed special WIN32 case). + Removed empty vstudio/pngstest directory (Clifford Yapp). + Eliminated redundant png_push_read_tEXt|zTXt|iTXt|unknown code from + pngpread.c and use the sequential png_handle_tEXt, etc., in pngrutil.c; + now that png_ptr->buffer is inaccessible to applications, the special + handling is no longer useful. + Fixed bug with png_handle_hIST with odd chunk length (Frank Busse). + Added PNG_SAFE_LIMITS feature to pnglibconf.dfa and code in pngconf.h + to reset the user limits to safe ones if PNG_SAFE_LIMITS is defined. + To enable, use "CPPFLAGS=-DPNG_SAFE_LIMITS_SUPPORTED" on the configure + command or put "#define PNG_SAFE_LIMITS_SUPPORTED" in pnglibconf.h. + Revised the SAFE_LIMITS feature to be the same as the feature in libpng16. + Added information about the new limits in the manual. + +Version 1.5.10beta02 [February 27, 2012] + Updated Makefile.in + +Version 1.5.10beta03 [March 6, 2012] + Removed unused "current_text" members of png_struct and the png_free() + of png_ptr->current_text from pngread.c + Added palette-index checking. Issue a png_warning() if an invalid index is + found. + +Version 1.5.10beta04 [March 10, 2012] + Fixed PNG_LIBPNG_BUILD_BASE_TYPE definition. + Fixed CMF optimization of non-IDAT compressed chunks, which was added at + libpng-1.5.4. It sometimes produced too small of a window. + +Version 1.5.10beta05 [March 10, 2012] + Reject all iCCP chunks after the first, even if the first one is invalid. + Issue a png_benign_error() instead of png_warning() about bad palette index. + Fixed an off-by-one error in the palette index checking function. + Revised example.c to put text strings in a temporary character array + instead of directly assigning string constants to png_textp members. + This avoids compiler warnings when -Wwrite-strings is enabled. + +Version 1.5.10 [March 29, 2012] + Prevent PNG_EXPAND+PNG_SHIFT doing the shift twice. + Revised png_set_text_2() to avoid potential memory corruption (fixes + CVE-2011-3048). + +Version 1.5.11beta01 [April 28, 2012] + Revised scripts/makefile.darwin: use system zlib; remove quotes around + architecture list; add missing ppc architecture; add architecture options + to shared library link; don't try to create a shared lib based on missing + RELEASE variable. + Enable png_set_check_for_invalid_index() for both read and write. + Removed #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED/#endif in pngpriv.h around + declaration of png_handle_unknown(). + Added -lssp_nonshared in a comment in scripts/makefile.freebsd + and changed deprecated NOOBJ and NOPROFILE to NO_OBJ and NO_PROFILE. + +Version 1.5.11rc01 [May 23, 2012] + No changes. + +Version 1.5.11rc02 [May 29, 2012] + Fixed some typos in comments. + Revised CMakeLists.txt to not attempt to make a symlink under mingw. + Added two images to contrib/pngsuite (1-bit and 2-bit transparent grayscale), + and renamed three whose names were inconsistent with those in + pngsuite/README.txt. + +Version 1.5.11rc03 [June 4, 2012] + Do not depend upon a GCC feature macro being available for use in generating + the linker mapfile symbol prefix. + Made fixes for new optimization warnings from gcc 4.7.0. The compiler + performed an optimization which is safe but then warned about it. + Changing the type of 'palette_number' in pngvalid.c removes the warning. + +Version 1.5.11rc04 [June 6, 2012] + Improved performance of new do_check_palette_indexes() function. + +Version 1.5.11rc05 [June 7, 2012] + Don't check palette indexes if num_palette is 0 (as it can be in MNG files). + +Version 1.5.11 [June 14, 2012] + Include zlib.h in contrib/gregbook and contrib/visupng examples. + +Version 1.5.12 [July 11, 2012] + Removed scripts/makefile.cegcc from the *.zip and *.7z distributions; it + depends on configure, which is not included in those archives. + Changed "a+w" to "u+w" in Makefile.in to fix CVE-2012-3386. + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) +or to glennrp at users.sourceforge.net + +Glenn R-P +#endif diff --git a/3rdparty/libpng/CMakeLists.txt b/3rdparty/libpng/CMakeLists.txt index 41d57f325..73ce1d82f 100644 --- a/3rdparty/libpng/CMakeLists.txt +++ b/3rdparty/libpng/CMakeLists.txt @@ -13,6 +13,12 @@ file(GLOB lib_hdrs *.h) # Define the library target: # ---------------------------------------------------------------------------------- +add_definitions(-DPNG_CONFIGURE_LIBPNG) + +if(MSVC) + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) +endif(MSVC) + add_library(${PNG_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs}) if(UNIX) diff --git a/3rdparty/libpng/LICENSE b/3rdparty/libpng/LICENSE new file mode 100644 index 000000000..3a67d5458 --- /dev/null +++ b/3rdparty/libpng/LICENSE @@ -0,0 +1,111 @@ + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.5.12, July 11, 2012, are +Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +July 11, 2012 diff --git a/3rdparty/libpng/README b/3rdparty/libpng/README index ac682fecc..3f5b0d6b6 100644 --- a/3rdparty/libpng/README +++ b/3rdparty/libpng/README @@ -1,4 +1,4 @@ -README for libpng version 1.5.9 - February 18, 2012 (shared library 15.0) +README for libpng version 1.5.12 - July 11, 2012 (shared library 15.0) See the note about version numbers near the top of png.h See INSTALL for instructions on how to install libpng. diff --git a/3rdparty/libpng/arm/filter_neon.S b/3rdparty/libpng/arm/filter_neon.S new file mode 100644 index 000000000..63a5d8c17 --- /dev/null +++ b/3rdparty/libpng/arm/filter_neon.S @@ -0,0 +1,225 @@ + +/* filter_neon.S - NEON optimised filter functions + * + * Copyright (c) 2011 Glenn Randers-Pehrson + * Written by Mans Rullgard, 2011. + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */ +#endif + +#ifdef __ELF__ +# define ELF +#else +# define ELF @ +#endif + + .arch armv7-a + .fpu neon + +.macro func name, export=0 + .macro endfunc +ELF .size \name, . - \name + .endfunc + .purgem endfunc + .endm + .text + .if \export + .global \name + .endif +ELF .type \name, STT_FUNC + .func \name +\name: +.endm + +func png_read_filter_row_sub4_neon, export=1 + ldr r3, [r0, #4] @ rowbytes + vmov.i8 d3, #0 +1: + vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128] + vadd.u8 d0, d3, d4 + vadd.u8 d1, d0, d5 + vadd.u8 d2, d1, d6 + vadd.u8 d3, d2, d7 + vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]! + subs r3, r3, #16 + bgt 1b + + bx lr +endfunc + +func png_read_filter_row_sub3_neon, export=1 + ldr r3, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + mov r0, r1 + mov r2, #3 + mov r12, #12 + vld1.8 {q11}, [r0], r12 +1: + vext.8 d5, d22, d23, #3 + vadd.u8 d0, d3, d22 + vext.8 d6, d22, d23, #6 + vadd.u8 d1, d0, d5 + vext.8 d7, d23, d23, #1 + vld1.8 {q11}, [r0], r12 + vst1.32 {d0[0]}, [r1,:32], r2 + vadd.u8 d2, d1, d6 + vst1.32 {d1[0]}, [r1], r2 + vadd.u8 d3, d2, d7 + vst1.32 {d2[0]}, [r1], r2 + vst1.32 {d3[0]}, [r1], r2 + subs r3, r3, #12 + bgt 1b + + bx lr +endfunc + +func png_read_filter_row_up_neon, export=1 + ldr r3, [r0, #4] @ rowbytes +1: + vld1.8 {q0}, [r1,:128] + vld1.8 {q1}, [r2,:128]! + vadd.u8 q0, q0, q1 + vst1.8 {q0}, [r1,:128]! + subs r3, r3, #16 + bgt 1b + + bx lr +endfunc + +func png_read_filter_row_avg4_neon, export=1 + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 +1: + vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128] + vld4.32 {d16[],d17[],d18[],d19[]},[r2,:128]! + vhadd.u8 d0, d3, d16 + vadd.u8 d0, d0, d4 + vhadd.u8 d1, d0, d17 + vadd.u8 d1, d1, d5 + vhadd.u8 d2, d1, d18 + vadd.u8 d2, d2, d6 + vhadd.u8 d3, d2, d19 + vadd.u8 d3, d3, d7 + vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]! + subs r12, r12, #16 + bgt 1b + + bx lr +endfunc + +func png_read_filter_row_avg3_neon, export=1 + push {r4,lr} + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + mov r0, r1 + mov r4, #3 + mov lr, #12 + vld1.8 {q11}, [r0], lr +1: + vld1.8 {q10}, [r2], lr + vext.8 d5, d22, d23, #3 + vhadd.u8 d0, d3, d20 + vext.8 d17, d20, d21, #3 + vadd.u8 d0, d0, d22 + vext.8 d6, d22, d23, #6 + vhadd.u8 d1, d0, d17 + vext.8 d18, d20, d21, #6 + vadd.u8 d1, d1, d5 + vext.8 d7, d23, d23, #1 + vld1.8 {q11}, [r0], lr + vst1.32 {d0[0]}, [r1,:32], r4 + vhadd.u8 d2, d1, d18 + vst1.32 {d1[0]}, [r1], r4 + vext.8 d19, d21, d21, #1 + vadd.u8 d2, d2, d6 + vhadd.u8 d3, d2, d19 + vst1.32 {d2[0]}, [r1], r4 + vadd.u8 d3, d3, d7 + vst1.32 {d3[0]}, [r1], r4 + subs r12, r12, #12 + bgt 1b + + pop {r4,pc} +endfunc + +.macro paeth rx, ra, rb, rc + vaddl.u8 q12, \ra, \rb @ a + b + vaddl.u8 q15, \rc, \rc @ 2*c + vabdl.u8 q13, \rb, \rc @ pa + vabdl.u8 q14, \ra, \rc @ pb + vabd.u16 q15, q12, q15 @ pc + vcle.u16 q12, q13, q14 @ pa <= pb + vcle.u16 q13, q13, q15 @ pa <= pc + vcle.u16 q14, q14, q15 @ pb <= pc + vand q12, q12, q13 @ pa <= pb && pa <= pc + vmovn.u16 d28, q14 + vmovn.u16 \rx, q12 + vbsl d28, \rb, \rc + vbsl \rx, \ra, d28 +.endm + +func png_read_filter_row_paeth4_neon, export=1 + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + vmov.i8 d20, #0 +1: + vld4.32 {d4[],d5[],d6[],d7[]}, [r1,:128] + vld4.32 {d16[],d17[],d18[],d19[]},[r2,:128]! + paeth d0, d3, d16, d20 + vadd.u8 d0, d0, d4 + paeth d1, d0, d17, d16 + vadd.u8 d1, d1, d5 + paeth d2, d1, d18, d17 + vadd.u8 d2, d2, d6 + paeth d3, d2, d19, d18 + vmov d20, d19 + vadd.u8 d3, d3, d7 + vst4.32 {d0[0],d1[0],d2[0],d3[0]},[r1,:128]! + subs r12, r12, #16 + bgt 1b + + bx lr +endfunc + +func png_read_filter_row_paeth3_neon, export=1 + push {r4,lr} + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + vmov.i8 d4, #0 + mov r0, r1 + mov r4, #3 + mov lr, #12 + vld1.8 {q11}, [r0], lr +1: + vld1.8 {q10}, [r2], lr + paeth d0, d3, d20, d4 + vext.8 d5, d22, d23, #3 + vadd.u8 d0, d0, d22 + vext.8 d17, d20, d21, #3 + paeth d1, d0, d17, d20 + vst1.32 {d0[0]}, [r1,:32], r4 + vext.8 d6, d22, d23, #6 + vadd.u8 d1, d1, d5 + vext.8 d18, d20, d21, #6 + paeth d2, d1, d18, d17 + vext.8 d7, d23, d23, #1 + vld1.8 {q11}, [r0], lr + vst1.32 {d1[0]}, [r1], r4 + vadd.u8 d2, d2, d6 + vext.8 d19, d21, d21, #1 + paeth d3, d2, d19, d18 + vst1.32 {d2[0]}, [r1], r4 + vmov d4, d19 + vadd.u8 d3, d3, d7 + vst1.32 {d3[0]}, [r1], r4 + subs r12, r12, #12 + bgt 1b + + pop {r4,pc} +endfunc diff --git a/3rdparty/libpng/png.c b/3rdparty/libpng/png.c index ca1de4866..6808c5cb9 100644 --- a/3rdparty/libpng/png.c +++ b/3rdparty/libpng/png.c @@ -1,8 +1,8 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_5_9 Your_png_h_is_not_version_1_5_9; +typedef png_libpng_version_1_5_12 Your_png_h_is_not_version_1_5_12; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -655,14 +655,14 @@ png_get_copyright(png_const_structp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.5.9 - February 18, 2012" PNG_STRING_NEWLINE \ - "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ + "libpng version 1.5.12 - July 11, 2012" PNG_STRING_NEWLINE \ + "Copyright (c) 1998-2012 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ PNG_STRING_NEWLINE; # else - return "libpng version 1.5.9 - February 18, 2012\ - Copyright (c) 1998-2011 Glenn Randers-Pehrson\ + return "libpng version 1.5.12 - July 11, 2012\ + Copyright (c) 1998-2012 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; # endif @@ -969,8 +969,8 @@ int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy) * and it is certain that it becomes unstable where the end points are close * together. * - * So this code uses the perhaps slighly less optimal but more understandable - * and totally obvious approach of calculating color-scale. + * So this code uses the perhaps slightly less optimal but more + * understandable and totally obvious approach of calculating color-scale. * * This algorithm depends on the precision in white-scale and that is * (1/white-y), so we can immediately see that as white-y approaches 0 the @@ -1467,7 +1467,7 @@ static double png_pow10(int power) { int recip = 0; - double d = 1; + double d = 1.0; /* Handle negative exponent with a reciprocal at the end because * 10 is exact whereas .1 is inexact in base 2 @@ -1481,7 +1481,7 @@ png_pow10(int power) if (power > 0) { /* Decompose power bitwise. */ - double mult = 10; + double mult = 10.0; do { if (power & 1) d *= mult; @@ -1600,7 +1600,8 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, { double d; - fp *= 10; + fp *= 10.0; + /* Use modf here, not floor and subtract, so that * the separation is done in one step. At the end * of the loop don't break the number into parts so @@ -1613,7 +1614,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, { d = floor(fp + .5); - if (d > 9) + if (d > 9.0) { /* Rounding up to 10, handle that here. */ if (czero > 0) @@ -1621,9 +1622,10 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, --czero, d = 1; if (cdigits == 0) --clead; } + else { - while (cdigits > 0 && d > 9) + while (cdigits > 0 && d > 9.0) { int ch = *--ascii; @@ -1648,7 +1650,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, * exponent but take into account the leading * decimal point. */ - if (d > 9) /* cdigits == 0 */ + if (d > 9.0) /* cdigits == 0 */ { if (exp_b10 == (-1)) { @@ -1669,18 +1671,19 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, ++exp_b10; /* In all cases we output a '1' */ - d = 1; + d = 1.0; } } } fp = 0; /* Guarantees termination below. */ } - if (d == 0) + if (d == 0.0) { ++czero; if (cdigits == 0) ++clead; } + else { /* Included embedded zeros in the digit count. */ @@ -1708,6 +1711,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size, above */ --exp_b10; } + *ascii++ = (char)(48 + (int)d), ++cdigits; } } @@ -2040,7 +2044,7 @@ png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times, } #endif -#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gammma */ +#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gamma */ /* Calculate a reciprocal, return 0 on div-by-zero or overflow. */ png_fixed_point png_reciprocal(png_fixed_point a) diff --git a/3rdparty/libpng/png.h b/3rdparty/libpng/png.h index 5617c9720..4c37e58a4 100644 --- a/3rdparty/libpng/png.h +++ b/3rdparty/libpng/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.5.9 - February 18, 2012 + * libpng version 1.5.12 - July 11, 2012 * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -11,7 +11,7 @@ * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.5.9 - February 18, 2012: Glenn + * libpng versions 0.97, January 1998, through 1.5.12 - July 11, 2012: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: @@ -172,6 +172,12 @@ * 1.5.9beta01-02 15 10509 15.so.15.9[.0] * 1.5.9rc01 15 10509 15.so.15.9[.0] * 1.5.9 15 10509 15.so.15.9[.0] + * 1.5.10beta01-05 15 10510 15.so.15.10[.0] + * 1.5.10 15 10510 15.so.15.10[.0] + * 1.5.11beta01 15 10511 15.so.15.11[.0] + * 1.5.11rc01-05 15 10511 15.so.15.11[.0] + * 1.5.11 15 10511 15.so.15.11[.0] + * 1.5.12 15 10512 15.so.15.12[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be @@ -181,7 +187,7 @@ * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcN". + * release number plus "betaNN" or "rcNN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled @@ -203,7 +209,7 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.5.9, February 18, 2012, are + * libpng versions 1.2.6, August 15, 2004, through 1.5.12, July 11, 2012, are * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are * distributed according to the same disclaimer and license as libpng-1.2.5 * with the following individual added to the list of Contributing Authors: @@ -315,13 +321,13 @@ * Y2K compliance in libpng: * ========================= * - * February 18, 2012 + * July 11, 2012 * * Since the PNG Development group is an ad-hoc body, we can't make * an official declaration. * * This is your unofficial assurance that libpng from version 0.71 and - * upward through 1.5.9 are Y2K compliant. It is my belief that + * upward through 1.5.12 are Y2K compliant. It is my belief that * earlier versions were also Y2K compliant. * * Libpng only has two year fields. One is a 2-byte unsigned integer @@ -332,7 +338,8 @@ * "png_uint_16 year" in png_time_struct. * * The string is - * "png_char time_buffer" in png_struct + * "char time_buffer[29]" in png_struct. This will be no + * longer used in libpng-1.6.0 and will be removed from libpng-1.7.0. * * There are seven time-related functions: * png.c: png_convert_to_rfc_1123() in png.c @@ -379,9 +386,9 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.5.9" +#define PNG_LIBPNG_VER_STRING "1.5.12" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.5.9 - February 18, 2012\n" + " libpng version 1.5.12 - July 11, 2012\n" #define PNG_LIBPNG_VER_SONUM 15 #define PNG_LIBPNG_VER_DLLNUM 15 @@ -389,7 +396,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 5 -#define PNG_LIBPNG_VER_RELEASE 9 +#define PNG_LIBPNG_VER_RELEASE 12 /* This should match the numeric part of the final component of * PNG_LIBPNG_VER_STRING, omitting any leading zero: @@ -412,7 +419,7 @@ #define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with PNG_LIBPNG_BUILD_PRIVATE */ -#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_BETA +#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE /* Careful here. At one time, Guy wanted to use 082, but that would be octal. * We must not include leading zeros. @@ -420,7 +427,7 @@ * version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10509 /* 1.5.9 */ +#define PNG_LIBPNG_VER 10512 /* 1.5.12 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -542,7 +549,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_5_9; +typedef char* png_libpng_version_1_5_12; /* Three color definitions. The order of the red, green, and blue, (and the * exact size) is not important, although the size of the fields need to @@ -2637,6 +2644,12 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); : (png_int_32)png_get_uint_32(buf))) #endif +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr, + int allowed)); +#endif + /* Maintainer: Put new public prototypes here ^, in libpng.3, and project * defs */ @@ -2646,7 +2659,7 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); * scripts/symbols.def as well. */ #ifdef PNG_EXPORT_LAST_ORDINAL - PNG_EXPORT_LAST_ORDINAL(233); + PNG_EXPORT_LAST_ORDINAL(234); #endif #ifdef __cplusplus diff --git a/3rdparty/libpng/pngconf.h b/3rdparty/libpng/pngconf.h index 1aa268bee..5c3eb1454 100644 --- a/3rdparty/libpng/pngconf.h +++ b/3rdparty/libpng/pngconf.h @@ -1,7 +1,7 @@ /* pngconf.h - machine configurable file for libpng * - * libpng version 1.5.9 - February 18, 2012 + * libpng version 1.5.12 - July 11, 2012 * * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) @@ -25,7 +25,7 @@ #ifndef PNG_BUILDING_SYMBOL_TABLE /* PNG_NO_LIMITS_H may be used to turn off the use of the standard C * definition file for machine specific limits, this may impact the - * correctness of the definitons below (see uses of INT_MAX). + * correctness of the definitions below (see uses of INT_MAX). */ # ifndef PNG_NO_LIMITS_H # include @@ -51,8 +51,8 @@ /* This controls optimization of the reading of 16 and 32 bit values * from PNG files. It can be set on a per-app-file basis - it - * just changes whether a macro is used to the function is called. - * The library builder sets the default, if read functions are not + * just changes whether a macro is used when the function is called. + * The library builder sets the default; if read functions are not * built into the library the macro implementation is forced on. */ #ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED diff --git a/3rdparty/libpng/pngerror.c b/3rdparty/libpng/pngerror.c index 95002f84f..e0585a856 100644 --- a/3rdparty/libpng/pngerror.c +++ b/3rdparty/libpng/pngerror.c @@ -2,7 +2,7 @@ /* pngerror.c - stub functions for i/o and memory allocation * * Last changed in libpng 1.5.8 [February 1, 2011] - * Copyright (c) 1998-2012 Glenn Randers-Pehrson + * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * diff --git a/3rdparty/libpng/pnglibconf.h b/3rdparty/libpng/pnglibconf.h index 49fcc8cb4..d93adabaa 100755 --- a/3rdparty/libpng/pnglibconf.h +++ b/3rdparty/libpng/pnglibconf.h @@ -3,9 +3,9 @@ /* pnglibconf.h - library build configuration */ -/* Libpng 1.5.9 - February 18, 2012 */ +/* Libpng 1.5.12 - July 11, 2012 */ -/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */ +/* Copyright (c) 1998-2012 Glenn Randers-Pehrson */ /* This code is released under the libpng license. */ /* For conditions of distribution and use, see the disclaimer */ @@ -31,10 +31,6 @@ #define PNG_QUANTIZE_GREEN_BITS 5 #define PNG_QUANTIZE_RED_BITS 5 #define PNG_sCAL_PRECISION 5 -#define PNG_USER_CHUNK_CACHE_MAX 0 -#define PNG_USER_CHUNK_MALLOC_MAX 0 -#define PNG_USER_HEIGHT_MAX 1000000 -#define PNG_USER_WIDTH_MAX 1000000 #define PNG_WEIGHT_SHIFT 8 #define PNG_ZBUF_SIZE 8192 /* end of settings */ @@ -45,6 +41,7 @@ #define PNG_bKGD_SUPPORTED #define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED #define PNG_CHECK_cHRM_SUPPORTED +#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED #define PNG_cHRM_SUPPORTED #define PNG_CONSOLE_IO_SUPPORTED #define PNG_CONVERT_tIME_SUPPORTED @@ -74,6 +71,7 @@ #define PNG_READ_BACKGROUND_SUPPORTED #define PNG_READ_BGR_SUPPORTED #define PNG_READ_bKGD_SUPPORTED +#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED #define PNG_READ_cHRM_SUPPORTED #define PNG_READ_COMPOSITE_NODIV_SUPPORTED #define PNG_READ_COMPRESSED_TEXT_SUPPORTED @@ -145,6 +143,7 @@ #define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #define PNG_WRITE_BGR_SUPPORTED #define PNG_WRITE_bKGD_SUPPORTED +#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED #define PNG_WRITE_cHRM_SUPPORTED #define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED #define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED diff --git a/3rdparty/libpng/pngpread.c b/3rdparty/libpng/pngpread.c index 95a2082e4..6b65ba8f4 100644 --- a/3rdparty/libpng/pngpread.c +++ b/3rdparty/libpng/pngpread.c @@ -1,8 +1,8 @@ /* pngpread.c - read a png file in push mode * - * Last changed in libpng 1.5.9 [February 18, 2012] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -128,30 +128,6 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr) break; } -#ifdef PNG_READ_tEXt_SUPPORTED - case PNG_READ_tEXt_MODE: - { - png_push_read_tEXt(png_ptr, info_ptr); - break; - } - -#endif -#ifdef PNG_READ_zTXt_SUPPORTED - case PNG_READ_zTXt_MODE: - { - png_push_read_zTXt(png_ptr, info_ptr); - break; - } - -#endif -#ifdef PNG_READ_iTXt_SUPPORTED - case PNG_READ_iTXt_MODE: - { - png_push_read_iTXt(png_ptr, info_ptr); - break; - } - -#endif case PNG_SKIP_MODE: { png_push_crc_finish(png_ptr); @@ -176,7 +152,7 @@ void /* PRIVATE */ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) { png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; + num_to_check = 8 - num_checked; if (png_ptr->buffer_size < num_to_check) { @@ -196,6 +172,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) else png_error(png_ptr, "PNG file corrupted by ASCII conversion"); } + else { if (png_ptr->sig_bytes >= 8) @@ -305,8 +282,8 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) png_error(png_ptr, "Missing PLTE before IDAT"); } } - #endif + else if (chunk_name == png_PLTE) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) @@ -543,7 +520,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -556,7 +533,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif @@ -569,10 +546,11 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) return; } - png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); + png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif + else { if (png_ptr->push_length + 4 > png_ptr->buffer_size) @@ -580,7 +558,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) png_push_save_buffer(png_ptr); return; } - png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); + png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); } png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; @@ -620,6 +598,7 @@ png_push_crc_finish(png_structp png_ptr) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } + if (png_ptr->skip_length && png_ptr->current_buffer_size) { png_size_t save_size = png_ptr->current_buffer_size; @@ -641,6 +620,7 @@ png_push_crc_finish(png_structp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } + if (!png_ptr->skip_length) { if (png_ptr->buffer_size < 4) @@ -663,6 +643,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) return; ptr = buffer; + if (png_ptr->save_buffer_size) { png_size_t save_size; @@ -680,6 +661,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } + if (length && png_ptr->current_buffer_size) { png_size_t save_size; @@ -709,6 +691,7 @@ png_push_save_buffer(png_structp png_ptr) png_bytep dp; istop = png_ptr->save_buffer_size; + for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; i < istop; i++, sp++, dp++) { @@ -716,6 +699,7 @@ png_push_save_buffer(png_structp png_ptr) } } } + if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > png_ptr->save_buffer_max) { @@ -742,6 +726,7 @@ png_push_save_buffer(png_structp png_ptr) png_free(png_ptr, old_buffer); png_ptr->save_buffer_max = new_max; } + if (png_ptr->current_buffer_size) { png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, @@ -749,6 +734,7 @@ png_push_save_buffer(png_structp png_ptr) png_ptr->save_buffer_size += png_ptr->current_buffer_size; png_ptr->current_buffer_size = 0; } + png_ptr->save_buffer_ptr = png_ptr->save_buffer; png_ptr->buffer_size = 0; } @@ -850,6 +836,7 @@ png_push_read_IDAT(png_structp png_ptr) png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } + if (!png_ptr->idat_size) { if (png_ptr->buffer_size < 4) @@ -1263,521 +1250,6 @@ png_read_push_finish_row(png_structp png_ptr) #endif /* PNG_READ_INTERLACING_SUPPORTED */ } -#ifdef PNG_READ_tEXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place tEXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "tEXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_tEXt_MODE; -} - -void /* PRIVATE */ -png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#ifdef PNG_MAX_MALLOC_64K - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* Empty loop */ ; - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; - text_ptr->key = key; - text_ptr->itxt_length = 0; - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - png_ptr->current_text = NULL; - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); - } -} -#endif - -#ifdef PNG_READ_zTXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place zTXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - /* We can't handle zTXt chunks > 64K, since we don't have enough space - * to be able to store the uncompressed data. Actually, the threshold - * is probably around 32K, but it isn't as definite as 64K is. - */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "zTXt chunk too large to fit in memory"); - png_push_crc_skip(png_ptr, length); - return; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_zTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - png_size_t text_size, key_size; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* Empty loop */ ; - - /* zTXt can't have zero text */ - if (text >= key + png_ptr->current_text_size) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - png_ptr->zstream.next_in = (png_bytep)text; - png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - - (text - key)); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - key_size = text - key; - text_size = 0; - text = NULL; - ret = Z_STREAM_END; - - while (png_ptr->zstream.avail_in) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK && ret != Z_STREAM_END) - { - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) - { - if (text == NULL) - { - text = (png_charp)png_malloc(png_ptr, - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + key_size + 1)); - - png_memcpy(text + key_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - png_memcpy(text, key, key_size); - - text_size = key_size + png_ptr->zbuf_size - - png_ptr->zstream.avail_out; - - *(text + text_size) = '\0'; - } - - else - { - png_charp tmp; - - tmp = text; - text = (png_charp)png_malloc(png_ptr, text_size + - (png_ptr->zbuf_size - - png_ptr->zstream.avail_out + 1)); - - png_memcpy(text, tmp, text_size); - png_free(png_ptr, tmp); - - png_memcpy(text + text_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; - *(text + text_size) = '\0'; - } - - if (ret != Z_STREAM_END) - { - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - else - { - break; - } - - if (ret == Z_STREAM_END) - break; - } - - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - if (ret != Z_STREAM_END) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - png_ptr->current_text = NULL; - png_free(png_ptr, key); - key = text; - text += key_size; - - text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; - text_ptr->key = key; - text_ptr->itxt_length = 0; - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk"); - } -} -#endif - -#ifdef PNG_READ_iTXt_SUPPORTED -void /* PRIVATE */ -png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - png_error(png_ptr, "Out of place iTXt"); - /* NOT REACHED */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "iTXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, length + 1); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_iTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) -{ - - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - - else - text_size = png_ptr->current_text_left; - - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp key; - int comp_flag; - png_charp lang; - png_charp lang_key; - png_charp text; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#ifdef PNG_MAX_MALLOC_64K - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (lang = key; *lang; lang++) - /* Empty loop */ ; - - if (lang < key + png_ptr->current_text_size - 3) - lang++; - - comp_flag = *lang++; - lang++; /* Skip comp_type, always zero */ - - for (lang_key = lang; *lang_key; lang_key++) - /* Empty loop */ ; - - lang_key++; /* Skip NUL separator */ - - text=lang_key; - - if (lang_key < key + png_ptr->current_text_size - 1) - { - for (; *text; text++) - /* Empty loop */ ; - } - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, - png_sizeof(png_text)); - - text_ptr->compression = comp_flag + 2; - text_ptr->key = key; - text_ptr->lang = lang; - text_ptr->lang_key = lang_key; - text_ptr->text = text; - text_ptr->text_length = 0; - text_ptr->itxt_length = png_strlen(text); - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_ptr->current_text = NULL; - - png_free(png_ptr, text_ptr); - if (ret) - png_warning(png_ptr, "Insufficient memory to store iTXt chunk"); - } -} -#endif - -/* This function is called when we haven't found a handler for this - * chunk. If there isn't a problem with the chunk itself (ie a bad chunk - * name or a critical chunk), the chunk is (currently) silently ignored. - */ -void /* PRIVATE */ -png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - png_uint_32 skip = 0; - png_uint_32 chunk_name = png_ptr->chunk_name; - - if (PNG_CHUNK_CRITICAL(chunk_name)) - { -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - if (png_chunk_unknown_handling(png_ptr, chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED - && png_ptr->read_user_chunk_fn == NULL -#endif - ) -#endif - png_chunk_error(png_ptr, "unknown critical chunk"); - - PNG_UNUSED(info_ptr) /* To quiet some compiler warnings */ - } - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - /* TODO: the code below is apparently just using the - * png_struct::unknown_chunk member as a temporarily variable, it should be - * possible to eliminate both it and the temporary buffer. - */ - if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) - { -#ifdef PNG_MAX_MALLOC_64K - if (length > 65535) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - 65535; - length = 65535; - } -#endif - /* This is just a record for the user; libpng doesn't use the character - * form of the name. - */ - PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name); - - png_ptr->unknown_chunk.size = length; - - if (length == 0) - png_ptr->unknown_chunk.data = NULL; - - else - { - png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, - png_ptr->unknown_chunk.size); - png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, - png_ptr->unknown_chunk.size); - } - -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED - if (png_ptr->read_user_chunk_fn != NULL) - { - /* Callback to user unknown chunk handler */ - int ret; - ret = (*(png_ptr->read_user_chunk_fn)) - (png_ptr, &png_ptr->unknown_chunk); - - if (ret < 0) - png_chunk_error(png_ptr, "error in user chunk"); - - if (ret == 0) - { - if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name)) - if (png_chunk_unknown_handling(png_ptr, chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) - png_chunk_error(png_ptr, "unknown critical chunk"); - png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); - } - } - - else -#endif - png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } - - else -#endif - skip=length; - png_push_crc_skip(png_ptr, skip); -} - void /* PRIVATE */ png_push_have_info(png_structp png_ptr, png_infop info_ptr) { diff --git a/3rdparty/libpng/pngpriv.h b/3rdparty/libpng/pngpriv.h index 67e486c57..9b69f8c14 100644 --- a/3rdparty/libpng/pngpriv.h +++ b/3rdparty/libpng/pngpriv.h @@ -2,11 +2,11 @@ /* pngpriv.h - private declarations for use inside libpng * * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * - * Last changed in libpng 1.5.7 [December 15, 2011] + * Last changed in libpng 1.5.10 [March 29, 2012] * * This code is released under the libpng license. * For conditions of distribution and use, see the disclaimer @@ -133,6 +133,46 @@ # define PNG_DLL_EXPORT #endif +/* SECURITY and SAFETY: + * + * By default libpng is built without any internal limits on image size, + * individual heap (png_malloc) allocations or the total amount of memory used. + * If PNG_SAFE_LIMITS_SUPPORTED is defined, however, the limits below are used + * (unless individually overridden). These limits are believed to be fairly + * safe, but builders of secure systems should verify the values against the + * real system capabilities. + */ + +#ifdef PNG_SAFE_LIMITS_SUPPORTED + /* 'safe' limits */ +# ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000 +# endif +# ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000 +# endif +# ifndef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 128 +# endif +# ifndef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 8000000 +# endif +#else + /* values for no limits */ +# ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 0x7fffffff +# endif +# ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 0x7fffffff +# endif +# ifndef PNG_USER_CHUNK_CACHE_MAX +# define PNG_USER_CHUNK_CACHE_MAX 0 +# endif +# ifndef PNG_USER_CHUNK_MALLOC_MAX +# define PNG_USER_CHUNK_MALLOC_MAX 0 +# endif +#endif + /* This is used for 16 bit gamma tables - only the top level pointers are const, * this could be changed: */ @@ -426,6 +466,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp; #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ +#define PNG_HAVE_iCCP 0x4000 /* Flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001 @@ -1218,10 +1259,8 @@ PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); -#endif PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_uint_32 chunk_name)); @@ -1355,6 +1394,13 @@ PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr, int color_type, int interlace_type, int compression_type, int filter_type)); +/* Added at libpng version 1.5.10 */ +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +PNG_EXTERN void png_do_check_palette_indexes PNGARG((png_structp png_ptr, + png_row_infop row_info)); +#endif + /* Free all memory used by the read (old method - NOT DLL EXPORTED) */ PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); diff --git a/3rdparty/libpng/pngread.c b/3rdparty/libpng/pngread.c index 0643754da..1d8c6b334 100644 --- a/3rdparty/libpng/pngread.c +++ b/3rdparty/libpng/pngread.c @@ -1,8 +1,8 @@ /* pngread.c - read a PNG file * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -67,15 +67,11 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, png_ptr->user_width_max = PNG_USER_WIDTH_MAX; png_ptr->user_height_max = PNG_USER_HEIGHT_MAX; -# ifdef PNG_USER_CHUNK_CACHE_MAX /* Added at libpng-1.2.43 and 1.4.0 */ png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX; -# endif -# ifdef PNG_SET_USER_CHUNK_MALLOC_MAX /* Added at libpng-1.2.43 and 1.4.1 */ png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX; -# endif #endif #ifdef PNG_SETJMP_SUPPORTED @@ -805,6 +801,13 @@ png_read_end(png_structp png_ptr, png_infop info_ptr) png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Report invalid palette index; added at libng-1.5.10 */ + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + png_ptr->num_palette_max > png_ptr->num_palette) + png_benign_error(png_ptr, "Read palette index exceeding num_palette"); +#endif + do { png_uint_32 length = png_read_chunk_header(png_ptr); @@ -1070,12 +1073,6 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_free(png_ptr, png_ptr->save_buffer); #endif -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -#ifdef PNG_TEXT_SUPPORTED - png_free(png_ptr, png_ptr->current_text); -#endif /* PNG_TEXT_SUPPORTED */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - /* Save the important info out of the png_struct, in case it is * being used again. */ diff --git a/3rdparty/libpng/pngrtran.c b/3rdparty/libpng/pngrtran.c index 1079595f0..96732b55c 100644 --- a/3rdparty/libpng/pngrtran.c +++ b/3rdparty/libpng/pngrtran.c @@ -1,8 +1,8 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -1770,8 +1770,8 @@ png_init_read_transformations(png_structp png_ptr) int num_palette = png_ptr->num_palette; int i; - /*NOTE: there are other transformations that should probably be in here - * too. + /* NOTE: there are other transformations that should probably be in + * here too. */ for (i = 0; i < num_palette; i++) { @@ -1830,12 +1830,15 @@ png_init_read_transformations(png_structp png_ptr) #ifdef PNG_READ_SHIFT_SUPPORTED if ((png_ptr->transformations & PNG_SHIFT) && + !(png_ptr->transformations & PNG_EXPAND) && (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) { int i; int istop = png_ptr->num_palette; int shift = 8 - png_ptr->sig_bit.red; + png_ptr->transformations &= ~PNG_SHIFT; + /* significant bits can be in the range 1 to 7 for a meaninful result, if * the number of significant bits is 0 then no shift is done (this is an * error condition which is silently ignored.) @@ -2274,7 +2277,7 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) #endif #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - /*NOTE: moved here in 1.5.4 (from much later in this list.) */ + /* NOTE: moved here in 1.5.4 (from much later in this list.) */ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1); @@ -2296,6 +2299,13 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info) png_do_unpack(row_info, png_ptr->row_buf + 1); #endif +#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Added at libpng-1.5.10 */ + if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && + png_ptr->num_palette_max >= 0) + png_do_check_palette_indexes(png_ptr, row_info); +#endif + #ifdef PNG_READ_BGR_SUPPORTED if (png_ptr->transformations & PNG_BGR) png_do_bgr(row_info, png_ptr->row_buf + 1); @@ -3293,7 +3303,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) if (red != green || red != blue) { rgb_error |= 1; - /*NOTE: this is the historical approach which simply + /* NOTE: this is the historical approach which simply * truncates the results. */ *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); diff --git a/3rdparty/libpng/pngrutil.c b/3rdparty/libpng/pngrutil.c index d6c0e0350..aa592ccfb 100644 --- a/3rdparty/libpng/pngrutil.c +++ b/3rdparty/libpng/pngrutil.c @@ -1,7 +1,7 @@ /* pngrutil.c - utilities to read a PNG file * - * Last changed in libpng 1.5.9 [February 18, 2012] + * Last changed in libpng 1.5.10 [March 8, 2012] * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -434,14 +434,12 @@ png_decompress_chunk(png_structp png_ptr, int comp_type, */ if (prefix_size >= (~(png_size_t)0) - 1 || expanded_size >= (~(png_size_t)0) - 1 - prefix_size -#ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED +#ifdef PNG_USER_LIMITS_SUPPORTED || (png_ptr->user_chunk_malloc_max && (prefix_size + expanded_size >= png_ptr->user_chunk_malloc_max - 1)) #else -# ifdef PNG_USER_CHUNK_MALLOC_MAX || ((PNG_USER_CHUNK_MALLOC_MAX > 0) && prefix_size + expanded_size >= PNG_USER_CHUNK_MALLOC_MAX - 1) -# endif #endif ) png_warning(png_ptr, "Exceeded size limit while expanding chunk"); @@ -1259,13 +1257,16 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place iCCP chunk"); - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) + if ((png_ptr->mode & PNG_HAVE_iCCP) || (info_ptr != NULL && + (info_ptr->valid & (PNG_INFO_iCCP|PNG_INFO_sRGB)))) { png_warning(png_ptr, "Duplicate iCCP chunk"); png_crc_finish(png_ptr, length); return; } + png_ptr->mode |= PNG_HAVE_iCCP; + #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { @@ -1795,16 +1796,16 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) return; } - num = length / 2 ; - - if (num != (unsigned int)png_ptr->num_palette || num > - (unsigned int)PNG_MAX_PALETTE_LENGTH) + if (length > 2*PNG_MAX_PALETTE_LENGTH || + length != (unsigned int) (2*png_ptr->num_palette)) { png_warning(png_ptr, "Incorrect hIST chunk length"); png_crc_finish(png_ptr, length); return; } + num = length / 2 ; + for (i = 0; i < num; i++) { png_byte buf[2]; diff --git a/3rdparty/libpng/pngset.c b/3rdparty/libpng/pngset.c index 92db3890a..8c07eec3e 100644 --- a/3rdparty/libpng/pngset.c +++ b/3rdparty/libpng/pngset.c @@ -1,8 +1,8 @@ /* pngset.c - storage of image information into info struct * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -149,7 +149,7 @@ png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point * possible for 1/gamma to overflow the limit of 21474 and this means the * gamma value must be at least 5/100000 and hence at most 20000.0. For * safety the limits here are a little narrower. The values are 0.00016 to - * 6250.0, which are truly ridiculous gammma values (and will produce + * 6250.0, which are truly ridiculous gamma values (and will produce * displays that are all black or all white.) */ if (file_gamma < 16 || file_gamma > 625000000) @@ -692,24 +692,28 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, */ if (info_ptr->num_text + num_text > info_ptr->max_text) { + int old_max_text = info_ptr->max_text; + int old_num_text = info_ptr->num_text; + if (info_ptr->text != NULL) { png_textp old_text; - int old_max; - old_max = info_ptr->max_text; info_ptr->max_text = info_ptr->num_text + num_text + 8; old_text = info_ptr->text; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); if (info_ptr->text == NULL) { - png_free(png_ptr, old_text); + /* Restore to previous condition */ + info_ptr->max_text = old_max_text; + info_ptr->text = old_text; return(1); } - png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * + png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max_text * png_sizeof(png_text))); png_free(png_ptr, old_text); } @@ -721,7 +725,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); if (info_ptr->text == NULL) + { + /* Restore to previous condition */ + info_ptr->num_text = old_num_text; + info_ptr->max_text = old_max_text; return(1); + } info_ptr->free_me |= PNG_FREE_TEXT; } @@ -1281,4 +1290,22 @@ png_set_benign_errors(png_structp png_ptr, int allowed) png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN; } #endif /* PNG_BENIGN_ERRORS_SUPPORTED */ + +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED +/* Whether to report invalid palette index; added at libng-1.5.10 + * allowed - one of 0: disable; 1: enable + */ +void PNGAPI +png_set_check_for_invalid_index(png_structp png_ptr, int allowed) +{ + png_debug(1, "in png_set_check_for_invalid_index"); + + if (allowed) + png_ptr->num_palette_max = 0; + + else + png_ptr->num_palette_max = -1; +} +#endif + #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/3rdparty/libpng/pngstruct.h b/3rdparty/libpng/pngstruct.h index 860b8bff8..db0d4e494 100755 --- a/3rdparty/libpng/pngstruct.h +++ b/3rdparty/libpng/pngstruct.h @@ -1,7 +1,7 @@ /* pngstruct.h - header file for PNG reference library * - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -121,6 +121,12 @@ struct png_struct_def png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ + +/* Added at libpng-1.5.10 */ +#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED + int num_palette_max; /* maximum palette index found in IDAT */ +#endif + png_uint_16 num_trans; /* number of transparency values */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ @@ -211,13 +217,6 @@ struct png_struct_def int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ -# ifdef PNG_TEXT_SUPPORTED - png_size_t current_text_size; /* current size of text input data */ - png_size_t current_text_left; /* how much text left to read in input */ - png_charp current_text; /* current text chunk buffer */ - png_charp current_text_ptr; /* current location in current_text */ -# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ - #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) @@ -249,6 +248,7 @@ struct png_struct_def #endif #ifdef PNG_TIME_RFC1123_SUPPORTED + /* This is going to be unused in libpng16 and removed from libpng17 */ char time_buffer[29]; /* String to hold RFC 1123 time text */ #endif diff --git a/3rdparty/libpng/pngtest.c b/3rdparty/libpng/pngtest.c deleted file mode 100644 index 8d10af4ac..000000000 --- a/3rdparty/libpng/pngtest.c +++ /dev/null @@ -1,1820 +0,0 @@ - -/* pngtest.c - a simple test program to test libpng - * - * Last changed in libpng 1.5.6 [November 3, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This program reads in a PNG image, writes it out again, and then - * compares the two files. If the files are identical, this shows that - * the basic chunk handling, filtering, and (de)compression code is working - * properly. It does not currently test all of the transforms, although - * it probably should. - * - * The program will report "FAIL" in certain legitimate cases: - * 1) when the compression level or filter selection method is changed. - * 2) when the maximum IDAT size (PNG_ZBUF_SIZE in pngconf.h) is not 8192. - * 3) unknown unsafe-to-copy ancillary chunks or unknown critical chunks - * exist in the input file. - * 4) others not listed here... - * In these cases, it is best to check with another tool such as "pngcheck" - * to see what the differences between the two files are. - * - * If a filename is given on the command-line, then this file is used - * for the input, rather than the default "pngtest.png". This allows - * testing a wide variety of files easily. You can also test a number - * of files at once by typing "pngtest -m file1.png file2.png ..." - */ - -#define _POSIX_SOURCE 1 - -#include "zlib.h" -#include "png.h" -/* Copied from pngpriv.h but only used in error messages below. */ -#ifndef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 8192 -#endif -# include -# include -# include -# define FCLOSE(file) fclose(file) - -#ifndef PNG_STDIO_SUPPORTED -typedef FILE * png_FILE_p; -#endif - -/* Makes pngtest verbose so we can find problems. */ -#ifndef PNG_DEBUG -# define PNG_DEBUG 0 -#endif - -#if PNG_DEBUG > 1 -# define pngtest_debug(m) ((void)fprintf(stderr, m "\n")) -# define pngtest_debug1(m,p1) ((void)fprintf(stderr, m "\n", p1)) -# define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m "\n", p1, p2)) -#else -# define pngtest_debug(m) ((void)0) -# define pngtest_debug1(m,p1) ((void)0) -# define pngtest_debug2(m,p1,p2) ((void)0) -#endif - -#if !PNG_DEBUG -# define SINGLE_ROWBUF_ALLOC /* Makes buffer overruns easier to nail */ -#endif - -/* The code uses memcmp and memcpy on large objects (typically row pointers) so - * it is necessary to do soemthing special on certain architectures, note that - * the actual support for this was effectively removed in 1.4, so only the - * memory remains in this program: - */ -#define CVT_PTR(ptr) (ptr) -#define CVT_PTR_NOCHECK(ptr) (ptr) -#define png_memcmp memcmp -#define png_memcpy memcpy -#define png_memset memset - -/* Turn on CPU timing -#define PNGTEST_TIMING -*/ - -#ifndef PNG_FLOATING_POINT_SUPPORTED -#undef PNGTEST_TIMING -#endif - -#ifdef PNGTEST_TIMING -static float t_start, t_stop, t_decode, t_encode, t_misc; -#include -#endif - -#ifdef PNG_TIME_RFC1123_SUPPORTED -#define PNG_tIME_STRING_LENGTH 29 -static int tIME_chunk_present = 0; -static char tIME_string[PNG_tIME_STRING_LENGTH] = "tIME chunk is not present"; -#endif - -static int verbose = 0; -static int strict = 0; - -int test_one_file PNGARG((PNG_CONST char *inname, PNG_CONST char *outname)); - -#ifdef __TURBOC__ -#include -#endif - -/* Defined so I can write to a file on gui/windowing platforms */ -/* #define STDERR stderr */ -#define STDERR stdout /* For DOS */ - -/* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */ -#ifndef png_jmpbuf -# define png_jmpbuf(png_ptr) png_ptr->jmpbuf -#endif - -/* Example of using row callbacks to make a simple progress meter */ -static int status_pass = 1; -static int status_dots_requested = 0; -static int status_dots = 1; - -void PNGCBAPI -read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass); -void PNGCBAPI -read_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass) -{ - if (png_ptr == NULL || row_number > PNG_UINT_31_MAX) - return; - - if (status_pass != pass) - { - fprintf(stdout, "\n Pass %d: ", pass); - status_pass = pass; - status_dots = 31; - } - - status_dots--; - - if (status_dots == 0) - { - fprintf(stdout, "\n "); - status_dots=30; - } - - fprintf(stdout, "r"); -} - -void PNGCBAPI -write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass); -void PNGCBAPI -write_row_callback(png_structp png_ptr, png_uint_32 row_number, int pass) -{ - if (png_ptr == NULL || row_number > PNG_UINT_31_MAX || pass > 7) - return; - - fprintf(stdout, "w"); -} - - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED -/* Example of using user transform callback (we don't transform anything, - * but merely examine the row filters. We set this to 256 rather than - * 5 in case illegal filter values are present.) - */ -static png_uint_32 filters_used[256]; -void PNGCBAPI -count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data); -void PNGCBAPI -count_filters(png_structp png_ptr, png_row_infop row_info, png_bytep data) -{ - if (png_ptr != NULL && row_info != NULL) - ++filters_used[*(data - 1)]; -} -#endif - -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED -/* Example of using user transform callback (we don't transform anything, - * but merely count the zero samples) - */ - -static png_uint_32 zero_samples; - -void PNGCBAPI -count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data); -void PNGCBAPI -count_zero_samples(png_structp png_ptr, png_row_infop row_info, png_bytep data) -{ - png_bytep dp = data; - if (png_ptr == NULL) - return; - - /* Contents of row_info: - * png_uint_32 width width of row - * png_uint_32 rowbytes number of bytes in row - * png_byte color_type color type of pixels - * png_byte bit_depth bit depth of samples - * png_byte channels number of channels (1-4) - * png_byte pixel_depth bits per pixel (depth*channels) - */ - - /* Counts the number of zero samples (or zero pixels if color_type is 3 */ - - if (row_info->color_type == 0 || row_info->color_type == 3) - { - int pos = 0; - png_uint_32 n, nstop; - - for (n = 0, nstop=row_info->width; nbit_depth == 1) - { - if (((*dp << pos++ ) & 0x80) == 0) - zero_samples++; - - if (pos == 8) - { - pos = 0; - dp++; - } - } - - if (row_info->bit_depth == 2) - { - if (((*dp << (pos+=2)) & 0xc0) == 0) - zero_samples++; - - if (pos == 8) - { - pos = 0; - dp++; - } - } - - if (row_info->bit_depth == 4) - { - if (((*dp << (pos+=4)) & 0xf0) == 0) - zero_samples++; - - if (pos == 8) - { - pos = 0; - dp++; - } - } - - if (row_info->bit_depth == 8) - if (*dp++ == 0) - zero_samples++; - - if (row_info->bit_depth == 16) - { - if ((*dp | *(dp+1)) == 0) - zero_samples++; - dp+=2; - } - } - } - else /* Other color types */ - { - png_uint_32 n, nstop; - int channel; - int color_channels = row_info->channels; - if (row_info->color_type > 3)color_channels--; - - for (n = 0, nstop=row_info->width; nbit_depth == 8) - if (*dp++ == 0) - zero_samples++; - - if (row_info->bit_depth == 16) - { - if ((*dp | *(dp+1)) == 0) - zero_samples++; - - dp+=2; - } - } - if (row_info->color_type > 3) - { - dp++; - if (row_info->bit_depth == 16) - dp++; - } - } - } -} -#endif /* PNG_WRITE_USER_TRANSFORM_SUPPORTED */ - -static int wrote_question = 0; - -#ifndef PNG_STDIO_SUPPORTED -/* START of code to validate stdio-free compilation */ -/* These copies of the default read/write functions come from pngrio.c and - * pngwio.c. They allow "don't include stdio" testing of the library. - * This is the function that does the actual reading of data. If you are - * not reading from a standard C stream, you should create a replacement - * read_data function and use it at run time with png_set_read_fn(), rather - * than changing the library. - */ - -#ifdef PNG_IO_STATE_SUPPORTED -void -pngtest_check_io_state(png_structp png_ptr, png_size_t data_length, - png_uint_32 io_op); -void -pngtest_check_io_state(png_structp png_ptr, png_size_t data_length, - png_uint_32 io_op) -{ - png_uint_32 io_state = png_get_io_state(png_ptr); - int err = 0; - - /* Check if the current operation (reading / writing) is as expected. */ - if ((io_state & PNG_IO_MASK_OP) != io_op) - png_error(png_ptr, "Incorrect operation in I/O state"); - - /* Check if the buffer size specific to the current location - * (file signature / header / data / crc) is as expected. - */ - switch (io_state & PNG_IO_MASK_LOC) - { - case PNG_IO_SIGNATURE: - if (data_length > 8) - err = 1; - break; - case PNG_IO_CHUNK_HDR: - if (data_length != 8) - err = 1; - break; - case PNG_IO_CHUNK_DATA: - break; /* no restrictions here */ - case PNG_IO_CHUNK_CRC: - if (data_length != 4) - err = 1; - break; - default: - err = 1; /* uninitialized */ - } - if (err) - png_error(png_ptr, "Bad I/O state or buffer size"); -} -#endif - -#ifndef USE_FAR_KEYWORD -static void PNGCBAPI -pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check = 0; - png_voidp io_ptr; - - /* fread() returns 0 on error, so it is OK to store this in a png_size_t - * instead of an int, which is what fread() actually returns. - */ - io_ptr = png_get_io_ptr(png_ptr); - if (io_ptr != NULL) - { - check = fread(data, 1, length, (png_FILE_p)io_ptr); - } - - if (check != length) - { - png_error(png_ptr, "Read Error"); - } - -#ifdef PNG_IO_STATE_SUPPORTED - pngtest_check_io_state(png_ptr, length, PNG_IO_READING); -#endif -} -#else -/* This is the model-independent version. Since the standard I/O library - can't handle far buffers in the medium and small models, we have to copy - the data. -*/ - -#define NEAR_BUF_SIZE 1024 -#define MIN(a,b) (a <= b ? a : b) - -static void PNGCBAPI -pngtest_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check; - png_byte *n_data; - png_FILE_p io_ptr; - - /* Check if data really is near. If so, use usual code. */ - n_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr)); - if ((png_bytep)n_data == data) - { - check = fread(n_data, 1, length, io_ptr); - } - else - { - png_byte buf[NEAR_BUF_SIZE]; - png_size_t read, remaining, err; - check = 0; - remaining = length; - - do - { - read = MIN(NEAR_BUF_SIZE, remaining); - err = fread(buf, 1, 1, io_ptr); - png_memcpy(data, buf, read); /* Copy far buffer to near buffer */ - if (err != read) - break; - else - check += err; - data += read; - remaining -= read; - } - while (remaining != 0); - } - - if (check != length) - png_error(png_ptr, "Read Error"); - -#ifdef PNG_IO_STATE_SUPPORTED - pngtest_check_io_state(png_ptr, length, PNG_IO_READING); -#endif -} -#endif /* USE_FAR_KEYWORD */ - -#ifdef PNG_WRITE_FLUSH_SUPPORTED -static void PNGCBAPI -pngtest_flush(png_structp png_ptr) -{ - /* Do nothing; fflush() is said to be just a waste of energy. */ - PNG_UNUSED(png_ptr) /* Stifle compiler warning */ -} -#endif - -/* This is the function that does the actual writing of data. If you are - * not writing to a standard C stream, you should create a replacement - * write_data function and use it at run time with png_set_write_fn(), rather - * than changing the library. - */ -#ifndef USE_FAR_KEYWORD -static void PNGCBAPI -pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check; - - check = fwrite(data, 1, length, (png_FILE_p)png_get_io_ptr(png_ptr)); - - if (check != length) - { - png_error(png_ptr, "Write Error"); - } - -#ifdef PNG_IO_STATE_SUPPORTED - pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING); -#endif -} -#else -/* This is the model-independent version. Since the standard I/O library - can't handle far buffers in the medium and small models, we have to copy - the data. -*/ - -#define NEAR_BUF_SIZE 1024 -#define MIN(a,b) (a <= b ? a : b) - -static void PNGCBAPI -pngtest_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check; - png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ - png_FILE_p io_ptr; - - /* Check if data really is near. If so, use usual code. */ - near_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_get_io_ptr(png_ptr)); - - if ((png_bytep)near_data == data) - { - check = fwrite(near_data, 1, length, io_ptr); - } - - else - { - png_byte buf[NEAR_BUF_SIZE]; - png_size_t written, remaining, err; - check = 0; - remaining = length; - - do - { - written = MIN(NEAR_BUF_SIZE, remaining); - png_memcpy(buf, data, written); /* Copy far buffer to near buffer */ - err = fwrite(buf, 1, written, io_ptr); - if (err != written) - break; - else - check += err; - data += written; - remaining -= written; - } - while (remaining != 0); - } - - if (check != length) - { - png_error(png_ptr, "Write Error"); - } - -#ifdef PNG_IO_STATE_SUPPORTED - pngtest_check_io_state(png_ptr, length, PNG_IO_WRITING); -#endif -} -#endif /* USE_FAR_KEYWORD */ - -/* This function is called when there is a warning, but the library thinks - * it can continue anyway. Replacement functions don't have to do anything - * here if you don't want to. In the default configuration, png_ptr is - * not used, but it is passed in case it may be useful. - */ -static void PNGCBAPI -pngtest_warning(png_structp png_ptr, png_const_charp message) -{ - PNG_CONST char *name = "UNKNOWN (ERROR!)"; - char *test; - test = png_get_error_ptr(png_ptr); - - if (test == NULL) - fprintf(STDERR, "%s: libpng warning: %s\n", name, message); - - else - fprintf(STDERR, "%s: libpng warning: %s\n", test, message); -} - -/* This is the default error handling function. Note that replacements for - * this function MUST NOT RETURN, or the program will likely crash. This - * function is used by default, or if the program supplies NULL for the - * error function pointer in png_set_error_fn(). - */ -static void PNGCBAPI -pngtest_error(png_structp png_ptr, png_const_charp message) -{ - pngtest_warning(png_ptr, message); - /* We can return because png_error calls the default handler, which is - * actually OK in this case. - */ -} -#endif /* !PNG_STDIO_SUPPORTED */ -/* END of code to validate stdio-free compilation */ - -/* START of code to validate memory allocation and deallocation */ -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - -/* Allocate memory. For reasonable files, size should never exceed - * 64K. However, zlib may allocate more then 64K if you don't tell - * it not to. See zconf.h and png.h for more information. zlib does - * need to allocate exactly 64K, so whatever you call here must - * have the ability to do that. - * - * This piece of code can be compiled to validate max 64K allocations - * by setting MAXSEG_64K in zlib zconf.h *or* PNG_MAX_MALLOC_64K. - */ -typedef struct memory_information -{ - png_alloc_size_t size; - png_voidp pointer; - struct memory_information FAR *next; -} memory_information; -typedef memory_information FAR *memory_infop; - -static memory_infop pinformation = NULL; -static int current_allocation = 0; -static int maximum_allocation = 0; -static int total_allocation = 0; -static int num_allocations = 0; - -png_voidp PNGCBAPI png_debug_malloc PNGARG((png_structp png_ptr, - png_alloc_size_t size)); -void PNGCBAPI png_debug_free PNGARG((png_structp png_ptr, png_voidp ptr)); - -png_voidp -PNGCBAPI png_debug_malloc(png_structp png_ptr, png_alloc_size_t size) -{ - - /* png_malloc has already tested for NULL; png_create_struct calls - * png_debug_malloc directly, with png_ptr == NULL which is OK - */ - - if (size == 0) - return (NULL); - - /* This calls the library allocator twice, once to get the requested - buffer and once to get a new free list entry. */ - { - /* Disable malloc_fn and free_fn */ - memory_infop pinfo; - png_set_mem_fn(png_ptr, NULL, NULL, NULL); - pinfo = (memory_infop)png_malloc(png_ptr, - png_sizeof(*pinfo)); - pinfo->size = size; - current_allocation += size; - total_allocation += size; - num_allocations ++; - - if (current_allocation > maximum_allocation) - maximum_allocation = current_allocation; - - pinfo->pointer = png_malloc(png_ptr, size); - /* Restore malloc_fn and free_fn */ - - png_set_mem_fn(png_ptr, - NULL, png_debug_malloc, png_debug_free); - - if (size != 0 && pinfo->pointer == NULL) - { - current_allocation -= size; - total_allocation -= size; - png_error(png_ptr, - "out of memory in pngtest->png_debug_malloc"); - } - - pinfo->next = pinformation; - pinformation = pinfo; - /* Make sure the caller isn't assuming zeroed memory. */ - png_memset(pinfo->pointer, 0xdd, pinfo->size); - - if (verbose) - printf("png_malloc %lu bytes at %p\n", (unsigned long)size, - pinfo->pointer); - - return (png_voidp)(pinfo->pointer); - } -} - -/* Free a pointer. It is removed from the list at the same time. */ -void PNGCBAPI -png_debug_free(png_structp png_ptr, png_voidp ptr) -{ - if (png_ptr == NULL) - fprintf(STDERR, "NULL pointer to png_debug_free.\n"); - - if (ptr == 0) - { -#if 0 /* This happens all the time. */ - fprintf(STDERR, "WARNING: freeing NULL pointer\n"); -#endif - return; - } - - /* Unlink the element from the list. */ - { - memory_infop FAR *ppinfo = &pinformation; - - for (;;) - { - memory_infop pinfo = *ppinfo; - - if (pinfo->pointer == ptr) - { - *ppinfo = pinfo->next; - current_allocation -= pinfo->size; - if (current_allocation < 0) - fprintf(STDERR, "Duplicate free of memory\n"); - /* We must free the list element too, but first kill - the memory that is to be freed. */ - png_memset(ptr, 0x55, pinfo->size); - png_free_default(png_ptr, pinfo); - pinfo = NULL; - break; - } - - if (pinfo->next == NULL) - { - fprintf(STDERR, "Pointer %x not found\n", (unsigned int)ptr); - break; - } - - ppinfo = &pinfo->next; - } - } - - /* Finally free the data. */ - if (verbose) - printf("Freeing %p\n", ptr); - - png_free_default(png_ptr, ptr); - ptr = NULL; -} -#endif /* PNG_USER_MEM_SUPPORTED && PNG_DEBUG */ -/* END of code to test memory allocation/deallocation */ - - -/* Demonstration of user chunk support of the sTER and vpAg chunks */ -#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED - -/* (sTER is a public chunk not yet known by libpng. vpAg is a private -chunk used in ImageMagick to store "virtual page" size). */ - -static png_uint_32 user_chunk_data[4]; - - /* 0: sTER mode + 1 - * 1: vpAg width - * 2: vpAg height - * 3: vpAg units - */ - -static int PNGCBAPI read_user_chunk_callback(png_struct *png_ptr, - png_unknown_chunkp chunk) -{ - png_uint_32 - *my_user_chunk_data; - - /* Return one of the following: - * return (-n); chunk had an error - * return (0); did not recognize - * return (n); success - * - * The unknown chunk structure contains the chunk data: - * png_byte name[5]; - * png_byte *data; - * png_size_t size; - * - * Note that libpng has already taken care of the CRC handling. - */ - - if (chunk->name[0] == 115 && chunk->name[1] == 84 && /* s T */ - chunk->name[2] == 69 && chunk->name[3] == 82) /* E R */ - { - /* Found sTER chunk */ - if (chunk->size != 1) - return (-1); /* Error return */ - - if (chunk->data[0] != 0 && chunk->data[0] != 1) - return (-1); /* Invalid mode */ - - my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr); - my_user_chunk_data[0]=chunk->data[0]+1; - return (1); - } - - if (chunk->name[0] != 118 || chunk->name[1] != 112 || /* v p */ - chunk->name[2] != 65 || chunk->name[3] != 103) /* A g */ - return (0); /* Did not recognize */ - - /* Found ImageMagick vpAg chunk */ - - if (chunk->size != 9) - return (-1); /* Error return */ - - my_user_chunk_data=(png_uint_32 *) png_get_user_chunk_ptr(png_ptr); - - my_user_chunk_data[1]=png_get_uint_31(png_ptr, chunk->data); - my_user_chunk_data[2]=png_get_uint_31(png_ptr, chunk->data + 4); - my_user_chunk_data[3]=(png_uint_32)chunk->data[8]; - - return (1); - -} -#endif -/* END of code to demonstrate user chunk support */ - -/* Test one file */ -int -test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) -{ - static png_FILE_p fpin; - static png_FILE_p fpout; /* "static" prevents setjmp corruption */ - png_structp read_ptr; - png_infop read_info_ptr, end_info_ptr; -#ifdef PNG_WRITE_SUPPORTED - png_structp write_ptr; - png_infop write_info_ptr; - png_infop write_end_info_ptr; -#else - png_structp write_ptr = NULL; - png_infop write_info_ptr = NULL; - png_infop write_end_info_ptr = NULL; -#endif - png_bytep row_buf; - png_uint_32 y; - png_uint_32 width, height; - int num_pass, pass; - int bit_depth, color_type; -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - jmp_buf tmp_jmpbuf; -#endif -#endif - - char inbuf[256], outbuf[256]; - - row_buf = NULL; - - if ((fpin = fopen(inname, "rb")) == NULL) - { - fprintf(STDERR, "Could not find input file %s\n", inname); - return (1); - } - - if ((fpout = fopen(outname, "wb")) == NULL) - { - fprintf(STDERR, "Could not open output file %s\n", outname); - FCLOSE(fpin); - return (1); - } - - pngtest_debug("Allocating read and write structures"); -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - read_ptr = - png_create_read_struct_2(PNG_LIBPNG_VER_STRING, NULL, - NULL, NULL, NULL, png_debug_malloc, png_debug_free); -#else - read_ptr = - png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); -#endif -#ifndef PNG_STDIO_SUPPORTED - png_set_error_fn(read_ptr, (png_voidp)inname, pngtest_error, - pngtest_warning); -#endif - -#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED - user_chunk_data[0] = 0; - user_chunk_data[1] = 0; - user_chunk_data[2] = 0; - user_chunk_data[3] = 0; - png_set_read_user_chunk_fn(read_ptr, user_chunk_data, - read_user_chunk_callback); - -#endif -#ifdef PNG_WRITE_SUPPORTED -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - write_ptr = - png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL, - NULL, NULL, NULL, png_debug_malloc, png_debug_free); -#else - write_ptr = - png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); -#endif -#ifndef PNG_STDIO_SUPPORTED - png_set_error_fn(write_ptr, (png_voidp)inname, pngtest_error, - pngtest_warning); -#endif -#endif - pngtest_debug("Allocating read_info, write_info and end_info structures"); - read_info_ptr = png_create_info_struct(read_ptr); - end_info_ptr = png_create_info_struct(read_ptr); -#ifdef PNG_WRITE_SUPPORTED - write_info_ptr = png_create_info_struct(write_ptr); - write_end_info_ptr = png_create_info_struct(write_ptr); -#endif - -#ifdef PNG_SETJMP_SUPPORTED - pngtest_debug("Setting jmpbuf for read struct"); -#ifdef USE_FAR_KEYWORD - if (setjmp(tmp_jmpbuf)) -#else - if (setjmp(png_jmpbuf(read_ptr))) -#endif - { - fprintf(STDERR, "%s -> %s: libpng read error\n", inname, outname); - png_free(read_ptr, row_buf); - row_buf = NULL; - png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr); -#ifdef PNG_WRITE_SUPPORTED - png_destroy_info_struct(write_ptr, &write_end_info_ptr); - png_destroy_write_struct(&write_ptr, &write_info_ptr); -#endif - FCLOSE(fpin); - FCLOSE(fpout); - return (1); - } -#ifdef USE_FAR_KEYWORD - png_memcpy(png_jmpbuf(read_ptr), tmp_jmpbuf, png_sizeof(jmp_buf)); -#endif - -#ifdef PNG_WRITE_SUPPORTED - pngtest_debug("Setting jmpbuf for write struct"); -#ifdef USE_FAR_KEYWORD - - if (setjmp(tmp_jmpbuf)) -#else - if (setjmp(png_jmpbuf(write_ptr))) -#endif - { - fprintf(STDERR, "%s -> %s: libpng write error\n", inname, outname); - png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr); - png_destroy_info_struct(write_ptr, &write_end_info_ptr); -#ifdef PNG_WRITE_SUPPORTED - png_destroy_write_struct(&write_ptr, &write_info_ptr); -#endif - FCLOSE(fpin); - FCLOSE(fpout); - return (1); - } - -#ifdef USE_FAR_KEYWORD - png_memcpy(png_jmpbuf(write_ptr), tmp_jmpbuf, png_sizeof(jmp_buf)); -#endif -#endif -#endif - - pngtest_debug("Initializing input and output streams"); -#ifdef PNG_STDIO_SUPPORTED - png_init_io(read_ptr, fpin); -# ifdef PNG_WRITE_SUPPORTED - png_init_io(write_ptr, fpout); -# endif -#else - png_set_read_fn(read_ptr, (png_voidp)fpin, pngtest_read_data); -# ifdef PNG_WRITE_SUPPORTED - png_set_write_fn(write_ptr, (png_voidp)fpout, pngtest_write_data, -# ifdef PNG_WRITE_FLUSH_SUPPORTED - pngtest_flush); -# else - NULL); -# endif -# endif -#endif - -#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED - /* Normally one would use Z_DEFAULT_STRATEGY for text compression. - * This is here just to make pngtest replicate the results from libpng - * versions prior to 1.5.4, and to test this new API. - */ - png_set_text_compression_strategy(write_ptr, Z_FILTERED); -#endif - - if (status_dots_requested == 1) - { -#ifdef PNG_WRITE_SUPPORTED - png_set_write_status_fn(write_ptr, write_row_callback); -#endif - png_set_read_status_fn(read_ptr, read_row_callback); - } - - else - { -#ifdef PNG_WRITE_SUPPORTED - png_set_write_status_fn(write_ptr, NULL); -#endif - png_set_read_status_fn(read_ptr, NULL); - } - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - { - int i; - - for (i = 0; i<256; i++) - filters_used[i] = 0; - - png_set_read_user_transform_fn(read_ptr, count_filters); - } -#endif -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED - zero_samples = 0; - png_set_write_user_transform_fn(write_ptr, count_zero_samples); -#endif - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -# ifndef PNG_HANDLE_CHUNK_ALWAYS -# define PNG_HANDLE_CHUNK_ALWAYS 3 -# endif - png_set_keep_unknown_chunks(read_ptr, PNG_HANDLE_CHUNK_ALWAYS, - NULL, 0); -#endif -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -# ifndef PNG_HANDLE_CHUNK_IF_SAFE -# define PNG_HANDLE_CHUNK_IF_SAFE 2 -# endif - png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_IF_SAFE, - NULL, 0); -#endif - - pngtest_debug("Reading info struct"); - png_read_info(read_ptr, read_info_ptr); - - pngtest_debug("Transferring info struct"); - { - int interlace_type, compression_type, filter_type; - - if (png_get_IHDR(read_ptr, read_info_ptr, &width, &height, &bit_depth, - &color_type, &interlace_type, &compression_type, &filter_type)) - { - png_set_IHDR(write_ptr, write_info_ptr, width, height, bit_depth, -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - color_type, interlace_type, compression_type, filter_type); -#else - color_type, PNG_INTERLACE_NONE, compression_type, filter_type); -#endif - } - } -#ifdef PNG_FIXED_POINT_SUPPORTED -#ifdef PNG_cHRM_SUPPORTED - { - png_fixed_point white_x, white_y, red_x, red_y, green_x, green_y, blue_x, - blue_y; - - if (png_get_cHRM_fixed(read_ptr, read_info_ptr, &white_x, &white_y, - &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y)) - { - png_set_cHRM_fixed(write_ptr, write_info_ptr, white_x, white_y, red_x, - red_y, green_x, green_y, blue_x, blue_y); - } - } -#endif -#ifdef PNG_gAMA_SUPPORTED - { - png_fixed_point gamma; - - if (png_get_gAMA_fixed(read_ptr, read_info_ptr, &gamma)) - png_set_gAMA_fixed(write_ptr, write_info_ptr, gamma); - } -#endif -#else /* Use floating point versions */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -#ifdef PNG_cHRM_SUPPORTED - { - double white_x, white_y, red_x, red_y, green_x, green_y, blue_x, - blue_y; - - if (png_get_cHRM(read_ptr, read_info_ptr, &white_x, &white_y, &red_x, - &red_y, &green_x, &green_y, &blue_x, &blue_y)) - { - png_set_cHRM(write_ptr, write_info_ptr, white_x, white_y, red_x, - red_y, green_x, green_y, blue_x, blue_y); - } - } -#endif -#ifdef PNG_gAMA_SUPPORTED - { - double gamma; - - if (png_get_gAMA(read_ptr, read_info_ptr, &gamma)) - png_set_gAMA(write_ptr, write_info_ptr, gamma); - } -#endif -#endif /* Floating point */ -#endif /* Fixed point */ -#ifdef PNG_iCCP_SUPPORTED - { - png_charp name; - png_bytep profile; - png_uint_32 proflen; - int compression_type; - - if (png_get_iCCP(read_ptr, read_info_ptr, &name, &compression_type, - &profile, &proflen)) - { - png_set_iCCP(write_ptr, write_info_ptr, name, compression_type, - profile, proflen); - } - } -#endif -#ifdef PNG_sRGB_SUPPORTED - { - int intent; - - if (png_get_sRGB(read_ptr, read_info_ptr, &intent)) - png_set_sRGB(write_ptr, write_info_ptr, intent); - } -#endif - { - png_colorp palette; - int num_palette; - - if (png_get_PLTE(read_ptr, read_info_ptr, &palette, &num_palette)) - png_set_PLTE(write_ptr, write_info_ptr, palette, num_palette); - } -#ifdef PNG_bKGD_SUPPORTED - { - png_color_16p background; - - if (png_get_bKGD(read_ptr, read_info_ptr, &background)) - { - png_set_bKGD(write_ptr, write_info_ptr, background); - } - } -#endif -#ifdef PNG_hIST_SUPPORTED - { - png_uint_16p hist; - - if (png_get_hIST(read_ptr, read_info_ptr, &hist)) - png_set_hIST(write_ptr, write_info_ptr, hist); - } -#endif -#ifdef PNG_oFFs_SUPPORTED - { - png_int_32 offset_x, offset_y; - int unit_type; - - if (png_get_oFFs(read_ptr, read_info_ptr, &offset_x, &offset_y, - &unit_type)) - { - png_set_oFFs(write_ptr, write_info_ptr, offset_x, offset_y, unit_type); - } - } -#endif -#ifdef PNG_pCAL_SUPPORTED - { - png_charp purpose, units; - png_charpp params; - png_int_32 X0, X1; - int type, nparams; - - if (png_get_pCAL(read_ptr, read_info_ptr, &purpose, &X0, &X1, &type, - &nparams, &units, ¶ms)) - { - png_set_pCAL(write_ptr, write_info_ptr, purpose, X0, X1, type, - nparams, units, params); - } - } -#endif -#ifdef PNG_pHYs_SUPPORTED - { - png_uint_32 res_x, res_y; - int unit_type; - - if (png_get_pHYs(read_ptr, read_info_ptr, &res_x, &res_y, &unit_type)) - png_set_pHYs(write_ptr, write_info_ptr, res_x, res_y, unit_type); - } -#endif -#ifdef PNG_sBIT_SUPPORTED - { - png_color_8p sig_bit; - - if (png_get_sBIT(read_ptr, read_info_ptr, &sig_bit)) - png_set_sBIT(write_ptr, write_info_ptr, sig_bit); - } -#endif -#ifdef PNG_sCAL_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED - { - int unit; - double scal_width, scal_height; - - if (png_get_sCAL(read_ptr, read_info_ptr, &unit, &scal_width, - &scal_height)) - { - png_set_sCAL(write_ptr, write_info_ptr, unit, scal_width, scal_height); - } - } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - { - int unit; - png_charp scal_width, scal_height; - - if (png_get_sCAL_s(read_ptr, read_info_ptr, &unit, &scal_width, - &scal_height)) - { - png_set_sCAL_s(write_ptr, write_info_ptr, unit, scal_width, - scal_height); - } - } -#endif -#endif -#endif -#ifdef PNG_TEXT_SUPPORTED - { - png_textp text_ptr; - int num_text; - - if (png_get_text(read_ptr, read_info_ptr, &text_ptr, &num_text) > 0) - { - pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text); - - if (verbose) - printf("\n Text compression=%d\n", text_ptr->compression); - - png_set_text(write_ptr, write_info_ptr, text_ptr, num_text); - } - } -#endif -#ifdef PNG_tIME_SUPPORTED - { - png_timep mod_time; - - if (png_get_tIME(read_ptr, read_info_ptr, &mod_time)) - { - png_set_tIME(write_ptr, write_info_ptr, mod_time); -#ifdef PNG_TIME_RFC1123_SUPPORTED - /* We have to use png_memcpy instead of "=" because the string - * pointed to by png_convert_to_rfc1123() gets free'ed before - * we use it. - */ - png_memcpy(tIME_string, - png_convert_to_rfc1123(read_ptr, mod_time), - png_sizeof(tIME_string)); - - tIME_string[png_sizeof(tIME_string) - 1] = '\0'; - tIME_chunk_present++; -#endif /* PNG_TIME_RFC1123_SUPPORTED */ - } - } -#endif -#ifdef PNG_tRNS_SUPPORTED - { - png_bytep trans_alpha; - int num_trans; - png_color_16p trans_color; - - if (png_get_tRNS(read_ptr, read_info_ptr, &trans_alpha, &num_trans, - &trans_color)) - { - int sample_max = (1 << bit_depth); - /* libpng doesn't reject a tRNS chunk with out-of-range samples */ - if (!((color_type == PNG_COLOR_TYPE_GRAY && - (int)trans_color->gray > sample_max) || - (color_type == PNG_COLOR_TYPE_RGB && - ((int)trans_color->red > sample_max || - (int)trans_color->green > sample_max || - (int)trans_color->blue > sample_max)))) - png_set_tRNS(write_ptr, write_info_ptr, trans_alpha, num_trans, - trans_color); - } - } -#endif -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - { - png_unknown_chunkp unknowns; - int num_unknowns = png_get_unknown_chunks(read_ptr, read_info_ptr, - &unknowns); - - if (num_unknowns) - { - int i; - png_set_unknown_chunks(write_ptr, write_info_ptr, unknowns, - num_unknowns); - /* Copy the locations from the read_info_ptr. The automatically - * generated locations in write_info_ptr are wrong because we - * haven't written anything yet. - */ - for (i = 0; i < num_unknowns; i++) - png_set_unknown_chunk_location(write_ptr, write_info_ptr, i, - unknowns[i].location); - } - } -#endif - -#ifdef PNG_WRITE_SUPPORTED - pngtest_debug("Writing info struct"); - -/* If we wanted, we could write info in two steps: - * png_write_info_before_PLTE(write_ptr, write_info_ptr); - */ - png_write_info(write_ptr, write_info_ptr); - -#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED - if (user_chunk_data[0] != 0) - { - png_byte png_sTER[5] = {115, 84, 69, 82, '\0'}; - - unsigned char - ster_chunk_data[1]; - - if (verbose) - fprintf(STDERR, "\n stereo mode = %lu\n", - (unsigned long)(user_chunk_data[0] - 1)); - - ster_chunk_data[0]=(unsigned char)(user_chunk_data[0] - 1); - png_write_chunk(write_ptr, png_sTER, ster_chunk_data, 1); - } - - if (user_chunk_data[1] != 0 || user_chunk_data[2] != 0) - { - png_byte png_vpAg[5] = {118, 112, 65, 103, '\0'}; - - unsigned char - vpag_chunk_data[9]; - - if (verbose) - fprintf(STDERR, " vpAg = %lu x %lu, units = %lu\n", - (unsigned long)user_chunk_data[1], - (unsigned long)user_chunk_data[2], - (unsigned long)user_chunk_data[3]); - - png_save_uint_32(vpag_chunk_data, user_chunk_data[1]); - png_save_uint_32(vpag_chunk_data + 4, user_chunk_data[2]); - vpag_chunk_data[8] = (unsigned char)(user_chunk_data[3] & 0xff); - png_write_chunk(write_ptr, png_vpAg, vpag_chunk_data, 9); - } - -#endif -#endif - -#ifdef SINGLE_ROWBUF_ALLOC - pngtest_debug("Allocating row buffer..."); - row_buf = (png_bytep)png_malloc(read_ptr, - png_get_rowbytes(read_ptr, read_info_ptr)); - - pngtest_debug1("\t0x%08lx", (unsigned long)row_buf); -#endif /* SINGLE_ROWBUF_ALLOC */ - pngtest_debug("Writing row data"); - -#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ - defined(PNG_WRITE_INTERLACING_SUPPORTED) - num_pass = png_set_interlace_handling(read_ptr); -# ifdef PNG_WRITE_SUPPORTED - png_set_interlace_handling(write_ptr); -# endif -#else - num_pass = 1; -#endif - -#ifdef PNGTEST_TIMING - t_stop = (float)clock(); - t_misc += (t_stop - t_start); - t_start = t_stop; -#endif - for (pass = 0; pass < num_pass; pass++) - { - pngtest_debug1("Writing row data for pass %d", pass); - for (y = 0; y < height; y++) - { -#ifndef SINGLE_ROWBUF_ALLOC - pngtest_debug2("Allocating row buffer (pass %d, y = %u)...", pass, y); - row_buf = (png_bytep)png_malloc(read_ptr, - png_get_rowbytes(read_ptr, read_info_ptr)); - - pngtest_debug2("\t0x%08lx (%u bytes)", (unsigned long)row_buf, - png_get_rowbytes(read_ptr, read_info_ptr)); - -#endif /* !SINGLE_ROWBUF_ALLOC */ - png_read_rows(read_ptr, (png_bytepp)&row_buf, NULL, 1); - -#ifdef PNG_WRITE_SUPPORTED -#ifdef PNGTEST_TIMING - t_stop = (float)clock(); - t_decode += (t_stop - t_start); - t_start = t_stop; -#endif - png_write_rows(write_ptr, (png_bytepp)&row_buf, 1); -#ifdef PNGTEST_TIMING - t_stop = (float)clock(); - t_encode += (t_stop - t_start); - t_start = t_stop; -#endif -#endif /* PNG_WRITE_SUPPORTED */ - -#ifndef SINGLE_ROWBUF_ALLOC - pngtest_debug2("Freeing row buffer (pass %d, y = %u)", pass, y); - png_free(read_ptr, row_buf); - row_buf = NULL; -#endif /* !SINGLE_ROWBUF_ALLOC */ - } - } - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - png_free_data(read_ptr, read_info_ptr, PNG_FREE_UNKN, -1); -#endif -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - png_free_data(write_ptr, write_info_ptr, PNG_FREE_UNKN, -1); -#endif - - pngtest_debug("Reading and writing end_info data"); - - png_read_end(read_ptr, end_info_ptr); -#ifdef PNG_TEXT_SUPPORTED - { - png_textp text_ptr; - int num_text; - - if (png_get_text(read_ptr, end_info_ptr, &text_ptr, &num_text) > 0) - { - pngtest_debug1("Handling %d iTXt/tEXt/zTXt chunks", num_text); - png_set_text(write_ptr, write_end_info_ptr, text_ptr, num_text); - } - } -#endif -#ifdef PNG_tIME_SUPPORTED - { - png_timep mod_time; - - if (png_get_tIME(read_ptr, end_info_ptr, &mod_time)) - { - png_set_tIME(write_ptr, write_end_info_ptr, mod_time); -#ifdef PNG_TIME_RFC1123_SUPPORTED - /* We have to use png_memcpy instead of "=" because the string - pointed to by png_convert_to_rfc1123() gets free'ed before - we use it */ - png_memcpy(tIME_string, - png_convert_to_rfc1123(read_ptr, mod_time), - png_sizeof(tIME_string)); - - tIME_string[png_sizeof(tIME_string) - 1] = '\0'; - tIME_chunk_present++; -#endif /* PNG_TIME_RFC1123_SUPPORTED */ - } - } -#endif -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - { - png_unknown_chunkp unknowns; - int num_unknowns = png_get_unknown_chunks(read_ptr, end_info_ptr, - &unknowns); - - if (num_unknowns) - { - int i; - png_set_unknown_chunks(write_ptr, write_end_info_ptr, unknowns, - num_unknowns); - /* Copy the locations from the read_info_ptr. The automatically - * generated locations in write_end_info_ptr are wrong because we - * haven't written the end_info yet. - */ - for (i = 0; i < num_unknowns; i++) - png_set_unknown_chunk_location(write_ptr, write_end_info_ptr, i, - unknowns[i].location); - } - } -#endif -#ifdef PNG_WRITE_SUPPORTED - png_write_end(write_ptr, write_end_info_ptr); -#endif - -#ifdef PNG_EASY_ACCESS_SUPPORTED - if (verbose) - { - png_uint_32 iwidth, iheight; - iwidth = png_get_image_width(write_ptr, write_info_ptr); - iheight = png_get_image_height(write_ptr, write_info_ptr); - fprintf(STDERR, "\n Image width = %lu, height = %lu\n", - (unsigned long)iwidth, (unsigned long)iheight); - } -#endif - - pngtest_debug("Destroying data structs"); -#ifdef SINGLE_ROWBUF_ALLOC - pngtest_debug("destroying row_buf for read_ptr"); - png_free(read_ptr, row_buf); - row_buf = NULL; -#endif /* SINGLE_ROWBUF_ALLOC */ - pngtest_debug("destroying read_ptr, read_info_ptr, end_info_ptr"); - png_destroy_read_struct(&read_ptr, &read_info_ptr, &end_info_ptr); -#ifdef PNG_WRITE_SUPPORTED - pngtest_debug("destroying write_end_info_ptr"); - png_destroy_info_struct(write_ptr, &write_end_info_ptr); - pngtest_debug("destroying write_ptr, write_info_ptr"); - png_destroy_write_struct(&write_ptr, &write_info_ptr); -#endif - pngtest_debug("Destruction complete."); - - FCLOSE(fpin); - FCLOSE(fpout); - - pngtest_debug("Opening files for comparison"); - if ((fpin = fopen(inname, "rb")) == NULL) - { - fprintf(STDERR, "Could not find file %s\n", inname); - return (1); - } - - if ((fpout = fopen(outname, "rb")) == NULL) - { - fprintf(STDERR, "Could not find file %s\n", outname); - FCLOSE(fpin); - return (1); - } - - for (;;) - { - png_size_t num_in, num_out; - - num_in = fread(inbuf, 1, 1, fpin); - num_out = fread(outbuf, 1, 1, fpout); - - if (num_in != num_out) - { - fprintf(STDERR, "\nFiles %s and %s are of a different size\n", - inname, outname); - - if (wrote_question == 0) - { - fprintf(STDERR, - " Was %s written with the same maximum IDAT chunk size (%d bytes),", - inname, PNG_ZBUF_SIZE); - fprintf(STDERR, - "\n filtering heuristic (libpng default), compression"); - fprintf(STDERR, - " level (zlib default),\n and zlib version (%s)?\n\n", - ZLIB_VERSION); - wrote_question = 1; - } - - FCLOSE(fpin); - FCLOSE(fpout); - - if (strict != 0) - return (1); - - else - return (0); - } - - if (!num_in) - break; - - if (png_memcmp(inbuf, outbuf, num_in)) - { - fprintf(STDERR, "\nFiles %s and %s are different\n", inname, outname); - - if (wrote_question == 0) - { - fprintf(STDERR, - " Was %s written with the same maximum IDAT chunk size (%d bytes),", - inname, PNG_ZBUF_SIZE); - fprintf(STDERR, - "\n filtering heuristic (libpng default), compression"); - fprintf(STDERR, - " level (zlib default),\n and zlib version (%s)?\n\n", - ZLIB_VERSION); - wrote_question = 1; - } - - FCLOSE(fpin); - FCLOSE(fpout); - - if (strict != 0) - return (1); - - else - return (0); - } - } - - FCLOSE(fpin); - FCLOSE(fpout); - - return (0); -} - -/* Input and output filenames */ -#ifdef RISCOS -static PNG_CONST char *inname = "pngtest/png"; -static PNG_CONST char *outname = "pngout/png"; -#else -static PNG_CONST char *inname = "pngtest.png"; -static PNG_CONST char *outname = "pngout.png"; -#endif - -int -main(int argc, char *argv[]) -{ - int multiple = 0; - int ierror = 0; - - fprintf(STDERR, "\n Testing libpng version %s\n", PNG_LIBPNG_VER_STRING); - fprintf(STDERR, " with zlib version %s\n", ZLIB_VERSION); - fprintf(STDERR, "%s", png_get_copyright(NULL)); - /* Show the version of libpng used in building the library */ - fprintf(STDERR, " library (%lu):%s", - (unsigned long)png_access_version_number(), - png_get_header_version(NULL)); - - /* Show the version of libpng used in building the application */ - fprintf(STDERR, " pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER, - PNG_HEADER_VERSION_STRING); - - /* Do some consistency checking on the memory allocation settings, I'm - * not sure this matters, but it is nice to know, the first of these - * tests should be impossible because of the way the macros are set - * in pngconf.h - */ -#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) - fprintf(STDERR, " NOTE: Zlib compiled for max 64k, libpng not\n"); -#endif - /* I think the following can happen. */ -#if !defined(MAXSEG_64K) && defined(PNG_MAX_MALLOC_64K) - fprintf(STDERR, " NOTE: libpng compiled for max 64k, zlib not\n"); -#endif - - if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING)) - { - fprintf(STDERR, - "Warning: versions are different between png.h and png.c\n"); - fprintf(STDERR, " png.h version: %s\n", PNG_LIBPNG_VER_STRING); - fprintf(STDERR, " png.c version: %s\n\n", png_libpng_ver); - ++ierror; - } - - if (argc > 1) - { - if (strcmp(argv[1], "-m") == 0) - { - multiple = 1; - status_dots_requested = 0; - } - - else if (strcmp(argv[1], "-mv") == 0 || - strcmp(argv[1], "-vm") == 0 ) - { - multiple = 1; - verbose = 1; - status_dots_requested = 1; - } - - else if (strcmp(argv[1], "-v") == 0) - { - verbose = 1; - status_dots_requested = 1; - inname = argv[2]; - } - - else if (strcmp(argv[1], "--strict") == 0) - { - status_dots_requested = 0; - verbose = 1; - inname = argv[2]; - strict++; - } - - else - { - inname = argv[1]; - status_dots_requested = 0; - } - } - - if (!multiple && argc == 3 + verbose) - outname = argv[2 + verbose]; - - if ((!multiple && argc > 3 + verbose) || (multiple && argc < 2)) - { - fprintf(STDERR, - "usage: %s [infile.png] [outfile.png]\n\t%s -m {infile.png}\n", - argv[0], argv[0]); - fprintf(STDERR, - " reads/writes one PNG file (without -m) or multiple files (-m)\n"); - fprintf(STDERR, - " with -m %s is used as a temporary file\n", outname); - exit(1); - } - - if (multiple) - { - int i; -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - int allocation_now = current_allocation; -#endif - for (i=2; isize, - (unsigned int)pinfo->pointer); - pinfo = pinfo->next; - } - } -#endif - } -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - fprintf(STDERR, " Current memory allocation: %10d bytes\n", - current_allocation); - fprintf(STDERR, " Maximum memory allocation: %10d bytes\n", - maximum_allocation); - fprintf(STDERR, " Total memory allocation: %10d bytes\n", - total_allocation); - fprintf(STDERR, " Number of allocations: %10d\n", - num_allocations); -#endif - } - - else - { - int i; - for (i = 0; i<3; ++i) - { - int kerror; -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - int allocation_now = current_allocation; -#endif - if (i == 1) - status_dots_requested = 1; - - else if (verbose == 0) - status_dots_requested = 0; - - if (i == 0 || verbose == 1 || ierror != 0) - fprintf(STDERR, "\n Testing %s:", inname); - - kerror = test_one_file(inname, outname); - - if (kerror == 0) - { - if (verbose == 1 || i == 2) - { -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - int k; -#endif -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED - fprintf(STDERR, "\n PASS (%lu zero samples)\n", - (unsigned long)zero_samples); -#else - fprintf(STDERR, " PASS\n"); -#endif -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - for (k = 0; k<256; k++) - if (filters_used[k]) - fprintf(STDERR, " Filter %d was used %lu times\n", - k, (unsigned long)filters_used[k]); -#endif -#ifdef PNG_TIME_RFC1123_SUPPORTED - if (tIME_chunk_present != 0) - fprintf(STDERR, " tIME = %s\n", tIME_string); -#endif /* PNG_TIME_RFC1123_SUPPORTED */ - } - } - - else - { - if (verbose == 0 && i != 2) - fprintf(STDERR, "\n Testing %s:", inname); - - fprintf(STDERR, " FAIL\n"); - ierror += kerror; - } -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - if (allocation_now != current_allocation) - fprintf(STDERR, "MEMORY ERROR: %d bytes lost\n", - current_allocation - allocation_now); - - if (current_allocation != 0) - { - memory_infop pinfo = pinformation; - - fprintf(STDERR, "MEMORY ERROR: %d bytes still allocated\n", - current_allocation); - - while (pinfo != NULL) - { - fprintf(STDERR, " %lu bytes at %x\n", - (unsigned long)pinfo->size, (unsigned int)pinfo->pointer); - pinfo = pinfo->next; - } - } -#endif - } -#if defined(PNG_USER_MEM_SUPPORTED) && PNG_DEBUG - fprintf(STDERR, " Current memory allocation: %10d bytes\n", - current_allocation); - fprintf(STDERR, " Maximum memory allocation: %10d bytes\n", - maximum_allocation); - fprintf(STDERR, " Total memory allocation: %10d bytes\n", - total_allocation); - fprintf(STDERR, " Number of allocations: %10d\n", - num_allocations); -#endif - } - -#ifdef PNGTEST_TIMING - t_stop = (float)clock(); - t_misc += (t_stop - t_start); - t_start = t_stop; - fprintf(STDERR, " CPU time used = %.3f seconds", - (t_misc+t_decode+t_encode)/(float)CLOCKS_PER_SEC); - fprintf(STDERR, " (decoding %.3f,\n", - t_decode/(float)CLOCKS_PER_SEC); - fprintf(STDERR, " encoding %.3f ,", - t_encode/(float)CLOCKS_PER_SEC); - fprintf(STDERR, " other %.3f seconds)\n\n", - t_misc/(float)CLOCKS_PER_SEC); -#endif - - if (ierror == 0) - fprintf(STDERR, " libpng passes test\n"); - - else - fprintf(STDERR, " libpng FAILS test\n"); - - return (int)(ierror != 0); -} - -/* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_5_9 Your_png_h_is_not_version_1_5_9; diff --git a/3rdparty/libpng/pngtest.png b/3rdparty/libpng/pngtest.png deleted file mode 100644 index 81f5f8438a9f0fa8b87cd0266334f72792febf8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8695 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 VS0jWSKIQ-b002ovPDHLkV1m0U00;m8 diff --git a/3rdparty/libpng/pngtrans.c b/3rdparty/libpng/pngtrans.c index 6a6908dcd..ee60957fc 100644 --- a/3rdparty/libpng/pngtrans.c +++ b/3rdparty/libpng/pngtrans.c @@ -1,8 +1,8 @@ /* pngtrans.c - transforms the data in a row (used by both readers and writers) * - * Last changed in libpng 1.5.4 [July 7, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -619,6 +619,109 @@ png_do_bgr(png_row_infop row_info, png_bytep row) } #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ +#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ + defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) +/* Added at libpng-1.5.10 */ +void /* PRIVATE */ +png_do_check_palette_indexes(png_structp png_ptr, png_row_infop row_info) +{ + if (png_ptr->num_palette < (1 << row_info->bit_depth) && + png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */ + { + /* Calculations moved outside switch in an attempt to stop different + * compiler warnings. 'padding' is in *bits* within the last byte, it is + * an 'int' because pixel_depth becomes an 'int' in the expression below, + * and this calculation is used because it avoids warnings that other + * forms produced on either GCC or MSVC. + */ + int padding = (-row_info->pixel_depth * row_info->width) & 7; + png_bytep rp = png_ptr->row_buf + row_info->rowbytes; + + switch (row_info->bit_depth) + { + case 1: + { + /* in this case, all bytes must be 0 so we don't need + * to unpack the pixels except for the rightmost one. + */ + for (; rp > png_ptr->row_buf; rp--) + { + if (*rp >> padding != 0) + png_ptr->num_palette_max = 1; + padding = 0; + } + + break; + } + + case 2: + { + for (; rp > png_ptr->row_buf; rp--) + { + int i = ((*rp >> padding) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 2) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 4) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 6) & 0x03); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + padding = 0; + } + + break; + } + + case 4: + { + for (; rp > png_ptr->row_buf; rp--) + { + int i = ((*rp >> padding) & 0x0f); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + i = (((*rp >> padding) >> 4) & 0x0f); + + if (i > png_ptr->num_palette_max) + png_ptr->num_palette_max = i; + + padding = 0; + } + + break; + } + + case 8: + { + for (; rp > png_ptr->row_buf; rp--) + { + if (*rp > png_ptr->num_palette_max) + png_ptr->num_palette_max = (int) *rp; + } + + break; + } + + default: + break; + } + } +} +#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ + #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) #ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED diff --git a/3rdparty/libpng/pngwrite.c b/3rdparty/libpng/pngwrite.c index 6d3fd4c38..2a72ad33f 100644 --- a/3rdparty/libpng/pngwrite.c +++ b/3rdparty/libpng/pngwrite.c @@ -1,8 +1,8 @@ /* pngwrite.c - general routines to write a PNG file * - * Last changed in libpng 1.5.7 [December 15, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.11 [June 14, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -305,6 +305,11 @@ png_write_end(png_structp png_ptr, png_infop info_ptr) if (!(png_ptr->mode & PNG_HAVE_IDAT)) png_error(png_ptr, "No IDATs written into file"); +#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED + if (png_ptr->num_palette_max > png_ptr->num_palette) + png_benign_error(png_ptr, "Wrote palette index exceeding num_palette"); +#endif + /* See if user wants us to write information chunks */ if (info_ptr != NULL) { @@ -798,6 +803,14 @@ png_write_row(png_structp png_ptr, png_const_bytep row) } #endif +/* Added at libpng-1.5.10 */ +#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED + /* Check for out-of-range palette index */ + if (row_info.color_type == PNG_COLOR_TYPE_PALETTE && + png_ptr->num_palette_max >= 0) + png_do_check_palette_indexes(png_ptr, &row_info); +#endif + /* Find a filter if necessary, filter the row and write it out. */ png_write_find_filter(png_ptr, &row_info); diff --git a/3rdparty/libpng/pngwutil.c b/3rdparty/libpng/pngwutil.c index da18e9502..b49704f1a 100644 --- a/3rdparty/libpng/pngwutil.c +++ b/3rdparty/libpng/pngwutil.c @@ -1,8 +1,8 @@ /* pngwutil.c - utilities to write a PNG file * - * Last changed in libpng 1.5.6 [November 3, 2011] - * Copyright (c) 1998-2011 Glenn Randers-Pehrson + * Last changed in libpng 1.5.10 [March 8, 2012] + * Copyright (c) 1998-2012 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * @@ -569,14 +569,15 @@ png_text_compress(png_structp png_ptr, /* Ship the compressed text out via chunk writes */ static void /* PRIVATE */ -png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) +png_write_compressed_data_out(png_structp png_ptr, compression_state *comp, + png_size_t data_len) { int i; /* Handle the no-compression case */ if (comp->input) { - png_write_chunk_data(png_ptr, comp->input, comp->input_len); + png_write_chunk_data(png_ptr, comp->input, data_len); return; } @@ -585,7 +586,7 @@ png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) /* The zbuf_size test is because the code below doesn't work if zbuf_size is * '1'; simply skip it to avoid memory overwrite. */ - if (comp->input_len >= 2 && comp->input_len < 16384 && png_ptr->zbuf_size > 1) + if (data_len >= 2 && comp->input_len < 16384 && png_ptr->zbuf_size > 1) { unsigned int z_cmf; /* zlib compression method and flags */ @@ -1164,8 +1165,7 @@ png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type, if (profile_len) { - comp.input_len = profile_len; - png_write_compressed_data_out(png_ptr, &comp); + png_write_compressed_data_out(png_ptr, &comp, profile_len); } png_write_chunk_end(png_ptr); @@ -1735,8 +1735,7 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text, png_write_chunk_data(png_ptr, &buf, (png_size_t)1); /* Write the compressed data */ - comp.input_len = text_len; - png_write_compressed_data_out(png_ptr, &comp); + png_write_compressed_data_out(png_ptr, &comp, text_len); /* Close the chunk */ png_write_chunk_end(png_ptr); @@ -1827,7 +1826,7 @@ png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key, png_write_chunk_data(png_ptr, (lang_key ? (png_const_bytep)lang_key : cbuf), (png_size_t)(lang_key_len + 1)); - png_write_compressed_data_out(png_ptr, &comp); + png_write_compressed_data_out(png_ptr, &comp, text_len); png_write_chunk_end(png_ptr); From 90a3d227c92d38b98419fe62de985d1f49be67f6 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 04:54:15 +0400 Subject: [PATCH 028/103] Enable libpng NEON optimization in Android build for armeabi-v7a with NEON target --- 3rdparty/libpng/CMakeLists.txt | 12 +++++++++++- 3rdparty/libpng/pngrutil.c | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/3rdparty/libpng/CMakeLists.txt b/3rdparty/libpng/CMakeLists.txt index 73ce1d82f..70f73f13e 100644 --- a/3rdparty/libpng/CMakeLists.txt +++ b/3rdparty/libpng/CMakeLists.txt @@ -2,13 +2,23 @@ # CMake file for libpng. See root CMakeLists.txt # # ---------------------------------------------------------------------------- -project(${PNG_LIBRARY}) + +if(NEON) + project(${PNG_LIBRARY} ASM) +else() + project(${PNG_LIBRARY}) +endif() ocv_include_directories("${CMAKE_CURRENT_SOURCE_DIR}" ${ZLIB_INCLUDE_DIR}) file(GLOB lib_srcs *.c) file(GLOB lib_hdrs *.h) +if(NEON) + list(APPEND lib_srcs arm/filter_neon.S) + add_definitions(-DPNG_ARM_NEON) +endif() + # ---------------------------------------------------------------------------------- # Define the library target: # ---------------------------------------------------------------------------------- diff --git a/3rdparty/libpng/pngrutil.c b/3rdparty/libpng/pngrutil.c index aa592ccfb..5c4dbc392 100644 --- a/3rdparty/libpng/pngrutil.c +++ b/3rdparty/libpng/pngrutil.c @@ -3662,7 +3662,7 @@ png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row, #ifdef PNG_ARM_NEON -#ifdef __linux__ +#if defined __linux__ && !defined __ANDROID__ #include #include #include @@ -3695,7 +3695,7 @@ static int png_have_hwcap(unsigned cap) static void png_init_filter_functions_neon(png_structp pp, unsigned int bpp) { -#ifdef __linux__ +#if defined __linux__ && !defined __ANDROID__ if (!png_have_hwcap(HWCAP_NEON)) return; #endif From e9392d14669a39495d0bdb4e0e074e0fbb26cf3d Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 03:03:36 +0400 Subject: [PATCH 029/103] Fix Android build with cmake 2.6.3 --- 3rdparty/libpng/CMakeLists.txt | 1 + android/android.toolchain.cmake | 1 + 2 files changed, 2 insertions(+) diff --git a/3rdparty/libpng/CMakeLists.txt b/3rdparty/libpng/CMakeLists.txt index 70f73f13e..d47dd53fc 100644 --- a/3rdparty/libpng/CMakeLists.txt +++ b/3rdparty/libpng/CMakeLists.txt @@ -30,6 +30,7 @@ if(MSVC) endif(MSVC) add_library(${PNG_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs}) +target_link_libraries(${PNG_LIBRARY} ${ZLIB_LIBRARY}) if(UNIX) if(CMAKE_COMPILER_IS_GNUCXX OR CV_ICC) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index b4d498fc3..53bb0e54a 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -796,6 +796,7 @@ set( CMAKE_ASM_COMPILER_ID GNU ) set( CMAKE_ASM_COMPILER_WORKS TRUE ) set( CMAKE_ASM_COMPILER_FORCED TRUE ) set( CMAKE_COMPILER_IS_GNUASM 1) +set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s S asm ) # NDK flags if( ARMEABI OR ARMEABI_V7A ) From 35a869f6f0a1084e6d486023ce5f30f315c2503b Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 28 Aug 2012 11:29:40 +0400 Subject: [PATCH 030/103] Update libtiff to release v4.0.2 --- 3rdparty/libtiff/CMakeLists.txt | 6 +- 3rdparty/libtiff/COPYRIGHT | 21 + 3rdparty/libtiff/ChangeLog | 5753 +++++++++++++++++++++++++++++++ 3rdparty/libtiff/tif_aux.c | 8 +- 3rdparty/libtiff/tif_dir.c | 390 ++- 3rdparty/libtiff/tif_fax3.c | 3 +- 3rdparty/libtiff/tif_getimage.c | 168 +- 3rdparty/libtiff/tif_jpeg.c | 99 +- 3rdparty/libtiff/tif_ojpeg.c | 11 +- 3rdparty/libtiff/tif_pixarlog.c | 74 +- 3rdparty/libtiff/tif_print.c | 145 +- 3rdparty/libtiff/tif_read.c | 41 +- 3rdparty/libtiff/tif_strip.c | 10 +- 3rdparty/libtiff/tif_tile.c | 11 +- 3rdparty/libtiff/tif_unix.c | 8 +- 3rdparty/libtiff/tiffio.h | 5 +- 3rdparty/libtiff/tiffiop.h | 5 +- 3rdparty/libtiff/tiffvers.h | 4 +- 18 files changed, 6351 insertions(+), 411 deletions(-) create mode 100644 3rdparty/libtiff/COPYRIGHT create mode 100644 3rdparty/libtiff/ChangeLog diff --git a/3rdparty/libtiff/CMakeLists.txt b/3rdparty/libtiff/CMakeLists.txt index 6dd7956f5..dedcc3911 100644 --- a/3rdparty/libtiff/CMakeLists.txt +++ b/3rdparty/libtiff/CMakeLists.txt @@ -89,7 +89,11 @@ endif(WIN32) ocv_warnings_disable(CMAKE_C_FLAGS -Wno-unused-but-set-variable -Wmissing-prototypes -Wmissing-declarations -Wundef -Wunused -Wsign-compare -Wcast-align -Wshadow -Wno-maybe-uninitialized -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast) -ocv_warnings_disable(CMAKE_CXX_FLAGS -Wmissing-declarations -Wunused-parameter /wd4100 /wd4244 /wd4706 /wd4127 /wd4701 /wd4018 /wd4267 /wd4306 /wd4305 /wd4312 /wd4311 /wd4703) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wmissing-declarations -Wunused-parameter) +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4018 /wd4100 /wd4127 /wd4311 /wd4701 /wd4706) # vs2005 +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244) # vs2008 +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4267 /wd4305 /wd4306) # vs2008 Win64 +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4703) # vs2012 if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") diff --git a/3rdparty/libtiff/COPYRIGHT b/3rdparty/libtiff/COPYRIGHT new file mode 100644 index 000000000..828218615 --- /dev/null +++ b/3rdparty/libtiff/COPYRIGHT @@ -0,0 +1,21 @@ +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. diff --git a/3rdparty/libtiff/ChangeLog b/3rdparty/libtiff/ChangeLog new file mode 100644 index 000000000..4eab3bba5 --- /dev/null +++ b/3rdparty/libtiff/ChangeLog @@ -0,0 +1,5753 @@ +2012-06-15 Frank Warmerdam + + * libtiff 4.0.2 released. + + * tools/tif2pdf.c, tools/tifdump.c: avoid unitialized variable + warnings with clang. + +2012-06-15 Tom Lane + + * tools/tiff2pdf.c: Defend against integer overflows while + calculating required buffer sizes (CVE-2012-2113). + +2012-06-12 Frank Warmerdam + + * libtiff/tif_print.c: Be careful about printing corrupt inknames. + + * libtiff/tif_fax3.c: Ensure runs array is initialized to zeros. + +2012-06-07 Frank Warmerdam + + * libtiff/tif_print.c: avoid pretty printing other fields when + we don't have the proper amount and type of data or if the field + is actually autodefined. + +2012-06-05 Frank Warmerdam + + * libtiff/tif_tile.c, libtiff/tif_strip.c: Ensure that illegal + ycbcrsubsampling values result in a runtime error, not just an + assertion. + + * tests/custom_dir.c: Add testing of EXIF and custom directory + reading and writing. + + * libtiff/tif_dir.c, libtiff/tiffio.h: Add TIFFCreateCustomDirectory() + and TIFFCreateEXIFDirectory() functions. + + * libtiff/tif_dir.c, tif_print.c : Remove FIELD_CUSTOM handling for + PAGENUMBER, HALFTONEHINTS, and YCBCRSUBSAMPLING. Implement DOTRANGE + differently. This is to avoid using special TIFFGetField/TIFFSetField + rules for these fields in non-image directories (like EXIF). + +2012-06-04 Frank Warmerdam + + * libtiff/tif_jpeg.c: Remove code for fixing up h_sampling and v_sampling + in JPEGPreDecode(). If a fixup will be done it needs to be done sooner + in JPEGFixupTagsSubsampling() or else buffer sized may be wrong. + +2012-06-01 Frank Warmerdam + + * tools/tiffinfo.c: Do not try to read image data in EXIF directories. + + * libtiff/tif_getimage.c: added support for _SEPARATED CMYK images. + http://bugzilla.maptools.org/show_bug.cgi?id=2379 + + * libtiff/tif_unix.c: use strerror() to return a more specific error message + on failed open. + http://bugzilla.maptools.org/show_bug.cgi?id=2341 + + * libtiff/tif_jpeg.c: Fix JPEGDecodeRaw() bugs. + http://bugzilla.maptools.org/show_bug.cgi?id=2386 + + * tests/decode_raw.c, tests/images/quad-tile.jpg.tiff: add limited support + for testing jpeg in tiff image decoding including the "raw" decode interface. + +2012-05-31 Frank Warmerdam + + * libtiff/tif_jpeg.c: avoid overrunning the end of the output buffer in + JPEGDecodeRaw() - mostly likely to occur when there is confusion about + sampling values. + + * libtiff/tif_read.c: Make sure tif_rawdatasize is cleared when tif_rawdata is freed. + + * libtiff/tif_getimage.c: Add support for greyscale+alpha c/o Jérémie Laval. + http://bugzilla.maptools.org/show_bug.cgi?id=2398 + +2012-05-29 Frank Warmerdam + + * libtiff/tif_dir.c: avoid using specific set/get logic to process fields in custom directories, + like EXIF directories. This fixes problems like a tag "320" existing in a custom directory getting + processed as if it were a colormap when it isn't really. Damn the wide variety of argument formulations + to get/set functions for different tags! + + * libtiff/tif_dir.c: Ensure that we keep track of when tif_rawdata + is a pointer into an mmap()ed file via TIFF_BUFFERMMAP flag. + +2012-05-24 Frank Warmerdam + + * libtiff/tif_pixarlog.c: Allocate working buffer one word larger since we "forward + accumulate" and overwrite the end by one word in at least some cases. + +2012-05-23 Frank Warmerdam + + * libtiff/tif_pixarlog.c: avoid accessing out of the lookup arrays for out of range inputs. + + * tools/tiffinfo.c: initialize h=0 to avoid undefined variable for degenerate files. + + * libtiff/tif_ojpeg.c: if OJPEGWriteHeader() fails once do not bother trying again on + the same image. + + * libtiff/tif_ojpeg.c: make things more resilient in the face of files without + stripbytecounts or stripoffsets or where loading these fails. + + * libtiff/tif_print.c: be careful about whether min/max values are singular + or one per sample. + + * libtiff/tif_print.c: Avoid confusion about count size when printing custom fields. + May affect things like ISOSpeedRatings. + + * libtiff/tif_dir.c: avoid one byte past end of ink names reading + in some cases. + +2012-05-19 Bob Friesenhahn + + * man/TIFFGetField.3tiff: Correct the 'count' field type in the + example for how to retreive the value of unsupported tags. + +2012-03-30 Frank Warmerdam + + * tif_getimage.c: Fix size overflow (zdi-can-1221,CVE-2012-1173) + care of Tom Lane @ Red Hat. + +2012-02-18 Bob Friesenhahn + + * libtiff 4.0.1 released. + + * Update automake used to 1.11.3. + + * libtiff/tiffio.h: Use double-underbar syntax in GCC printf + attribute specification to lessen the risk of accidental macro + substitution. Patch from Vincent Torri. + +2012-01-31 Frank Warmerdam + + * libtiff/tif_dir.c, libtiff/tif_dirread.c: Extra caution around + assumption tag fetching is always successful. + + * libtiff/tif_jpeg.c: Extra caution for case where sp is NULL. + +2012-01-22 Bob Friesenhahn + + * configure.ac: Add support for using library symbol versioning on + ELF systems with the GNU linker. Support is enabled via + --enable-ld-version-script. Disabled by default for now until + there is a decision for how to deploy a libtiff with versioned + symbols after libtiff 4.0.0 was already released. + +2011-12-22 Bob Friesenhahn + + * libtiff/tif_win32.c: Eliminate some minor 64-bit warnings in + + tif_win32.c. Patch by Edward Lam. + + * configure.ac: Add libtiff private dependency on -llzma for + pkg-config. Patch by Mark Brand. + Updated Automake to 1.11.2. + +2011-12-21 Bob Friesenhahn + + * libtiff 4.0.0 released. + +2011-12-08 Frank Warmerdam + + * libtiff/tif_dirread.c, libtiff/tif_read.c: more cautious checking + of _TIFFFillStriles() results (#gdal 4372) + +2011-12-07 Frank Warmerdam + + * libtiff/tif_dirread.c: fixes to deal with invalid files where + _TIFFFillStriles() fails, and we try to chop up strips (gdal #4372) + + * libtiff/tif_dirread.c: fix error reporting when there is no + tag information struct and name (gdal #4373) + +2011-10-22 Bob Friesenhahn + + * Update GNU libtool to 2.4.2. + + * tools/tiffsplit.c (tiffcp): TIFFGetField count field should be + uint32 type for TIFFTAG_JPEGTABLES. Patch by Christophe + Deroulers. + +2011-06-21 Frank Warmerdam + + * libtiff/libtiff.def: Restore TIFFMergeFieldInfo. + +2011-05-31 Jim Meyering + + * libtiff/tif_dirread.c (TIFFFetchStripThing): Free "data" also + upon failure to allocate "resizeddata". + * tools/tiff2ps.c (PSDataBW): Zero buffer *after* checking for + allocation failure, not before. + * libtiff/tif_ojpeg.c: plug leaks on OJPEG read failure path + * tools/rgb2ycbcr.c (cvtRaster): unchecked malloc + * libtiff/tif_jpeg.c, tools/tiff2pdf.c, tools/tiff2ps.c: mark + NULL-deref and possible overflow + * tools/tiff2pdf.c: remove decl+set of set-but-not-used local, "written" + * libtiff/tif_jpeg.c (JPEGInitializeLibJPEG): Remove declaration + and set of otherwise unused local, data_is_empty. + * libtiff/tif_jpeg.c (JPEGDecodeRaw) [JPEG_LIB_MK1_OR_12BIT]: + Diagnose out-of-memory failure and return 0 rather than + dereferencing NULL. + +2011-05-24 Frank Warmerdam + + * libtiff/tif_dirread.c: produce special error message for zero tag + directories instead of error out on the malloc(0) failure. + +2011-05-16 Frank Warmerdam + + * libtiff/tif_dirinfo.c: Restore TIFFMergeFieldInfo() and + related declarations as they are in active use by libraries + such as libgeotiff, and work just fine. (#2315) + +2011-04-20 Frank Warmerdam + + * libtiff/tif_dirinfo.c,tiffio.h: Remove the obsolete + TIFFMergeFieldInfo/TIFFFindFieldInfo/TIFFFindFieldInfoByName API. + http://bugzilla.maptools.org/show_bug.cgi?id=2315 + + * libtiff/libtiff.def: add some missing (64bit) APIs. + http://bugzilla.maptools.org/show_bug.cgi?id=2316 + +2011-04-09 Bob Friesenhahn + + * libtiff 4.0.0beta7 released. + +2011-04-09 Bob Friesenhahn + + * configure.ac: Should use AC_CANONICAL_HOST since host specifies + the run-time target whereas target is used to specify the final + output target if the package is a build tool (like a compiler), + which libtiff is not. Resolves libtiff bug 2307 "Use + AC_CANONICAL_HOST macro". + +2011-04-02 Bob Friesenhahn + + * configure.ac: Support configuring TIFF_INT64_FORMAT and + TIFF_UINT64_FORMAT appropriately for MinGW32. + + * tools/tiffdump.c (ReadDirectory): MinGW32 needs to use WIN32 + printf conventions for 64-bit types because it uses the WIN32 CRT. + + * libtiff/{tif_dumpmode.c,tif_luv.c,tif_lzw.c,tif_print.c, + tif_read.c,tif_strip.c,tif_thunder.c}: MinGW32 needs to use WIN32 + printf conventions for 64-bit types because it uses the WIN32 CRT. + + * tools/tiff2pdf.c (t2p_write_pdf_string): Fix printf syntax not + understood by WIN32 CRT. + + * libtiff/tif_ojpeg.c: Fixes to compile with MinGW32 GCC. + + * tools/fax2ps.c (main): Use tmpfile() rather than mkstemp() since + it is much more portable. Tmpfile is included in ISO/IEC + 9899:1990 and the WIN32 CRT. + +2011-03-26 Frank Warmerdam + + * tools/tiffset.c: add -d and -sd switches to allow operation on + a particular directory, not just the first (jef). + +2011-03-21 Frank Warmerdam + + * libtiff/tif_thunder.c: Correct potential buffer overflow with + thunder encoded files with wrong bitspersample set. The libtiff + development team would like to thank Marin Barbella and TippingPoint's + Zero Day Initiative for reporting this vulnerability (ZDI-CAN-1004, + CVE-2011-1167). + http://bugzilla.maptools.org/show_bug.cgi?id=2300 + +2011-03-10 Frank Warmerdam + + * libtiff/tif_fax3.h: Fix to last change allowing zero length + runs at the start of a scanline - needed for legal cases. + +2011-03-02 Frank Warmerdam + + * libtiff/tif_fax3.h: Protect against a fax VL(n) codeword commanding + a move left. Without this, a malicious input file can generate an + indefinitely large series of runs without a0 ever reaching the right + margin, thus overrunning our buffer of run lengths. Per CVE-2011-0192. + This is a modified version of a patch proposed by Drew Yao of Apple + Product Security. It adds an unexpected() report, and disallows the + equality case, since emitting a run without increasing a0 still allows + buffer overrun. + +2011-02-23 Frank Warmerdam + + * libtiff/tif_jpeg.c: avoid divide by zero in degenerate case (#2296) + + * tools/tiff2rgba.c: close source file on error to make leak + detection easier. + + * libtiff/tif_getimage.c: avoid leaks if TIFFRGBAImageBegin() fails. + + http://bugzilla.maptools.org/show_bug.cgi?id=2295 + +2011-02-22 Frank Warmerdam + + * libtiff/tif_lzma.c: Maintain tif_rawcc/tif_rawcp (CHUNKY_STRING_READ + _SUPPORT) + +2011-02-18 Frank Warmerdam + + * configure.ac, configure: Added support for --enable-chunky-strip-read + configure option to enable the experimental feature from a couple + months ago for reading big strips in chunks. + + * configure.ac, tif_read.c, tif_readdir.c, tif_dir.h, tiffiop.h, + tif_write.c, tif_print.c, tif_jpeg.c, tif_dirwrite.c, tif_write.c: + Implement optional support for deferring the load of strip/tile + offset and size tags for optimized scanning of directories. Enabled + with the --enable-defer-strile-load configure option (DEFER_STRILE_LOAD + #define in tif_config.h). + +2011-02-11 Frank Warmerdam + + * libtiff/tif_print.c: remove unused variable. + +2011-02-09 Frank Warmerdam + + * libtiff/tif_win32.c: avoid error/warning buffer overrun problem + with non-console (popup message) builds on win32. + + http://bugzilla.maptools.org/show_bug.cgi?id=2293 + +2011-01-24 Olivier Paquet + + * libtiff/{tif_dir.{h,c}, tif_dirinfo.c, tif_dirread.c, tif_dirwrite.c, + tif_print.c, tiff.h, tiffiop.h} : Added support for + TIFFTAG_SMINSAMPLEVALUE and TIFFTAG_SMAXSAMPLEVALUE to have different + values for each sample. Presents the min/max of all samples by default for + compatibility. TIFFSetField/TIFFGetField can be made to handle those tags + as arrays by changing the new TIFFTAG_PERSAMPLE pseudo tag. + http://www.asmail.be/msg0055458208.html + +2011-01-06 Frank Warmerdam + + * libtiff/tif_pixarlog.c: Note that tif_rawcc/tif_rawcp are not + maintained. + + * libtiff/tif_zip.c: Maintain tif_rawcc/tif_rawcp when decoding + for CHUNKY_STRIP_READ_SUPPORT. + + * libtiff/tif_jpeg.c: ensure that rawcc and rawcp are maintained + during JPEGPreDecode and JPEGDecode calls. + * libtiff/tif_read.c: larger read ahead for CHUNKY_STRIP_READ_SUPPORT, + as compression formats like JPEG keep 16 lines interleaved in a sense + and might need to touch quite a bit of data. + + http://trac.osgeo.org/gdal/ticket/3894 + +2011-01-03 Lee Howard + + * libtiff/tif_jpeg.c: Fix regressions with 2 and 3 band images + caused by commit on 2010-12-14. Submitted by e-mail from + Even Rouault + +2010-12-31 Olivier Paquet + + * libtiff/tif_dirwrite.c: Fixed writing of TIFFTAG_REFERENCEBLACKWHITE. + http://bugzilla.maptools.org/show_bug.cgi?id=2266 + +2010-12-23 Andrey Kiselev + + * tools/tiffcp.c, man/tiffcp.1: Added support for specifying the + compression level parameter (preset) for Deflate and LZMA encoders, + e.g "-c lzma:p1" or "-c zip:p9". + + * libtiff/tif_lzma.c: Properly set the LZMA2 compression level + (preset) in LZMAVSetField(). + +2010-12-18 Bob Friesenhahn + + * libtiff/Makefile.am (libtiff_la_SOURCES): Added tif_lzma.c to + Makefile. + +2010-12-14 Andrey Kiselev + + * configure.ac, libtiff/{tif_codec.c, tif_config.h.in, tiff.h, + tiffiop.h, tif_lzma.c}, tools/tiffcp.c, man/tiffcp.1: Implement a new + TIFF compression scheme LZMA reserving a new value 34925 for + Compression tag. As per + bug http://bugzilla.maptools.org/show_bug.cgi?id=2221 + +2010-12-14 Lee Howard + + * libtiff/tif_dirread.c: tolerate some cases where + FIELD_COLORMAP is missing + http://bugzilla.maptools.org/show_bug.cgi?id=2189 + +2010-12-14 Lee Howard + + * libtiff/tif_read.c: change read_ahead to tmsize_t + http://bugzilla.maptools.org/show_bug.cgi?id=2222 + +2010-12-14 Lee Howard + + * configure.ac, libtiff/Makefile.am: Build tif_win32.c on + Windows except on Cygwin + http://bugzilla.maptools.org/show_bug.cgi?id=2224 + +2010-12-14 Lee Howard + + * tools/gif2tiff.c: fix buffer overrun + http://bugzilla.maptools.org/show_bug.cgi?id=2270 + +2010-12-14 Lee Howard + + * libtiff/tif_jpeg.c: reduce usage of JCS_UNKNOWN in order + to improve compatibility with various viewers + submitted by e-mail from Dwight Kelly + +2010-12-13 Lee Howard + + * tools/fax2ps.c: be consistent with page-numbering + http://bugzilla.maptools.org/show_bug.cgi?id=2225 + +2010-12-13 Lee Howard + + * libtiff/tif_color.c: prevent crash in handling bad TIFFs + resolves CVE-2010-2595 + http://bugzilla.maptools.org/show_bug.cgi?id=2208 + +2010-12-13 Lee Howard + + * tools/tiffcrop.c: new release by Richard Nolde + http://bugzilla.maptools.org/show_bug.cgi?id=2004 + +2010-12-12 Lee Howard + + * tools/tiff2pdf.c: fix colors for images with RGBA + interleaved data + http://bugzilla.maptools.org/show_bug.cgi?id=2250 + +2010-12-12 Lee Howard + + * libtiff/tif_dirread.c: fix for Zeiss LSM and Canon CR2 files + http://bugzilla.maptools.org/show_bug.cgi?id=2164 + +2010-12-11 Lee Howard + + * tools/tiff2pdf.c: remove invalid duplication for Lab + http://bugzilla.maptools.org/show_bug.cgi?id=2162 + +2010-12-11 Lee Howard + + * libtiff/tif_jpeg.c: fix use of clumplines calculation + http://bugzilla.maptools.org/show_bug.cgi?id=2149 + +2010-12-11 Lee Howard + + * tools/fax2ps.c: replace unsafe tmpfile() with mkstemp() + http://bugzilla.maptools.org/show_bug.cgi?id=2118 + +2010-12-11 Lee Howard + + * libtiff/tif_ojpeg.c, libtiff/tif_pixarlog.c, + libtiff/tif_zip.c: fix build errors for VC6 + http://bugzilla.maptools.org/show_bug.cgi?id=2105 + +2010-12-11 Lee Howard + + * libtiff/tif_stream.cxx: warnings cleanup + http://bugzilla.maptools.org/show_bug.cgi?id=2091 + * libtiff/tif_dirread.c: warnings cleanup + http://bugzilla.maptools.org/show_bug.cgi?id=2092 + +2010-12-11 Lee Howard + + * tools/tiff2pdf.c: add fill-page option + http://bugzilla.maptools.org/show_bug.cgi?id=2051 + +2010-12-11 Lee Howard + + * libtiff/tif_dirread.c: modify warnings + http://bugzilla.maptools.org/show_bug.cgi?id=2016 + +2010-12-11 Lee Howard + + * libtiff/tif_ojpeg.c: fix buffer overflow on problem data + http://bugzilla.maptools.org/show_bug.cgi?id=1999 + +2010-12-11 Lee Howard + + * tools/tiffinfoce.c: strip byte counts are uint64* now + +2010-12-11 Lee Howard + + * libtiff/tif_ojpeg.c: fix crash when reading a TIFF with a zero + or missing byte-count tag + * tools/tiffsplit.c: abort when reading a TIFF without a byte-count + per http://bugzilla.maptools.org/show_bug.cgi?id=1996 + +2010-12-08 Lee Howard + + * libtiff/tif_dirread.c: fix crash when reading a badly-constructed + TIFF per http://bugzilla.maptools.org/show_bug.cgi?id=1994 + +2010-12-06 Lee Howard + + * libtiff/tif_open.c: Fix mode check before opening a file. + http://bugzilla.maptools.org/show_bug.cgi?id=1906 + +2010-11-27 Bob Friesenhahn + + * libtiff-4.pc.in: Added libtiff pkg-config .pc file support. + Patch by Vincent Torri. + +2010-10-21 Frank Warmerdam + + * tools/tiffinfo.c: avoid direct reference to _TIFFerrorHandler. + + * libtiff/tif_config.vc.h: define snprintf to _snprintf for tiff2pdf. + + * libtiff/libtiff.def: export _TIFFCheckMalloc for tools. + +2010-09-25 Lee Howard + + * tools/tiff2ps.c: improvements and enhancements from Richard Nolde + with additional command line options for Document Title, + Document Creator, and Page Orientation + +2010-07-13 Bob Friesenhahn + + * tools/tiffcrop.c: Patch from Richard Nolde to avoid a + potentially unterminated buffer due to using an exceptionally long + file name. + +2010-07-08 Andrey Kiselev + + * tools/tiff2pdf.c: Fixed ID buffer filling in + t2p_write_pdf_trailer(), thanks to Dmitry V. Levin. + +2010-07-07 Andrey Kiselev + + * libtiff/tif_dirread.c: Really reset the tag count in CheckDirCount() + to expected value as the warning message suggests. As per bug + http://bugzilla.maptools.org/show_bug.cgi?id=1963 + +2010-07-06 Andrey Kiselev + + * tools/tiffset.c: Properly handle TIFFTAG_PAGENUMBER, + TIFFTAG_HALFTONEHINTS, TIFFTAG_YCBCRSUBSAMPLING, TIFFTAG_DOTRANGE + which should be set by value. + + * libtiff/tif_dirinfo.c: Don't use assertions in _TIFFFieldWithTag() + and _TIFFFieldWithName() if the tag is not found in the tag table. + This should be normal situation and returned NULL value should be + properly handled by the caller. + +2010-07-02 Andrey Kiselev + + * libtiff/tif_getimage.c: Avoid wrong math du to the signed/unsigned + integer type conversions. As per bug + http://bugzilla.maptools.org/show_bug.cgi?id=2207 + + * tools/{tiff2bw.c, thumbnail.c, pal2rgb.c}: Fix the count for + WhitePoint tag as per bug + http://bugzilla.maptools.org/show_bug.cgi?id=2042 + + * libtiff/tif_getimage.c: Check the number of samples per pixel when + working with YCbCr image in PickContigCase(). As per bug + http://bugzilla.maptools.org/show_bug.cgi?id=2216 + + * libtiff/tif_dir.c: Set the bogus post-decoding hook when processing + TIFFTAG_BITSPERSAMPLE in _TIFFVSetField() for the case of 8 bit when + we don't need any post-processing. That helps to reset the hook if we + previously set this field to some other value and the hook was + initialized accordingly. As per bug + http://bugzilla.maptools.org/show_bug.cgi?id=2035 + +2010-07-01 Andrey Kiselev + + * tools/tiffgt.c: Properly check the raster buffer allocations for + integer overflows. As per bug + http://bugzilla.maptools.org/show_bug.cgi?id=2108 + + * m4/acinclude.m4: Update GL/GLU/GLUt/Pthread macros from the + upstream. + + * libtiff/{tif_aux.c, tif_strip.c, tif_tile.c, tiffiop.h}: Move + multiply_32() and multiply_64() functions into tif_aux.c file and + rename them into _TIFFMultiply32() and _TIFFMultiply64() respectively. + +2010-06-30 Andrey Kiselev + + * tools/tiff2pdf.c: Better generation of ID field in + t2p_write_pdf_trailer(). Get rid of GCC aliasing warnings. + + * tools/tiff2pdf.c: Fixed computation of the tile buffer size when + converting JPEG encoded tiles. + + * tools/tiff2pdf.c: Better handling of string fields, use static + string buffers instead of dynamically allocated, use strncpy() instead + of strcpy(), control the string lengths. + +2010-06-25 Andrey Kiselev + + * tools/tiffcp.c: Initialize buffer arrays with zero to avoid + referencing to uninitialized memory in some cases (e.g. when tile size + set bigger than the image size). + +2010-06-15 Bob Friesenhahn + + * tools/tiffcrop.c: Patch from Richard Nolde. Reject YCbCr + subsampled data since tiffcrop currently doesn't support it. Fix + JPEG support. + +2010-06-13 Frank Warmerdam + + * libtiff/tif_dirinfo.c: Fix invocation of tag compare function (#2201) + + * tools/tiff2pdf.c: Fix assorted bugs in tiff2pdf: missing "return" + in t2p_read_tiff_size() causes t2p->tiff_datasize to be set entirely + wrong for COMPRESSION_JPEG case, resulting in memory stomp if actual + size is larger. Also, there are a bunch of places that try to + memset() a malloc'd buffer before checking for malloc failure, which + would result in core dump if there actually were a failure. (#2211) + +2010-06-11 Bob Friesenhahn + + * libtiff/tiffiop.h (TIFFSafeMultiply): Need more castings to + avoid compiler warnings if parameter types are not sign + consistent. + + * libtiff 4.0.0alpha6 released. + + * tools/tiffcrop.c: Applied patch from Richard Nolde: Corrected + European page size dimensions. Added an option to allow the user + to specify a custom page size on the command line. Fix the case + where a page size specified with a fractional part was being + coerced to an integer by retyping the variables that define the + paper size. + + * html/index.html: Update for the 3.9.3 release. + + * tools/tiffcp.c (tiffcp): Applied Tom Lane's patch to reject + YCbCr subsampled data since tiffcp currently doesn't support it. + http://bugzilla.maptools.org/show_bug.cgi?id=2097 + + * Update libtool to version 2.2.10. + +2010-06-10 Bob Friesenhahn + + * libtiff/tiffiop.h (TIFFSafeMultiply): Work properly if + multiplier is zero. + +2010-06-09 Bob Friesenhahn + + * libtiff/tif_fax3.c (Fax3SetupState): Yesterday's fix for + CVE-2010-1411 was not complete. + + * libtiff/tiffiop.h (TIFFSafeMultiply): New macro to safely + multiply two integers. Returns zero if there is an integer + overflow. + + * tools/tiffcp.c (main): tiffcp should not leak memory if an error + is reported when reading the input file. + +2010-06-08 Bob Friesenhahn + + * Update libtool to version 2.2.8. + + * libtiff/tif_fax3.c (Fax3SetupState): Avoid under-allocation of + buffer due to integer overflow in TIFFroundup() and several other + potential overflows. In conjunction with the fix to TIFFhowmany(), + fixes CVE-2010-1411. + + * libtiff/tiffiop.h (TIFFhowmany): Return zero if parameters would + result in an integer overflow. This causes TIFFroundup() to also + return zero if there would be an integer overflow. + + * contrib: Add an emacs formatting mode footer to all source files + so that emacs can be effectively used. + +2010-06-03 Oliver Chen Feng + + * libtiff/tools/tiffcp.c: add a new option -x to force merged tiff + file PAGENUMBER value in sequence for users who care the page + sequence, this will also prevent tiff2pdf from creating pdf file from + the merged tiff file with wrong page sequence. + +2010-05-08 Olivier Paquet + + * libtiff/tif_dirread.c: Restored TIFFReadDirEntryFloat function in order + to add missing TIFF_SETGET_FLOAT case to TIFFFetchNormalTag. + * libtiff/tif_dirinfo.c: Use correct set_field_type for + TIFFTAG_PIXAR_FOVCOT so it is readable again (regression from 3.9.2). + http://bugzilla.maptools.org/show_bug.cgi?id=2192 + +2010-05-07 Frank Warmerdam + + * libtiff/tif_jpeg.c: Ensure that quality is always set in + JPEGPreEncode(), not just when we want to output local tables. + Otherwise the quality used during compression may not be right and + might not match the tables in the tables tag. This bug only occurs + when seeking between directories in the midst of writing blocks. + http://trac.osgeo.org/gdal/ticket/3539 + +2010-05-06 Andrey Kiselev + + * html/man/TIFFGetField.3tiff.html, html/man/TIFFSetField.3tiff.html: + Regenerated from the source. + +2010-05-05 Olivier Paquet + + * libtiff/tif_print.c: Fixed printing of TIFFTAG_REFERENCEBLACKWHITE which + had stopped working. Also made it always print 6 floats instead of + 2*SamplesPerPixel. + http://bugzilla.maptools.org/show_bug.cgi?id=2191 + http://bugzilla.maptools.org/show_bug.cgi?id=2186 + * man/TIFFGetField.3tiff, man/TIFFSetField.3tiff: Fixed doc to reflect the + fact that libtiff considers TIFFTAG_REFERENCEBLACKWHITE to be 6 floats. + +2010-05-05 Frank Warmerdam + + * libtiff/tif_jpeg.c: Fix to use memcmp(), not memcpy() when checking + if the jpeg table was written. This is a fix for the last fix on 04-21. + +2010-04-21 Frank Warmerdam + + * libtiff/tif_jpeg.c: avoid preparing jpeg tables everytime + JPEGSetupEncode() is called if the tables already seem to be + established. This prevents spurious updates and rewriting of + directories with jpegtables when doing updates to existing images. + http://trac.osgeo.org/gdal/ticket/3539 + +2010-04-20 Olivier Paquet + + * libtiff/tif_dirinfo.c: Use correct set_field_type for + TIFFTAG_PIXAR_IMAGEFULLWIDTH, TIFFTAG_PIXAR_IMAGEFULLLENGTH, + TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN and TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA. + They were unreadable with TIFF_SETGET_UNDEFINED, a regression from 3.9.2. + http://bugzilla.maptools.org/show_bug.cgi?id=2139 + +2010-04-10 Bob Friesenhahn + + * libtiff/tif_dir.c (_TIFFVSetField): Add a special error case for + when the tag count value is zero. Error handling is still a + regression since in 3.9.2, empty tags are skipped (with a warning) + rather than returning a hard error and refusing to read the file. + + * tools/ppm2tiff.c (main): While case for parsing comment line + requires extra parenthesis to work as expected. Reported by + Thomas Sinclair. + +2010-04-02 Frank Warmerdam + + * libtiff/tif_read.c (primarily): Add support for + CHUNKY_STRIP_READ_SUPPORT where large strips are + read in chunks for applications using TIFFReadScanline(). + This is intended to make it more practical work with very + large compressed one-strip files. Feature is off by default. + Enable by defining CHUNK_STRIP_READ_SUPPORT as a macro. + http://trac.osgeo.org/gdal/ticket/3514 + +2010-03-31 Frank Warmerdam + + * libtiff/tif_flush.c: Use TIFFRewriteDirectory() when flushing + directories so previously placed directories will be migrated to + the end of file if needed. + +2010-03-30 Frank Warmerdam + + * libtiff/tif_lzw.c: change type of dec_bitsleft field to uint64 + to support operating on strips/tiles of more than 256MB. + http://trac.osgeo.org/gdal/ticket/3512 + +2010-03-10 Bob Friesenhahn + + * libtiff/tif_aux.c (_TIFFCheckRealloc): Improve error message so + that it is clearly a memory allocation error message, and also + includes the size of the allocation request. + +2010-02-22 Lee Howard + + * libtiff/tif_jpeg.c: Do not generate a JPEGTables tag when creating + the JPEG TIFF as is is not required in order to prevent it from + being unused and filled with invalid data. (Leave it to be + generated by later activity.) + http://bugzilla.maptools.org/show_bug.cgi?id=2135 + * tools/tiff2pdf.c: Write the JPEG SOI headers into the TIFF strip + data rather than skipping them. This fixes the ability to view in + Acrobat Reader, Evince, and Ghostscript. + http://bugzilla.maptools.org/show_bug.cgi?id=2135 + * libtiff/tif_fax3.c: Don't return error on badly-terminated MMR + strips. + http://bugzilla.maptools.org/show_bug.cgi?id=2029 + +2009-12-03 Frank Warmerdam + + * libtiff/tif_jpeg.c: Made JPEGDecodeRaw() check for buffer overruns. + Made so that when working with downsampled images a stub function + reporting an error is used for tif_decoderow. We cannot meaningfully + support reading scanlines in this situation. (#1936) + + * libtiff/tif_jpeg.c: Ensure that tif_scanlinesize is computed after + resetting of the upsampling values (gdal:#3259). + http://bugzilla.maptools.org/show_bug.cgi?id=1936 + +2009-11-30 Frank Warmerdam + + * contrib/dbs/tiff-grayscale.c, contrib/tif-palette.c, + tools/ras2tiff.c: Fix resource leaks on error. + http://bugzilla.maptools.org/show_bug.cgi?id=2121 + + * libtiff/tif_{aux.c,dir.c,dir.h,dirinfo.c}: Return to handling + TIFFTAG_REFERENCEBLACKWHITE as a field in the TIFF directory instead + of as a custom(generic) field to avoid a potential reentrancy problem. + http://bugzilla.maptools.org/show_bug.cgi?id=2125 + + * libtiff/tif_color.c, libtiff/tif_getimage.c, libtiff/tiffio.h, + man/TIFFcolor.3tiff: Make TIFFDisplay argument in TIFFCIELabToRGBInit + const, and display_sRGB static and const. + http://bugzilla.maptools.org/show_bug.cgi?id=2124 + +2009-11-04 Bob Friesenhahn + + * libtiff 4.0.0alpha5 released. + +2009-11-03 Bob Friesenhahn + + * tools/tiffcrop.c: Updated tiffcrop from Richard Nolde. This + version has undergone substantial testing with arbitrary sample + bit depths. Also eliminates GCC compilation warnings. + +2009-11-02 Bob Friesenhahn + + * port/libport.h: Add extern declarations for getopt standard + globals. + +2009-10-31 Bob Friesenhahn + + * libtiff/tif_lzw.c (LZWDecode, LZWDecodeCompat): Fix warnings + noticed in 64-bit build of libtiff with Visual Studio 2005. + Resolves "Bug 2067 - Visual Studio 2005 64-bit warnings in + tif_lzw.c", http://bugzilla.maptools.org/show_bug.cgi?id=2067 + + * libtiff/tif_pixarlog.c (PixarLogEncode): Fix non-important + warning noticed in Visual Studio 2005 build. Resolves "Bug 2068 - + Visual Studio 2005 64-bit warning in tif_pixarlog.c", + http://bugzilla.maptools.org/show_bug.cgi?id=2068 + +2009-10-29 Bob Friesenhahn + + * libtiff/tif_dirread.c: Eliminate GCC "dereferencing type-punned + pointer" warnings. + +2009-10-28 Bob Friesenhahn + + * html/tools.html: Add manual page links, and a summary + description of tiffcrop. + +2009-10-07 Bob Friesenhahn + + * configure.ac: x86_64 should use the same fill order as i386. + +2009-09-24 Bob Friesenhahn + + * tools/tiffcrop.c, man/tiffcrop.1: New tiffcrop from Richard + Nolde. Major updates to add significant functionality for reading + and writing tile based images with bit depths not a multiple of 8 + which cannot be handled by tiffcp. + +2009-09-03 Bob Friesenhahn + + * libtiff/tif_ojpeg.c (OJPEGWriteHeaderInfo): IJG JPEG 7 needs + do_fancy_upsampling=FALSE in order to read raw data. Resolves + "Bug 2090 - OJPEG crash with libjpeg v7". + http://bugzilla.maptools.org/show_bug.cgi?id=2090 + +2009-09-03 Frank Warmerdam + + * libtiff/tif_getimage.c: Fixed error recognition handling in RGBA + interface when stoponerror is set. + http://bugzilla.maptools.org/show_bug.cgi?id=2071 + +2009-08-30 Bob Friesenhahn + + * tools/{tiffcrop.c,tiffgt.c}: Applied patch from Oden Eriksson to + fix build with gcc when using the "-Wformat + -Werror=format-security" flags. + +2009-08-29 Bob Friesenhahn + + * test/{bmp2tiff_palette.sh, bmp2tiff_rgb.sh, gif2tiff.sh, + ppm2tiff_pbm.sh, ppm2tiff_pgm.sh, ppm2tiff_ppm.sh}: Additional + utilities tests. + +2009-08-28 Bob Friesenhahn + + * tools/tiffinfo.c: tiffinfo should return error status to the + caller. Register a private error callback to accomplish that. + + * test/Makefile.am (TIFFIMAGES): Add test images in BMP, GIF, and + PNM formats so that we will be able to test more of the tools. + While adding these test images I notice that bmp2tiff and gif2tiff + only support ancient versions of their respective formats. + +2009-08-27 Bob Friesenhahn + + * libtiff 4.0.0alpha4 released. + + * HOWTO-RELEASE: Improved release instructions. + +2009-08-24 Bob Friesenhahn + + * man/{TIFFClose.3tiff,raw2tiff.1,tiffcmp.1,tiffsplit.1}: Applied + fixes for "Bug 2023 - nroff errors in manual pages". + http://bugzilla.maptools.org/show_bug.cgi?id=2023 + + * tools/{rgb2ycbcr.c, tiff2rgba.c}: Applied fixes for "Bug 2079 - + CVE-2009-2347 libtiff: integer overflows in various inter-color + space conversion tools". + http://bugzilla.maptools.org/show_bug.cgi?id=2079 + + * libtiff/tif_print.c (TIFFPrintDirectory): Apply fix from Jay + Berkenbilt for "Bug 2024 - possible null pointer dereference with + one-line fix". + http://bugzilla.maptools.org/show_bug.cgi?id=2024 + + * libtiff/tif_dirread.c (TIFFReadCustomDirectory): Apply patch + from Jay Berkenbilt for "Bug 1895 - logic error in tif_dirread.c: + segfault after setting tdir_tag = IGNORE". + http://bugzilla.maptools.org/show_bug.cgi?id=1895 + +2009-08-23 Bob Friesenhahn + + * test/Makefile.am, test/tiffcrop*.sh: Split previously existing + tiffcrop.sh into a collection of many specific tests. Re-wrote + all of the existing tests to be based on some simple shell + functions. Make distcheck works again. + + Export certain variables (MAKE, MAKEFLAGS, MEMCHECK) to tests and + added 'memcheck' and 'ptrcheck' targets to make it easy to run the + tests under valgrind. + +2009-08-21 Bob Friesenhahn + + * test/tiffcp-logluv.sh: Fix test so that it works with a VPATH + build. + + * test/Makefile.am (AUTOMAKE_OPTIONS): Colorized tests was not + actually activated since it needed to be enabled in this + Makefile.am. Also activated parallel-tests mode since it offers + useful features such as per-test .log files and a summary test + report .log file. + +2009-08-20 Bob Friesenhahn + + * configure.ac: Updated autotools. Autoconf 2.64, Automake 1.11, + libtool 2.2.6. Enabled support for silent build rules + (--enable-silent-rules or 'make V=0') and colorized tests. + + * html/{index.html, v3.9.0.html}: Update for 3.9.0 release. + +2009-06-30 Frank Warmerdam + + * tests/tiffcp-logluv.sh: minimal testing of sgilog compression. + + * tools/tiffcp.c: add -c sgilog support. + + * libtiff/tif_luv.c: correct return codes from encoderow to be + 1 on success instead of zero. + http://bugzilla.maptools.org/show_bug.cgi?id=2069 + + * libtiff/tif_lzw.c: back out patch from #2065 and apply patch from + #1085 for a better underflow fix that errors properly. + http://bugzilla.maptools.org/show_bug.cgi?id=2065 + http://bugzilla.maptools.org/show_bug.cgi?id=1985 + +2009-06-26 Frank Warmerdam + + * libtiff/tif_strip.c: Remove an inappropriate assertion that often + fails on oddly sized 12bit jpeg compressed ycbcr images. + +2009-06-22 Frank Warmerdam + + * libtiff/tif_lzw.c: Fix buffer underflow bug. + http://bugzilla.maptools.org/show_bug.cgi?id=2065 + +2009-06-21 Frank Warmerdam + + * configure.ac, libtiff/tif_jpeg.c, libtiff/tif_jpeg_12.c: add support + for dual mode 8/12 bit jpeg support. + +2009-06-03 Frank Warmerdam + + * libtiff/tif_write.c: do not override the planar configuration to be + contig for one sample files if planar configuration is already set. + http://bugzilla.maptools.org/show_bug.cgi?id=2057 + +2009-06-02 Frank Warmerdam + + * libtiff/libtiff.def: Add TIFFUnsetField. + +2009-05-03 Frank Warmerdam + + * libtiff/{tif_jpeg.c,tif_ojpeg.c,tif_getimage.c}: Fixed various + error reports to use "%s" as format string. + http://trac.osgeo.org/gdal/ticket/2976 + +2009-03-12 Frank Warmerdam + + * libtiff/{tif_fax3.c,tif_jpeg.c,tif_ojpeg.c}: Fix printdir chaining + for some codecs (#2020). + +2009-02-12 Frank Warmerdam + + * libtiff/tif_luv.c: Fix handling of tiled logluv images. + http://bugzilla.maptools.org/show_bug.cgi?id=2005 + +2009-02-09 Frank Warmerdam + + * libtiff/tif_dirread.c: Improve allocation safety when allocated + buffer for large tags. (#1998) Related to (#1993) + +2009-02-06 Frank Warmerdam + + * tools/tiffcrop.c: Don't default image->res_unit to INCH. Now the + test suite should pass. + +2009-02-05 Frank Warmerdam + + * libtiff/tif_dirread.c: Re-incorporated a sanity check on tag size, + but at the 2GB boundary to avoid overflow on 32bit systems. + http://bugzilla.maptools.org/show_bug.cgi?id=1993 + + * libtiff/tif_dirread.c: Remove some assertions that blow due to + corrupt files rather than in response to library internal + inconsistencies. + http://bugzilla.maptools.org/show_bug.cgi?id=1995 + http://bugzilla.maptools.org/show_bug.cgi?id=1991 + + * libtiff/tif_dirread.c: Fixed testing for failed result from + TIFFReadDirectoryFindFieldInfo(). + http://bugzilla.maptools.org/show_bug.cgi?id=1992 + +2009-01-23 Frank Warmerdam + + * libtiff/tif_predict.c: Add support for 32bit integer horz. predictors. + http://bugzilla.maptools.org/show_bug.cgi?id=1911 + + * libtiff/tif_dirwrite.c: Fix byte swapping of next directory offset. + + http://bugzilla.maptools.org/show_bug.cgi?id=1924 + + * tools/tiffcrop.c: initialize xres/yres values. + + * test/*.sh - default ${srcdir} to local directory. + + * test/common.sh - start verbose mode after common settings. + + * libtiff/tif_dirinfo.c: Replace lfind() with local equivelent to + avoid type mismatches on different platforms. + http://bugzilla.maptools.org/show_bug.cgi?id=1889 + +2009-01-22 Frank Warmerdam + + * tools/{fax2tiff.c,thumbnail.c,tiff2pdf.c,tiff2ps.c,tiffdump.c, + tiffsplit.c}: avoid warnings, mostly 32bit/64bit casting issues. + + * port,tools: Introduce libport.h, and include in tools if NEED_LIBPORT + defined, primarily to reduce prototype warnings on windows. + + * libtiff/tif_dirinfo.c,tif_dirread.c: Avoid warnings + about unused parameters, and uninitialized variables. + +2009-01-21 Bob Friesenhahn + + * test/common.sh: Execute tests like 'make VERBOSE=TRUE check' in + order to trace full execution detail while executing the test suite. + +2009-01-20 Frank Warmerdam + + * tools/tiffsplit.c: fix sampleformat to be shortv instead of longv. + +2009-01-20 Bob Friesenhahn + + * test/Makefile.am (CLEANFILES): Make sure that test output files + are removed by 'make clean' + + * Update autotools for 4.0.0 beta3 + + * 4.0.0 beta3 produced. + +2009-01-12 Bob Friesenhahn + + * test/tiffcrop.sh: New test script for tiffcrop from Richard + Nolde. + + * tools/tiff2ps.c: Remove spurious message to stderr. + +2009-01-11 Bob Friesenhahn + + * tools/tiff2ps.c: Incorporated significant functionality update + from Richard Nolde. In particular, support for rotating the image + by 90, 180, 270, and 'auto' has been added. + + * man/tiffcrop.1: Incorporated documentation updates from Richard + Nolde. + + * tools/tiffcrop.c: Incorporated significant functionality update + from Richard Nolde. + +2008-12-31 Bob Friesenhahn + + * libtiff/tiffio.h: GCC will now validate format specifications + for TIFFError(), TIFFErrorExt(), TIFFWarning(), and + TIFFWarningExt() in order to reveal bugs. + + * Many fixes throughout to work better as a 64-bit build. + +2008-12-30 Bob Friesenhahn + + * tools/{tiff2pdf.c, tiff2ps.c, tiffinfo.c}: Offset and length + tags now require 64-bit parameter rather than 32-bit. + + * libtiff/tif_dirread.c: Fixed issues with unaligned access to + 64-bit values. + + * tools/thumbnail.c: Eliminate crash noticed while running test + suite. + +2008-12-29 Bob Friesenhahn + + * libtiff/tif_ojpeg.c (OJPEGLibjpegJpegSourceMgrFillInputBuffer): + Initialize stack variables to avoid compiler warning. + + * tools/tiffinfoce.c (main): Use toff_t for offset type when + retrieving offset of EXIF IFD. + + * libtiff/tiffio.h: Undeprecate toff_t and restore its use in the + TIFFClientOpen() callback and other external function definitions. + + * tools/tiffinfo.c (main): Offset to EXIF IFD requires a 64-bit + type now. Fixes crash when dumping files containing an EXIF IFD. + + * m4/libtool.m4: Update to libtool 2.2.6. + +2008-12-21 Frank Warmerdam + + * libtiff/tif_dir.c, tiffio.h: Introduce TIFFUnsetField() function. + + * libtiff/tif_jpeg.c: Avoid errors if the application writes a full + strip for the last partial strip in a jpeg compressed file. + http://bugzilla.maptools.org/show_bug.cgi?id=1981 + +2008-10-29 Frank Warmerdam + + * libtiff/tif_flush.c: Make sure that BEENWRITING is cleared when + we take the shortcut to only update the strip/tile offsets in place. + http://trac.osgeo.org/gdal/ticket/2621 + +2008-10-21 Andrey Kiselev + + * libtiff/tif_jbig.c: Support the JBIG-KIT 2.0 (compatibility with + the older versions retained). + +2008-10-09 Frank Warmerdam + + * libtiff/tif_jpeg.c: Add #ifdefs for changes needed if using + IPP enabled version of libjpeg from Intel. + http://bugzilla.maptools.org/show_bug.cgi?id=1951 + +2008-09-05 Andrey Kiselev + + * tools/tiffsplit.c: Use byte counts of proper size (uint64). + Required for libtiff 4.0. + + * tools/tiffsplit.c: Use dynamically allocated array instead of static + when constructing output file names. + +2008-09-03 Andrey Kiselev + + * tools/tiffsplit.c: Get rid of unsafe strcpy()/strcat() calls when + doing the filename/path construction. + + * tools/tiff2pdf.c: More appropriate format string in + t2p_write_pdf_string(); avoid signed/unsigned mismatch. + + * libtiff/tif_lzw.c: Properly zero out the codetable. As per bug + + http://bugzilla.maptools.org/show_bug.cgi?id=1929 + + * libtiff/tif_lzw.c: Properly zero out the string table. Fixes + CVE-2008-2327 security issue. + +2008-09-01 Frank Warmerdam + + * libtiff/tif_dirread.c: Avoid unused TIFFReadDirEntryFloat() function. + + * libtiff/tif_dirwrite.c: modified to write IFDs as either IFD8 or IFD + depending on whether the file is bigtiff or classic tiff. + http://bugzilla.maptools.org/show_bug.cgi?id=1917 + +2008-08-12 Edward Lam + + * tools/tiffdump.c: When compiling for Microsoft Windows, apply + consistent (__int64) casting when testing if _lseeki64 has + successfully seeked as requested. This is necessary for large + file support to work since off_t is only 32-bit. + +2008-07-29 Frank Warmerdam + + * tif_strip.c: Replace assertions related to samplesperpixel != 3 or + the subsampling values not being 1, 2 or 4 (for jpeg compressed images) + with control logic to return runtime errors (c/o Even Rouault) (#1927). + +2008-06-17 Frank Warmerdam + + * tools/tiffcrop.c: Fix some portability problems. + + * libtiff/tif_ojpeg.c: Use same jpeg/win32 boolean/FAR hacks as are + used in tif_jpeg.c. + + * libtiff/tif_win32.c: Ensure TIFFOpenW() uses same FILE_SHARE flags + as TIFFOpen(). + +2008-06-01 Frank Warmerdam + + * libtiff/tif_dirwrite.c: Fix alignment problems affecting architectures + like Sparc/Solaris. + http://bugzilla.maptools.org/show_bug.cgi?id=1892 + +2008-05-27 Frank Warmerdam + + * libtiff.def: Add TIFFFindField + http://bugzilla.maptools.org/show_bug.cgi?id=1891 + +2008-05-26 Frank Warmerdam + + * tif_config.*.h, tiffconf.*.h: Remove SIZEOF_LONG definition, unused. + + * li2008-04-15 Andrey Kiselev + +btiff/tif_win32.c: Replace custom Win32 memory api with generic + POSIX one. No apparent value to use of GlobalAlloc() in the modern + age. http://bugzilla.maptools.org/show_bug.cgi?id=1885 + + * libtiff/tiffconf.vc.h: Added JBIG_SUPPORT and MDI_SUPPORT items + in windows version (care of Edward Lam). + +2008-05-24 Frank Warmerdam + + * tif_codec.c: Avoid NULL pointer dereferencing for exotic + compression codec codes. + + * tif_dirwrite.c: fix potential memory leak. + + * tif_dirread.c: Fix unchecked malloc result. + +2008-05-24 Bob Friesenhahn + + * test {tiff2pdf.sh tiff2ps-EPS1.sh tiff2ps-PS1.sh tiff2ps-PS2.sh + tiff2ps-PS3.sh tiffcp-g3-1d-fill.sh tiffcp-g3-1d.sh + tiffcp-g3-2d-fill.sh tiffcp-g3-2d.sh tiffcp-g3.sh tiffcp-g4.sh + tiffcp-split-join.sh tiffcp-split.sh tiffcp-thumbnail.sh + tiffdump.sh tiffinfo.sh}: Added more test scripts based on + suggestions from Lee Howard posted to the tiff list on 13 Sep + 2007. + +2008-05-23 Frank Warmerdam + + * libtiff/tif_fax3.c: Add an assert in an effort to detect a + possible runtime problem reported by coverity. + + * contrib/iptcutil/iptcutil.c: Fixed memory leak of str. + + * tools/tiffcrop.c, man/tiffcrop.1: Major update from Richard Nolde. + http://bugzilla.maptools.org/show_bug.cgi?id=1888 + + * tools/tiffdither.c: remove dead onestrip code. avoid memory leak. + + * tools/rgb2ycbcr.c: fix memory leak of raster buffer. + + * tools/tiffcp.c: Simplify inknames code to avoid pointless test. + Cleanup scanline allocation to avoid coverity warning. + + * tools/thumbnail.c: Check for TIFFOpen() failure. + +2008-05-18 Frank Warmerdam + + * libtiff/tif_dirinfo.c: Use TIFF_SETGET_ASCII for PIXAR_TEXTUREFORMAT + and PIXAR_WRAPMODES instead of TIFF_SETGET_UNDEFINED. Not exactly clear + why this is needed. + +2008-05-09 Bob Friesenhahn + + * Makefile.am (ACLOCAL_AMFLAGS): Libtool 2.2.4 does not like + "ACLOCAL_AMFLAGS=-I ./m4". It wants "ACLOCAL_AMFLAGS=-I m4". + +2008-04-15 Andrey Kiselev + + * test/: Test suite updated. Everything is passed now. + + * libtiff/tif_dirinfo.c: Fixed description of the + TIFFTAG_NUMBEROFINKS tag. + +2008-04-14 Andrey Kiselev + + * libtiff/{tif_dirread.c, tif_dirwrite.c, tiffiop.h}: + Get rid of some of "dereferencing type-punned" warnings by converting + tdir_offset field of TIFFDirEntry structure into union. + +2008-04-10 Andrey Kiselev + + * libtiff/{tif_flush.c, tif_dirwrite.c, tiffio.h, tiffiop.h}: + TIFFRewriteField() renamed into _TIFFRewriteField() and moved out + from the public interface. Type of its 'count' parameter changed + from uint32 to tmsize_t. + + * /libtiff/tiffiop.h: Make tif_nfields and tif_nfieldscompat fields + of the tiff structure have the size_t type instead of uint32. + +2008-04-09 Andrey Kiselev + + * tools/tiffdump.c: Added support for MSVS 6.0. + + * libtiff/tif_dirread.c: Use custom functions _TIFFUInt64ToFloat() + and _TIFFUInt64ToDouble() to convert 64-bit integers into floating + point values on MSVS 6.0 platform. + +2008-03-14 Frank Warmerdam + + * tif_dirread.c: Removed sanity checks on tags larger than 4MB in + TIFFReadDirEntryArray() since they are interfering with seemingly + legitimate files. http://trac.osgeo.org/gdal/ticket/2005 + +2008-02-09 Joris Van Damme + + * tif_dirread.c: Added handling for the case of number of values for + PageNumber tag different from 2 (previously resulted in an assert + indicating lack of handling and was forgotten about) + +2008-02-01 Frank Warmerdam + + * libtiff/tif_jpeg.c: Do not try to fixup subsampling tags based on + the actual jpeg data stream if the first strip/tile has zero size. + This is the case when GDAL creates a new file with zero sizes, closes + and reopens it. + +2008-01-07 Frank Warmerdam + + * tools/tiff2ps.c: fix up 64bit issues (from Edward Lam). + +2008-01-01 Frank Warmerdam + + * libtiff/tif_dirwrite.c: #ifdef out lots of unused functions. + + * Makefile.vc, libtiff/Makefile.vc, tools/Makefile.vc: Improve clean + targets. + + * tools/tiffinfo.c, tools/tiffcmp.c, tools/gif2tiff.c, tools/bmp2tiff.c + tools/tiff2pdf.c: Fix 64-bit warnings when compiling under MSVC 2005 + (x64). + + * tools/tiffset.c: Changes to reflect the fact that TIFFFieldWithTag() + and TIFFFieldWithName() now return TIFFField pointers instead of + TIFFFieldInfo pointers. + + * tools/tiffdump.c: Added ssize_t typedef on Windows since it doesn't + exist. This makes it compile again on Windows + + * tif_aux.c, tif_getimage.c, tif_next.c, tif_predict.c, tif_win32.c, + tiffconf.vc.h: Various 64bit fixes from Edward Lam identified on win64. + + * test/rewrite_tag.c: New test for TIFFRewriteField(). + +2007-12-31 Frank Warmerdam + + * tif_dirwrite.c: Added TIFFRewriteField(). This new function + rewrites one field "on disk" updating an existing directory + entry. Lots of limitations still... + + * tiffiop.h, tif_write.c, tif_dirread.c, tif_flush.c: Keep track of + TIFF_DIRTYSTRIP separately from TIFF_DIRTYDIRECT to indicate that + the strip offset/size values are dirty but nothing else about the + directory is dirty. In flush handle "just stripmaps dirty" as a + special case that just rewrites these values without otherwise + modifying the directory on disk using TIFFRewriteField(). + + We also modify logic so that in update mode the directory is not + marked dirty on read, but only when something is changed. This + means we need to keep track of updates to the stripmap stuff in + TIFFAppendToStrip(). + +2007-12-10 Frank Warmerdam + + * tif_jpeg.c: Improve ability to switch between encoding and decoding + in the jpeg code (gdal bug #2033). + +2007-11-23 Frank Warmerdam + + * tif_dir.c, tif_dirread.c, tif_dirwrite.c, tif_read.c, tif_write.c, + tiffiop.h: Added TIFF_BUF4WRITE flag to indicate if contents of the + rawcp/rawcc buffer are for writing and thus may require flushing. + Necessary to distinguish whether they need to be written to disk when + in mixed read/write mode and doing a mixture of writing followed by + reading. http://trac.osgeo.org/gdal/ticket/1758 + +2007-11-23 Andrey Kiselev + + * configure.com, libtiff/tif_vms.c: Better OpenVMS support. Patches + from Alexey Chupahin. + +2007-11-02 Frank Warmerdam + + * tif_write.c: Rip out the fancy logic in TIFFAppendToStrip() for + establishing if an existing tile can be rewritten to the same location + by comparing the current size to all the other blocks in the same + directory. This is dangerous in many situations and can easily + corrupt a file. (observed in esoteric GDAL situation that's hard to + document). This change involves leaving the stripbytecount[] values + unaltered till TIFFAppendToStrip(). Now we only write a block back + to the same location it used to be at if the new data is the same + size or smaller - otherwise we move it to the end of file. + + * tif_dirwrite.c: Try to avoid writing out a full readbuffer of tile + data when writing the directory just because we have BEENWRITING at + some point in the past. This was causing odd junk to be written out + in a tile of data when a single tile had an interleaving of reading + and writing with reading last. (highlighted by gdal + autotest/gcore/tif_write.py test 7. + + * tif_predict.c: use working buffer in PredictorEncodeTile to avoid + modifying callers buffer. + http://trac.osgeo.org/gdal/ticket/1965 + + * tif_predict.c/h: more fixes related to last item, keeping a + distinct pfunc for encode and decode cases as these were getting + mixed up sometimes. + http://trac.osgeo.org/gdal/ticket/1948 + +2007-11-01 Frank Warmerdam + + * tif_predict.c/h, tif_lzw.c, tif_zip.c: Improvements so that + predictor based encoding and decoding works in read-write update + mode properly. + http://trac.osgeo.org/gdal/ticket/1948 + +2007-10-24 Joris Van Damme + + * tif_dirread.c: Fixed problem with bogus file triggering + assert(td->td_planarconfig == PLANARCONFIG_CONTIG) in + ChopUpSingleUncompressedStrip + +2007-10-22 Joris Van Damme + + * tif_jpeg.c: Resolved buffer incrementation bug that lead to faulty images + at best, access violation at worst, when subsampled JPEG compressed imagery + is decoded without the JPEG_COLORMODE feature + +2007-10-11 Frank Warmerdam + + * html/index.html: Update "people responsible" section. + +2007-10-05 Frank Warmerdam + + * tools/tiff2pdf.c: Fix problem with alpha setting in some cases + as reported on the mailing list. + +2007-10-01 Joris Van Damme + + * changed some more incorrect %lud printf flags to %lu + +2007-09-29 Joris Van Damme + + * tif_dirread.c: Strip chopping interfered badly with uncompressed + subsampled images because it tried to divide subsampled rowblocks, + leading to all sorts of errors throughout the library for these + images. Fixed by making strip chopping divide in row counts that + are a multiple of vertical subsampling value. + +2007-09-28 Joris Van Damme + + * tif_dirread.c: Logical cast working around compiler warning + + * tif_read.c: Correction of some error flags and parameter lists + +2007-09-27 Joris Van Damme + + * tif_dirread.c: Made calculation of td_maxsamplevalue more robust + when dealing with large bitspersample values, shutting up purification + tools that warn about truncation, though it remains incorrect and + indicates a conceptual problem there. + + * tif_open.c: Moved early exit in case of 'h' flag (to disable reading + of first IFD) to proper place because it badly interfered with memory + mapping, resulting in mapping flag even with dummy mapping functions + that returned 0 whilst at the same time the mapping tif_size wasn't + set, thus resulting in continuous incorrect beyond-eof errors. + +2007-09-24 Joris Van Damme + + * tif_dirinfo.c: Fixed (MSVC) compiler reports about + inconsistent use of const in tiffFields and exifFields definition + +2007-09-20 Frank Warmerdam + + * tif_dirwrite.c: Always write tile/strip offsets and sizes + using LONG8 type when output format is BigTIFF. The + TIFFWriteDirectoryTagLongLong8Array() function was restructured + accordingly. + + * tif_dirread.c: Improvements to error reporting text in + TIFFFetchDirectory(). + +2007-09-19 Bob Friesenhahn + + * test/images: Added a small collection of test images for use by + test programs and scripts. + * test/tiffinfo.sh: A trivial example test script. + * test/common.sh: Added small script for setting the environment + used by script-based tests. + +2007-08-24 Frank Warmerdam + + * tif_dirwrite.c: Write the tif_nextdiroff value instead of a fixed + zero when writing directory contents to preserve the ability to + rewrite directories in place, even in the middle of a directory + chain. + + * tif_dirinfo.c: _TIFFMergeFields() now only merges in field + definitions that are missing. Existing definitions are silently + ignored. + + * tif_dirread.c: Add runtime error for fields for which no definition + is found (in addition to an assert for developers) in + TIFFFetchNormalTag(). Not sure if this is needed, but it seems + prudent. + +2007-08-10 Joris Van Damme + + * libtiff/tif_getimage.c: removed SubsamplingHor and SubsamplingVer + from _TIFFRGBAImage structure to revert unwanted ABI change. + +2007-08-10 Joris Van Damme + + * libtiff/tif_win32.c: use SetFilePointer instead of + SetFilePointerEx, as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1580 + +2007-07-19 Andrey Kiselev + + * libtiff/tif_stream.cxx: Put all callback functions declarations + inside extern "C" block. + + * libtiff/{tif_lzw.c, tif_luv.c, tif_dumpmode.c, tif_print.c, + tif_read.c, tif_strip.c, tif_thunder.c}: Use "%I64d" printf() + formatter instead of "%lld" with MSVC compiler. + + * libtiff/{tiffiop.h, tif_aux.c}: Added _TIFFUInt64ToFloat() and + _TIFFUInt64ToDouble() functions. + +2007-07-18 Andrey Kiselev + + * libtiff/tif_dirread.c: Handle the case of MSVC 6 when using 64-bit + integer constants. + + * libtiff/{Makefile.am, Makefile.v}: Do not distribute tiffconf.h, + remove tif_config.h/tiffconf.h during cleaning. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1573 + + * libtiff/tif_unix.c: Do not use O_LARGEFILE. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1577 + +2007-07-13 Andrey Kiselev + + * libtiff 4.0.0alpha released. + +2007-07-12 Andrey Kiselev + + * tools/tiff2pdf.c: Added missed extern optind as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1567 + + * libtiff/{tif_close.c, tif_dirinfo.c, tiffiop.c, tif_dirread.c, + tif_dir.h, tif_dir.c, tiffio.h}: Transition to the new-style tag + extending scheme completed. + +2007-07-11 Bob Friesenhahn + + * libtiff/tif_stream.cxx: Adapt to use toff_t again. Update to + use standard C++ library size types and attempt to detect overflow + cases. + +2007-07-08 Andrey Kiselev + + * libtiff/{tif_jpeg.c, tif_dir.h, tif_dir.c, tif_dirinfo.c, tiffio.h, + tif_ojpeg.c, tif_print.c, tif_fax3.c, tif_dirread.c}: More work on new + tag extending scheme. Use the new scheme everywhere. + + * libtiff/{tif_zip.c, tif_predict.c, tif_pixarlog.c, tif_luv.c, + tif_fax3.c, tif_dirread.c, tif_dirwrite.c, tif_close.c, tif_ojpeg.c, + tif_jpeg.c, tif_dirinfo.c, tif_dir.h, tiffio.h, tiffiop.h}: + TIFFFIeldInfo structure replaced with TIFFField structure. + TIFFFieldInfo retained for the backward compatibility. + +2007-07-05 Bob Friesenhahn + + * tools/tiff2pdf.c: Fix a compile problem when JPEG_SUPPORT is not + defined. + +2007-07-04 Andrey Kiselev + + * libtiff/{tif_dir.c, tiff.h, tiffio.h, libtiff.def}: Unused + TIFFReassignTagToIgnore() function and TIFFIgnoreSense enumeration + removed. + + * libtiff/{tif_dirinfo.c, tif_fax3.c, tif_jbig.c, tif_jpeg.c}: Move + tags TIFFTAG_FAXRECVPARAMS, TIFFTAG_FAXSUBADDRESS, + TIFFTAG_FAXRECVTIME and TIFFTAG_FAXDCS to the common tag directory. + These tags are not codec-specific and relate to image content, so + process them as other normal tags. + + * libtiff/{tiffio.h, tif_dir.h}: TIFFTagValue structure moved from the + public tiffio.h to private tif_dir.h. + + * contrib/{acorn, mac-cw, mac-mpw}: Removed as unmaintained and + outdated. + +2007-07-03 Andrey Kiselev + + * libtiff{tif_acorn.c, tif_apple.c, tif_atari.c, tif_msdos.c, + tif_win3.c}: Obsoleted portability stuff removed. + + * tools/tiff2ps.c: Added support 16-bit images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1566 + + Patch from William Bader. + + * tools/tiff2pdf.c: Fix for TIFFTAG_JPEGTABLES tag fetching and + significant upgrade of the whole utility as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1560 + + Now we don't need tiffiop.h in tiff2pdf anymore and will open output + PDF file using TIFFClientOpen() machinery as it is implemented + by Leon Bottou. + +2007-06-26 Bob Friesenhahn + + * configure.ac: Fix typo when substituting value for unsigned 8 bit type. + Added support for a TIFF_PTRDIFF_T type to use when doing pointer arithmetic. + Added support for a TIFF_SSIZE_T in order to return memory sizes but still + allow returning -1 for errors. + * libtiff/tiffconf.vc.h: Add porting type defintions for WIN32. + +2007-06-25 Bob Friesenhahn + + * port/strtoull.c: New porting function in case strtoull() is not + available on the target system. + * configure.ac: Add configure support for determining sized types + in a portable way and performing necessary substitutions in + tif_config.h and tiffconf.h. Updated tiff.h to use the new + definitions. + +2007-04-27 Andrey Kiselev + + * tools/tiff2pdf.c: Check the tmpfile() return status as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=154 + +2007-04-07 Andrey Kiselev + + * libtiff/{tif_dir.h, tif_dirread.c, tif_dirinfo.c, tif_jpeg.c, + tif_fax3.c, tif_jbig.c, tif_luv.c, tif_ojpeg.c, tif_pixarlog.c, + tif_predict.c, tif_zip.c}: Finally fix bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1274 + + by introducing _TIFFMergeFieldInfo() returning integer error status + instead of void in case of problems with field merging (e.g., if the + field with such a tag already registered). TIFFMergeFieldInfo() in + public API remains void. Use _TIFFMergeFieldInfo() everywhere and + check returned value. + +2007-04-07 Frank Warmerdam + + * contrib/addtiffo/tif_overview.c: Fix problems with odd sized output + blocks in TIFF_DownSample_Subsampled() (bug 1542). + +2007-04-06 Frank Warmerdam + + * libtiff/tif_jpeg.c: Changed JPEGInitializeLibJPEG() so that it + will convert from decompressor to compressor or compress to decompress + if required by the force arguments. This works around a problem in + where the JPEGFixupTestSubsampling() may cause a decompressor to + be setup on a directory when later a compressor is required with the + force flag set. Occurs with the addtiffo program for instance. + +2007-04-06 Andrey Kiselev + + * tools/tiffcrop.c, man/tiffcrop.1: Significant update in + functionality from Richard Nolde. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1525 + +2007-03-28 Frank Warmerdam + + * libtiff/tif_fax3.c: "inline static" -> "static inline" for IRIC CC. + +2007-03-17 Joris Van Damme + + * start of BigTIFF upgrade - CVS HEAD unstable until further notice + +2007-03-07 Joris Van Damme + + * libtiff/tif_getimage.c: workaround for 'Fractional scanline' error reading + OJPEG images with rowsperstrip that is not a multiple of vertical subsampling + factor. This bug is mentioned in: + http://bugzilla.remotesensing.org/show_bug.cgi?id=1390 + http://www.asmail.be/msg0054766825.html + +2007-03-07 Joris Van Damme + + * libtiff/tif_win32.c: made inclusion of windows.h unconditional + + * libtiff/tif_win32.c: replaced preprocessor indication for consiously + unused arguments by standard C indication for the same + +2007-02-27 Andrey Kiselev + + * libtiff/tif_dirread.c: Use uint32 type instead of tsize_t in byte + counters in TIFFFetchData(). Should finally fix the issue + + http://bugzilla.remotesensing.org/show_bug.cgi?id=890 + +2007-02-24 Andrey Kiselev + + * tools/tiffset.c: Properly handle tags with TIFF_VARIABLE writecount. + As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1350 + + * libtiff/tif_dirread.c: Added special function to handle + SubjectDistance EXIF tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1362 + + * tools/tiff2pdf.c: Do not assume inches when the resolution units + do not specified. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1366 + + * tools/{tiffcp.c, tiffcrop.c}: Do not change RowsPerStrip value if + it was set as infinite. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1368 + + * tools/tiffcrop.c, man/tiffcrop.1: New tiffcrop utility contributed + by Richard Nolde. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1383 + +2007-02-22 Andrey Kiselev + + * libtiff/tif_dir.c: Workaround for incorrect TIFFs with + ExtraSamples == 999 produced by Corel Draw. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1490 + + * libtiff/{tif_dirread.c, tif_read.c}: Type of the byte counters + changed from tsize_t to uint32 to be able to work with data arrays + larger than 2GB. Fixes bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=890 + + Idea submitted by Matt Hancher. + +2007-01-31 Andrey Kiselev + + * tools/tif2rgba.c: This utility does not work properly on big-endian + architectures. It was fixed including the bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1149 + +2007-01-15 Mateusz Loskot + + * Submitted libtiff port for Windows CE platform + * libtiff/tif_config.wince.h: Added configuration header for WinCE. + * libtiff/tiffconf.wince.h: Ported old configuration header for WinCE. + * libtiff/tif_wince.c: Added WinCE-specific implementation of some + functons from tif_win32.c. + * libtiff/tif_win32.c: Disabled some functions already reimplemented in tif_wince.c. + * libtiff/tiffiop.h, port/lfind.c: Added conditional include of some + standard header files for Windows CE build. + * tools/tiffinfoce.c: Ported tiffinfo utility for Windows CE. + +2006-11-19 Frank Warmerdam + + * libtiff/tif_write.c: TIFFAppendToStrip() - clear sorted flag if + we move a strip. + http://bugzilla.remotesensing.org/show_bug.cgi?id=1359 + +2006-10-13 Andrey Kiselev + + * libtiff/tif_dir.c: More fixes for vulnerabilities, reported + in Gentoo bug (): + + http://bugs.gentoo.org/show_bug.cgi?id=142383 + + * libtiff/contrib/dbs/xtiff/xtiff.c: Make xtiff utility compilable. + Though it is still far from the state of being working and useful. + +2006-10-12 Andrey Kiselev + + * libtiff/tif_fax3.c: Save the state of printdir codec dependent + method. + + * libtiff/tif_jpeg.c: Save the state of printdir codec dependent method + as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1273 + + * libtiff/tif_win32.c: Fixed problem with offset value manipulation + as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1322 + + * libtiff/{tif_read.c, tif_jpeg.c, tif_dir.c}: More fixes for + vulnerabilities, reported in Gentoo bug (): + + http://bugs.gentoo.org/show_bug.cgi?id=142383 + +2006-09-28 Andrey Kiselev + + * libtiff/{tif_fax3.c, tif_next.c, tif_pixarlog.c}: Fixed multiple + vulnerabilities, as per Gentoo bug (): + + http://bugs.gentoo.org/show_bug.cgi?id=142383 + +2006-09-27 Frank Warmerdam + + * libtiff/tif_lzw.c, libtiff/tif_zip.c: Fixed problems with mixing + encoding and decoding on the same read-write TIFF handle. The LZW + code can now maintain encode and decode state at the same time. The + ZIP code will switch back and forth as needed. + http://bugzilla.remotesensing.org/show_bug.cgi?id=757 + +2006-09-20 Frank Warmerdam + + * libtiff: Rename config.h.vc and tif_config.h.vc to config.vc.h and + tif_config.vc.h for easier identification by folks using an IDE. + +2006-07-25 Frank Warmerdam + + * tif_msdos.c: Avoid handle leak for failed opens. c/o Thierry Pierron + +2006-07-19 Frank Warmerdam + + * tif_dirwrite.c: take care not to flush out buffer of strip/tile + data in _TIFFWriteDirectory if TIFF_BEENWRITING not set. Relates + to bug report by Peng Gao with black strip at bottom of images. + +2006-07-12 Frank Warmerdam + + * tif_dirwrite.c: make sure to use uint32 for wordcount in + TIFFWriteNormanTag if writecount is VARIABLE2 for ASCII fields. + It already seems to have been done for other field types. Needed + for "tiffset" on files with geotiff ascii text. + +2006-07-04 Bob Friesenhahn + + * {configure.ac, libtiff/tif_config.h.vc, libtiff/tif_jbig.c} + (JBIGDecode): jbg_newlen is not available in older JBIG-KIT and + its use does not appear to be required, so use it only when it is + available. + +2006-06-24 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Added missed EXIF tag ColorSpace (40961). + + * libtiff/tif_dirread.c: Move IFD fetching code in the separate + function TIFFFetchDirectory() avoiding code duplication in + TIFFReadDirectory() and TIFFReadCustomDirectory(). + +2006-06-19 Frank Warmerdam + + * tools/tiff2pdf.c: Fix handling of -q values. + http://bugzilla.remotesensing.org/show_bug.cgi?id=587 + +2006-06-17 Frank Warmerdam + + * tif_readdir.c: Added case in EstimateStripByteCounts() for tiled + files. Modified TIFFReadDirectory() to not invoke + EstimateStripByteCounts() for case where entry 0 and 1 are unequal + but one of them is zero. + http://bugzilla.remotesensing.org/show_bug.cgi?id=1204 + +2006-06-08 Andrey Kiselev + + * libtiff/{tif_open.c, tif_dirread.c, tiffiop.h}: Move IFD looping + checking code in the separate function TIFFCheckDirOffset(). + + * libtiff/tif_aux.c: Added _TIFFCheckRealloc() function. + + * tools/tiffcmp.c: Fixed floating point comparison logic as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1191 + + * libtiff/tif_fax3.c: Fixed problems in fax decoder as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1194 + + * tools/tiff2pdf.c: Fixed buffer overflow condition in + t2p_write_pdf_string() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1196 + +2006-06-07 Andrey Kiselev + + * {configure, configure.ac, libtiff/tif_jbig.c, tools/tiffcp.c}: Added + support for JBIG compression scheme (34661 code) contributed by Lee + Howard. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=896 + + * configure, configure.ac: OJPEG support enabled by default. + + * contrib/ojpeg/: Removed. New OJPEG support does not need this patch. + +2006-06-03 Bob Friesenhahn + + * libtiff/{tif_dirinfo.c, tif_print.c} : Fix crash in + TIFFPrintDirectory(). Joris Van Damme authored the fix. + +2006-04-21 Andrey Kiselev + + * tools/tiff2pdf.c: Unified line ending characters (always use '\n') + as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1163 + + * README.vms, Makefile.am, configure.com, libtiff/{Makefile.am, + tif_config.h-vms, tif_stream.cxx, tif_vms.c, tiffconf.h-vms}: + Added support for OpenVMS by Alexey Chupahin, elvis_75@mail.ru. + +2006-04-20 Andrey Kiselev + + * tools/{fax2ps.c, fax2tiff.c, ppm2tiff.c, ras2tiff.c, tiff2pdf.c}: + Properly set the binary mode for stdin stream as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1141 + + * man/{bmp2tiff.1, fax2ps.1, fax2tiff.1, gif2tiff.1, ras2tiff.1, + raw2tiff.1, rgb2ycbcr.1, sgi2tiff.1, tiff2bw.1, tiff2pdf.1, tiff2ps.1, + tiff2rgba.1, tiffcmp.1, tiffcp.1, tiffdither.1, tiffdump.1, tiffgt.1, + tiffset.1}: Improvements in page formatting as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1140 + + * html/tools.html, html/man/Makefile.am, tools/tiff2pdf.c: Fixed + typos as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1139 + +2006-04-18 Frank Warmerdam + + * nmake.opt: use /EHsc for VS2005 compatibility. Also define + _CRT_SECURE_NO_DEPRECATE to avoid noise on VS2005. + +2006-04-12 Joris Van Damme + + * libtiff/tif_getimage.c: Added support for planarconfig separate + non-subsampled YCbCr (i.e. separate YCbCr with subsampling [1,1]) + +2006-04-11 Joris Van Damme + + * libtiff/tif_getimage.c: Revision of all RGB(A) put routines + - Conversion of unassociated alpha to associated alpha now done with + more performant LUT, and calculation more correct + - Conversion of 16bit data to 8bit data now done with + more performant LUT, and calculation more correct + - Bugfix of handling of 16bit RGB with unassociated alpha + +2006-04-11 Joris Van Damme + + * libtiff/tif_getimage.c: + - When there is no alpha, gtTileSeparate and gtStripSeparate allocated + buffer for alpha strile and filled it, only to never read it back. + Removed allocation and fill. + - Minor rename of vars in gtTileSeparate and gtStripSeparate + anticipating planned functionality extension + +2006-04-08 Joris Van Damme + + * libtiff/tif_getimage.c: renamed pickTileContigCase to PickContigCase + and pickTileSeparateCase to PickSeparateCase as both work on strips as + well + + * libtiff/tif_getimage.c: moved img->get selection from + TIFFRGBAImageBegin into PickContigCase and PickSeparateCase to create + logical hook for planned functionality extension + +2006-04-08 Joris Van Damme + + * libtiff/tif_ojpeg.c: resolved memory leak that was a consequence + of inappropriate use of jpeg_abort instead of jpeg_destroy + +2006-04-07 Joris Van Damme + + * libtiff/tif_getimage.c: replaced usage of TIFFScanlineSize in + gtStripContig with TIFFNewScanlineSize so as to fix buggy behaviour + on subsampled images - this ought to get sorted when we feel brave + enough to replace TIFFScanlineSize alltogether + + * libtiff/tif_ojpeg.c: fixed bug in OJPEGReadSkip + +2006-04-04 Joris Van Damme + + * libtiff/tiffio.h: added new type tstrile_t + + * libtiff/tif_dir.h: changed types of td_stripsperimage and td_nstrips + to new tstrile_t, types of td_stripoffset and td_stripbytecount to + toff_t* + + * libtiff/tif_ojpeg.c: totally new implementation + + * libtiff/tif_dirread.c: added several hacks to suit new support of + OJPEG + + * libtiff/tif_getimage.c: removed TIFFTAG_JPEGCOLORMODE handling + of OJPEG images in favor of tif_getimage.c native handling of + YCbCr and desubsampling + +2006-03-29 Frank Warmerdam + + * libtiff/tif_jpeg.c: JPEGVSetField() so that altering the photometric + interpretation causes the "upsampled" flag to be recomputed. Fixes + peculiar bug where photometric flag had to be set before jpegcolormode + flag. + +2006-03-25 Joris Van Damme + + * libtiff/tif_jpeg.c: strip size related bugfix in encode raw + + * libtiff/tif_strip.c: temporarilly added two new versions of + TIFFScanlineSize + - TIFFNewScanlineSize: proposed new version, after all related + issues and side-effects are sorted out + - TIFFOldScanlineSize: old version, from prior to 2006-03-21 change + This needs further sorting out. + +2006-03-25 Joris Van Damme + + * contrib/addtiffo/tif_ovrcache.c: bugfix to correctly pass size + of last truncated strip data to TIFFWriteEncodedStrip + +2006-03-25 Joris Van Damme + + * libtiff/{tif_jpeg.c, tif_strip.c}: bugfix of tif_jpeg decode raw + +2006-03-25 Joris Van Damme + + * libtiff/tif_getimage.c: bugfix/rewrite of putcontig8bitYCbCr22tile + + * libtiff/tif_getimage.c: added putcontig8bitYCbCr12tile + + * libtiff/tif_read.c: added support for new TIFF_NOREADRAW flag to + prepare the path for new tif_ojpeg.c + +2006-03-23 Andrey Kiselev + + * libtiff 3.8.2 released. + + * tools/Makefile.am: Use runtime paths linker flags when rpath + option enabled. + +2006-03-21 Andrey Kiselev + + * libtiff/libtiff.def: Added missed exports as per bug + http://bugzilla.remotesensing.org/attachment.cgi?id=337 + + * contrib/addtiffo/Makefile.vc, libtiff/Makefile.vc, port/Makefile.vc, + tools/Makefile.vc: Makefiles improvements as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1128 + + * nmake.opt libtiff/{tif_config.h.vc, tif_unix.c, tiffio.h}, + tools/{fax2ps.c, fax2tiff.c, tiff2pdf.c}: Fixed win32 I/O functions + usage as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1127 + + * libtiff/tif_strip.c: Take subsampling in account when calculating + TIFFScanlineSize(). + + * tools/tiffcp.c: Do not set RowsPerStrip bigger than image length. + +2006-03-17 Andrey Kiselev + + * tools/fax2tiff.c: Fixed wrong TIFFerror() invocations as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1125 + + * tools/fax2ps.c: Fixed reading the input stream from stdin as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1124 + +2006-03-16 Andrey Kiselev + + * libtiff/tiffiop.h: Added decalration for + _TIFFSetDefaultCompressionState(). + + * libtiff/{tif_jpeg.c, tif_fax3.c, tif_zip.c, tif_pixarlog.c, + tif_lzw.c, tif_luv.c}: Use _TIFFSetDefaultCompressionState() in all + codec cleanup methods. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1120 + +2006-03-15 Andrey Kiselev + + * libtiff/tif_jpeg.c: Do not cleanup codec state in TIFFInitJPEG(). As + per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1119 + + * tools/raw2tiff.c: Do not set RowsPerStrip larger than ImageLength. + As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1110 + + * libtiff/tiffiop.h: dblparam_t typedef removed; GLOBALDATA macro + removed; move here the STRIP_SIZE_DEFAULT macro definition. + + * libtiff/{tif_dirread.c, tif_strip.c}: Removed STRIP_SIZE_DEFAULT + macro definition. + + * libtiff/tif_dir.c: Use double type instead of dblparam_t. + +2006-03-14 Andrey Kiselev + + * libtiff/tif_dirread.c: Do not check the PlanarConfig tag presence + in TIFFReadDirectory, because it is always set at the start of + function and we allow TIFFs without that tag set. + +2005-03-13 Andrey Kiselev + + * libtiff 3.8.1 released. + +2006-03-07 Andrey Kiselev + + * libtiff/tif_dirread.c: Fixed error reporting in TIFFFetchAnyArray() + function as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + + * libtiff/tif_dirread.c: More wise check for integer overflow + condition as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + + * libtiff/{tif_jpeg.c, tif_pixarlog.c, tif_fax3.c, tif_zip.c}: + Properly restore setfield/getfield methods in cleanup functions. As + per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + +2006-03-03 Andrey Kiselev + + * libtiff/{tif_predict.c, tif_predict.h}: Added new function + TIFFPredictorCleanup() to restore parent decode/encode/field methods. + + * libtiff/{tif_lzw.c, tif_pixarlog.c, tif_zip.c}: Use + TIFFPredictorCleanup() in codec cleanup methods. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + + * libtiff/tif_dirread.c: Fixed integer overflow condition in + TIFFFetchData() function. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1102 + +2006-03-01 Andrey Kiselev + + * libtiff/tif_ojpeg.c: Set the ReferenceBlackWhite with the + TIFFSetField() method, not directly. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1043 + + * tools/ppm2tiff.c: Added support for PBM files as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1044 + +2006-02-27 Andrey Kiselev + + * libtiff/tif_write.c: Small code rearrangement in TIFFWriteScanline() + to avoid crash as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1081. + +2006-02-26 Andrey Kiselev + + * tools/tiff2pdf.c: Functions t2p_sample_rgbaa_to_rgb() and + t2p_sample_rgba_to_rgb() was used in place of each other, that was + resulted in problems with RGBA images with associated alpha. + As per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1097 + +2006-02-23 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Properly write TIFFTAG_DOTRANGE tag as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1088. + + * libtiff/tif_print.c: Properly read TIFFTAG_PAGENUMBER, + TIFFTAG_HALFTONEHINTS, TIFFTAG_YCBCRSUBSAMPLING and TIFFTAG_DOTRANGE + tags as per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1088. + + * tools/tiff2ps.c: Properly scale all the pages when converting + multipage TIFF with /width/height/center options set. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1080 + +2006-02-15 Andrey Kiselev + + * tools/tiff2pdf.c: Do not create output file until all option checks + will be done. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1072 + + * tools/bmp2tiff.c: Added ability to create multipage TIFFs from the + list of input files as per bug: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1077 + +2006-02-09 Andrey Kiselev + + * libtiff/tif_tile.c: Fix error reporting in TIFFCheckTile() as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1063. + + * tools/tiffgt.c: Avoid crashing in case of image unsupported by + TIFFRGBAImage interface. + + * libtiff/tif_color.c: Avoid overflow in case of wrong input as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=1065. + +2006-02-07 Frank Warmerdam + + * tools/tiff2pdf.c: Fixed support for non-YCbCr encoded JPEG + compressed TIFF files, per submission from Dan Cobra. + +2006-02-07 Andrey Kiselev + + * libtiff/{tif_dirread.c, tif_packbits.c, tif_win32.c}: Properly + cast values to avoid warnings. As per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. + + * libtiff/tif_dirinfo.c: Use TIFF_NOTYPE instead of 0 when + appropriate. As per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. + + * libtiff/tif_aux.c: Fixed type of temporary variable in + _TIFFCheckMalloc() as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=1033. + +2006-02-06 Andrey Kiselev + + * libtiff/tif_aux.c: Return static array when fetching default + YCbCrCoefficients (another problem, reported a the + http://bugzilla.remotesensing.org/show_bug.cgi?id=1029 entry). + +2006-02-03 Andrey Kiselev + + * libtiff/tif_dir.c: Special handling for PageNumber, HalftoneHints, + YCbCrSubsampling and DotRange tags as per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1029 + http://bugzilla.remotesensing.org/show_bug.cgi?id=1034 + + * libtiff/tif_dirread.c: Use _TIFFGetExifFieldInfo() instead of + _TIFFGetFieldInfo() in TIFFReadEXIFDirectory() call as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1026. + +2006-01-23 Andrey Kiselev + + * libtool related stuff updated from the 2.1a branch. + +2006-01-11 Frank Warmerdam + + * tools/bmp2tiff,pal2rgb,ppm2tiff,ras2tiff,raw2tiff,sgi2tiff, + tiff2bw,tiffcp: Fixed jpeg option processing so -c jpeg:r:50 works + properly as per bug: + http://bugzilla.remotesensing.org/show_bug.cgi?id=1025 + +2006-01-09 Bob Friesenhahn + + * configure.ac: Fix with_default_strip_size comparison as reported + by Norihiko Murase. + +2006-01-08 Bob Friesenhahn + + * test/Makefile.am (LIBTIFF): Due to linking against libtiff + incorrectly, tests were not actually testing the uninstalled + libtiff. Now they are. + +2006-01-04 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Change definitions for TIFFTAG_ICCPROFILE, + TIFFTAG_PHOTOSHOP, TIFFTAG_RICHTIFFIPTC, TIFFTAG_XMLPACKET: readcount + should be uint32 value. + +2006-01-02 Bob Friesenhahn + + * html/man/Makefile.am (htmldoc): Fix htmldoc rule so that it can + be used if build directory is not the same as source directory. + * man/{TIFFGetField.3tiff, TIFFSetField.3tiff}: Documented + TIFFTAG_PHOTOSHOP, TIFFTAG_RICHTIFFIPTC, and TIFFTAG_XMLPACKET, + and re-sorted tag names in alphabetical order. + +2005-12-29 Andrey Kiselev + + * libtiff 3.8.0 released. + +2005-12-28 Bob Friesenhahn + + * tools/bmp2tiff.c (main): Fixed warning regarding returning + inconsistent types from a condition. + * tools/tiffcmp.c (CheckLongTag): Eliminate warning due to printf + format. + * tools/bmp2tiff.c: Reduce compilation warnings on big-endian CPUs. + +2005-12-28 Joris Van Damme + + * html/{index.html, support.hml, libtiff.html}: Cleaned up HTML + +2005-12-27 Andrey Kiselev + + * libtiff/tiffio.h: Added VC_EXTRALEAN definition before including + windows.h, to reduce the compile time. + +2005-12-26 Bob Friesenhahn + + * libtiff/tif_jpeg.c: Improve compilation under MinGW. + +2005-12-26 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dir.h, tif_dirread.c, tif_dirinfo.c}: + tiffFieldInfo and exifFieldInfo arrays definitions moved back to + tif_dirinfo.c; added _TIFFGetFieldInfo() and _TIFFGetExifFieldInfo() + private functions to retrieve FieldInfo arrays. + +2005-12-24 Bob Friesenhahn + + * html/build.html: Added some additional instructions for when + building using MSVC under Windows. Also fixed two HTML syntax + errors and used HTML Tidy to tidy up the HTML syntax and + formatting. + +2005-12-24 Andrey Kiselev + + * libtiff/{tif_aux.c, tif_dir.c, tif_dir.h, tif_dirwrite.c, + tif_print.c, tif_getimage.c}: Make InkSet, NumberOfInks, DotRange and + StoNits tags custom. + +2005-12-23 Andrey Kiselev + + * libtiff/{tif_aux.c, tif_dir.c, tif_dir.h, tif_print.c}: Make + WhitePoint tag custom. + + * libtiff/{tif_dir.h, tiff.h}: More EXIF tags added. + +2005-12-23 Joris Van Damme + + * libtiff/tiffio.h: fixed typo that potentially resulted in + redefininition of USE_WIN32_FILEIO + + * libtiff/*: Added more 'dual-mode' error handling: Done TIFFWarning + calls in core LibTiff. + +2005-12-21 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dir.h, tif_print.c}: Make RichTIFFIPTC, + Photoshop and ICCProfile tags custom. + +2005-12-21 Joris Van Damme + + * libtiff/*, contrib/*: Added 'dual-mode' error handling, enabling + newer code to get context indicator in error handler and still + remain compatible with older code: Done TIFFError calls everywhere + except in tools + +2005-12-20 Andrey Kiselev + + * tools/tiffcp.c: Added many error reporting messages; fixed integer + overflow as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=789 + +2005-12-16 Frank Warmerdam + + * contrib/addtiffo/*: Major upgrade by Joris to support subsampled + YCbCr images in jpeg compressed TIFF files. + +2005-12-14 Andrey Kiselev + + * tools/tiffcp.c: Return non-zero status when reading fails (again). + +2005-12-13 Andrey Kiselev + + * tools/tiffcp.c: Return non-zero status when reading fails. + +2005-12-12 Andrey Kiselev + + * libtiff/{tif_dir.h, tiff.h}: Added more EXIF tags. + +2005-12-09 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dir.h, tif_print.c}: Make XMLPacket tag + custom. + + * tools/tiffinfo.c: Print EXIF directory contents if exist. + + * libtiff/tiff.h: Few EXIF tag numbers added. + + * libtiff/{tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c, + tiffio.h}: Preliminary support to read custom directories. New + functions: TIFFReadCustomDirectory() and TIFFReadEXIFDirectory(). + +2005-12-07 Andrey Kiselev + + * libtiff/{tif_dirinfo.c, tif_dirread.c, tif_dir.h, tif_dir.c}: + More work to implement custom directory read support. + + * libtiff/{tif_aux.c, tif_dirinfo.c, tif_dirread.c, tif_dir.h, + tif_dir.c, tif_print.c}: Make YCbCrCoefficients and ReferenceBlackWhite + tags custom. + +2005-12-05 Andrey Kiselev + + * libtiff/tif_dirread.c: One more workaround for broken + StripByteCounts tag. Handle the case when StripByteCounts array filled + with completely wrong values. + +2005-11-30 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Release file descriptor in case of failure + in the TIFFOpenW() function as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1003 + + * libtiff/tif_dirinfo.c: Correctly yse bsearch() and lfind() + functions as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=1008 + +2005-11-20 Frank Warmerdam + + * tif_open.c, tiff.h, tiffdump.c: Incorporate preliminary support + for MS MDI format. + http://bugzilla.remotesensing.org/show_bug.cgi?id=1002 + + * .cvsignore: many files added, and a few update according + to suggestion of Brad HArds on tiff mailing list. + +2005-11-03 Frank Warmerdam + + * libtiff/libtiff.def, tiffiop.h, tiffio.h: Made TIFFFreeDirectory + public. + +2005-10-31 Andrey Kiselev + + * tools/fax2tiff.c: Properly calculate sizes of temporary arrays + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=943 + + * tools/fax2tiff.c: Added option '-r' to set RowsPerStrip parameter + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=944 + + * tools/tiffdump.c: Fixed typeshift and typemask arrays initialization + problem as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=946 + + * tools/bmp2tiff.c: Fixed possible integer overflow error as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=965 + + * libtiff/tif_dirinfo.c: Make XResolution, YResolution and + ResolutionUnit tags modifiable during write process. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=977 + + * tools/tiffsplit.c: Copy fax related fields over splitted parts + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=983 + +2005-10-21 Frank Warmerdam + + * tif_dirread.c: Don't try and split single strips into "0" strips + in ChopUpSingleUncompressedStrip. This happens in some degenerate + cases (like 1x1 files with stripbytecounts==0 (gtsmall.jp2 embed tiff) + +2005-10-20 Joris Van Damme + + * tif_fax3.c: changed 'at scanline ...' style warning/errors + with incorrect use of tif_row, to 'at line ... of + strip/tile ...' style + +2005-10-15 Frank Warmerdam + + * tif_write.c: fixed setting of planarconfig as per bug report + on the mailing list from Joris. + +2005-10-07 Andrey Kiselev + + * configure.ac, configure, nmake.opt, libtiff/{tif_config.h, + tif_dirread.c}: Make the default strip size configurable via the + --with-default-strip-size and STRIP_SIZE_DEFAULT options. + +2005-09-30 Bob Friesenhahn + + * html/support.html: Fixed link to documentation on Greg Ward's + LogLuv TIFF format. + +2005-09-28 Andrey Kiselev + + * tools/tiffdump.c: Fixed crash when reading malformed tags. + +2005-09-20 Andrey Kiselev + + * tools/tiff2pdf.c: Added missed 'break' statement as per bug + http://bugzilla.remotesensing.org/show_bug.cgi?id=932 + +2005-09-12 Andrey Kiselev + + * libtiff 3.7.4 released. + + * {configure, configure.ac, Makefile.am, autogen.sh}: Applied patch + from Patrick Welche (all scripts moved in the 'config' and 'm4' + directories). + +2005-09-12 Frank Warmerdam + + * libtiff/tif_open.c: reintroduce seek to avoid problem on solaris. + +2005-09-05 Frank Warmerdam + + * libtiff/tif_dir.c: When prefreeing tv->value in TIFFSetFieldV + also set it to NULL to avoid double free when re-setting custom + string fields as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=922 + +2005-08-12 Frank Warmerdam + + * libtiff/tif_print.c: avoid signed/unsigned warning. + + * libtiff/tif_dirread.c: removed unused variable. + +2005-07-30 Frank Warmerdam + + * libtiff/tif_dir.c: Fixed up support for swapping "double complex" + values (128 bits as 2 64 bits doubles). GDAL gcore tests now + pass on bigendian (macosx) system. + +2005-07-28 Andrey Kiselev + + * libtiff/{tif_aux.c, tif_dirread.c, tif_fax3.c, tiffiop.h}: Rename + CheckMalloc() function to _TIFFCheckMalloc() and make it available + globally as an internal helper routine. + +2005-07-27 Andrey Kiselev + + * libtiff/tif_dir.c: More improvements in the "pass by value" part of + the custom tags handling code. + +2005-07-26 Andrey Kiselev + + * libtiff/{tif_dirread.c, tif_dirinfo.c}: Do not upcast BYTEs to + SHORTs in the TIFFFetchByteArray(). Remove TIFFFetchExtraSamples() + function, use TIFFFetchNormalTag() instead as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=831 + + Remove TIFFFetchExtraSamples() function, use TIFFFetchNormalTag() + instead. + + * libtiff/tiffconf.h.in: One more attempt to fix the AIX bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2005-07-25 Andrey Kiselev + + * libtiff/tif_print.c: Fixed printing of the BYTE and SBYTE arrays. + + * tools/tiffdump.c: Added support for TIFF_IFD datatype. + +2005-07-21 Andrey Kiselev + + * libtiff/tif_write.c: Do not check the PlanarConfiguration field in + the TIFFWriteCheck() function in case of single band images (as per + TIFF spec). + +2005-07-12 Andrey Kiselev + + * SConstruct, libtiff/SConstruct: Added the first very preliminary + support for SCons software building tool (http://www.scons.org/). + This is experimental infrastructure and it will exist along with the + autotools mechanics. + +2005-07-07 Andrey Kiselev + + * port/{getopt.c, strcasecmp.c, strtoul.c}: Update modules from + the NetBSD source tree (the old 4-clause BSD license changed to + the new 3-clause one). + + * configure.ac, port/lfind.c, libtiff/tiffiop.h: Added lfind() + replacement module. + + * port/dummy.c: Make the dummy function static. + +2005-07-06 Andrey Kiselev + + * tools/tiffcp.c: Fixed WhitePoint tag copying. + + * libtiff/{tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_print.c}: + Make FieldOfViewCotangent, MatrixWorldToScreen, MatrixWorldToCamera, + ImageFullWidth, ImageFullLength and PrimaryChromaticities tags custom. + +2005-07-04 Andrey Kiselev + + * libtiff 3.7.3 released. + + * configure, configure.ac: Do not use empty -R option when linking + with --enable-rpath. + +2005-07-01 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_open.c}: Added open option 'h' to avoid + reading the first IFD when needed. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=875 + + * libtiff/tif_color.c: Better use of TIFFmin() macro to avoid side + effects. + +2005-06-23 Andrey Kiselev + + * tools/tiff2pdf.c: Print two characters per loop in the + t2p_write_pdf_trailer(). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=594 + + * tools/tiffgt.c: Use MacOS X OpenGL framework when appropriate. As + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=844 + + * acinclude.m4: Updated to latest OpenGL test macros versions. + + * libtiff/tiff.h: Use correct int size on Sparc 64bit/Sun compiler + platform. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=855 + +2005-06-14 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Added support for ClipPath, XClipPathUnits + and YClipPathUnits tags. + +2005-06-07 Andrey Kiselev + + * contrib/addtiffo/tif_ovrcache.c: Properly extract tile/strip size; + use pixel sized shift in contigous case. + +2005-06-06 Andrey Kiselev + + * contrib/addtiffo/{tif_overview.c, tif_ovrcache.c, tif_ovrcache.h}: + Make overviews working for contiguos images. + +2005-06-03 Andrey Kiselev + + * libtiff/tif_open.c: Replace runtime endianess check with the compile + time one. + + * libtiff/tif_predict.c: Floating point predictor now works on + big-endian hosts. + +2005-06-01 Andrey Kiselev + + * libtiff/tif_dir.c: Use _TIFFsetString() function when read custom + ASCII values. + + * libtiff/{tif_dirinfo.c, tif_dir.h, tif_dir.c, tif_print.c}: Make + DocumentName, Artist, HostComputer, ImageDescription, Make, Model, + Copyright, DateTime, PageName, TextureFormat, TextureWrapModes and + TargetPrinter tags custom. + + * libtiff/tif_jpeg.c: Cleanup the codec state depending on + TIFF_CODERSETUP flag (to fix memry leaks). + + * libtiff/tif_jpeg.c: Initialize JPEGTables array with zero after + allocating. + +2005-05-26 Andrey Kiselev + + * configure.ac, libtiff/Makefile.am: Added workaround for + OpenBSD/MirOS soname problem as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=838 + + * libtiff/tif_dirwrite.c: Use tdir_count when calling + TIFFCvtNativeToIEEEDouble() in the TIFFWriteDoubleArray() function as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=845 + +2005-05-25 Andrey Kiselev + + * tools/ppm2tiff.c: Fixed format string when read PPM file header with + the fscanf() function. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=861 + + * libtiff/{tif_dirinfo.c, tif_print.c}: TIFFFetchByteArray() returns + uint16 array when fetching the BYTE and SBYTE filds, so we should + consider result as pointer to uint16 array and not as array of chars. + As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=831 + + * libtiff/tif_dir.c: More efficient custom tags retrieval as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=830 + + * libtiff/tif_win32.c: Use FILE_SHARE_READ | FILE_SHARE_WRITE share + mode in CreateFile() call as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=829 + + * libtiff/Makefile.am: Fixed parallel compilation of the libtiff and + libtiffxx libraries as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=826 + + * contrib/addtiffo/{tif_overview.c, tif_ovrcache.h}: Sinchronized with + GDAL. + +2005-05-23 Frank Warmerdam + + * libtiff/tif_jpeg.c: Substantial fix for addtiffo problems with + JPEG encoded TIFF files. Pre-allocate lots of space for jpegtables + in directory. + +2005-05-22 Frank Warmerdam + + * libtiff/tif_dirread.c: Changed the code that computes + stripbytecount[0] if it appears bogus to ignore if stripoffset[0] is + zero. This is a common case with GDAL indicating a "null" tile/strip. + +2005-05-17 Andrey Kiselev + + * tools/tiffsplit.c: Check for JPEGTables tag presence before copying. + +2005-05-06 Frank Warmerdam + + * libtiff/tif_dirread.c: Applied similar change to + TIFFFetchPerSampleLongs and TIFFFetchPerSampleAnys. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=843 + + * libtiff/tif_jpeg.c: added LIB_JPEG_MK1 support in JPEGDecodeRaw(). + +2005-05-06 Andrey Kiselev + * tools/tiff2pdfr.c, man/tiff2pdf.1: Calculate the tile width properly; + added new option '-b' to use interpolation in output PDF files (Bruno + Ledoux). + +2005-05-05 Frank Warmerdam + + * libtiff/tif_dirread.c: Ensure that broken files with too many + values in PerSampleShorts work ok instead of crashing. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=843 + +2005-04-27 Andrey Kiselev + + * tools/tiffdither.c: Copy the PhotometricInterpretation tag from the + input file. + +2005-04-15 Andrey Kiselev + + * libtiff/tif_predict.c: Added ability to encode floating point + predictor, as per TIFF Technical Note 3. + +2005-04-14 Andrey Kiselev + + * libtiff/{tif_predict.h, tif_predict.c}: Added ability to decode + floating point predictor, as per TIFF Technical Note 3. + +2005-04-13 Andrey Kiselev + + * libtiff/{tiffio.h, tiffiop.h, tif_dir.c, tif_read.c, tif_swab.c}: + Added _TIFFSwab24BitData() and TIFFSwabArrayOfLong() functions used to + swap 24-bit floating point values. + + * libtiff/tiff.h: Added predictor constants. + +2005-04-08 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_dir.c}: Use uint32 type for appropriate + values in _TIFFVSetField() function. Inspired by the bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=816 + + * man/TIFFSetField.3tiff: Fixed definition of the TIFFTAG_INKNAMES tag + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=816 + +2005-03-30 Andrey Kiselev + + * libtiff/tif_open.c: Do not read header in case the output file + should be truncated (Ron). + + * libtiff/{tif_dirinfo.c, tif_config.h.vc}: Use lfind() instead + of bsearch() in _TIFFFindFieldInfoByName() function (Ron). + + * libtiff/{tiff.h, tif_dirinfo.c}: Fixes in EXIF tag ordering (Ron). + +2005-03-22 Andrey Kiselev + + * configure.ac, libtiff/Makefile.am: Use libtool machinery to pass + rpath option. + +2005-03-21 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_print.c}: Handle all data types in custom + tags. + +2005-03-18 Andrey Kiselev + + * libtiff/dirinfo.c: Added DNG tags. + + * libtiff/{tif_dir.c, tif_print.c}: More improvements in custom tag + handling code. + + * libtiff/tiff.h: More comments; added missed DNG tag (LensInfo); + added DNG 1.1.0.0 tags. + + * tools/tif2pdf.c: Fixed problem with alpha channel handling as per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=794 + + * man/TIFFGetField.3tiff: Add a note about autoregistered tags. + +2005-03-17 Andrey Kiselev + + * nmake.opt: Build with Win32 CRT library by default. + + * tools/tiff2ps.c: Fixed typo in page size handling code. + + * libtiff/{tif_dir.c, tif_print.c}: Support for custom tags, passed + by value. + + * libtiff/{tiff.h, tif_dirinfo.c, tiffiop.h}: Added EXIF related tags. + +2005-03-15 Andrey Kiselev + + * libtiff 3.7.2 released. + +2005-03-09 Andrey Kiselev + + * tools/tiffcmp.c: Added ability to compare the 32-bit integer and + floating point data; complain on unsupported bit depths. + +2005-03-05 Andrey Kiselev + + * tif_stream.cxx: Use ios namespace instead of ios_base to support + GCC 2.95. + + * libtiff/{tiff.h, tif_fax3.tif, tif_jpeg.c}: Applied correct patch from + Lee Howard for HylaFax DCS tag + (see http://bugzilla.remotesensing.org/show_bug.cgi?id=771) + +2005-03-04 Andrey Kiselev + + * configure, configure.ac: Use -rpath option instead of -R as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=732 + + * libtiff/{tiff.h, tif_fax3.tif, tif_jpeg.c}: Applied patch from Lee + Howard to support a new tag TIFFTAG_FAXDCS (34911) used in HylaFax + software. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=771 + + * nmake.opt, html/build.html: Add more comments, change the config + file organization a bit as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=764 + + * tools/tiffcmp.c: Use properly sized buffer in short arrays comparison + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=785 + +2005-03-03 Andrey Kiselev + + * libtiff/tif_dirread.c: More logic to guess missed strip size as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=705 + + * tools/fax2ps.c: Replace insecure mktemp() function with the + tmpfile() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=786 + +2005-02-04 Andrey Kiselev + + * libtiff/tiff.h: Changed the int8 definition to be always signed char + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=727 + + * libtiff/tiffio.h: Move TIFFOpenW() function into the extern "C"{} + block as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=763 + +2005-02-03 Bob Friesenhahn + + * tools/tiffgt.c: Fix problem on big-endian CPUs so that images + display more correctly. Images display brighter than they should + on a Sun workstation. + +2005-02-03 Andrey Kiselev + + * libtiff/tif_dirread.c: Estimate strip size in case of wrong or + suspicious values in the tags. As per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=705 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=320 + + * tools/tiff2ps.c: Fixed problem with page sizes as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=742 + +2005-01-31 Bob Friesenhahn + + * libtiff/tiff.h (TIFFTAG_TILEWIDTH): Corrected description. + (TIFFTAG_TILELENGTH): Corrected description. + +2005-01-30 Andrey Kiselev + + * configure.ac: Fixes for --with-docdir option as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=759 + + * libtiff/tif_open.c: Remove unnesessary TIFFSeekFile() call as per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=756 + + * libtiff/tif_stream.cxx: Fixes for C++ stream interface from + Michael Rinne and Edward Lam. + +2005-01-15 Andrey Kiselev + + * configure.ac: Make the documentation directory location configurable + via the --with-docdir option (as suggested by Jeremy C. Reed). + + * libtiff/tif_color.c: Use double as the second argument of pow() + function in TIFFCIELabToRGBInit(). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=741 + + * libtiff/tif_pixarlog.c: Avoid warnings when converting float to + integer as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=740 + + * libtiff/tif_getimage.c: Always fill the error message buffer in + TIFFRGBAImageBegin() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=739 + +2005-01-12 Andrey Kiselev + + * libtiff/tif_jpeg.c: Added ability to read/write the fax specific + TIFFTAG_FAXRECVPARAMS, TIFFTAG_FAXSUBADDRESS and TIFFTAG_FAXRECVTIME + tags as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=736 + + * libtiff/tif_win32.c: Fixed message formatting in functions + Win32WarningHandler() and Win32ErrorHandler() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=735 + + * tools/tiff2ps.c: Interpret the -w and -h options independently. As + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=689 + +2005-01-11 Andrey Kiselev + + * libtiff/tiffio.h: Move the color conversion routines in the 'extern + "C"' section as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=727 + + * libtiff/tiff.h: Restore back the workaround for AIX Visual Age C + compiler to avoid double definition of BSD types as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + + * libtiff/Makefile.am: Place the C++ stream API in the separate + library called libtiffxx to avoid unneeded dependencies. Probably + there will be more C++ API in the future. As per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=733 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=730 + +2005-01-05 Andrey Kiselev + + * tools/tiffdump.c: Fixed problem when read broken TIFFs with the + wrong tag counts (Dmitry V. Levin, Martin Pitt). + + * configure.ac: Replace --disable-c++ with the --disable-cxx option as + per bug http://bugzilla.remotesensing.org/show_bug.cgi?id=730 + +2004-12-25 Andrey Kiselev + + * libtiff/tif_getimage.c: More fixes for multiple-alpha-channelled + RGB-images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=713 + + + * tools/tiffset.c: Convert character option to integer value as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=725 + +2004-12-20 Andrey Kiselev + + * libtiff 3.7.1 released. + + * html/tiffset.1.html: Add missed manual page as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=678 + + * libtiff/tiff.h: Revert back libtiff data type definitions as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=687 + +2004-12-19 Andrey Kiselev + + * libtiff/tif_dirread.c: Do not forget about TIFF_VARIABLE2 when + checking for tag count in TIFFReadDirectory() function. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=713 + + * libtiff/{tif_dirread.c, tif_fax3.c}: More argument checking in + CheckMallock() function. + + * libtiff/tif_getimage.c: Support for multiple-alpha-channelled + RGB-images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=718 + +2004-12-15 Frank Warmerdam + + * libtiff/tif_getimage.c: #define A1 bracketing for clean build on + SunPro compiler. + +2004-12-11 Bob Friesenhahn + + * autogen.sh: aclocal and autoheader should be executed after + libtoolize. Also add '-I .' to aclocal invocation to check + current directory for macros. + +2004-12-10 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Always write TIFFTAG_SUBIFD using LONG type + as per bugs + + http://bugzilla.remotesensing.org/show_bug.cgi?id=703 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=704 + +2004-12-04 Andrey Kiselev + + * nmake.opt: Link with the user32.lib in windowed mode. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=697 + + * libtiff/tif_win32.c: Use char* strings instead of TCHAR in windowed + mode as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=697 + + * libtiff/tif_config.in.vc: Removed unneded definitions for + read/open/close/lseek functions to fix the + + http://bugzilla.remotesensing.org/show_bug.cgi?id=680 + +2004-12-03 Andrey Kiselev + + * libtiff/{tif_dir.c, tif_dirread.c}: Remove TIFFReassignTagToIgnore() + call from the TIFFReadDirectory() function. TIFFReassignTagToIgnore + must be removed in the future, as it was never used properly. As per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=692 + +2004-11-30 Bob Friesenhahn + + * libtiff/tif_jpeg.c: Added a work-around in order to allow + compilation with the heavily modified version of libjpeg delivered + with Cygwin. + +2004-11-29 Andrey Kiselev + + * libtiff/tif_dir.c: Properly handle tags, which have the uint32 + counts. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=693 + + * tools/fax2ps.c: Be able to extract the first page (#0). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=690 + +2004-11-28 Andrey Kiselev + + * libtiff/tif_unix.c: Make UNIX module compilable (and usable) + on Windows. + + * nmake.opt: Add missed DLLNAME variable. + +2004-11-26 Frank Warmerdam + + * libtiff/makefile.vc: make it easier to rename the libtiff DLL. + +2004-11-24 Andrey Kiselev + + * man/libtiff.3tiff: Improvements in the "LIST OF ROUTINES" table as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=545 + + * man/tiffset.1: Added manual page for tiffset tool written by Jay + Berkenbilt. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=678 + +2004-11-23 Frank Warmerdam + + * libtiff/tif_error.c: fixed TIFFerror call to be TIFFError. + +2004-11-21 Frank Warmerdam + + * html/document.html: Updated Adobe web links as per email from Joris. + +2004-11-21 Andrey Kiselev + + * libtiff/{tiffio.hxx, tiffio.h}: C++ stream interface moved to new + file tiffio.hxx. We don't have any C++ in tiffio.h, those who want to + use C++ streams should #include . + +2004-11-13 Andrey Kiselev + + * libtiff/tiff.h: Added Adobe DNG tags. + + * libtiff/tif_win32.c: Typo fixed. + + * libtiff/{tif_stream.cxx, tiffio.h}: C++ stream interface updated to + be compliant with the latest standard. Appropriate additions in + makefiles now completed. + +2004-11-11 Andrey Kiselev + + * tools/tiffset.c, libtiff/tif_dirinfo.c: Properly handle the + different tag types. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=600 + +2004-11-10 Andrey Kiselev + + * libtiff/tif_aux.c: Set the appropriate ReferenceBlackWhite array for + YCbCr image which lacks that tag (noted by Hans Petter Selasky). + +2004-11-09 Andrey Kiselev + + * libtiff/tif_color.c: Division by zero fixed (Hans Petter Selasky). + +2004-11-07 Andrey Kiselev + + * libtiff/{tif_stream.cxx, tiffio.h}: Added C++ stream interface + contributed by Edward Lam (see + http://bugzilla.remotesensing.org/show_bug.cgi?id=654 for details). + Though no changes in any makefiles yet. + +2004-11-05 Frank Warmerdam + + * libtiff/tif_open.c: Removed close() in TIFFClientOpen() if file + is bad. This is the callers responsibility. + http://bugzilla.remotesensing.org/show_bug.cgi?id=651 + +2004-11-05 Andrey Kiselev + + * libtiff/{tiffio.h, tif_win32.c, libtiff.def}: Added TIFFOpenW() + function to work with the double byte strings (used to represent + filenames in some locales). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=625 + + * libtiff/tif_dirread.c: Fixed problem when fetching BitsPerSample and + Compression tags of type LONG from broken TIFFS as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=662 + + * libtiff/tif_dirinfo.c: Fixed definition for TIFFTAG_RICHTIFFIPTC, + the writecount should have uint32 type. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=662 + + * libtiff/tif_write.c: Fixed wrong if() statement in + TIFFAppendToStrip() function as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=660 + +2004-11-04 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Change definition for TIFFTAG_EXTRASAMPLES + field. The caller should supply a count when setting this field. As + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=648 + + * libtiff/{tif_jpeg.c, tif_ojpeg.c}: TIFFTAG_JPEGTABLES should have + uint32 count. Use this type everywhere. + +2004-11-03 Frank Warmerdam + + * libtiff/tif_next.c: avoid use of u_long and u_char types. Bug 653. + +2004-11-02 Frank Warmerdam + + * tools/tiff2rgba.c: removed extra newlines in usage message. + +2004-10-30 Andrey Kiselev + + * libtiff/tif_dirwrite.c: Improvements in tag writing code. + + * tools/tiff2ps.c: Fixed wrong variable data type when read Position + tags (Tristan Hill). + +2004-10-30 Frank Warmerdam + + * libtiff/tiffiop.h: added fallback definition of assert() if we + don't have assert.h. + +2004-10-29 Andrey Kiselev + + * libtiff/tif_fax3.c: Fixed case with the wrong decode routines + choosing when the incorrect Group4Options tag set. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=323 + + * libtiff/tif_dirwrite.c: Fixed problem with passing count variable of + wrong type when writing the TIFF_BYTE/TIFF_SBYTE tags in + TIFFWriteNormalTag(). + +2004-10-28 Andrey Kiselev + + * tools/tiff2ps.c: Fixed wrong variable data type when read Resolution + tags (Peter Fales). + + * tools/{bmp2tiff.c, raw2tiff.c}: Get rid of stream I/O functions. + +2004-10-28 Frank Warmerdam + + * tools/tiff2pdf.c: added casts to avoid warnings. + + * libtiff/libtiff.def: Added several more entry points required + to link fax2tiff.c against the DLL on windows. + +2004-10-27 Andrey Kiselev + + * configure, configure.ac: Added --enable-rpath option to embed linker + paths into library binary. + +2004-10-26 Andrey Kiselev + + * tools/tiffset.c: Check the malloc return value (Dmitry V. Levin). + + * libtiff/{tif_strip.c, tif_tile.c}: Zero division problem fixed + (Vladimir Nadvornik, Dmitry V. Levin). + +2004-10-16 Andrey Kiselev + + * libtiff 3.7.0 released. + +2004-10-15 Bob Friesenhahn + + * libtiff/tif_jpeg.c: There seems to be no need to include stdio.h + in this file so its inclusion is removed. Including stdio.h + sometimes incurs an INT32 typedef conflict between MinGW's + basetsd.h and libjpeg's jmorecfg.h. + +2004-10-15 Andrey Kiselev + + * man/bmp2tiff.1: Added manual page for bmp2tiff utility. + +2004-10-13 Bob Friesenhahn + + * tools/tiffcmp.c (leof): Renamed from 'eof' in order to avoid + conflict noticed under MinGW. + * ltmain.sh: Fix for MinGW compilation. + +2004-10-13 Frank Warmerdam + + * man/tiffsplit.1: Fixed to indicate using aaa-zzz, not aa-zz. + http://bugzilla.remotesensing.org/show_bug.cgi?id=635 + +2004-10-12 Andrey Kiselev + + * libtiff/{tif_dirread.c, tif_jpeg.c, tif_luv.c, tif_ojpeg.c, + tif_pixarlog.c, tif_write.c}: Handle the zero strip/tile sizes + properly (Dmitry V. Levin, Marcus Meissner). + +2004-10-11 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Type of the TIFFTAG_SUBIFD field changed + to TIFF_IFD. + +2004-10-10 Andrey Kiselev + + * tools/bmp2tif.c: Check the space allocation results. + +2004-10-09 Andrey Kiselev + + * libtiff/tif_dir.c: Initialize td_tilewidth and td_tilelength fields + of the TIFFDirectory structure with the 0 instead of -1 to avoid + confusing integer overflows in TIFFTileRowSize() for striped images. + + * tools/tiff2pdf.c: Fixed TransferFunction tag handling reported + by Ross A. Finlayson. + + * libtiff/tif_dir.c: Fixed custom tags handling as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=629 + +2004-10-08 Frank Warmerdam + + * libtiff/tif_dirinfo.c: Fix bug with tif_foundfield and reallocation + of tif_fieldinfo. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=630 + +2004-10-04 Bob Friesenhahn + + * contrib/iptcutil/README: Added the missing README which goes + along with iptcutil. + +2004-10-03 Andrey Kiselev + + * libtiff/tif_compress.c: Improved error reporting in + TIFFGetConfiguredCODECs() (Dmitry V. Levin). + +2004-10-02 Andrey Kiselev + + * libtiff 3.7.0beta2 released. + + * libtiff/{tif_aux.c, tif_compress.c, tif_dirinfo.c, tif_dirwrite.c, + tif_extension.c, tif_fax3.c, tif_luv.c, tif_packbits.c, + tif_pixarlog.c, tif_write.c}: Added checks for failed memory + allocations and integer overflows (Dmitry V. Levin). + + * libtiff/tiff.h: Missed TIFF_BIGTIFF_VERSION constant added. + +2004-10-01 Frank Warmerdam + + * libtiff/tif_open.c: added a more informative message if a BigTIFF + file is opened. + +2004-09-30 Frank Warmerdam + + * libtiff/tif_dirinfo.c: changed type of XMLPacket (tag 700) to + TIFFTAG_BYTE instead of TIFFTAG_UNDEFINED to comply with the info + in the Adobe XMP Specification. + +2004-09-29 Andrey Kiselev + + * libtiff/{tif_jpeg.c, tif_pixarlog.c}: Use _TIFFmemset() instead of + memset(). + + * libtiff/{tif_dirread.c, tif_strip.c, tif_tile.c}: Applied patches + from Dmitry V. Levin to fix possible integer overflow problems. + +2004-09-28 Andrey Kiselev + + * libtiff/tif_getimage.c: Check for allocated buffers before clearing + (Dmitry V. Levin). + +2004-09-26 Andrey Kiselev + + * libtiff/{tif_dir.h, tif_dir.c, tif_dirread.c, tif_write.c}: + Optimize checking for the strip bounds. + + * libtiff/{tif_dirread.c, tif_strip.c}: TIFFScanlineSize() and + TIFFRasterScanlineSize() functions report zero in the case of integer + overflow now. Properly handle this case in TIFFReadDirectory() + (patches from Dmitry V. Levin). + +2004-09-25 Andrey Kiselev + + * libtiff/{tif_dirinfo.c, tif_strip.c, tif_tile.c}: Use TIFFhowmany8() + macro where appropriate. + + * tools/tiff2bw.c: Write ImageWidth/Height tags to output file, as + noted by Gennady Khokhorin. + + * libtiff/tif_dirread.c: Always check the return values, returned + by the _TIFFmalloc() (Dmitry V. Levin). + + * libtiff/tif_dir.c: Fixed possible integer overflow _TIFFset*Array() + functions (Dmitry V. Levin). + + * libtiff/{tif_dirread.c, tif_dir.c, tif_write.c}: + Potential memory leak fixed in TIFFReadDirectory(), _TIFFVSetField(), + TIFFGrowStrips() (found by Dmitry V. Levin). + +2004-09-24 Andrey Kiselev + + * libtiff/{tiffio.h, tif_compress.c}: Added TIFFGetConfiguredCODECs() + to get the list of configured codecs. + + * libtiff/{tiffiop.h, tif_dirread.c}: More overflow fixes from + Dmitry V. Levin. + +2004-09-23 Andrey Kiselev + + * libtiff/tif_dirread.c: Applied patch from Dmitry V. Levin to fix + possible integer overflow in CheckMalloc() function. + +2004-09-22 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_strip.c}: Use TIFFhowmany8() macro instead + of plain TIFFhowmany() where appropriate. + +2004-09-21 Andrey Kiselev + + * libtiff/tif_getimage.c: Initialize arrays after space allocation. + +2004-09-19 Andrey Kiselev + + * libtiff 3.7.0beta released. + + * libtiff/{tif_luv.c, tif_next.c, tif_thunder.c}: Several buffer + overruns fixed, as noted by Chris Evans. + +2004-09-14 Bob Friesenhahn + + * commit: Added a script to make it more convenient to commit + updates. The CVS commit message is extracted from this ChangeLog + file. + +2004-09-14 Andrey Kiselev + + * configure.ac, configure, aclocal.m4, libtiff/{mkspans.c, tif_fax3.c, + tif_getimage.c, tif_luv.c, tif_lzw.c, tif_ojpeg.c, tif_packbits.c, + tif_predict.c, tif_read.c, tif_swab.c, tif_thunder.c, tif_write.c, + tif_dir.c, tif_dirread.c, tif_dirwrite.c, tif_jpeg.c, tif_dirinfo.c, + tif_vms.c, tif_print.c, tif_strip.c, tif_tile.c, tif_dir.h, + tif_config.h.in, tiffiop.h}: + Get rid of BSD data types (u_char, u_short, u_int, u_long). + +2004-09-13 Bob Friesenhahn + + * libtiff/tiff.h: Fix column tagging. Reference current Adobe XMP + specification. Reference libtiff bug tracking system to submit + private tag additions. + +2004-09-12 Bob Friesenhahn + + * tools/tiffgt.c: Include "tif_config.h". + + * configure.ac: Use AM_PROG_CC_C_O since it is now needed to build + tiffgt. This results in the 'compile' script being added to the + project. + + * tools/Makefile.am (tiffgt_CFLAGS): Add extra build options + required to find OpenGL headers necessary to build tiffgt. Also + ensure that the libtiff that we built is used rather than some other + libtiff installed on the system. + +2004-09-12 Andrey Kiselev + + * configure.ac, acinclude.m4, aclocal.m4: New macros to detect GLUT + libraries. + +2004-09-11 Bob Friesenhahn + + * configure.ac: Pass library configuration defines via + tif_config.h rather than extending CPPFLAGS. Configure a + libtiff/tiffconf.h in order to satisfy application requirements + (not used by library build). Do not define _POSIX_C_SOURCE=2 since + this causes failure to build on systems which properly respect + this request. + + * libtiff/tiffconf.h.in: New file to act as the template for the + configured tiffconf.h + + * libtiff/files.lst (HDRS): Install the configured tiffconf.h. + +2004-09-10 Frank Warmerdam + + * html/internals.html: Split off a discussion of adding new tags + into addingtags.html. + +2004-09-10 Andrey Kiselev + + * test/{ascii_tag.c, long_tag.c}: Preliminary test suite added. + + * tools/tiff2pdf.c: Fixed reading TransferFunction tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=590 + + * libtiff/tif_print.c: Fixes in InkNames and NumberOfInks reporting. + + * libtiff/tif_dirread.c: Don't reject to read tags of the + SamplesPerPixel size when the tag count is greater than number of + samples as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=576 + + * libtiff/tiff.h: Use _TIFF_DATA_TYPEDEFS_ guardian to switch off + defining int8/uint8/... etc. types. As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=607 + +2004-09-09 Frank Warmerdam + + * tools/tiff2ps.c, tools/tiffmedian.c: fiddle with include files + to avoid compile warnings about getopt() and a few other things. + +2004-09-02 Andrey Kiselev + + * libtiff/tif_dirread.c: Use memcpy() function instead of pointer + assigning magic in TIFFFetchFloat(). + +2004-09-01 Andrey Kiselev + + * libtiff/{tiffio.h, tif_open.c}: Applied patches from Joris Van Damme + to avoid requirement for tiffiop.h inclusion in some applications. See + here + + http://www.asmail.be/msg0054799560.html + + for details. + + * tools/fax2tiff.c: Use the new functions in the code. + +2004-08-25 Andrey Kiselev + + * tools/tiff2pdf.c: Initialize arrays properly. + + * tools/tiff2ps.c: Avoid zero division in setupPageState() function; + properly initialize array in PSDataBW(). + +2004-08-24 Andrey Kiselev + + * tools/tiff2pdf.c: More fixes for bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=590 + + from Ross Finlayson. + +2004-08-23 Andrey Kiselev + + * tools/tiff2ps.c: Fixed problem with uninitialized values. + + * libtiff/tif_dir.c: Initialize tif_foundfield data member in the + TIFFDefaultDirectory() (in addition to 2004-08-19 fix). + + * tools/tiff2pdf.c: Fixed a bunch of problems as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=590 + +2004-08-20 Andrey Kiselev + + * tools/tiff2pdf.c: Applied patch from Ross Finlayson that checks + that the input file has compression, photometric interpretation, + etcetra, tags or if not than a more descriptive error is returned. + + * libtiff/tif_dirread.c: Fixed problem in TIFFReadDirectory() in the + code, responsible for tag data type checking. + +2004-08-19 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_dirinfo.c}: Fixed problem with the static + variable as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=593 + +2004-08-16 Andrey Kiselev + + * tools/ras2tiff.c: Fixed issue with missed big-endian checks as per + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=586 + +2004-08-01 Andrey Kiselev + + * libtiff/{tif_config.h.in, tif_config.h.vc}: config.h.in and + config.h.vc files renamed in the tif_config.h.in and tif_config.h.vc. + +2004-07-24 Andrey Kiselev + + * libtiff/tif_lzw.c: LZW compression code is merged back from the + separate package. All libtiff tools are updated to not advertise an + abcence of LZW support. + +2004-07-12 Andrey Kiselev + + * libtiff/tiffio.h: Revert thandle_t back to void* type. + +2004-07-11 Andrey Kiselev + + * libtiff/{tif_read.c, tif_tile.c, tif_strip.c}: Fixes in error + messages, as suggested by Bernd Herd. + +2004-07-03 Andrey Kiselev + + * libtiff/tif_dir.c: Call TIFFError() instead of producing warnings + when setting custom tags by value. Reported by Eric Fieleke. + +2004-06-14 Andrey Kiselev + + * tools/bmp2tiff.c: Add missed RawsPerStrip setting. + +2004-06-08 Andrey Kiselev + + * tools/bmp2tiff.c: Added new utility to convert Windows BMP files + into TIFFs. + +2004-06-07 Andrey Kiselev + + * libtiff 3.7.0alpha released. + +2004-06-06 Andrey Kiselev + + * libtiff/{tiff.h, tif_dirwrite.c, tif_fax3.c, tif_packbits.c,}: Get rid + of ugly 64-bit hacks, replace them with the clever (autoconf based ) + ones :-). + + * libtiff/tiffio.h: Define thandle_t as int, not void* (may cause + problems in 64-bit environment). + +2004-06-05 Andrey Kiselev + + * tools/tiffset.c: tiffset now can set any libtiff supported tags. + Tags can be supplied by the mnemonic name or number. + + * libtiff/{tiffio.h, tif_dir.h, tif_dirinfo.c,}: Added two new + functions TIFFFindFieldInfoByName() and TIFFFieldWithName(). + +2004-05-27 Andrey Kiselev + + * libtiff/tif_ojpeg.c: Fixed problem with duplicated SOI and SOF + markers as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=581 + +2004-05-24 Andrey Kiselev + + * tools/tiffsplit.c: Don't forget to copy Photometric + Interpretation tag. + +2004-05-20 Andrey Kiselev + + * libtiff/{tif_open.c, tiffio.h}: New function added: + TIFFIsBigEndian(). Function returns nonzero if given was file written + in big-endian order. + + * tools/tiffsplit.c: Fixed problem with unproperly written multibyte + files. Now output files will be written using the same byte order + flag as in the input image. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=574 + + for details. + +2004-05-19 Frank Warmerdam + + * libtiff/tif_print.c: added (untested) support for printing + SSHORT, SLONG and SRATIONAL fields. + + * tools/tiffcp.c: close output file on normal exit. + +2004-05-17 Andrey Kiselev + + * libtiff/tif_fax3.c: Avoid reading CCITT compression options + if compression type mismatches. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=565 + +2004-04-30 Andrey Kiselev + + * libtiff/tif_strip.c: Never return 0 from the + TIFFNumberOfStrips(). + +2004-04-29 Andrey Kiselev + + * libtiff/tif_dirread.c: Workaround for broken TIFF writers which + store single SampleFormat value for multisampled images. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=562 + +2004-04-25 Andrey Kiselev + + * configure.ac, libtiff/{tiff.h, config.h.in}: Added tests for int8, + int16 and int32 types to avoid complains on some compilers. Details at + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2004-04-20 Andrey Kiselev + + * tools/tiff2pdf.c: Fixed problem with unaligned access as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=555 + +2004-04-14 Andrey Kiselev + + * libtiff/tif_write.c: Allow in-place updating of the compressed + images (don't work properly with all codecs). For details see GDAL bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=534 + +2004-04-06 Andrey Kiselev + + * libtiff/tif_jpeg.c: Workaround for wrong sampling factors used + in the Intergarph JPEG compressed TIFF images as per bug: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=532 + +2004-04-04 Frank Warmerdam + + * libtiff/tif_open.c: close clientdata if TIFFClientOpen() fails + via bad2. + +2004-03-26 Andrey Kiselev + + * tools/tiffcp.c: Properly set Photometric Interpretation in case of + JPEG compression of grayscale images. + + * tools/tiffcp.c: Don't emit warnings when Orientation tag does not + present in the input image. + +2004-03-19 Andrey Kiselev + + * {many}: The first attempt to switch to autotools. + +2004-03-03 Andrey Kiselev + + * libtiff/tif_open.c: Use dummy mmap/munmap functions in + TIFFClientOpen() when the appropriate client functions was not + supplied by user. + +2004-03-02 Frank Warmerdam + + * tools/ycbcr.c: fixed main() declaration as per: + http://bugzilla.remotesensing.org/show_bug.cgi?id=513 + +2004-02-26 Andrey Kiselev + + * tools/tiffsplit.c: Copy JPEGTables tag contents for JPEG compressed + images. Reported by Artem Mirolubov. + + * libtiff/tif_dirread.c: Fixed problem with handling TIFF_UNDEFINED + tag type in TIFFFetchNormalTag() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=508 + +2004-02-17 Frank Warmerdam + + * libtiff/tif_codec.c: Fixed typo in TIFFInitPackBits name as per: + http://bugzilla.remotesensing.org/show_bug.cgi?id=494 + +2004-02-05 Andrey Kiselev + + * libtiff/tif_fax3.c: Fixed problem with CCITT encoding modes as per + bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=483 + + But we need more work on fax codec to support update mode. + +2004-01-30 Frank Warmerdam + + * libtiff/libtiff.def: Added TIFFCurrentDirOffset, TIFFWriteCheck, + TIFFRGBAImageOK, and TIFFNumberOfDirectories as suggested by + Scott Reynolds. + +2004-01-29 Andrey Kiselev + + * libtiff/tiff.h: Fixed tag definitions for TIFFTAG_YCLIPPATHUNITS + and TIFFTAG_INDEXED as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=475 + + * libtiff/{tif_win32.c, tif_unix.c}: Check whether the pointer is + NULL before proceeding further as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=474 + + Check results, returned by the TIFFFdOpen() before returning and close + file if TIFFFdOpen() failed as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=468 + + * libtiff/tif_open.c: More fixes for + + http://bugzilla.remotesensing.org/show_bug.cgi?id=468 + +2004-01-28 Andrey Kiselev + + * libtiff/{libtiff.def, tif_close.c, tiffio.h, tif_open.c}: Separate + TIFFCleanup() from the TIFFClose() in order to fix the bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=468 + + * tools/tiffcp.c: Fixed problem with wrong interpretation of the + InkNames tag as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=466 + + Memory leak fixed. + +2004-01-21 Frank Warmerdam + + * libtiff/tif_dirwrite.c: Fixed handling of writable ASCII tags that + are field_passcount=TRUE properly. Arguably anonymous custom tags + should be declared as passcount=FALSE, but I don't want to change + that without a careful review. + +2004-01-20 Andrey Kiselev + + * libtiff/tif_write.c: Fixed reporting size of the buffer in case of + stripped image in TIFFWriteBufferSetup(). As per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=460 + +2004-01-11 Andrey Kiselev + + * libtiff/tif_dir.c: Incomplete cleanup in TIFFFreeDirectory(), + patch from Gerben Koopmans. + + * libtiff/tif_dirread.c: Check field_passcount value before setting + the value of undefined type, patch from Gerben Koopmans. + +2004-01-02 Andrey Kiselev + + * tools/tiffcp.c: Fixed problem with wrong Photometric setting for + non-RGB images. + +2003-12-31 Andrey Kiselev + + * libtiff/tif_win32.c: Fixed problem with _TIFFrealloc() when the NULL + pointer passed. Patch supplied by Larry Grill. + + * libtiff/{tiff.h, tif_fax3.c}:Fixes for AMD 64 platform as + suggested by Jeremy C. Reed. + +2003-12-26 Andrey Kiselev + + * libtiff 3.6.1 released. + +2003-12-24 Andrey Kiselev + + * config.guess, config.sub: Updated from the recent upstream. + +2003-12-22 Andrey Kiselev + + * libtiff/{tif_color, tif_getimage.c, tiffio.h}, man/TIFFcolor.3t: + More cleanups in color conversion interface, added appropriate manual + page. + +2003-12-19 Andrey Kiselev + + * libtiff/{tif_extension.c, tif_dirinfo.c, tiff.h}: Warnings fixed as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=357 + + * tools/tiff2ps.c: Added support for alpha channel. Fixes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=428 + + * libtiff/{libtiff.def, tif_color.c, tif_getimage.c, tiffio.h}: + Interface for Lab->RGB color conversion is finally cleaned up. + Added support for ReferenceBlackWhite tag handling when converted from + YCbCr color space. The latter closes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=120 + +2003-12-07 Andrey Kiselev + + * libtiff/{tif_getimage.c, tiffio.h}: Avoid warnings. + + * libtiff/makefile.vc, tools/makefile.vc: Support for IJG JPEG + library. + +2003-12-06 Andrey Kiselev + + * libtiff/{tif_getimage.c, tif_aux.c}: Read WhitePoint tag from the + file and properly use it for CIE Lab->RGB transform. + +2003-12-04 Andrey Kiselev + + * libtiff/{tif_getimage.c, tif_color.c, tiffio.h}: YCbCr->RGB + conversion routines now in the tif_color.c module. New function + TIFFYCbCrtoRGB() available in TIFF API. + + * libtiff/tif_dirwrite.c: Handle TIFF_IFD tag type correctly. + +2003-12-03 Andrey Kiselev + + * libtiff/{tif_getimage.c, tif_color.c, tiffio.h}: Improvements in + CIE Lab conversion code. Start moving YCbCr stuff to the tif_color.c + module. + + * libtiff/{tif_getimage.c, tiffio.h}, man{TIFFReadRGBAImage.3t, + TIFFReadRGBAStrip.3t, TIFFReadRGBATile.3t, TIFFRGBAImage.3t}: + Finally resolved problems with orientation handling. TIFFRGBAImage + interface now properly supports all possible orientations, i.e. images + will be flipped both in horizontal and vertical directions if + required. 'Known bugs' section now removed from the appropriate manual + pages. Closed bug entry: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=322 + +2003-12-02 Andrey Kiselev + + * libtiff/tif_dir.c: Fixed order of the parameters in TIFFError() + function calls as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=440 + +2003-11-28 Ross Finlayson + + * tools/tiff2pdf.c: Some bugs fixed. + +2003-11-27 Andrey Kiselev + + * libtiff/tif_luv.c: Fixed bug in 48-bit to 24-bit conversion routine, + reported by Antonio Scuri. + + * man/tiff2pdf.1: Few improvements in page layout. + + * Makefile.in, /man/Makefile.in, /html/man/tiff2pdf.1.html: + Added support fpr tiff2pdf manual page. + +2003-11-26 Ross Finlayson + + * /man/tiff2pdf.1: File added to repository. + +2003-11-26 Andrey Kiselev + + * Makefile.in, /tools/{Makefile.in, makefile.vc}: + Added support fpr tiff2pdf utility. + +2003-11-25 Ross Finlayson + + * /tools/tiff2pdf.c: File added to repository. + +2003-11-22 Andrey Kiselev + + * /tools/raw2tiff.c: sqrtf() replaced with sqrt(). + +2003-11-21 Andrey Kiselev + + * /tools/raw2tiff.c: #include removed. + + * tools/{Makefile.in, tiffgt.c}: Unmaintained and platform dependent + sgigt utility removed and replaced with the completely rewritten + portable tiffgt tool (depend on OpenGL and GLUT). Initial revision, + there is a lot of things to improve. + + * libtiff/tif_ojpeg.c: TIFFVGetField() function now can properly + extract the fields from the OJPEG files. Patch supplied by Ross + Finlayson. + + * libtiff/{tiffio.h, tif_codec.c}, man/{libtiff.3t, TIFFcodec.3t}: + Added new function TIFFIsCODECConfigured(), suggested by Ross + Finlayson. + +2003-11-18 Andrey Kiselev + + * libtiff/tif_dirinfo.c: Implemented binary search in + _TIFFMergeFieldInfo(). Patch supplied by Ross Finlayson. + + * libtiff/tif_dir.h: _TIFFFindOrRegisterdInfo declaration replaced + with _TIFFFindOrRegisterFieldInfo as reported by Ross Finlayson. + +2003-11-17 Frank Warmerdam + + * tif_dirread.c: do not mark all anonymously defined tags to be + IGNOREd. + +2003-11-17 Andrey Kiselev + + * contrib/pds/{tif_pdsdirread.c, tif_pdsdirwrite.c}: Use + TIFFDataWidth() function insted of tiffDataWidth array. + +2003-11-16 Andrey Kiselev + + * libtiff/{tiff.h, tif_dirinfo.c}: Added support for IFD (13) + datatype, intruduced in "Adobe PageMaker TIFF Tech. Notes". + +2003-11-15 Frank Warmerdam + + * Makefile.in: fixed missing backslash for tif_color.c in list. + +2003-11-13 Andrey Kiselev + + * libtiff/{tif_color.c, tif_getimage.c, tiffio.h, Makefile.in}: + New color space conversion code: CIE L*a*b* 1976 images now supported + by the TIFFRGBAImage interface. All introduced routines go to new + module tif_color.c. Eventually all color conversion functions should + be moved there. + +2003-11-12 Andrey Kiselev + + * tools/{ras2tiff.c, rasterfile.h}: Properly determine SUN Rasterfiles + with the reverse byte order (it is reported by the magic header + field). Problem reported by Andreas Wiesmann. + + * tools/raw2tiff.c, man/raw2tiff.1: Few improvements in correlation + calculation function. Guessing mechanics now documented in manual page. + +2003-11-11 Andrey Kiselev + + * tools/raw2tiff.c: Implemented image size guessing using + correlation coefficient calculation between two neighbour lines. + +2003-11-09 Frank Warmerdam + + * libtiff/tif_tile.c: remove spurious use of "s" (sample) in the + planarconfig_contig case in TIFFComputeTile(). + + http://bugzilla.remotesensing.org/show_bug.cgi?id=387 + +2003-11-09 Andrey Kiselev + + * libtiff/tiffiop.h: New macros: TIFFmax, TIFFmin and TIFFrint. + +2003-11-07 Andrey Kiselev + + * libtiff/{tiffio.h, tif_strip.c}, man/{TIFFstrip.3t, libtiff.3t}: + Added TIFFRawStripSize() function as suggested by Chris Hanson. + +2003-11-03 Andrey Kiselev + + * libtiff/{tif_lzw.c, tif_fax3.c}: Proper support for update mode as + per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=424 + +2003-10-29 Andrey Kiselev + + * libtiff/libtiff.def: Added TIFFReadRGBAImageOriented. + + * html/build.html: Added note about GNU make requirement. + +2003-10-25 Andrey Kiselev + + * Makefile.in: Fixes in using MAKEFLAGS as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=418 + + * port/install.sh.in: Option -p added to the mkdir command to create + all directory tree structure before installing. + +2003-10-18 Andrey Kiselev + + * /tools/tiff2ps.c: #include replaced with the + #include . + +2003-10-16 Andrey Kiselev + + * Makefile.in: Add an absolute path to the test_pics.sh call. + +2003-10-12 Andrey Kiselev + + * libtiff/tiffcomp.h: #define _BSDTYPES_DEFINED when defining BSD + typedefs. + +2003-10-09 Andrey Kiselev + + * configure, libtiff/{Makefile.in, mkversion.c}: + Relative buildings fixed. + + * tools/Makefile.in: Added "-I../libtiff" to the tiffset building + rule. + +2003-10-07 Andrey Kiselev + + * Makefile.in: Added missed v3.6.0.html. + + * libtiff/tiffio.h: Typo fixed: ORIENTATION_BOTTOMLEFT replaced with + ORIENTATION_BOTLEFT. + +2003-10-04 Andrey Kiselev + + * 3.6.0 final release. + +2003-10-03 Andrey Kiselev + + * libtiff/{tif_getimage.c, tiffio.h}, man/TIFFReadRGBAImage.3t: New + function TIFFReadRGBAImageOriented() implemented to retrieve raster + array with user-specified origin position as suggested by Jason Frank. + See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=322 + + for details. + + * tools/tiff2rgba.c: Switched to use TIFFReadRGBAImageOriented() + instead of TIFFReadRGBAImage(). + + * tools/tiff2ps.c: Fixed possible endless loop as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=404 + +2003-09-30 Andrey Kiselev + + * libtiff/tif_dirread.c: Check field counter against number of fields + in order to fix + + http://bugzilla.remotesensing.org/show_bug.cgi?id=366 + + * libtiff/tif_fax3.c: Fix wrong line numbering as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=342 + +2003-09-25 Andrey Kiselev + + * libtiff/{tiffiop.h, tif_dirread.c, tif_dir.c, tif_open.c, + tif_close.c}: Store a list of opened IFD to prevent looping as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=383 + +2003-09-23 Andrey Kiselev + + * libtiff/tif_dirread.c: More fixes for EstimateStripByteCounts(). See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=358 + +2003-08-21 Andrey Kiselev + + * tools/tiffmedian.c: int declaration replaced with the uint32 to + support large images as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=382 + +2003-08-12 Andrey Kiselev + + * libtiff/Makefile.in: Fixed problem with building in different + directory. + + * tools/tiff2ps.c: Added missing #include . + + * libtiff/tif_dirwrite.c: More fixes for custom tags code + from Ashley Dreier. + +2003-08-07 Andrey Kiselev + + * tools/tiff2ps.c: Added page size setting when creating PS Level 2. + Patch submitted by Balatoni Denes (with corrections from Tom + Kacvinsky). + + * tools/tiff2ps.c: Fixed PS comment emitted when FlateDecode is + being used. Reported by Tom Kacvinsky. + + * libtiff/tif_dirwrite.c: Fixed problem with custom tags writing, + reported by Ashley Dreier. + + * libtiff/tif_print.c: Fixed problem with float tags reading, support + for printing RATIONAL and BYTE tags added. + +2003-08-05 Andrey Kiselev + + * libtiff/tif_lzw.c: Move LZW codec state block allocation back to + TIFFInitLZW(), because its initialization in LZWSetupDecode() cause + problems with predictor initialization. Remove O_RDONLY check during + state block allocation to be able open LZW compressed files in update + mode. + + Problem exist for libtiff version of the tif_lzw.c module. One from + lzw-compression-kit hasn't such troubles. + +2003-08-04 Frank Warmerdam + + * libtiff/tif_write.c: modified tif_write.c so that the various + encoded write functions use tif_postdecode() to apply byte order + swapping (swab) to the application passed data buffer if the same + would be done when reading. This allows us to write pixel data with + more than 8 bits per sample to existing files of a non-native byte + order. One side effect of this change is the applications buffer + itself is altered in this case by the act of writing. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=171 + +2003-07-25 Frank Warmerdam + + * libtiff/tif_open.c: avoid signed/unsigned casting warning + initializing typemask as per patch from J.A. Strother. + + * tools/tiffcp.c: fixed signed/unsigned casting warning. + + * libtiff/tif_print.c: dos2unix conversion. + + * tools/tiffsplit.c: increased the maximum number of pages that + can be split. Patch provided by Andrew J. Montalenti. + +2003-07-11 Andrey Kiselev + + * tools/raw2tiff.c: Added option `-p' to explicitly select color + space of input image data. Closes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=364 + +2003-07-08 Frank Warmerdam + + * tif_aux.c, tif_codec.c, tif_dir.c, tif_dirread.c, tif_extension.c, + tif_fax3.c, tif_getimage.c, tif_luv.c, tif_lzw.c, tif_next.c, + tif_packbits.c, tif_predict.c, tif_print.c, tif_swab.c, tif_thunder.c: + avoid casting warning at /W4. + +2003-07-03 Andrey Kiselev + + * tools/thumbnail.c: Memory leak fixed as reported by Robert S. Kissel. + +2003-06-30 Andrey Kiselev + + * libtiff/tif_pixarlog.c: Unused variables removed. + + * libtiff/{tif_dirread.c, tif_dir.c}: Fixed problem with + EstimateStripByteCounts() as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=358 + + * libtiff/{tif_dirwrite.c, tif_packbits.c}: Fixed compilation on + 64-bit architectures as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=357 + + * libtiff/tif_dirinfo.c: TIFFDataWidth() returns 0 in case of + unknown data type. + +2003-06-19 Frank Warmerdam + + * libtiff/tif_print.c: fixed some serious bugs when printing + custom tags ... almost certain to crash. + + * libtiff/tif_dirread.c: Don't ignore custom fields that are + autodefined. Not sure how this got to be like this. + +2003-06-18 Andrey Kiselev + + * 3.6.0 Beta2 released. + + * tools/tiffcmp.c, man/tiffcmp.1: Fixed problem with unused data + comparing as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=349 + + `-z' option now can be used to set the number of reported different + bytes. + +2003-06-09 Andrey Kiselev + + * tools/tiffcp.c, man/tiffcp.1: Added possibility to specify value -1 + to -r option to get the entire image as one strip. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=343 + + for details. + +2003-06-04 Andrey Kiselev + + * tools/tiffcp.c: Set the correct RowsPerStrip and PageNumber + values as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=343 + +2003-05-27 Frank Warmerdam + + * libtiff/tif_jpeg.c: modified segment_height calculation to always + be a full height tile for tiled images. Also changed error to just + be a warning. + +2003-05-25 Andrey Kiselev + + * tools/fax2tiff.c: Page numbering fixed, as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=341 + +2003-05-20 Andrey Kiselev + + * contrib/ojpeg/{Makefile.in, jdhuff.h, jinclude.h, ojpeg.c, README}, + configure, Makefile.in: Switched back to the old behaviour. Likely + better solution should be found for OJPEG support. + +2003-05-11 Andrey Kiselev + + * libtiff/mkversion.c: Fixed problem with wrong string size when + reading RELEASE-DATE file. + +2003-05-07 Andrey Kiselev + + * tools/tiff2ps.c: Fixed bug in Ascii85EncodeBlock() function: array + index was out of range. + +2003-05-06 Andrey Kiselev + + * contrib/ojpeg/{Makefile.in, jdhuff.h, jinclude.h, ojpeg.c, README}, + configure, Makefile.in: Improved libtiff compilation with OJPEG + support. Now no need for patching IJG JPEG library, hack requred by + libtiff will be compiled and used in-place. Implemented with + suggestion and help from Bill Allombert, Debian's libjpeg maintainer. + + * libtiff/tif_aux.c: Properly handle TIFFTAG_PREDICTOR in + TIFFVGetFieldDefaulted() function. + +2003-05-05 Andrey Kiselev + + * tools/ppm2tiff.c: PPM header parser improved: now able to skip + comments. + + * tools/tiffdither.c: Fixed problem with bit fill order tag setting: + was not copied from source image. + + * libtiff/getimage.c: Workaround for some images without correct + info about alpha channel as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=331 + +2003-04-29 Andrey Kiselev + + * tools/tiff2ps.c, man/tiff2ps.1: Add ability to generate PS Level 3. + It basically allows one to use the /flateDecode filter for ZIP + compressed TIFF images. Patch supplied by Tom Kacvinsky. Fixes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=328 + + * tools/tiff2ps.c: Force deadzone printing when EPS output specified + as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=325 + +2003-04-17 Andrey Kiselev + + * libtiff/tif_dirread.c: Removed additional check for StripByteCounts + due to problems with multidirectory images. Quality of error messages + improved. + +2003-04-16 Andrey Kiselev + + * tools/tiffcp.c: Fixed problem with colorspace conversion for JPEG + encoded images. See bug entries + + http://bugzilla.remotesensing.org/show_bug.cgi?id=275 + + and + + http://bugzilla.remotesensing.org/show_bug.cgi?id=23 + + * libtiff/tif_dirread.c: Additional check for StripByteCounts + correctness. Fixes + + http://bugzilla.remotesensing.org/show_bug.cgi?id=320 + +2003-03-12 Andrey Kiselev + + * tools/{fax2ps.c, fax2tiff.c, gif2tiff.c, pal2rgb.c, ppm2tiff.c, + ras2tiff.c, raw2tiff.c, rgb2ycbcr.c, thumbnail.c, tiff2bw.c, + tiff2ps.c, tiff2rgba.c, tiffcp.c, tiffdither.c, tiffinfo.c, + tiffmedian.c}: Added library version reporting facility to all tools. + +2003-03-06 Frank Warmerdam + + * port/install.sh.in: Fixed problems with install producing paths + like ///usr/local/lib on cygwin. + +2003-02-27 Andrey Kiselev + + * tools/fax2tiff.c, man/fax2tiff.1: New switch (-X) to set width of + raw input page. Patch supplied by Julien Gaulmin. See + + http://bugzilla.remotesensing.org/show_bug.cgi?id=293 + + for details. + +2003-02-26 Frank Warmerdam + + * libtiff/tif_dir.c: fixed up the tif_postdecode settings + responsible for byte swapping complex image data. + + * libtiff/tif_lzw.c: fixed so that decoder state isn't allocated till + LZWSetupDecode(). Needed to read LZW files in "r+" mode. + +2003-02-07 Andrey Kiselev + + * tools/ppm2tiff.c: Fixed problem with too many arguments. + +2003-02-04 Andrey Kiselev + + * tools/raw2tiff.c: Memory leak fixed. + +2003-02-03 Andrey Kiselev + + * tools/fax2tiff.c, man/fax2tiff.1: Applied patch from Julien Gaulmin + (thanks, Julien!). More switches for fax2tiff tool for better control + of input and output. Details at + + http://bugzilla.remotesensing.org/show_bug.cgi?id=272 + +2003-02-03 Frank Warmerdam + + * libtiff/tif_jpeg.c: Modified to defer initialization of jpeg + library so that we can check if there is already any tile/strip data + before deciding between creating a compressor or a decompressor. + +2003-01-31 Frank Warmerdam + + * libtiff/tif_write.c: TIFFWriteCheck() now fails if the image is + a pre-existing compressed image. That is, image writing to + pre-existing compressed images is not allowed. + + * libtiff/tif_open.c: Removed error if opening a compressed file + in update mode. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=198 + +2003-01-31 Andrey Kiselev + + * config.guess, config.sub: Updated to recent upstream versions. + +2003-01-15 Frank Warmerdam + + * cut 3.6.0 Beta release. + +2002-12-20 Andrey Kiselev + + * tools/fax2ps.c, man/fax2ps.1: Page size was determined + in wrong way as per bug + + http://bugzilla.remotesensing.org/show_bug.cgi?id=239 + +2002-12-17 Frank Warmerdam + + * libtiff/tif_dirread.c: Allow wrong sized arrays in + TIFFFetchStripThing(). + + http://bugzilla.remotesensing.org/show_bug.cgi?id=49 + +2002-12-02 Frank Warmerdam + + * libtiff/tif_dir.c: fix problem with test on td_customValueCount. + Was using realloc even first time. Fix by Igor Venevtsev. + +2002-11-30 Frank Warmerdam + + * libtiff/tif_dir.c: fixed bug with resetting an existing custom + field value. + + * libtiff/tif_dir.c: Fixed potential problem with ascii "custom" + tags in TIFFVGetField() ... added missing break. + +2002-10-14 Frank Warmerdam + + * tools/tiff2ps.c: fixes a problem where "tiff2ps -1e" did not make + the scanline buffer long enough when writing rgb triplets. + The scanline needs to be 3 X the number of dots or else it will + contain an incomplete triplet and programs that try to separate + the eps by redefining the colorimage operator will get messed up. + Patch supplied by William Bader. + + * Makefile.in: added tif_extension.c to file list as per + http://bugzilla.remotesensing.org/show_bug.cgi?id=218. + +2002-10-11 Andrey Kiselev + + * configure, config.site, libtiff/{tif_unix.c, Makefile.in}: Fix for + large files (>2GiB) supporting. New option in the config.site: + LARGEFILE="yes". Should be enough for I/O of the large files. + +2002-10-10 Frank Warmerdam + + * libtiff/html/v3.6.0.html: new release notes. + + * libtiff/index.html: removed faq, cvs snapshot cruft. Added email + link for Andrey. Pointer to v3.6.0.html. + + * libtiff/Makefile.in: added direct rule for tiffvers.h for release. + +2002-10-07 Andrey Kiselev + * tools/tiff2ps.c, man/tiff2ps.1: Applied patch form Sebastian Eken + (thanks, Sebastian!). New switches: + -b # for a bottom margin of # inches + -c center image + -l # for a left margin of # inches + -r rotate the image by 180 degrees + New features merged with code for shrinking/overlapping. + Previously added -c and -n switches (for overriding PS units) renamed + in -x and -y respectively. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=200 + + * html/man/*.html: Updated from actual manual pages. + +2002-10-06 Frank Warmerdam + + * libtiff/tif_jpeg.c: fixed problem with boolean defined with wrong + size on windows. Use #define boolean hack. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=188 + + * libtiff/tiff.h: Don't do special type handling in tiff.h unless + USING_VISUALAGE is defined. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2002-10-03 Frank Warmerdam + + * libtiff/tiff.h: added COMPRESSION_JP2000. + +2002-10-02 Andrey Kiselev + + * libtiff/tif_dirread.c: Another fix for the fetching SBYTE arrays + by the TIFFFetchByteArray() function. Should finally resolve + + http://bugzilla.remotesensing.org/show_bug.cgi?id=52 + + * configure: Set -DPIXARLOG_SUPPORT option along with -DZIP_SUPPORT + + * html/Makefile.in: New targets added: html and groffhtml for + producing HTML representations of the manual pages automatically. + html target uses man2html tool, groffhtml uses groff tool. + +2002-09-29 Frank Warmerdam + + * configure, libtiff/Makefile.in: Added SCO OpenServer 5.0.6 support + from John H. DuBois III. + +2002-09-15 Andrey Kiselev + + * Makefile.in, /man/{raw2tiff.1, Makefile.in, libtiff.3}: Added + manual page for raw2tiff(1) tool. + +2002-09-12 Andrey Kiselev + + * /libtiff/{tiffio.h, tif_dir.h}: TIFFDataWidth() declaration moved to + the tiffio.h header file. + + * Makefile.in, /man/{TIFFDataWidth.3t, Makefile.in, libtiff.3}: Added + manual page for TIFFDataWidth() function + +2002-09-08 Frank Warmerdam + + * libtiff/tif_dirread.c: Expand v[2] to v[4] in TIFFFetchShortPair() + as per http://bugzilla.remotesensing.org/show_bug.cgi?id=196. + + * tools/tiff2ps.c: Don't emit BeginData/EndData DSC comments + since we are unable to properly include the amount to skip. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=80 + +2002-09-02 Andrey Kiselev + + * /libtiff/tif_dirread.c: Fixed problem with SBYTE type data fetching + in TIFFFetchByteArray(). Problem described at + http://bugzilla.remotesensing.org/show_bug.cgi?id=52 + +2002-08-22 Andrey Kiselev + + * /libtiff/tif_dirinfo.c: Further additions to free custom fields + in _TIFFSetupFieldInfo() function. + See http://bugzilla.remotesensing.org/show_bug.cgi?id=169 for details. + + * /libtiff/tif_lzw.c: Additional consistency checking added in + LZWDecode() and LZWDecodeCompat(). + Fixes http://bugzilla.remotesensing.org/show_bug.cgi?id=190 + and http://bugzilla.remotesensing.org/show_bug.cgi?id=100 + + * /libtiff/tif_lzw.c: + Added check for valid code lengths in LZWDecode() and + LZWDecodeCompat(). Fixes + http://bugzilla.remotesensing.org/show_bug.cgi?id=115 + +2002-08-16 Andrey Kiselev + + * /libtiff/{Makefile.vc, libtiff.def}: + Missed declarations added. + +2002-08-15 Frank Warmerdam + + * tif_getimage.c: Ensure that TIFFRGBAImageBegin() returns the + return code from the underlying pick function. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=177 + + * tif_dir.h: changed FIELD_CODEC to 66 from 64 to avoid overlap + with FIELD_CUSTOM as mentioned in bug 169. + + * tif_close.c: added logic to free dynamically created anonymous + field definitions to correct a small memory leak. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=169 + +2002-08-10 Andrey Kiselev + + * /tools/{raw2tiff.c, Makefile.in, Makefile.lcc, Makefile.vc}: + New tool: raw2tiff --- raw images to TIFF converter. No manual page yet. + +2002-07-31 Frank Warmerdam + + * libtiff/tif_jpeg.c: Fixed problem with setting of nrows in + JPEGDecode() as per bugzilla bug (issue 1): + + http://bugzilla.remotesensing.org/show_bug.cgi?id=129 + + * libtiff/{tif_jpeg.c,tif_strip.c,tif_print.c}: Hacked tif_jpeg.c to + fetch TIFFTAG_YCBCRSUBSAMPLING from the jpeg data stream if it isn't + present in the tiff tags. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=168 + + * libtiff/tif_read.c, libtiff/tif_write.c: TIFFReadScanline() and + TIFFWriteScanline() now set tif_row explicitly in case the codec has + fooled with the value. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=129 + +2002-06-22 Andrey Kiselev + + * /tools/tiff2ps.c: Added workaround for some software that may crash + when last strip of image contains fewer number of scanlines than + specified by the `/Height' variable. See + http://bugzilla.remotesensing.org/show_bug.cgi?id=164 + for explanation. + +2002-06-21 Andrey Kiselev + + * tools/tiff2ps, man/tiff2ps.1: New functionality for tiff2ps utility: + splitting long images in several pages. See + http://bugzilla.remotesensing.org/show_bug.cgi?id=142 for explanation. + Patch granted by John Williams . + +2002-06-11 Frank Warmerdam + + * libtiff/contrib/win95: renamed to contrib/win_dib. Added new + Tiffile.cpp example of converting TIFF files into a DIB on Win32. + This one is described in: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=143 + + * libtiff/tif_ojpeg.c: Major upgrade from Scott. See details at: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=156 + +2002-05-10 Andrey Kiselev + + * tools/tiff2ps: New commandline switches to override resolution + units obtained from the input file. Closes + http://bugzilla.remotesensing.org/show_bug.cgi?id=131 + +2002-04-26 Andrey Kiselev + + * libtiff/libtiff.def: Added missed declaration. + +2002-04-22 Andrey Kiselev + + * tools/fax2tiff.c: Updated to reflect latest changes in libtiff. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=125 + +2002-04-20 Andrey Kiselev + + * libtiff/tif_open.c: Pointers to custom procedures + in TIFFClientOpen() are checked to be not NULL-pointers. + +2002-04-18 Andrey Kiselev + + * libtiff/libtiff.def: Added missed declarations. + + * libtiff/tif_pixarlog.c: Updated for using tif_tagmethods structure. + +2002-04-16 Andrey Kiselev + + * libtiff/tif_lzw.c: Additional checks for data integrity introduced. + Should finally close + http://bugzilla.remotesensing.org/show_bug.cgi?id=100 + +2002-04-10 Andrey Kiselev + + * tools/tiff2ps: Division by zero fixed. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=88 + +2002-04-09 Andrey Kiselev + + * libtiff/: tif_dirwrite.c, tif_write.c, tiffio.h: + TIFFCheckpointDirectory() routine added. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=124 + + * man/: TIFFWriteDirectory.3t, Makefile.in: Added description + for the new function. + +2002-04-08 Andrey Kiselev + + * libtiff/: tif_codec.c, tif_compress.c, tiffiop.h: Introduced + additional members tif->tif_decodestatus and tif->tif_encodestatus + for correct handling of unconfigured codecs (we should not try to read + data or to define data size without correct codecs). + + * libtiff/tif_getimage.c: The way of codecs checking in TIFFRGBAImageOK + changed. Now it has used tif->tif_decodestatus and + tif->tif_encodestatus. + Should fix http://bugzilla.remotesensing.org/show_bug.cgi?id=119 (in + case of __cvs_8.tif test image). + + * libtiff/: tif_dirinfo.c, tif_dirread.c: Somebody makes a bug in + tif_dirread.c when TIFFCreateAnonFieldInfo was introduced. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=119 in case + of _cvs_00000-00.tif, _cvs_00000-01.tif and _cvs_00000-02.tif. + +2002-04-04 Andrey Kiselev + + * libtiff/: tif_lzw.c: Assertions in LZWDecode and LZWDecodeCompat + replaced by warnings. Now libtiff should read corrupted LZW-compressed + files by skipping bad strips. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=100 + +2002-04-03 Frank Warmerdam + + * libtiff/tif_dirwrite.c: Removed some dead code. + + * libtiff/*: Cleanup some warnings. + + * libtiff/tif_dir.c: Fixed bug with count returned by TIFFGetField() + for variable length FIELD_CUSTOM values. Was int * but should be + u_short *. + +2002-04-01 Andrey Kiselev + + * tools/: tifcp.c: Added support for 'Orientation' tag in tiffcp + utility (at cpStripToTile routine). + +2002-03-27 Frank Warmerdam + + * tif_dirread.c: avoid div-by-zero if rowbytes is zero in chop func. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=111 + + * tif_print.c: Fixed so that ASCII FIELD_CUSTOM values with + passcount set FALSE can be printed (such as TIFFTAG_SOFTWARE). + + * libtiff/tif_dir.c,tif_dirinfo.c,tif_dir.h,tif_ojpeg.c: modified so + that TIFFTAG_SOFTWARE uses FIELD_CUSTOM as an example. + +2002-03-26 Dwight Kelly + + * libtiff/: tiff.h, tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, + tif_dirwrite.c: Added get/put code for new tag XMLPACKET as defined + in Adobe XMP Technote. Added missing INKSET tag value from TIFF 6.0 spec + INKSET_MULTIINK (=2). Added missing tags from Adobe TIFF technotes: + CLIPPATH, XCLIPPATHUNITS, YCLIPPATHUNITS, OPIIMAGEID, OPIPROXY and + INDEXED. Added PHOTOMETRIC tag value from TIFF technote 4 ICCLAB (=9). + +2002-03-26 Andrey Kiselev + + * libtiff/: tif_getimage.c: TIFFReadRGBAStrip and TIFFReadRGBATile + now also uses TIFFRGBAImageOK before reading. This is additional fix + for http://bugzilla.remotesensing.org/show_bug.cgi?id=110 + +2002-03-25 Andrey Kiselev + + * libtiff/: tif_getimage.c: Additional check for supported + codecs added in TIFFRGBAImageOK and TIFFReadRGBAImage now uses + TIFFRGBAImageOK before reading. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=110 + +2002-03-15 Andrey Kiselev + + * libtiff/: tif_dir.c, tif_dir.h, tif_dirinfo.c, tif_dirread.c, + tif_dirwrite.c: Added routine TIFFDataWidth for detrmining + TIFFDataType sizes instead of working with tiffDataWidth array + directly. Should prevent out-of-borders bugs in case of unknown or + broken data types. EstimateStripByteCounts routine modified, so it + won't work when tags with uknown sizes founded. + Closes http://bugzilla.remotesensing.org/show_bug.cgi?id=109 + +2002-03-13 Andrey Kiselev + + * libtiff/tif_getimage.c: Added support for correct handling + `Orientation' tag in gtTileContig. Should be added in other gt* + functions as well, but I have not images for testing yet. Partially + resolves http://bugzilla.remotesensing.org/show_bug.cgi?id=23 + +2002-03-10 Andrey Kiselev + + * libtiff/: tif_dirinfo.c, tif_dirwrite.c: Added possibility to + read broken TIFFs with LONG type used for TIFFTAG_COMPRESSION, + TIFFTAG_BITSPERSAMPLE, TIFFTAG_PHOTOMETRIC. Closes + http://bugzilla.remotesensing.org/show_bug.cgi?id=99 + +2002-03-08 Andrey Kiselev + + * libtiff/Makefile.in, tools/Makefile.in: Shared library will not + be stripped when installing, utility binaries will do. Closes + http://bugzilla.remotesensing.org/show_bug.cgi?id=93 + +2002-02-28 Frank Warmerdam + + * man/TIFFGetField: fixed type of TIFFTAG_COPYRIGHT. + + * man/libtiff.3t: added copyright tag info. + +2002-02-11 Frank Warmerdam + + * libtiff/{tiff.h,tif_fax3.c}: Add support for __arch64__. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=94 + + * man/Makefile.in: Patch DESTDIR handling + + http://bugzilla.remotesensing.org/show_bug.cgi?id=95 + + * configure: OpenBSD changes for Sparc64 and DSO version. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=96 + +2002-02-05 Frank Warmerdam + + * config.site/configure: added support for OJPEG=yes option to enable + OJPEG support from config.site. + +2002-01-27 Frank Warmerdam + + * html/document.html: fixed links for TIFf 6 docs. + +2002-01-18 Frank Warmerdam + + * config.guess, config.sub: Updated from ftp.gnu.org/pub/config. + + * libtiff/tif_read.c: Fixed TIFFReadEncodedStrip() to fail if the + decodestrip function returns anything not greater than zero as per + http://bugzilla.remotesensing.org/show_bug.cgi?id=97 + + * configure: Modify CheckForBigEndian so it can work in a cross + compiled situation. + +2002-01-16 Frank Warmerdam + + * tools/tiffdump.c: include TIFFTAG_JPEGTABLES in tag list. + + * tools/tiffset.c: fix bug in error reporting. + + * tools/tiffcp.c: fix several warnings that show up with -Wall. + +2002-01-04 Frank Warmerdam + + * libtiff/tif_jpeg.c: fixed computation of segment_width for + tiles files to avoid error about it not matching the + cinfo.d.image_width values ("JPEGPreDecode: Improper JPEG strip/tile + size.") for ITIFF files. Apparently the problem was incorporated since + 3.5.5, presumably during the OJPEG/JPEG work recently. + +2001-12-15 Frank Warmerdam + + * configure, libtiff/Makefile.in: Changes for building on MacOS 10.1. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=94 + + * libtiff/tif_getimage.c: If DEFAULT_EXTRASAMPLE_AS_ALPHA is 1 + (defined in tiffconf.h - 1 by default) then the RGBA interface + will assume that a fourth extra sample is ASSOCALPHA if the + EXTRASAMPLE value isn't set for it. This changes the behaviour of + the library, but makes it work better with RGBA files produced by + lots of applications that don't mark the alpha values properly. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=93 + http://bugzilla.remotesensing.org/show_bug.cgi?id=65 + +2001-12-12 Frank Warmerdam + + * libtiff/tif_jpeg.c: allow jpeg data stream sampling values to + override those from tiff directory. This makes this work with + ImageGear generated files. + +2001-12-07 Frank Warmerdam + + * html/Makefile.in: added missing images per bug 92. + + * port/Makefile.in: fixed clean target per bug 92. + +2001-11-28 Frank Warmerdam + + * Reissue 3.5.7 release. + + * libtiff/mkversion.c: Fix output of TIFF_VERSION to be + YYYYMMDD so that it is increasing over time. + + * Makefile.in: Ensure that tiffvers.h is regenerated in the + make release target. + + * Makefile.in: added libtiff/tiffvers.h to the release file list. + +2001-11-23 Frank Warmerdam + + * added html/v3.5.7.html, updated html/index.html. + + * Makefile.in: added contrib/addtiffo/tif_ovrcache.{c,h}. + +2001-11-15 Frank Warmerdam + + * configure: fixed test for -lm. + +2001-11-02 Frank Warmerdam + + * Added PHOTOMETRIC_ITULAB as per bug 90. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=90 + +2001-10-10 Frank Warmerdam + + * libtiff/tiff.h: I have created COMPRESSION_CCITT_T4, + COMPRESSION_CCITT_T6, TIFFTAG_T4OPTIONS and TIFFTAG_T6OPTIONS aliases + in keeping with TIFF 6.0 standard in tiff.h + + http://bugzilla.remotesensing.org/show_bug.cgi?id=83 + +2001-09-26 Frank Warmerdam + + * libtiff/tif_dirwrite.c: added TIFFRewriteDirectory() function. + Updated TIFFWriteDirectory man page to include TIFFRewriteDirectory. + +2001-09-24 Frank Warmerdam + + * libtiff/tif_lzw.c: Avoid MS VC++ 5.0 optimization bug. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=78 + + * libtiff/tif_lzw.c: added dummy LZWSetupEncode() to report an + error about LZW not being available. + + * libtiff/tif_dir.c: propagate failure to initialize compression + back from TIFFSetField() as an error status, so applications can + detect failure. + + * libtiff/tif_dir.c: removed the auto replacement of + COMPRESSION_LZW with COMPRESSION_NONE in _TIFFVSetField(). + + * Removed Makefile, tools/Makefile, port/install.sh, man/Makefile + from CVS as they are all supposed to be auto-generated by configure. + +2001-09-22 Frank Warmerdam + + * libtiff/tif_ojpeg.c: new update from Scott. + +2001-09-09 Frank Warmerdam + + * libtif/tif_fax3.c: Removed #ifdef PURIFY logic, and modified to + always use the "safe" version, even if there is a very slight + cost in performance. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=54 + + * libtiff/Makefile.in: Fixed @DSOSUB_VERSION to be @DSOSUF_VERSION@ + in two places. + + * libtiff/tif_getimage.c: Fixed problem with reading strips or + tiles that don't start on a tile boundary. Fix contributed by + Josep Vallverdu (from HP), and further described in bug 47. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=47 + + * tools/tiff2ps.c: added OJPEG YCbCr to RGB support. + + * libtiff/tif_ojpeg.c: Applied substantial patch from Scott. + +2001-09-06 Frank Warmerdam + + * libtiff/tif_packbits.c: fixed memory overrun error. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=77 + +2001-08-31 Frank Warmerdam + + * libtiff/tif_getimage.c: relax handling of contig case where + there are extra samples that are supposed to be ignored. This + should now work for 8bit greyscale or palletted images. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=75 + +2001-08-28 Frank Warmerdam + + * libtiff/tif_getimage.c: Don't complain for CMYK (separated) + images with more than four samples per pixel. See: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=73 + +2001-08-10 Frank Warmerdam + + * libtiff/tif_getimage.c: Use memmove() instead of TIFFmemcpy() + in TIFFReadRGBATile() to avoid issues in cases of overlapping + buffers. See Bug 69 in Bugzilla. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=69 + + * tools/tiff2rgba.c: fixed getopt() call so that -b works again. + +2001-08-09 Frank Warmerdam + + * libtiff/tiff.h, libtiff/tif_fax3.c: added check for __LP64__ + when checking for 64 bit architectures as per bugzilla bug 67. + +2001-07-27 Frank Warmerdam + + * man/Makefile.in: add TIFFClientOpen link as per debian submitted + bug 66. + +2001-07-20 Frank Warmerdam + + * libtiff/tif_jpeg.c: Define HAVE_BOOLEAN on windows if RPCNDR.H + has been included. + +2001-07-19 Frank Warmerdam + + * libtiff/tif_open.c: Seek back to zero after failed read, + before writing header. + +2001-07-18 Frank Warmerdam + + * libtiff/tif_ojpeg.c: updates from Scott. Handles colors + much better. Now depends on having patched libjpeg as per + patch in contrib/ojpeg/*. + +2001-07-17 Frank Warmerdam + + * */Makefile.in: added DESTDIR support. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=60 + +2001-07-16 Frank Warmerdam + + * configure, libtiff/Makefile.in: applied OpenBSD patches + as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=61 + +2001-06-28 Frank Warmerdam + + * libtiff/tif_getimage.c: Fixed so that failure is properly + reported by gtTileContig, gtStripContig, gtTileSeparate and + gtStripSeparate. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=51 + + * tiffcmp.c: Fixed multi samples per pixel support for ContigCompare. + Updated bug section of tiffcmp.1 to note tiled file issues. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=53 + +2001-06-22 Frank Warmerdam + + * configure: Changes for DSO generation on AIX provided by + John Marquart . + + * configure, libtiff/Makeifle.in: Modified to build DSOs properly + on Darwin thanks to Robert Krajewski (rpk@alum.mit.edu) and + Keisuke Fujii (fujiik@jlcuxf.kek.jp). + +2001-06-13 Frank Warmerdam + + * tools/tiff2rgba.c: added -n flag to avoid emitting alpha component. + + * man/tiff2rgba.1: new + +2001-05-22 Frank Warmerdam + + * Added tiffset and tif_ojpeg to the dist lists in Makefile.in. + +2001-05-13 Frank Warmerdam + + * libtiff/tools/thumbnail.c: changed default output compression + to packbits from LZW since LZW isn't generally available. + +2001-05-12 Frank Warmerdam + + * libtiff/tif_ojpeg.c: New. + libtiff/tif_jpeg.c, tiffconf.h, tif_getimage.c: changes related + to OJPEG support. + + Scott Marovich supplied OJPEG support. + +2001-05-11 Frank Warmerdam + + * tiff.h: removed, it duplicates libtiff/tiff.h. + +2001-05-08 Frank Warmerdam + + * libtiff/tif_dirinfo.c: moved pixar and copyright flags to + ensure everything is in order. + + * libtiff/libtiff.def: added TIFFCreateDirectory and + TIFFDefaultStripSize as per: + + http://bugzilla.remotesensing.org/show_bug.cgi?id=46 + +2001-05-02 Frank Warmerdam + + * libtiff/tif_dirinfo.c: Modified the TIFF_BYTE definition for + TIFFTAG_PHOTOSHOP to use a writecount of TIFF_VARIABLE2 (-3) to + force use of uint32 counts instead of short counts. + + * libtiff/tif_dirwrite.c: Added support for TIFF_VARIABLE2 in the + case of writing TIFF_BYTE/TIFF_SBYTE fields. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=43 + +2001-05-01 Frank Warmerdam + + * libtiff/tif_dirinfo.c: removed duplicate TIFFTAG_PHOTOSHOP as per + bug report http://bugzilla.remotesensing.org/show_bug.cgi?id=44 + +2001-04-05 Frank Warmerdam + + * tiffio.h: removed C++ style comment. + + * configure: fixed up SCRIPT_SH/SHELL handling. + + * Makefile.in: Fixed SCRIPT_SH/SHELL handling. + + * config.guess: documented more variables as per bug 40. + +2001-04-03 Frank Warmerdam + + * configure, *Makefile.in: Various changes to improve configuration + for HP/UX specifically, and also in general. They include: + - Try to handle /usr/bin/sh instead of /bin/sh where necessary. + - Upgrade to HP/UX 10.x+ compiler, linker and dso options. + - Fixed mmap() test to avoid MMAP_FIXED ... it isn't available on HP + - Use -${MAKEFLAGS} in sub makes from makefiles. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=40 + +2001-04-02 Frank Warmerdam + + * libtiff/tiff.h: Applied hac to try and resolve the problem + with the inttypes.h include file on AIX. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + + * VERSION: update to 3.5.7 beta in preparation for release. + + * configure/config.site: modified to check if -lm is needed for + MACHDEPLIBS if not supplied by config.site. Needed for Darwin. + + * config.guess: updated wholesale to an FSF version apparently + from 1998 (as opposed to 1994). This is mainly inspired by + providing for MacOS X support. + +2001-03-29 Frank Warmerdam + + * configure, Makefile.in, etc: added support for OPTIMIZER being + set from config.site. + +2001-03-28 Frank Warmerdam + + * fax2ps.c: Helge (libtiff at oldach.net) submitted fix: + + Here's a fix for fax2ps that corrects behaviour for non-Letter paper + sizes. It fixes two problems: + + Without scaling (-S) the fax is now centered on the page size specified + with -H and/or -W. Before, fax2ps was using an obscure and practially + useless algorithm to allocate the image relative to Letter sized paper + which sometime sled to useless whitespace on the paper, while at the + same time cutting of the faxes printable area at the opposite border. + + Second, scaling now preserves aspect ratio, which makes unusual faxes + (in particular short ones) print properly. + + See http://bugzilla.remotesensing.org/show_bug.cgi?id=35 + + * tiff2ps.c/tiff2ps.1: Substantial changes to tiff2ps by + Bruce A. Mallett. See check message for detailed information + on all the changes, including a faster encoder, fixes for level + 2 PostScript, and support for the imagemask operator. + +2001-03-27 Frank Warmerdam + + * libtiff/tiffio.h: Changed "#if LOGLUV_PUBLIC" to + "#ifdef LOGLUV_PUBLIC" so it will work with VisualAge on AIX. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=39 + +2001-03-16 Frank Warmerdam + + * tif_dirinfo.c: moved definition of copyright tag in field list. + Apparently they have to be in sorted order by tag id. + +2001-03-13 Frank Warmerdam + + * tif_getimage.c: Added support for 16bit minisblack/miniswhite + images in RGBA interface. + +2001-03-02 Frank Warmerdam + + * Added TIFFTAG_COPYRIGHT support. + +2001-02-19 Frank Warmerdam + + * Brent Roman contributed updated tiffcp utility (and tiffcp.1) + with support for extracting subimages with the ,n syntax, and also + adding the -b bias removal flag. + +2001-02-16 Frank Warmerdam + + * libtiff/libtiff.def: Brent Roman submitted new version adding + serveral missing entry points. + + * libtiff/tif_dirinfo.c: don't declare tiffFieldInfo static on VMS. + Some sort of weird VMS thing. + + http://bugzilla.remotesensing.org/show_bug.cgi?id=31 + + * tif_luv.c/tiff.h/tiffio.h: + New version of TIFF LogLuv (SGILOG) modules contributed by Greg Ward + (greg@shutterfly.com). He writes: + + 1) I improved the gamut-mapping function in tif_luv.c for imaginary + colors, because some images were being super-saturated on the input + side and this resulted in some strange color shifts in the output. + + 2) I added a psuedotag in tiff.h to control random dithering during + LogLuv encoding. This is turned off by default for 32-bit LogLuv and + on for 24-bit LogLuv output. Dithering improves the average color + accuracy over the image. + + 3) I added a #define for LOG_LUV_PUBLIC, which is enabled by default in + tiffio.h, to expose internal routines for converting between LogLuv and + XYZ coordinates. This is helpful for writing more efficient, + specialized conversion routines, especially for reading LogLuv files. + + Changes applied with minor edits. + +2001-01-23 Frank Warmerdam + + * tif_fax3.c: keep rw_mode flag internal to fax3 state to remember + whether we are encoding or decoding. This is to ensure graceful + recovery if TIFFClientOpen() discovers an attempt to open a compressed + file for "r+" access, and subsequently close it, as it resets the + tif_mode flag to O_RDONLY in this case to avoid writes, confusing the + compressor's concept of whether it is in encode or decode mode. + +2001-01-08 Mike Welles + + * Makefile.in: Now cleaning up after itself after creating the .tar.gz and .zip + +2001-01-07 Frank Warmerdam + + * html/libtiff.html: Fixed arguments in example for TIFFRGBAImageGet() + as per bug report by Patrick Connor. + +2000-12-28 Frank Warmerdam + + * Added RELEASE-DATE file to release file list. + + * Fixed libtiff/makefile.vc to make tiffvers.h not version.h. + +2000-12-22 Mike Welles + * added link to CVS mirror from index.html + + * updated html/internals.html to note that LZW compression is + not supported by default. + +2000-12-22 Frank Warmerdam + + * updated html/libtiff.html to not point at Niles' old JPL web site + for the man pages, point at www.libtiff.org. + +2000-12-21 Frank Warmerdam + + * libtiff/tif_apple.c: Applied "Carbon" support patches supplied by + Leonard Rosenthol . May interfere + with correct building on older systems. If so, please let me know. + +2000-12-19 Mike Welles + + * Took out LZW Encoding from tif_lzw.c + + * Created HOWTO-RELEASE + + * Created html/v3.5.6.html + + * updated index.html + +2000-12-01 Frank Warmerdam + + * Added patches for EOFB support in tif_fax3.c and tif_fax3.h. + Patches supplied by Frank Cringle + Example file at: ftp://ftp.remotesensing.org/pub/libtiff/eofb_396.tif + +2000-11-24 Frank Warmerdam + + * libtiff/Makefile.in: Added an installPrivateHdrs and install-private + target so that the private headers required by libgeotiff can be + installed with the others. They are not installed by default. + + * libtiff/Makefile.in: Added @MACHLIBDEPS@ to LINUXdso and GNULDdso + targets so libtiff.so will be built with an explicit dependency + on libm.so. + + * libtiff/Makefile.in: Use softlinks to link libtiff.so.3 to + libtiff.so.3.5.5. + + * libtiff/Makefile.in & configure: Remove all references to the ALPHA + file, or ALPHA version logic. Added stuff about DIST_POINT in + place of DIST_TYPE and the alpha release number stuff. + +2000-11-22 Frank Warmerdam + + * I have applied a patch from Steffen Moeller to + the configure script so that it now accepts the --prefix, and + --exec-prefix directives. + +2000-11-13 Frank Warmerdam + + * I have made a variety of modifications in an effort to ensure the + TIFFLIB_VERSION macro is automatically generated from the RELEASE-DATE + file which seems to be updated regularly. + + o mkversion.c now reads RELEASE-DATE and emits TIFFLIB_VERSION in + version include file. + o renamed version.h to tiffvers.h because we now have to install it + with the public libtiff include files. + o include tiffvers.h in tiffio.h. + o updated tif_version.c to use tiffvers.h. + o Updated Makefile.in accordingly. + + * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=25 + I have updated the win32 detection rules in tiffcomp.h. + +2000-10-20 Frank Warmerdam + + * tif_getimage.c: Fixed RGBA translation for YCbCr images for which + the strip/tile width and height aren't multiples of the sampling size. + See http://bugzilla.remotesensing.org/show_bug.cgi?id=20 + Some patches from Rick LaMont of Dot C Software. + + * Modified tif_packbits.c encoder to avoid compressing more + data than provided if rowsize doesn't factor into provided data + (such as occurs for YCbCr). + +2000-10-19 Frank Warmerdam + + * tools/rgb2ycbcr.c: fixed output strip size to account for vertical + roundup if rows_per_strip not a multiple of vertical sample size. + +2000-10-16 Frank Warmerdam + + * tif_dir.c: Clear TIFF_ISTILED flag in TIFFDefaultDirectory + as per http://bugzilla.remotesensing.org/show_bug.cgi?id=18 + from vandrove@vc.cvut.cz. + + * Modified tif_packbits.c decoding to avoid overrunning the + output buffer, and to issue a warning if data needs to be + discarded. See http://bugzilla.remotesensing.org/show_bug.cgi?id=18 + +2000-10-12 Frank Warmerdam + + * Modified tiff2bw to ensure portions add to 100%, and that + white is properly recovered. + + See bug http://bugzilla.remotesensing.org/show_bug.cgi?id=15 + Patch c/o Stanislav Brabec + +2000-09-30 Frank Warmerdam + + * Modified TIFFClientOpen() to emit an error on an attempt to + open a comperessed file for update (O_RDWR/r+) access. This is + because the compressor/decompressor code gets very confused when + the mode is O_RDWR, assuming this means writing only. See + bug http://bugzilla.remotesensing.org/show_bug.cgi?id=13 + +2000-09-27 Frank Warmerdam + + * Added GNULDdso target an`d switched linux and freebsd to use it. + +2000-09-26 Frank Warmerdam + + * Applied patch for 0x0000 sequences in tif_fax3.h's definition + of EXPAND1D() as per bug 11 (from Roman). + +2000-09-25 Frank Warmerdam + * Fixed tiffcomp.h to avoid win32 stuff if unix #defined, to improve + cygwin compatibility. + + * Applied patch from Roman Shpount to tif_fax3.c. This seems to + be a proper fix to the buffer sizing problem. See + http://bugzilla.remotesensing.org/show_bug.cgi?id=11 + + * Fixed tif_getimage.c to fix overrun bug with YCbCr images without + downsampling. http://bugzilla.remotesensing.org/show_bug.cgi?id=10 + Thanks to Nick Lamb for reporting the + bug and proving the patch. + +2000-09-18 Frank Warmerdam + + * Fixed tif_jpeg.c so avoid destroying the decompressor before + we are done access data thanks to bug report from: + Michael Eckstein . + + * Reverted tif_flush change. + +2000-09-14 Frank Warmerdam + + * tif_flush.c: Changed so that TIFFFlushData() doesn't return an + error when TIFF_BEENWRITING is not set. This ensures that the + directory contents can still be flushed by TIFFFlush(). + +2000-08-14 Frank Warmerdam + + * tif_open.c: Don't set MMAP for O_RDWR files. + + * tif_open.c: Set STRIPCHOP_DEFAULT for O_RDWR as well as O_RDONLY + so that files opened for update can be strip chopped too. + + * tif_read.c: fixed up bug with files missing rowsperstrip and + the strips per separation fix done a few weeks ago. + +2000-07-17 Frank Warmerdam + + * Tentatively added support for SAMPLEFORMAT_COMPLEXIEEEFP, and + SAMPLEFORMAT_COMPLEXINT. + +2000-07-13 Mike Welles + + * index.html, bugs.html: added bugzilla info. + +2000-07-12 Frank Warmerdam + + * tif_read.c: fix subtle bug with determining the number of + rows for strips that are the last strip in a separation but + not the last strip of all in TIFFReadEncodedStrip(). + + * Applied 16/32 bit fix to tif_fax3.c. Fix supplied by + Peter Skarpetis + +2000-06-15 Frank Warmerdam + + * Modified tiffio.h logic with regard to including windows.h. It + won't include it when building with __CYGWIN__. + +2000-05-11 Frank Warmerdam + + * README: update to mention www.libtiff.org, don't list Sam's old + email address. + + * configure: Fixed DSO test for Linux as per patch from + Jan Van Buggenhout . + +2000-04-21 Frank Warmerdam + + * libtiff/tif_dirread.c: Don't use estimate strip byte count for + one tile/strip images with an offset, and byte count of zero. These + could be "unpopulated" images. + +2000-04-18 Frank Warmerdam + + * contrib/addtiffo: Added "averaging" resampling option. + + * tools/tiffsplit.c: Copy TIFFTAG_SAMPLEFORMAT. + +Tue Apr 18 16:18:08 2000 Frank Warmerdam + + * tools/Makefile.in: Modified to install properly on SGI. + +2000-04-12 Mike Welles + * configure: Fixed stupid mistake in libc6 test on Linux + +2000-04-04 Mike Welles + * tif_win32.c: Applied patch to fix overreads and ovverwrites + caught by BoundsChecker. From Arvan Pritchard + (untested). + + * tif_getimage.c: Applied patch to silence VC6 warnings. From + Arvan Pritchard + + * tif_lzw.c: Applied patch to silence VC6 warnings. From + Arvan Pritchard + +2000-03-28 Frank Warmerdam + + * Added contrib/stream (stream io) code submitted by Avi Bleiweiss. + +2000-03-28 Frank Warmerdam *** 3.5.5 release *** + + * fax2ps: Fixed mixup of width and height in bounding box statement + as per submission by Nalin Dahyabhai . + +2000-03-27 Mike Welles + + * fax2ps: Modified printruns to take uint32 instead of uint16. + Patch courtesy of Bernt Herd + +2000-03-20 Mike Welles + + * configure: added test for libc6 for linux targets. Bug reported by + Stanislav Brabec + + * Added 3.5 docs to html/Makefile.in. + Thanks to Stanislav Brabec + + * configure: fixed bugs in sed scripts + (applied sed script s:/@:s;@:;s:/s;;:;: to configure). + fix submitted to Stanislav Brabec + + * tools/iptcutil was not in files list, and wasn't being + added to tar archive. Updated Makefile.in. + +2000-03-17 Frank Warmerdam + + * tif_fax3.c: Fixed serious bug introduced during the uint16->uint32 + conversion for the run arrays. + +2000-03-03 Frank Warmerdam + + * Set td_sampleformat default to SAMPLEFORMAT_UINT instead of + SAMPLEFORMAT_VOID in TIFFDefaultDirectory() in tif_dir.c. + +2000-03-02 Frank Warmerdam + + * Added "GetDefaulted" support for TIFFTAG_SAMPLEFORMAT in tif_aux.c. + + * Patched tif_fax3.c so that dsp->runs is allocated a bit bigger + to avoid overruns encountered with frle_bug.tif. + +Tue Feb 15 22:01:05 2000 Frank Warmerdam + + * Fixed tools/tiffcmp so that stopondiff testing works. + Patch care of Joseph Orost . + +2000-01-28 + + * Modified tif_unix.c to support 2-4GB seeks if USE_64BIT_API is + set to 1, and added default (off) setting in tiffconf.h. This + should eventually be set by the configure script somehow. + + The original work on all these 2-4GB changes was done by + Peter Smith (psmith@creo.com). + + * Modified tif_win32.c to support 2-4GB seeks. + + * tentatively changed toff_t to be unsigned instead of signed to + facilitate support for 2-4GB files. + + * Updated a variety of files to use toff_t. Fixed some mixups + between toff_t and tsize_t. + +Fri Jan 28 10:13:49 2000 Frank Warmerdam + + * Largely reimplemented contrib/addtiffo to avoid temp files, + updating the TIFF file in place. Fixed a few other bugs to. + + * Set tif_rawdatasize to zero when freeing raw data buffer in + TIFFWriteDirectory(). + + * Enabled "REWRITE_HACK" in tif_write.c by default. + + * Fix bug in tif_write.c when switching between reading one directory + and writing to another. + + * Made TIFFWriteCheck() public, and added TIFFCreateDirectory() + +Wed Jan 5 12:37:48 2000 Frank Warmerdam + + * Added TIFFmemory(3t) functions to libtiff.def. + +Tue Jan 4 13:39:00 2000 Frank Warmerdam + + * Added libtiff/libtiff.def to TIFFILES distribution list. + +Mon Dec 27 12:13:39 EST 1999 Mike Welles + + * Created lzw compression kit, as a new module (libtiff-lzw-compression-kit). + + * Altered descriptions in tools to reflect "by default" lzw not supported + + * Updated index.html to note lzw compression kit. + +Tue Dec 21 14:01:51 1999 Frank Warmerdam + + * Added fax3sm_winnt.c to distribution list in Makefile.in. + +Tue Dec 21 11:04:45 EST 1999 Mike Welles *** 3.5.4 release *** + + * Aadded Pixar tag support. Contributed by Phil Beffery + + * Made one more change to tif_dir.c for removal of LZW compression. Also added notice + when LZW compression invoked. + + * Changed default compression in tools to TIFF_PACKBITS, and changed usage descriptions + in tools to reflect removal of LZW compression + +Mon Dec 20 18:39:02 EST 1999 Mike Welles + + * Fixed bug that caused LZW (non) compression to segfault. Added + warning about LZW compression removed being removed, and why. + + * Added nostrip to install in tools/Makefile.in so that debugging + symbols are kept. + +Tue Dec 7 12:04:47 EST 1999 Mike Welles + + * Added patch from Ivo Penzar , + supporting Adobe ZIP deflate. Untested. + +Sat Dec 4 15:47:11 1999 Frank Warmerdam + + * Made Packbits the default compression in tools/tiff2rgba.c instead + of LZW. + +Tue Nov 30 14:41:43 1999 Frank Warmerdam *** 3.5.3. release *** + + * Added tif_luv to contrib/djgpp/Makefile.lib. + +Tue Nov 30 14:15:32 EST 1999 Mike Welles + + * Added zip creation to relase makefile target + + * Added html for TIFFWriteTile.3t man page. + +Tue Nov 30 09:20:16 1999 Frank Warmerdam + + * Added some changes to tif_write.c to support rewriting existing + fixed sized tiles and strips. Code mods disabled by default, only + enabled if REWRITE_HACK is defined for now. + +Mon Nov 29 11:43:42 1999 Frank Warmerdam + + * Added TIFFWriteTile.3t man page. + +Sun Nov 28 20:36:18 1999 Frank Warmerdam + + * Added notes on use of makefile.vc in build.html, and fixed + email subscription address. + +199-11-28 Mike Welles + + * Fixed apocalypse-inducing y2k bug in contrib/ras/ras2tiff.c + + * Did some casts cleaning up to reduce compiler warnings in tif_fax3.c, + from Bruce Carmeron -- modifications of + changes made by Frank (sun cc still complained on cast). + + * Added tiffconf.h to install target per request from Bill + Radcliffe : "We need a way for ImageMagick to + know features have been compiled into the TIFF library in order to + handle things properly". + +Sat Nov 27 16:49:21 1999 Frank Warmerdam + + * fixed various VC++ warnings as suggested by Gilles Vollant + . + +Wed Nov 24 12:08:16 1999 Frank Warmerdam + + * Modified TIFFquery.3t man pages info on TIFFIsByteSwapped() to + not imply applications are responsible for image data swapping. + +1999-11-22 Mike Welles + * HTML-ized the man pages, added to html/man + + * Removed LZW Compression to comply with Unisys patent extortion. + +1999-09-29 Mike Welles + * Corrected one remaining 16 -> 32 bit value in tif_fax3.c, + From Ivo Penzar + +1999-09-26 Mike Welles *** 3.5.2 release *** + * Corrected alpha versioning. + + * Removed distinction between alpha and release targets in Makefile.in. + + * added release.stamp target, which tags cvs tree, and updates + "RELEASE-DATE" + + * added releasediff target, which diffs tree with source as of + date in "RELEASE-DATE" + + * Ticked up version to 3.5.2 (alpha 01 -- but I think we'll moving + away from alpha/non-alpha distinctions). + + * updated html to reflect release + +1999-09-23 + + * Set O_BINARY for tif_unix.c open() ... used on cygwin for instance. + + * Added CYGWIN case in configure. + +Fri Sep 17 00:13:51 CEST 1999 Mike Welles + + * Applied Francois Dagand's patch to handle fax decompression bug. + (sizes >= 65536 were failing) + +Tue Sep 14 21:31:43 1999 Frank Warmerdam + + * Applied "a" mode fix to tif_win32.c/TIFFOpen() as suggested + by Christopher Lawton + +Wed Sep 8 08:19:18 1999 Frank Warmerdam + + * Added IRIX/gcc, and OSF/1 4.x support on behalf of + Albert Chin-A-Young + + * Added TIFFReassignTagToIgnore() API on behalf of + Bruce Cameron . Man page still pending. + +Wed Aug 25 11:39:07 1999 Frank Warmerdam + + * Added test target in Makefile, test_pics.sh script and pics/*.rpt + files to provide for a rudimentary testsuite. + + * Added contrib/tags back from old distribution ... fixed up a bit. + +1999-08-16 + + * Added simple makefile.vc makefiles for building with MS VC++ + on Windows NT/98/95 in console mode. Stuff in contrib/win* make give + better solutions for some users. + +Mon Aug 16 21:52:11 1999 Frank Warmerdam + + * Added addtiffo (add overviews to a TIFF file) in contrib. Didn't + put it in tools since part of it is in C++. + +1999-08-16 Michael L. Welles + + * Updated html/index.html with anon CVS instructions. + +Mon Aug 16 13:18:41 1999 Frank Warmerdam + + * pre-remove so link before softlink in LINUXdso action in + libtiff/Makefile.in to avoid failure on LINUXdso builds other than + the first. + + * Fixed problem with cvtcmap() in tif_getimage.c modifying the + colormaps owned by the TIFF handle itself when trying to fixup wrong + (eight bit) colormaps. Corrected by maintaining a private copy of + the colormap. + + * Added TIFFReadRGBATile()/TIFFReadRGBAStrip() support in + tif_getimage.c. + + * CVS Repository placed at remotesensing.org. ChangeLog added. diff --git a/3rdparty/libtiff/tif_aux.c b/3rdparty/libtiff/tif_aux.c index 7d3af1bb5..927150a49 100644 --- a/3rdparty/libtiff/tif_aux.c +++ b/3rdparty/libtiff/tif_aux.c @@ -325,8 +325,8 @@ _TIFFUInt64ToFloat(uint64 ui64) if (i.part.high >= 0) { return (float)i.value; } else { - double df; - df = (double)i.value; + long double df; + df = (long double)i.value; df += 18446744073709551616.0; /* adding 2**64 */ return (float)df; } @@ -341,8 +341,8 @@ _TIFFUInt64ToDouble(uint64 ui64) if (i.part.high >= 0) { return (double)i.value; } else { - double df; - df = (double)i.value; + long double df; + df = (long double)i.value; df += 18446744073709551616.0; /* adding 2**64 */ return (double)df; } diff --git a/3rdparty/libtiff/tif_dir.c b/3rdparty/libtiff/tif_dir.c index 401a080e3..8bf3ea719 100644 --- a/3rdparty/libtiff/tif_dir.c +++ b/3rdparty/libtiff/tif_dir.c @@ -1,4 +1,4 @@ -/* $Id: tif_dir.c,v 1.108 2012-02-01 01:51:00 fwarmerdam Exp $ */ +/* $Id: tif_dir.c,v 1.113 2012-06-14 20:32:53 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -122,6 +122,10 @@ setExtraSamples(TIFFDirectory* td, va_list ap, uint32* v) #undef EXTRASAMPLE_COREL_UNASSALPHA } +/* + * Confirm we have "samplesperpixel" ink names separated by \0. Returns + * zero if the ink names are not as expected. + */ static uint32 checkInkNamesString(TIFF* tif, uint32 slen, const char* s) { @@ -132,9 +136,9 @@ checkInkNamesString(TIFF* tif, uint32 slen, const char* s) const char* ep = s+slen; const char* cp = s; for (; i > 0; i--) { - for (; *cp != '\0'; cp++) - if (cp >= ep) - goto bad; + for (; cp < ep && *cp != '\0'; cp++) {} + if (cp >= ep) + goto bad; cp++; /* skip \0 */ } return ((uint32)(cp-s)); @@ -157,8 +161,20 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) int status = 1; uint32 v32, i, v; char* s; + const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY); + uint32 standard_tag = tag; - switch (tag) { + /* + * We want to force the custom code to be used for custom + * fields even if the tag happens to match a well known + * one - important for reinterpreted handling of standard + * tag values in custom directories (ie. EXIF) + */ + if (fip->field_bit == FIELD_CUSTOM) { + standard_tag = 0; + } + + switch (standard_tag) { case TIFFTAG_SUBFILETYPE: td->td_subfiletype = (uint32) va_arg(ap, uint32); break; @@ -423,7 +439,6 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) default: { TIFFTagValue *tv; int tv_size, iCustom; - const TIFFField *fip = TIFFFindField(tif, tag, TIFF_ANY); /* * This can happen if multiple images are open with different @@ -550,102 +565,99 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap) goto end; } - if ((fip->field_passcount - || fip->field_writecount == TIFF_VARIABLE - || fip->field_writecount == TIFF_VARIABLE2 - || fip->field_writecount == TIFF_SPP - || tv->count > 1) - && fip->field_tag != TIFFTAG_PAGENUMBER - && fip->field_tag != TIFFTAG_HALFTONEHINTS - && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING - && fip->field_tag != TIFFTAG_DOTRANGE) { + if (fip->field_tag == TIFFTAG_DOTRANGE + && strcmp(fip->field_name,"DotRange") == 0) { + /* TODO: This is an evil exception and should not have been + handled this way ... likely best if we move it into + the directory structure with an explicit field in + libtiff 4.1 and assign it a FIELD_ value */ + uint16 v[2]; + v[0] = (uint16)va_arg(ap, int); + v[1] = (uint16)va_arg(ap, int); + _TIFFmemcpy(tv->value, &v, 4); + } + + else if (fip->field_passcount + || fip->field_writecount == TIFF_VARIABLE + || fip->field_writecount == TIFF_VARIABLE2 + || fip->field_writecount == TIFF_SPP + || tv->count > 1) { _TIFFmemcpy(tv->value, va_arg(ap, void *), tv->count * tv_size); } else { - /* - * XXX: The following loop required to handle - * TIFFTAG_PAGENUMBER, TIFFTAG_HALFTONEHINTS, - * TIFFTAG_YCBCRSUBSAMPLING and TIFFTAG_DOTRANGE tags. - * These tags are actually arrays and should be passed as - * array pointers to TIFFSetField() function, but actually - * passed as a list of separate values. This behaviour - * must be changed in the future! - */ - int i; char *val = (char *)tv->value; + assert( tv->count == 1 ); - for (i = 0; i < tv->count; i++, val += tv_size) { - switch (fip->field_type) { - case TIFF_BYTE: - case TIFF_UNDEFINED: - { - uint8 v = (uint8)va_arg(ap, int); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_SBYTE: - { - int8 v = (int8)va_arg(ap, int); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_SHORT: - { - uint16 v = (uint16)va_arg(ap, int); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_SSHORT: - { - int16 v = (int16)va_arg(ap, int); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_LONG: - case TIFF_IFD: - { - uint32 v = va_arg(ap, uint32); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_SLONG: - { - int32 v = va_arg(ap, int32); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_LONG8: - case TIFF_IFD8: - { - uint64 v = va_arg(ap, uint64); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_SLONG8: - { - int64 v = va_arg(ap, int64); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_RATIONAL: - case TIFF_SRATIONAL: - case TIFF_FLOAT: - { - float v = (float)va_arg(ap, double); - _TIFFmemcpy(val, &v, tv_size); - } - break; - case TIFF_DOUBLE: - { - double v = va_arg(ap, double); - _TIFFmemcpy(val, &v, tv_size); - } - break; - default: - _TIFFmemset(val, 0, tv_size); - status = 0; - break; + switch (fip->field_type) { + case TIFF_BYTE: + case TIFF_UNDEFINED: + { + uint8 v = (uint8)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); } + break; + case TIFF_SBYTE: + { + int8 v = (int8)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SHORT: + { + uint16 v = (uint16)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SSHORT: + { + int16 v = (int16)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_LONG: + case TIFF_IFD: + { + uint32 v = va_arg(ap, uint32); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SLONG: + { + int32 v = va_arg(ap, int32); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_LONG8: + case TIFF_IFD8: + { + uint64 v = va_arg(ap, uint64); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SLONG8: + { + int64 v = va_arg(ap, int64); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + case TIFF_FLOAT: + { + float v = (float)va_arg(ap, double); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_DOUBLE: + { + double v = va_arg(ap, double); + _TIFFmemcpy(val, &v, tv_size); + } + break; + default: + _TIFFmemset(val, 0, tv_size); + status = 0; + break; } } } @@ -795,8 +807,20 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) { TIFFDirectory* td = &tif->tif_dir; int ret_val = 1; + uint32 standard_tag = tag; + const TIFFField* fip = TIFFFindField(tif, tag, TIFF_ANY); + + /* + * We want to force the custom code to be used for custom + * fields even if the tag happens to match a well known + * one - important for reinterpreted handling of standard + * tag values in custom directories (ie. EXIF) + */ + if (fip->field_bit == FIELD_CUSTOM) { + standard_tag = 0; + } - switch (tag) { + switch (standard_tag) { case TIFFTAG_SUBFILETYPE: *va_arg(ap, uint32*) = td->td_subfiletype; break; @@ -971,8 +995,6 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) break; default: { - const TIFFField* fip = - TIFFFindField(tif, tag, TIFF_ANY); int i; /* @@ -1013,84 +1035,85 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap) *va_arg(ap, uint16*) = (uint16)tv->count; *va_arg(ap, void **) = tv->value; ret_val = 1; + } else if (fip->field_tag == TIFFTAG_DOTRANGE + && strcmp(fip->field_name,"DotRange") == 0) { + /* TODO: This is an evil exception and should not have been + handled this way ... likely best if we move it into + the directory structure with an explicit field in + libtiff 4.1 and assign it a FIELD_ value */ + *va_arg(ap, uint16*) = ((uint16 *)tv->value)[0]; + *va_arg(ap, uint16*) = ((uint16 *)tv->value)[1]; + ret_val = 1; } else { - if ((fip->field_type == TIFF_ASCII + if (fip->field_type == TIFF_ASCII || fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2 || fip->field_readcount == TIFF_SPP - || tv->count > 1) - && fip->field_tag != TIFFTAG_PAGENUMBER - && fip->field_tag != TIFFTAG_HALFTONEHINTS - && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING - && fip->field_tag != TIFFTAG_DOTRANGE) { + || tv->count > 1) { *va_arg(ap, void **) = tv->value; ret_val = 1; } else { - int j; char *val = (char *)tv->value; - - for (j = 0; j < tv->count; - j++, val += _TIFFDataSize(tv->info->field_type)) { - switch (fip->field_type) { - case TIFF_BYTE: - case TIFF_UNDEFINED: - *va_arg(ap, uint8*) = - *(uint8 *)val; - ret_val = 1; - break; - case TIFF_SBYTE: - *va_arg(ap, int8*) = - *(int8 *)val; - ret_val = 1; - break; - case TIFF_SHORT: - *va_arg(ap, uint16*) = - *(uint16 *)val; - ret_val = 1; - break; - case TIFF_SSHORT: - *va_arg(ap, int16*) = - *(int16 *)val; - ret_val = 1; - break; - case TIFF_LONG: - case TIFF_IFD: - *va_arg(ap, uint32*) = - *(uint32 *)val; - ret_val = 1; - break; - case TIFF_SLONG: - *va_arg(ap, int32*) = - *(int32 *)val; - ret_val = 1; - break; - case TIFF_LONG8: - case TIFF_IFD8: - *va_arg(ap, uint64*) = - *(uint64 *)val; - ret_val = 1; - break; - case TIFF_SLONG8: - *va_arg(ap, int64*) = - *(int64 *)val; - ret_val = 1; - break; - case TIFF_RATIONAL: - case TIFF_SRATIONAL: - case TIFF_FLOAT: - *va_arg(ap, float*) = - *(float *)val; - ret_val = 1; - break; - case TIFF_DOUBLE: - *va_arg(ap, double*) = - *(double *)val; - ret_val = 1; - break; - default: - ret_val = 0; - break; - } + assert( tv->count == 1 ); + switch (fip->field_type) { + case TIFF_BYTE: + case TIFF_UNDEFINED: + *va_arg(ap, uint8*) = + *(uint8 *)val; + ret_val = 1; + break; + case TIFF_SBYTE: + *va_arg(ap, int8*) = + *(int8 *)val; + ret_val = 1; + break; + case TIFF_SHORT: + *va_arg(ap, uint16*) = + *(uint16 *)val; + ret_val = 1; + break; + case TIFF_SSHORT: + *va_arg(ap, int16*) = + *(int16 *)val; + ret_val = 1; + break; + case TIFF_LONG: + case TIFF_IFD: + *va_arg(ap, uint32*) = + *(uint32 *)val; + ret_val = 1; + break; + case TIFF_SLONG: + *va_arg(ap, int32*) = + *(int32 *)val; + ret_val = 1; + break; + case TIFF_LONG8: + case TIFF_IFD8: + *va_arg(ap, uint64*) = + *(uint64 *)val; + ret_val = 1; + break; + case TIFF_SLONG8: + *va_arg(ap, int64*) = + *(int64 *)val; + ret_val = 1; + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + case TIFF_FLOAT: + *va_arg(ap, float*) = + *(float *)val; + ret_val = 1; + break; + case TIFF_DOUBLE: + *va_arg(ap, double*) = + *(double *)val; + ret_val = 1; + break; + default: + ret_val = 0; + break; } } } @@ -1214,6 +1237,35 @@ TIFFCreateDirectory(TIFF* tif) return 0; } +int +TIFFCreateCustomDirectory(TIFF* tif, const TIFFFieldArray* infoarray) +{ + TIFFDefaultDirectory(tif); + + /* + * Reset the field definitions to match the application provided list. + * Hopefully TIFFDefaultDirectory() won't have done anything irreversable + * based on it's assumption this is an image directory. + */ + _TIFFSetupFields(tif, infoarray); + + tif->tif_diroff = 0; + tif->tif_nextdiroff = 0; + tif->tif_curoff = 0; + tif->tif_row = (uint32) -1; + tif->tif_curstrip = (uint32) -1; + + return 0; +} + +int +TIFFCreateEXIFDirectory(TIFF* tif) +{ + const TIFFFieldArray* exifFieldArray; + exifFieldArray = _TIFFGetExifFields(); + return TIFFCreateCustomDirectory(tif, exifFieldArray); +} + /* * Setup a default directory structure. */ diff --git a/3rdparty/libtiff/tif_fax3.c b/3rdparty/libtiff/tif_fax3.c index 57a4ce5e0..7a5c53d33 100644 --- a/3rdparty/libtiff/tif_fax3.c +++ b/3rdparty/libtiff/tif_fax3.c @@ -1,4 +1,4 @@ -/* $Id: tif_fax3.c,v 1.72 2010-06-09 17:17:13 bfriesen Exp $ */ +/* $Id: tif_fax3.c,v 1.73 2012-06-13 00:27:20 fwarmerdam Exp $ */ /* * Copyright (c) 1990-1997 Sam Leffler @@ -526,6 +526,7 @@ Fax3SetupState(TIFF* tif) "for Group 3/4 run arrays"); if (dsp->runs == NULL) return (0); + memset( dsp->runs, 0, TIFFSafeMultiply(uint32,nruns,2)); dsp->curruns = dsp->runs; if (needsRefLine) dsp->refruns = dsp->runs + nruns; diff --git a/3rdparty/libtiff/tif_getimage.c b/3rdparty/libtiff/tif_getimage.c index 6a09b4d25..a85273cc3 100644 --- a/3rdparty/libtiff/tif_getimage.c +++ b/3rdparty/libtiff/tif_getimage.c @@ -1,4 +1,4 @@ -/* $Id: tif_getimage.c,v 1.78 2011-02-23 21:46:09 fwarmerdam Exp $ */ +/* $Id: tif_getimage.c,v 1.82 2012-06-06 00:17:49 fwarmerdam Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -692,6 +692,7 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) unsigned char* p2; unsigned char* pa; tmsize_t tilesize; + tmsize_t bufsize; int32 fromskew, toskew; int alpha = img->alpha; uint32 nrow; @@ -699,12 +700,17 @@ gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) int colorchannels; tilesize = TIFFTileSize(tif); - buf = (unsigned char*) _TIFFmalloc((alpha?4:3)*tilesize); + bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,tilesize); + if (bufsize == 0) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer overflow in %s", "gtTileSeparate"); + return (0); + } + buf = (unsigned char*) _TIFFmalloc(bufsize); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "%s", "No space for tile buffer"); return (0); } - _TIFFmemset(buf, 0, (alpha?4:3)*tilesize); + _TIFFmemset(buf, 0, bufsize); p0 = buf; p1 = p0 + tilesize; p2 = p1 + tilesize; @@ -917,17 +923,23 @@ gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) uint32 rowsperstrip, offset_row; uint32 imagewidth = img->width; tmsize_t stripsize; + tmsize_t bufsize; int32 fromskew, toskew; int alpha = img->alpha; int ret = 1, flip, colorchannels; stripsize = TIFFStripSize(tif); - p0 = buf = (unsigned char *)_TIFFmalloc((alpha?4:3)*stripsize); + bufsize = TIFFSafeMultiply(tmsize_t,alpha?4:3,stripsize); + if (bufsize == 0) { + TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "Integer overflow in %s", "gtStripSeparate"); + return (0); + } + p0 = buf = (unsigned char *)_TIFFmalloc(bufsize); if (buf == 0) { TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for tile buffer"); return (0); } - _TIFFmemset(buf, 0, (alpha?4:3)*stripsize); + _TIFFmemset(buf, 0, bufsize); p1 = p0 + stripsize; p2 = p1 + stripsize; pa = (alpha?(p2+stripsize):NULL); @@ -1196,6 +1208,26 @@ DECLAREContigPutFunc(putgreytile) } } +/* + * 8-bit greyscale with associated alpha => colormap/RGBA + */ +DECLAREContigPutFunc(putagreytile) +{ + int samplesperpixel = img->samplesperpixel; + uint32** BWmap = img->BWmap; + + (void) y; + while (h-- > 0) { + for (x = w; x-- > 0;) + { + *cp++ = BWmap[*pp][0] & (*(pp+1) << 24 | ~A1); + pp += samplesperpixel; + } + cp += toskew; + pp += fromskew; + } +} + /* * 16-bit greyscale => colormap/RGB */ @@ -1494,6 +1526,26 @@ DECLARESepPutFunc(putRGBAAseparate8bittile) } } +/* + * 8-bit unpacked CMYK samples => RGBA + */ +DECLARESepPutFunc(putCMYKseparate8bittile) +{ + (void) img; (void) y; + while (h-- > 0) { + uint32 rv, gv, bv, kv; + for (x = w; x-- > 0;) { + kv = 255 - *a++; + rv = (kv*(255-*r++))/255; + gv = (kv*(255-*g++))/255; + bv = (kv*(255-*b++))/255; + *cp++ = PACK4(rv,gv,bv,255); + } + SKEW4(r, g, b, a, fromskew); + cp += toskew; + } +} + /* * 8-bit unpacked samples => RGBA w/ unassociated alpha */ @@ -2461,7 +2513,10 @@ PickContigCase(TIFFRGBAImage* img) img->put.contig = put16bitbwtile; break; case 8: - img->put.contig = putgreytile; + if (img->alpha && img->samplesperpixel == 2) + img->put.contig = putagreytile; + else + img->put.contig = putgreytile; break; case 4: img->put.contig = put4bitbwtile; @@ -2540,58 +2595,65 @@ PickSeparateCase(TIFFRGBAImage* img) img->get = TIFFIsTiled(img->tif) ? gtTileSeparate : gtStripSeparate; img->put.separate = NULL; switch (img->photometric) { - case PHOTOMETRIC_MINISWHITE: - case PHOTOMETRIC_MINISBLACK: - /* greyscale images processed pretty much as RGB by gtTileSeparate */ - case PHOTOMETRIC_RGB: - switch (img->bitspersample) { - case 8: - if (img->alpha == EXTRASAMPLE_ASSOCALPHA) - img->put.separate = putRGBAAseparate8bittile; - else if (img->alpha == EXTRASAMPLE_UNASSALPHA) - { - if (BuildMapUaToAa(img)) - img->put.separate = putRGBUAseparate8bittile; - } - else - img->put.separate = putRGBseparate8bittile; - break; - case 16: - if (img->alpha == EXTRASAMPLE_ASSOCALPHA) - { - if (BuildMapBitdepth16To8(img)) - img->put.separate = putRGBAAseparate16bittile; - } - else if (img->alpha == EXTRASAMPLE_UNASSALPHA) - { - if (BuildMapBitdepth16To8(img) && - BuildMapUaToAa(img)) - img->put.separate = putRGBUAseparate16bittile; - } - else - { - if (BuildMapBitdepth16To8(img)) - img->put.separate = putRGBseparate16bittile; - } - break; + case PHOTOMETRIC_MINISWHITE: + case PHOTOMETRIC_MINISBLACK: + /* greyscale images processed pretty much as RGB by gtTileSeparate */ + case PHOTOMETRIC_RGB: + switch (img->bitspersample) { + case 8: + if (img->alpha == EXTRASAMPLE_ASSOCALPHA) + img->put.separate = putRGBAAseparate8bittile; + else if (img->alpha == EXTRASAMPLE_UNASSALPHA) + { + if (BuildMapUaToAa(img)) + img->put.separate = putRGBUAseparate8bittile; + } + else + img->put.separate = putRGBseparate8bittile; + break; + case 16: + if (img->alpha == EXTRASAMPLE_ASSOCALPHA) + { + if (BuildMapBitdepth16To8(img)) + img->put.separate = putRGBAAseparate16bittile; + } + else if (img->alpha == EXTRASAMPLE_UNASSALPHA) + { + if (BuildMapBitdepth16To8(img) && + BuildMapUaToAa(img)) + img->put.separate = putRGBUAseparate16bittile; + } + else + { + if (BuildMapBitdepth16To8(img)) + img->put.separate = putRGBseparate16bittile; } break; - case PHOTOMETRIC_YCBCR: - if ((img->bitspersample==8) && (img->samplesperpixel==3)) + } + break; + case PHOTOMETRIC_SEPARATED: + if (img->bitspersample == 8 && img->samplesperpixel == 4) + { + img->alpha = 1; // Not alpha, but seems like the only way to get 4th band + img->put.separate = putCMYKseparate8bittile; + } + break; + case PHOTOMETRIC_YCBCR: + if ((img->bitspersample==8) && (img->samplesperpixel==3)) + { + if (initYCbCrConversion(img)!=0) { - if (initYCbCrConversion(img)!=0) - { - uint16 hs, vs; - TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs); - switch ((hs<<4)|vs) { - case 0x11: - img->put.separate = putseparate8bitYCbCr11tile; - break; - /* TODO: add other cases here */ - } + uint16 hs, vs; + TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs); + switch ((hs<<4)|vs) { + case 0x11: + img->put.separate = putseparate8bitYCbCr11tile; + break; + /* TODO: add other cases here */ } } - break; + } + break; } return ((img->get!=NULL) && (img->put.separate!=NULL)); } diff --git a/3rdparty/libtiff/tif_jpeg.c b/3rdparty/libtiff/tif_jpeg.c index f0e0aab8e..3c8d3bf76 100644 --- a/3rdparty/libtiff/tif_jpeg.c +++ b/3rdparty/libtiff/tif_jpeg.c @@ -1,4 +1,4 @@ -/* $Id: tif_jpeg.c,v 1.105 2012-02-01 01:51:00 fwarmerdam Exp $ */ +/* $Id: tif_jpeg.c,v 1.108 2012-06-05 03:24:30 fwarmerdam Exp $ */ /* * Copyright (c) 1994-1997 Sam Leffler @@ -1095,50 +1095,13 @@ JPEGPreDecode(TIFF* tif, uint16 s) /* Component 0 should have expected sampling factors */ if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling || sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) { - TIFFWarningExt(tif->tif_clientdata, module, - "Improper JPEG sampling factors %d,%d\n" - "Apparently should be %d,%d.", - sp->cinfo.d.comp_info[0].h_samp_factor, - sp->cinfo.d.comp_info[0].v_samp_factor, - sp->h_sampling, sp->v_sampling); - - /* - * There are potential security issues here - * for decoders that have already allocated - * buffers based on the expected sampling - * factors. Lets check the sampling factors - * dont exceed what we were expecting. - */ - if (sp->cinfo.d.comp_info[0].h_samp_factor - > sp->h_sampling - || sp->cinfo.d.comp_info[0].v_samp_factor - > sp->v_sampling) { - TIFFErrorExt(tif->tif_clientdata, - module, - "Cannot honour JPEG sampling factors" - " that exceed those specified."); - return (0); - } - - /* - * XXX: Files written by the Intergraph software - * has different sampling factors stored in the - * TIFF tags and in the JPEG structures. We will - * try to deduce Intergraph files by the presense - * of the tag 33918. - */ - if (!TIFFFindField(tif, 33918, TIFF_ANY)) { - TIFFWarningExt(tif->tif_clientdata, module, - "Decompressor will try reading with " - "sampling %d,%d.", - sp->cinfo.d.comp_info[0].h_samp_factor, - sp->cinfo.d.comp_info[0].v_samp_factor); - - sp->h_sampling = (uint16) - sp->cinfo.d.comp_info[0].h_samp_factor; - sp->v_sampling = (uint16) - sp->cinfo.d.comp_info[0].v_samp_factor; - } + TIFFErrorExt(tif->tif_clientdata, module, + "Improper JPEG sampling factors %d,%d\n" + "Apparently should be %d,%d.", + sp->cinfo.d.comp_info[0].h_samp_factor, + sp->cinfo.d.comp_info[0].v_samp_factor, + sp->h_sampling, sp->v_sampling); + return (0); } /* Rest should have sampling factors 1,1 */ for (ci = 1; ci < sp->cinfo.d.num_components; ci++) { @@ -1160,11 +1123,11 @@ JPEGPreDecode(TIFF* tif, uint16 s) if (td->td_planarconfig == PLANARCONFIG_CONTIG && sp->photometric == PHOTOMETRIC_YCBCR && sp->jpegcolormode == JPEGCOLORMODE_RGB) { - /* Convert YCbCr to RGB */ + /* Convert YCbCr to RGB */ sp->cinfo.d.jpeg_color_space = JCS_YCbCr; sp->cinfo.d.out_color_space = JCS_RGB; } else { - /* Suppress colorspace handling */ + /* Suppress colorspace handling */ sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN; sp->cinfo.d.out_color_space = JCS_UNKNOWN; if (td->td_planarconfig == PLANARCONFIG_CONTIG && @@ -1349,8 +1312,8 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) #if defined(JPEG_LIB_MK1_OR_12BIT) unsigned short* tmpbuf = _TIFFmalloc(sizeof(unsigned short) * - sp->cinfo.d.output_width * - sp->cinfo.d.num_components); + sp->cinfo.d.output_width * + sp->cinfo.d.num_components); if(tmpbuf==NULL) { TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw", "Out of memory"); @@ -1362,10 +1325,10 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) jpeg_component_info *compptr; int ci, clumpoffset; - if( cc < sp->bytesperline * sp->v_sampling ) { - TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw", - "application buffer not large enough for all data."); - return 0; + if( cc < sp->bytesperline ) { + TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw", + "application buffer not large enough for all data."); + return 0; } /* Reload downsampled-data buffer if needed */ @@ -1381,20 +1344,25 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) */ clumpoffset = 0; /* first sample in clump */ for (ci = 0, compptr = sp->cinfo.d.comp_info; - ci < sp->cinfo.d.num_components; - ci++, compptr++) { + ci < sp->cinfo.d.num_components; + ci++, compptr++) { int hsamp = compptr->h_samp_factor; int vsamp = compptr->v_samp_factor; int ypos; for (ypos = 0; ypos < vsamp; ypos++) { JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos]; + JDIMENSION nclump; #if defined(JPEG_LIB_MK1_OR_12BIT) JSAMPLE *outptr = (JSAMPLE*)tmpbuf + clumpoffset; #else JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset; + if (cc < clumpoffset + samples_per_clump*(clumps_per_line-1) + hsamp) { + TIFFErrorExt(tif->tif_clientdata, "JPEGDecodeRaw", + "application buffer not large enough for all data, possible subsampling issue"); + return 0; + } #endif - JDIMENSION nclump; if (hsamp == 1) { /* fast path for at least Cb and Cr */ @@ -1405,7 +1373,7 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) } else { int xpos; - /* general case */ + /* general case */ for (nclump = clumps_per_line; nclump-- > 0; ) { for (xpos = 0; xpos < hsamp; xpos++) outptr[xpos] = *inptr++; @@ -1428,9 +1396,9 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) } } else - { /* 12-bit */ + { /* 12-bit */ int value_pairs = (sp->cinfo.d.output_width - * sp->cinfo.d.num_components) / 2; + * sp->cinfo.d.num_components) / 2; int iPair; for( iPair = 0; iPair < value_pairs; iPair++ ) { @@ -1438,7 +1406,7 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) JSAMPLE *in_ptr = (JSAMPLE *) (tmpbuf + iPair * 2); out_ptr[0] = (in_ptr[0] & 0xff0) >> 4; out_ptr[1] = ((in_ptr[0] & 0xf) << 4) - | ((in_ptr[1] & 0xf00) >> 8); + | ((in_ptr[1] & 0xf00) >> 8); out_ptr[2] = ((in_ptr[1] & 0xff) >> 0); } } @@ -1447,12 +1415,9 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) sp->scancount ++; tif->tif_row += sp->v_sampling; -/* - buf += clumps_per_line*samples_per_clump; - cc -= clumps_per_line*samples_per_clump; -*/ - buf += sp->bytesperline * sp->v_sampling; - cc -= sp->bytesperline * sp->v_sampling; + + buf += sp->bytesperline; + cc -= sp->bytesperline; nrows -= sp->v_sampling; } while (nrows > 0); @@ -1465,7 +1430,7 @@ JPEGDecodeRaw(TIFF* tif, uint8* buf, tmsize_t cc, uint16 s) /* Close down the decompressor if done. */ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height - || TIFFjpeg_finish_decompress(sp); + || TIFFjpeg_finish_decompress(sp); } diff --git a/3rdparty/libtiff/tif_ojpeg.c b/3rdparty/libtiff/tif_ojpeg.c index 0c9301d99..6ea3c38ba 100644 --- a/3rdparty/libtiff/tif_ojpeg.c +++ b/3rdparty/libtiff/tif_ojpeg.c @@ -1,4 +1,4 @@ -/* $Id: tif_ojpeg.c,v 1.54 2011-05-31 17:05:07 bfriesen Exp $ */ +/* $Id: tif_ojpeg.c,v 1.56 2012-05-24 03:15:18 fwarmerdam Exp $ */ /* WARNING: The type of JPEG encapsulation defined by the TIFF Version 6.0 specification is now totally obsolete and deprecated for new applications and @@ -1146,7 +1146,9 @@ OJPEGWriteHeaderInfo(TIFF* tif) OJPEGState* sp=(OJPEGState*)tif->tif_data; uint8** m; uint32 n; - assert(sp->libjpeg_session_active==0); + /* if a previous attempt failed, don't try again */ + if (sp->libjpeg_session_active != 0) + return 0; sp->out_state=ososSoi; sp->restart_index=0; jpeg_std_error(&(sp->libjpeg_jpeg_error_mgr)); @@ -1954,6 +1956,11 @@ OJPEGReadBufferFill(OJPEGState* sp) case osibsJpegInterchangeFormat: sp->in_buffer_source=osibsStrile; case osibsStrile: + if (!_TIFFFillStriles( sp->tif ) + || sp->tif->tif_dir.td_stripoffset == NULL + || sp->tif->tif_dir.td_stripbytecount == NULL) + return 0; + if (sp->in_buffer_next_strile==sp->in_buffer_strile_count) sp->in_buffer_source=osibsEof; else diff --git a/3rdparty/libtiff/tif_pixarlog.c b/3rdparty/libtiff/tif_pixarlog.c index d8123e8db..c1b6ff2ed 100644 --- a/3rdparty/libtiff/tif_pixarlog.c +++ b/3rdparty/libtiff/tif_pixarlog.c @@ -1,4 +1,4 @@ -/* $Id: tif_pixarlog.c,v 1.35 2011-01-06 16:00:23 fwarmerdam Exp $ */ +/* $Id: tif_pixarlog.c,v 1.37 2012-05-24 23:21:45 fwarmerdam Exp $ */ /* * Copyright (c) 1996-1997 Sam Leffler @@ -120,9 +120,9 @@ horizontalAccumulateF(uint16 *wp, int n, int stride, float *op, if (n >= stride) { mask = CODE_MASK; if (stride == 3) { - t0 = ToLinearF[cr = wp[0]]; - t1 = ToLinearF[cg = wp[1]]; - t2 = ToLinearF[cb = wp[2]]; + t0 = ToLinearF[cr = (wp[0] & mask)]; + t1 = ToLinearF[cg = (wp[1] & mask)]; + t2 = ToLinearF[cb = (wp[2] & mask)]; op[0] = t0; op[1] = t1; op[2] = t2; @@ -139,10 +139,10 @@ horizontalAccumulateF(uint16 *wp, int n, int stride, float *op, op[2] = t2; } } else if (stride == 4) { - t0 = ToLinearF[cr = wp[0]]; - t1 = ToLinearF[cg = wp[1]]; - t2 = ToLinearF[cb = wp[2]]; - t3 = ToLinearF[ca = wp[3]]; + t0 = ToLinearF[cr = (wp[0] & mask)]; + t1 = ToLinearF[cg = (wp[1] & mask)]; + t2 = ToLinearF[cb = (wp[2] & mask)]; + t3 = ToLinearF[ca = (wp[3] & mask)]; op[0] = t0; op[1] = t1; op[2] = t2; @@ -186,9 +186,9 @@ horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op, if (n >= stride) { mask = CODE_MASK; if (stride == 3) { - t0 = ToLinearF[cr = wp[0]] * SCALE12; - t1 = ToLinearF[cg = wp[1]] * SCALE12; - t2 = ToLinearF[cb = wp[2]] * SCALE12; + t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12; + t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12; + t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); @@ -205,10 +205,10 @@ horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op, op[2] = CLAMP12(t2); } } else if (stride == 4) { - t0 = ToLinearF[cr = wp[0]] * SCALE12; - t1 = ToLinearF[cg = wp[1]] * SCALE12; - t2 = ToLinearF[cb = wp[2]] * SCALE12; - t3 = ToLinearF[ca = wp[3]] * SCALE12; + t0 = ToLinearF[cr = (wp[0] & mask)] * SCALE12; + t1 = ToLinearF[cg = (wp[1] & mask)] * SCALE12; + t2 = ToLinearF[cb = (wp[2] & mask)] * SCALE12; + t3 = ToLinearF[ca = (wp[3] & mask)] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); @@ -250,9 +250,9 @@ horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op, if (n >= stride) { mask = CODE_MASK; if (stride == 3) { - op[0] = ToLinear16[cr = wp[0]]; - op[1] = ToLinear16[cg = wp[1]]; - op[2] = ToLinear16[cb = wp[2]]; + op[0] = ToLinear16[cr = (wp[0] & mask)]; + op[1] = ToLinear16[cg = (wp[1] & mask)]; + op[2] = ToLinear16[cb = (wp[2] & mask)]; n -= 3; while (n > 0) { wp += 3; @@ -263,10 +263,10 @@ horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op, op[2] = ToLinear16[(cb += wp[2]) & mask]; } } else if (stride == 4) { - op[0] = ToLinear16[cr = wp[0]]; - op[1] = ToLinear16[cg = wp[1]]; - op[2] = ToLinear16[cb = wp[2]]; - op[3] = ToLinear16[ca = wp[3]]; + op[0] = ToLinear16[cr = (wp[0] & mask)]; + op[1] = ToLinear16[cg = (wp[1] & mask)]; + op[2] = ToLinear16[cb = (wp[2] & mask)]; + op[3] = ToLinear16[ca = (wp[3] & mask)]; n -= 4; while (n > 0) { wp += 4; @@ -345,9 +345,9 @@ horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op, if (n >= stride) { mask = CODE_MASK; if (stride == 3) { - op[0] = ToLinear8[cr = wp[0]]; - op[1] = ToLinear8[cg = wp[1]]; - op[2] = ToLinear8[cb = wp[2]]; + op[0] = ToLinear8[cr = (wp[0] & mask)]; + op[1] = ToLinear8[cg = (wp[1] & mask)]; + op[2] = ToLinear8[cb = (wp[2] & mask)]; n -= 3; while (n > 0) { n -= 3; @@ -358,10 +358,10 @@ horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op, op[2] = ToLinear8[(cb += wp[2]) & mask]; } } else if (stride == 4) { - op[0] = ToLinear8[cr = wp[0]]; - op[1] = ToLinear8[cg = wp[1]]; - op[2] = ToLinear8[cb = wp[2]]; - op[3] = ToLinear8[ca = wp[3]]; + op[0] = ToLinear8[cr = (wp[0] & mask)]; + op[1] = ToLinear8[cg = (wp[1] & mask)]; + op[2] = ToLinear8[cb = (wp[2] & mask)]; + op[3] = ToLinear8[ca = (wp[3] & mask)]; n -= 4; while (n > 0) { n -= 4; @@ -396,9 +396,9 @@ horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op, mask = CODE_MASK; if (stride == 3) { op[0] = 0; - t1 = ToLinear8[cb = wp[2]]; - t2 = ToLinear8[cg = wp[1]]; - t3 = ToLinear8[cr = wp[0]]; + t1 = ToLinear8[cb = (wp[2] & mask)]; + t2 = ToLinear8[cg = (wp[1] & mask)]; + t3 = ToLinear8[cr = (wp[0] & mask)]; op[1] = t1; op[2] = t2; op[3] = t3; @@ -416,10 +416,10 @@ horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op, op[3] = t3; } } else if (stride == 4) { - t0 = ToLinear8[ca = wp[3]]; - t1 = ToLinear8[cb = wp[2]]; - t2 = ToLinear8[cg = wp[1]]; - t3 = ToLinear8[cr = wp[0]]; + t0 = ToLinear8[ca = (wp[3] & mask)]; + t1 = ToLinear8[cb = (wp[2] & mask)]; + t2 = ToLinear8[cg = (wp[1] & mask)]; + t3 = ToLinear8[cr = (wp[0] & mask)]; op[0] = t0; op[1] = t1; op[2] = t2; @@ -673,7 +673,7 @@ PixarLogSetupDecode(TIFF* tif) td->td_rowsperstrip), sizeof(uint16)); if (tbuf_size == 0) return (0); /* TODO: this is an error return without error report through TIFFErrorExt */ - sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size); + sp->tbuf = (uint16 *) _TIFFmalloc(tbuf_size+sizeof(uint16)); if (sp->tbuf == NULL) return (0); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) diff --git a/3rdparty/libtiff/tif_print.c b/3rdparty/libtiff/tif_print.c index 9481eb62c..5ae2df048 100644 --- a/3rdparty/libtiff/tif_print.c +++ b/3rdparty/libtiff/tif_print.c @@ -1,4 +1,4 @@ -/* $Id: tif_print.c,v 1.54 2011-04-02 20:54:09 bfriesen Exp $ */ +/* $Id: tif_print.c,v 1.59 2012-06-13 01:08:51 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -34,6 +34,9 @@ #include +static void +_TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars); + static const char *photoNames[] = { "min-is-white", /* PHOTOMETRIC_MINISWHITE */ "min-is-black", /* PHOTOMETRIC_MINISBLACK */ @@ -135,34 +138,51 @@ _TIFFPrintField(FILE* fd, const TIFFField *fip, } static int -_TIFFPrettyPrintField(TIFF* tif, FILE* fd, uint32 tag, +_TIFFPrettyPrintField(TIFF* tif, const TIFFField *fip, FILE* fd, uint32 tag, uint32 value_count, void *raw_data) { (void) tif; + + /* do not try to pretty print auto-defined fields */ + if (strncmp(fip->field_name,"Tag ", 4) == 0) { + return 0; + } switch (tag) { case TIFFTAG_INKSET: - fprintf(fd, " Ink Set: "); - switch (*((uint16*)raw_data)) { + if (value_count == 2 && fip->field_type == TIFF_SHORT) { + fprintf(fd, " Ink Set: "); + switch (*((uint16*)raw_data)) { case INKSET_CMYK: fprintf(fd, "CMYK\n"); break; default: fprintf(fd, "%u (0x%x)\n", - *((uint16*)raw_data), - *((uint16*)raw_data)); + *((uint16*)raw_data), + *((uint16*)raw_data)); break; + } + return 1; } - return 1; + return 0; + case TIFFTAG_DOTRANGE: - fprintf(fd, " Dot Range: %u-%u\n", - ((uint16*)raw_data)[0], ((uint16*)raw_data)[1]); - return 1; + if (value_count == 2 && fip->field_type == TIFF_SHORT) { + fprintf(fd, " Dot Range: %u-%u\n", + ((uint16*)raw_data)[0], ((uint16*)raw_data)[1]); + return 1; + } + return 0; + case TIFFTAG_WHITEPOINT: - fprintf(fd, " White Point: %g-%g\n", - ((float *)raw_data)[0], ((float *)raw_data)[1]); - return 1; + if (value_count == 2 && fip->field_type == TIFF_RATIONAL) { + fprintf(fd, " White Point: %g-%g\n", + ((float *)raw_data)[0], ((float *)raw_data)[1]); + return 1; + } + return 0; + case TIFFTAG_XMLPACKET: { uint32 i; @@ -182,19 +202,25 @@ _TIFFPrettyPrintField(TIFF* tif, FILE* fd, uint32 tag, " RichTIFFIPTC Data: , %lu bytes\n", (unsigned long) value_count * 4); return 1; + case TIFFTAG_PHOTOSHOP: fprintf(fd, " Photoshop Data: , %lu bytes\n", (unsigned long) value_count); return 1; + case TIFFTAG_ICCPROFILE: fprintf(fd, " ICC Profile: , %lu bytes\n", (unsigned long) value_count); return 1; + case TIFFTAG_STONITS: - fprintf(fd, - " Sample to Nits conversion factor: %.4e\n", - *((double*)raw_data)); - return 1; + if (value_count == 1 && fip->field_type == TIFF_DOUBLE) { + fprintf(fd, + " Sample to Nits conversion factor: %.4e\n", + *((double*)raw_data)); + return 1; + } + return 0; } return 0; @@ -364,9 +390,13 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) fprintf(fd, " Ink Names: "); i = td->td_samplesperpixel; sep = ""; - for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) { + for (cp = td->td_inknames; + i > 0 && cp < td->td_inknames + td->td_inknameslen; + cp = strchr(cp,'\0')+1, i--) { + int max_chars = + td->td_inknameslen - (cp - td->td_inknames); fputs(sep, fd); - _TIFFprintAscii(fd, cp); + _TIFFprintAsciiBounded(fd, cp, max_chars); sep = ", "; } fputs("\n", fd); @@ -449,14 +479,16 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE)) fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue); if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) { + int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1; fprintf(fd, " SMin Sample Value:"); - for (i = 0; i < td->td_samplesperpixel; ++i) + for (i = 0; i < count; ++i) fprintf(fd, " %g", td->td_sminsamplevalue[i]); fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) { + int count = (tif->tif_flags & TIFF_PERSAMPLE) ? td->td_samplesperpixel : 1; fprintf(fd, " SMax Sample Value:"); - for (i = 0; i < td->td_samplesperpixel; ++i) + for (i = 0; i < count; ++i) fprintf(fd, " %g", td->td_smaxsamplevalue[i]); fprintf(fd, "\n"); } @@ -548,8 +580,19 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) continue; if(fip->field_passcount) { - if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) + if (fip->field_readcount == TIFF_VARIABLE2 ) { + if(TIFFGetField(tif, tag, &value_count, &raw_data) != 1) + continue; + } else if (fip->field_readcount == TIFF_VARIABLE2 ) { + uint16 small_value_count; + if(TIFFGetField(tif, tag, &small_value_count, &raw_data) != 1) + continue; + value_count = small_value_count; + } else { + assert (fip->field_readcount == TIFF_VARIABLE + || fip->field_readcount == TIFF_VARIABLE2); continue; + } } else { if (fip->field_readcount == TIFF_VARIABLE || fip->field_readcount == TIFF_VARIABLE2) @@ -558,21 +601,23 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) value_count = td->td_samplesperpixel; else value_count = fip->field_readcount; - if ((fip->field_type == TIFF_ASCII - || fip->field_readcount == TIFF_VARIABLE - || fip->field_readcount == TIFF_VARIABLE2 - || fip->field_readcount == TIFF_SPP - || value_count > 1) - && fip->field_tag != TIFFTAG_PAGENUMBER - && fip->field_tag != TIFFTAG_HALFTONEHINTS - && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING - && fip->field_tag != TIFFTAG_DOTRANGE) { + if (fip->field_tag == TIFFTAG_DOTRANGE + && strcmp(fip->field_name,"DotRange") == 0) { + /* TODO: This is an evil exception and should not have been + handled this way ... likely best if we move it into + the directory structure with an explicit field in + libtiff 4.1 and assign it a FIELD_ value */ + static uint16 dotrange[2]; + raw_data = dotrange; + TIFFGetField(tif, tag, dotrange+0, dotrange+1); + } else if (fip->field_type == TIFF_ASCII + || fip->field_readcount == TIFF_VARIABLE + || fip->field_readcount == TIFF_VARIABLE2 + || fip->field_readcount == TIFF_SPP + || value_count > 1) { if(TIFFGetField(tif, tag, &raw_data) != 1) continue; - } else if (fip->field_tag != TIFFTAG_PAGENUMBER - && fip->field_tag != TIFFTAG_HALFTONEHINTS - && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING - && fip->field_tag != TIFFTAG_DOTRANGE) { + } else { raw_data = _TIFFmalloc( _TIFFDataSize(fip->field_type) * value_count); @@ -581,26 +626,6 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) _TIFFfree(raw_data); continue; } - } else { - /* - * XXX: Should be fixed and removed, - * see the notes related to - * TIFFTAG_PAGENUMBER, - * TIFFTAG_HALFTONEHINTS, - * TIFFTAG_YCBCRSUBSAMPLING and - * TIFFTAG_DOTRANGE tags in tif_dir.c. - */ - char *tmp; - raw_data = _TIFFmalloc( - _TIFFDataSize(fip->field_type) - * value_count); - tmp = raw_data; - mem_alloc = 1; - if(TIFFGetField(tif, tag, tmp, - tmp + _TIFFDataSize(fip->field_type)) != 1) { - _TIFFfree(raw_data); - continue; - } } } @@ -610,7 +635,7 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) * _TIFFPrettyPrintField() fall down and print it as * any other tag. */ - if (!_TIFFPrettyPrintField(tif, fd, tag, value_count, raw_data)) + if (!_TIFFPrettyPrintField(tif, fip, fd, tag, value_count, raw_data)) _TIFFPrintField(fd, fip, value_count, raw_data); if(mem_alloc) @@ -648,7 +673,13 @@ TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) void _TIFFprintAscii(FILE* fd, const char* cp) { - for (; *cp != '\0'; cp++) { + _TIFFprintAsciiBounded( fd, cp, strlen(cp)); +} + +static void +_TIFFprintAsciiBounded(FILE* fd, const char* cp, int max_chars) +{ + for (; max_chars > 0 && *cp != '\0'; cp++, max_chars--) { const char* tp; if (isprint((int)*cp)) { diff --git a/3rdparty/libtiff/tif_read.c b/3rdparty/libtiff/tif_read.c index 594733f87..3ba31e3f8 100644 --- a/3rdparty/libtiff/tif_read.c +++ b/3rdparty/libtiff/tif_read.c @@ -1,4 +1,4 @@ -/* $Id: tif_read.c,v 1.38 2011-12-09 03:29:10 fwarmerdam Exp $ */ +/* $Id: tif_read.c,v 1.40 2012-06-01 00:55:09 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -93,6 +93,7 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) if( unused_data > 0 ) { + assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); memmove( tif->tif_rawdata, tif->tif_rawcp, unused_data ); } @@ -120,6 +121,7 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) - tif->tif_rawdataoff - tif->tif_rawdataloaded; } + assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); cc = TIFFReadFile(tif, tif->tif_rawdata + unused_data, to_read); if (cc != to_read) { @@ -145,8 +147,10 @@ TIFFFillStripPartial( TIFF *tif, int strip, tmsize_t read_ahead, int restart ) tif->tif_rawcp = tif->tif_rawdata; if (!isFillOrder(tif, td->td_fillorder) && - (tif->tif_flags & TIFF_NOBITREV) == 0) + (tif->tif_flags & TIFF_NOBITREV) == 0) { + assert((tif->tif_flags&TIFF_BUFFERMMAP)==0); TIFFReverseBits(tif->tif_rawdata + unused_data, to_read ); + } /* ** When starting a strip from the beginning we need to @@ -522,8 +526,11 @@ TIFFFillStrip(TIFF* tif, uint32 strip) * buffer (if they try to, the application will get a * fault since the file is mapped read-only). */ - if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) + if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); + tif->tif_rawdata = NULL; + tif->tif_rawdatasize = 0; + } tif->tif_flags &= ~TIFF_MYBUFFER; /* * We must check for overflow, potentially causing @@ -565,6 +572,14 @@ TIFFFillStrip(TIFF* tif, uint32 strip) tif->tif_rawdata = tif->tif_base + (tmsize_t)td->td_stripoffset[strip]; tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = (tmsize_t) bytecount; + + /* + * When we have tif_rawdata reference directly into the memory mapped file + * we need to be pretty careful about how we use the rawdata. It is not + * a general purpose working buffer as it normally otherwise is. So we + * keep track of this fact to avoid using it improperly. + */ + tif->tif_flags |= TIFF_BUFFERMMAP; } else { /* * Expand raw data buffer, if needed, to hold data @@ -589,6 +604,11 @@ TIFFFillStrip(TIFF* tif, uint32 strip) if (!TIFFReadBufferSetup(tif, 0, bytecountm)) return (0); } + if (tif->tif_flags&TIFF_BUFFERMMAP) { + tif->tif_curstrip = NOSTRIP; + if (!TIFFReadBufferSetup(tif, 0, bytecountm)) + return (0); + } if (TIFFReadRawStrip1(tif, strip, tif->tif_rawdata, bytecountm, module) != bytecountm) return (0); @@ -809,8 +829,11 @@ TIFFFillTile(TIFF* tif, uint32 tile) * buffer (if they try to, the application will get a * fault since the file is mapped read-only). */ - if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) + if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); + tif->tif_rawdata = NULL; + tif->tif_rawdatasize = 0; + } tif->tif_flags &= ~TIFF_MYBUFFER; /* * We must check for overflow, potentially causing @@ -831,6 +854,7 @@ TIFFFillTile(TIFF* tif, uint32 tile) tif->tif_base + (tmsize_t)td->td_stripoffset[tile]; tif->tif_rawdataoff = 0; tif->tif_rawdataloaded = (tmsize_t) bytecount; + tif->tif_flags |= TIFF_BUFFERMMAP; } else { /* * Expand raw data buffer, if needed, to hold data @@ -855,6 +879,12 @@ TIFFFillTile(TIFF* tif, uint32 tile) if (!TIFFReadBufferSetup(tif, 0, bytecountm)) return (0); } + if (tif->tif_flags&TIFF_BUFFERMMAP) { + tif->tif_curtile = NOTILE; + if (!TIFFReadBufferSetup(tif, 0, bytecountm)) + return (0); + } + if (TIFFReadRawTile1(tif, tile, tif->tif_rawdata, bytecountm, module) != bytecountm) return (0); @@ -886,10 +916,13 @@ TIFFReadBufferSetup(TIFF* tif, void* bp, tmsize_t size) static const char module[] = "TIFFReadBufferSetup"; assert((tif->tif_flags&TIFF_NOREADRAW)==0); + tif->tif_flags &= ~TIFF_BUFFERMMAP; + if (tif->tif_rawdata) { if (tif->tif_flags & TIFF_MYBUFFER) _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; + tif->tif_rawdatasize = 0; } if (bp) { tif->tif_rawdatasize = size; diff --git a/3rdparty/libtiff/tif_strip.c b/3rdparty/libtiff/tif_strip.c index 3ced5a8d5..568e4898d 100644 --- a/3rdparty/libtiff/tif_strip.c +++ b/3rdparty/libtiff/tif_strip.c @@ -1,4 +1,4 @@ -/* $Id: tif_strip.c,v 1.34 2011-04-02 20:54:09 bfriesen Exp $ */ +/* $Id: tif_strip.c,v 1.35 2012-06-06 05:33:55 fwarmerdam Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -107,11 +107,13 @@ TIFFVStripSize64(TIFF* tif, uint32 nrows) } TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0, ycbcrsubsampling+1); - if (((ycbcrsubsampling[0]!=1)&&(ycbcrsubsampling[0]!=2)&&(ycbcrsubsampling[0]!=4)) || - ((ycbcrsubsampling[1]!=1)&&(ycbcrsubsampling[1]!=2)&&(ycbcrsubsampling[1]!=4))) + if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4) + ||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4)) { TIFFErrorExt(tif->tif_clientdata,module, - "Invalid YCbCr subsampling"); + "Invalid YCbCr subsampling (%dx%d)", + ycbcrsubsampling[0], + ycbcrsubsampling[1] ); return 0; } samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2; diff --git a/3rdparty/libtiff/tif_tile.c b/3rdparty/libtiff/tif_tile.c index 062d943f6..0ff7e8535 100644 --- a/3rdparty/libtiff/tif_tile.c +++ b/3rdparty/libtiff/tif_tile.c @@ -1,4 +1,4 @@ -/* $Id: tif_tile.c,v 1.22 2010-07-01 15:33:28 dron Exp $ */ +/* $Id: tif_tile.c,v 1.23 2012-06-06 05:33:55 fwarmerdam Exp $ */ /* * Copyright (c) 1991-1997 Sam Leffler @@ -203,12 +203,13 @@ TIFFVTileSize64(TIFF* tif, uint32 nrows) uint64 samplingrow_size; TIFFGetFieldDefaulted(tif,TIFFTAG_YCBCRSUBSAMPLING,ycbcrsubsampling+0, ycbcrsubsampling+1); - assert((ycbcrsubsampling[0]==1)||(ycbcrsubsampling[0]==2)||(ycbcrsubsampling[0]==4)); - assert((ycbcrsubsampling[1]==1)||(ycbcrsubsampling[1]==2)||(ycbcrsubsampling[1]==4)); - if (ycbcrsubsampling[0]*ycbcrsubsampling[1]==0) + if ((ycbcrsubsampling[0] != 1 && ycbcrsubsampling[0] != 2 && ycbcrsubsampling[0] != 4) + ||(ycbcrsubsampling[1] != 1 && ycbcrsubsampling[1] != 2 && ycbcrsubsampling[1] != 4)) { TIFFErrorExt(tif->tif_clientdata,module, - "Invalid YCbCr subsampling"); + "Invalid YCbCr subsampling (%dx%d)", + ycbcrsubsampling[0], + ycbcrsubsampling[1] ); return 0; } samplingblock_samples=ycbcrsubsampling[0]*ycbcrsubsampling[1]+2; diff --git a/3rdparty/libtiff/tif_unix.c b/3rdparty/libtiff/tif_unix.c index 7c5cc50f8..1387558fb 100644 --- a/3rdparty/libtiff/tif_unix.c +++ b/3rdparty/libtiff/tif_unix.c @@ -1,4 +1,4 @@ -/* $Id: tif_unix.c,v 1.22 2010-03-10 18:56:49 bfriesen Exp $ */ +/* $Id: tif_unix.c,v 1.23 2012-06-01 21:40:59 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -186,7 +186,11 @@ TIFFOpen(const char* name, const char* mode) fd = open(name, m, 0666); if (fd < 0) { - TIFFErrorExt(0, module, "%s: Cannot open", name); + if (errno > 0 && strerror(errno) != NULL ) { + TIFFErrorExt(0, module, "%s: %s", name, strerror(errno) ); + } else { + TIFFErrorExt(0, module, "%s: Cannot open", name); + } return ((TIFF *)0); } diff --git a/3rdparty/libtiff/tiffio.h b/3rdparty/libtiff/tiffio.h index 6ca743431..c88ca190c 100644 --- a/3rdparty/libtiff/tiffio.h +++ b/3rdparty/libtiff/tiffio.h @@ -1,4 +1,4 @@ -/* $Id: tiffio.h,v 1.89 2012-02-18 16:20:26 bfriesen Exp $ */ +/* $Id: tiffio.h,v 1.90 2012-06-06 04:58:00 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -392,6 +392,8 @@ extern int TIFFSetupStrips(TIFF *); extern int TIFFWriteCheck(TIFF*, int, const char *); extern void TIFFFreeDirectory(TIFF*); extern int TIFFCreateDirectory(TIFF*); +extern int TIFFCreateCustomDirectory(TIFF*,const TIFFFieldArray*); +extern int TIFFCreateEXIFDirectory(TIFF*); extern int TIFFLastDirectory(TIFF*); extern int TIFFSetDirectory(TIFF*, uint16); extern int TIFFSetSubDirectory(TIFF*, uint64); @@ -400,6 +402,7 @@ extern int TIFFSetField(TIFF*, uint32, ...); extern int TIFFVSetField(TIFF*, uint32, va_list); extern int TIFFUnsetField(TIFF*, uint32); extern int TIFFWriteDirectory(TIFF *); +extern int TIFFWriteCustomDirectory(TIFF *, uint64 *); extern int TIFFCheckpointDirectory(TIFF *); extern int TIFFRewriteDirectory(TIFF *); diff --git a/3rdparty/libtiff/tiffiop.h b/3rdparty/libtiff/tiffiop.h index 7bed4abda..53357d852 100644 --- a/3rdparty/libtiff/tiffiop.h +++ b/3rdparty/libtiff/tiffiop.h @@ -1,4 +1,4 @@ -/* $Id: tiffiop.h,v 1.82 2011-02-18 20:53:05 fwarmerdam Exp $ */ +/* $Id: tiffiop.h,v 1.84 2012-05-30 01:50:17 fwarmerdam Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -121,6 +121,7 @@ struct tiff { #define TIFF_BUF4WRITE 0x100000 /* rawcc bytes are for writing */ #define TIFF_DIRTYSTRIP 0x200000 /* stripoffsets/stripbytecount dirty*/ #define TIFF_PERSAMPLE 0x400000 /* get/set per sample tags as arrays */ + #define TIFF_BUFFERMMAP 0x800000 /* read buffer (tif_rawdata) points into mmap() memory */ uint64 tif_diroff; /* file offset of current directory */ uint64 tif_nextdiroff; /* file offset of following directory */ uint64* tif_dirlist; /* list of offsets to already seen directories to prevent IFD looping */ @@ -250,7 +251,7 @@ struct tiff { #define TIFFroundup_64(x, y) (TIFFhowmany_64(x,y)*(y)) /* Safe multiply which returns zero if there is an integer overflow */ -#define TIFFSafeMultiply(t,v,m) ((((t)m != (t)0) && (((t)((v*m)/m)) == (t)v)) ? (t)(v*m) : (t)0) +#define TIFFSafeMultiply(t,v,m) ((((t)(m) != (t)0) && (((t)(((v)*(m))/(m))) == (t)(v))) ? (t)((v)*(m)) : (t)0) #define TIFFmax(A,B) ((A)>(B)?(A):(B)) #define TIFFmin(A,B) ((A)<(B)?(A):(B)) diff --git a/3rdparty/libtiff/tiffvers.h b/3rdparty/libtiff/tiffvers.h index fbdc5a10e..38ee9fab3 100644 --- a/3rdparty/libtiff/tiffvers.h +++ b/3rdparty/libtiff/tiffvers.h @@ -1,4 +1,4 @@ -#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.1\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." +#define TIFFLIB_VERSION_STR "LIBTIFF, Version 4.0.2\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." /* * This define can be used in code that requires * compilation-related definitions specific to a @@ -6,4 +6,4 @@ * version checking should be done based on the * string returned by TIFFGetVersion. */ -#define TIFFLIB_VERSION 20120218 +#define TIFFLIB_VERSION 20120615 From d28af08ef3b5910c634d9fa2ba3f961e37674a37 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 00:09:36 +0400 Subject: [PATCH 031/103] Update libjpeg to release 8d --- 3rdparty/libjpeg/CMakeLists.txt | 9 +- 3rdparty/libjpeg/README | 302 +- 3rdparty/libjpeg/change.log | 346 +++ 3rdparty/libjpeg/jaricom.c | 153 + 3rdparty/libjpeg/jcapimin.c | 10 +- 3rdparty/libjpeg/jcarith.c | 937 ++++++ 3rdparty/libjpeg/jccoefct.c | 39 +- 3rdparty/libjpeg/jccolor.c | 47 +- 3rdparty/libjpeg/jcdctmgr.c | 511 ++-- 3rdparty/libjpeg/jchuff.c | 1015 +++++-- 3rdparty/libjpeg/jchuff.h | 47 - 3rdparty/libjpeg/jcinit.c | 15 +- 3rdparty/libjpeg/jcmainct.c | 114 +- 3rdparty/libjpeg/jcmarker.c | 132 +- 3rdparty/libjpeg/jcmaster.c | 342 ++- 3rdparty/libjpeg/jconfig.h | 2 +- 3rdparty/libjpeg/jcparam.c | 72 +- 3rdparty/libjpeg/jcphuff.c | 833 ------ 3rdparty/libjpeg/jcprepct.c | 14 +- 3rdparty/libjpeg/jcsample.c | 94 +- 3rdparty/libjpeg/jctrans.c | 26 +- 3rdparty/libjpeg/jdapimin.c | 5 +- 3rdparty/libjpeg/jdapistd.c | 2 +- 3rdparty/libjpeg/jdarith.c | 776 +++++ 3rdparty/libjpeg/jdatadst.c | 122 +- 3rdparty/libjpeg/jdatasrc.c | 81 +- 3rdparty/libjpeg/jdcoefct.c | 23 +- 3rdparty/libjpeg/jdcolor.c | 120 +- 3rdparty/libjpeg/jdct.h | 239 +- 3rdparty/libjpeg/jddctmgr.c | 135 +- 3rdparty/libjpeg/jdhuff.c | 1176 +++++++- 3rdparty/libjpeg/jdhuff.h | 201 -- 3rdparty/libjpeg/jdinput.c | 376 ++- 3rdparty/libjpeg/jdmainct.c | 176 +- 3rdparty/libjpeg/jdmarker.c | 74 +- 3rdparty/libjpeg/jdmaster.c | 106 +- 3rdparty/libjpeg/jdphuff.c | 668 ----- 3rdparty/libjpeg/jdsample.c | 147 +- 3rdparty/libjpeg/jdtrans.c | 19 +- 3rdparty/libjpeg/jerror.c | 1 - 3rdparty/libjpeg/jerror.h | 18 +- 3rdparty/libjpeg/jfdctflt.c | 48 +- 3rdparty/libjpeg/jfdctfst.c | 48 +- 3rdparty/libjpeg/jfdctint.c | 4271 +++++++++++++++++++++++++- 3rdparty/libjpeg/jidctflt.c | 53 +- 3rdparty/libjpeg/jidctint.c | 4966 ++++++++++++++++++++++++++++++- 3rdparty/libjpeg/jidctred.c | 398 --- 3rdparty/libjpeg/jmemmgr.c | 8 +- 3rdparty/libjpeg/jmemnobs.c | 109 + 3rdparty/libjpeg/jmorecfg.h | 22 +- 3rdparty/libjpeg/jpegint.h | 66 +- 3rdparty/libjpeg/jpeglib.h | 120 +- 3rdparty/libjpeg/jquant1.c | 11 +- 3rdparty/libjpeg/jquant2.c | 7 +- 3rdparty/libjpeg/jutils.c | 90 +- 3rdparty/libjpeg/jversion.h | 6 +- 3rdparty/libjpeg/transupp.c | 1533 ---------- 3rdparty/libjpeg/transupp.h | 205 -- 58 files changed, 15845 insertions(+), 5641 deletions(-) create mode 100644 3rdparty/libjpeg/change.log create mode 100644 3rdparty/libjpeg/jaricom.c create mode 100644 3rdparty/libjpeg/jcarith.c delete mode 100644 3rdparty/libjpeg/jchuff.h delete mode 100644 3rdparty/libjpeg/jcphuff.c create mode 100644 3rdparty/libjpeg/jdarith.c delete mode 100644 3rdparty/libjpeg/jdhuff.h delete mode 100644 3rdparty/libjpeg/jdphuff.c delete mode 100644 3rdparty/libjpeg/jidctred.c create mode 100644 3rdparty/libjpeg/jmemnobs.c delete mode 100644 3rdparty/libjpeg/transupp.c delete mode 100644 3rdparty/libjpeg/transupp.h diff --git a/3rdparty/libjpeg/CMakeLists.txt b/3rdparty/libjpeg/CMakeLists.txt index 708e63e25..e8b652876 100644 --- a/3rdparty/libjpeg/CMakeLists.txt +++ b/3rdparty/libjpeg/CMakeLists.txt @@ -9,6 +9,12 @@ ocv_include_directories(${CMAKE_CURRENT_SOURCE_DIR}) file(GLOB lib_srcs *.c) file(GLOB lib_hdrs *.h) +if(ANDROID OR IOS) + ocv_list_filterout(lib_srcs jmemansi.c) +else() + ocv_list_filterout(lib_srcs jmemnobs.c) +endif() + # ---------------------------------------------------------------------------------- # Define the library target: # ---------------------------------------------------------------------------------- @@ -25,7 +31,8 @@ if(CMAKE_COMPILER_IS_GNUCXX) set_source_files_properties(jcdctmgr.c PROPERTIES COMPILE_FLAGS "-O1") endif() -ocv_warnings_disable(CMAKE_C_FLAGS -Wcast-align -Wshadow -Wunused) +ocv_warnings_disable(CMAKE_C_FLAGS -Wcast-align -Wshadow -Wunused -Wmain -Wimplicit-function-declaration) +ocv_warnings_disable(CMAKE_C_FLAGS /wd4013 /wd4244 /wd4267) # vs2005 set_target_properties(${JPEG_LIBRARY} PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY} diff --git a/3rdparty/libjpeg/README b/3rdparty/libjpeg/README index 86cc20669..0a23c1959 100644 --- a/3rdparty/libjpeg/README +++ b/3rdparty/libjpeg/README @@ -1,24 +1,20 @@ The Independent JPEG Group's JPEG software ========================================== -README for release 6b of 27-Mar-1998 +README for release 8d of 15-Jan-2012 ==================================== -This distribution contains the sixth public release of the Independent JPEG +This distribution contains the eighth public release of the Independent JPEG Group's free JPEG software. You are welcome to redistribute this software and to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. -Serious users of this software (particularly those incorporating it into -larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to -our electronic mailing list. Mailing list members are notified of updates -and have a chance to participate in technical discussions, etc. +This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone, +Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson, +Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, +and other members of the Independent JPEG Group. -This software is the work of Tom Lane, Philip Gladstone, Jim Boucher, -Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, -Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG -Group. - -IJG is not affiliated with the official ISO JPEG standards committee. +IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee +(also known as JPEG, together with ITU-T SG16). DOCUMENTATION ROADMAP @@ -30,27 +26,27 @@ OVERVIEW General description of JPEG and the IJG software. LEGAL ISSUES Copyright, lack of warranty, terms of distribution. REFERENCES Where to learn more about JPEG. ARCHIVE LOCATIONS Where to find newer versions of this software. -RELATED SOFTWARE Other stuff you should get. +ACKNOWLEDGMENTS Special thanks. FILE FORMAT WARS Software *not* to get. TO DO Plans for future IJG releases. Other documentation files in the distribution are: User documentation: - install.doc How to configure and install the IJG software. - usage.doc Usage instructions for cjpeg, djpeg, jpegtran, + install.txt How to configure and install the IJG software. + usage.txt Usage instructions for cjpeg, djpeg, jpegtran, rdjpgcom, and wrjpgcom. - *.1 Unix-style man pages for programs (same info as usage.doc). - wizard.doc Advanced usage instructions for JPEG wizards only. + *.1 Unix-style man pages for programs (same info as usage.txt). + wizard.txt Advanced usage instructions for JPEG wizards only. change.log Version-to-version change highlights. Programmer and internal documentation: - libjpeg.doc How to use the JPEG library in your own programs. + libjpeg.txt How to use the JPEG library in your own programs. example.c Sample code for calling the JPEG library. - structure.doc Overview of the JPEG library's internal structure. - filelist.doc Road map of IJG files. - coderules.doc Coding style rules --- please read if you contribute code. + structure.txt Overview of the JPEG library's internal structure. + filelist.txt Road map of IJG files. + coderules.txt Coding style rules --- please read if you contribute code. -Please read at least the files install.doc and usage.doc. Useful information +Please read at least the files install.txt and usage.txt. Some information can also be found in the JPEG FAQ (Frequently Asked Questions) article. See ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. @@ -62,24 +58,15 @@ the order listed) before diving into the code. OVERVIEW ======== -This package contains C software to implement JPEG image compression and -decompression. JPEG (pronounced "jay-peg") is a standardized compression -method for full-color and gray-scale images. JPEG is intended for compressing -"real-world" scenes; line drawings, cartoons and other non-realistic images -are not its strong suit. JPEG is lossy, meaning that the output image is not -exactly identical to the input image. Hence you must not use JPEG if you -have to have identical output bits. However, on typical photographic images, -very good compression levels can be obtained with no visible change, and -remarkably high compression levels are possible if you can tolerate a -low-quality image. For more details, see the references, or just experiment -with various compression settings. +This package contains C software to implement JPEG image encoding, decoding, +and transcoding. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. This software implements JPEG baseline, extended-sequential, and progressive compression processes. Provision is made for supporting all variants of these processes, although some uncommon parameter settings aren't implemented yet. -For legal reasons, we are not distributing code for the arithmetic-coding -variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting -the hierarchical or lossless processes defined in the standard. +We have made no provision for supporting the hierarchical or lossless +processes defined in the standard. We provide a set of library routines for reading and writing JPEG image files, plus two sample applications "cjpeg" and "djpeg", which use the library to @@ -91,10 +78,11 @@ considerable functionality beyond the bare JPEG coding/decoding capability; for example, the color quantization modules are not strictly part of JPEG decoding, but they are essential for output to colormapped file formats or colormapped displays. These extra functions can be compiled out of the -library if not required for a particular application. We have also included -"jpegtran", a utility for lossless transcoding between different JPEG -processes, and "rdjpgcom" and "wrjpgcom", two simple applications for -inserting and extracting textual comments in JFIF files. +library if not required for a particular application. + +We have also included "jpegtran", a utility for lossless transcoding between +different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple +applications for inserting and extracting textual comments in JFIF files. The emphasis in designing this software has been on achieving portability and flexibility, while also making it fast enough to be useful. In particular, @@ -127,7 +115,7 @@ with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose. This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy. -This software is copyright (C) 1991-1998, Thomas G. Lane. +This software is copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. All Rights Reserved except as specified below. Permission is hereby granted to use, copy, modify, and distribute this @@ -170,17 +158,8 @@ the foregoing paragraphs do. The Unix configuration script "configure" was produced with GNU Autoconf. It is copyright by the Free Software Foundation but is freely distributable. The same holds for its supporting scripts (config.guess, config.sub, -ltconfig, ltmain.sh). Another support script, install-sh, is copyright -by M.I.T. but is also freely distributable. - -It appears that the arithmetic coding option of the JPEG spec is covered by -patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot -legally be used without obtaining one or more licenses. For this reason, -support for arithmetic coding has been removed from the free JPEG software. -(Since arithmetic coding provides only a marginal gain over the unpatented -Huffman mode, it is unlikely that very many implementations will support it.) -So far as we are aware, there are no patent restrictions on the remaining -code. +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. The IJG distribution formerly included code to read and write GIF files. To avoid entanglement with the Unisys LZW patent, GIF reading support has @@ -198,7 +177,7 @@ We are required to state that REFERENCES ========== -We highly recommend reading one or more of these references before trying to +We recommend reading one or more of these references before trying to understand the innards of the JPEG software. The best short technical introduction to the JPEG compression algorithm is @@ -207,7 +186,7 @@ The best short technical introduction to the JPEG compression algorithm is (Adjacent articles in that issue discuss MPEG motion picture compression, applications of JPEG, and related topics.) If you don't have the CACM issue handy, a PostScript file containing a revised version of Wallace's article is -available at ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz. The file (actually +available at http://www.ijg.org/files/wallace.ps.gz. The file (actually a preprint for an article that appeared in IEEE Trans. Consumer Electronics) omits the sample images that appeared in CACM, but it includes corrections and some added material. Note: the Wallace article is copyright ACM and IEEE, @@ -222,82 +201,67 @@ code but don't know much about data compression in general. The book's JPEG sample code is far from industrial-strength, but when you are ready to look at a full implementation, you've got one here... -The best full description of JPEG is the textbook "JPEG Still Image Data -Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published -by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. -The book includes the complete text of the ISO JPEG standards (DIS 10918-1 -and draft DIS 10918-2). This is by far the most complete exposition of JPEG -in existence, and we highly recommend it. +The best currently available description of JPEG is the textbook "JPEG Still +Image Data Compression Standard" by William B. Pennebaker and Joan L. +Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. +Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG +standards (DIS 10918-1 and draft DIS 10918-2). +Although this is by far the most detailed and comprehensive exposition of +JPEG publicly available, we point out that it is still missing an explanation +of the most essential properties and algorithms of the underlying DCT +technology. +If you think that you know about DCT-based JPEG after reading this book, +then you are in delusion. The real fundamentals and corresponding potential +of DCT-based JPEG are not publicly known so far, and that is the reason for +all the mistaken developments taking place in the image coding domain. -The JPEG standard itself is not available electronically; you must order a -paper copy through ISO or ITU. (Unless you feel a need to own a certified -official copy, we recommend buying the Pennebaker and Mitchell book instead; -it's much cheaper and includes a great deal of useful explanatory material.) -In the USA, copies of the standard may be ordered from ANSI Sales at (212) -642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI -doesn't take credit card orders, but Global does.) It's not cheap: as of -1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7% -shipping/handling. The standard is divided into two parts, Part 1 being the -actual specification, while Part 2 covers compliance testing methods. Part 1 -is titled "Digital Compression and Coding of Continuous-tone Still Images, +The original JPEG standard is divided into two parts, Part 1 being the actual +specification, while Part 2 covers compliance testing methods. Part 1 is +titled "Digital Compression and Coding of Continuous-tone Still Images, Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS 10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of Continuous-tone Still Images, Part 2: Compliance testing" and has document numbers ISO/IEC IS 10918-2, ITU-T T.83. - -Some extensions to the original JPEG standard are defined in JPEG Part 3, -a newer ISO standard numbered ISO/IEC IS 10918-3 and ITU-T T.84. IJG -currently does not support any Part 3 extensions. +IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension +which is specified in two documents: A contributed document at ITU and ISO +with title "ITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced +Image Coding", April 2006, Geneva, Switzerland. The latest version of this +document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N +5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany. The JPEG standard does not specify all details of an interchangeable file format. For the omitted details we follow the "JFIF" conventions, revision -1.02. A copy of the JFIF spec is available from: - Literature Department - C-Cube Microsystems, Inc. - 1778 McCarthy Blvd. - Milpitas, CA 95035 - phone (408) 944-6300, fax (408) 944-6314 -A PostScript version of this document is available by FTP at -ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz. There is also a plain text -version at ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz, but it is missing -the figures. +1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report +and thus received a formal publication status. It is available as a free +download in PDF format from +http://www.ecma-international.org/publications/techreports/E-TR-098.htm. +A PostScript version of the JFIF document is available at +http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at +http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures. The TIFF 6.0 file format specification can be obtained by FTP from ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 -(Compression tag 7). Copies of this Note can be obtained from ftp.sgi.com or -from ftp://ftp.uu.net/graphics/jpeg/. It is expected that the next revision +(Compression tag 7). Copies of this Note can be obtained from +http://www.ijg.org/files/. It is expected that the next revision of the TIFF spec will replace the 6.0 JPEG design with the Note's design. Although IJG's own code does not support TIFF/JPEG, the free libtiff library -uses our library to implement TIFF/JPEG per the Note. libtiff is available -from ftp://ftp.sgi.com/graphics/tiff/. +uses our library to implement TIFF/JPEG per the Note. ARCHIVE LOCATIONS ================= -The "official" archive site for this software is ftp.uu.net (Internet -address 192.48.96.9). The most recent released version can always be found -there in directory graphics/jpeg. This particular version will be archived -as ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz. If you don't have -direct Internet access, UUNET's archives are also available via UUCP; contact -help@uunet.uu.net for information on retrieving files that way. +The "official" archive site for this software is www.ijg.org. +The most recent released version can always be found there in +directory "files". This particular version will be archived as +http://www.ijg.org/files/jpegsrc.v8d.tar.gz, and in Windows-compatible +"zip" archive format as http://www.ijg.org/files/jpegsr8d.zip. -Numerous Internet sites maintain copies of the UUNET files. However, only -ftp.uu.net is guaranteed to have the latest official version. - -You can also obtain this software in DOS-compatible "zip" archive format from -the SimTel archives (ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/), or -on CompuServe in the Graphics Support forum (GO CIS:GRAPHSUP), library 12 -"JPEG Tools". Again, these versions may sometimes lag behind the ftp.uu.net -release. - -The JPEG FAQ (Frequently Asked Questions) article is a useful source of -general information about JPEG. It is updated constantly and therefore is -not included in this distribution. The FAQ is posted every two weeks to -Usenet newsgroups comp.graphics.misc, news.answers, and other groups. +The JPEG FAQ (Frequently Asked Questions) article is a source of some +general information about JPEG. It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ and other news.answers archive sites, including the official news.answers archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. @@ -307,79 +271,81 @@ with body send usenet/news.answers/jpeg-faq/part2 -RELATED SOFTWARE -================ +ACKNOWLEDGMENTS +=============== -Numerous viewing and image manipulation programs now support JPEG. (Quite a -few of them use this library to do so.) The JPEG FAQ described above lists -some of the more popular free and shareware viewers, and tells where to -obtain them on Internet. +Thank to Juergen Bruder for providing me with a copy of the common DCT +algorithm article, only to find out that I had come to the same result +in a more direct and comprehensible way with a more generative approach. -If you are on a Unix machine, we highly recommend Jef Poskanzer's free -PBMPLUS software, which provides many useful operations on PPM-format image -files. In particular, it can convert PPM images to and from a wide range of -other formats, thus making cjpeg/djpeg considerably more useful. The latest -version is distributed by the NetPBM group, and is available from numerous -sites, notably ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/. -Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software is; -you are likely to have difficulty making it work on any non-Unix machine. +Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the +ITU JPEG (Study Group 16) meeting in Geneva, Switzerland. -A different free JPEG implementation, written by the PVRG group at Stanford, -is available from ftp://havefun.stanford.edu/pub/jpeg/. This program -is designed for research and experimentation rather than production use; -it is slower, harder to use, and less portable than the IJG code, but it -is easier to read and modify. Also, the PVRG code supports lossless JPEG, -which we do not. (On the other hand, it doesn't do progressive JPEG.) +Thank to Thomas Wiegand and Gary Sullivan for inviting me to the +Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland. + +Thank to Thomas Richter and Daniel Lee for inviting me to the +ISO/IEC JTC1/SC29/WG1 (also known as JPEG, together with ITU-T SG16) +meeting in Berlin, Germany. + +Thank to John Korejwa and Massimo Ballerini for inviting me to +fruitful consultations in Boston, MA and Milan, Italy. + +Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther +Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel +for corresponding business development. + +Thank to Nico Zschach and Dirk Stelling of the technical support team +at the Digital Images company in Halle for providing me with extra +equipment for configuration tests. + +Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful +communication about JPEG configuration in Sigma Photo Pro software. + +Thank to Andrew Finkenstadt for hosting the ijg.org site. + +Last but not least special thank to Thomas G. Lane for the original +design and development of this singular software package. FILE FORMAT WARS ================ -Some JPEG programs produce files that are not compatible with our library. -The root of the problem is that the ISO JPEG committee failed to specify a -concrete file format. Some vendors "filled in the blanks" on their own, -creating proprietary formats that no one else could read. (For example, none -of the early commercial JPEG implementations for the Macintosh were able to -exchange compressed files.) +The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together +with ITU-T SG16) currently promotes different formats containing the name +"JPEG" which is misleading because these formats are incompatible with +original DCT-based JPEG and are based on faulty technologies. +IJG therefore does not and will not support such momentary mistakes +(see REFERENCES). +There exist also distributions under the name "OpenJPEG" promoting such +kind of formats which is misleading because they don't support original +JPEG images. +We have no sympathy for the promotion of inferior formats. Indeed, one of +the original reasons for developing this free software was to help force +convergence on common, interoperable format standards for JPEG files. +Don't use an incompatible file format! +(In any case, our decoder will remain capable of reading existing JPEG +image files indefinitely.) -The file format we have adopted is called JFIF (see REFERENCES). This format -has been agreed to by a number of major commercial JPEG vendors, and it has -become the de facto standard. JFIF is a minimal or "low end" representation. -We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF -Technical Note #2) for "high end" applications that need to record a lot of -additional data about an image. TIFF/JPEG is fairly new and not yet widely -supported, unfortunately. +Furthermore, the ISO committee pretends to be "responsible for the popular +JPEG" in their public reports which is not true because they don't respond to +actual requirements for the maintenance of the original JPEG specification. -The upcoming JPEG Part 3 standard defines a file format called SPIFF. -SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should -be able to read the most common variant of SPIFF. SPIFF has some technical -advantages over JFIF, but its major claim to fame is simply that it is an -official standard rather than an informal one. At this point it is unclear -whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto -standard. IJG intends to support SPIFF once the standard is frozen, but we -have not decided whether it should become our default output format or not. -(In any case, our decoder will remain capable of reading JFIF indefinitely.) - -Various proprietary file formats incorporating JPEG compression also exist. -We have little or no sympathy for the existence of these formats. Indeed, -one of the original reasons for developing this free software was to help -force convergence on common, open format standards for JPEG files. Don't -use a proprietary file format! +There are currently distributions in circulation containing the name +"libjpeg" which claim to be a "derivative" or "fork" of the original +libjpeg, but don't have the features and are incompatible with formats +supported by actual IJG libjpeg distributions. Furthermore, they +violate the license conditions as described under LEGAL ISSUES above. +We have no sympathy for the release of misleading and illegal +distributions derived from obsolete code bases. +Don't use an obsolete code base! TO DO ===== -The major thrust for v7 will probably be improvement of visual quality. -The current method for scaling the quantization tables is known not to be -very good at low Q values. We also intend to investigate block boundary -smoothing, "poor man's variable quantization", and other means of improving -quality-vs-file-size performance without sacrificing compatibility. +Version 8 is the first release of a new generation JPEG standard +to overcome the limitations of the original JPEG specification. +More features are being prepared for coming releases... -In future versions, we are considering supporting some of the upcoming JPEG -Part 3 extensions --- principally, variable quantization and the SPIFF file -format. - -As always, speeding things up is of great interest. - -Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. +Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org. diff --git a/3rdparty/libjpeg/change.log b/3rdparty/libjpeg/change.log new file mode 100644 index 000000000..729bca6cf --- /dev/null +++ b/3rdparty/libjpeg/change.log @@ -0,0 +1,346 @@ +CHANGE LOG for Independent JPEG Group's JPEG software + + +Version 8d 15-Jan-2012 +----------------------- + +Add cjpeg -rgb option to create RGB JPEG files. +Using this switch suppresses the conversion from RGB +colorspace input to the default YCbCr JPEG colorspace. +This feature allows true lossless JPEG coding of RGB color images. +The recommended command for this purpose is currently +cjpeg -rgb -block 1 -arithmetic. +SmartScale capable decoder (introduced with IJG JPEG 8) required. +Thank to Michael Koch for the initial suggestion. + +Add option to disable the region adjustment in the transupp crop code. +Thank to Jeffrey Friedl for the suggestion. + +Thank to Richard Jones and Edd Dawson for various minor corrections. + +Thank to Akim Demaille for configure.ac cleanup. + + +Version 8c 16-Jan-2011 +----------------------- + +Add option to compression library and cjpeg (-block N) to use +different DCT block size. +All N from 1 to 16 are possible. Default is 8 (baseline format). +Larger values produce higher compression, +smaller values produce higher quality. +SmartScale capable decoder (introduced with IJG JPEG 8) required. + + +Version 8b 16-May-2010 +----------------------- + +Repair problem in new memory source manager with corrupt JPEG data. +Thank to Ted Campbell and Samuel Chun for the report. + +Repair problem in Makefile.am test target. +Thank to anonymous user for the report. + +Support MinGW installation with automatic configure. +Thank to Volker Grabsch for the suggestion. + + +Version 8a 28-Feb-2010 +----------------------- + +Writing tables-only datastreams via jpeg_write_tables works again. + +Support 32-bit BMPs (RGB image with Alpha channel) for read in cjpeg. +Thank to Brett Blackham for the suggestion. + +Improve accuracy in floating point IDCT calculation. +Thank to Robert Hooke for the hint. + + +Version 8 10-Jan-2010 +---------------------- + +jpegtran now supports the same -scale option as djpeg for "lossless" resize. +An implementation of the JPEG SmartScale extension is required for this +feature. A (draft) specification of the JPEG SmartScale extension is +available as a contributed document at ITU and ISO. Revision 2 or later +of the document is required (latest document version is Revision 3). +The SmartScale extension will enable more features beside lossless resize +in future implementations, as described in the document (new compression +options). + +Add sanity check in BMP reader module to avoid cjpeg crash for empty input +image (thank to Isaev Ildar of ISP RAS, Moscow, RU for reporting this error). + +Add data source and destination managers for read from and write to +memory buffers. New API functions jpeg_mem_src and jpeg_mem_dest. +Thank to Roberto Boni from Italy for the suggestion. + + +Version 7 27-Jun-2009 +---------------------- + +New scaled DCTs implemented. +djpeg now supports scalings N/8 with all N from 1 to 16. +cjpeg now supports scalings 8/N with all N from 1 to 16. +Scaled DCTs with size larger than 8 are now also used for resolving the +common 2x2 chroma subsampling case without additional spatial resampling. +Separate spatial resampling for those kind of files is now only necessary +for N>8 scaling cases. +Furthermore, separate scaled DCT functions are provided for direct resolving +of the common asymmetric subsampling cases (2x1 and 1x2) without additional +spatial resampling. + +cjpeg -quality option has been extended for support of separate quality +settings for luminance and chrominance (or in general, for every provided +quantization table slot). +New API function jpeg_default_qtables() and q_scale_factor array in library. + +Added -nosmooth option to cjpeg, complementary to djpeg. +New variable "do_fancy_downsampling" in library, complement to fancy +upsampling. Fancy upsampling now uses direct DCT scaling with sizes +larger than 8. The old method is not reversible and has been removed. + +Support arithmetic entropy encoding and decoding. +Added files jaricom.c, jcarith.c, jdarith.c. + +Straighten the file structure: +Removed files jidctred.c, jcphuff.c, jchuff.h, jdphuff.c, jdhuff.h. + +jpegtran has a new "lossless" cropping feature. + +Implement -perfect option in jpegtran, new API function +jtransform_perfect_transform() in transupp. (DP 204_perfect.dpatch) + +Better error messages for jpegtran fopen failure. +(DP 203_jpegtran_errmsg.dpatch) + +Fix byte order issue with 16bit PPM/PGM files in rdppm.c/wrppm.c: +according to Netpbm, the de facto standard implementation of the PNM formats, +the most significant byte is first. (DP 203_rdppm.dpatch) + +Add -raw option to rdjpgcom not to mangle the output. +(DP 205_rdjpgcom_raw.dpatch) + +Make rdjpgcom locale aware. (DP 201_rdjpgcom_locale.dpatch) + +Add extern "C" to jpeglib.h. +This avoids the need to put extern "C" { ... } around #include "jpeglib.h" +in your C++ application. Defining the symbol DONT_USE_EXTERN_C in the +configuration prevents this. (DP 202_jpeglib.h_c++.dpatch) + + +Version 6b 27-Mar-1998 +----------------------- + +jpegtran has new features for lossless image transformations (rotation +and flipping) as well as "lossless" reduction to grayscale. + +jpegtran now copies comments by default; it has a -copy switch to enable +copying all APPn blocks as well, or to suppress comments. (Formerly it +always suppressed comments and APPn blocks.) jpegtran now also preserves +JFIF version and resolution information. + +New decompressor library feature: COM and APPn markers found in the input +file can be saved in memory for later use by the application. (Before, +you had to code this up yourself with a custom marker processor.) + +There is an unused field "void * client_data" now in compress and decompress +parameter structs; this may be useful in some applications. + +JFIF version number information is now saved by the decoder and accepted by +the encoder. jpegtran uses this to copy the source file's version number, +to ensure "jpegtran -copy all" won't create bogus files that contain JFXX +extensions but claim to be version 1.01. Applications that generate their +own JFXX extension markers also (finally) have a supported way to cause the +encoder to emit JFIF version number 1.02. + +djpeg's trace mode reports JFIF 1.02 thumbnail images as such, rather +than as unknown APP0 markers. + +In -verbose mode, djpeg and rdjpgcom will try to print the contents of +APP12 markers as text. Some digital cameras store useful text information +in APP12 markers. + +Handling of truncated data streams is more robust: blocks beyond the one in +which the error occurs will be output as uniform gray, or left unchanged +if decoding a progressive JPEG. The appearance no longer depends on the +Huffman tables being used. + +Huffman tables are checked for validity much more carefully than before. + +To avoid the Unisys LZW patent, djpeg's GIF output capability has been +changed to produce "uncompressed GIFs", and cjpeg's GIF input capability +has been removed altogether. We're not happy about it either, but there +seems to be no good alternative. + +The configure script now supports building libjpeg as a shared library +on many flavors of Unix (all the ones that GNU libtool knows how to +build shared libraries for). Use "./configure --enable-shared" to +try this out. + +New jconfig file and makefiles for Microsoft Visual C++ and Developer Studio. +Also, a jconfig file and a build script for Metrowerks CodeWarrior +on Apple Macintosh. makefile.dj has been updated for DJGPP v2, and there +are miscellaneous other minor improvements in the makefiles. + +jmemmac.c now knows how to create temporary files following Mac System 7 +conventions. + +djpeg's -map switch is now able to read raw-format PPM files reliably. + +cjpeg -progressive -restart no longer generates any unnecessary DRI markers. + +Multiple calls to jpeg_simple_progression for a single JPEG object +no longer leak memory. + + +Version 6a 7-Feb-96 +-------------------- + +Library initialization sequence modified to detect version mismatches +and struct field packing mismatches between library and calling application. +This change requires applications to be recompiled, but does not require +any application source code change. + +All routine declarations changed to the style "GLOBAL(type) name ...", +that is, GLOBAL, LOCAL, METHODDEF, EXTERN are now macros taking the +routine's return type as an argument. This makes it possible to add +Microsoft-style linkage keywords to all the routines by changing just +these macros. Note that any application code that was using these macros +will have to be changed. + +DCT coefficient quantization tables are now stored in normal array order +rather than zigzag order. Application code that calls jpeg_add_quant_table, +or otherwise manipulates quantization tables directly, will need to be +changed. If you need to make such code work with either older or newer +versions of the library, a test like "#if JPEG_LIB_VERSION >= 61" is +recommended. + +djpeg's trace capability now dumps DQT tables in natural order, not zigzag +order. This allows the trace output to be made into a "-qtables" file +more easily. + +New system-dependent memory manager module for use on Apple Macintosh. + +Fix bug in cjpeg's -smooth option: last one or two scanlines would be +duplicates of the prior line unless the image height mod 16 was 1 or 2. + +Repair minor problems in VMS, BCC, MC6 makefiles. + +New configure script based on latest GNU Autoconf. + +Correct the list of include files needed by MetroWerks C for ccommand(). + +Numerous small documentation updates. + + +Version 6 2-Aug-95 +------------------- + +Progressive JPEG support: library can read and write full progressive JPEG +files. A "buffered image" mode supports incremental decoding for on-the-fly +display of progressive images. Simply recompiling an existing IJG-v5-based +decoder with v6 should allow it to read progressive files, though of course +without any special progressive display. + +New "jpegtran" application performs lossless transcoding between different +JPEG formats; primarily, it can be used to convert baseline to progressive +JPEG and vice versa. In support of jpegtran, the library now allows lossless +reading and writing of JPEG files as DCT coefficient arrays. This ability +may be of use in other applications. + +Notes for programmers: +* We changed jpeg_start_decompress() to be able to suspend; this makes all +decoding modes available to suspending-input applications. However, +existing applications that use suspending input will need to be changed +to check the return value from jpeg_start_decompress(). You don't need to +do anything if you don't use a suspending data source. +* We changed the interface to the virtual array routines: access_virt_array +routines now take a count of the number of rows to access this time. The +last parameter to request_virt_array routines is now interpreted as the +maximum number of rows that may be accessed at once, but not necessarily +the height of every access. + + +Version 5b 15-Mar-95 +--------------------- + +Correct bugs with grayscale images having v_samp_factor > 1. + +jpeg_write_raw_data() now supports output suspension. + +Correct bugs in "configure" script for case of compiling in +a directory other than the one containing the source files. + +Repair bug in jquant1.c: sometimes didn't use as many colors as it could. + +Borland C makefile and jconfig file work under either MS-DOS or OS/2. + +Miscellaneous improvements to documentation. + + +Version 5a 7-Dec-94 +-------------------- + +Changed color conversion roundoff behavior so that grayscale values are +represented exactly. (This causes test image files to change.) + +Make ordered dither use 16x16 instead of 4x4 pattern for a small quality +improvement. + +New configure script based on latest GNU Autoconf. +Fix configure script to handle CFLAGS correctly. +Rename *.auto files to *.cfg, so that configure script still works if +file names have been truncated for DOS. + +Fix bug in rdbmp.c: didn't allow for extra data between header and image. + +Modify rdppm.c/wrppm.c to handle 2-byte raw PPM/PGM formats for 12-bit data. + +Fix several bugs in rdrle.c. + +NEED_SHORT_EXTERNAL_NAMES option was broken. + +Revise jerror.h/jerror.c for more flexibility in message table. + +Repair oversight in jmemname.c NO_MKTEMP case: file could be there +but unreadable. + + +Version 5 24-Sep-94 +-------------------- + +Version 5 represents a nearly complete redesign and rewrite of the IJG +software. Major user-visible changes include: + * Automatic configuration simplifies installation for most Unix systems. + * A range of speed vs. image quality tradeoffs are supported. + This includes resizing of an image during decompression: scaling down + by a factor of 1/2, 1/4, or 1/8 is handled very efficiently. + * New programs rdjpgcom and wrjpgcom allow insertion and extraction + of text comments in a JPEG file. + +The application programmer's interface to the library has changed completely. +Notable improvements include: + * We have eliminated the use of callback routines for handling the + uncompressed image data. The application now sees the library as a + set of routines that it calls to read or write image data on a + scanline-by-scanline basis. + * The application image data is represented in a conventional interleaved- + pixel format, rather than as a separate array for each color channel. + This can save a copying step in many programs. + * The handling of compressed data has been cleaned up: the application can + supply routines to source or sink the compressed data. It is possible to + suspend processing on source/sink buffer overrun, although this is not + supported in all operating modes. + * All static state has been eliminated from the library, so that multiple + instances of compression or decompression can be active concurrently. + * JPEG abbreviated datastream formats are supported, ie, quantization and + Huffman tables can be stored separately from the image data. + * And not only that, but the documentation of the library has improved + considerably! + + +The last widely used release before the version 5 rewrite was version 4A of +18-Feb-93. Change logs before that point have been discarded, since they +are not of much interest after the rewrite. diff --git a/3rdparty/libjpeg/jaricom.c b/3rdparty/libjpeg/jaricom.c new file mode 100644 index 000000000..690068861 --- /dev/null +++ b/3rdparty/libjpeg/jaricom.c @@ -0,0 +1,153 @@ +/* + * jaricom.c + * + * Developed 1997-2011 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains probability estimation tables for common use in + * arithmetic entropy encoding and decoding routines. + * + * This data represents Table D.3 in the JPEG spec (D.2 in the draft), + * ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81, and Table 24 + * in the JBIG spec, ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* The following #define specifies the packing of the four components + * into the compact INT32 representation. + * Note that this formula must match the actual arithmetic encoder + * and decoder implementation. The implementation has to be changed + * if this formula is changed. + * The current organization is leaned on Markus Kuhn's JBIG + * implementation (jbig_tab.c). + */ + +#define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b) + +const INT32 jpeg_aritab[113+1] = { +/* + * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS + */ + V( 0, 0x5a1d, 1, 1, 1 ), + V( 1, 0x2586, 14, 2, 0 ), + V( 2, 0x1114, 16, 3, 0 ), + V( 3, 0x080b, 18, 4, 0 ), + V( 4, 0x03d8, 20, 5, 0 ), + V( 5, 0x01da, 23, 6, 0 ), + V( 6, 0x00e5, 25, 7, 0 ), + V( 7, 0x006f, 28, 8, 0 ), + V( 8, 0x0036, 30, 9, 0 ), + V( 9, 0x001a, 33, 10, 0 ), + V( 10, 0x000d, 35, 11, 0 ), + V( 11, 0x0006, 9, 12, 0 ), + V( 12, 0x0003, 10, 13, 0 ), + V( 13, 0x0001, 12, 13, 0 ), + V( 14, 0x5a7f, 15, 15, 1 ), + V( 15, 0x3f25, 36, 16, 0 ), + V( 16, 0x2cf2, 38, 17, 0 ), + V( 17, 0x207c, 39, 18, 0 ), + V( 18, 0x17b9, 40, 19, 0 ), + V( 19, 0x1182, 42, 20, 0 ), + V( 20, 0x0cef, 43, 21, 0 ), + V( 21, 0x09a1, 45, 22, 0 ), + V( 22, 0x072f, 46, 23, 0 ), + V( 23, 0x055c, 48, 24, 0 ), + V( 24, 0x0406, 49, 25, 0 ), + V( 25, 0x0303, 51, 26, 0 ), + V( 26, 0x0240, 52, 27, 0 ), + V( 27, 0x01b1, 54, 28, 0 ), + V( 28, 0x0144, 56, 29, 0 ), + V( 29, 0x00f5, 57, 30, 0 ), + V( 30, 0x00b7, 59, 31, 0 ), + V( 31, 0x008a, 60, 32, 0 ), + V( 32, 0x0068, 62, 33, 0 ), + V( 33, 0x004e, 63, 34, 0 ), + V( 34, 0x003b, 32, 35, 0 ), + V( 35, 0x002c, 33, 9, 0 ), + V( 36, 0x5ae1, 37, 37, 1 ), + V( 37, 0x484c, 64, 38, 0 ), + V( 38, 0x3a0d, 65, 39, 0 ), + V( 39, 0x2ef1, 67, 40, 0 ), + V( 40, 0x261f, 68, 41, 0 ), + V( 41, 0x1f33, 69, 42, 0 ), + V( 42, 0x19a8, 70, 43, 0 ), + V( 43, 0x1518, 72, 44, 0 ), + V( 44, 0x1177, 73, 45, 0 ), + V( 45, 0x0e74, 74, 46, 0 ), + V( 46, 0x0bfb, 75, 47, 0 ), + V( 47, 0x09f8, 77, 48, 0 ), + V( 48, 0x0861, 78, 49, 0 ), + V( 49, 0x0706, 79, 50, 0 ), + V( 50, 0x05cd, 48, 51, 0 ), + V( 51, 0x04de, 50, 52, 0 ), + V( 52, 0x040f, 50, 53, 0 ), + V( 53, 0x0363, 51, 54, 0 ), + V( 54, 0x02d4, 52, 55, 0 ), + V( 55, 0x025c, 53, 56, 0 ), + V( 56, 0x01f8, 54, 57, 0 ), + V( 57, 0x01a4, 55, 58, 0 ), + V( 58, 0x0160, 56, 59, 0 ), + V( 59, 0x0125, 57, 60, 0 ), + V( 60, 0x00f6, 58, 61, 0 ), + V( 61, 0x00cb, 59, 62, 0 ), + V( 62, 0x00ab, 61, 63, 0 ), + V( 63, 0x008f, 61, 32, 0 ), + V( 64, 0x5b12, 65, 65, 1 ), + V( 65, 0x4d04, 80, 66, 0 ), + V( 66, 0x412c, 81, 67, 0 ), + V( 67, 0x37d8, 82, 68, 0 ), + V( 68, 0x2fe8, 83, 69, 0 ), + V( 69, 0x293c, 84, 70, 0 ), + V( 70, 0x2379, 86, 71, 0 ), + V( 71, 0x1edf, 87, 72, 0 ), + V( 72, 0x1aa9, 87, 73, 0 ), + V( 73, 0x174e, 72, 74, 0 ), + V( 74, 0x1424, 72, 75, 0 ), + V( 75, 0x119c, 74, 76, 0 ), + V( 76, 0x0f6b, 74, 77, 0 ), + V( 77, 0x0d51, 75, 78, 0 ), + V( 78, 0x0bb6, 77, 79, 0 ), + V( 79, 0x0a40, 77, 48, 0 ), + V( 80, 0x5832, 80, 81, 1 ), + V( 81, 0x4d1c, 88, 82, 0 ), + V( 82, 0x438e, 89, 83, 0 ), + V( 83, 0x3bdd, 90, 84, 0 ), + V( 84, 0x34ee, 91, 85, 0 ), + V( 85, 0x2eae, 92, 86, 0 ), + V( 86, 0x299a, 93, 87, 0 ), + V( 87, 0x2516, 86, 71, 0 ), + V( 88, 0x5570, 88, 89, 1 ), + V( 89, 0x4ca9, 95, 90, 0 ), + V( 90, 0x44d9, 96, 91, 0 ), + V( 91, 0x3e22, 97, 92, 0 ), + V( 92, 0x3824, 99, 93, 0 ), + V( 93, 0x32b4, 99, 94, 0 ), + V( 94, 0x2e17, 93, 86, 0 ), + V( 95, 0x56a8, 95, 96, 1 ), + V( 96, 0x4f46, 101, 97, 0 ), + V( 97, 0x47e5, 102, 98, 0 ), + V( 98, 0x41cf, 103, 99, 0 ), + V( 99, 0x3c3d, 104, 100, 0 ), + V( 100, 0x375e, 99, 93, 0 ), + V( 101, 0x5231, 105, 102, 0 ), + V( 102, 0x4c0f, 106, 103, 0 ), + V( 103, 0x4639, 107, 104, 0 ), + V( 104, 0x415e, 103, 99, 0 ), + V( 105, 0x5627, 105, 106, 1 ), + V( 106, 0x50e7, 108, 107, 0 ), + V( 107, 0x4b85, 109, 103, 0 ), + V( 108, 0x5597, 110, 109, 0 ), + V( 109, 0x504f, 111, 107, 0 ), + V( 110, 0x5a10, 110, 111, 1 ), + V( 111, 0x5522, 112, 109, 0 ), + V( 112, 0x59eb, 112, 111, 1 ), +/* + * This last entry is used for fixed probability estimate of 0.5 + * as suggested in Section 10.3 Table 5 of ITU-T Rec. T.851. + */ + V( 113, 0x5a1d, 113, 113, 0 ) +}; diff --git a/3rdparty/libjpeg/jcapimin.c b/3rdparty/libjpeg/jcapimin.c index 54fb8c58c..639ce86f4 100644 --- a/3rdparty/libjpeg/jcapimin.c +++ b/3rdparty/libjpeg/jcapimin.c @@ -2,6 +2,7 @@ * jcapimin.c * * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -63,14 +64,21 @@ jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize) cinfo->comp_info = NULL; - for (i = 0; i < NUM_QUANT_TBLS; i++) + for (i = 0; i < NUM_QUANT_TBLS; i++) { cinfo->quant_tbl_ptrs[i] = NULL; + cinfo->q_scale_factor[i] = 100; + } for (i = 0; i < NUM_HUFF_TBLS; i++) { cinfo->dc_huff_tbl_ptrs[i] = NULL; cinfo->ac_huff_tbl_ptrs[i] = NULL; } + /* Must do it here for emit_dqt in case jpeg_write_tables is used */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + cinfo->script_space = NULL; cinfo->input_gamma = 1.0; /* in case application forgets */ diff --git a/3rdparty/libjpeg/jcarith.c b/3rdparty/libjpeg/jcarith.c new file mode 100644 index 000000000..033f67069 --- /dev/null +++ b/3rdparty/libjpeg/jcarith.c @@ -0,0 +1,937 @@ +/* + * jcarith.c + * + * Developed 1997-2011 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains portable arithmetic entropy encoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy encoder object for arithmetic encoding. */ + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */ + INT32 a; /* A register, normalized size of coding interval */ + INT32 sc; /* counter for stacked 0xFF values which might overflow */ + INT32 zc; /* counter for pending 0x00 output values which might * + * be discarded at the end ("Pacman" termination) */ + int ct; /* bit shift counter, determines when next byte will be written */ + int buffer; /* buffer for most recent output byte != 0xFF */ + + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_encoder; + +typedef arith_entropy_encoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + +/* NOTE: Uncomment the following #define if you want to use the + * given formula for calculating the AC conditioning parameter Kx + * for spectral selection progressive coding in section G.1.3.2 + * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4). + * Although the spec and P&M authors claim that this "has proven + * to give good results for 8 bit precision samples", I'm not + * convinced yet that this is really beneficial. + * Early tests gave only very marginal compression enhancements + * (a few - around 5 or so - bytes even for very large files), + * which would turn out rather negative if we'd suppress the + * DAC (Define Arithmetic Conditioning) marker segments for + * the default parameters in the future. + * Note that currently the marker writing module emits 12-byte + * DAC segments for a full-component scan in a color image. + * This is not worth worrying about IMHO. However, since the + * spec defines the default values to be used if the tables + * are omitted (unlike Huffman tables, which are required + * anyway), one might optimize this behaviour in the future, + * and then it would be disadvantageous to use custom tables if + * they don't provide sufficient gain to exceed the DAC size. + * + * On the other hand, I'd consider it as a reasonable result + * that the conditioning has no significant influence on the + * compression performance. This means that the basic + * statistical model is already rather stable. + * + * Thus, at the moment, we use the default conditioning values + * anyway, and do not use the custom formula. + * +#define CALCULATE_SPECTRAL_CONDITIONING + */ + +/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. + * We assume that int right shift is unsigned if INT32 right shift is, + * which should be safe. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS int ishift_temp; +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +LOCAL(void) +emit_byte (int val, j_compress_ptr cinfo) +/* Write next output byte; we do not support suspension in this module. */ +{ + struct jpeg_destination_mgr * dest = cinfo->dest; + + *dest->next_output_byte++ = (JOCTET) val; + if (--dest->free_in_buffer == 0) + if (! (*dest->empty_output_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); +} + + +/* + * Finish up at the end of an arithmetic-compressed scan. + */ + +METHODDEF(void) +finish_pass (j_compress_ptr cinfo) +{ + arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + INT32 temp; + + /* Section D.1.8: Termination of encoding */ + + /* Find the e->c in the coding interval with the largest + * number of trailing zero bits */ + if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c) + e->c = temp + 0x8000L; + else + e->c = temp; + /* Send remaining bytes to output */ + e->c <<= e->ct; + if (e->c & 0xF8000000L) { + /* One final overflow has to be handled */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + } else { + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + } + /* Output final bytes only if they are not 0x00 */ + if (e->c & 0x7FFF800L) { + if (e->zc) /* output final pending zero bytes */ + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte((e->c >> 19) & 0xFF, cinfo); + if (((e->c >> 19) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + if (e->c & 0x7F800L) { + emit_byte((e->c >> 11) & 0xFF, cinfo); + if (((e->c >> 11) & 0xFF) == 0xFF) + emit_byte(0x00, cinfo); + } + } +} + + +/* + * The core arithmetic encoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Parameter 'val' to be encoded may be 0 or 1 (binary decision). + * + * Note: I've added full "Pacman" termination support to the + * byte output routines, which is equivalent to the optional + * Discard_final_zeros procedure (Figure D.15) in the spec. + * Thus, we always produce the shortest possible output + * stream compliant to the spec (no trailing zero bytes, + * except for FF stuffing). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(void) +arith_encode (j_compress_ptr cinfo, unsigned char *st, int val) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv; + + /* Fetch values from our compact representation of Table D.3(D.2): + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Encode & estimation procedures per sections D.1.4 & D.1.5 */ + e->a -= qe; + if (val != (sv >> 7)) { + /* Encode the less probable symbol */ + if (e->a >= qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency, otherwise code the LPS + * as usual: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + } else { + /* Encode the more probable symbol */ + if (e->a >= 0x8000L) + return; /* A >= 0x8000 -> ready, no renormalization required */ + if (e->a < qe) { + /* If the interval size (qe) for the less probable symbol (LPS) + * is larger than the interval size for the MPS, then exchange + * the two symbols for coding efficiency: */ + e->c += e->a; + e->a = qe; + } + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + + /* Renormalization & data output per section D.1.6 */ + do { + e->a <<= 1; + e->c <<= 1; + if (--e->ct == 0) { + /* Another byte is ready for output */ + temp = e->c >> 19; + if (temp > 0xFF) { + /* Handle overflow over all stacked 0xFF bytes */ + if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer + 1, cinfo); + if (e->buffer + 1 == 0xFF) + emit_byte(0x00, cinfo); + } + e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ + e->sc = 0; + /* Note: The 3 spacer bits in the C register guarantee + * that the new buffer byte can't be 0xFF here + * (see page 160 in the P&M JPEG book). */ + e->buffer = temp & 0xFF; /* new output byte, might overflow later */ + } else if (temp == 0xFF) { + ++e->sc; /* stack 0xFF byte (which might overflow later) */ + } else { + /* Output all stacked 0xFF bytes, they will not overflow any more */ + if (e->buffer == 0) + ++e->zc; + else if (e->buffer >= 0) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + emit_byte(e->buffer, cinfo); + } + if (e->sc) { + if (e->zc) + do emit_byte(0x00, cinfo); + while (--e->zc); + do { + emit_byte(0xFF, cinfo); + emit_byte(0x00, cinfo); + } while (--e->sc); + } + e->buffer = temp & 0xFF; /* new output byte (can still overflow) */ + } + e->c &= 0x7FFFFL; + e->ct += 8; + } + } while (e->a < 0x8000L); +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(void) +emit_restart (j_compress_ptr cinfo, int restart_num) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + finish_pass(cinfo); + + emit_byte(0xFF, cinfo); + emit_byte(JPEG_RST0 + restart_num, cinfo); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ +} + + +/* + * MCU encoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl; + int v, v2, m; + ISHIFT_TEMPS + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al); + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = m - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = m; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + } + + return TRUE; +} + + +/* + * MCU encoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int Al, blkn; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + Al = cinfo->Al; + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* We simply emit the Al'th bit of the DC coefficient value. */ + arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1); + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, k, ke, kex; + int v; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Section G.1.3.3: Encoding of AC coefficients */ + + /* Establish EOB (end-of-block) index */ + for (ke = cinfo->Se; ke > 0; ke--) + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if ((v = (*block)[natural_order[ke]]) >= 0) { + if (v >>= cinfo->Al) break; + } else { + v = -v; + if (v >>= cinfo->Al) break; + } + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = ke; kex > 0; kex--) + if ((v = (*block)[natural_order[kex]]) >= 0) { + if (v >>= cinfo->Ah) break; + } else { + v = -v; + if (v >>= cinfo->Ah) break; + } + + /* Figure G.10: Encode_AC_Coefficients_SA */ + for (k = cinfo->Ss; k <= ke; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + arith_encode(cinfo, st, 0); /* EOB decision */ + for (;;) { + if ((v = (*block)[natural_order[k]]) >= 0) { + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 0); + } + break; + } + } else { + v = -v; + if (v >>= cinfo->Al) { + if (v >> 1) /* previously nonzero coef */ + arith_encode(cinfo, st + 2, (v & 1)); + else { /* newly nonzero coef */ + arith_encode(cinfo, st + 1, 1); + arith_encode(cinfo, entropy->fixed_bin, 1); + } + break; + } + } + arith_encode(cinfo, st + 1, 0); st += 3; k++; + } + } + /* Encode EOB decision only if k <= cinfo->Se */ + if (k <= cinfo->Se) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + arith_encode(cinfo, st, 1); + } + + return TRUE; +} + + +/* + * Encode and output one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, k, ke; + int v, v2, m; + const int * natural_order; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + emit_restart(cinfo, entropy->next_restart_num); + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + natural_order = cinfo->natural_order; + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.4: Encode_DC_DIFF */ + if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) { + arith_encode(cinfo, st, 0); + entropy->dc_context[ci] = 0; /* zero diff category */ + } else { + entropy->last_dc_val[ci] = (*block)[0]; + arith_encode(cinfo, st, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ + st += 2; /* Table F.4: SP = S0 + 2 */ + entropy->dc_context[ci] = 4; /* small positive diff category */ + } else { + v = -v; + arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ + st += 3; /* Table F.4: SN = S0 + 3 */ + entropy->dc_context[ci] = 8; /* small negative diff category */ + } + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + arith_encode(cinfo, st, 0); + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] += 8; /* large diff category */ + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + + /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ + + if ((ke = cinfo->lim_Se) == 0) continue; + tbl = compptr->ac_tbl_no; + + /* Establish EOB (end-of-block) index */ + do { + if ((*block)[natural_order[ke]]) break; + } while (--ke); + + /* Figure F.5: Encode_AC_Coefficients */ + for (k = 0; k < ke;) { + st = entropy->ac_stats[tbl] + 3 * k; + arith_encode(cinfo, st, 0); /* EOB decision */ + while ((v = (*block)[natural_order[++k]]) == 0) { + arith_encode(cinfo, st + 1, 0); + st += 3; + } + arith_encode(cinfo, st + 1, 1); + /* Figure F.6: Encoding nonzero value v */ + /* Figure F.7: Encoding the sign of v */ + if (v > 0) { + arith_encode(cinfo, entropy->fixed_bin, 0); + } else { + v = -v; + arith_encode(cinfo, entropy->fixed_bin, 1); + } + st += 2; + /* Figure F.8: Encoding the magnitude category of v */ + m = 0; + if (v -= 1) { + arith_encode(cinfo, st, 1); + m = 1; + v2 = v; + if (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (v2 >>= 1) { + arith_encode(cinfo, st, 1); + m <<= 1; + st += 1; + } + } + } + arith_encode(cinfo, st, 0); + /* Figure F.9: Encoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + arith_encode(cinfo, st, (m & v) ? 1 : 0); + } + /* Encode EOB decision only if k < cinfo->lim_Se */ + if (k < cinfo->lim_Se) { + st = entropy->ac_stats[tbl] + 3 * k; + arith_encode(cinfo, st, 1); + } + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_compress_ptr cinfo, boolean gather_statistics) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + /* Make sure to avoid that in the master control logic! + * We are fully adaptive here and need no extra + * statistics gathering pass! + */ + ERREXIT(cinfo, JERR_NOT_COMPILED); + + /* We assume jcmaster.c already validated the progressive scan parameters. */ + + /* Select execution routines */ + if (cinfo->progressive_mode) { + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else + entropy->pub.encode_mcu = encode_mcu_AC_refine; + } + } else + entropy->pub.encode_mcu = encode_mcu; + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); +#ifdef CALCULATE_SPECTRAL_CONDITIONING + if (cinfo->progressive_mode) + /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */ + cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4); +#endif + } + } + + /* Initialize arithmetic encoding variables */ + entropy->c = 0; + entropy->a = 0x10000L; + entropy->sc = 0; + entropy->zc = 0; + entropy->ct = 11; + entropy->buffer = -1; /* empty */ + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* + * Module initialization routine for arithmetic entropy encoding. + */ + +GLOBAL(void) +jinit_arith_encoder (j_compress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass; + entropy->pub.finish_pass = finish_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; +} diff --git a/3rdparty/libjpeg/jccoefct.c b/3rdparty/libjpeg/jccoefct.c index 1963ddb61..924a703dd 100644 --- a/3rdparty/libjpeg/jccoefct.c +++ b/3rdparty/libjpeg/jccoefct.c @@ -2,6 +2,7 @@ * jccoefct.c * * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 2003-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -149,6 +150,7 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) int blkn, bi, ci, yindex, yoffset, blockcnt; JDIMENSION ypos, xpos; jpeg_component_info *compptr; + forward_DCT_ptr forward_DCT; /* Loop to write as much as one whole iMCU row */ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; @@ -167,35 +169,37 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) blkn = 0; for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; + forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index]; blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width : compptr->last_col_width; xpos = MCU_col_num * compptr->MCU_sample_width; - ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */ + ypos = yoffset * compptr->DCT_v_scaled_size; + /* ypos == (yoffset+yindex) * DCTSIZE */ for (yindex = 0; yindex < compptr->MCU_height; yindex++) { if (coef->iMCU_row_num < last_iMCU_row || yoffset+yindex < compptr->last_row_height) { - (*cinfo->fdct->forward_DCT) (cinfo, compptr, - input_buf[compptr->component_index], - coef->MCU_buffer[blkn], - ypos, xpos, (JDIMENSION) blockcnt); + (*forward_DCT) (cinfo, compptr, + input_buf[compptr->component_index], + coef->MCU_buffer[blkn], + ypos, xpos, (JDIMENSION) blockcnt); if (blockcnt < compptr->MCU_width) { /* Create some dummy blocks at the right edge of the image. */ - jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], - (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); + FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt], + (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); for (bi = blockcnt; bi < compptr->MCU_width; bi++) { coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; } } } else { /* Create a row of dummy blocks at the bottom of the image. */ - jzero_far((void FAR *) coef->MCU_buffer[blkn], - compptr->MCU_width * SIZEOF(JBLOCK)); + FMEMZERO((void FAR *) coef->MCU_buffer[blkn], + compptr->MCU_width * SIZEOF(JBLOCK)); for (bi = 0; bi < compptr->MCU_width; bi++) { coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; } } blkn += compptr->MCU_width; - ypos += DCTSIZE; + ypos += compptr->DCT_v_scaled_size; } } /* Try to write the MCU. In event of a suspension failure, we will @@ -252,6 +256,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) jpeg_component_info *compptr; JBLOCKARRAY buffer; JBLOCKROW thisblockrow, lastblockrow; + forward_DCT_ptr forward_DCT; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { @@ -274,19 +279,19 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) ndummy = (int) (blocks_across % h_samp_factor); if (ndummy > 0) ndummy = h_samp_factor - ndummy; + forward_DCT = cinfo->fdct->forward_DCT[ci]; /* Perform DCT for all non-dummy blocks in this iMCU row. Each call * on forward_DCT processes a complete horizontal row of DCT blocks. */ for (block_row = 0; block_row < block_rows; block_row++) { thisblockrow = buffer[block_row]; - (*cinfo->fdct->forward_DCT) (cinfo, compptr, - input_buf[ci], thisblockrow, - (JDIMENSION) (block_row * DCTSIZE), - (JDIMENSION) 0, blocks_across); + (*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow, + (JDIMENSION) (block_row * compptr->DCT_v_scaled_size), + (JDIMENSION) 0, blocks_across); if (ndummy > 0) { /* Create dummy blocks at the right edge of the image. */ thisblockrow += blocks_across; /* => first dummy block */ - jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); + FMEMZERO((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); lastDC = thisblockrow[-1][0]; for (bi = 0; bi < ndummy; bi++) { thisblockrow[bi][0] = lastDC; @@ -305,8 +310,8 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) block_row++) { thisblockrow = buffer[block_row]; lastblockrow = buffer[block_row-1]; - jzero_far((void FAR *) thisblockrow, - (size_t) (blocks_across * SIZEOF(JBLOCK))); + FMEMZERO((void FAR *) thisblockrow, + (size_t) (blocks_across * SIZEOF(JBLOCK))); for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { lastDC = lastblockrow[h_samp_factor-1][0]; for (bi = 0; bi < h_samp_factor; bi++) { diff --git a/3rdparty/libjpeg/jccolor.c b/3rdparty/libjpeg/jccolor.c index 0a8a4b5d1..3e2d0e927 100644 --- a/3rdparty/libjpeg/jccolor.c +++ b/3rdparty/libjpeg/jccolor.c @@ -2,6 +2,7 @@ * jccolor.c * * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -299,6 +300,39 @@ grayscale_convert (j_compress_ptr cinfo, } +/* + * Convert some rows of samples to the JPEG colorspace. + * No colorspace conversion, but change from interleaved + * to separate-planes representation. + */ + +METHODDEF(void) +rgb_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + register JSAMPROW inptr; + register JSAMPROW outptr0, outptr1, outptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr0 = output_buf[0][output_row]; + outptr1 = output_buf[1][output_row]; + outptr2 = output_buf[2][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + /* We can dispense with GETJSAMPLE() here */ + outptr0[col] = inptr[RGB_RED]; + outptr1[col] = inptr[RGB_GREEN]; + outptr2[col] = inptr[RGB_BLUE]; + inptr += RGB_PIXELSIZE; + } + } +} + + /* * Convert some rows of samples to the JPEG colorspace. * This version handles multi-component colorspaces without conversion. @@ -368,11 +402,9 @@ jinit_color_converter (j_compress_ptr cinfo) break; case JCS_RGB: -#if RGB_PIXELSIZE != 3 if (cinfo->input_components != RGB_PIXELSIZE) ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); break; -#endif /* else share code with YCbCr */ case JCS_YCbCr: if (cinfo->input_components != 3) @@ -396,22 +428,21 @@ jinit_color_converter (j_compress_ptr cinfo) case JCS_GRAYSCALE: if (cinfo->num_components != 1) ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_GRAYSCALE) + if (cinfo->in_color_space == JCS_GRAYSCALE || + cinfo->in_color_space == JCS_YCbCr) cconvert->pub.color_convert = grayscale_convert; else if (cinfo->in_color_space == JCS_RGB) { cconvert->pub.start_pass = rgb_ycc_start; cconvert->pub.color_convert = rgb_gray_convert; - } else if (cinfo->in_color_space == JCS_YCbCr) - cconvert->pub.color_convert = grayscale_convert; - else + } else ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); break; case JCS_RGB: if (cinfo->num_components != 3) ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3) - cconvert->pub.color_convert = null_convert; + if (cinfo->in_color_space == JCS_RGB) + cconvert->pub.color_convert = rgb_convert; else ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); break; diff --git a/3rdparty/libjpeg/jcdctmgr.c b/3rdparty/libjpeg/jcdctmgr.c index 61fa79b9e..0bbdbb685 100644 --- a/3rdparty/libjpeg/jcdctmgr.c +++ b/3rdparty/libjpeg/jcdctmgr.c @@ -23,7 +23,7 @@ typedef struct { struct jpeg_forward_dct pub; /* public fields */ /* Pointer to the DCT routine actually in use */ - forward_DCT_method_ptr do_dct; + forward_DCT_method_ptr do_dct[MAX_COMPONENTS]; /* The actual post-DCT divisors --- not identical to the quant table * entries, because of scaling (especially for an unnormalized DCT). @@ -33,7 +33,7 @@ typedef struct { #ifdef DCT_FLOAT_SUPPORTED /* Same as above for the floating-point case. */ - float_DCT_method_ptr do_float_dct; + float_DCT_method_ptr do_float_dct[MAX_COMPONENTS]; FAST_FLOAT * float_divisors[NUM_QUANT_TBLS]; #endif } my_fdct_controller; @@ -41,131 +41,16 @@ typedef struct { typedef my_fdct_controller * my_fdct_ptr; -/* - * Initialize for a processing pass. - * Verify that all referenced Q-tables are present, and set up - * the divisor table for each one. - * In the current implementation, DCT of all components is done during - * the first pass, even if only some components will be output in the - * first scan. Hence all components should be examined here. +/* The current scaled-DCT routines require ISLOW-style divisor tables, + * so be sure to compile that code if either ISLOW or SCALING is requested. */ - -METHODDEF(void) -start_pass_fdctmgr (j_compress_ptr cinfo) -{ - my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - int ci, qtblno, i; - jpeg_component_info *compptr; - JQUANT_TBL * qtbl; - DCTELEM * dtbl; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - qtblno = compptr->quant_tbl_no; - /* Make sure specified quantization table is present */ - if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || - cinfo->quant_tbl_ptrs[qtblno] == NULL) - ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); - qtbl = cinfo->quant_tbl_ptrs[qtblno]; - /* Compute divisors for this quant table */ - /* We may do this more than once for same table, but it's not a big deal */ - switch (cinfo->dct_method) { #ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - /* For LL&M IDCT method, divisors are equal to raw quantization - * coefficients multiplied by 8 (to counteract scaling). - */ - if (fdct->divisors[qtblno] == NULL) { - fdct->divisors[qtblno] = (DCTELEM *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(DCTELEM)); - } - dtbl = fdct->divisors[qtblno]; - for (i = 0; i < DCTSIZE2; i++) { - dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3; - } - break; +#define PROVIDE_ISLOW_TABLES +#else +#ifdef DCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES #endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - { - /* For AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - */ -#define CONST_BITS 14 - static const INT16 aanscales[DCTSIZE2] = { - /* precomputed values scaled up by 14 bits */ - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, - 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, - 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, - 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, - 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 - }; - SHIFT_TEMPS - - if (fdct->divisors[qtblno] == NULL) { - fdct->divisors[qtblno] = (DCTELEM *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(DCTELEM)); - } - dtbl = fdct->divisors[qtblno]; - for (i = 0; i < DCTSIZE2; i++) { - dtbl[i] = (DCTELEM) - DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], - (INT32) aanscales[i]), - CONST_BITS-3); - } - } - break; #endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - { - /* For float AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - * What's actually stored is 1/divisor so that the inner loop can - * use a multiplication rather than a division. - */ - FAST_FLOAT * fdtbl; - int row, col; - static const double aanscalefactor[DCTSIZE] = { - 1.0, 1.387039845, 1.306562965, 1.175875602, - 1.0, 0.785694958, 0.541196100, 0.275899379 - }; - - if (fdct->float_divisors[qtblno] == NULL) { - fdct->float_divisors[qtblno] = (FAST_FLOAT *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(FAST_FLOAT)); - } - fdtbl = fdct->float_divisors[qtblno]; - i = 0; - for (row = 0; row < DCTSIZE; row++) { - for (col = 0; col < DCTSIZE; col++) { - fdtbl[i] = (FAST_FLOAT) - (1.0 / (((double) qtbl->quantval[i] * - aanscalefactor[row] * aanscalefactor[col] * 8.0))); - i++; - } - } - } - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - } -} /* @@ -185,43 +70,16 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, { /* This routine is heavily used, so it's worth coding it tightly. */ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - forward_DCT_method_ptr do_dct = fdct->do_dct; + forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index]; DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no]; DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */ JDIMENSION bi; sample_data += start_row; /* fold in the vertical offset once */ - for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { - /* Load data into workspace, applying unsigned->signed conversion */ - { register DCTELEM *workspaceptr; - register JSAMPROW elemptr; - register int elemr; - - workspaceptr = workspace; - for (elemr = 0; elemr < DCTSIZE; elemr++) { - elemptr = sample_data[elemr] + start_col; -#if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; -#else - { register int elemc; - for (elemc = DCTSIZE; elemc > 0; elemc--) { - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - } - } -#endif - } - } - + for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { /* Perform the DCT */ - (*do_dct) (workspace); + (*do_dct) (workspace, sample_data, start_col); /* Quantize/descale the coefficients, and store into coef_blocks[] */ { register DCTELEM temp, qval; @@ -275,44 +133,16 @@ forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, { /* This routine is heavily used, so it's worth coding it tightly. */ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - float_DCT_method_ptr do_dct = fdct->do_float_dct; + float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index]; FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no]; FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */ JDIMENSION bi; sample_data += start_row; /* fold in the vertical offset once */ - for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { - /* Load data into workspace, applying unsigned->signed conversion */ - { register FAST_FLOAT *workspaceptr; - register JSAMPROW elemptr; - register int elemr; - - workspaceptr = workspace; - for (elemr = 0; elemr < DCTSIZE; elemr++) { - elemptr = sample_data[elemr] + start_col; -#if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); -#else - { register int elemc; - for (elemc = DCTSIZE; elemc > 0; elemc--) { - *workspaceptr++ = (FAST_FLOAT) - (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - } - } -#endif - } - } - + for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) { /* Perform the DCT */ - (*do_dct) (workspace); + (*do_dct) (workspace, sample_data, start_col); /* Quantize/descale the coefficients, and store into coef_blocks[] */ { register FAST_FLOAT temp; @@ -337,6 +167,295 @@ forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, #endif /* DCT_FLOAT_SUPPORTED */ +/* + * Initialize for a processing pass. + * Verify that all referenced Q-tables are present, and set up + * the divisor table for each one. + * In the current implementation, DCT of all components is done during + * the first pass, even if only some components will be output in the + * first scan. Hence all components should be examined here. + */ + +METHODDEF(void) +start_pass_fdctmgr (j_compress_ptr cinfo) +{ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + int ci, qtblno, i; + jpeg_component_info *compptr; + int method = 0; + JQUANT_TBL * qtbl; + DCTELEM * dtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Select the proper DCT routine for this component's scaling */ + switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { +#ifdef DCT_SCALING_SUPPORTED + case ((1 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_1x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_2x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_3x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_4x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_5x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_6x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_7x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((9 << 8) + 9): + fdct->do_dct[ci] = jpeg_fdct_9x9; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_10x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((11 << 8) + 11): + fdct->do_dct[ci] = jpeg_fdct_11x11; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_12x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((13 << 8) + 13): + fdct->do_dct[ci] = jpeg_fdct_13x13; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_14x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((15 << 8) + 15): + fdct->do_dct[ci] = jpeg_fdct_15x15; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_16x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((16 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_16x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((14 << 8) + 7): + fdct->do_dct[ci] = jpeg_fdct_14x7; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((12 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_12x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((10 << 8) + 5): + fdct->do_dct[ci] = jpeg_fdct_10x5; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_8x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 3): + fdct->do_dct[ci] = jpeg_fdct_6x3; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_4x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 1): + fdct->do_dct[ci] = jpeg_fdct_2x1; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((8 << 8) + 16): + fdct->do_dct[ci] = jpeg_fdct_8x16; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((7 << 8) + 14): + fdct->do_dct[ci] = jpeg_fdct_7x14; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((6 << 8) + 12): + fdct->do_dct[ci] = jpeg_fdct_6x12; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((5 << 8) + 10): + fdct->do_dct[ci] = jpeg_fdct_5x10; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((4 << 8) + 8): + fdct->do_dct[ci] = jpeg_fdct_4x8; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((3 << 8) + 6): + fdct->do_dct[ci] = jpeg_fdct_3x6; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((2 << 8) + 4): + fdct->do_dct[ci] = jpeg_fdct_2x4; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; + case ((1 << 8) + 2): + fdct->do_dct[ci] = jpeg_fdct_1x2; + method = JDCT_ISLOW; /* jfdctint uses islow-style table */ + break; +#endif + case ((DCTSIZE << 8) + DCTSIZE): + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + fdct->do_dct[ci] = jpeg_fdct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + fdct->do_dct[ci] = jpeg_fdct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + fdct->do_float_dct[ci] = jpeg_fdct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); + break; + } + qtblno = compptr->quant_tbl_no; + /* Make sure specified quantization table is present */ + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + qtbl = cinfo->quant_tbl_ptrs[qtblno]; + /* Compute divisors for this quant table */ + /* We may do this more than once for same table, but it's not a big deal */ + switch (method) { +#ifdef PROVIDE_ISLOW_TABLES + case JDCT_ISLOW: + /* For LL&M IDCT method, divisors are equal to raw quantization + * coefficients multiplied by 8 (to counteract scaling). + */ + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3; + } + fdct->pub.forward_DCT[ci] = forward_DCT; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + */ +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = (DCTELEM) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-3); + } + } + fdct->pub.forward_DCT[ci] = forward_DCT; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + * What's actually stored is 1/divisor so that the inner loop can + * use a multiplication rather than a division. + */ + FAST_FLOAT * fdtbl; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + if (fdct->float_divisors[qtblno] == NULL) { + fdct->float_divisors[qtblno] = (FAST_FLOAT *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(FAST_FLOAT)); + } + fdtbl = fdct->float_divisors[qtblno]; + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fdtbl[i] = (FAST_FLOAT) + (1.0 / (((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col] * 8.0))); + i++; + } + } + } + fdct->pub.forward_DCT[ci] = forward_DCT_float; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + /* * Initialize FDCT manager. */ @@ -353,30 +472,6 @@ jinit_forward_dct (j_compress_ptr cinfo) cinfo->fdct = (struct jpeg_forward_dct *) fdct; fdct->pub.start_pass = start_pass_fdctmgr; - switch (cinfo->dct_method) { -#ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - fdct->pub.forward_DCT = forward_DCT; - fdct->do_dct = jpeg_fdct_islow; - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - fdct->pub.forward_DCT = forward_DCT; - fdct->do_dct = jpeg_fdct_ifast; - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - fdct->pub.forward_DCT = forward_DCT_float; - fdct->do_float_dct = jpeg_fdct_float; - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - /* Mark divisor tables unallocated */ for (i = 0; i < NUM_QUANT_TBLS; i++) { fdct->divisors[i] = NULL; diff --git a/3rdparty/libjpeg/jchuff.c b/3rdparty/libjpeg/jchuff.c index f23525054..257d7aa1f 100644 --- a/3rdparty/libjpeg/jchuff.c +++ b/3rdparty/libjpeg/jchuff.c @@ -2,22 +2,48 @@ * jchuff.c * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains Huffman entropy encoding routines. + * Both sequential and progressive modes are supported in this single module. * * Much of the complexity here has to do with supporting output suspension. * If the data destination module demands suspension, we want to be able to * back up to the start of the current MCU. To do this, we copy state * variables into local working storage, and update them back to the * permanent JPEG objects only upon successful completion of an MCU. + * + * We do not support output suspension for the progressive JPEG mode, since + * the library currently does not allow multiple-scan files to be written + * with output suspension. */ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" -#include "jchuff.h" /* Declarations shared with jcphuff.c */ + + +/* The legal range of a DCT coefficient is + * -1024 .. +1023 for 8-bit data; + * -16384 .. +16383 for 12-bit data. + * Hence the magnitude should always fit in 10 or 14 bits respectively. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MAX_COEF_BITS 10 +#else +#define MAX_COEF_BITS 14 +#endif + +/* Derived data constructed for each Huffman table */ + +typedef struct { + unsigned int ehufco[256]; /* code for each symbol */ + char ehufsi[256]; /* length of code for each symbol */ + /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ +} c_derived_tbl; /* Expanded entropy encoder object for Huffman encoding. @@ -65,15 +91,32 @@ typedef struct { c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; -#ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */ + /* Statistics tables for optimization */ long * dc_count_ptrs[NUM_HUFF_TBLS]; long * ac_count_ptrs[NUM_HUFF_TBLS]; -#endif + + /* Following fields used only in progressive mode */ + + /* Mode flag: TRUE for optimization, FALSE for actual data output */ + boolean gather_statistics; + + /* next_output_byte/free_in_buffer are local copies of cinfo->dest fields. + */ + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ + + /* Coding status for AC components */ + int ac_tbl_no; /* the table number of the single component */ + unsigned int EOBRUN; /* run length of EOBs */ + unsigned int BE; /* # of buffered correction bits before MCU */ + char * bit_buffer; /* buffer for correction bits (1 per char) */ + /* packing correction bits tightly would save some space but cost time... */ } huff_entropy_encoder; typedef huff_entropy_encoder * huff_entropy_ptr; -/* Working state while writing an MCU. +/* Working state while writing an MCU (sequential mode). * This struct contains all the fields that are needed by subroutines. */ @@ -84,98 +127,37 @@ typedef struct { j_compress_ptr cinfo; /* dump_buffer needs access to this */ } working_state; - -/* Forward declarations */ -METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo)); -#ifdef ENTROPY_OPT_SUPPORTED -METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo)); -#endif - - -/* - * Initialize for a Huffman-compressed scan. - * If gather_statistics is TRUE, we do not output anything during the scan, - * just count the Huffman symbols used and generate Huffman code tables. +/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit + * buffer can hold. Larger sizes may slightly improve compression, but + * 1000 is already well into the realm of overkill. + * The minimum safe size is 64 bits. */ -METHODDEF(void) -start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, dctbl, actbl; - jpeg_component_info * compptr; +#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ - if (gather_statistics) { -#ifdef ENTROPY_OPT_SUPPORTED - entropy->pub.encode_mcu = encode_mcu_gather; - entropy->pub.finish_pass = finish_pass_gather; +/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. + * We assume that int right shift is unsigned if INT32 right shift is, + * which should be safe. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS int ishift_temp; +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ + (ishift_temp >> (shft))) #else - ERREXIT(cinfo, JERR_NOT_COMPILED); +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) #endif - } else { - entropy->pub.encode_mcu = encode_mcu_huff; - entropy->pub.finish_pass = finish_pass_huff; - } - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - if (gather_statistics) { -#ifdef ENTROPY_OPT_SUPPORTED - /* Check for invalid table indexes */ - /* (make_c_derived_tbl does this in the other path) */ - if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl); - if (actbl < 0 || actbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl); - /* Allocate and zero the statistics tables */ - /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ - if (entropy->dc_count_ptrs[dctbl] == NULL) - entropy->dc_count_ptrs[dctbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long)); - if (entropy->ac_count_ptrs[actbl] == NULL) - entropy->ac_count_ptrs[actbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long)); -#endif - } else { - /* Compute derived values for Huffman tables */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl, - & entropy->dc_derived_tbls[dctbl]); - jpeg_make_c_derived_tbl(cinfo, FALSE, actbl, - & entropy->ac_derived_tbls[actbl]); - } - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Initialize bit buffer to empty */ - entropy->saved.put_buffer = 0; - entropy->saved.put_bits = 0; - - /* Initialize restart stuff */ - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num = 0; -} /* * Compute the derived values for a Huffman table. * This routine also performs some validation checks on the table. - * - * Note this is also used by jcphuff.c. */ -GLOBAL(void) +LOCAL(void) jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno, c_derived_tbl ** pdtbl) { @@ -264,18 +246,27 @@ jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno, } -/* Outputting bytes to the file */ +/* Outputting bytes to the file. + * NB: these must be called only when actually outputting, + * that is, entropy->gather_statistics == FALSE. + */ /* Emit a byte, taking 'action' if must suspend. */ -#define emit_byte(state,val,action) \ +#define emit_byte_s(state,val,action) \ { *(state)->next_output_byte++ = (JOCTET) (val); \ if (--(state)->free_in_buffer == 0) \ - if (! dump_buffer(state)) \ + if (! dump_buffer_s(state)) \ { action; } } +/* Emit a byte */ +#define emit_byte_e(entropy,val) \ + { *(entropy)->next_output_byte++ = (JOCTET) (val); \ + if (--(entropy)->free_in_buffer == 0) \ + dump_buffer_e(entropy); } + LOCAL(boolean) -dump_buffer (working_state * state) +dump_buffer_s (working_state * state) /* Empty the output buffer; return TRUE if successful, FALSE if must suspend */ { struct jpeg_destination_mgr * dest = state->cinfo->dest; @@ -289,6 +280,20 @@ dump_buffer (working_state * state) } +LOCAL(void) +dump_buffer_e (huff_entropy_ptr entropy) +/* Empty the output buffer; we do not support suspension in this case. */ +{ + struct jpeg_destination_mgr * dest = entropy->cinfo->dest; + + if (! (*dest->empty_output_buffer) (entropy->cinfo)) + ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); + /* After a successful buffer dump, must reset buffer pointers */ + entropy->next_output_byte = dest->next_output_byte; + entropy->free_in_buffer = dest->free_in_buffer; +} + + /* Outputting bits to the file */ /* Only the right 24 bits of put_buffer are used; the valid bits are @@ -299,7 +304,7 @@ dump_buffer (working_state * state) INLINE LOCAL(boolean) -emit_bits (working_state * state, unsigned int code, int size) +emit_bits_s (working_state * state, unsigned int code, int size) /* Emit some bits; return TRUE if successful, FALSE if must suspend */ { /* This routine is heavily used, so it's worth coding tightly. */ @@ -321,9 +326,9 @@ emit_bits (working_state * state, unsigned int code, int size) while (put_bits >= 8) { int c = (int) ((put_buffer >> 16) & 0xFF); - emit_byte(state, c, return FALSE); + emit_byte_s(state, c, return FALSE); if (c == 0xFF) { /* need to stuff a zero byte? */ - emit_byte(state, 0, return FALSE); + emit_byte_s(state, 0, return FALSE); } put_buffer <<= 8; put_bits -= 8; @@ -336,17 +341,575 @@ emit_bits (working_state * state, unsigned int code, int size) } -LOCAL(boolean) -flush_bits (working_state * state) +INLINE +LOCAL(void) +emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size) +/* Emit some bits, unless we are in gather mode */ { - if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = (INT32) code; + register int put_bits = entropy->saved.put_bits; + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + if (entropy->gather_statistics) + return; /* do nothing if we're only getting stats */ + + put_buffer &= (((INT32) 1)<saved.put_buffer; + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte_e(entropy, c); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte_e(entropy, 0); + } + put_buffer <<= 8; + put_bits -= 8; + } + + entropy->saved.put_buffer = put_buffer; /* update variables */ + entropy->saved.put_bits = put_bits; +} + + +LOCAL(boolean) +flush_bits_s (working_state * state) +{ + if (! emit_bits_s(state, 0x7F, 7)) /* fill any partial byte with ones */ return FALSE; - state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ + state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ state->cur.put_bits = 0; return TRUE; } +LOCAL(void) +flush_bits_e (huff_entropy_ptr entropy) +{ + emit_bits_e(entropy, 0x7F, 7); /* fill any partial byte with ones */ + entropy->saved.put_buffer = 0; /* and reset bit-buffer to empty */ + entropy->saved.put_bits = 0; +} + + +/* + * Emit (or just count) a Huffman symbol. + */ + +INLINE +LOCAL(void) +emit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->dc_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->dc_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +INLINE +LOCAL(void) +emit_ac_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->ac_count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->ac_derived_tbls[tbl_no]; + emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +/* + * Emit bits from a correction bit buffer. + */ + +LOCAL(void) +emit_buffered_bits (huff_entropy_ptr entropy, char * bufstart, + unsigned int nbits) +{ + if (entropy->gather_statistics) + return; /* no real work */ + + while (nbits > 0) { + emit_bits_e(entropy, (unsigned int) (*bufstart), 1); + bufstart++; + nbits--; + } +} + + +/* + * Emit any pending EOBRUN symbol. + */ + +LOCAL(void) +emit_eobrun (huff_entropy_ptr entropy) +{ + register int temp, nbits; + + if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ + temp = entropy->EOBRUN; + nbits = 0; + while ((temp >>= 1)) + nbits++; + /* safety check: shouldn't happen given limited correction-bit buffer */ + if (nbits > 14) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + emit_ac_symbol(entropy, entropy->ac_tbl_no, nbits << 4); + if (nbits) + emit_bits_e(entropy, entropy->EOBRUN, nbits); + + entropy->EOBRUN = 0; + + /* Emit any buffered correction bits */ + emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); + entropy->BE = 0; + } +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(boolean) +emit_restart_s (working_state * state, int restart_num) +{ + int ci; + + if (! flush_bits_s(state)) + return FALSE; + + emit_byte_s(state, 0xFF, return FALSE); + emit_byte_s(state, JPEG_RST0 + restart_num, return FALSE); + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < state->cinfo->comps_in_scan; ci++) + state->cur.last_dc_val[ci] = 0; + + /* The restart counter is not updated until we successfully write the MCU. */ + + return TRUE; +} + + +LOCAL(void) +emit_restart_e (huff_entropy_ptr entropy, int restart_num) +{ + int ci; + + emit_eobrun(entropy); + + if (! entropy->gather_statistics) { + flush_bits_e(entropy); + emit_byte_e(entropy, 0xFF); + emit_byte_e(entropy, JPEG_RST0 + restart_num); + } + + if (entropy->cinfo->Ss == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + } else { + /* Re-initialize all AC-related fields to 0 */ + entropy->EOBRUN = 0; + entropy->BE = 0; + } +} + + +/* + * MCU encoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + int blkn, ci; + int Al = cinfo->Al; + JBLOCKROW block; + jpeg_component_info * compptr; + ISHIFT_TEMPS + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); + + /* DC differences are figured on the point-transformed values. */ + temp = temp2 - entropy->saved.last_dc_val[ci]; + entropy->saved.last_dc_val[ci] = temp2; + + /* Encode the DC coefficient difference per section G.1.2.1 */ + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit the Huffman-coded symbol for the number of bits */ + emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ + emit_bits_e(entropy, (unsigned int) temp2, nbits); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + register int r, k; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ + + r = 0; /* r = run length of zeros */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = (*block)[natural_order[k]]) == 0) { + r++; + continue; + } + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value; so the code is + * interwoven with finding the abs value (temp) and output bits (temp2). + */ + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ + temp2 = ~temp; + } else { + temp >>= Al; /* apply the point transform */ + temp2 = temp; + } + /* Watch out for case that nonzero coef is zero after point transform */ + if (temp == 0) { + r++; + continue; + } + + /* Emit any pending EOBRUN */ + if (entropy->EOBRUN > 0) + emit_eobrun(entropy); + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + emit_bits_e(entropy, (unsigned int) temp2, nbits); + + r = 0; /* reset zero run length */ + } + + if (r > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + if (entropy->EOBRUN == 0x7FFF) + emit_eobrun(entropy); /* force it out to avoid overflow */ + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp; + int blkn; + int Al = cinfo->Al; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* We simply emit the Al'th bit of the DC coefficient value. */ + temp = (*block)[0]; + emit_bits_e(entropy, (unsigned int) (temp >> Al), 1); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int temp; + register int r, k; + int EOB; + char *BR_buffer; + unsigned int BR; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + int absvalues[DCTSIZE2]; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart_e(entropy, entropy->next_restart_num); + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* It is convenient to make a pre-pass to determine the transformed + * coefficients' absolute values and the EOB position. + */ + EOB = 0; + for (k = cinfo->Ss; k <= Se; k++) { + temp = (*block)[natural_order[k]]; + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if (temp < 0) + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + absvalues[k] = temp; /* save abs value for main pass */ + if (temp == 1) + EOB = k; /* EOB = index of last newly-nonzero coef */ + } + + /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ + + r = 0; /* r = run length of zeros */ + BR = 0; /* BR = count of buffered bits added now */ + BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = absvalues[k]) == 0) { + r++; + continue; + } + + /* Emit any required ZRLs, but not if they can be folded into EOB */ + while (r > 15 && k <= EOB) { + /* emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + /* Emit ZRL */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + /* Emit buffered correction bits that must be associated with ZRL */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + } + + /* If the coef was previously nonzero, it only needs a correction bit. + * NOTE: a straight translation of the spec's figure G.7 would suggest + * that we also need to test r > 15. But if r > 15, we can only get here + * if k > EOB, which implies that this coefficient is not 1. + */ + if (temp > 1) { + /* The correction bit is the next bit of the absolute value. */ + BR_buffer[BR++] = (char) (temp & 1); + continue; + } + + /* Emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); + + /* Emit output bit for newly-nonzero coef */ + temp = ((*block)[natural_order[k]] < 0) ? 0 : 1; + emit_bits_e(entropy, (unsigned int) temp, 1); + + /* Emit buffered correction bits that must be associated with this code */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + r = 0; /* reset zero run length */ + } + + if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + entropy->BE += BR; /* concat my correction bits to older ones */ + /* We force out the EOB if we risk either: + * 1. overflow of the EOB counter; + * 2. overflow of the correction bit buffer during the next MCU. + */ + if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) + emit_eobrun(entropy); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + /* Encode a single block's worth of coefficients */ LOCAL(boolean) @@ -356,9 +919,11 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, register int temp, temp2; register int nbits; register int k, r, i; - + int Se = state->cinfo->lim_Se; + const int * natural_order = state->cinfo->natural_order; + /* Encode the DC coefficient difference per section F.1.2.1 */ - + temp = temp2 = block[0] - last_dc_val; if (temp < 0) { @@ -367,7 +932,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, /* This code assumes we are on a two's complement machine */ temp2--; } - + /* Find the number of bits needed for the magnitude of the coefficient */ nbits = 0; while (temp) { @@ -379,28 +944,28 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, */ if (nbits > MAX_COEF_BITS+1) ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); - + /* Emit the Huffman-coded symbol for the number of bits */ - if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) + if (! emit_bits_s(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) return FALSE; /* Emit that number of bits of the value, if positive, */ /* or the complement of its magnitude, if negative. */ if (nbits) /* emit_bits rejects calls with size 0 */ - if (! emit_bits(state, (unsigned int) temp2, nbits)) + if (! emit_bits_s(state, (unsigned int) temp2, nbits)) return FALSE; /* Encode the AC coefficients per section F.1.2.2 */ - + r = 0; /* r = run length of zeros */ - - for (k = 1; k < DCTSIZE2; k++) { - if ((temp = block[jpeg_natural_order[k]]) == 0) { + + for (k = 1; k <= Se; k++) { + if ((temp = block[natural_order[k]]) == 0) { r++; } else { /* if run length > 15, must emit special run-length-16 codes (0xF0) */ while (r > 15) { - if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) + if (! emit_bits_s(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) return FALSE; r -= 16; } @@ -411,7 +976,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, /* This code assumes we are on a two's complement machine */ temp2--; } - + /* Find the number of bits needed for the magnitude of the coefficient */ nbits = 1; /* there must be at least one 1 bit */ while ((temp >>= 1)) @@ -419,55 +984,30 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, /* Check for out-of-range coefficient values */ if (nbits > MAX_COEF_BITS) ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); - + /* Emit Huffman symbol for run length / number of bits */ i = (r << 4) + nbits; - if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i])) + if (! emit_bits_s(state, actbl->ehufco[i], actbl->ehufsi[i])) return FALSE; /* Emit that number of bits of the value, if positive, */ /* or the complement of its magnitude, if negative. */ - if (! emit_bits(state, (unsigned int) temp2, nbits)) + if (! emit_bits_s(state, (unsigned int) temp2, nbits)) return FALSE; - + r = 0; } } /* If the last coef(s) were zero, emit an end-of-block code */ if (r > 0) - if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0])) + if (! emit_bits_s(state, actbl->ehufco[0], actbl->ehufsi[0])) return FALSE; return TRUE; } -/* - * Emit a restart marker & resynchronize predictions. - */ - -LOCAL(boolean) -emit_restart (working_state * state, int restart_num) -{ - int ci; - - if (! flush_bits(state)) - return FALSE; - - emit_byte(state, 0xFF, return FALSE); - emit_byte(state, JPEG_RST0 + restart_num, return FALSE); - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < state->cinfo->comps_in_scan; ci++) - state->cur.last_dc_val[ci] = 0; - - /* The restart counter is not updated until we successfully write the MCU. */ - - return TRUE; -} - - /* * Encode and output one MCU's worth of Huffman-compressed coefficients. */ @@ -489,7 +1029,7 @@ encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data) /* Emit restart marker if needed */ if (cinfo->restart_interval) { if (entropy->restarts_to_go == 0) - if (! emit_restart(&state, entropy->next_restart_num)) + if (! emit_restart_s(&state, entropy->next_restart_num)) return FALSE; } @@ -535,20 +1075,32 @@ finish_pass_huff (j_compress_ptr cinfo) huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; working_state state; - /* Load up working state ... flush_bits needs it */ - state.next_output_byte = cinfo->dest->next_output_byte; - state.free_in_buffer = cinfo->dest->free_in_buffer; - ASSIGN_STATE(state.cur, entropy->saved); - state.cinfo = cinfo; + if (cinfo->progressive_mode) { + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; - /* Flush out the last data */ - if (! flush_bits(&state)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); + /* Flush out any buffered data */ + emit_eobrun(entropy); + flush_bits_e(entropy); - /* Update state */ - cinfo->dest->next_output_byte = state.next_output_byte; - cinfo->dest->free_in_buffer = state.free_in_buffer; - ASSIGN_STATE(entropy->saved, state.cur); + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + } else { + /* Load up working state ... flush_bits needs it */ + state.next_output_byte = cinfo->dest->next_output_byte; + state.free_in_buffer = cinfo->dest->free_in_buffer; + ASSIGN_STATE(state.cur, entropy->saved); + state.cinfo = cinfo; + + /* Flush out the last data */ + if (! flush_bits_s(&state)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Update state */ + cinfo->dest->next_output_byte = state.next_output_byte; + cinfo->dest->free_in_buffer = state.free_in_buffer; + ASSIGN_STATE(entropy->saved, state.cur); + } } @@ -563,8 +1115,6 @@ finish_pass_huff (j_compress_ptr cinfo) * the compressed data. */ -#ifdef ENTROPY_OPT_SUPPORTED - /* Process a single block's worth of coefficients */ @@ -575,6 +1125,8 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, register int temp; register int nbits; register int k, r; + int Se = cinfo->lim_Se; + const int * natural_order = cinfo->natural_order; /* Encode the DC coefficient difference per section F.1.2.1 */ @@ -601,8 +1153,8 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, r = 0; /* r = run length of zeros */ - for (k = 1; k < DCTSIZE2; k++) { - if ((temp = block[jpeg_natural_order[k]]) == 0) { + for (k = 1; k <= Se; k++) { + if ((temp = block[natural_order[k]]) == 0) { r++; } else { /* if run length > 15, must emit special run-length-16 codes (0xF0) */ @@ -675,7 +1227,6 @@ encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) /* * Generate the best Huffman code table for the given counts, fill htbl. - * Note this is also used by jcphuff.c. * * The JPEG standard requires that no symbol be assigned a codeword of all * one bits (so that padding bits added at the end of a compressed segment @@ -701,7 +1252,7 @@ encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) * So the extra complexity of an optimal algorithm doesn't seem worthwhile. */ -GLOBAL(void) +LOCAL(void) jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]) { #define MAX_CLEN 32 /* assumed maximum initial code length */ @@ -846,7 +1397,7 @@ METHODDEF(void) finish_pass_gather (j_compress_ptr cinfo) { huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, dctbl, actbl; + int ci, tbl; jpeg_component_info * compptr; JHUFF_TBL **htblptr; boolean did_dc[NUM_HUFF_TBLS]; @@ -855,32 +1406,147 @@ finish_pass_gather (j_compress_ptr cinfo) /* It's important not to apply jpeg_gen_optimal_table more than once * per table, because it clobbers the input frequency counts! */ + if (cinfo->progressive_mode) + /* Flush out buffered data (all we care about is counting the EOB symbol) */ + emit_eobrun(entropy); + MEMZERO(did_dc, SIZEOF(did_dc)); MEMZERO(did_ac, SIZEOF(did_ac)); for (ci = 0; ci < cinfo->comps_in_scan; ci++) { compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - if (! did_dc[dctbl]) { - htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]); - did_dc[dctbl] = TRUE; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (! did_dc[tbl]) { + htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[tbl]); + did_dc[tbl] = TRUE; + } } - if (! did_ac[actbl]) { - htblptr = & cinfo->ac_huff_tbl_ptrs[actbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]); - did_ac[actbl] = TRUE; + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (! did_ac[tbl]) { + htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[tbl]); + did_ac[tbl] = TRUE; + } } } } -#endif /* ENTROPY_OPT_SUPPORTED */ +/* + * Initialize for a Huffman-compressed scan. + * If gather_statistics is TRUE, we do not output anything during the scan, + * just count the Huffman symbols used and generate Huffman code tables. + */ + +METHODDEF(void) +start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (gather_statistics) + entropy->pub.finish_pass = finish_pass_gather; + else + entropy->pub.finish_pass = finish_pass_huff; + + if (cinfo->progressive_mode) { + entropy->cinfo = cinfo; + entropy->gather_statistics = gather_statistics; + + /* We assume jcmaster.c already validated the scan parameters. */ + + /* Select execution routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else { + entropy->pub.encode_mcu = encode_mcu_AC_refine; + /* AC refinement needs a correction bit buffer */ + if (entropy->bit_buffer == NULL) + entropy->bit_buffer = (char *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + MAX_CORR_BITS * SIZEOF(char)); + } + } + + /* Initialize AC stuff */ + entropy->ac_tbl_no = cinfo->cur_comp_info[0]->ac_tbl_no; + entropy->EOBRUN = 0; + entropy->BE = 0; + } else { + if (gather_statistics) + entropy->pub.encode_mcu = encode_mcu_gather; + else + entropy->pub.encode_mcu = encode_mcu_huff; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) { + tbl = compptr->dc_tbl_no; + if (gather_statistics) { + /* Check for invalid table index */ + /* (make_c_derived_tbl does this in the other path) */ + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + /* Allocate and zero the statistics tables */ + /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ + if (entropy->dc_count_ptrs[tbl] == NULL) + entropy->dc_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + jpeg_make_c_derived_tbl(cinfo, TRUE, tbl, + & entropy->dc_derived_tbls[tbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + /* AC needs no table when not present */ + if (cinfo->Se) { + tbl = compptr->ac_tbl_no; + if (gather_statistics) { + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + if (entropy->ac_count_ptrs[tbl] == NULL) + entropy->ac_count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + jpeg_make_c_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + } + } + + /* Initialize bit buffer to empty */ + entropy->saved.put_buffer = 0; + entropy->saved.put_bits = 0; + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} /* @@ -902,8 +1568,9 @@ jinit_huff_encoder (j_compress_ptr cinfo) /* Mark tables unallocated */ for (i = 0; i < NUM_HUFF_TBLS; i++) { entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; -#ifdef ENTROPY_OPT_SUPPORTED entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; -#endif } + + if (cinfo->progressive_mode) + entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ } diff --git a/3rdparty/libjpeg/jchuff.h b/3rdparty/libjpeg/jchuff.h deleted file mode 100644 index a9599fc1e..000000000 --- a/3rdparty/libjpeg/jchuff.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * jchuff.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy encoding routines - * that are shared between the sequential encoder (jchuff.c) and the - * progressive encoder (jcphuff.c). No other modules need to see these. - */ - -/* The legal range of a DCT coefficient is - * -1024 .. +1023 for 8-bit data; - * -16384 .. +16383 for 12-bit data. - * Hence the magnitude should always fit in 10 or 14 bits respectively. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MAX_COEF_BITS 10 -#else -#define MAX_COEF_BITS 14 -#endif - -/* Derived data constructed for each Huffman table */ - -typedef struct { - unsigned int ehufco[256]; /* code for each symbol */ - char ehufsi[256]; /* length of code for each symbol */ - /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ -} c_derived_tbl; - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_c_derived_tbl jMkCDerived -#define jpeg_gen_optimal_table jGenOptTbl -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Expand a Huffman table definition into the derived format */ -EXTERN(void) jpeg_make_c_derived_tbl - JPP((j_compress_ptr cinfo, boolean isDC, int tblno, - c_derived_tbl ** pdtbl)); - -/* Generate an optimal table definition given the specified counts */ -EXTERN(void) jpeg_gen_optimal_table - JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])); diff --git a/3rdparty/libjpeg/jcinit.c b/3rdparty/libjpeg/jcinit.c index 5efffe331..0ba310f21 100644 --- a/3rdparty/libjpeg/jcinit.c +++ b/3rdparty/libjpeg/jcinit.c @@ -41,17 +41,10 @@ jinit_compress_master (j_compress_ptr cinfo) /* Forward DCT */ jinit_forward_dct(cinfo); /* Entropy encoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - jinit_phuff_encoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_encoder(cinfo); + if (cinfo->arith_code) + jinit_arith_encoder(cinfo); + else { + jinit_huff_encoder(cinfo); } /* Need a full-image coefficient buffer in any multi-pass mode. */ diff --git a/3rdparty/libjpeg/jcmainct.c b/3rdparty/libjpeg/jcmainct.c index 96b96cf08..7de75d167 100644 --- a/3rdparty/libjpeg/jcmainct.c +++ b/3rdparty/libjpeg/jcmainct.c @@ -5,8 +5,8 @@ * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * - * This file contains the main_ptr buffer controller for compression. - * The main_ptr buffer lies between the pre-processor and the JPEG + * This file contains the main buffer controller for compression. + * The main buffer lies between the pre-processor and the JPEG * compressor proper; it holds downsampled data in the JPEG colorspace. */ @@ -68,32 +68,32 @@ METHODDEF(void) process_data_buffer_main METHODDEF(void) start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; /* Do nothing in raw-data mode. */ if (cinfo->raw_data_in) return; - main_ptr->cur_iMCU_row = 0; /* initialize counters */ - main_ptr->rowgroup_ctr = 0; - main_ptr->suspended = FALSE; - main_ptr->pass_mode = pass_mode; /* save mode for use by process_data */ + main->cur_iMCU_row = 0; /* initialize counters */ + main->rowgroup_ctr = 0; + main->suspended = FALSE; + main->pass_mode = pass_mode; /* save mode for use by process_data */ switch (pass_mode) { case JBUF_PASS_THRU: #ifdef FULL_MAIN_BUFFER_SUPPORTED - if (main_ptr->whole_image[0] != NULL) + if (main->whole_image[0] != NULL) ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); #endif - main_ptr->pub.process_data = process_data_simple_main; + main->pub.process_data = process_data_simple_main; break; #ifdef FULL_MAIN_BUFFER_SUPPORTED case JBUF_SAVE_SOURCE: case JBUF_CRANK_DEST: case JBUF_SAVE_AND_PASS: - if (main_ptr->whole_image[0] == NULL) + if (main->whole_image[0] == NULL) ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - main_ptr->pub.process_data = process_data_buffer_main; + main->pub.process_data = process_data_buffer_main; break; #endif default: @@ -114,46 +114,46 @@ process_data_simple_main (j_compress_ptr cinfo, JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail) { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; - while (main_ptr->cur_iMCU_row < cinfo->total_iMCU_rows) { - /* Read input data if we haven't filled the main_ptr buffer yet */ - if (main_ptr->rowgroup_ctr < DCTSIZE) + while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { + /* Read input data if we haven't filled the main buffer yet */ + if (main->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size) (*cinfo->prep->pre_process_data) (cinfo, input_buf, in_row_ctr, in_rows_avail, - main_ptr->buffer, &main_ptr->rowgroup_ctr, - (JDIMENSION) DCTSIZE); + main->buffer, &main->rowgroup_ctr, + (JDIMENSION) cinfo->min_DCT_v_scaled_size); /* If we don't have a full iMCU row buffered, return to application for * more data. Note that preprocessor will always pad to fill the iMCU row * at the bottom of the image. */ - if (main_ptr->rowgroup_ctr != DCTSIZE) + if (main->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size) return; /* Send the completed row to the compressor */ - if (! (*cinfo->coef->compress_data) (cinfo, main_ptr->buffer)) { + if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { /* If compressor did not consume the whole row, then we must need to * suspend processing and return to the application. In this situation * we pretend we didn't yet consume the last input row; otherwise, if * it happened to be the last row of the image, the application would * think we were done. */ - if (! main_ptr->suspended) { + if (! main->suspended) { (*in_row_ctr)--; - main_ptr->suspended = TRUE; + main->suspended = TRUE; } return; } /* We did finish the row. Undo our little suspension hack if a previous - * call suspended; then mark the main_ptr buffer empty. + * call suspended; then mark the main buffer empty. */ - if (main_ptr->suspended) { + if (main->suspended) { (*in_row_ctr)++; - main_ptr->suspended = FALSE; + main->suspended = FALSE; } - main_ptr->rowgroup_ctr = 0; - main_ptr->cur_iMCU_row++; + main->rowgroup_ctr = 0; + main->cur_iMCU_row++; } } @@ -170,25 +170,25 @@ process_data_buffer_main (j_compress_ptr cinfo, JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail) { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; int ci; jpeg_component_info *compptr; - boolean writing = (main_ptr->pass_mode != JBUF_CRANK_DEST); + boolean writing = (main->pass_mode != JBUF_CRANK_DEST); - while (main_ptr->cur_iMCU_row < cinfo->total_iMCU_rows) { + while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { /* Realign the virtual buffers if at the start of an iMCU row. */ - if (main_ptr->rowgroup_ctr == 0) { + if (main->rowgroup_ctr == 0) { for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - main_ptr->buffer[ci] = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, main_ptr->whole_image[ci], - main_ptr->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), + main->buffer[ci] = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, main->whole_image[ci], + main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing); } /* In a read pass, pretend we just read some source data. */ if (! writing) { *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE; - main_ptr->rowgroup_ctr = DCTSIZE; + main->rowgroup_ctr = DCTSIZE; } } @@ -197,40 +197,40 @@ process_data_buffer_main (j_compress_ptr cinfo, if (writing) { (*cinfo->prep->pre_process_data) (cinfo, input_buf, in_row_ctr, in_rows_avail, - main_ptr->buffer, &main_ptr->rowgroup_ctr, + main->buffer, &main->rowgroup_ctr, (JDIMENSION) DCTSIZE); /* Return to application if we need more data to fill the iMCU row. */ - if (main_ptr->rowgroup_ctr < DCTSIZE) + if (main->rowgroup_ctr < DCTSIZE) return; } /* Emit data, unless this is a sink-only pass. */ - if (main_ptr->pass_mode != JBUF_SAVE_SOURCE) { - if (! (*cinfo->coef->compress_data) (cinfo, main_ptr->buffer)) { + if (main->pass_mode != JBUF_SAVE_SOURCE) { + if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { /* If compressor did not consume the whole row, then we must need to * suspend processing and return to the application. In this situation * we pretend we didn't yet consume the last input row; otherwise, if * it happened to be the last row of the image, the application would * think we were done. */ - if (! main_ptr->suspended) { + if (! main->suspended) { (*in_row_ctr)--; - main_ptr->suspended = TRUE; + main->suspended = TRUE; } return; } /* We did finish the row. Undo our little suspension hack if a previous - * call suspended; then mark the main_ptr buffer empty. + * call suspended; then mark the main buffer empty. */ - if (main_ptr->suspended) { + if (main->suspended) { (*in_row_ctr)++; - main_ptr->suspended = FALSE; + main->suspended = FALSE; } } /* If get here, we are done with this iMCU row. Mark buffer empty. */ - main_ptr->rowgroup_ctr = 0; - main_ptr->cur_iMCU_row++; + main->rowgroup_ctr = 0; + main->cur_iMCU_row++; } } @@ -238,21 +238,21 @@ process_data_buffer_main (j_compress_ptr cinfo, /* - * Initialize main_ptr buffer controller. + * Initialize main buffer controller. */ GLOBAL(void) jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) { - my_main_ptr main_ptr; + my_main_ptr main; int ci; jpeg_component_info *compptr; - main_ptr = (my_main_ptr) + main = (my_main_ptr) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_main_controller)); - cinfo->main = (struct jpeg_c_main_controller *) main_ptr; - main_ptr->pub.start_pass = start_pass_main; + cinfo->main = (struct jpeg_c_main_controller *) main; + main->pub.start_pass = start_pass_main; /* We don't need to create a buffer in raw-data mode. */ if (cinfo->raw_data_in) @@ -267,27 +267,27 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) /* Note we pad the bottom to a multiple of the iMCU height */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - main_ptr->whole_image[ci] = (*cinfo->mem->request_virt_sarray) + main->whole_image[ci] = (*cinfo->mem->request_virt_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - compptr->width_in_blocks * DCTSIZE, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, (JDIMENSION) jround_up((long) compptr->height_in_blocks, (long) compptr->v_samp_factor) * DCTSIZE, - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); } #else ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); #endif } else { #ifdef FULL_MAIN_BUFFER_SUPPORTED - main_ptr->whole_image[0] = NULL; /* flag for no virtual arrays */ + main->whole_image[0] = NULL; /* flag for no virtual arrays */ #endif /* Allocate a strip buffer for each component */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - main_ptr->buffer[ci] = (*cinfo->mem->alloc_sarray) + main->buffer[ci] = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, - compptr->width_in_blocks * DCTSIZE, - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); } } } diff --git a/3rdparty/libjpeg/jcmarker.c b/3rdparty/libjpeg/jcmarker.c index 3d1e6c6d5..606c19af3 100644 --- a/3rdparty/libjpeg/jcmarker.c +++ b/3rdparty/libjpeg/jcmarker.c @@ -2,6 +2,7 @@ * jcmarker.c * * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2010 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -153,21 +154,22 @@ emit_dqt (j_compress_ptr cinfo, int index) ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index); prec = 0; - for (i = 0; i < DCTSIZE2; i++) { - if (qtbl->quantval[i] > 255) + for (i = 0; i <= cinfo->lim_Se; i++) { + if (qtbl->quantval[cinfo->natural_order[i]] > 255) prec = 1; } if (! qtbl->sent_table) { emit_marker(cinfo, M_DQT); - emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2); + emit_2bytes(cinfo, + prec ? cinfo->lim_Se * 2 + 2 + 1 + 2 : cinfo->lim_Se + 1 + 1 + 2); emit_byte(cinfo, index + (prec<<4)); - for (i = 0; i < DCTSIZE2; i++) { + for (i = 0; i <= cinfo->lim_Se; i++) { /* The table entries must be emitted in zigzag order. */ - unsigned int qval = qtbl->quantval[jpeg_natural_order[i]]; + unsigned int qval = qtbl->quantval[cinfo->natural_order[i]]; if (prec) emit_byte(cinfo, (int) (qval >> 8)); emit_byte(cinfo, (int) (qval & 0xFF)); @@ -229,32 +231,38 @@ emit_dac (j_compress_ptr cinfo) char ac_in_use[NUM_ARITH_TBLS]; int length, i; jpeg_component_info *compptr; - + for (i = 0; i < NUM_ARITH_TBLS; i++) dc_in_use[i] = ac_in_use[i] = 0; - + for (i = 0; i < cinfo->comps_in_scan; i++) { compptr = cinfo->cur_comp_info[i]; - dc_in_use[compptr->dc_tbl_no] = 1; - ac_in_use[compptr->ac_tbl_no] = 1; + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) + dc_in_use[compptr->dc_tbl_no] = 1; + /* AC needs no table when not present */ + if (cinfo->Se) + ac_in_use[compptr->ac_tbl_no] = 1; } - + length = 0; for (i = 0; i < NUM_ARITH_TBLS; i++) length += dc_in_use[i] + ac_in_use[i]; - - emit_marker(cinfo, M_DAC); - - emit_2bytes(cinfo, length*2 + 2); - - for (i = 0; i < NUM_ARITH_TBLS; i++) { - if (dc_in_use[i]) { - emit_byte(cinfo, i); - emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); - } - if (ac_in_use[i]) { - emit_byte(cinfo, i + 0x10); - emit_byte(cinfo, cinfo->arith_ac_K[i]); + + if (length) { + emit_marker(cinfo, M_DAC); + + emit_2bytes(cinfo, length*2 + 2); + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + if (dc_in_use[i]) { + emit_byte(cinfo, i); + emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); + } + if (ac_in_use[i]) { + emit_byte(cinfo, i + 0x10); + emit_byte(cinfo, cinfo->arith_ac_K[i]); + } } } #endif /* C_ARITH_CODING_SUPPORTED */ @@ -285,13 +293,13 @@ emit_sof (j_compress_ptr cinfo, JPEG_MARKER code) emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */ /* Make sure image isn't bigger than SOF field can handle */ - if ((long) cinfo->image_height > 65535L || - (long) cinfo->image_width > 65535L) + if ((long) cinfo->jpeg_height > 65535L || + (long) cinfo->jpeg_width > 65535L) ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535); emit_byte(cinfo, cinfo->data_precision); - emit_2bytes(cinfo, (int) cinfo->image_height); - emit_2bytes(cinfo, (int) cinfo->image_width); + emit_2bytes(cinfo, (int) cinfo->jpeg_height); + emit_2bytes(cinfo, (int) cinfo->jpeg_width); emit_byte(cinfo, cinfo->num_components); @@ -320,22 +328,16 @@ emit_sos (j_compress_ptr cinfo) for (i = 0; i < cinfo->comps_in_scan; i++) { compptr = cinfo->cur_comp_info[i]; emit_byte(cinfo, compptr->component_id); - td = compptr->dc_tbl_no; - ta = compptr->ac_tbl_no; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan; - * furthermore, Huffman coding of DC refinement uses no table at all. - * We emit 0 for unused field(s); this is recommended by the P&M text - * but does not seem to be specified in the standard. - */ - if (cinfo->Ss == 0) { - ta = 0; /* DC scan */ - if (cinfo->Ah != 0 && !cinfo->arith_code) - td = 0; /* no DC table either */ - } else { - td = 0; /* AC scan */ - } - } + + /* We emit 0 for unused field(s); this is recommended by the P&M text + * but does not seem to be specified in the standard. + */ + + /* DC needs no table for refinement scan */ + td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0; + /* AC needs no table when not present */ + ta = cinfo->Se ? compptr->ac_tbl_no : 0; + emit_byte(cinfo, (td << 4) + ta); } @@ -345,6 +347,22 @@ emit_sos (j_compress_ptr cinfo) } +LOCAL(void) +emit_pseudo_sos (j_compress_ptr cinfo) +/* Emit a pseudo SOS marker */ +{ + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 + 1 + 3); /* length */ + + emit_byte(cinfo, 0); /* Ns */ + + emit_byte(cinfo, 0); /* Ss */ + emit_byte(cinfo, cinfo->block_size * cinfo->block_size - 1); /* Se */ + emit_byte(cinfo, 0); /* Ah/Al */ +} + + LOCAL(void) emit_jfif_app0 (j_compress_ptr cinfo) /* Emit a JFIF-compliant APP0 marker */ @@ -484,7 +502,7 @@ write_file_header (j_compress_ptr cinfo) /* * Write frame header. - * This consists of DQT and SOFn markers. + * This consists of DQT and SOFn markers, and a conditional pseudo SOS marker. * Note that we do not emit the SOF until we have emitted the DQT(s). * This avoids compatibility problems with incorrect implementations that * try to error-check the quant table numbers as soon as they see the SOF. @@ -511,7 +529,7 @@ write_frame_header (j_compress_ptr cinfo) * Note we assume that Huffman table numbers won't be changed later. */ if (cinfo->arith_code || cinfo->progressive_mode || - cinfo->data_precision != 8) { + cinfo->data_precision != 8 || cinfo->block_size != DCTSIZE) { is_baseline = FALSE; } else { is_baseline = TRUE; @@ -529,7 +547,10 @@ write_frame_header (j_compress_ptr cinfo) /* Emit the proper SOF marker */ if (cinfo->arith_code) { - emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */ + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */ + else + emit_sof(cinfo, M_SOF9); /* SOF code for sequential arithmetic */ } else { if (cinfo->progressive_mode) emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */ @@ -538,6 +559,10 @@ write_frame_header (j_compress_ptr cinfo) else emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ } + + /* Check to emit pseudo SOS marker */ + if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE) + emit_pseudo_sos(cinfo); } @@ -566,19 +591,12 @@ write_scan_header (j_compress_ptr cinfo) */ for (i = 0; i < cinfo->comps_in_scan; i++) { compptr = cinfo->cur_comp_info[i]; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan */ - if (cinfo->Ss == 0) { - if (cinfo->Ah == 0) /* DC needs no table for refinement scan */ - emit_dht(cinfo, compptr->dc_tbl_no, FALSE); - } else { - emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } - } else { - /* Sequential mode: need both DC and AC tables */ + /* DC needs no table for refinement scan */ + if (cinfo->Ss == 0 && cinfo->Ah == 0) emit_dht(cinfo, compptr->dc_tbl_no, FALSE); + /* AC needs no table when not present */ + if (cinfo->Se) emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } } } diff --git a/3rdparty/libjpeg/jcmaster.c b/3rdparty/libjpeg/jcmaster.c index aab4020b8..caf80a53b 100644 --- a/3rdparty/libjpeg/jcmaster.c +++ b/3rdparty/libjpeg/jcmaster.c @@ -2,6 +2,7 @@ * jcmaster.c * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2003-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -42,23 +43,220 @@ typedef my_comp_master * my_master_ptr; * Support routines that do various essential calculations. */ -LOCAL(void) -initial_setup (j_compress_ptr cinfo) +/* + * Compute JPEG image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + */ + +GLOBAL(void) +jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo) /* Do computations that are needed before master selection phase */ { - int ci; +#ifdef DCT_SCALING_SUPPORTED + + /* Sanity check on input image dimensions to prevent overflow in + * following calculation. + * We do check jpeg_width and jpeg_height in initial_setup below, + * but image_width and image_height can come from arbitrary data, + * and we need some space for multiplication by block_size. + */ + if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24)) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* Compute actual JPEG image dimensions and DCT scaling choices. */ + if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/1 scaling */ + cinfo->jpeg_width = cinfo->image_width * cinfo->block_size; + cinfo->jpeg_height = cinfo->image_height * cinfo->block_size; + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/2 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/3 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/4 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/5 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/6 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/7 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/8 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/9 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/10 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/11 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/12 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/13 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/14 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) { + /* Provide block_size/15 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide block_size/16 scaling */ + cinfo->jpeg_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L); + cinfo->jpeg_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + +#else /* !DCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->jpeg_width = cinfo->image_width; + cinfo->jpeg_height = cinfo->image_height; + cinfo->min_DCT_h_scaled_size = DCTSIZE; + cinfo->min_DCT_v_scaled_size = DCTSIZE; + +#endif /* DCT_SCALING_SUPPORTED */ +} + + +LOCAL(void) +jpeg_calc_trans_dimensions (j_compress_ptr cinfo) +{ + if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size); + + cinfo->block_size = cinfo->min_DCT_h_scaled_size; +} + + +LOCAL(void) +initial_setup (j_compress_ptr cinfo, boolean transcode_only) +/* Do computations that are needed before master selection phase */ +{ + int ci, ssize; jpeg_component_info *compptr; long samplesperrow; JDIMENSION jd_samplesperrow; + if (transcode_only) + jpeg_calc_trans_dimensions(cinfo); + else + jpeg_calc_jpeg_dimensions(cinfo); + + /* Sanity check on block_size */ + if (cinfo->block_size < 1 || cinfo->block_size > 16) + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size); + + /* Derive natural_order from block_size */ + switch (cinfo->block_size) { + case 2: cinfo->natural_order = jpeg_natural_order2; break; + case 3: cinfo->natural_order = jpeg_natural_order3; break; + case 4: cinfo->natural_order = jpeg_natural_order4; break; + case 5: cinfo->natural_order = jpeg_natural_order5; break; + case 6: cinfo->natural_order = jpeg_natural_order6; break; + case 7: cinfo->natural_order = jpeg_natural_order7; break; + default: cinfo->natural_order = jpeg_natural_order; break; + } + + /* Derive lim_Se from block_size */ + cinfo->lim_Se = cinfo->block_size < DCTSIZE ? + cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1; + /* Sanity check on image dimensions */ - if (cinfo->image_height <= 0 || cinfo->image_width <= 0 - || cinfo->num_components <= 0 || cinfo->input_components <= 0) + if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 || + cinfo->num_components <= 0 || cinfo->input_components <= 0) ERREXIT(cinfo, JERR_EMPTY_IMAGE); /* Make sure image isn't bigger than I can handle */ - if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || - (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) + if ((long) cinfo->jpeg_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION) ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); /* Width of an input scanline must be representable as JDIMENSION. */ @@ -95,22 +293,52 @@ initial_setup (j_compress_ptr cinfo) ci++, compptr++) { /* Fill in the correct component_index value; don't rely on application */ compptr->component_index = ci; - /* For compression, we never do DCT scaling. */ - compptr->DCT_scaled_size = DCTSIZE; + /* In selecting the actual DCT scaling for each component, we try to + * scale down the chroma components via DCT scaling rather than downsampling. + * This saves time if the downsampler gets to use 1:1 scaling. + * Note this code adapts subsampling ratios which are powers of 2. + */ + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; +#ifdef DCT_SCALING_SUPPORTED + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } +#endif + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support DCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; + /* Size in DCT blocks */ compptr->width_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) (cinfo->max_h_samp_factor * DCTSIZE)); + jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); compptr->height_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) (cinfo->max_v_samp_factor * DCTSIZE)); + jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); /* Size in samples */ compptr->downsampled_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) cinfo->max_h_samp_factor); + jdiv_round_up((long) cinfo->jpeg_width * + (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); compptr->downsampled_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) cinfo->max_v_samp_factor); + jdiv_round_up((long) cinfo->jpeg_height * + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); /* Mark component needed (this flag isn't actually used for compression) */ compptr->component_needed = TRUE; } @@ -119,8 +347,8 @@ initial_setup (j_compress_ptr cinfo) * main controller will call coefficient controller). */ cinfo->total_iMCU_rows = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); + jdiv_round_up((long) cinfo->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); } @@ -260,6 +488,39 @@ validate_script (j_compress_ptr cinfo) } } + +LOCAL(void) +reduce_script (j_compress_ptr cinfo) +/* Adapt scan script for use with reduced block size; + * assume that script has been validated before. + */ +{ + jpeg_scan_info * scanptr; + int idxout, idxin; + + /* Circumvent const declaration for this function */ + scanptr = (jpeg_scan_info *) cinfo->scan_info; + idxout = 0; + + for (idxin = 0; idxin < cinfo->num_scans; idxin++) { + /* After skipping, idxout becomes smaller than idxin */ + if (idxin != idxout) + /* Copy rest of data; + * note we stay in given chunk of allocated memory. + */ + scanptr[idxout] = scanptr[idxin]; + if (scanptr[idxout].Ss > cinfo->lim_Se) + /* Entire scan out of range - skip this entry */ + continue; + if (scanptr[idxout].Se > cinfo->lim_Se) + /* Limit scan to end of block */ + scanptr[idxout].Se = cinfo->lim_Se; + idxout++; + } + + cinfo->num_scans = idxout; +} + #endif /* C_MULTISCAN_FILES_SUPPORTED */ @@ -280,10 +541,13 @@ select_scan_parameters (j_compress_ptr cinfo) cinfo->cur_comp_info[ci] = &cinfo->comp_info[scanptr->component_index[ci]]; } - cinfo->Ss = scanptr->Ss; - cinfo->Se = scanptr->Se; - cinfo->Ah = scanptr->Ah; - cinfo->Al = scanptr->Al; + if (cinfo->progressive_mode) { + cinfo->Ss = scanptr->Ss; + cinfo->Se = scanptr->Se; + cinfo->Ah = scanptr->Ah; + cinfo->Al = scanptr->Al; + return; + } } else #endif @@ -296,11 +560,11 @@ select_scan_parameters (j_compress_ptr cinfo) for (ci = 0; ci < cinfo->num_components; ci++) { cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; } - cinfo->Ss = 0; - cinfo->Se = DCTSIZE2-1; - cinfo->Ah = 0; - cinfo->Al = 0; } + cinfo->Ss = 0; + cinfo->Se = cinfo->block_size * cinfo->block_size - 1; + cinfo->Ah = 0; + cinfo->Al = 0; } @@ -325,7 +589,7 @@ per_scan_setup (j_compress_ptr cinfo) compptr->MCU_width = 1; compptr->MCU_height = 1; compptr->MCU_blocks = 1; - compptr->MCU_sample_width = DCTSIZE; + compptr->MCU_sample_width = compptr->DCT_h_scaled_size; compptr->last_col_width = 1; /* For noninterleaved scans, it is convenient to define last_row_height * as the number of block rows present in the last iMCU row. @@ -347,11 +611,11 @@ per_scan_setup (j_compress_ptr cinfo) /* Overall image size in MCUs */ cinfo->MCUs_per_row = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, - (long) (cinfo->max_h_samp_factor*DCTSIZE)); + jdiv_round_up((long) cinfo->jpeg_width, + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); cinfo->MCU_rows_in_scan = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); + jdiv_round_up((long) cinfo->jpeg_height, + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); cinfo->blocks_in_MCU = 0; @@ -361,7 +625,7 @@ per_scan_setup (j_compress_ptr cinfo) compptr->MCU_width = compptr->h_samp_factor; compptr->MCU_height = compptr->v_samp_factor; compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; - compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; /* Figure number of non-dummy blocks in last MCU column & row */ tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); if (tmp == 0) tmp = compptr->MCU_width; @@ -433,7 +697,7 @@ prepare_for_pass (j_compress_ptr cinfo) /* Do Huffman optimization for a scan after the first one. */ select_scan_parameters(cinfo); per_scan_setup(cinfo); - if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) { + if (cinfo->Ss != 0 || cinfo->Ah == 0) { (*cinfo->entropy->start_pass) (cinfo, TRUE); (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); master->pub.call_pass_startup = FALSE; @@ -554,11 +818,13 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) master->pub.is_last_pass = FALSE; /* Validate parameters, determine derived values */ - initial_setup(cinfo); + initial_setup(cinfo, transcode_only); if (cinfo->scan_info != NULL) { #ifdef C_MULTISCAN_FILES_SUPPORTED validate_script(cinfo); + if (cinfo->block_size < DCTSIZE) + reduce_script(cinfo); #else ERREXIT(cinfo, JERR_NOT_COMPILED); #endif @@ -567,8 +833,10 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) cinfo->num_scans = 1; } - if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */ - cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */ + if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) && + !cinfo->arith_code) /* TEMPORARY HACK ??? */ + /* assume default tables no good for progressive or downscale mode */ + cinfo->optimize_coding = TRUE; /* Initialize my private state */ if (transcode_only) { diff --git a/3rdparty/libjpeg/jconfig.h b/3rdparty/libjpeg/jconfig.h index f5269dfe1..025ff5a30 100644 --- a/3rdparty/libjpeg/jconfig.h +++ b/3rdparty/libjpeg/jconfig.h @@ -1,6 +1,6 @@ /* jconfig.h. Generated automatically by configure. */ /* jconfig.cfg --- source file edited by configure script */ -/* see jconfig.doc for explanations */ +/* see jconfig.txt for explanations */ #define HAVE_PROTOTYPES #define HAVE_UNSIGNED_CHAR diff --git a/3rdparty/libjpeg/jcparam.c b/3rdparty/libjpeg/jcparam.c index 6fc48f536..c5e85dda5 100644 --- a/3rdparty/libjpeg/jcparam.c +++ b/3rdparty/libjpeg/jcparam.c @@ -2,6 +2,7 @@ * jcparam.c * * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2003-2008 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -60,6 +61,47 @@ jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, } +/* These are the sample quantization tables given in JPEG spec section K.1. + * The spec says that the values given produce "good" quality, and + * when divided by 2, "very good" quality. + */ +static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 +}; +static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + + +GLOBAL(void) +jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables + * and straight percentage-scaling quality scales. + * This entry point allows different scalings for luminance and chrominance. + */ +{ + /* Set up two quantization tables using the specified scaling */ + jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + cinfo->q_scale_factor[0], force_baseline); + jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + cinfo->q_scale_factor[1], force_baseline); +} + + GLOBAL(void) jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, boolean force_baseline) @@ -69,31 +111,6 @@ jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, * applications that insist on a linear percentage scaling. */ { - /* These are the sample quantization tables given in JPEG spec section K.1. - * The spec says that the values given produce "good" quality, and - * when divided by 2, "very good" quality. - */ - static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { - 16, 11, 10, 16, 24, 40, 51, 61, - 12, 12, 14, 19, 26, 58, 60, 55, - 14, 13, 16, 24, 40, 57, 69, 56, - 14, 17, 22, 29, 51, 87, 80, 62, - 18, 22, 37, 56, 68, 109, 103, 77, - 24, 35, 55, 64, 81, 104, 113, 92, - 49, 64, 78, 87, 103, 121, 120, 101, - 72, 92, 95, 98, 112, 100, 103, 99 - }; - static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { - 17, 18, 24, 47, 99, 99, 99, 99, - 18, 21, 26, 66, 99, 99, 99, 99, - 24, 26, 56, 99, 99, 99, 99, 99, - 47, 66, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99 - }; - /* Set up two quantization tables using the specified scaling */ jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, scale_factor, force_baseline); @@ -284,6 +301,8 @@ jpeg_set_defaults (j_compress_ptr cinfo) /* Initialize everything not dependent on the color space */ + cinfo->scale_num = 1; /* 1:1 scaling */ + cinfo->scale_denom = 1; cinfo->data_precision = BITS_IN_JSAMPLE; /* Set up two quantization tables using default quality of 75 */ jpeg_set_quality(cinfo, 75, TRUE); @@ -320,6 +339,9 @@ jpeg_set_defaults (j_compress_ptr cinfo) /* By default, use the simpler non-cosited sampling alignment */ cinfo->CCIR601_sampling = FALSE; + /* By default, apply fancy downsampling */ + cinfo->do_fancy_downsampling = TRUE; + /* No input smoothing */ cinfo->smoothing_factor = 0; diff --git a/3rdparty/libjpeg/jcphuff.c b/3rdparty/libjpeg/jcphuff.c deleted file mode 100644 index 07f9178b0..000000000 --- a/3rdparty/libjpeg/jcphuff.c +++ /dev/null @@ -1,833 +0,0 @@ -/* - * jcphuff.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy encoding routines for progressive JPEG. - * - * We do not support output suspension in this module, since the library - * currently does not allow multiple-scan files to be written with output - * suspension. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jchuff.h" /* Declarations shared with jchuff.c */ - -#ifdef C_PROGRESSIVE_SUPPORTED - -/* Expanded entropy encoder object for progressive Huffman encoding. */ - -typedef struct { - struct jpeg_entropy_encoder pub; /* public fields */ - - /* Mode flag: TRUE for optimization, FALSE for actual data output */ - boolean gather_statistics; - - /* Bit-level coding status. - * next_output_byte/free_in_buffer are local copies of cinfo->dest fields. - */ - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - INT32 put_buffer; /* current bit-accumulation buffer */ - int put_bits; /* # of bits now in it */ - j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ - - /* Coding status for DC components */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ - - /* Coding status for AC components */ - int ac_tbl_no; /* the table number of the single component */ - unsigned int EOBRUN; /* run length of EOBs */ - unsigned int BE; /* # of buffered correction bits before MCU */ - char * bit_buffer; /* buffer for correction bits (1 per char) */ - /* packing correction bits tightly would save some space but cost time... */ - - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - int next_restart_num; /* next restart number to write (0-7) */ - - /* Pointers to derived tables (these workspaces have image lifespan). - * Since any one scan codes only DC or only AC, we only need one set - * of tables, not one for DC and one for AC. - */ - c_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; - - /* Statistics tables for optimization; again, one set is enough */ - long * count_ptrs[NUM_HUFF_TBLS]; -} phuff_entropy_encoder; - -typedef phuff_entropy_encoder * phuff_entropy_ptr; - -/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit - * buffer can hold. Larger sizes may slightly improve compression, but - * 1000 is already well into the realm of overkill. - * The minimum safe size is 64 bits. - */ - -#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ - -/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. - * We assume that int right shift is unsigned if INT32 right shift is, - * which should be safe. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define ISHIFT_TEMPS int ishift_temp; -#define IRIGHT_SHIFT(x,shft) \ - ((ishift_temp = (x)) < 0 ? \ - (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ - (ishift_temp >> (shft))) -#else -#define ISHIFT_TEMPS -#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - -/* Forward declarations */ -METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo)); -METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); - - -/* - * Initialize for a Huffman-compressed scan using progressive JPEG. - */ - -METHODDEF(void) -start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band; - int ci, tbl; - jpeg_component_info * compptr; - - entropy->cinfo = cinfo; - entropy->gather_statistics = gather_statistics; - - is_DC_band = (cinfo->Ss == 0); - - /* We assume jcmaster.c already validated the scan parameters. */ - - /* Select execution routines */ - if (cinfo->Ah == 0) { - if (is_DC_band) - entropy->pub.encode_mcu = encode_mcu_DC_first; - else - entropy->pub.encode_mcu = encode_mcu_AC_first; - } else { - if (is_DC_band) - entropy->pub.encode_mcu = encode_mcu_DC_refine; - else { - entropy->pub.encode_mcu = encode_mcu_AC_refine; - /* AC refinement needs a correction bit buffer */ - if (entropy->bit_buffer == NULL) - entropy->bit_buffer = (char *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - MAX_CORR_BITS * SIZEOF(char)); - } - } - if (gather_statistics) - entropy->pub.finish_pass = finish_pass_gather_phuff; - else - entropy->pub.finish_pass = finish_pass_phuff; - - /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1 - * for AC coefficients. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Initialize DC predictions to 0 */ - entropy->last_dc_val[ci] = 0; - /* Get table index */ - if (is_DC_band) { - if (cinfo->Ah != 0) /* DC refinement needs no table */ - continue; - tbl = compptr->dc_tbl_no; - } else { - entropy->ac_tbl_no = tbl = compptr->ac_tbl_no; - } - if (gather_statistics) { - /* Check for invalid table index */ - /* (make_c_derived_tbl does this in the other path) */ - if (tbl < 0 || tbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); - /* Allocate and zero the statistics tables */ - /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ - if (entropy->count_ptrs[tbl] == NULL) - entropy->count_ptrs[tbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long)); - } else { - /* Compute derived values for Huffman table */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl, - & entropy->derived_tbls[tbl]); - } - } - - /* Initialize AC stuff */ - entropy->EOBRUN = 0; - entropy->BE = 0; - - /* Initialize bit buffer to empty */ - entropy->put_buffer = 0; - entropy->put_bits = 0; - - /* Initialize restart stuff */ - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num = 0; -} - - -/* Outputting bytes to the file. - * NB: these must be called only when actually outputting, - * that is, entropy->gather_statistics == FALSE. - */ - -/* Emit a byte */ -#define emit_byte(entropy,val) \ - { *(entropy)->next_output_byte++ = (JOCTET) (val); \ - if (--(entropy)->free_in_buffer == 0) \ - dump_buffer(entropy); } - - -LOCAL(void) -dump_buffer (phuff_entropy_ptr entropy) -/* Empty the output buffer; we do not support suspension in this module. */ -{ - struct jpeg_destination_mgr * dest = entropy->cinfo->dest; - - if (! (*dest->empty_output_buffer) (entropy->cinfo)) - ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); - /* After a successful buffer dump, must reset buffer pointers */ - entropy->next_output_byte = dest->next_output_byte; - entropy->free_in_buffer = dest->free_in_buffer; -} - - -/* Outputting bits to the file */ - -/* Only the right 24 bits of put_buffer are used; the valid bits are - * left-justified in this part. At most 16 bits can be passed to emit_bits - * in one call, and we never retain more than 7 bits in put_buffer - * between calls, so 24 bits are sufficient. - */ - -INLINE -LOCAL(void) -emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size) -/* Emit some bits, unless we are in gather mode */ -{ - /* This routine is heavily used, so it's worth coding tightly. */ - register INT32 put_buffer = (INT32) code; - register int put_bits = entropy->put_bits; - - /* if size is 0, caller used an invalid Huffman table entry */ - if (size == 0) - ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); - - if (entropy->gather_statistics) - return; /* do nothing if we're only getting stats */ - - put_buffer &= (((INT32) 1)<put_buffer; /* and merge with old buffer contents */ - - while (put_bits >= 8) { - int c = (int) ((put_buffer >> 16) & 0xFF); - - emit_byte(entropy, c); - if (c == 0xFF) { /* need to stuff a zero byte? */ - emit_byte(entropy, 0); - } - put_buffer <<= 8; - put_bits -= 8; - } - - entropy->put_buffer = put_buffer; /* update variables */ - entropy->put_bits = put_bits; -} - - -LOCAL(void) -flush_bits (phuff_entropy_ptr entropy) -{ - emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */ - entropy->put_buffer = 0; /* and reset bit-buffer to empty */ - entropy->put_bits = 0; -} - - -/* - * Emit (or just count) a Huffman symbol. - */ - -INLINE -LOCAL(void) -emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol) -{ - if (entropy->gather_statistics) - entropy->count_ptrs[tbl_no][symbol]++; - else { - c_derived_tbl * tbl = entropy->derived_tbls[tbl_no]; - emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); - } -} - - -/* - * Emit bits from a correction bit buffer. - */ - -LOCAL(void) -emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart, - unsigned int nbits) -{ - if (entropy->gather_statistics) - return; /* no real work */ - - while (nbits > 0) { - emit_bits(entropy, (unsigned int) (*bufstart), 1); - bufstart++; - nbits--; - } -} - - -/* - * Emit any pending EOBRUN symbol. - */ - -LOCAL(void) -emit_eobrun (phuff_entropy_ptr entropy) -{ - register int temp, nbits; - - if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ - temp = entropy->EOBRUN; - nbits = 0; - while ((temp >>= 1)) - nbits++; - /* safety check: shouldn't happen given limited correction-bit buffer */ - if (nbits > 14) - ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); - - emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4); - if (nbits) - emit_bits(entropy, entropy->EOBRUN, nbits); - - entropy->EOBRUN = 0; - - /* Emit any buffered correction bits */ - emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); - entropy->BE = 0; - } -} - - -/* - * Emit a restart marker & resynchronize predictions. - */ - -LOCAL(void) -emit_restart (phuff_entropy_ptr entropy, int restart_num) -{ - int ci; - - emit_eobrun(entropy); - - if (! entropy->gather_statistics) { - flush_bits(entropy); - emit_byte(entropy, 0xFF); - emit_byte(entropy, JPEG_RST0 + restart_num); - } - - if (entropy->cinfo->Ss == 0) { - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) - entropy->last_dc_val[ci] = 0; - } else { - /* Re-initialize all AC-related fields to 0 */ - entropy->EOBRUN = 0; - entropy->BE = 0; - } -} - - -/* - * MCU encoding for DC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp, temp2; - register int nbits; - int blkn, ci; - int Al = cinfo->Al; - JBLOCKROW block; - jpeg_component_info * compptr; - ISHIFT_TEMPS - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - - /* Compute the DC value after the required point transform by Al. - * This is simply an arithmetic right shift. - */ - temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); - - /* DC differences are figured on the point-transformed values. */ - temp = temp2 - entropy->last_dc_val[ci]; - entropy->last_dc_val[ci] = temp2; - - /* Encode the DC coefficient difference per section G.1.2.1 */ - temp2 = temp; - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - /* For a negative input, want temp2 = bitwise complement of abs(input) */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 0; - while (temp) { - nbits++; - temp >>= 1; - } - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_COEF_BITS+1) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count/emit the Huffman-coded symbol for the number of bits */ - emit_symbol(entropy, compptr->dc_tbl_no, nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (nbits) /* emit_bits rejects calls with size 0 */ - emit_bits(entropy, (unsigned int) temp2, nbits); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for AC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp, temp2; - register int nbits; - register int r, k; - int Se = cinfo->Se; - int Al = cinfo->Al; - JBLOCKROW block; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data block */ - block = MCU_data[0]; - - /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ - - r = 0; /* r = run length of zeros */ - - for (k = cinfo->Ss; k <= Se; k++) { - if ((temp = (*block)[jpeg_natural_order[k]]) == 0) { - r++; - continue; - } - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value; so the code is - * interwoven with finding the abs value (temp) and output bits (temp2). - */ - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - temp >>= Al; /* apply the point transform */ - /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ - temp2 = ~temp; - } else { - temp >>= Al; /* apply the point transform */ - temp2 = temp; - } - /* Watch out for case that nonzero coef is zero after point transform */ - if (temp == 0) { - r++; - continue; - } - - /* Emit any pending EOBRUN */ - if (entropy->EOBRUN > 0) - emit_eobrun(entropy); - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) { - emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); - r -= 16; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1)) - nbits++; - /* Check for out-of-range coefficient values */ - if (nbits > MAX_COEF_BITS) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - emit_bits(entropy, (unsigned int) temp2, nbits); - - r = 0; /* reset zero run length */ - } - - if (r > 0) { /* If there are trailing zeroes, */ - entropy->EOBRUN++; /* count an EOB */ - if (entropy->EOBRUN == 0x7FFF) - emit_eobrun(entropy); /* force it out to avoid overflow */ - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for DC successive approximation refinement scan. - * Note: we assume such scans can be multi-component, although the spec - * is not very clear on the point. - */ - -METHODDEF(boolean) -encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp; - int blkn; - int Al = cinfo->Al; - JBLOCKROW block; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - - /* We simply emit the Al'th bit of the DC coefficient value. */ - temp = (*block)[0]; - emit_bits(entropy, (unsigned int) (temp >> Al), 1); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for AC successive approximation refinement scan. - */ - -METHODDEF(boolean) -encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp; - register int r, k; - int EOB; - char *BR_buffer; - unsigned int BR; - int Se = cinfo->Se; - int Al = cinfo->Al; - JBLOCKROW block; - int absvalues[DCTSIZE2]; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data block */ - block = MCU_data[0]; - - /* It is convenient to make a pre-pass to determine the transformed - * coefficients' absolute values and the EOB position. - */ - EOB = 0; - for (k = cinfo->Ss; k <= Se; k++) { - temp = (*block)[jpeg_natural_order[k]]; - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value. - */ - if (temp < 0) - temp = -temp; /* temp is abs value of input */ - temp >>= Al; /* apply the point transform */ - absvalues[k] = temp; /* save abs value for main pass */ - if (temp == 1) - EOB = k; /* EOB = index of last newly-nonzero coef */ - } - - /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ - - r = 0; /* r = run length of zeros */ - BR = 0; /* BR = count of buffered bits added now */ - BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ - - for (k = cinfo->Ss; k <= Se; k++) { - if ((temp = absvalues[k]) == 0) { - r++; - continue; - } - - /* Emit any required ZRLs, but not if they can be folded into EOB */ - while (r > 15 && k <= EOB) { - /* emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(entropy); - /* Emit ZRL */ - emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); - r -= 16; - /* Emit buffered correction bits that must be associated with ZRL */ - emit_buffered_bits(entropy, BR_buffer, BR); - BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ - BR = 0; - } - - /* If the coef was previously nonzero, it only needs a correction bit. - * NOTE: a straight translation of the spec's figure G.7 would suggest - * that we also need to test r > 15. But if r > 15, we can only get here - * if k > EOB, which implies that this coefficient is not 1. - */ - if (temp > 1) { - /* The correction bit is the next bit of the absolute value. */ - BR_buffer[BR++] = (char) (temp & 1); - continue; - } - - /* Emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(entropy); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); - - /* Emit output bit for newly-nonzero coef */ - temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1; - emit_bits(entropy, (unsigned int) temp, 1); - - /* Emit buffered correction bits that must be associated with this code */ - emit_buffered_bits(entropy, BR_buffer, BR); - BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ - BR = 0; - r = 0; /* reset zero run length */ - } - - if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ - entropy->EOBRUN++; /* count an EOB */ - entropy->BE += BR; /* concat my correction bits to older ones */ - /* We force out the EOB if we risk either: - * 1. overflow of the EOB counter; - * 2. overflow of the correction bit buffer during the next MCU. - */ - if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) - emit_eobrun(entropy); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * Finish up at the end of a Huffman-compressed progressive scan. - */ - -METHODDEF(void) -finish_pass_phuff (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Flush out any buffered data */ - emit_eobrun(entropy); - flush_bits(entropy); - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; -} - - -/* - * Finish up a statistics-gathering pass and create the new Huffman tables. - */ - -METHODDEF(void) -finish_pass_gather_phuff (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band; - int ci, tbl; - jpeg_component_info * compptr; - JHUFF_TBL **htblptr; - boolean did[NUM_HUFF_TBLS]; - - /* Flush out buffered data (all we care about is counting the EOB symbol) */ - emit_eobrun(entropy); - - is_DC_band = (cinfo->Ss == 0); - - /* It's important not to apply jpeg_gen_optimal_table more than once - * per table, because it clobbers the input frequency counts! - */ - MEMZERO(did, SIZEOF(did)); - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - if (is_DC_band) { - if (cinfo->Ah != 0) /* DC refinement needs no table */ - continue; - tbl = compptr->dc_tbl_no; - } else { - tbl = compptr->ac_tbl_no; - } - if (! did[tbl]) { - if (is_DC_band) - htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; - else - htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]); - did[tbl] = TRUE; - } - } -} - - -/* - * Module initialization routine for progressive Huffman entropy encoding. - */ - -GLOBAL(void) -jinit_phuff_encoder (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy; - int i; - - entropy = (phuff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(phuff_entropy_encoder)); - cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; - entropy->pub.start_pass = start_pass_phuff; - - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->derived_tbls[i] = NULL; - entropy->count_ptrs[i] = NULL; - } - entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ -} - -#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/3rdparty/libjpeg/jcprepct.c b/3rdparty/libjpeg/jcprepct.c index fa93333db..be44cc4b4 100644 --- a/3rdparty/libjpeg/jcprepct.c +++ b/3rdparty/libjpeg/jcprepct.c @@ -173,10 +173,12 @@ pre_process_data (j_compress_ptr cinfo, *out_row_group_ctr < out_row_groups_avail) { for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { + numrows = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; expand_bottom_edge(output_buf[ci], - compptr->width_in_blocks * DCTSIZE, - (int) (*out_row_group_ctr * compptr->v_samp_factor), - (int) (out_row_groups_avail * compptr->v_samp_factor)); + compptr->width_in_blocks * compptr->DCT_h_scaled_size, + (int) (*out_row_group_ctr * numrows), + (int) (out_row_groups_avail * numrows)); } *out_row_group_ctr = out_row_groups_avail; break; /* can exit outer loop without test */ @@ -288,7 +290,8 @@ create_context_buffer (j_compress_ptr cinfo) */ true_buffer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * + (JDIMENSION) (((long) compptr->width_in_blocks * + cinfo->min_DCT_h_scaled_size * cinfo->max_h_samp_factor) / compptr->h_samp_factor), (JDIMENSION) (3 * rgroup_height)); /* Copy true buffer row pointers into the middle of the fake row array */ @@ -346,7 +349,8 @@ jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer) ci++, compptr++) { prep->color_buf[ci] = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * + (JDIMENSION) (((long) compptr->width_in_blocks * + cinfo->min_DCT_h_scaled_size * cinfo->max_h_samp_factor) / compptr->h_samp_factor), (JDIMENSION) cinfo->max_v_samp_factor); } diff --git a/3rdparty/libjpeg/jcsample.c b/3rdparty/libjpeg/jcsample.c index 212ec8757..4d36f85f3 100644 --- a/3rdparty/libjpeg/jcsample.c +++ b/3rdparty/libjpeg/jcsample.c @@ -62,6 +62,15 @@ typedef struct { /* Downsampling method pointers, one per component */ downsample1_ptr methods[MAX_COMPONENTS]; + + /* Height of an output row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_downsample need not + * recompute them each time. They are unused for other downsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[MAX_COMPONENTS]; } my_downsampler; typedef my_downsampler * my_downsample_ptr; @@ -123,7 +132,8 @@ sep_downsample (j_compress_ptr cinfo, for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { in_ptr = input_buf[ci] + in_row_index; - out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor); + out_ptr = output_buf[ci] + + (out_row_group_index * downsample->rowgroup_height[ci]); (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr); } } @@ -140,14 +150,15 @@ METHODDEF(void) int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, JSAMPARRAY input_data, JSAMPARRAY output_data) { + my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v; JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */ - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; JSAMPROW inptr, outptr; INT32 outvalue; - h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor; - v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor; + h_expand = downsample->h_expand[compptr->component_index]; + v_expand = downsample->v_expand[compptr->component_index]; numpix = h_expand * v_expand; numpix2 = numpix/2; @@ -158,8 +169,8 @@ int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, expand_right_edge(input_data, cinfo->max_v_samp_factor, cinfo->image_width, output_cols * h_expand); - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { outptr = output_data[outrow]; for (outcol = 0, outcol_h = 0; outcol < output_cols; outcol++, outcol_h += h_expand) { @@ -173,6 +184,7 @@ int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix); } inrow += v_expand; + outrow++; } } @@ -191,8 +203,8 @@ fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, jcopy_sample_rows(input_data, 0, output_data, 0, cinfo->max_v_samp_factor, cinfo->image_width); /* Edge-expand */ - expand_right_edge(output_data, cinfo->max_v_samp_factor, - cinfo->image_width, compptr->width_in_blocks * DCTSIZE); + expand_right_edge(output_data, cinfo->max_v_samp_factor, cinfo->image_width, + compptr->width_in_blocks * compptr->DCT_h_scaled_size); } @@ -212,9 +224,9 @@ METHODDEF(void) h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, JSAMPARRAY input_data, JSAMPARRAY output_data) { - int outrow; + int inrow; JDIMENSION outcol; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; register JSAMPROW inptr, outptr; register int bias; @@ -225,9 +237,9 @@ h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, expand_right_edge(input_data, cinfo->max_v_samp_factor, cinfo->image_width, output_cols * 2); - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr = input_data[outrow]; + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; bias = 0; /* bias = 0,1,0,1,... for successive samples */ for (outcol = 0; outcol < output_cols; outcol++) { *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) @@ -251,7 +263,7 @@ h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, { int inrow, outrow; JDIMENSION outcol; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; register JSAMPROW inptr0, inptr1, outptr; register int bias; @@ -262,8 +274,8 @@ h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, expand_right_edge(input_data, cinfo->max_v_samp_factor, cinfo->image_width, output_cols * 2); - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { outptr = output_data[outrow]; inptr0 = input_data[inrow]; inptr1 = input_data[inrow+1]; @@ -276,6 +288,7 @@ h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, inptr0 += 2; inptr1 += 2; } inrow += 2; + outrow++; } } @@ -294,7 +307,7 @@ h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, { int inrow, outrow; JDIMENSION colctr; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr; INT32 membersum, neighsum, memberscale, neighscale; @@ -321,8 +334,8 @@ h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */ neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */ - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + inrow = outrow = 0; + while (inrow < cinfo->max_v_samp_factor) { outptr = output_data[outrow]; inptr0 = input_data[inrow]; inptr1 = input_data[inrow+1]; @@ -378,6 +391,7 @@ h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, *outptr = (JSAMPLE) ((membersum + 32768) >> 16); inrow += 2; + outrow++; } } @@ -392,9 +406,9 @@ METHODDEF(void) fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, JSAMPARRAY input_data, JSAMPARRAY output_data) { - int outrow; + int inrow; JDIMENSION colctr; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + JDIMENSION output_cols = compptr->width_in_blocks * compptr->DCT_h_scaled_size; register JSAMPROW inptr, above_ptr, below_ptr, outptr; INT32 membersum, neighsum, memberscale, neighscale; int colsum, lastcolsum, nextcolsum; @@ -415,11 +429,11 @@ fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */ neighscale = cinfo->smoothing_factor * 64; /* scaled SF */ - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr = input_data[outrow]; - above_ptr = input_data[outrow-1]; - below_ptr = input_data[outrow+1]; + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + outptr = output_data[inrow]; + inptr = input_data[inrow]; + above_ptr = input_data[inrow-1]; + below_ptr = input_data[inrow+1]; /* Special case for first column */ colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + @@ -467,6 +481,7 @@ jinit_downsampler (j_compress_ptr cinfo) int ci; jpeg_component_info * compptr; boolean smoothok = TRUE; + int h_in_group, v_in_group, h_out_group, v_out_group; downsample = (my_downsample_ptr) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, @@ -482,8 +497,17 @@ jinit_downsampler (j_compress_ptr cinfo) /* Verify we can handle the sampling factors, and set up method pointers */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - if (compptr->h_samp_factor == cinfo->max_h_samp_factor && - compptr->v_samp_factor == cinfo->max_v_samp_factor) { + /* Compute size of an "output group" for DCT scaling. This many samples + * are to be converted from max_h_samp_factor * max_v_samp_factor pixels. + */ + h_out_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_out_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; + h_in_group = cinfo->max_h_samp_factor; + v_in_group = cinfo->max_v_samp_factor; + downsample->rowgroup_height[ci] = v_out_group; /* save for use later */ + if (h_in_group == h_out_group && v_in_group == v_out_group) { #ifdef INPUT_SMOOTHING_SUPPORTED if (cinfo->smoothing_factor) { downsample->methods[ci] = fullsize_smooth_downsample; @@ -491,12 +515,12 @@ jinit_downsampler (j_compress_ptr cinfo) } else #endif downsample->methods[ci] = fullsize_downsample; - } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && - compptr->v_samp_factor == cinfo->max_v_samp_factor) { + } else if (h_in_group == h_out_group * 2 && + v_in_group == v_out_group) { smoothok = FALSE; downsample->methods[ci] = h2v1_downsample; - } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && - compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) { + } else if (h_in_group == h_out_group * 2 && + v_in_group == v_out_group * 2) { #ifdef INPUT_SMOOTHING_SUPPORTED if (cinfo->smoothing_factor) { downsample->methods[ci] = h2v2_smooth_downsample; @@ -504,10 +528,12 @@ jinit_downsampler (j_compress_ptr cinfo) } else #endif downsample->methods[ci] = h2v2_downsample; - } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && - (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) { + } else if ((h_in_group % h_out_group) == 0 && + (v_in_group % v_out_group) == 0) { smoothok = FALSE; downsample->methods[ci] = int_downsample; + downsample->h_expand[ci] = (UINT8) (h_in_group / h_out_group); + downsample->v_expand[ci] = (UINT8) (v_in_group / v_out_group); } else ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); } diff --git a/3rdparty/libjpeg/jctrans.c b/3rdparty/libjpeg/jctrans.c index 0e6d70769..f7d7b8149 100644 --- a/3rdparty/libjpeg/jctrans.c +++ b/3rdparty/libjpeg/jctrans.c @@ -2,6 +2,7 @@ * jctrans.c * * Copyright (C) 1995-1998, Thomas G. Lane. + * Modified 2000-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -76,6 +77,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo, dstinfo->image_height = srcinfo->image_height; dstinfo->input_components = srcinfo->num_components; dstinfo->in_color_space = srcinfo->jpeg_color_space; + dstinfo->jpeg_width = srcinfo->output_width; + dstinfo->jpeg_height = srcinfo->output_height; + dstinfo->min_DCT_h_scaled_size = srcinfo->min_DCT_h_scaled_size; + dstinfo->min_DCT_v_scaled_size = srcinfo->min_DCT_v_scaled_size; /* Initialize all parameters to default values */ jpeg_set_defaults(dstinfo); /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. @@ -158,25 +163,14 @@ LOCAL(void) transencode_master_selection (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays) { - /* Although we don't actually use input_components for transcoding, - * jcmaster.c's initial_setup will complain if input_components is 0. - */ - cinfo->input_components = 1; /* Initialize master control (includes parameter checking/processing) */ jinit_c_master_control(cinfo, TRUE /* transcode only */); /* Entropy encoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - jinit_phuff_encoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_encoder(cinfo); + if (cinfo->arith_code) + jinit_arith_encoder(cinfo); + else { + jinit_huff_encoder(cinfo); } /* We need a special coefficient buffer controller. */ @@ -381,7 +375,7 @@ transencode_coef_controller (j_compress_ptr cinfo, buffer = (JBLOCKROW) (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + FMEMZERO((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { coef->dummy_buffer[i] = buffer + i; } diff --git a/3rdparty/libjpeg/jdapimin.c b/3rdparty/libjpeg/jdapimin.c index cadb59fce..7f1ce4c05 100644 --- a/3rdparty/libjpeg/jdapimin.c +++ b/3rdparty/libjpeg/jdapimin.c @@ -2,6 +2,7 @@ * jdapimin.c * * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -185,8 +186,8 @@ default_decompress_parms (j_decompress_ptr cinfo) } /* Set defaults for other decompression parameters. */ - cinfo->scale_num = 1; /* 1:1 scaling */ - cinfo->scale_denom = 1; + cinfo->scale_num = cinfo->block_size; /* 1:1 scaling */ + cinfo->scale_denom = cinfo->block_size; cinfo->output_gamma = 1.0; cinfo->buffered_image = FALSE; cinfo->raw_data_out = FALSE; diff --git a/3rdparty/libjpeg/jdapistd.c b/3rdparty/libjpeg/jdapistd.c index c8e3fa0c3..9d7453777 100644 --- a/3rdparty/libjpeg/jdapistd.c +++ b/3rdparty/libjpeg/jdapistd.c @@ -202,7 +202,7 @@ jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, } /* Verify that at least one iMCU row can be returned. */ - lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size; + lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size; if (max_lines < lines_per_iMCU_row) ERREXIT(cinfo, JERR_BUFFER_SIZE); diff --git a/3rdparty/libjpeg/jdarith.c b/3rdparty/libjpeg/jdarith.c new file mode 100644 index 000000000..092f8af5f --- /dev/null +++ b/3rdparty/libjpeg/jdarith.c @@ -0,0 +1,776 @@ +/* + * jdarith.c + * + * Developed 1997-2011 by Guido Vollbeding. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains portable arithmetic entropy decoding routines for JPEG + * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). + * + * Both sequential and progressive modes are supported in this single module. + * + * Suspension is not currently supported in this module. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Expanded entropy decoder object for arithmetic decoding. */ + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + INT32 c; /* C register, base of coding interval + input bit buffer */ + INT32 a; /* A register, normalized size of coding interval */ + int ct; /* bit shift counter, # of bits left in bit buffer part of C */ + /* init: ct = -16 */ + /* run: ct = 0..7 */ + /* error: ct = -1 */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to statistics areas (these workspaces have image lifespan) */ + unsigned char * dc_stats[NUM_ARITH_TBLS]; + unsigned char * ac_stats[NUM_ARITH_TBLS]; + + /* Statistics bin for coding with fixed probability 0.5 */ + unsigned char fixed_bin[4]; +} arith_entropy_decoder; + +typedef arith_entropy_decoder * arith_entropy_ptr; + +/* The following two definitions specify the allocation chunk size + * for the statistics area. + * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least + * 49 statistics bins for DC, and 245 statistics bins for AC coding. + * + * We use a compact representation with 1 byte per statistics bin, + * thus the numbers directly represent byte sizes. + * This 1 byte per statistics bin contains the meaning of the MPS + * (more probable symbol) in the highest bit (mask 0x80), and the + * index into the probability estimation state machine table + * in the lower bits (mask 0x7F). + */ + +#define DC_STAT_BINS 64 +#define AC_STAT_BINS 256 + + +LOCAL(int) +get_byte (j_decompress_ptr cinfo) +/* Read next input byte; we do not support suspension in this module. */ +{ + struct jpeg_source_mgr * src = cinfo->src; + + if (src->bytes_in_buffer == 0) + if (! (*src->fill_input_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + src->bytes_in_buffer--; + return GETJOCTET(*src->next_input_byte++); +} + + +/* + * The core arithmetic decoding routine (common in JPEG and JBIG). + * This needs to go as fast as possible. + * Machine-dependent optimization facilities + * are not utilized in this portable implementation. + * However, this code should be fairly efficient and + * may be a good base for further optimizations anyway. + * + * Return value is 0 or 1 (binary decision). + * + * Note: I've changed the handling of the code base & bit + * buffer register C compared to other implementations + * based on the standards layout & procedures. + * While it also contains both the actual base of the + * coding interval (16 bits) and the next-bits buffer, + * the cut-point between these two parts is floating + * (instead of fixed) with the bit shift counter CT. + * Thus, we also need only one (variable instead of + * fixed size) shift for the LPS/MPS decision, and + * we can get away with any renormalization update + * of C (except for new data insertion, of course). + * + * I've also introduced a new scheme for accessing + * the probability estimation state machine table, + * derived from Markus Kuhn's JBIG implementation. + */ + +LOCAL(int) +arith_decode (j_decompress_ptr cinfo, unsigned char *st) +{ + register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; + register unsigned char nl, nm; + register INT32 qe, temp; + register int sv, data; + + /* Renormalization & data input per section D.2.6 */ + while (e->a < 0x8000L) { + if (--e->ct < 0) { + /* Need to fetch next data byte */ + if (cinfo->unread_marker) + data = 0; /* stuff zero data */ + else { + data = get_byte(cinfo); /* read next input byte */ + if (data == 0xFF) { /* zero stuff or marker code */ + do data = get_byte(cinfo); + while (data == 0xFF); /* swallow extra 0xFF bytes */ + if (data == 0) + data = 0xFF; /* discard stuffed zero byte */ + else { + /* Note: Different from the Huffman decoder, hitting + * a marker while processing the compressed data + * segment is legal in arithmetic coding. + * The convention is to supply zero data + * then until decoding is complete. + */ + cinfo->unread_marker = data; + data = 0; + } + } + } + e->c = (e->c << 8) | data; /* insert data into C register */ + if ((e->ct += 8) < 0) /* update bit shift counter */ + /* Need more initial bytes */ + if (++e->ct == 0) + /* Got 2 initial bytes -> re-init A and exit loop */ + e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */ + } + e->a <<= 1; + } + + /* Fetch values from our compact representation of Table D.3(D.2): + * Qe values and probability estimation state machine + */ + sv = *st; + qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ + nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ + nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ + + /* Decode & estimation procedures per sections D.2.4 & D.2.5 */ + temp = e->a - qe; + e->a = temp; + temp <<= e->ct; + if (e->c >= temp) { + e->c -= temp; + /* Conditional LPS (less probable symbol) exchange */ + if (e->a < qe) { + e->a = qe; + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } else { + e->a = qe; + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } + } else if (e->a < 0x8000L) { + /* Conditional MPS (more probable symbol) exchange */ + if (e->a < qe) { + *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ + sv ^= 0x80; /* Exchange LPS/MPS */ + } else { + *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ + } + } + + return sv >> 7; +} + + +/* + * Check for a restart marker & resynchronize decoder. + */ + +LOCAL(void) +process_restart (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci; + jpeg_component_info * compptr; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Re-initialize statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); + /* Reset DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); + } + } + + /* Reset arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Arithmetic MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * arithmetic-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign; + int v, m; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al); + } + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + unsigned char *st; + int tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + /* Figure F.20: Decode_AC_coefficients */ + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (arith_decode(cinfo, st)) break; /* EOB flag */ + while (arith_decode(cinfo, st + 1) == 0) { + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al); + } + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + unsigned char *st; + int p1, blkn; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + st = entropy->fixed_bin; /* use fixed probability estimation */ + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + /* Encoded data is simply the next bit of the two's-complement DC value */ + if (arith_decode(cinfo, st)) + MCU_data[blkn][0][0] |= p1; + } + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + JBLOCKROW block; + JCOEFPTR thiscoef; + unsigned char *st; + int tbl, k, kex; + int p1, m1; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = cinfo->cur_comp_info[0]->ac_tbl_no; + + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + + /* Establish EOBx (previous stage end-of-block) index */ + for (kex = cinfo->Se; kex > 0; kex--) + if ((*block)[natural_order[kex]]) break; + + for (k = cinfo->Ss; k <= cinfo->Se; k++) { + st = entropy->ac_stats[tbl] + 3 * (k - 1); + if (k > kex) + if (arith_decode(cinfo, st)) break; /* EOB flag */ + for (;;) { + thiscoef = *block + natural_order[k]; + if (*thiscoef) { /* previously nonzero coef */ + if (arith_decode(cinfo, st + 2)) { + if (*thiscoef < 0) + *thiscoef += m1; + else + *thiscoef += p1; + } + break; + } + if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */ + if (arith_decode(cinfo, entropy->fixed_bin)) + *thiscoef = m1; + else + *thiscoef = p1; + break; + } + st += 3; k++; + if (k > cinfo->Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + } + + return TRUE; +} + + +/* + * Decode one MCU's worth of arithmetic-compressed coefficients. + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + jpeg_component_info * compptr; + JBLOCKROW block; + unsigned char *st; + int blkn, ci, tbl, sign, k; + int v, m; + const int * natural_order; + + /* Process restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + process_restart(cinfo); + entropy->restarts_to_go--; + } + + if (entropy->ct == -1) return TRUE; /* if error do nothing */ + + natural_order = cinfo->natural_order; + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ + + tbl = compptr->dc_tbl_no; + + /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ + st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; + + /* Figure F.19: Decode_DC_DIFF */ + if (arith_decode(cinfo, st) == 0) + entropy->dc_context[ci] = 0; + else { + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, st + 1); + st += 2; st += sign; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ + if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) + entropy->dc_context[ci] = 0; /* zero diff category */ + else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) + entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ + else + entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + entropy->last_dc_val[ci] += v; + } + + (*block)[0] = (JCOEF) entropy->last_dc_val[ci]; + + /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ + + if (cinfo->lim_Se == 0) continue; + tbl = compptr->ac_tbl_no; + k = 0; + + /* Figure F.20: Decode_AC_coefficients */ + do { + st = entropy->ac_stats[tbl] + 3 * k; + if (arith_decode(cinfo, st)) break; /* EOB flag */ + for (;;) { + k++; + if (arith_decode(cinfo, st + 1)) break; + st += 3; + if (k >= cinfo->lim_Se) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* spectral overflow */ + return TRUE; + } + } + /* Figure F.21: Decoding nonzero value v */ + /* Figure F.22: Decoding the sign of v */ + sign = arith_decode(cinfo, entropy->fixed_bin); + st += 2; + /* Figure F.23: Decoding the magnitude category of v */ + if ((m = arith_decode(cinfo, st)) != 0) { + if (arith_decode(cinfo, st)) { + m <<= 1; + st = entropy->ac_stats[tbl] + + (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); + while (arith_decode(cinfo, st)) { + if ((m <<= 1) == 0x8000) { + WARNMS(cinfo, JWRN_ARITH_BAD_CODE); + entropy->ct = -1; /* magnitude overflow */ + return TRUE; + } + st += 1; + } + } + } + v = m; + /* Figure F.24: Decoding the magnitude bit pattern of v */ + st += 14; + while (m >>= 1) + if (arith_decode(cinfo, st)) v |= m; + v += 1; if (sign) v = -v; + (*block)[natural_order[k]] = (JCOEF) v; + } while (k < cinfo->lim_Se); + } + + return TRUE; +} + + +/* + * Initialize for an arithmetic-compressed scan. + */ + +METHODDEF(void) +start_pass (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; + int ci, tbl; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + bad: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + } + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + } else { + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning. + */ + if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || + (cinfo->Se < DCTSIZE2 && cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + /* Select MCU decoding routine */ + entropy->pub.decode_mcu = decode_mcu; + } + + /* Allocate & initialize requested statistics areas */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { + tbl = compptr->dc_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->dc_stats[tbl] == NULL) + entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); + MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + entropy->dc_context[ci] = 0; + } + if ((! cinfo->progressive_mode && cinfo->lim_Se) || + (cinfo->progressive_mode && cinfo->Ss)) { + tbl = compptr->ac_tbl_no; + if (tbl < 0 || tbl >= NUM_ARITH_TBLS) + ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); + if (entropy->ac_stats[tbl] == NULL) + entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); + MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); + } + } + + /* Initialize arithmetic decoding variables */ + entropy->c = 0; + entropy->a = 0; + entropy->ct = -16; /* force reading 2 initial bytes to fill C */ + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Module initialization routine for arithmetic entropy decoding. + */ + +GLOBAL(void) +jinit_arith_decoder (j_decompress_ptr cinfo) +{ + arith_entropy_ptr entropy; + int i; + + entropy = (arith_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(arith_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + entropy->dc_stats[i] = NULL; + entropy->ac_stats[i] = NULL; + } + + /* Initialize index for fixed probability estimation */ + entropy->fixed_bin[0] = 113; + + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; + } +} diff --git a/3rdparty/libjpeg/jdatadst.c b/3rdparty/libjpeg/jdatadst.c index a8f6fb0e0..6981fb73d 100644 --- a/3rdparty/libjpeg/jdatadst.c +++ b/3rdparty/libjpeg/jdatadst.c @@ -2,13 +2,14 @@ * jdatadst.c * * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009-2012 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains compression data destination routines for the case of - * emitting JPEG data to a file (or any stdio stream). While these routines - * are sufficient for most applications, some will want to use a different - * destination manager. + * emitting JPEG data to memory or to a file (or any stdio stream). + * While these routines are sufficient for most applications, + * some will want to use a different destination manager. * IMPORTANT: we assume that fwrite() will correctly transcribe an array of * JOCTETs into 8-bit-wide elements on external storage. If char is wider * than 8 bits on your machine, you may need to do some tweaking. @@ -19,6 +20,11 @@ #include "jpeglib.h" #include "jerror.h" +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + /* Expanded data destination object for stdio output */ @@ -34,6 +40,21 @@ typedef my_destination_mgr * my_dest_ptr; #define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ +/* Expanded data destination object for memory output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + unsigned char ** outbuffer; /* target buffer */ + unsigned long * outsize; + unsigned char * newbuffer; /* newly allocated buffer */ + JOCTET * buffer; /* start of buffer */ + size_t bufsize; +} my_mem_destination_mgr; + +typedef my_mem_destination_mgr * my_mem_dest_ptr; + + /* * Initialize destination --- called by jpeg_start_compress * before any data is actually written. @@ -53,6 +74,12 @@ init_destination (j_compress_ptr cinfo) dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; } +METHODDEF(void) +init_mem_destination (j_compress_ptr cinfo) +{ + /* no work necessary here */ +} + /* * Empty the output buffer --- called whenever buffer fills up. @@ -92,6 +119,36 @@ empty_output_buffer (j_compress_ptr cinfo) return TRUE; } +METHODDEF(boolean) +empty_mem_output_buffer (j_compress_ptr cinfo) +{ + size_t nextsize; + JOCTET * nextbuffer; + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + /* Try to allocate new buffer with double size */ + nextsize = dest->bufsize * 2; + nextbuffer = (JOCTET *) malloc(nextsize); + + if (nextbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + + MEMCOPY(nextbuffer, dest->buffer, dest->bufsize); + + if (dest->newbuffer != NULL) + free(dest->newbuffer); + + dest->newbuffer = nextbuffer; + + dest->pub.next_output_byte = nextbuffer + dest->bufsize; + dest->pub.free_in_buffer = dest->bufsize; + + dest->buffer = nextbuffer; + dest->bufsize = nextsize; + + return TRUE; +} + /* * Terminate destination --- called by jpeg_finish_compress @@ -119,6 +176,15 @@ term_destination (j_compress_ptr cinfo) ERREXIT(cinfo, JERR_FILE_WRITE); } +METHODDEF(void) +term_mem_destination (j_compress_ptr cinfo) +{ + my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest; + + *dest->outbuffer = dest->buffer; + *dest->outsize = dest->bufsize - dest->pub.free_in_buffer; +} + /* * Prepare for output to a stdio stream. @@ -149,3 +215,53 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile) dest->pub.term_destination = term_destination; dest->outfile = outfile; } + + +/* + * Prepare for output to a memory buffer. + * The caller may supply an own initial buffer with appropriate size. + * Otherwise, or when the actual data output exceeds the given size, + * the library adapts the buffer size as necessary. + * The standard library functions malloc/free are used for allocating + * larger memory, so the buffer is available to the application after + * finishing compression, and then the application is responsible for + * freeing the requested memory. + */ + +GLOBAL(void) +jpeg_mem_dest (j_compress_ptr cinfo, + unsigned char ** outbuffer, unsigned long * outsize) +{ + my_mem_dest_ptr dest; + + if (outbuffer == NULL || outsize == NULL) /* sanity check */ + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same buffer without re-executing jpeg_mem_dest. + */ + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_mem_destination_mgr)); + } + + dest = (my_mem_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_mem_destination; + dest->pub.empty_output_buffer = empty_mem_output_buffer; + dest->pub.term_destination = term_mem_destination; + dest->outbuffer = outbuffer; + dest->outsize = outsize; + dest->newbuffer = NULL; + + if (*outbuffer == NULL || *outsize == 0) { + /* Allocate initial buffer */ + dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE); + if (dest->newbuffer == NULL) + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); + *outsize = OUTPUT_BUF_SIZE; + } + + dest->pub.next_output_byte = dest->buffer = *outbuffer; + dest->pub.free_in_buffer = dest->bufsize = *outsize; +} diff --git a/3rdparty/libjpeg/jdatasrc.c b/3rdparty/libjpeg/jdatasrc.c index edc752bf5..7be59a88a 100644 --- a/3rdparty/libjpeg/jdatasrc.c +++ b/3rdparty/libjpeg/jdatasrc.c @@ -2,13 +2,14 @@ * jdatasrc.c * * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2009-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains decompression data source routines for the case of - * reading JPEG data from a file (or any stdio stream). While these routines - * are sufficient for most applications, some will want to use a different - * source manager. + * reading JPEG data from memory or from a file (or any stdio stream). + * While these routines are sufficient for most applications, + * some will want to use a different source manager. * IMPORTANT: we assume that fread() will correctly transcribe an array of * JOCTETs from 8-bit-wide elements on external storage. If char is wider * than 8 bits on your machine, you may need to do some tweaking. @@ -52,6 +53,12 @@ init_source (j_decompress_ptr cinfo) src->start_of_file = TRUE; } +METHODDEF(void) +init_mem_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + /* * Fill the input buffer --- called whenever buffer is emptied. @@ -111,6 +118,27 @@ fill_input_buffer (j_decompress_ptr cinfo) return TRUE; } +METHODDEF(boolean) +fill_mem_input_buffer (j_decompress_ptr cinfo) +{ + static const JOCTET mybuffer[4] = { + (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0 + }; + + /* The whole JPEG data is expected to reside in the supplied memory + * buffer, so any request for more data beyond the given buffer size + * is treated as an error. + */ + WARNMS(cinfo, JWRN_JPEG_EOF); + + /* Insert a fake EOI marker */ + + cinfo->src->next_input_byte = mybuffer; + cinfo->src->bytes_in_buffer = 2; + + return TRUE; +} + /* * Skip data --- used to skip over a potentially large amount of @@ -127,22 +155,22 @@ fill_input_buffer (j_decompress_ptr cinfo) METHODDEF(void) skip_input_data (j_decompress_ptr cinfo, long num_bytes) { - my_src_ptr src = (my_src_ptr) cinfo->src; + struct jpeg_source_mgr * src = cinfo->src; /* Just a dumb implementation for now. Could use fseek() except * it doesn't work on pipes. Not clear that being smart is worth * any trouble anyway --- large skips are infrequent. */ if (num_bytes > 0) { - while (num_bytes > (long) src->pub.bytes_in_buffer) { - num_bytes -= (long) src->pub.bytes_in_buffer; - (void) fill_input_buffer(cinfo); + while (num_bytes > (long) src->bytes_in_buffer) { + num_bytes -= (long) src->bytes_in_buffer; + (void) (*src->fill_input_buffer) (cinfo); /* note we assume that fill_input_buffer will never return FALSE, * so suspension need not be handled. */ } - src->pub.next_input_byte += (size_t) num_bytes; - src->pub.bytes_in_buffer -= (size_t) num_bytes; + src->next_input_byte += (size_t) num_bytes; + src->bytes_in_buffer -= (size_t) num_bytes; } } @@ -210,3 +238,38 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ src->pub.next_input_byte = NULL; /* until buffer loaded */ } + + +/* + * Prepare for input from a supplied memory buffer. + * The buffer must contain the whole JPEG data. + */ + +GLOBAL(void) +jpeg_mem_src (j_decompress_ptr cinfo, + unsigned char * inbuffer, unsigned long insize) +{ + struct jpeg_source_mgr * src; + + if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + + /* The source object is made permanent so that a series of JPEG images + * can be read from the same buffer by calling jpeg_mem_src only before + * the first one. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(struct jpeg_source_mgr)); + } + + src = cinfo->src; + src->init_source = init_mem_source; + src->fill_input_buffer = fill_mem_input_buffer; + src->skip_input_data = skip_input_data; + src->resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->term_source = term_source; + src->bytes_in_buffer = (size_t) insize; + src->next_input_byte = (JOCTET *) inbuffer; +} diff --git a/3rdparty/libjpeg/jdcoefct.c b/3rdparty/libjpeg/jdcoefct.c index 4938d20fc..ed02fc378 100644 --- a/3rdparty/libjpeg/jdcoefct.c +++ b/3rdparty/libjpeg/jdcoefct.c @@ -2,6 +2,7 @@ * jdcoefct.c * * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 2002-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -162,8 +163,9 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; MCU_col_num++) { /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ - jzero_far((void FAR *) coef->MCU_buffer[0], - (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); + if (cinfo->lim_Se) /* can bypass in DC only case */ + FMEMZERO((void FAR *) coef->MCU_buffer[0], + (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { /* Suspension forced; update state counters and exit */ coef->MCU_vert_offset = yoffset; @@ -187,7 +189,7 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width : compptr->last_col_width; output_ptr = output_buf[compptr->component_index] + - yoffset * compptr->DCT_scaled_size; + yoffset * compptr->DCT_v_scaled_size; start_col = MCU_col_num * compptr->MCU_sample_width; for (yindex = 0; yindex < compptr->MCU_height; yindex++) { if (cinfo->input_iMCU_row < last_iMCU_row || @@ -197,11 +199,11 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) coef->MCU_buffer[blkn+xindex], output_ptr, output_col); - output_col += compptr->DCT_scaled_size; + output_col += compptr->DCT_h_scaled_size; } } blkn += compptr->MCU_width; - output_ptr += compptr->DCT_scaled_size; + output_ptr += compptr->DCT_v_scaled_size; } } } @@ -362,9 +364,9 @@ decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, output_ptr, output_col); buffer_ptr++; - output_col += compptr->DCT_scaled_size; + output_col += compptr->DCT_h_scaled_size; } - output_ptr += compptr->DCT_scaled_size; + output_ptr += compptr->DCT_v_scaled_size; } } @@ -654,9 +656,9 @@ decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) DC4 = DC5; DC5 = DC6; DC7 = DC8; DC8 = DC9; buffer_ptr++, prev_block_row++, next_block_row++; - output_col += compptr->DCT_scaled_size; + output_col += compptr->DCT_h_scaled_size; } - output_ptr += compptr->DCT_scaled_size; + output_ptr += compptr->DCT_v_scaled_size; } } @@ -729,6 +731,9 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { coef->MCU_buffer[i] = buffer + i; } + if (cinfo->lim_Se == 0) /* DC only case: want to bypass later */ + FMEMZERO((void FAR *) buffer, + (size_t) (D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK))); coef->pub.consume_data = dummy_consume_data; coef->pub.decompress_data = decompress_onepass; coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ diff --git a/3rdparty/libjpeg/jdcolor.c b/3rdparty/libjpeg/jdcolor.c index 6c04dfe8a..83e4d069a 100644 --- a/3rdparty/libjpeg/jdcolor.c +++ b/3rdparty/libjpeg/jdcolor.c @@ -2,6 +2,7 @@ * jdcolor.c * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -23,20 +24,28 @@ typedef struct { int * Cb_b_tab; /* => table for Cb to B conversion */ INT32 * Cr_g_tab; /* => table for Cr to G conversion */ INT32 * Cb_g_tab; /* => table for Cb to G conversion */ + + /* Private state for RGB->Y conversion */ + INT32 * rgb_y_tab; /* => table for RGB to Y conversion */ } my_color_deconverter; typedef my_color_deconverter * my_cconvert_ptr; /**************** YCbCr -> RGB conversion: most common case **************/ +/**************** RGB -> Y conversion: less common case **************/ /* * YCbCr is defined per CCIR 601-1, except that Cb and Cr are * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. * The conversion equations to be implemented are therefore + * * R = Y + 1.40200 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr * B = Y + 1.77200 * Cb + * + * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B + * * where Cb and Cr represent the incoming values less CENTERJSAMPLE. * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) * @@ -61,6 +70,18 @@ typedef my_color_deconverter * my_cconvert_ptr; #define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) #define FIX(x) ((INT32) ((x) * (1L<Y conversion and divide it up into + * three parts, instead of doing three alloc_small requests. This lets us + * use a single table base address, which can be held in a register in the + * inner loops on many machines (more than can hold all three addresses, + * anyway). + */ + +#define R_Y_OFF 0 /* offset to R => Y section */ +#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */ +#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */ +#define TABLE_SIZE (3*(MAXJSAMPLE+1)) + /* * Initialize tables for YCC->RGB colorspace conversion. @@ -160,6 +181,98 @@ ycc_rgb_convert (j_decompress_ptr cinfo, /**************** Cases other than YCbCr -> RGB **************/ +/* + * Initialize for RGB->grayscale colorspace conversion. + */ + +LOCAL(void) +build_rgb_y_table (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + INT32 * rgb_y_tab; + INT32 i; + + /* Allocate and fill in the conversion tables. */ + cconvert->rgb_y_tab = rgb_y_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (TABLE_SIZE * SIZEOF(INT32))); + + for (i = 0; i <= MAXJSAMPLE; i++) { + rgb_y_tab[i+R_Y_OFF] = FIX(0.29900) * i; + rgb_y_tab[i+G_Y_OFF] = FIX(0.58700) * i; + rgb_y_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; + } +} + + +/* + * Convert RGB to grayscale. + */ + +METHODDEF(void) +rgb_gray_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_y_tab; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr0[col]); + g = GETJSAMPLE(inptr1[col]); + b = GETJSAMPLE(inptr2[col]); + /* Y */ + outptr[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + } + } +} + + +/* + * No colorspace change, but conversion from separate-planes + * to interleaved representation. + */ + +METHODDEF(void) +rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + /* We can dispense with GETJSAMPLE() here */ + outptr[RGB_RED] = inptr0[col]; + outptr[RGB_GREEN] = inptr1[col]; + outptr[RGB_BLUE] = inptr2[col]; + outptr += RGB_PIXELSIZE; + } + } +} + + /* * Color conversion for no colorspace change: just copy the data, * converting from separate-planes to interleaved representation. @@ -351,6 +464,9 @@ jinit_color_deconverter (j_decompress_ptr cinfo) /* For color->grayscale conversion, only the Y (0) component is needed */ for (ci = 1; ci < cinfo->num_components; ci++) cinfo->comp_info[ci].component_needed = FALSE; + } else if (cinfo->jpeg_color_space == JCS_RGB) { + cconvert->pub.color_convert = rgb_gray_convert; + build_rgb_y_table(cinfo); } else ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); break; @@ -362,8 +478,8 @@ jinit_color_deconverter (j_decompress_ptr cinfo) build_ycc_rgb_table(cinfo); } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { cconvert->pub.color_convert = gray_rgb_convert; - } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { - cconvert->pub.color_convert = null_convert; + } else if (cinfo->jpeg_color_space == JCS_RGB) { + cconvert->pub.color_convert = rgb_convert; } else ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); break; diff --git a/3rdparty/libjpeg/jdct.h b/3rdparty/libjpeg/jdct.h index 04192a266..360dec80c 100644 --- a/3rdparty/libjpeg/jdct.h +++ b/3rdparty/libjpeg/jdct.h @@ -14,11 +14,16 @@ /* - * A forward DCT routine is given a pointer to a work area of type DCTELEM[]; - * the DCT is to be performed in-place in that buffer. Type DCTELEM is int - * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT - * implementations use an array of type FAST_FLOAT, instead.) - * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE). + * A forward DCT routine is given a pointer to an input sample array and + * a pointer to a work area of type DCTELEM[]; the DCT is to be performed + * in-place in that buffer. Type DCTELEM is int for 8-bit samples, INT32 + * for 12-bit samples. (NOTE: Floating-point DCT implementations use an + * array of type FAST_FLOAT, instead.) + * The input data is to be fetched from the sample array starting at a + * specified column. (Any row offset needed will be applied to the array + * pointer before it is passed to the FDCT code.) + * Note that the number of samples fetched by the FDCT routine is + * DCT_h_scaled_size * DCT_v_scaled_size. * The DCT outputs are returned scaled up by a factor of 8; they therefore * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This * convention improves accuracy in integer implementations and saves some @@ -32,8 +37,12 @@ typedef int DCTELEM; /* 16 or 32 bits is fine */ typedef INT32 DCTELEM; /* must have 32 bits */ #endif -typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data)); -typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data)); +typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data, + JSAMPARRAY sample_data, + JDIMENSION start_col)); +typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data, + JSAMPARRAY sample_data, + JDIMENSION start_col)); /* @@ -44,7 +53,7 @@ typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data)); * sample array starting at a specified column. (Any row offset needed will * be applied to the array pointer before it is passed to the IDCT code.) * Note that the number of samples emitted by the IDCT routine is - * DCT_scaled_size * DCT_scaled_size. + * DCT_h_scaled_size * DCT_v_scaled_size. */ /* typedef inverse_DCT_method_ptr is declared in jpegint.h */ @@ -84,19 +93,143 @@ typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ #define jpeg_fdct_islow jFDislow #define jpeg_fdct_ifast jFDifast #define jpeg_fdct_float jFDfloat +#define jpeg_fdct_7x7 jFD7x7 +#define jpeg_fdct_6x6 jFD6x6 +#define jpeg_fdct_5x5 jFD5x5 +#define jpeg_fdct_4x4 jFD4x4 +#define jpeg_fdct_3x3 jFD3x3 +#define jpeg_fdct_2x2 jFD2x2 +#define jpeg_fdct_1x1 jFD1x1 +#define jpeg_fdct_9x9 jFD9x9 +#define jpeg_fdct_10x10 jFD10x10 +#define jpeg_fdct_11x11 jFD11x11 +#define jpeg_fdct_12x12 jFD12x12 +#define jpeg_fdct_13x13 jFD13x13 +#define jpeg_fdct_14x14 jFD14x14 +#define jpeg_fdct_15x15 jFD15x15 +#define jpeg_fdct_16x16 jFD16x16 +#define jpeg_fdct_16x8 jFD16x8 +#define jpeg_fdct_14x7 jFD14x7 +#define jpeg_fdct_12x6 jFD12x6 +#define jpeg_fdct_10x5 jFD10x5 +#define jpeg_fdct_8x4 jFD8x4 +#define jpeg_fdct_6x3 jFD6x3 +#define jpeg_fdct_4x2 jFD4x2 +#define jpeg_fdct_2x1 jFD2x1 +#define jpeg_fdct_8x16 jFD8x16 +#define jpeg_fdct_7x14 jFD7x14 +#define jpeg_fdct_6x12 jFD6x12 +#define jpeg_fdct_5x10 jFD5x10 +#define jpeg_fdct_4x8 jFD4x8 +#define jpeg_fdct_3x6 jFD3x6 +#define jpeg_fdct_2x4 jFD2x4 +#define jpeg_fdct_1x2 jFD1x2 #define jpeg_idct_islow jRDislow #define jpeg_idct_ifast jRDifast #define jpeg_idct_float jRDfloat +#define jpeg_idct_7x7 jRD7x7 +#define jpeg_idct_6x6 jRD6x6 +#define jpeg_idct_5x5 jRD5x5 #define jpeg_idct_4x4 jRD4x4 +#define jpeg_idct_3x3 jRD3x3 #define jpeg_idct_2x2 jRD2x2 #define jpeg_idct_1x1 jRD1x1 +#define jpeg_idct_9x9 jRD9x9 +#define jpeg_idct_10x10 jRD10x10 +#define jpeg_idct_11x11 jRD11x11 +#define jpeg_idct_12x12 jRD12x12 +#define jpeg_idct_13x13 jRD13x13 +#define jpeg_idct_14x14 jRD14x14 +#define jpeg_idct_15x15 jRD15x15 +#define jpeg_idct_16x16 jRD16x16 +#define jpeg_idct_16x8 jRD16x8 +#define jpeg_idct_14x7 jRD14x7 +#define jpeg_idct_12x6 jRD12x6 +#define jpeg_idct_10x5 jRD10x5 +#define jpeg_idct_8x4 jRD8x4 +#define jpeg_idct_6x3 jRD6x3 +#define jpeg_idct_4x2 jRD4x2 +#define jpeg_idct_2x1 jRD2x1 +#define jpeg_idct_8x16 jRD8x16 +#define jpeg_idct_7x14 jRD7x14 +#define jpeg_idct_6x12 jRD6x12 +#define jpeg_idct_5x10 jRD5x10 +#define jpeg_idct_4x8 jRD4x8 +#define jpeg_idct_3x6 jRD3x8 +#define jpeg_idct_2x4 jRD2x4 +#define jpeg_idct_1x2 jRD1x2 #endif /* NEED_SHORT_EXTERNAL_NAMES */ /* Extern declarations for the forward and inverse DCT routines. */ -EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data)); +EXTERN(void) jpeg_fdct_islow + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_ifast + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_float + JPP((FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_9x9 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_11x11 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_13x13 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_15x15 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_16x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_14x7 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_12x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_10x5 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x3 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x1 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_8x16 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_7x14 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_6x12 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_5x10 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_4x8 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_3x6 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_2x4 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); +EXTERN(void) jpeg_fdct_1x2 + JPP((DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)); EXTERN(void) jpeg_idct_islow JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, @@ -107,15 +240,99 @@ EXTERN(void) jpeg_idct_ifast EXTERN(void) jpeg_idct_float JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); EXTERN(void) jpeg_idct_4x4 JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); EXTERN(void) jpeg_idct_2x2 JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); EXTERN(void) jpeg_idct_1x1 JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_9x9 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_11x11 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_13x13 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_15x15 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_16x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_14x7 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_12x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_10x5 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x3 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_8x16 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_7x14 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_6x12 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_5x10 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x8 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_3x6 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); /* diff --git a/3rdparty/libjpeg/jddctmgr.c b/3rdparty/libjpeg/jddctmgr.c index bbf8d0e92..0ded9d574 100644 --- a/3rdparty/libjpeg/jddctmgr.c +++ b/3rdparty/libjpeg/jddctmgr.c @@ -2,6 +2,7 @@ * jddctmgr.c * * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2002-2010 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -98,22 +99,134 @@ start_pass (j_decompress_ptr cinfo) for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { /* Select the proper IDCT routine for this component's scaling */ - switch (compptr->DCT_scaled_size) { + switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) { #ifdef IDCT_SCALING_SUPPORTED - case 1: + case ((1 << 8) + 1): method_ptr = jpeg_idct_1x1; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ + method = JDCT_ISLOW; /* jidctint uses islow-style table */ break; - case 2: + case ((2 << 8) + 2): method_ptr = jpeg_idct_2x2; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ + method = JDCT_ISLOW; /* jidctint uses islow-style table */ break; - case 4: + case ((3 << 8) + 3): + method_ptr = jpeg_idct_3x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 4): method_ptr = jpeg_idct_4x4; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 5): + method_ptr = jpeg_idct_5x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 6): + method_ptr = jpeg_idct_6x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 7): + method_ptr = jpeg_idct_7x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((9 << 8) + 9): + method_ptr = jpeg_idct_9x9; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 10): + method_ptr = jpeg_idct_10x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((11 << 8) + 11): + method_ptr = jpeg_idct_11x11; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 12): + method_ptr = jpeg_idct_12x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((13 << 8) + 13): + method_ptr = jpeg_idct_13x13; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 14): + method_ptr = jpeg_idct_14x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((15 << 8) + 15): + method_ptr = jpeg_idct_15x15; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 16): + method_ptr = jpeg_idct_16x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((16 << 8) + 8): + method_ptr = jpeg_idct_16x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((14 << 8) + 7): + method_ptr = jpeg_idct_14x7; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((12 << 8) + 6): + method_ptr = jpeg_idct_12x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((10 << 8) + 5): + method_ptr = jpeg_idct_10x5; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 4): + method_ptr = jpeg_idct_8x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 3): + method_ptr = jpeg_idct_6x3; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 2): + method_ptr = jpeg_idct_4x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 1): + method_ptr = jpeg_idct_2x1; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((8 << 8) + 16): + method_ptr = jpeg_idct_8x16; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((7 << 8) + 14): + method_ptr = jpeg_idct_7x14; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((6 << 8) + 12): + method_ptr = jpeg_idct_6x12; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((5 << 8) + 10): + method_ptr = jpeg_idct_5x10; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((4 << 8) + 8): + method_ptr = jpeg_idct_4x8; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((3 << 8) + 6): + method_ptr = jpeg_idct_3x6; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((2 << 8) + 4): + method_ptr = jpeg_idct_2x4; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ + break; + case ((1 << 8) + 2): + method_ptr = jpeg_idct_1x2; + method = JDCT_ISLOW; /* jidctint uses islow-style table */ break; #endif - case DCTSIZE: + case ((DCTSIZE << 8) + DCTSIZE): switch (cinfo->dct_method) { #ifdef DCT_ISLOW_SUPPORTED case JDCT_ISLOW: @@ -139,7 +252,8 @@ start_pass (j_decompress_ptr cinfo) } break; default: - ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size); + ERREXIT2(cinfo, JERR_BAD_DCTSIZE, + compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size); break; } idct->pub.inverse_DCT[ci] = method_ptr; @@ -211,6 +325,7 @@ start_pass (j_decompress_ptr cinfo) * coefficients scaled by scalefactor[row]*scalefactor[col], where * scalefactor[0] = 1 * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 1/8. */ FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; int row, col; @@ -224,7 +339,7 @@ start_pass (j_decompress_ptr cinfo) for (col = 0; col < DCTSIZE; col++) { fmtbl[i] = (FLOAT_MULT_TYPE) ((double) qtbl->quantval[i] * - aanscalefactor[row] * aanscalefactor[col]); + aanscalefactor[row] * aanscalefactor[col] * 0.125); i++; } } diff --git a/3rdparty/libjpeg/jdhuff.c b/3rdparty/libjpeg/jdhuff.c index b5ba39f73..06f92fe47 100644 --- a/3rdparty/libjpeg/jdhuff.c +++ b/3rdparty/libjpeg/jdhuff.c @@ -2,10 +2,12 @@ * jdhuff.c * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2006-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains Huffman entropy decoding routines. + * Both sequential and progressive modes are supported in this single module. * * Much of the complexity here has to do with supporting input suspension. * If the data source module demands suspension, we want to be able to back @@ -17,7 +19,173 @@ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" -#include "jdhuff.h" /* Declarations shared with jdphuff.c */ + + +/* Derived data constructed for each Huffman table */ + +#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ + +typedef struct { + /* Basic tables: (element [0] of each array is unused) */ + INT32 maxcode[18]; /* largest code of length k (-1 if none) */ + /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ + INT32 valoffset[17]; /* huffval[] offset for codes of length k */ + /* valoffset[k] = huffval[] index of 1st symbol of code length k, less + * the smallest code of length k; so given a code of length k, the + * corresponding symbol is huffval[code + valoffset[k]] + */ + + /* Link to public Huffman table (needed only in jpeg_huff_decode) */ + JHUFF_TBL *pub; + + /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of + * the input data stream. If the next Huffman code is no more + * than HUFF_LOOKAHEAD bits long, we can obtain its length and + * the corresponding symbol directly from these tables. + */ + int look_nbits[1< 32 bits on your machine, and shifting/masking longs is + * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE + * appropriately should be a win. Unfortunately we can't define the size + * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) + * because not all machines measure sizeof in 8-bit bytes. + */ + +typedef struct { /* Bitreading state saved across MCUs */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ +} bitread_perm_state; + +typedef struct { /* Bitreading working state within an MCU */ + /* Current data source location */ + /* We need a copy, rather than munging the original, in case of suspension */ + const JOCTET * next_input_byte; /* => next byte to read from source */ + size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ + /* Bit input buffer --- note these values are kept in register variables, + * not in this struct, inside the inner loops. + */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ + /* Pointer needed by jpeg_fill_bit_buffer. */ + j_decompress_ptr cinfo; /* back link to decompress master record */ +} bitread_working_state; + +/* Macros to declare and load/save bitread local variables. */ +#define BITREAD_STATE_VARS \ + register bit_buf_type get_buffer; \ + register int bits_left; \ + bitread_working_state br_state + +#define BITREAD_LOAD_STATE(cinfop,permstate) \ + br_state.cinfo = cinfop; \ + br_state.next_input_byte = cinfop->src->next_input_byte; \ + br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ + get_buffer = permstate.get_buffer; \ + bits_left = permstate.bits_left; + +#define BITREAD_SAVE_STATE(cinfop,permstate) \ + cinfop->src->next_input_byte = br_state.next_input_byte; \ + cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ + permstate.get_buffer = get_buffer; \ + permstate.bits_left = bits_left + +/* + * These macros provide the in-line portion of bit fetching. + * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer + * before using GET_BITS, PEEK_BITS, or DROP_BITS. + * The variables get_buffer and bits_left are assumed to be locals, + * but the state struct might not be (jpeg_huff_decode needs this). + * CHECK_BIT_BUFFER(state,n,action); + * Ensure there are N bits in get_buffer; if suspend, take action. + * val = GET_BITS(n); + * Fetch next N bits. + * val = PEEK_BITS(n); + * Fetch next N bits without removing them from the buffer. + * DROP_BITS(n); + * Discard next N bits. + * The value N should be a simple variable, not an expression, because it + * is evaluated multiple times. + */ + +#define CHECK_BIT_BUFFER(state,nbits,action) \ + { if (bits_left < (nbits)) { \ + if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ + { action; } \ + get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } + +#define GET_BITS(nbits) \ + (((int) (get_buffer >> (bits_left -= (nbits)))) & BIT_MASK(nbits)) + +#define PEEK_BITS(nbits) \ + (((int) (get_buffer >> (bits_left - (nbits)))) & BIT_MASK(nbits)) + +#define DROP_BITS(nbits) \ + (bits_left -= (nbits)) + + +/* + * Code for extracting next Huffman-coded symbol from input bit stream. + * Again, this is time-critical and we make the main paths be macros. + * + * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits + * without looping. Usually, more than 95% of the Huffman codes will be 8 + * or fewer bits long. The few overlength codes are handled with a loop, + * which need not be inline code. + * + * Notes about the HUFF_DECODE macro: + * 1. Near the end of the data segment, we may fail to get enough bits + * for a lookahead. In that case, we do it the hard way. + * 2. If the lookahead table contains no entry, the next code must be + * more than HUFF_LOOKAHEAD bits long. + * 3. jpeg_huff_decode returns -1 if forced to suspend. + */ + +#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ +{ register int nb, look; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + nb = 1; goto slowlabel; \ + } \ + } \ + look = PEEK_BITS(HUFF_LOOKAHEAD); \ + if ((nb = htbl->look_nbits[look]) != 0) { \ + DROP_BITS(nb); \ + result = htbl->look_sym[look]; \ + } else { \ + nb = HUFF_LOOKAHEAD+1; \ +slowlabel: \ + if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ + { failaction; } \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + } \ +} /* @@ -28,7 +196,8 @@ */ typedef struct { - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ } savable_state; /* This macro is to work around compilers with missing or broken @@ -41,7 +210,8 @@ typedef struct { #else #if MAX_COMPS_IN_SCAN == 4 #define ASSIGN_STATE(dest,src) \ - ((dest).last_dc_val[0] = (src).last_dc_val[0], \ + ((dest).EOBRUN = (src).EOBRUN, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ (dest).last_dc_val[1] = (src).last_dc_val[1], \ (dest).last_dc_val[2] = (src).last_dc_val[2], \ (dest).last_dc_val[3] = (src).last_dc_val[3]) @@ -59,8 +229,18 @@ typedef struct { savable_state saved; /* Other state at start of MCU */ /* These fields are NOT loaded into local working state. */ + boolean insufficient_data; /* set TRUE after emitting warning */ unsigned int restarts_to_go; /* MCUs left in this restart interval */ + /* Following two fields used only in progressive mode */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; + + d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ + + /* Following fields used only in sequential mode */ + /* Pointers to derived tables (these workspaces have image lifespan) */ d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; @@ -71,81 +251,75 @@ typedef struct { d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU]; d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU]; /* Whether we care about the DC and AC coefficient values for each block */ - boolean dc_needed[D_MAX_BLOCKS_IN_MCU]; - boolean ac_needed[D_MAX_BLOCKS_IN_MCU]; + int coef_limit[D_MAX_BLOCKS_IN_MCU]; } huff_entropy_decoder; typedef huff_entropy_decoder * huff_entropy_ptr; -/* - * Initialize for a Huffman-compressed scan. - */ +static const int jpeg_zigzag_order[8][8] = { + { 0, 1, 5, 6, 14, 15, 27, 28 }, + { 2, 4, 7, 13, 16, 26, 29, 42 }, + { 3, 8, 12, 17, 25, 30, 41, 43 }, + { 9, 11, 18, 24, 31, 40, 44, 53 }, + { 10, 19, 23, 32, 39, 45, 52, 54 }, + { 20, 22, 33, 38, 46, 51, 55, 60 }, + { 21, 34, 37, 47, 50, 56, 59, 61 }, + { 35, 36, 48, 49, 57, 58, 62, 63 } +}; -METHODDEF(void) -start_pass_huff_decoder (j_decompress_ptr cinfo) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, blkn, dctbl, actbl; - jpeg_component_info * compptr; +static const int jpeg_zigzag_order7[7][7] = { + { 0, 1, 5, 6, 14, 15, 27 }, + { 2, 4, 7, 13, 16, 26, 28 }, + { 3, 8, 12, 17, 25, 29, 38 }, + { 9, 11, 18, 24, 30, 37, 39 }, + { 10, 19, 23, 31, 36, 40, 45 }, + { 20, 22, 32, 35, 41, 44, 46 }, + { 21, 33, 34, 42, 43, 47, 48 } +}; - /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. - * This ought to be an error condition, but we make it a warning because - * there are some baseline files out there with all zeroes in these bytes. - */ - if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 || - cinfo->Ah != 0 || cinfo->Al != 0) - WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); +static const int jpeg_zigzag_order6[6][6] = { + { 0, 1, 5, 6, 14, 15 }, + { 2, 4, 7, 13, 16, 25 }, + { 3, 8, 12, 17, 24, 26 }, + { 9, 11, 18, 23, 27, 32 }, + { 10, 19, 22, 28, 31, 33 }, + { 20, 21, 29, 30, 34, 35 } +}; - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - /* Compute derived values for Huffman tables */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl, - & entropy->dc_derived_tbls[dctbl]); - jpeg_make_d_derived_tbl(cinfo, FALSE, actbl, - & entropy->ac_derived_tbls[actbl]); - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } +static const int jpeg_zigzag_order5[5][5] = { + { 0, 1, 5, 6, 14 }, + { 2, 4, 7, 13, 15 }, + { 3, 8, 12, 16, 21 }, + { 9, 11, 17, 20, 22 }, + { 10, 18, 19, 23, 24 } +}; - /* Precalculate decoding info for each block in an MCU of this scan */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - /* Precalculate which table to use for each block */ - entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; - entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; - /* Decide whether we really care about the coefficient values */ - if (compptr->component_needed) { - entropy->dc_needed[blkn] = TRUE; - /* we don't need the ACs if producing a 1/8th-size image */ - entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1); - } else { - entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE; - } - } +static const int jpeg_zigzag_order4[4][4] = { + { 0, 1, 5, 6 }, + { 2, 4, 7, 12 }, + { 3, 8, 11, 13 }, + { 9, 10, 14, 15 } +}; - /* Initialize bitread state variables */ - entropy->bitstate.bits_left = 0; - entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ - entropy->pub.insufficient_data = FALSE; +static const int jpeg_zigzag_order3[3][3] = { + { 0, 1, 5 }, + { 2, 4, 6 }, + { 3, 7, 8 } +}; - /* Initialize restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; -} +static const int jpeg_zigzag_order2[2][2] = { + { 0, 1 }, + { 2, 3 } +}; /* * Compute the derived values for a Huffman table. * This routine also performs some validation checks on the table. - * - * Note this is also used by jdphuff.c. */ -GLOBAL(void) +LOCAL(void) jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, d_derived_tbl ** pdtbl) { @@ -267,8 +441,7 @@ jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, /* - * Out-of-line code for bit fetching (shared with jdphuff.c). - * See jdhuff.h for info about usage. + * Out-of-line code for bit fetching. * Note: current values of get_buffer and bits_left are passed as parameters, * but are returned in the corresponding fields of the state struct. * @@ -288,7 +461,7 @@ jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, #endif -GLOBAL(boolean) +LOCAL(boolean) jpeg_fill_bit_buffer (bitread_working_state * state, register bit_buf_type get_buffer, register int bits_left, int nbits) @@ -369,9 +542,9 @@ jpeg_fill_bit_buffer (bitread_working_state * state, * We use a nonvolatile flag to ensure that only one warning message * appears per data segment. */ - if (! cinfo->entropy->insufficient_data) { + if (! ((huff_entropy_ptr) cinfo->entropy)->insufficient_data) { WARNMS(cinfo, JWRN_HIT_MARKER); - cinfo->entropy->insufficient_data = TRUE; + ((huff_entropy_ptr) cinfo->entropy)->insufficient_data = TRUE; } /* Fill the buffer with zero bits */ get_buffer <<= MIN_GET_BITS - bits_left; @@ -390,11 +563,32 @@ jpeg_fill_bit_buffer (bitread_working_state * state, /* - * Out-of-line code for Huffman code decoding. - * See jdhuff.h for info about usage. + * Figure F.12: extend sign bit. + * On some machines, a shift and sub will be faster than a table lookup. */ -GLOBAL(int) +#ifdef AVOID_TABLES + +#define BIT_MASK(nbits) ((1<<(nbits))-1) +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) - ((1<<(s))-1) : (x)) + +#else + +#define BIT_MASK(nbits) bmask[nbits] +#define HUFF_EXTEND(x,s) ((x) <= bmask[(s) - 1] ? (x) - bmask[s] : (x)) + +static const int bmask[16] = /* bmask[n] is mask for n rightmost bits */ + { 0, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, + 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF }; + +#endif /* AVOID_TABLES */ + + +/* + * Out-of-line code for Huffman code decoding. + */ + +LOCAL(int) jpeg_huff_decode (bitread_working_state * state, register bit_buf_type get_buffer, register int bits_left, d_derived_tbl * htbl, int min_bits) @@ -433,32 +627,6 @@ jpeg_huff_decode (bitread_working_state * state, } -/* - * Figure F.12: extend sign bit. - * On some machines, a shift and add will be faster than a table lookup. - */ - -#ifdef AVOID_TABLES - -#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) - -#else - -#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) - -static const int extend_test[16] = /* entry n is 2**(n-1) */ - { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; - -static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ - { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, - ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, - ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, - ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; - -#endif /* AVOID_TABLES */ - - /* * Check for a restart marker & resynchronize decoder. * Returns FALSE if must suspend. @@ -482,6 +650,8 @@ process_restart (j_decompress_ptr cinfo) /* Re-initialize DC predictions to 0 */ for (ci = 0; ci < cinfo->comps_in_scan; ci++) entropy->saved.last_dc_val[ci] = 0; + /* Re-init EOB run count, too */ + entropy->saved.EOBRUN = 0; /* Reset restart counter */ entropy->restarts_to_go = cinfo->restart_interval; @@ -492,25 +662,525 @@ process_restart (j_decompress_ptr cinfo) * leaving the flag set. */ if (cinfo->unread_marker == 0) - entropy->pub.insufficient_data = FALSE; + entropy->insufficient_data = FALSE; return TRUE; } /* - * Decode and return one MCU's worth of Huffman-compressed coefficients. + * Huffman MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * Huffman-compressed coefficients. * The coefficients are reordered from zigzag order into natural array order, * but are not dequantized. * * The i'th block of the MCU is stored into the block pointed to by - * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER. + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. * (Wholesale zeroing is usually a little faster than retail...) * - * Returns FALSE if data source requested suspension. In that case no + * We return FALSE if data source requested suspension. In that case no * changes have been made to permanent state. (Exception: some output * coefficients may already have been assigned. This is harmless for - * this module, since we'll just re-assign them on the next call.) + * spectral selection, since we'll just re-assign them on the next call. + * Successive approximation AC refinement has to be more careful, however.) + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int Al = cinfo->Al; + register int s, r; + int blkn, ci; + JBLOCKROW block; + BITREAD_STATE_VARS; + savable_state state; + d_derived_tbl * tbl; + jpeg_component_info * compptr; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + tbl = entropy->derived_tbls[compptr->dc_tbl_no]; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + HUFF_DECODE(s, br_state, tbl, return FALSE, label1); + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + + /* Convert DC difference to actual value, update last_dc_val */ + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (s << Al); + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, Al; + const int * natural_order; + JBLOCKROW block; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + Se = cinfo->Se; + Al = cinfo->Al; + natural_order = cinfo->natural_order; + + /* Load up working state. + * We can avoid loading/saving bitread state if in an EOB run. + */ + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + + if (EOBRUN > 0) /* if it's a band of zeroes... */ + EOBRUN--; /* ...process it now (we do nothing) */ + else { + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + for (k = cinfo->Ss; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, return FALSE, label2); + r = s >> 4; + s &= 15; + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[natural_order[k]] = (JCOEF) (s << Al); + } else { + if (r == 15) { /* ZRL */ + k += 15; /* skip 15 zeroes in band */ + } else { /* EOBr, run length is 2^r + appended bits */ + EOBRUN = 1 << r; + if (r) { /* EOBr, r > 0 */ + CHECK_BIT_BUFFER(br_state, r, return FALSE); + r = GET_BITS(r); + EOBRUN += r; + } + EOBRUN--; /* this band is processed at this moment */ + break; /* force end-of-band */ + } + } + } + + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + } + + /* Completed MCU, so update state */ + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + int blkn; + JBLOCKROW block; + BITREAD_STATE_VARS; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* Not worth the cycles to check insufficient_data here, + * since we will not change the data anyway if we read zeroes. + */ + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* Encoded data is simply the next bit of the two's-complement DC value */ + CHECK_BIT_BUFFER(br_state, 1, return FALSE); + if (GET_BITS(1)) + (*block)[0] |= p1; + /* Note: since we use |=, repeating the assignment later is safe */ + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + register int s, k, r; + unsigned int EOBRUN; + int Se, p1, m1; + const int * natural_order; + JBLOCKROW block; + JCOEFPTR thiscoef; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + int num_newnz; + int newnz_pos[DCTSIZE2]; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, don't modify the MCU. + */ + if (! entropy->insufficient_data) { + + Se = cinfo->Se; + p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + natural_order = cinfo->natural_order; + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + /* If we are forced to suspend, we must undo the assignments to any newly + * nonzero coefficients in the block, because otherwise we'd get confused + * next time about which coefficients were already nonzero. + * But we need not undo addition of bits to already-nonzero coefficients; + * instead, we can test the current bit to see if we already did it. + */ + num_newnz = 0; + + /* initialize coefficient loop counter to start of band */ + k = cinfo->Ss; + + if (EOBRUN == 0) { + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, goto undoit, label3); + r = s >> 4; + s &= 15; + if (s) { + if (s != 1) /* size of new coef should always be 1 */ + WARNMS(cinfo, JWRN_HUFF_BAD_CODE); + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) + s = p1; /* newly nonzero coef is positive */ + else + s = m1; /* newly nonzero coef is negative */ + } else { + if (r != 15) { + EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ + if (r) { + CHECK_BIT_BUFFER(br_state, r, goto undoit); + r = GET_BITS(r); + EOBRUN += r; + } + break; /* rest of block is handled by EOB logic */ + } + /* note s = 0 for processing ZRL */ + } + /* Advance over already-nonzero coefs and r still-zero coefs, + * appending correction bits to the nonzeroes. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + do { + thiscoef = *block + natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } else { + if (--r < 0) + break; /* reached target zero coefficient */ + } + k++; + } while (k <= Se); + if (s) { + int pos = natural_order[k]; + /* Output newly nonzero coefficient */ + (*block)[pos] = (JCOEF) s; + /* Remember its position in case we have to suspend */ + newnz_pos[num_newnz++] = pos; + } + } + } + + if (EOBRUN > 0) { + /* Scan any remaining coefficient positions after the end-of-band + * (the last newly nonzero coefficient, if any). Append a correction + * bit to each already-nonzero coefficient. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + for (; k <= Se; k++) { + thiscoef = *block + natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } + } + /* Count one block completed in EOB run */ + EOBRUN--; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; + +undoit: + /* Re-zero any output coefficients that we made newly nonzero */ + while (num_newnz > 0) + (*block)[newnz_pos[--num_newnz]] = 0; + + return FALSE; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * partial blocks. + */ + +METHODDEF(boolean) +decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + const int * natural_order; + int Se, blkn; + BITREAD_STATE_VARS; + savable_state state; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->insufficient_data) { + + natural_order = cinfo->natural_order; + Se = cinfo->lim_Se; + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + JBLOCKROW block = MCU_data[blkn]; + d_derived_tbl * htbl; + register int s, k, r; + int coef_limit, ci; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); + + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { + /* Convert DC difference to actual value, update last_dc_val */ + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient */ + (*block)[0] = (JCOEF) s; + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label2); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Output coefficient in natural (dezigzagged) order. + * Note: the extra entries in natural_order[] will save us + * if k > Se, which could happen if the data is corrupted. + */ + (*block)[natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + goto EndOfBlock; + k += 15; + } + } + } else { + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } + } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + EndOfBlock: ; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * Decode one MCU's worth of Huffman-compressed coefficients, + * full-size blocks. */ METHODDEF(boolean) @@ -531,7 +1201,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) /* If we've run out of data, just leave the MCU set to zeroes. * This way, we return uniform gray for the remainder of the segment. */ - if (! entropy->pub.insufficient_data) { + if (! entropy->insufficient_data) { /* Load up working state */ BITREAD_LOAD_STATE(cinfo,entropy->bitstate); @@ -541,39 +1211,40 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { JBLOCKROW block = MCU_data[blkn]; - d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn]; - d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn]; + d_derived_tbl * htbl; register int s, k, r; + int coef_limit, ci; /* Decode a single block's worth of coefficients */ /* Section F.2.2.1: decode the DC coefficient difference */ - HUFF_DECODE(s, br_state, dctbl, return FALSE, label1); - if (s) { - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - } + htbl = entropy->dc_cur_tbls[blkn]; + HUFF_DECODE(s, br_state, htbl, return FALSE, label1); - if (entropy->dc_needed[blkn]) { + htbl = entropy->ac_cur_tbls[blkn]; + k = 1; + coef_limit = entropy->coef_limit[blkn]; + if (coef_limit) { /* Convert DC difference to actual value, update last_dc_val */ - int ci = cinfo->MCU_membership[blkn]; + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + ci = cinfo->MCU_membership[blkn]; s += state.last_dc_val[ci]; state.last_dc_val[ci] = s; - /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */ + /* Output the DC coefficient */ (*block)[0] = (JCOEF) s; - } - - if (entropy->ac_needed[blkn]) { /* Section F.2.2.2: decode the AC coefficients */ /* Since zeroes are skipped, output area must be cleared beforehand */ - for (k = 1; k < DCTSIZE2; k++) { - HUFF_DECODE(s, br_state, actbl, return FALSE, label2); - + for (; k < coef_limit; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label2); + r = s >> 4; s &= 15; - + if (s) { k += r; CHECK_BIT_BUFFER(br_state, s, return FALSE); @@ -586,33 +1257,37 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) (*block)[jpeg_natural_order[k]] = (JCOEF) s; } else { if (r != 15) - break; + goto EndOfBlock; k += 15; } } - } else { - - /* Section F.2.2.2: decode the AC coefficients */ - /* In this path we just discard the values */ - for (k = 1; k < DCTSIZE2; k++) { - HUFF_DECODE(s, br_state, actbl, return FALSE, label3); - - r = s >> 4; - s &= 15; - - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - DROP_BITS(s); - } else { - if (r != 15) - break; - k += 15; - } + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); } - } + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, htbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + EndOfBlock: ; } /* Completed MCU, so update state */ @@ -627,6 +1302,205 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) } +/* + * Initialize for a Huffman-compressed scan. + */ + +METHODDEF(void) +start_pass_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, blkn, tbl, i; + jpeg_component_info * compptr; + + if (cinfo->progressive_mode) { + /* Validate progressive scan parameters */ + if (cinfo->Ss == 0) { + if (cinfo->Se != 0) + goto bad; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se) + goto bad; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + goto bad; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Ah-1 != cinfo->Al) + goto bad; + } + if (cinfo->Al > 13) { /* need not check for < 0 */ + /* Arguably the maximum Al value should be less than 13 for 8-bit precision, + * but the spec doesn't say so, and we try to be liberal about what we + * accept. Note: large Al values could result in out-of-range DC + * coefficients during early scans, leading to bizarre displays due to + * overflows in the IDCT math. But we won't crash. + */ + bad: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + } + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; + int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (cinfo->Ss == 0) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Make sure requested tables are present, and compute derived tables. + * We may build same derived table more than once, but it's not expensive. + */ + if (cinfo->Ss == 0) { + if (cinfo->Ah == 0) { /* DC refinement needs no table */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->derived_tbls[tbl]); + } + } else { + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->derived_tbls[tbl]); + /* remember the single active table */ + entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Initialize private state variables */ + entropy->saved.EOBRUN = 0; + } else { + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning because + * there are some baseline files out there with all zeroes in these bytes. + */ + if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || + ((cinfo->is_baseline || cinfo->Se < DCTSIZE2) && + cinfo->Se != cinfo->lim_Se)) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + + /* Select MCU decoding routine */ + /* We retain the hard-coded case for full-size blocks. + * This is not necessary, but it appears that this version is slightly + * more performant in the given implementation. + * With an improved implementation we would prefer a single optimized + * function. + */ + if (cinfo->lim_Se != DCTSIZE2-1) + entropy->pub.decode_mcu = decode_mcu_sub; + else + entropy->pub.decode_mcu = decode_mcu; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->dc_derived_tbls[tbl]); + if (cinfo->lim_Se) { /* AC needs no table when not present */ + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->ac_derived_tbls[tbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Precalculate decoding info for each block in an MCU of this scan */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + /* Precalculate which table to use for each block */ + entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; + entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; + /* Decide whether we really care about the coefficient values */ + if (compptr->component_needed) { + ci = compptr->DCT_v_scaled_size; + i = compptr->DCT_h_scaled_size; + switch (cinfo->lim_Se) { + case (1*1-1): + entropy->coef_limit[blkn] = 1; + break; + case (2*2-1): + if (ci <= 0 || ci > 2) ci = 2; + if (i <= 0 || i > 2) i = 2; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order2[ci - 1][i - 1]; + break; + case (3*3-1): + if (ci <= 0 || ci > 3) ci = 3; + if (i <= 0 || i > 3) i = 3; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order3[ci - 1][i - 1]; + break; + case (4*4-1): + if (ci <= 0 || ci > 4) ci = 4; + if (i <= 0 || i > 4) i = 4; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order4[ci - 1][i - 1]; + break; + case (5*5-1): + if (ci <= 0 || ci > 5) ci = 5; + if (i <= 0 || i > 5) i = 5; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order5[ci - 1][i - 1]; + break; + case (6*6-1): + if (ci <= 0 || ci > 6) ci = 6; + if (i <= 0 || i > 6) i = 6; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order6[ci - 1][i - 1]; + break; + case (7*7-1): + if (ci <= 0 || ci > 7) ci = 7; + if (i <= 0 || i > 7) i = 7; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order7[ci - 1][i - 1]; + break; + default: + if (ci <= 0 || ci > 8) ci = 8; + if (i <= 0 || i > 8) i = 8; + entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1]; + break; + } + } else { + entropy->coef_limit[blkn] = 0; + } + } + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->insufficient_data = FALSE; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + /* * Module initialization routine for Huffman entropy decoding. */ @@ -642,10 +1516,26 @@ jinit_huff_decoder (j_decompress_ptr cinfo) SIZEOF(huff_entropy_decoder)); cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; entropy->pub.start_pass = start_pass_huff_decoder; - entropy->pub.decode_mcu = decode_mcu; - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + if (cinfo->progressive_mode) { + /* Create progression status table */ + int *coef_bit_ptr, ci; + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; + + /* Mark derived tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->derived_tbls[i] = NULL; + } + } else { + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + } } } diff --git a/3rdparty/libjpeg/jdhuff.h b/3rdparty/libjpeg/jdhuff.h deleted file mode 100644 index ae19b6caf..000000000 --- a/3rdparty/libjpeg/jdhuff.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * jdhuff.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy decoding routines - * that are shared between the sequential decoder (jdhuff.c) and the - * progressive decoder (jdphuff.c). No other modules need to see these. - */ - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_d_derived_tbl jMkDDerived -#define jpeg_fill_bit_buffer jFilBitBuf -#define jpeg_huff_decode jHufDecode -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Derived data constructed for each Huffman table */ - -#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ - -typedef struct { - /* Basic tables: (element [0] of each array is unused) */ - INT32 maxcode[18]; /* largest code of length k (-1 if none) */ - /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ - INT32 valoffset[17]; /* huffval[] offset for codes of length k */ - /* valoffset[k] = huffval[] index of 1st symbol of code length k, less - * the smallest code of length k; so given a code of length k, the - * corresponding symbol is huffval[code + valoffset[k]] - */ - - /* Link to public Huffman table (needed only in jpeg_huff_decode) */ - JHUFF_TBL *pub; - - /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of - * the input data stream. If the next Huffman code is no more - * than HUFF_LOOKAHEAD bits long, we can obtain its length and - * the corresponding symbol directly from these tables. - */ - int look_nbits[1< 32 bits on your machine, and shifting/masking longs is - * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE - * appropriately should be a win. Unfortunately we can't define the size - * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) - * because not all machines measure sizeof in 8-bit bytes. - */ - -typedef struct { /* Bitreading state saved across MCUs */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ -} bitread_perm_state; - -typedef struct { /* Bitreading working state within an MCU */ - /* Current data source location */ - /* We need a copy, rather than munging the original, in case of suspension */ - const JOCTET * next_input_byte; /* => next byte to read from source */ - size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ - /* Bit input buffer --- note these values are kept in register variables, - * not in this struct, inside the inner loops. - */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ - /* Pointer needed by jpeg_fill_bit_buffer. */ - j_decompress_ptr cinfo; /* back link to decompress master record */ -} bitread_working_state; - -/* Macros to declare and load/save bitread local variables. */ -#define BITREAD_STATE_VARS \ - register bit_buf_type get_buffer; \ - register int bits_left; \ - bitread_working_state br_state - -#define BITREAD_LOAD_STATE(cinfop,permstate) \ - br_state.cinfo = cinfop; \ - br_state.next_input_byte = cinfop->src->next_input_byte; \ - br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ - get_buffer = permstate.get_buffer; \ - bits_left = permstate.bits_left; - -#define BITREAD_SAVE_STATE(cinfop,permstate) \ - cinfop->src->next_input_byte = br_state.next_input_byte; \ - cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ - permstate.get_buffer = get_buffer; \ - permstate.bits_left = bits_left - -/* - * These macros provide the in-line portion of bit fetching. - * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer - * before using GET_BITS, PEEK_BITS, or DROP_BITS. - * The variables get_buffer and bits_left are assumed to be locals, - * but the state struct might not be (jpeg_huff_decode needs this). - * CHECK_BIT_BUFFER(state,n,action); - * Ensure there are N bits in get_buffer; if suspend, take action. - * val = GET_BITS(n); - * Fetch next N bits. - * val = PEEK_BITS(n); - * Fetch next N bits without removing them from the buffer. - * DROP_BITS(n); - * Discard next N bits. - * The value N should be a simple variable, not an expression, because it - * is evaluated multiple times. - */ - -#define CHECK_BIT_BUFFER(state,nbits,action) \ - { if (bits_left < (nbits)) { \ - if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ - { action; } \ - get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } - -#define GET_BITS(nbits) \ - (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1)) - -#define PEEK_BITS(nbits) \ - (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1)) - -#define DROP_BITS(nbits) \ - (bits_left -= (nbits)) - -/* Load up the bit buffer to a depth of at least nbits */ -EXTERN(boolean) jpeg_fill_bit_buffer - JPP((bitread_working_state * state, register bit_buf_type get_buffer, - register int bits_left, int nbits)); - - -/* - * Code for extracting next Huffman-coded symbol from input bit stream. - * Again, this is time-critical and we make the main paths be macros. - * - * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits - * without looping. Usually, more than 95% of the Huffman codes will be 8 - * or fewer bits long. The few overlength codes are handled with a loop, - * which need not be inline code. - * - * Notes about the HUFF_DECODE macro: - * 1. Near the end of the data segment, we may fail to get enough bits - * for a lookahead. In that case, we do it the hard way. - * 2. If the lookahead table contains no entry, the next code must be - * more than HUFF_LOOKAHEAD bits long. - * 3. jpeg_huff_decode returns -1 if forced to suspend. - */ - -#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ -{ register int nb, look; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - nb = 1; goto slowlabel; \ - } \ - } \ - look = PEEK_BITS(HUFF_LOOKAHEAD); \ - if ((nb = htbl->look_nbits[look]) != 0) { \ - DROP_BITS(nb); \ - result = htbl->look_sym[look]; \ - } else { \ - nb = HUFF_LOOKAHEAD+1; \ -slowlabel: \ - if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ - { failaction; } \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - } \ -} - -/* Out-of-line case for Huffman code fetching */ -EXTERN(int) jpeg_huff_decode - JPP((bitread_working_state * state, register bit_buf_type get_buffer, - register int bits_left, d_derived_tbl * htbl, int min_bits)); diff --git a/3rdparty/libjpeg/jdinput.c b/3rdparty/libjpeg/jdinput.c index 0c2ac8f12..2c5c717b9 100644 --- a/3rdparty/libjpeg/jdinput.c +++ b/3rdparty/libjpeg/jdinput.c @@ -2,13 +2,14 @@ * jdinput.c * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains input control logic for the JPEG decompressor. * These routines are concerned with controlling the decompressor's input * processing (marker reading and coefficient decoding). The actual input - * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c. + * reading is done in jdmarker.c, jdhuff.c, and jdarith.c. */ #define JPEG_INTERNALS @@ -21,7 +22,7 @@ typedef struct { struct jpeg_input_controller pub; /* public fields */ - boolean inheaders; /* TRUE until first SOS is reached */ + int inheaders; /* Nonzero until first SOS is reached */ } my_input_controller; typedef my_input_controller * my_inputctl_ptr; @@ -35,6 +36,174 @@ METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); * Routines to calculate various quantities related to the size of the image. */ + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + */ + +GLOBAL(void) +jpeg_core_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase. + * This function is used for transcoding and full decompression. + */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; + + /* Compute actual output image dimensions and DCT scaling choices. */ + if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) { + /* Provide 1/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 1; + cinfo->min_DCT_v_scaled_size = 1; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) { + /* Provide 2/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 2; + cinfo->min_DCT_v_scaled_size = 2; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 3) { + /* Provide 3/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 3L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 3L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 3; + cinfo->min_DCT_v_scaled_size = 3; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) { + /* Provide 4/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 4; + cinfo->min_DCT_v_scaled_size = 4; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 5) { + /* Provide 5/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 5L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 5L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 5; + cinfo->min_DCT_v_scaled_size = 5; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 6) { + /* Provide 6/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 6L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 6L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 6; + cinfo->min_DCT_v_scaled_size = 6; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 7) { + /* Provide 7/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 7L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 7L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 7; + cinfo->min_DCT_v_scaled_size = 7; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) { + /* Provide 8/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 8; + cinfo->min_DCT_v_scaled_size = 8; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 9) { + /* Provide 9/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 9L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 9L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 9; + cinfo->min_DCT_v_scaled_size = 9; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 10) { + /* Provide 10/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 10L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 10L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 10; + cinfo->min_DCT_v_scaled_size = 10; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 11) { + /* Provide 11/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 11L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 11L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 11; + cinfo->min_DCT_v_scaled_size = 11; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 12) { + /* Provide 12/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 12L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 12L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 12; + cinfo->min_DCT_v_scaled_size = 12; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 13) { + /* Provide 13/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 13L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 13L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 13; + cinfo->min_DCT_v_scaled_size = 13; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 14) { + /* Provide 14/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 14L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 14L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 14; + cinfo->min_DCT_v_scaled_size = 14; + } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 15) { + /* Provide 15/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 15L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 15L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 15; + cinfo->min_DCT_v_scaled_size = 15; + } else { + /* Provide 16/block_size scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * 16L, (long) cinfo->block_size); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * 16L, (long) cinfo->block_size); + cinfo->min_DCT_h_scaled_size = 16; + cinfo->min_DCT_v_scaled_size = 16; + } + + /* Recompute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size; + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size; + } + +#else /* !IDCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + /* jdinput.c has already initialized DCT_scaled_size, + * and has computed unscaled downsampled_width and downsampled_height. + */ + +#endif /* IDCT_SCALING_SUPPORTED */ +} + + LOCAL(void) initial_setup (j_decompress_ptr cinfo) /* Called once, when first SOS marker is reached */ @@ -70,23 +239,121 @@ initial_setup (j_decompress_ptr cinfo) compptr->v_samp_factor); } - /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. - * In the full decompressor, this will be overridden by jdmaster.c; - * but in the transcoder, jdmaster.c is not used, so we must do it here. + /* Derive block_size, natural_order, and lim_Se */ + if (cinfo->is_baseline || (cinfo->progressive_mode && + cinfo->comps_in_scan)) { /* no pseudo SOS marker */ + cinfo->block_size = DCTSIZE; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + } else + switch (cinfo->Se) { + case (1*1-1): + cinfo->block_size = 1; + cinfo->natural_order = jpeg_natural_order; /* not needed */ + cinfo->lim_Se = cinfo->Se; + break; + case (2*2-1): + cinfo->block_size = 2; + cinfo->natural_order = jpeg_natural_order2; + cinfo->lim_Se = cinfo->Se; + break; + case (3*3-1): + cinfo->block_size = 3; + cinfo->natural_order = jpeg_natural_order3; + cinfo->lim_Se = cinfo->Se; + break; + case (4*4-1): + cinfo->block_size = 4; + cinfo->natural_order = jpeg_natural_order4; + cinfo->lim_Se = cinfo->Se; + break; + case (5*5-1): + cinfo->block_size = 5; + cinfo->natural_order = jpeg_natural_order5; + cinfo->lim_Se = cinfo->Se; + break; + case (6*6-1): + cinfo->block_size = 6; + cinfo->natural_order = jpeg_natural_order6; + cinfo->lim_Se = cinfo->Se; + break; + case (7*7-1): + cinfo->block_size = 7; + cinfo->natural_order = jpeg_natural_order7; + cinfo->lim_Se = cinfo->Se; + break; + case (8*8-1): + cinfo->block_size = 8; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (9*9-1): + cinfo->block_size = 9; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (10*10-1): + cinfo->block_size = 10; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (11*11-1): + cinfo->block_size = 11; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (12*12-1): + cinfo->block_size = 12; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (13*13-1): + cinfo->block_size = 13; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (14*14-1): + cinfo->block_size = 14; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (15*15-1): + cinfo->block_size = 15; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + case (16*16-1): + cinfo->block_size = 16; + cinfo->natural_order = jpeg_natural_order; + cinfo->lim_Se = DCTSIZE2-1; + break; + default: + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + break; + } + + /* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size. + * In the full decompressor, + * this will be overridden by jpeg_calc_output_dimensions in jdmaster.c; + * but in the transcoder, + * jpeg_calc_output_dimensions is not used, so we must do it here. */ - cinfo->min_DCT_scaled_size = DCTSIZE; + cinfo->min_DCT_h_scaled_size = cinfo->block_size; + cinfo->min_DCT_v_scaled_size = cinfo->block_size; /* Compute dimensions of components */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - compptr->DCT_scaled_size = DCTSIZE; + compptr->DCT_h_scaled_size = cinfo->block_size; + compptr->DCT_v_scaled_size = cinfo->block_size; /* Size in DCT blocks */ compptr->width_in_blocks = (JDIMENSION) jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) (cinfo->max_h_samp_factor * DCTSIZE)); + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); compptr->height_in_blocks = (JDIMENSION) jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) (cinfo->max_v_samp_factor * DCTSIZE)); + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); /* downsampled_width and downsampled_height will also be overridden by * jdmaster.c if we are doing full decompression. The transcoder library * doesn't use these values, but the calling application might. @@ -107,7 +374,7 @@ initial_setup (j_decompress_ptr cinfo) /* Compute number of fully interleaved MCU rows. */ cinfo->total_iMCU_rows = (JDIMENSION) jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); /* Decide whether file contains multiple scans */ if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) @@ -138,7 +405,7 @@ per_scan_setup (j_decompress_ptr cinfo) compptr->MCU_width = 1; compptr->MCU_height = 1; compptr->MCU_blocks = 1; - compptr->MCU_sample_width = compptr->DCT_scaled_size; + compptr->MCU_sample_width = compptr->DCT_h_scaled_size; compptr->last_col_width = 1; /* For noninterleaved scans, it is convenient to define last_row_height * as the number of block rows present in the last iMCU row. @@ -161,10 +428,10 @@ per_scan_setup (j_decompress_ptr cinfo) /* Overall image size in MCUs */ cinfo->MCUs_per_row = (JDIMENSION) jdiv_round_up((long) cinfo->image_width, - (long) (cinfo->max_h_samp_factor*DCTSIZE)); + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); cinfo->MCU_rows_in_scan = (JDIMENSION) jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); cinfo->blocks_in_MCU = 0; @@ -174,7 +441,7 @@ per_scan_setup (j_decompress_ptr cinfo) compptr->MCU_width = compptr->h_samp_factor; compptr->MCU_height = compptr->v_samp_factor; compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; - compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; /* Figure number of non-dummy blocks in last MCU column & row */ tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); if (tmp == 0) tmp = compptr->MCU_width; @@ -282,6 +549,10 @@ finish_input_pass (j_decompress_ptr cinfo) * The consume_input method pointer points either here or to the * coefficient controller's consume_data routine, depending on whether * we are reading a compressed data segment or inter-segment markers. + * + * Note: This function should NOT return a pseudo SOS marker (with zero + * component number) to the caller. A pseudo marker received by + * read_markers is processed and then skipped for other markers. */ METHODDEF(int) @@ -293,41 +564,50 @@ consume_markers (j_decompress_ptr cinfo) if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ return JPEG_REACHED_EOI; - val = (*cinfo->marker->read_markers) (cinfo); + for (;;) { /* Loop to pass pseudo SOS marker */ + val = (*cinfo->marker->read_markers) (cinfo); - switch (val) { - case JPEG_REACHED_SOS: /* Found SOS */ - if (inputctl->inheaders) { /* 1st SOS */ - initial_setup(cinfo); - inputctl->inheaders = FALSE; - /* Note: start_input_pass must be called by jdmaster.c - * before any more input can be consumed. jdapimin.c is - * responsible for enforcing this sequencing. - */ - } else { /* 2nd or later SOS marker */ - if (! inputctl->pub.has_multiple_scans) - ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ - start_input_pass(cinfo); + switch (val) { + case JPEG_REACHED_SOS: /* Found SOS */ + if (inputctl->inheaders) { /* 1st SOS */ + if (inputctl->inheaders == 1) + initial_setup(cinfo); + if (cinfo->comps_in_scan == 0) { /* pseudo SOS marker */ + inputctl->inheaders = 2; + break; + } + inputctl->inheaders = 0; + /* Note: start_input_pass must be called by jdmaster.c + * before any more input can be consumed. jdapimin.c is + * responsible for enforcing this sequencing. + */ + } else { /* 2nd or later SOS marker */ + if (! inputctl->pub.has_multiple_scans) + ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ + if (cinfo->comps_in_scan == 0) /* unexpected pseudo SOS marker */ + break; + start_input_pass(cinfo); + } + return val; + case JPEG_REACHED_EOI: /* Found EOI */ + inputctl->pub.eoi_reached = TRUE; + if (inputctl->inheaders) { /* Tables-only datastream, apparently */ + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_NO_SOS); + } else { + /* Prevent infinite loop in coef ctlr's decompress_data routine + * if user set output_scan_number larger than number of scans. + */ + if (cinfo->output_scan_number > cinfo->input_scan_number) + cinfo->output_scan_number = cinfo->input_scan_number; + } + return val; + case JPEG_SUSPENDED: + return val; + default: + return val; } - break; - case JPEG_REACHED_EOI: /* Found EOI */ - inputctl->pub.eoi_reached = TRUE; - if (inputctl->inheaders) { /* Tables-only datastream, apparently */ - if (cinfo->marker->saw_SOF) - ERREXIT(cinfo, JERR_SOF_NO_SOS); - } else { - /* Prevent infinite loop in coef ctlr's decompress_data routine - * if user set output_scan_number larger than number of scans. - */ - if (cinfo->output_scan_number > cinfo->input_scan_number) - cinfo->output_scan_number = cinfo->input_scan_number; - } - break; - case JPEG_SUSPENDED: - break; } - - return val; } @@ -343,7 +623,7 @@ reset_input_controller (j_decompress_ptr cinfo) inputctl->pub.consume_input = consume_markers; inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ inputctl->pub.eoi_reached = FALSE; - inputctl->inheaders = TRUE; + inputctl->inheaders = 1; /* Reset other modules */ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); (*cinfo->marker->reset_marker_reader) (cinfo); @@ -377,5 +657,5 @@ jinit_input_controller (j_decompress_ptr cinfo) */ inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ inputctl->pub.eoi_reached = FALSE; - inputctl->inheaders = TRUE; + inputctl->inheaders = 1; } diff --git a/3rdparty/libjpeg/jdmainct.c b/3rdparty/libjpeg/jdmainct.c index a5619d333..02723ca73 100644 --- a/3rdparty/libjpeg/jdmainct.c +++ b/3rdparty/libjpeg/jdmainct.c @@ -5,12 +5,12 @@ * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * - * This file contains the main_ptr buffer controller for decompression. - * The main_ptr buffer lies between the JPEG decompressor proper and the + * This file contains the main buffer controller for decompression. + * The main buffer lies between the JPEG decompressor proper and the * post-processor; it holds downsampled data in the JPEG colorspace. * * Note that this code is bypassed in raw-data mode, since the application - * supplies the equivalent of the main_ptr buffer in that case. + * supplies the equivalent of the main buffer in that case. */ #define JPEG_INTERNALS @@ -19,9 +19,9 @@ /* - * In the current system design, the main_ptr buffer need never be a full-image + * In the current system design, the main buffer need never be a full-image * buffer; any full-height buffers will be found inside the coefficient or - * postprocessing controllers. Nonetheless, the main_ptr controller is not + * postprocessing controllers. Nonetheless, the main controller is not * trivial. Its responsibility is to provide context rows for upsampling/ * rescaling, and doing this in an efficient fashion is a bit tricky. * @@ -159,24 +159,24 @@ alloc_funny_pointers (j_decompress_ptr cinfo) * This is done only once, not once per pass. */ { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; int ci, rgroup; - int M = cinfo->min_DCT_scaled_size; + int M = cinfo->min_DCT_v_scaled_size; jpeg_component_info *compptr; JSAMPARRAY xbuf; /* Get top-level space for component array pointers. * We alloc both arrays with one call to save a few cycles. */ - main_ptr->xbuffer[0] = (JSAMPIMAGE) + main->xbuffer[0] = (JSAMPIMAGE) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); - main_ptr->xbuffer[1] = main_ptr->xbuffer[0] + cinfo->num_components; + main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ /* Get space for pointer lists --- M+4 row groups in each list. * We alloc both pointer lists with one call to save a few cycles. */ @@ -184,9 +184,9 @@ alloc_funny_pointers (j_decompress_ptr cinfo) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); xbuf += rgroup; /* want one row group at negative offsets */ - main_ptr->xbuffer[0][ci] = xbuf; + main->xbuffer[0][ci] = xbuf; xbuf += rgroup * (M + 4); - main_ptr->xbuffer[1][ci] = xbuf; + main->xbuffer[1][ci] = xbuf; } } @@ -194,26 +194,26 @@ alloc_funny_pointers (j_decompress_ptr cinfo) LOCAL(void) make_funny_pointers (j_decompress_ptr cinfo) /* Create the funny pointer lists discussed in the comments above. - * The actual workspace is already allocated (in main_ptr->buffer), + * The actual workspace is already allocated (in main->buffer), * and the space for the pointer lists is allocated too. * This routine just fills in the curiously ordered lists. * This will be repeated at the beginning of each pass. */ { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; int ci, i, rgroup; - int M = cinfo->min_DCT_scaled_size; + int M = cinfo->min_DCT_v_scaled_size; jpeg_component_info *compptr; JSAMPARRAY buf, xbuf0, xbuf1; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - xbuf0 = main_ptr->xbuffer[0][ci]; - xbuf1 = main_ptr->xbuffer[1][ci]; + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + xbuf0 = main->xbuffer[0][ci]; + xbuf1 = main->xbuffer[1][ci]; /* First copy the workspace pointers as-is */ - buf = main_ptr->buffer[ci]; + buf = main->buffer[ci]; for (i = 0; i < rgroup * (M + 2); i++) { xbuf0[i] = xbuf1[i] = buf[i]; } @@ -240,18 +240,18 @@ set_wraparound_pointers (j_decompress_ptr cinfo) * This changes the pointer list state from top-of-image to the normal state. */ { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; int ci, i, rgroup; - int M = cinfo->min_DCT_scaled_size; + int M = cinfo->min_DCT_v_scaled_size; jpeg_component_info *compptr; JSAMPARRAY xbuf0, xbuf1; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - xbuf0 = main_ptr->xbuffer[0][ci]; - xbuf1 = main_ptr->xbuffer[1][ci]; + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + xbuf0 = main->xbuffer[0][ci]; + xbuf1 = main->xbuffer[1][ci]; for (i = 0; i < rgroup; i++) { xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i]; xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i]; @@ -269,7 +269,7 @@ set_bottom_pointers (j_decompress_ptr cinfo) * Also sets rowgroups_avail to indicate number of nondummy row groups in row. */ { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; int ci, i, rgroup, iMCUheight, rows_left; jpeg_component_info *compptr; JSAMPARRAY xbuf; @@ -277,8 +277,8 @@ set_bottom_pointers (j_decompress_ptr cinfo) for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { /* Count sample rows in one iMCU row and in one row group */ - iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size; - rgroup = iMCUheight / cinfo->min_DCT_scaled_size; + iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size; + rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size; /* Count nondummy sample rows remaining for this component */ rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight); if (rows_left == 0) rows_left = iMCUheight; @@ -286,12 +286,12 @@ set_bottom_pointers (j_decompress_ptr cinfo) * so we need only do it once. */ if (ci == 0) { - main_ptr->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); + main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); } /* Duplicate the last real sample row rgroup*2 times; this pads out the * last partial rowgroup and ensures at least one full rowgroup of context. */ - xbuf = main_ptr->xbuffer[main_ptr->whichptr][ci]; + xbuf = main->xbuffer[main->whichptr][ci]; for (i = 0; i < rgroup * 2; i++) { xbuf[rows_left + i] = xbuf[rows_left-1]; } @@ -306,27 +306,27 @@ set_bottom_pointers (j_decompress_ptr cinfo) METHODDEF(void) start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; switch (pass_mode) { case JBUF_PASS_THRU: if (cinfo->upsample->need_context_rows) { - main_ptr->pub.process_data = process_data_context_main; + main->pub.process_data = process_data_context_main; make_funny_pointers(cinfo); /* Create the xbuffer[] lists */ - main_ptr->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ - main_ptr->context_state = CTX_PREPARE_FOR_IMCU; - main_ptr->iMCU_row_ctr = 0; + main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ + main->context_state = CTX_PREPARE_FOR_IMCU; + main->iMCU_row_ctr = 0; } else { /* Simple case with no context needed */ - main_ptr->pub.process_data = process_data_simple_main; + main->pub.process_data = process_data_simple_main; } - main_ptr->buffer_full = FALSE; /* Mark buffer empty */ - main_ptr->rowgroup_ctr = 0; + main->buffer_full = FALSE; /* Mark buffer empty */ + main->rowgroup_ctr = 0; break; #ifdef QUANT_2PASS_SUPPORTED case JBUF_CRANK_DEST: /* For last pass of 2-pass quantization, just crank the postprocessor */ - main_ptr->pub.process_data = process_data_crank_post; + main->pub.process_data = process_data_crank_post; break; #endif default: @@ -346,32 +346,32 @@ process_data_simple_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail) { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; JDIMENSION rowgroups_avail; - /* Read input data if we haven't filled the main_ptr buffer yet */ - if (! main_ptr->buffer_full) { - if (! (*cinfo->coef->decompress_data) (cinfo, main_ptr->buffer)) + /* Read input data if we haven't filled the main buffer yet */ + if (! main->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer)) return; /* suspension forced, can do nothing more */ - main_ptr->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ } /* There are always min_DCT_scaled_size row groups in an iMCU row. */ - rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size; + rowgroups_avail = (JDIMENSION) cinfo->min_DCT_v_scaled_size; /* Note: at the bottom of the image, we may pass extra garbage row groups * to the postprocessor. The postprocessor has to check for bottom * of image anyway (at row resolution), so no point in us doing it too. */ /* Feed the postprocessor */ - (*cinfo->post->post_process_data) (cinfo, main_ptr->buffer, - &main_ptr->rowgroup_ctr, rowgroups_avail, + (*cinfo->post->post_process_data) (cinfo, main->buffer, + &main->rowgroup_ctr, rowgroups_avail, output_buf, out_row_ctr, out_rows_avail); /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ - if (main_ptr->rowgroup_ctr >= rowgroups_avail) { - main_ptr->buffer_full = FALSE; - main_ptr->rowgroup_ctr = 0; + if (main->rowgroup_ctr >= rowgroups_avail) { + main->buffer_full = FALSE; + main->rowgroup_ctr = 0; } } @@ -386,15 +386,15 @@ process_data_context_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail) { - my_main_ptr main_ptr = (my_main_ptr) cinfo->main; + my_main_ptr main = (my_main_ptr) cinfo->main; - /* Read input data if we haven't filled the main_ptr buffer yet */ - if (! main_ptr->buffer_full) { + /* Read input data if we haven't filled the main buffer yet */ + if (! main->buffer_full) { if (! (*cinfo->coef->decompress_data) (cinfo, - main_ptr->xbuffer[main_ptr->whichptr])) + main->xbuffer[main->whichptr])) return; /* suspension forced, can do nothing more */ - main_ptr->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ - main_ptr->iMCU_row_ctr++; /* count rows received */ + main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + main->iMCU_row_ctr++; /* count rows received */ } /* Postprocessor typically will not swallow all the input data it is handed @@ -402,47 +402,47 @@ process_data_context_main (j_decompress_ptr cinfo, * to exit and restart. This switch lets us keep track of how far we got. * Note that each case falls through to the next on successful completion. */ - switch (main_ptr->context_state) { + switch (main->context_state) { case CTX_POSTPONED_ROW: /* Call postprocessor using previously set pointers for postponed row */ - (*cinfo->post->post_process_data) (cinfo, main_ptr->xbuffer[main_ptr->whichptr], - &main_ptr->rowgroup_ctr, main_ptr->rowgroups_avail, + (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr], + &main->rowgroup_ctr, main->rowgroups_avail, output_buf, out_row_ctr, out_rows_avail); - if (main_ptr->rowgroup_ctr < main_ptr->rowgroups_avail) + if (main->rowgroup_ctr < main->rowgroups_avail) return; /* Need to suspend */ - main_ptr->context_state = CTX_PREPARE_FOR_IMCU; + main->context_state = CTX_PREPARE_FOR_IMCU; if (*out_row_ctr >= out_rows_avail) return; /* Postprocessor exactly filled output buf */ /*FALLTHROUGH*/ case CTX_PREPARE_FOR_IMCU: /* Prepare to process first M-1 row groups of this iMCU row */ - main_ptr->rowgroup_ctr = 0; - main_ptr->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1); + main->rowgroup_ctr = 0; + main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1); /* Check for bottom of image: if so, tweak pointers to "duplicate" * the last sample row, and adjust rowgroups_avail to ignore padding rows. */ - if (main_ptr->iMCU_row_ctr == cinfo->total_iMCU_rows) + if (main->iMCU_row_ctr == cinfo->total_iMCU_rows) set_bottom_pointers(cinfo); - main_ptr->context_state = CTX_PROCESS_IMCU; + main->context_state = CTX_PROCESS_IMCU; /*FALLTHROUGH*/ case CTX_PROCESS_IMCU: /* Call postprocessor using previously set pointers */ - (*cinfo->post->post_process_data) (cinfo, main_ptr->xbuffer[main_ptr->whichptr], - &main_ptr->rowgroup_ctr, main_ptr->rowgroups_avail, + (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr], + &main->rowgroup_ctr, main->rowgroups_avail, output_buf, out_row_ctr, out_rows_avail); - if (main_ptr->rowgroup_ctr < main_ptr->rowgroups_avail) + if (main->rowgroup_ctr < main->rowgroups_avail) return; /* Need to suspend */ /* After the first iMCU, change wraparound pointers to normal state */ - if (main_ptr->iMCU_row_ctr == 1) + if (main->iMCU_row_ctr == 1) set_wraparound_pointers(cinfo); /* Prepare to load new iMCU row using other xbuffer list */ - main_ptr->whichptr ^= 1; /* 0=>1 or 1=>0 */ - main_ptr->buffer_full = FALSE; + main->whichptr ^= 1; /* 0=>1 or 1=>0 */ + main->buffer_full = FALSE; /* Still need to process last row group of this iMCU row, */ /* which is saved at index M+1 of the other xbuffer */ - main_ptr->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1); - main_ptr->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2); - main_ptr->context_state = CTX_POSTPONED_ROW; + main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1); + main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2); + main->context_state = CTX_POSTPONED_ROW; } } @@ -469,21 +469,21 @@ process_data_crank_post (j_decompress_ptr cinfo, /* - * Initialize main_ptr buffer controller. + * Initialize main buffer controller. */ GLOBAL(void) jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) { - my_main_ptr main_ptr; + my_main_ptr main; int ci, rgroup, ngroups; jpeg_component_info *compptr; - main_ptr = (my_main_ptr) + main = (my_main_ptr) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_main_controller)); - cinfo->main = (struct jpeg_d_main_controller *) main_ptr; - main_ptr->pub.start_pass = start_pass_main; + cinfo->main = (struct jpeg_d_main_controller *) main; + main->pub.start_pass = start_pass_main; if (need_full_buffer) /* shouldn't happen */ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); @@ -492,21 +492,21 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) * ngroups is the number of row groups we need. */ if (cinfo->upsample->need_context_rows) { - if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */ + if (cinfo->min_DCT_v_scaled_size < 2) /* unsupported, see comments above */ ERREXIT(cinfo, JERR_NOTIMPL); alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ - ngroups = cinfo->min_DCT_scaled_size + 2; + ngroups = cinfo->min_DCT_v_scaled_size + 2; } else { - ngroups = cinfo->min_DCT_scaled_size; + ngroups = cinfo->min_DCT_v_scaled_size; } for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - main_ptr->buffer[ci] = (*cinfo->mem->alloc_sarray) + rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; /* height of a row group of component */ + main->buffer[ci] = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, - compptr->width_in_blocks * compptr->DCT_scaled_size, + compptr->width_in_blocks * compptr->DCT_h_scaled_size, (JDIMENSION) (rgroup * ngroups)); } } diff --git a/3rdparty/libjpeg/jdmarker.c b/3rdparty/libjpeg/jdmarker.c index f4cca8cc8..f2a9cc429 100644 --- a/3rdparty/libjpeg/jdmarker.c +++ b/3rdparty/libjpeg/jdmarker.c @@ -2,6 +2,7 @@ * jdmarker.c * * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -234,7 +235,8 @@ get_soi (j_decompress_ptr cinfo) LOCAL(boolean) -get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) +get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog, + boolean is_arith) /* Process a SOFn marker */ { INT32 length; @@ -242,6 +244,7 @@ get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) jpeg_component_info * compptr; INPUT_VARS(cinfo); + cinfo->is_baseline = is_baseline; cinfo->progressive_mode = is_prog; cinfo->arith_code = is_arith; @@ -315,7 +318,9 @@ get_sos (j_decompress_ptr cinfo) TRACEMS1(cinfo, 1, JTRC_SOS, n); - if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) + if (length != (n * 2 + 6) || n > MAX_COMPS_IN_SCAN || + (n == 0 && !cinfo->progressive_mode)) + /* pseudo SOS marker only allowed in progressive mode */ ERREXIT(cinfo, JERR_BAD_LENGTH); cinfo->comps_in_scan = n; @@ -359,8 +364,8 @@ get_sos (j_decompress_ptr cinfo) /* Prepare to scan data & restart markers */ cinfo->marker->next_restart_num = 0; - /* Count another SOS marker */ - cinfo->input_scan_number++; + /* Count another (non-pseudo) SOS marker */ + if (n) cinfo->input_scan_number++; INPUT_SYNC(cinfo); return TRUE; @@ -490,16 +495,18 @@ LOCAL(boolean) get_dqt (j_decompress_ptr cinfo) /* Process a DQT marker */ { - INT32 length; - int n, i, prec; + INT32 length, count, i; + int n, prec; unsigned int tmp; JQUANT_TBL *quant_ptr; + const int *natural_order; INPUT_VARS(cinfo); INPUT_2BYTES(cinfo, length, return FALSE); length -= 2; while (length > 0) { + length--; INPUT_BYTE(cinfo, n, return FALSE); prec = n >> 4; n &= 0x0F; @@ -513,13 +520,43 @@ get_dqt (j_decompress_ptr cinfo) cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); quant_ptr = cinfo->quant_tbl_ptrs[n]; - for (i = 0; i < DCTSIZE2; i++) { + if (prec) { + if (length < DCTSIZE2 * 2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length >> 1; + } else + count = DCTSIZE2; + } else { + if (length < DCTSIZE2) { + /* Initialize full table for safety. */ + for (i = 0; i < DCTSIZE2; i++) { + quant_ptr->quantval[i] = 1; + } + count = length; + } else + count = DCTSIZE2; + } + + switch (count) { + case (2*2): natural_order = jpeg_natural_order2; break; + case (3*3): natural_order = jpeg_natural_order3; break; + case (4*4): natural_order = jpeg_natural_order4; break; + case (5*5): natural_order = jpeg_natural_order5; break; + case (6*6): natural_order = jpeg_natural_order6; break; + case (7*7): natural_order = jpeg_natural_order7; break; + default: natural_order = jpeg_natural_order; break; + } + + for (i = 0; i < count; i++) { if (prec) INPUT_2BYTES(cinfo, tmp, return FALSE); else INPUT_BYTE(cinfo, tmp, return FALSE); /* We convert the zigzag-order table to natural array order. */ - quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; + quant_ptr->quantval[natural_order[i]] = (UINT16) tmp; } if (cinfo->err->trace_level >= 2) { @@ -532,8 +569,8 @@ get_dqt (j_decompress_ptr cinfo) } } - length -= DCTSIZE2+1; - if (prec) length -= DCTSIZE2; + length -= count; + if (prec) length -= count; } if (length != 0) @@ -946,6 +983,11 @@ first_marker (j_decompress_ptr cinfo) * * Returns same codes as are defined for jpeg_consume_input: * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + * + * Note: This function may return a pseudo SOS marker (with zero + * component number) for treat by input controller's consume_input. + * consume_input itself should filter out (skip) the pseudo marker + * after processing for the caller. */ METHODDEF(int) @@ -975,23 +1017,27 @@ read_markers (j_decompress_ptr cinfo) break; case M_SOF0: /* Baseline */ + if (! get_sof(cinfo, TRUE, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + case M_SOF1: /* Extended sequential, Huffman */ - if (! get_sof(cinfo, FALSE, FALSE)) + if (! get_sof(cinfo, FALSE, FALSE, FALSE)) return JPEG_SUSPENDED; break; case M_SOF2: /* Progressive, Huffman */ - if (! get_sof(cinfo, TRUE, FALSE)) + if (! get_sof(cinfo, FALSE, TRUE, FALSE)) return JPEG_SUSPENDED; break; case M_SOF9: /* Extended sequential, arithmetic */ - if (! get_sof(cinfo, FALSE, TRUE)) + if (! get_sof(cinfo, FALSE, FALSE, TRUE)) return JPEG_SUSPENDED; break; case M_SOF10: /* Progressive, arithmetic */ - if (! get_sof(cinfo, TRUE, TRUE)) + if (! get_sof(cinfo, FALSE, TRUE, TRUE)) return JPEG_SUSPENDED; break; diff --git a/3rdparty/libjpeg/jdmaster.c b/3rdparty/libjpeg/jdmaster.c index 2802c5b7b..fef72a21b 100644 --- a/3rdparty/libjpeg/jdmaster.c +++ b/3rdparty/libjpeg/jdmaster.c @@ -2,6 +2,7 @@ * jdmaster.c * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2002-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -61,9 +62,12 @@ use_merged_upsample (j_decompress_ptr cinfo) cinfo->comp_info[2].v_samp_factor != 1) return FALSE; /* furthermore, it doesn't work if we've scaled the IDCTs differently */ - if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size || - cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size || - cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size) + if (cinfo->comp_info[0].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[1].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[2].DCT_h_scaled_size != cinfo->min_DCT_h_scaled_size || + cinfo->comp_info[0].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[1].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size || + cinfo->comp_info[2].DCT_v_scaled_size != cinfo->min_DCT_v_scaled_size) return FALSE; /* ??? also need to test for upsample-time rescaling, when & if supported */ return TRUE; /* by golly, it'll work... */ @@ -82,7 +86,9 @@ use_merged_upsample (j_decompress_ptr cinfo) GLOBAL(void) jpeg_calc_output_dimensions (j_decompress_ptr cinfo) -/* Do computations that are needed before master selection phase */ +/* Do computations that are needed before master selection phase. + * This function is used for full decompression. + */ { #ifdef IDCT_SCALING_SUPPORTED int ci; @@ -93,52 +99,38 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo) if (cinfo->global_state != DSTATE_READY) ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Compute core output image dimensions and DCT scaling choices. */ + jpeg_core_output_dimensions(cinfo); + #ifdef IDCT_SCALING_SUPPORTED - /* Compute actual output image dimensions and DCT scaling choices. */ - if (cinfo->scale_num * 8 <= cinfo->scale_denom) { - /* Provide 1/8 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 8L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 8L); - cinfo->min_DCT_scaled_size = 1; - } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) { - /* Provide 1/4 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 4L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 4L); - cinfo->min_DCT_scaled_size = 2; - } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) { - /* Provide 1/2 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 2L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 2L); - cinfo->min_DCT_scaled_size = 4; - } else { - /* Provide 1/1 scaling */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; - cinfo->min_DCT_scaled_size = DCTSIZE; - } /* In selecting the actual DCT scaling for each component, we try to * scale up the chroma components via IDCT scaling rather than upsampling. * This saves time if the upsampler gets to use 1:1 scaling. - * Note this code assumes that the supported DCT scalings are powers of 2. + * Note this code adapts subsampling ratios which are powers of 2. */ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; ci++, compptr++) { - int ssize = cinfo->min_DCT_scaled_size; - while (ssize < DCTSIZE && - (compptr->h_samp_factor * ssize * 2 <= - cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) && - (compptr->v_samp_factor * ssize * 2 <= - cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) { + int ssize = 1; + while (cinfo->min_DCT_h_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { ssize = ssize * 2; } - compptr->DCT_scaled_size = ssize; + compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; + ssize = 1; + while (cinfo->min_DCT_v_scaled_size * ssize <= + (cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) && + (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { + ssize = ssize * 2; + } + compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; + + /* We don't support IDCT ratios larger than 2. */ + if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) + compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; + else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) + compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; } /* Recompute downsampled dimensions of components; @@ -149,23 +141,14 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo) /* Size in samples, after IDCT scaling */ compptr->downsampled_width = (JDIMENSION) jdiv_round_up((long) cinfo->image_width * - (long) (compptr->h_samp_factor * compptr->DCT_scaled_size), - (long) (cinfo->max_h_samp_factor * DCTSIZE)); + (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), + (long) (cinfo->max_h_samp_factor * cinfo->block_size)); compptr->downsampled_height = (JDIMENSION) jdiv_round_up((long) cinfo->image_height * - (long) (compptr->v_samp_factor * compptr->DCT_scaled_size), - (long) (cinfo->max_v_samp_factor * DCTSIZE)); + (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), + (long) (cinfo->max_v_samp_factor * cinfo->block_size)); } -#else /* !IDCT_SCALING_SUPPORTED */ - - /* Hardwire it to "no scaling" */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; - /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE, - * and has computed unscaled downsampled_width and downsampled_height. - */ - #endif /* IDCT_SCALING_SUPPORTED */ /* Report number of components in selected colorspace. */ @@ -175,10 +158,8 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo) cinfo->out_color_components = 1; break; case JCS_RGB: -#if RGB_PIXELSIZE != 3 cinfo->out_color_components = RGB_PIXELSIZE; break; -#endif /* else share code with YCbCr */ case JCS_YCbCr: cinfo->out_color_components = 3; break; @@ -372,17 +353,10 @@ master_selection (j_decompress_ptr cinfo) /* Inverse DCT */ jinit_inverse_dct(cinfo); /* Entropy decoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef D_PROGRESSIVE_SUPPORTED - jinit_phuff_decoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_decoder(cinfo); + if (cinfo->arith_code) + jinit_arith_decoder(cinfo); + else { + jinit_huff_decoder(cinfo); } /* Initialize principal buffer controllers. */ diff --git a/3rdparty/libjpeg/jdphuff.c b/3rdparty/libjpeg/jdphuff.c deleted file mode 100644 index 226780994..000000000 --- a/3rdparty/libjpeg/jdphuff.c +++ /dev/null @@ -1,668 +0,0 @@ -/* - * jdphuff.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy decoding routines for progressive JPEG. - * - * Much of the complexity here has to do with supporting input suspension. - * If the data source module demands suspension, we want to be able to back - * up to the start of the current MCU. To do this, we copy state variables - * into local working storage, and update them back to the permanent - * storage only upon successful completion of an MCU. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdhuff.h" /* Declarations shared with jdhuff.c */ - - -#ifdef D_PROGRESSIVE_SUPPORTED - -/* - * Expanded entropy decoder object for progressive Huffman decoding. - * - * The savable_state subrecord contains fields that change within an MCU, - * but must not be updated permanently until we complete the MCU. - */ - -typedef struct { - unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ -} savable_state; - -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest,src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest,src) \ - ((dest).EOBRUN = (src).EOBRUN, \ - (dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - -typedef struct { - struct jpeg_entropy_decoder pub; /* public fields */ - - /* These fields are loaded into local variables at start of each MCU. - * In case of suspension, we exit WITHOUT updating them. - */ - bitread_perm_state bitstate; /* Bit buffer at start of MCU */ - savable_state saved; /* Other state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; - - d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ -} phuff_entropy_decoder; - -typedef phuff_entropy_decoder * phuff_entropy_ptr; - -/* Forward declarations */ -METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); - - -/* - * Initialize for a Huffman-compressed scan. - */ - -METHODDEF(void) -start_pass_phuff_decoder (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band, bad; - int ci, coefi, tbl; - int *coef_bit_ptr; - jpeg_component_info * compptr; - - is_DC_band = (cinfo->Ss == 0); - - /* Validate scan parameters */ - bad = FALSE; - if (is_DC_band) { - if (cinfo->Se != 0) - bad = TRUE; - } else { - /* need not check Ss/Se < 0 since they came from unsigned bytes */ - if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2) - bad = TRUE; - /* AC scans may have only one component */ - if (cinfo->comps_in_scan != 1) - bad = TRUE; - } - if (cinfo->Ah != 0) { - /* Successive approximation refinement scan: must have Al = Ah-1. */ - if (cinfo->Al != cinfo->Ah-1) - bad = TRUE; - } - if (cinfo->Al > 13) /* need not check for < 0 */ - bad = TRUE; - /* Arguably the maximum Al value should be less than 13 for 8-bit precision, - * but the spec doesn't say so, and we try to be liberal about what we - * accept. Note: large Al values could result in out-of-range DC - * coefficients during early scans, leading to bizarre displays due to - * overflows in the IDCT math. But we won't crash. - */ - if (bad) - ERREXIT4(cinfo, JERR_BAD_PROGRESSION, - cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); - /* Update progression status, and verify that scan order is legal. - * Note that inter-scan inconsistencies are treated as warnings - * not fatal errors ... not clear if this is right way to behave. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - int cindex = cinfo->cur_comp_info[ci]->component_index; - coef_bit_ptr = & cinfo->coef_bits[cindex][0]; - if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ - WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); - for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { - int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; - if (cinfo->Ah != expected) - WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); - coef_bit_ptr[coefi] = cinfo->Al; - } - } - - /* Select MCU decoding routine */ - if (cinfo->Ah == 0) { - if (is_DC_band) - entropy->pub.decode_mcu = decode_mcu_DC_first; - else - entropy->pub.decode_mcu = decode_mcu_AC_first; - } else { - if (is_DC_band) - entropy->pub.decode_mcu = decode_mcu_DC_refine; - else - entropy->pub.decode_mcu = decode_mcu_AC_refine; - } - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Make sure requested tables are present, and compute derived tables. - * We may build same derived table more than once, but it's not expensive. - */ - if (is_DC_band) { - if (cinfo->Ah == 0) { /* DC refinement needs no table */ - tbl = compptr->dc_tbl_no; - jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, - & entropy->derived_tbls[tbl]); - } - } else { - tbl = compptr->ac_tbl_no; - jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, - & entropy->derived_tbls[tbl]); - /* remember the single active table */ - entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; - } - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Initialize bitread state variables */ - entropy->bitstate.bits_left = 0; - entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ - entropy->pub.insufficient_data = FALSE; - - /* Initialize private state variables */ - entropy->saved.EOBRUN = 0; - - /* Initialize restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; -} - - -/* - * Figure F.12: extend sign bit. - * On some machines, a shift and add will be faster than a table lookup. - */ - -#ifdef AVOID_TABLES - -#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) - -#else - -#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) - -static const int extend_test[16] = /* entry n is 2**(n-1) */ - { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; - -static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ - { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, - ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, - ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, - ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; - -#endif /* AVOID_TABLES */ - - -/* - * Check for a restart marker & resynchronize decoder. - * Returns FALSE if must suspend. - */ - -LOCAL(boolean) -process_restart (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int ci; - - /* Throw away any unused bits remaining in bit buffer; */ - /* include any full bytes in next_marker's count of discarded bytes */ - cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; - entropy->bitstate.bits_left = 0; - - /* Advance past the RSTn marker */ - if (! (*cinfo->marker->read_restart_marker) (cinfo)) - return FALSE; - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) - entropy->saved.last_dc_val[ci] = 0; - /* Re-init EOB run count, too */ - entropy->saved.EOBRUN = 0; - - /* Reset restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; - - /* Reset out-of-data flag, unless read_restart_marker left us smack up - * against a marker. In that case we will end up treating the next data - * segment as empty, and we can avoid producing bogus output pixels by - * leaving the flag set. - */ - if (cinfo->unread_marker == 0) - entropy->pub.insufficient_data = FALSE; - - return TRUE; -} - - -/* - * Huffman MCU decoding. - * Each of these routines decodes and returns one MCU's worth of - * Huffman-compressed coefficients. - * The coefficients are reordered from zigzag order into natural array order, - * but are not dequantized. - * - * The i'th block of the MCU is stored into the block pointed to by - * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. - * - * We return FALSE if data source requested suspension. In that case no - * changes have been made to permanent state. (Exception: some output - * coefficients may already have been assigned. This is harmless for - * spectral selection, since we'll just re-assign them on the next call. - * Successive approximation AC refinement has to be more careful, however.) - */ - -/* - * MCU decoding for DC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int Al = cinfo->Al; - register int s, r; - int blkn, ci; - JBLOCKROW block; - BITREAD_STATE_VARS; - savable_state state; - d_derived_tbl * tbl; - jpeg_component_info * compptr; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(state, entropy->saved); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - tbl = entropy->derived_tbls[compptr->dc_tbl_no]; - - /* Decode a single block's worth of coefficients */ - - /* Section F.2.2.1: decode the DC coefficient difference */ - HUFF_DECODE(s, br_state, tbl, return FALSE, label1); - if (s) { - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - } - - /* Convert DC difference to actual value, update last_dc_val */ - s += state.last_dc_val[ci]; - state.last_dc_val[ci] = s; - /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ - (*block)[0] = (JCOEF) (s << Al); - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for AC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int Se = cinfo->Se; - int Al = cinfo->Al; - register int s, k, r; - unsigned int EOBRUN; - JBLOCKROW block; - BITREAD_STATE_VARS; - d_derived_tbl * tbl; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state. - * We can avoid loading/saving bitread state if in an EOB run. - */ - EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ - - /* There is always only one block per MCU */ - - if (EOBRUN > 0) /* if it's a band of zeroes... */ - EOBRUN--; /* ...process it now (we do nothing) */ - else { - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - block = MCU_data[0]; - tbl = entropy->ac_derived_tbl; - - for (k = cinfo->Ss; k <= Se; k++) { - HUFF_DECODE(s, br_state, tbl, return FALSE, label2); - r = s >> 4; - s &= 15; - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - /* Scale and output coefficient in natural (dezigzagged) order */ - (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al); - } else { - if (r == 15) { /* ZRL */ - k += 15; /* skip 15 zeroes in band */ - } else { /* EOBr, run length is 2^r + appended bits */ - EOBRUN = 1 << r; - if (r) { /* EOBr, r > 0 */ - CHECK_BIT_BUFFER(br_state, r, return FALSE); - r = GET_BITS(r); - EOBRUN += r; - } - EOBRUN--; /* this band is processed at this moment */ - break; /* force end-of-band */ - } - } - } - - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - } - - /* Completed MCU, so update state */ - entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for DC successive approximation refinement scan. - * Note: we assume such scans can be multi-component, although the spec - * is not very clear on the point. - */ - -METHODDEF(boolean) -decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ - int blkn; - JBLOCKROW block; - BITREAD_STATE_VARS; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* Not worth the cycles to check insufficient_data here, - * since we will not change the data anyway if we read zeroes. - */ - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - - /* Encoded data is simply the next bit of the two's-complement DC value */ - CHECK_BIT_BUFFER(br_state, 1, return FALSE); - if (GET_BITS(1)) - (*block)[0] |= p1; - /* Note: since we use |=, repeating the assignment later is safe */ - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for AC successive approximation refinement scan. - */ - -METHODDEF(boolean) -decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int Se = cinfo->Se; - int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ - int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ - register int s, k, r; - unsigned int EOBRUN; - JBLOCKROW block; - JCOEFPTR thiscoef; - BITREAD_STATE_VARS; - d_derived_tbl * tbl; - int num_newnz; - int newnz_pos[DCTSIZE2]; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, don't modify the MCU. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ - - /* There is always only one block per MCU */ - block = MCU_data[0]; - tbl = entropy->ac_derived_tbl; - - /* If we are forced to suspend, we must undo the assignments to any newly - * nonzero coefficients in the block, because otherwise we'd get confused - * next time about which coefficients were already nonzero. - * But we need not undo addition of bits to already-nonzero coefficients; - * instead, we can test the current bit to see if we already did it. - */ - num_newnz = 0; - - /* initialize coefficient loop counter to start of band */ - k = cinfo->Ss; - - if (EOBRUN == 0) { - for (; k <= Se; k++) { - HUFF_DECODE(s, br_state, tbl, goto undoit, label3); - r = s >> 4; - s &= 15; - if (s) { - if (s != 1) /* size of new coef should always be 1 */ - WARNMS(cinfo, JWRN_HUFF_BAD_CODE); - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) - s = p1; /* newly nonzero coef is positive */ - else - s = m1; /* newly nonzero coef is negative */ - } else { - if (r != 15) { - EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ - if (r) { - CHECK_BIT_BUFFER(br_state, r, goto undoit); - r = GET_BITS(r); - EOBRUN += r; - } - break; /* rest of block is handled by EOB logic */ - } - /* note s = 0 for processing ZRL */ - } - /* Advance over already-nonzero coefs and r still-zero coefs, - * appending correction bits to the nonzeroes. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - do { - thiscoef = *block + jpeg_natural_order[k]; - if (*thiscoef != 0) { - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) { - if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ - if (*thiscoef >= 0) - *thiscoef += p1; - else - *thiscoef += m1; - } - } - } else { - if (--r < 0) - break; /* reached target zero coefficient */ - } - k++; - } while (k <= Se); - if (s) { - int pos = jpeg_natural_order[k]; - /* Output newly nonzero coefficient */ - (*block)[pos] = (JCOEF) s; - /* Remember its position in case we have to suspend */ - newnz_pos[num_newnz++] = pos; - } - } - } - - if (EOBRUN > 0) { - /* Scan any remaining coefficient positions after the end-of-band - * (the last newly nonzero coefficient, if any). Append a correction - * bit to each already-nonzero coefficient. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - for (; k <= Se; k++) { - thiscoef = *block + jpeg_natural_order[k]; - if (*thiscoef != 0) { - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) { - if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ - if (*thiscoef >= 0) - *thiscoef += p1; - else - *thiscoef += m1; - } - } - } - } - /* Count one block completed in EOB run */ - EOBRUN--; - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; - -undoit: - /* Re-zero any output coefficients that we made newly nonzero */ - while (num_newnz > 0) - (*block)[newnz_pos[--num_newnz]] = 0; - - return FALSE; -} - - -/* - * Module initialization routine for progressive Huffman entropy decoding. - */ - -GLOBAL(void) -jinit_phuff_decoder (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr entropy; - int *coef_bit_ptr; - int ci, i; - - entropy = (phuff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(phuff_entropy_decoder)); - cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; - entropy->pub.start_pass = start_pass_phuff_decoder; - - /* Mark derived tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->derived_tbls[i] = NULL; - } - - /* Create progression status table */ - cinfo->coef_bits = (int (*)[DCTSIZE2]) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components*DCTSIZE2*SIZEOF(int)); - coef_bit_ptr = & cinfo->coef_bits[0][0]; - for (ci = 0; ci < cinfo->num_components; ci++) - for (i = 0; i < DCTSIZE2; i++) - *coef_bit_ptr++ = -1; -} - -#endif /* D_PROGRESSIVE_SUPPORTED */ diff --git a/3rdparty/libjpeg/jdsample.c b/3rdparty/libjpeg/jdsample.c index 80ffefb2a..7bc8885b0 100644 --- a/3rdparty/libjpeg/jdsample.c +++ b/3rdparty/libjpeg/jdsample.c @@ -2,13 +2,14 @@ * jdsample.c * * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2002-2008 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains upsampling routines. * * Upsampling input data is counted in "row groups". A row group - * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) + * is defined to be (v_samp_factor * DCT_v_scaled_size / min_DCT_v_scaled_size) * sample rows of each component. Upsampling will normally produce * max_v_samp_factor pixel rows from each row group (but this could vary * if the upsampler is applying a scale factor of its own). @@ -237,11 +238,11 @@ h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, register JSAMPROW inptr, outptr; register JSAMPLE invalue; JSAMPROW outend; - int inrow; + int outrow; - for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { - inptr = input_data[inrow]; - outptr = output_data[inrow]; + for (outrow = 0; outrow < cinfo->max_v_samp_factor; outrow++) { + inptr = input_data[outrow]; + outptr = output_data[outrow]; outend = outptr + cinfo->output_width; while (outptr < outend) { invalue = *inptr++; /* don't need GETJSAMPLE() here */ @@ -285,112 +286,6 @@ h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, } -/* - * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical. - * - * The upsampling algorithm is linear interpolation between pixel centers, - * also known as a "triangle filter". This is a good compromise between - * speed and visual quality. The centers of the output pixels are 1/4 and 3/4 - * of the way between input pixel centers. - * - * A note about the "bias" calculations: when rounding fractional values to - * integer, we do not want to always round 0.5 up to the next integer. - * If we did that, we'd introduce a noticeable bias towards larger values. - * Instead, this code is arranged so that 0.5 will be rounded up or down at - * alternate pixel locations (a simple ordered dither pattern). - */ - -METHODDEF(void) -h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - register JSAMPROW inptr, outptr; - register int invalue; - register JDIMENSION colctr; - int inrow; - - for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { - inptr = input_data[inrow]; - outptr = output_data[inrow]; - /* Special case for first column */ - invalue = GETJSAMPLE(*inptr++); - *outptr++ = (JSAMPLE) invalue; - *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2); - - for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ - invalue = GETJSAMPLE(*inptr++) * 3; - *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2); - *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2); - } - - /* Special case for last column */ - invalue = GETJSAMPLE(*inptr); - *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2); - *outptr++ = (JSAMPLE) invalue; - } -} - - -/* - * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical. - * Again a triangle filter; see comments for h2v1 case, above. - * - * It is OK for us to reference the adjacent input rows because we demanded - * context from the main buffer controller (see initialization code). - */ - -METHODDEF(void) -h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - register JSAMPROW inptr0, inptr1, outptr; -#if BITS_IN_JSAMPLE == 8 - register int thiscolsum, lastcolsum, nextcolsum; -#else - register INT32 thiscolsum, lastcolsum, nextcolsum; -#endif - register JDIMENSION colctr; - int inrow, outrow, v; - - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - for (v = 0; v < 2; v++) { - /* inptr0 points to nearest input row, inptr1 points to next nearest */ - inptr0 = input_data[inrow]; - if (v == 0) /* next nearest is row above */ - inptr1 = input_data[inrow-1]; - else /* next nearest is row below */ - inptr1 = input_data[inrow+1]; - outptr = output_data[outrow++]; - - /* Special case for first column */ - thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); - lastcolsum = thiscolsum; thiscolsum = nextcolsum; - - for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ - /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); - lastcolsum = thiscolsum; thiscolsum = nextcolsum; - } - - /* Special case for last column */ - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4); - } - inrow++; - } -} - - /* * Module initialization routine for upsampling. */ @@ -401,7 +296,7 @@ jinit_upsampler (j_decompress_ptr cinfo) my_upsample_ptr upsample; int ci; jpeg_component_info * compptr; - boolean need_buffer, do_fancy; + boolean need_buffer; int h_in_group, v_in_group, h_out_group, v_out_group; upsample = (my_upsample_ptr) @@ -415,11 +310,6 @@ jinit_upsampler (j_decompress_ptr cinfo) if (cinfo->CCIR601_sampling) /* this isn't supported */ ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); - /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1, - * so don't ask for it. - */ - do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1; - /* Verify we can handle the sampling factors, select per-component methods, * and create storage as needed. */ @@ -428,10 +318,10 @@ jinit_upsampler (j_decompress_ptr cinfo) /* Compute size of an "input group" after IDCT scaling. This many samples * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. */ - h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; - v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; + h_in_group = (compptr->h_samp_factor * compptr->DCT_h_scaled_size) / + cinfo->min_DCT_h_scaled_size; + v_in_group = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) / + cinfo->min_DCT_v_scaled_size; h_out_group = cinfo->max_h_samp_factor; v_out_group = cinfo->max_v_samp_factor; upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ @@ -446,19 +336,12 @@ jinit_upsampler (j_decompress_ptr cinfo) need_buffer = FALSE; } else if (h_in_group * 2 == h_out_group && v_in_group == v_out_group) { - /* Special cases for 2h1v upsampling */ - if (do_fancy && compptr->downsampled_width > 2) - upsample->methods[ci] = h2v1_fancy_upsample; - else - upsample->methods[ci] = h2v1_upsample; + /* Special case for 2h1v upsampling */ + upsample->methods[ci] = h2v1_upsample; } else if (h_in_group * 2 == h_out_group && v_in_group * 2 == v_out_group) { - /* Special cases for 2h2v upsampling */ - if (do_fancy && compptr->downsampled_width > 2) { - upsample->methods[ci] = h2v2_fancy_upsample; - upsample->pub.need_context_rows = TRUE; - } else - upsample->methods[ci] = h2v2_upsample; + /* Special case for 2h2v upsampling */ + upsample->methods[ci] = h2v2_upsample; } else if ((h_out_group % h_in_group) == 0 && (v_out_group % v_in_group) == 0) { /* Generic integral-factors upsampling method */ diff --git a/3rdparty/libjpeg/jdtrans.c b/3rdparty/libjpeg/jdtrans.c index 6c0ab715d..22dd47fb5 100644 --- a/3rdparty/libjpeg/jdtrans.c +++ b/3rdparty/libjpeg/jdtrans.c @@ -2,6 +2,7 @@ * jdtrans.c * * Copyright (C) 1995-1997, Thomas G. Lane. + * Modified 2000-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -99,18 +100,14 @@ transdecode_master_selection (j_decompress_ptr cinfo) /* This is effectively a buffered-image operation. */ cinfo->buffered_image = TRUE; + /* Compute output image dimensions and related values. */ + jpeg_core_output_dimensions(cinfo); + /* Entropy decoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef D_PROGRESSIVE_SUPPORTED - jinit_phuff_decoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_decoder(cinfo); + if (cinfo->arith_code) + jinit_arith_decoder(cinfo); + else { + jinit_huff_decoder(cinfo); } /* Always get a full-image coefficient buffer. */ diff --git a/3rdparty/libjpeg/jerror.c b/3rdparty/libjpeg/jerror.c index a44463cf1..3da7be86a 100644 --- a/3rdparty/libjpeg/jerror.c +++ b/3rdparty/libjpeg/jerror.c @@ -23,7 +23,6 @@ #include "jpeglib.h" #include "jversion.h" #include "jerror.h" -#include #ifdef USE_WINDOWS_MESSAGEBOX #include diff --git a/3rdparty/libjpeg/jerror.h b/3rdparty/libjpeg/jerror.h index 41a69d5e2..1cfb2b19d 100644 --- a/3rdparty/libjpeg/jerror.h +++ b/3rdparty/libjpeg/jerror.h @@ -2,6 +2,7 @@ * jerror.h * * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 1997-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -39,15 +40,15 @@ typedef enum { JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ /* For maintenance convenience, list is alphabetical by message code name */ -JMESSAGE(JERR_ARITH_NOTIMPL, - "Sorry, there are legal restrictions on arithmetic coding") JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") -JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported") +JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") +JMESSAGE(JERR_BAD_DROP_SAMPLING, + "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") @@ -94,6 +95,7 @@ JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") JMESSAGE(JERR_NOTIMPL, "Not implemented yet") JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") @@ -171,6 +173,7 @@ JMESSAGE(JTRC_UNKNOWN_IDS, JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") JMESSAGE(JWRN_BOGUS_PROGRESSION, "Inconsistent progression sequence for component %d coefficient %d") JMESSAGE(JWRN_EXTRANEOUS_DATA, @@ -228,6 +231,15 @@ JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") (cinfo)->err->msg_parm.i[2] = (p3), \ (cinfo)->err->msg_parm.i[3] = (p4), \ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (cinfo)->err->msg_parm.i[4] = (p5), \ + (cinfo)->err->msg_parm.i[5] = (p6), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) #define ERREXITS(cinfo,code,str) \ ((cinfo)->err->msg_code = (code), \ strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ diff --git a/3rdparty/libjpeg/jfdctflt.c b/3rdparty/libjpeg/jfdctflt.c index 79d7a0078..74d0d862d 100644 --- a/3rdparty/libjpeg/jfdctflt.c +++ b/3rdparty/libjpeg/jfdctflt.c @@ -2,6 +2,7 @@ * jfdctflt.c * * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -56,41 +57,46 @@ */ GLOBAL(void) -jpeg_fdct_float (FAST_FLOAT * data) +jpeg_fdct_float (FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col) { FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; FAST_FLOAT tmp10, tmp11, tmp12, tmp13; FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; FAST_FLOAT *dataptr; + JSAMPROW elemptr; int ctr; /* Pass 1: process rows. */ dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7])); + tmp7 = (FAST_FLOAT) (GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7])); + tmp1 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6])); + tmp6 = (FAST_FLOAT) (GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6])); + tmp2 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5])); + tmp5 = (FAST_FLOAT) (GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5])); + tmp3 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4])); + tmp4 = (FAST_FLOAT) (GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4])); + /* Even part */ - + tmp10 = tmp0 + tmp3; /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2; - - dataptr[0] = tmp10 + tmp11; /* phase 3 */ + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ dataptr[4] = tmp10 - tmp11; - + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ dataptr[2] = tmp13 + z1; /* phase 5 */ dataptr[6] = tmp13 - z1; - + /* Odd part */ tmp10 = tmp4 + tmp5; /* phase 2 */ @@ -126,21 +132,21 @@ jpeg_fdct_float (FAST_FLOAT * data) tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - + /* Even part */ - + tmp10 = tmp0 + tmp3; /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2; - + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ dataptr[DCTSIZE*4] = tmp10 - tmp11; - + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ dataptr[DCTSIZE*6] = tmp13 - z1; - + /* Odd part */ tmp10 = tmp4 + tmp5; /* phase 2 */ diff --git a/3rdparty/libjpeg/jfdctfst.c b/3rdparty/libjpeg/jfdctfst.c index ccb378a3b..8cad5f229 100644 --- a/3rdparty/libjpeg/jfdctfst.c +++ b/3rdparty/libjpeg/jfdctfst.c @@ -2,6 +2,7 @@ * jfdctfst.c * * Copyright (C) 1994-1996, Thomas G. Lane. + * Modified 2003-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -111,42 +112,47 @@ */ GLOBAL(void) -jpeg_fdct_ifast (DCTELEM * data) +jpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) { DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; DCTELEM tmp10, tmp11, tmp12, tmp13; DCTELEM z1, z2, z3, z4, z5, z11, z13; DCTELEM *dataptr; + JSAMPROW elemptr; int ctr; SHIFT_TEMPS /* Pass 1: process rows. */ dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Load data into workspace */ + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp7 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp6 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp5 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + tmp4 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + /* Even part */ - + tmp10 = tmp0 + tmp3; /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2; - - dataptr[0] = tmp10 + tmp11; /* phase 3 */ + + /* Apply unsigned->signed conversion */ + dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */ dataptr[4] = tmp10 - tmp11; - + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ dataptr[2] = tmp13 + z1; /* phase 5 */ dataptr[6] = tmp13 - z1; - + /* Odd part */ tmp10 = tmp4 + tmp5; /* phase 2 */ @@ -182,21 +188,21 @@ jpeg_fdct_ifast (DCTELEM * data) tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - + /* Even part */ - + tmp10 = tmp0 + tmp3; /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2; - + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ dataptr[DCTSIZE*4] = tmp10 - tmp11; - + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ dataptr[DCTSIZE*6] = tmp13 - z1; - + /* Odd part */ tmp10 = tmp4 + tmp5; /* phase 2 */ diff --git a/3rdparty/libjpeg/jfdctint.c b/3rdparty/libjpeg/jfdctint.c index 0a78b64ae..1dde58c49 100644 --- a/3rdparty/libjpeg/jfdctint.c +++ b/3rdparty/libjpeg/jfdctint.c @@ -2,6 +2,7 @@ * jfdctint.c * * Copyright (C) 1991-1996, Thomas G. Lane. + * Modification developed 2003-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -21,6 +22,23 @@ * The advantage of this method is that no data path contains more than one * multiplication; this allows a very simple and accurate implementation in * scaled fixed-point arithmetic, with a minimal number of shifts. + * + * We also provide FDCT routines with various input sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 output DCT block. + * + * For N<8 we fill the remaining block coefficients with zero. + * For N>8 we apply a partial N-point FDCT on the input samples, computing + * just the lower 8 frequency coefficients and discarding the rest. + * + * We must scale the output coefficients of the N-point FDCT appropriately + * to the standard 8-point FDCT level by 8/N per 1-D pass. This scaling + * is folded into the constant multipliers (pass 2) and/or final/initial + * shifting. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. */ #define JPEG_INTERNALS @@ -36,7 +54,7 @@ */ #if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ + Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ #endif @@ -137,12 +155,13 @@ */ GLOBAL(void) -jpeg_fdct_islow (DCTELEM * data) +jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) { - INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp0, tmp1, tmp2, tmp3; INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; + INT32 z1; DCTELEM *dataptr; + JSAMPROW elemptr; int ctr; SHIFT_TEMPS @@ -151,62 +170,74 @@ jpeg_fdct_islow (DCTELEM * data) /* furthermore, we scale the results by 2**PASS1_BITS. */ dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + /* Even part per LL&M figure 1 --- note that published figure is faulty; * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". */ - + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; + tmp12 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); - + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS-PASS1_BITS); - dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS-PASS1_BITS); - + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); - dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); - dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); - dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); - + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS); + dataptr += DCTSIZE; /* advance pointer to next row */ } @@ -217,67 +248,4101 @@ jpeg_fdct_islow (DCTELEM * data) dataptr = data; for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - /* Even part per LL&M figure 1 --- note that published figure is faulty; * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". */ - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); - dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); - + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS+PASS1_BITS); - + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. + * cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, - CONST_BITS+PASS1_BITS); - + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + dataptr++; /* advance pointer to next column */ } } +#ifdef DCT_SCALING_SUPPORTED + + +/* + * Perform the forward DCT on a 7x7 sample block. + */ + +GLOBAL(void) +jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/7)**2 = 64/49, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x6 sample block. + */ + +GLOBAL(void) +jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS)); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)**2 = 16/9, which we fold + * into the constant multipliers: + * cK now represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x5 sample block. + */ + +GLOBAL(void) +jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << (PASS1_BITS+1)); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/5)**2 = 64/25, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x4 sample block. + */ + +GLOBAL(void) +jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by (8/4)**2 = 2**2, which we add here. */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+2)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-3); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-2); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-2); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x3 sample block. + */ + +GLOBAL(void) +jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2**2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+2)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-2); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-2); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/3)**2 = 64/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * cK now represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x2 sample block. + */ + +GLOBAL(void) +jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + + /* Row 0 */ + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp1 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Row 1 */ + elemptr = sample_data[1] + start_col; + + tmp2 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[1]); + tmp3 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[1]); + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)**2 = 2**4. + */ + + /* Column 0 */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4); + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp2) << 4); + + /* Column 1 */ + data[DCTSIZE*0+1] = (DCTELEM) ((tmp1 + tmp3) << 4); + data[DCTSIZE*1+1] = (DCTELEM) ((tmp1 - tmp3) << 4); +} + + +/* + * Perform the forward DCT on a 1x1 sample block. + */ + +GLOBAL(void) +jpeg_fdct_1x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* We leave the result scaled up by an overall factor of 8. */ + /* We must also scale the output by (8/1)**2 = 2**6. */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) + ((GETJSAMPLE(sample_data[0][start_col]) - CENTERJSAMPLE) << 6); +} + + +/* + * Perform the forward DCT on a 9x9 sample block. + */ + +GLOBAL(void) +jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2; + DCTELEM workspace[8]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/18). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[8]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[7]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[6]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[5]); + tmp4 = GETJSAMPLE(elemptr[4]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[8]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[7]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[6]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[5]); + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((z1 + z2 - 9 * CENTERJSAMPLE) << 1); + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(0.707106781)), /* c6 */ + CONST_BITS-1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.328926049)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(0.707106781)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.083350441)) /* c4 */ + + z1 + z2, CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.245575608)) /* c8 */ + + z1 - z2, CONST_BITS-1); + + /* Odd part */ + + dataptr[3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.224744871)), /* c3 */ + CONST_BITS-1); + + tmp11 = MULTIPLY(tmp11, FIX(1.224744871)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(0.909038955)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.483689525)); /* c7 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS-1); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(1.392728481)); /* c1 */ + + dataptr[5] = (DCTELEM) DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 9) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/9)**2 = 64/81, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/18) * 128/81. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*0]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*7]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*6]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*5]; + tmp4 = dataptr[DCTSIZE*4]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*0]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*7]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*6]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*5]; + + z1 = tmp0 + tmp2 + tmp3; + z2 = tmp1 + tmp4; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2, FIX(1.580246914)), /* 128/81 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z2 - z2, FIX(1.117403309)), /* c6 */ + CONST_BITS+2); + z1 = MULTIPLY(tmp0 - tmp2, FIX(2.100031287)); /* c2 */ + z2 = MULTIPLY(tmp1 - tmp4 - tmp4, FIX(1.117403309)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp2 - tmp3, FIX(1.711961190)) /* c4 */ + + z1 + z2, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp3 - tmp0, FIX(0.388070096)) /* c8 */ + + z1 - z2, CONST_BITS+2); + + /* Odd part */ + + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12 - tmp13, FIX(1.935399303)), /* c3 */ + CONST_BITS+2); + + tmp11 = MULTIPLY(tmp11, FIX(1.935399303)); /* c3 */ + tmp0 = MULTIPLY(tmp10 + tmp12, FIX(1.436506004)); /* c5 */ + tmp1 = MULTIPLY(tmp10 + tmp13, FIX(0.764348879)); /* c7 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp0 + tmp1, CONST_BITS+2); + + tmp2 = MULTIPLY(tmp12 - tmp13, FIX(2.200854883)); /* c1 */ + + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp0 - tmp11 - tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(tmp1 - tmp11 + tmp2, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x10 sample block. + */ + +GLOBAL(void) +jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << 1); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-1); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-1); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << 1); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-1); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/10)**2 = 16/25, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+2); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+2); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+2); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+2); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 11x11 sample block. + */ + +GLOBAL(void) +jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3; + DCTELEM workspace[8*3]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* we scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* cK represents sqrt(2) * cos(K*pi/22). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[10]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[9]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[8]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[7]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[6]); + tmp5 = GETJSAMPLE(elemptr[5]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[10]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[9]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[8]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[7]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 - 11 * CENTERJSAMPLE) << 1); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.356927976)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.201263574)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.926112931)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.189712156)); /* c4 */ + dataptr[2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.018300590)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.390975730)), /* c4+c10 */ + CONST_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.062335650)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.356927976)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.587485545)), /* c8 */ + CONST_BITS-1); + dataptr[6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.620527200)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.788749120)), /* c8+c10 */ + CONST_BITS-1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.286413905)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.068791298)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.764581576)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.719967871)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.398430003)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.764581576)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.399818907)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.276416582)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.068791298)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.398430003)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(1.989053629)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.399818907)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.305598626)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.286413905)); /* c3 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-1); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-1); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-1); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-1); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 11) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/11)**2 = 64/121, which we partially + * fold into the constant multipliers and final/initial shifting: + * cK now represents sqrt(2) * cos(K*pi/22) * 128/121. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*1]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*0]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*7]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*6]; + tmp5 = dataptr[DCTSIZE*5]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*2]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*1]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*0]; + tmp13 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*7]; + tmp14 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5, + FIX(1.057851240)), /* 128/121 */ + CONST_BITS+2); + tmp5 += tmp5; + tmp0 -= tmp5; + tmp1 -= tmp5; + tmp2 -= tmp5; + tmp3 -= tmp5; + tmp4 -= tmp5; + z1 = MULTIPLY(tmp0 + tmp3, FIX(1.435427942)) + /* c2 */ + MULTIPLY(tmp2 + tmp4, FIX(0.212906922)); /* c10 */ + z2 = MULTIPLY(tmp1 - tmp3, FIX(0.979689713)); /* c6 */ + z3 = MULTIPLY(tmp0 - tmp1, FIX(1.258538479)); /* c4 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(z1 + z2 - MULTIPLY(tmp3, FIX(1.077210542)) /* c2+c8-c6 */ + - MULTIPLY(tmp4, FIX(1.471445400)), /* c4+c10 */ + CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 + MULTIPLY(tmp1, FIX(0.065941844)) /* c4-c6-c10 */ + - MULTIPLY(tmp2, FIX(1.435427942)) /* c2 */ + + MULTIPLY(tmp4, FIX(0.621472312)), /* c8 */ + CONST_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(z1 + z3 - MULTIPLY(tmp0, FIX(1.714276708)) /* c2+c4-c6 */ + - MULTIPLY(tmp2, FIX(0.834379234)), /* c8+c10 */ + CONST_BITS+2); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.360834544)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.130622199)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.808813568)); /* c7 */ + tmp0 = tmp1 + tmp2 + tmp3 - MULTIPLY(tmp10, FIX(1.819470145)) /* c7+c5+c3-c1 */ + + MULTIPLY(tmp14, FIX(0.421479672)); /* c9 */ + tmp4 = MULTIPLY(tmp11 + tmp12, - FIX(0.808813568)); /* -c7 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.480800167)); /* -c1 */ + tmp1 += tmp4 + tmp5 + MULTIPLY(tmp11, FIX(1.350258864)) /* c9+c7+c1-c3 */ + - MULTIPLY(tmp14, FIX(1.130622199)); /* c5 */ + tmp10 = MULTIPLY(tmp12 + tmp13, FIX(0.421479672)); /* c9 */ + tmp2 += tmp4 + tmp10 - MULTIPLY(tmp12, FIX(2.104122847)) /* c9+c5+c3-c7 */ + + MULTIPLY(tmp14, FIX(1.480800167)); /* c1 */ + tmp3 += tmp5 + tmp10 + MULTIPLY(tmp13, FIX(1.381129125)) /* c1+c5-c9-c7 */ + - MULTIPLY(tmp14, FIX(1.360834544)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x12 sample block. + */ + +GLOBAL(void) +jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE); + dataptr[6] = (DCTELEM) (tmp13 - tmp14 - tmp15); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/12)**2 = 4/9, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 13x13 sample block. + */ + +GLOBAL(void) +jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 z1, z2; + DCTELEM workspace[8*5]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/26). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[12]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[11]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[10]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[9]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[8]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[7]); + tmp6 = GETJSAMPLE(elemptr[6]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[12]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[11]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[10]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[9]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[8]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 - 13 * CENTERJSAMPLE); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.373119086)) + /* c2 */ + MULTIPLY(tmp1, FIX(1.058554052)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.501487041)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.170464608)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.803364869)) - /* c8 */ + MULTIPLY(tmp5, FIX(1.252223920)), /* c4 */ + CONST_BITS); + z1 = MULTIPLY(tmp0 - tmp2, FIX(1.155388986)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.435816023)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.316450131)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.096834934)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.937303064)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.486914739)); /* (c8+c12)/2 */ + + dataptr[4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.322312651)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(1.163874945)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.937797057)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.338443458)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(2.020082300)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.318774355)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.937797057)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.338443458)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(1.163874945)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.837223564)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(2.341699410)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.657217813)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.572116027)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(2.260109708)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(2.205608352)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.742345811)); /* c1+c11 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 13) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/13)**2 = 64/169, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/26) * 128/169. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*2]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*1]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*0]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*7]; + tmp6 = dataptr[DCTSIZE*6]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*4]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*3]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*2]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*1]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*0]; + tmp15 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6, + FIX(0.757396450)), /* 128/169 */ + CONST_BITS+1); + tmp6 += tmp6; + tmp0 -= tmp6; + tmp1 -= tmp6; + tmp2 -= tmp6; + tmp3 -= tmp6; + tmp4 -= tmp6; + tmp5 -= tmp6; + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.039995521)) + /* c2 */ + MULTIPLY(tmp1, FIX(0.801745081)) + /* c6 */ + MULTIPLY(tmp2, FIX(0.379824504)) - /* c10 */ + MULTIPLY(tmp3, FIX(0.129109289)) - /* c12 */ + MULTIPLY(tmp4, FIX(0.608465700)) - /* c8 */ + MULTIPLY(tmp5, FIX(0.948429952)), /* c4 */ + CONST_BITS+1); + z1 = MULTIPLY(tmp0 - tmp2, FIX(0.875087516)) - /* (c4+c6)/2 */ + MULTIPLY(tmp3 - tmp4, FIX(0.330085509)) - /* (c2-c10)/2 */ + MULTIPLY(tmp1 - tmp5, FIX(0.239678205)); /* (c8-c12)/2 */ + z2 = MULTIPLY(tmp0 + tmp2, FIX(0.073342435)) - /* (c4-c6)/2 */ + MULTIPLY(tmp3 + tmp4, FIX(0.709910013)) + /* (c2+c10)/2 */ + MULTIPLY(tmp1 + tmp5, FIX(0.368787494)); /* (c8+c12)/2 */ + + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - z2, CONST_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.001514908)); /* c3 */ + tmp2 = MULTIPLY(tmp10 + tmp12, FIX(0.881514751)); /* c5 */ + tmp3 = MULTIPLY(tmp10 + tmp13, FIX(0.710284161)) + /* c7 */ + MULTIPLY(tmp14 + tmp15, FIX(0.256335874)); /* c11 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(tmp10, FIX(1.530003162)) + /* c3+c5+c7-c1 */ + MULTIPLY(tmp14, FIX(0.241438564)); /* c9-c11 */ + tmp4 = MULTIPLY(tmp14 - tmp15, FIX(0.710284161)) - /* c7 */ + MULTIPLY(tmp11 + tmp12, FIX(0.256335874)); /* c11 */ + tmp5 = MULTIPLY(tmp11 + tmp13, - FIX(0.881514751)); /* -c5 */ + tmp1 += tmp4 + tmp5 + + MULTIPLY(tmp11, FIX(0.634110155)) - /* c5+c9+c11-c3 */ + MULTIPLY(tmp14, FIX(1.773594819)); /* c1+c7 */ + tmp6 = MULTIPLY(tmp12 + tmp13, - FIX(0.497774438)); /* -c9 */ + tmp2 += tmp4 + tmp6 - + MULTIPLY(tmp12, FIX(1.190715098)) + /* c1+c5-c9-c11 */ + MULTIPLY(tmp15, FIX(1.711799069)); /* c3+c7 */ + tmp3 += tmp5 + tmp6 + + MULTIPLY(tmp13, FIX(1.670519935)) - /* c3+c5+c9-c7 */ + MULTIPLY(tmp15, FIX(1.319646532)); /* c1+c11 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x14 sample block. + */ + +GLOBAL(void) +jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + (tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) (tmp0 - tmp10 + tmp3 - tmp11 - tmp6); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/14)**2 = 16/49, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+1); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+1); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+1); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+1); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+1); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 15x15 sample block. + */ + +GLOBAL(void) +jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*7]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* cK represents sqrt(2) * cos(K*pi/30). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[14]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[13]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[12]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[11]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[10]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[9]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[8]); + tmp7 = GETJSAMPLE(elemptr[7]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[14]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[13]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[12]); + tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[11]); + tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[10]); + tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[9]); + tmp16 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[8]); + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) (z1 + z2 + z3 - 15 * CENTERJSAMPLE); + z3 += z3; + dataptr[6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.144122806)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.437016024)), /* c12 */ + CONST_BITS); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.531135173)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.238241955)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.798468008)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.091361227)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.383309603)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(0.946293579)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.790569415)); /* (c6+c12)/2 */ + + dataptr[2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS); + dataptr[4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.224744871)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.831253876)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.224744871)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.406466353)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.344997024)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.575212477)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.475753014)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.513743148)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.700497885)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.355500862)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.176250899)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.869244010)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 15) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/15)**2 = 64/225, which we partially + * fold into the constant multipliers and final shifting: + * cK now represents sqrt(2) * cos(K*pi/30) * 256/225. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*3]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*2]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*1]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*0]; + tmp7 = dataptr[DCTSIZE*7]; + + tmp10 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*4]; + tmp13 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*3]; + tmp14 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*2]; + tmp15 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*1]; + tmp16 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*0]; + + z1 = tmp0 + tmp4 + tmp5; + z2 = tmp1 + tmp3 + tmp6; + z3 = tmp2 + tmp7; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + z2 + z3, FIX(1.137777778)), /* 256/225 */ + CONST_BITS+2); + z3 += z3; + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(z1 - z3, FIX(1.301757503)) - /* c6 */ + MULTIPLY(z2 - z3, FIX(0.497227121)), /* c12 */ + CONST_BITS+2); + tmp2 += ((tmp1 + tmp4) >> 1) - tmp7 - tmp7; + z1 = MULTIPLY(tmp3 - tmp2, FIX(1.742091575)) - /* c2+c14 */ + MULTIPLY(tmp6 - tmp2, FIX(2.546621957)); /* c4+c8 */ + z2 = MULTIPLY(tmp5 - tmp2, FIX(0.908479156)) - /* c8-c14 */ + MULTIPLY(tmp0 - tmp2, FIX(0.103948774)); /* c2-c4 */ + z3 = MULTIPLY(tmp0 - tmp3, FIX(1.573898926)) + /* c2 */ + MULTIPLY(tmp6 - tmp5, FIX(1.076671805)) + /* c8 */ + MULTIPLY(tmp1 - tmp4, FIX(0.899492312)); /* (c6+c12)/2 */ + + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z3, CONST_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(z2 + z3, CONST_BITS+2); + + /* Odd part */ + + tmp2 = MULTIPLY(tmp10 - tmp12 - tmp13 + tmp15 + tmp16, + FIX(1.393487498)); /* c5 */ + tmp1 = MULTIPLY(tmp10 - tmp14 - tmp15, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp11 - tmp13 - tmp16, FIX(0.945782187)); /* c9 */ + tmp12 = MULTIPLY(tmp12, FIX(1.393487498)); /* c5 */ + tmp4 = MULTIPLY(tmp10 - tmp16, FIX(1.600246161)) + /* c1 */ + MULTIPLY(tmp11 + tmp14, FIX(1.530307725)) + /* c3 */ + MULTIPLY(tmp13 + tmp15, FIX(0.654463974)); /* c11 */ + tmp0 = MULTIPLY(tmp13, FIX(0.541301207)) - /* c7-c11 */ + MULTIPLY(tmp14, FIX(0.584525538)) + /* c3-c9 */ + MULTIPLY(tmp16, FIX(1.934788705)) + tmp4 + tmp12; /* c1+c13 */ + tmp3 = MULTIPLY(tmp10, - FIX(0.404480980)) - /* -(c1-c7) */ + MULTIPLY(tmp11, FIX(2.476089912)) - /* c3+c9 */ + MULTIPLY(tmp15, FIX(0.989006518)) + tmp4 - tmp12; /* c11+c13 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x16 sample block. + */ + +GLOBAL(void) +jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/16)**2 = 1/2**2. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+2); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+2); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+10 */ + CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+2); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+2); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+2); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 16x8 sample block. + * + * 16-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). */ + + dataptr = data; + ctr = 0; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) + GETJSAMPLE(elemptr[8]); + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[15]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[14]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[13]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[12]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[11]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[10]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]); + tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by 8/16 = 1/2. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS+PASS1_BITS+1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 14x7 sample block. + * + * 14-point FDCT in pass 1 (rows), 7-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero bottom row of output coefficient block. */ + MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28). */ + + dataptr = data; + for (ctr = 0; ctr < 7; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[11]); + tmp13 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) + GETJSAMPLE(elemptr[7]); + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[13]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[12]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[11]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[10]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[9]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]); + tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE) << PASS1_BITS); + tmp13 += tmp13; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.274162392)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.314692123)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.881747734)), /* c8 */ + CONST_BITS-PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(1.105676686)); /* c6 */ + + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.273079590)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.613604268)), /* c10 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.719280954)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(1.378756276)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[7] = (DCTELEM) ((tmp0 - tmp10 + tmp3 - tmp11 - tmp6) << PASS1_BITS); + tmp3 <<= CONST_BITS; + tmp10 = MULTIPLY(tmp10, - FIX(0.158341681)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(1.405321284)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(1.197448846)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.752406978)); /* c9 */ + dataptr[5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(2.373959773)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(1.119999435)), /* c1+c11-c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(1.334852607)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.467085129)); /* c11 */ + dataptr[3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.424103948)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(3.069855259)), /* c1+c5+c11 */ + CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + tmp6 - + MULTIPLY(tmp0 + tmp6, FIX(1.126980169)), /* c3+c5-c1 */ + CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/14)*(8/7) = 32/49, which we + * partially fold into the constant multipliers and final shifting: + * 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14) * 64/49. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*6]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*5]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*4]; + tmp3 = dataptr[DCTSIZE*3]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*6]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*5]; + tmp12 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*4]; + + z1 = tmp0 + tmp2; + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(z1 + tmp1 + tmp3, FIX(1.306122449)), /* 64/49 */ + CONST_BITS+PASS1_BITS+1); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.461784020)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(1.202428084)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.411026446)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS+PASS1_BITS+1); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(1.151670509)); /* c4 */ + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.923568041)), /* c2+c6-c4 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(1.221765677)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.222383464)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.800824523)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.801442310)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(2.443531355)); /* c3+c1-c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 12x6 sample block. + * + * 12-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 2 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) + GETJSAMPLE(elemptr[6]); + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[11]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[10]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[9]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[8]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]); + tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[6] = (DCTELEM) ((tmp13 - tmp14 - tmp15) << PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.224744871)), /* c4 */ + CONST_BITS-PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(tmp14 - tmp15 + MULTIPLY(tmp13 + tmp15, FIX(1.366025404)), /* c2 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX_0_541196100); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX_0_765366865); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX_1_847759065); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.121971054)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.860918669)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.580774953)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.184591911)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.184591911)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.339493912)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.860918669)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.725788011)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(1.121971054)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.306562965)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX_0_541196100); /* c9 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/12)*(8/6) = 8/9, which we + * partially fold into the constant multipliers and final shifting: + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 10x5 sample block. + * + * 10-point FDCT in pass 1 (rows), 5-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 3 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20). */ + + dataptr = data; + for (ctr = 0; ctr < 5; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[8]); + tmp12 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) + GETJSAMPLE(elemptr[5]); + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[9]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[8]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[7]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]); + tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << PASS1_BITS); + tmp12 += tmp12; + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.144122806)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.437016024)), /* c8 */ + CONST_BITS-PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(0.831253876)); /* c6 */ + dataptr[2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.513743148)), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.176250899)), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[5] = (DCTELEM) ((tmp10 - tmp11 - tmp2) << PASS1_BITS); + tmp2 <<= CONST_BITS; + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.396802247)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.260073511)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.642039522)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.221231742)), /* c9 */ + CONST_BITS-PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(0.951056516)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.587785252)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.309016994)) + /* (c3-c7)/2 */ + (tmp11 << (CONST_BITS - 1)) - tmp2; + dataptr[3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/10)*(8/5) = 32/25, which we + * fold into the constant multipliers: + * 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10) * 32/25. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*3]; + tmp2 = dataptr[DCTSIZE*2]; + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*4]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(1.011928851)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.452548340)); /* (c2-c4)/2 */ + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(1.064004961)); /* c3 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.657591230)), /* c1-c3 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.785601151)), /* c1+c3 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on an 8x4 sample block. + * + * 8-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Zero 4 bottom rows of output coefficient block. */ + MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1)); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS-1); + dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS-1); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-2); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1); + dataptr[5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1); + dataptr[7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS+PASS1_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x3 sample block. + * + * 6-point FDCT in pass 1 (rows), 3-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS-1); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << (PASS1_BITS+1))); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << (PASS1_BITS+1)); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << (PASS1_BITS+1))); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*2]; + tmp1 = dataptr[DCTSIZE*1]; + + tmp2 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(1.257078722)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(2.177324216)), /* c1 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x2 sample block. + * + * 4-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here. */ + /* 4-point FDCT kernel, */ + /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-4); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-3); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-3); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1)); + tmp1 = dataptr[DCTSIZE*1]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS); + + /* Odd part */ + + dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x1 sample block. + * + * 2-point FDCT in pass 1 (rows), 1-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + JSAMPROW elemptr; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + elemptr = sample_data[0] + start_col; + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/2)*(8/1) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + + +/* + * Perform the forward DCT on an 8x16 sample block. + * + * 8-point FDCT in pass 1 (rows), 16-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17; + INT32 z1; + DCTELEM workspace[DCTSIZE2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) + GETJSAMPLE(elemptr[4]); + + tmp10 = tmp0 + tmp3; + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[7]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[6]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]); + tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == DCTSIZE * 2) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by 8/16 = 1/2. + * 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + + dataptr = data; + wsptr = workspace; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] + wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] + wsptr[DCTSIZE*0]; + + tmp10 = tmp0 + tmp7; + tmp14 = tmp0 - tmp7; + tmp11 = tmp1 + tmp6; + tmp15 = tmp1 - tmp6; + tmp12 = tmp2 + tmp5; + tmp16 = tmp2 - tmp5; + tmp13 = tmp3 + tmp4; + tmp17 = tmp3 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*3]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*2]; + tmp6 = dataptr[DCTSIZE*6] - wsptr[DCTSIZE*1]; + tmp7 = dataptr[DCTSIZE*7] - wsptr[DCTSIZE*0]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(tmp10 + tmp11 + tmp12 + tmp13, PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(1.306562965)) + /* c4[16] = c2[8] */ + MULTIPLY(tmp11 - tmp12, FIX_0_541196100), /* c12[16] = c6[8] */ + CONST_BITS+PASS1_BITS+1); + + tmp10 = MULTIPLY(tmp17 - tmp15, FIX(0.275899379)) + /* c14[16] = c7[8] */ + MULTIPLY(tmp14 - tmp16, FIX(1.387039845)); /* c2[16] = c1[8] */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp15, FIX(1.451774982)) /* c6+c14 */ + + MULTIPLY(tmp16, FIX(2.172734804)), /* c2+c10 */ + CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(0.211164243)) /* c2-c6 */ + - MULTIPLY(tmp17, FIX(1.061594338)), /* c10+c14 */ + CONST_BITS+PASS1_BITS+1); + + /* Odd part */ + + tmp11 = MULTIPLY(tmp0 + tmp1, FIX(1.353318001)) + /* c3 */ + MULTIPLY(tmp6 - tmp7, FIX(0.410524528)); /* c13 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(1.247225013)) + /* c5 */ + MULTIPLY(tmp5 + tmp7, FIX(0.666655658)); /* c11 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(1.093201867)) + /* c7 */ + MULTIPLY(tmp4 - tmp7, FIX(0.897167586)); /* c9 */ + tmp14 = MULTIPLY(tmp1 + tmp2, FIX(0.138617169)) + /* c15 */ + MULTIPLY(tmp6 - tmp5, FIX(1.407403738)); /* c1 */ + tmp15 = MULTIPLY(tmp1 + tmp3, - FIX(0.666655658)) + /* -c11 */ + MULTIPLY(tmp4 + tmp6, - FIX(1.247225013)); /* -c5 */ + tmp16 = MULTIPLY(tmp2 + tmp3, - FIX(1.353318001)) + /* -c3 */ + MULTIPLY(tmp5 - tmp4, FIX(0.410524528)); /* c13 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(tmp0, FIX(2.286341144)) + /* c7+c5+c3-c1 */ + MULTIPLY(tmp7, FIX(0.779653625)); /* c15+c13-c11+c9 */ + tmp11 += tmp14 + tmp15 + MULTIPLY(tmp1, FIX(0.071888074)) /* c9-c3-c15+c11 */ + - MULTIPLY(tmp6, FIX(1.663905119)); /* c7+c13+c1-c5 */ + tmp12 += tmp14 + tmp16 - MULTIPLY(tmp2, FIX(1.125726048)) /* c7+c5+c15-c3 */ + + MULTIPLY(tmp5, FIX(1.227391138)); /* c9-c11+c1-c13 */ + tmp13 += tmp15 + tmp16 + MULTIPLY(tmp3, FIX(1.065388962)) /* c15+c3+c11-c7 */ + + MULTIPLY(tmp4, FIX(2.167985692)); /* c1+c13+c5-c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 7x14 sample block. + * + * 7-point FDCT in pass 1 (rows), 14-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 z1, z2, z3; + DCTELEM workspace[8*6]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[6]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[5]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[4]); + tmp3 = GETJSAMPLE(elemptr[3]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[6]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[5]); + tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]); + + z1 = tmp0 + tmp2; + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS); + tmp3 += tmp3; + z1 -= tmp3; + z1 -= tmp3; + z1 = MULTIPLY(z1, FIX(0.353553391)); /* (c2+c6-c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp2, FIX(0.920609002)); /* (c2+c4-c6)/2 */ + z3 = MULTIPLY(tmp1 - tmp2, FIX(0.314692123)); /* c6 */ + dataptr[2] = (DCTELEM) DESCALE(z1 + z2 + z3, CONST_BITS-PASS1_BITS); + z1 -= z2; + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.881747734)); /* c4 */ + dataptr[4] = (DCTELEM) + DESCALE(z2 + z3 - MULTIPLY(tmp1 - tmp3, FIX(0.707106781)), /* c2+c6-c4 */ + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + z2, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp1 = MULTIPLY(tmp10 + tmp11, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(tmp10 - tmp11, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(tmp11 + tmp12, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + tmp3 = MULTIPLY(tmp10 + tmp12, FIX(0.613604268)); /* c5 */ + tmp0 += tmp3; + tmp2 += tmp3 + MULTIPLY(tmp12, FIX(1.870828693)); /* c3+c1-c5 */ + + dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 14) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/7)*(8/14) = 32/49, which we + * fold into the constant multipliers: + * 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28) * 32/49. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*3]; + tmp13 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] + wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] + wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7]; + + tmp10 = tmp0 + tmp6; + tmp14 = tmp0 - tmp6; + tmp11 = tmp1 + tmp5; + tmp15 = tmp1 - tmp5; + tmp12 = tmp2 + tmp4; + tmp16 = tmp2 - tmp4; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*3]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*2]; + tmp4 = dataptr[DCTSIZE*4] - wsptr[DCTSIZE*1]; + tmp5 = dataptr[DCTSIZE*5] - wsptr[DCTSIZE*0]; + tmp6 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12 + tmp13, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp13 += tmp13; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp13, FIX(0.832106052)) + /* c4 */ + MULTIPLY(tmp11 - tmp13, FIX(0.205513223)) - /* c12 */ + MULTIPLY(tmp12 - tmp13, FIX(0.575835255)), /* c8 */ + CONST_BITS+PASS1_BITS); + + tmp10 = MULTIPLY(tmp14 + tmp15, FIX(0.722074570)); /* c6 */ + + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp14, FIX(0.178337691)) /* c2-c6 */ + + MULTIPLY(tmp16, FIX(0.400721155)), /* c10 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp15, FIX(1.122795725)) /* c6+c10 */ + - MULTIPLY(tmp16, FIX(0.900412262)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp1 + tmp2; + tmp11 = tmp5 - tmp4; + dataptr[DCTSIZE*7] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp10 + tmp3 - tmp11 - tmp6, + FIX(0.653061224)), /* 32/49 */ + CONST_BITS+PASS1_BITS); + tmp3 = MULTIPLY(tmp3 , FIX(0.653061224)); /* 32/49 */ + tmp10 = MULTIPLY(tmp10, - FIX(0.103406812)); /* -c13 */ + tmp11 = MULTIPLY(tmp11, FIX(0.917760839)); /* c1 */ + tmp10 += tmp11 - tmp3; + tmp11 = MULTIPLY(tmp0 + tmp2, FIX(0.782007410)) + /* c5 */ + MULTIPLY(tmp4 + tmp6, FIX(0.491367823)); /* c9 */ + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + tmp11 - MULTIPLY(tmp2, FIX(1.550341076)) /* c3+c5-c13 */ + + MULTIPLY(tmp4, FIX(0.731428202)), /* c1+c11-c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 + tmp1, FIX(0.871740478)) + /* c3 */ + MULTIPLY(tmp5 - tmp6, FIX(0.305035186)); /* c11 */ + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(tmp10 + tmp12 - MULTIPLY(tmp1, FIX(0.276965844)) /* c3-c9-c13 */ + - MULTIPLY(tmp5, FIX(2.004803435)), /* c1+c5+c11 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp11 + tmp12 + tmp3 + - MULTIPLY(tmp0, FIX(0.735987049)) /* c3+c5-c1 */ + - MULTIPLY(tmp6, FIX(0.082925825)), /* c9-c11-c13 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 6x12 sample block. + * + * 6-point FDCT in pass 1 (rows), 12-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + DCTELEM workspace[8*4]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[5]); + tmp11 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) + GETJSAMPLE(elemptr[3]); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[5]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]); + tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(1.224744871)), /* c2 */ + CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(0.707106781)), /* c4 */ + CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = DESCALE(MULTIPLY(tmp0 + tmp2, FIX(0.366025404)), /* c5 */ + CONST_BITS-PASS1_BITS); + + dataptr[1] = (DCTELEM) (tmp10 + ((tmp0 + tmp1) << PASS1_BITS)); + dataptr[3] = (DCTELEM) ((tmp0 - tmp1 - tmp2) << PASS1_BITS); + dataptr[5] = (DCTELEM) (tmp10 + ((tmp2 - tmp1) << PASS1_BITS)); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 12) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/12) = 8/9, which we + * fold into the constant multipliers: + * 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24) * 8/9. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] + wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] + wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] + dataptr[DCTSIZE*6]; + + tmp10 = tmp0 + tmp5; + tmp13 = tmp0 - tmp5; + tmp11 = tmp1 + tmp4; + tmp14 = tmp1 - tmp4; + tmp12 = tmp2 + tmp3; + tmp15 = tmp2 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*2]; + tmp2 = dataptr[DCTSIZE*2] - wsptr[DCTSIZE*1]; + tmp3 = dataptr[DCTSIZE*3] - wsptr[DCTSIZE*0]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*7]; + tmp5 = dataptr[DCTSIZE*5] - dataptr[DCTSIZE*6]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(MULTIPLY(tmp13 - tmp14 - tmp15, FIX(0.888888889)), /* 8/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.088662108)), /* c4 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp14 - tmp15, FIX(0.888888889)) + /* 8/9 */ + MULTIPLY(tmp13 + tmp15, FIX(1.214244803)), /* c2 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp1 + tmp4, FIX(0.481063200)); /* c9 */ + tmp14 = tmp10 + MULTIPLY(tmp1, FIX(0.680326102)); /* c3-c9 */ + tmp15 = tmp10 - MULTIPLY(tmp4, FIX(1.642452502)); /* c3+c9 */ + tmp12 = MULTIPLY(tmp0 + tmp2, FIX(0.997307603)); /* c5 */ + tmp13 = MULTIPLY(tmp0 + tmp3, FIX(0.765261039)); /* c7 */ + tmp10 = tmp12 + tmp13 + tmp14 - MULTIPLY(tmp0, FIX(0.516244403)) /* c5+c7-c1 */ + + MULTIPLY(tmp5, FIX(0.164081699)); /* c11 */ + tmp11 = MULTIPLY(tmp2 + tmp3, - FIX(0.164081699)); /* -c11 */ + tmp12 += tmp11 - tmp15 - MULTIPLY(tmp2, FIX(2.079550144)) /* c1+c5-c11 */ + + MULTIPLY(tmp5, FIX(0.765261039)); /* c7 */ + tmp13 += tmp11 - tmp14 + MULTIPLY(tmp3, FIX(0.645144899)) /* c1+c11-c7 */ + - MULTIPLY(tmp5, FIX(0.997307603)); /* c5 */ + tmp11 = tmp15 + MULTIPLY(tmp0 - tmp3, FIX(1.161389302)) /* c3 */ + - MULTIPLY(tmp2 + tmp5, FIX(0.481063200)); /* c9 */ + + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp11, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 5x10 sample block. + * + * 5-point FDCT in pass 1 (rows), 10-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4; + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + DCTELEM workspace[8*2]; + DCTELEM *dataptr; + DCTELEM *wsptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10). */ + + dataptr = data; + ctr = 0; + for (;;) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[3]); + tmp2 = GETJSAMPLE(elemptr[2]); + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + + tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]); + tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << PASS1_BITS); + tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */ + tmp10 -= tmp2 << 2; + tmp10 = MULTIPLY(tmp10, FIX(0.353553391)); /* (c2-c4)/2 */ + dataptr[2] = (DCTELEM) DESCALE(tmp11 + tmp10, CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) DESCALE(tmp11 - tmp10, CONST_BITS-PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp1, FIX(0.831253876)); /* c3 */ + + dataptr[1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0, FIX(0.513743148)), /* c1-c3 */ + CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp1, FIX(2.176250899)), /* c1+c3 */ + CONST_BITS-PASS1_BITS); + + ctr++; + + if (ctr != DCTSIZE) { + if (ctr == 10) + break; /* Done. */ + dataptr += DCTSIZE; /* advance pointer to next row */ + } else + dataptr = workspace; /* switch pointer to extended workspace */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/5)*(8/10) = 32/25, which we + * fold into the constant multipliers: + * 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20) * 32/25. + */ + + dataptr = data; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] + wsptr[DCTSIZE*0]; + tmp12 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5]; + + tmp10 = tmp0 + tmp4; + tmp13 = tmp0 - tmp4; + tmp11 = tmp1 + tmp3; + tmp14 = tmp1 - tmp3; + + tmp0 = dataptr[DCTSIZE*0] - wsptr[DCTSIZE*1]; + tmp1 = dataptr[DCTSIZE*1] - wsptr[DCTSIZE*0]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*7]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*6]; + tmp4 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11 + tmp12, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp12 += tmp12; + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp12, FIX(1.464477191)) - /* c4 */ + MULTIPLY(tmp11 - tmp12, FIX(0.559380511)), /* c8 */ + CONST_BITS+PASS1_BITS); + tmp10 = MULTIPLY(tmp13 + tmp14, FIX(1.064004961)); /* c6 */ + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp13, FIX(0.657591230)), /* c2-c6 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + DESCALE(tmp10 - MULTIPLY(tmp14, FIX(2.785601151)), /* c2+c6 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = tmp0 + tmp4; + tmp11 = tmp1 - tmp3; + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp2, FIX(1.28)), /* 32/25 */ + CONST_BITS+PASS1_BITS); + tmp2 = MULTIPLY(tmp2, FIX(1.28)); /* 32/25 */ + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(MULTIPLY(tmp0, FIX(1.787906876)) + /* c1 */ + MULTIPLY(tmp1, FIX(1.612894094)) + tmp2 + /* c3 */ + MULTIPLY(tmp3, FIX(0.821810588)) + /* c7 */ + MULTIPLY(tmp4, FIX(0.283176630)), /* c9 */ + CONST_BITS+PASS1_BITS); + tmp12 = MULTIPLY(tmp0 - tmp4, FIX(1.217352341)) - /* (c3+c7)/2 */ + MULTIPLY(tmp1 + tmp3, FIX(0.752365123)); /* (c1-c9)/2 */ + tmp13 = MULTIPLY(tmp10 + tmp11, FIX(0.395541753)) + /* (c3-c7)/2 */ + MULTIPLY(tmp11, FIX(0.64)) - tmp2; /* 16/25 */ + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp12 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp12 - tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + wsptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 4x8 sample block. + * + * 4-point FDCT in pass 1 (rows), 8-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We must also scale the output by 8/4 = 2, which we add here. */ + /* 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). */ + + dataptr = data; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]); + tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]); + + tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]); + tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+1)); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-2); + + dataptr[1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS-1); + dataptr[3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + + /* Add fudge factor here for final descale. */ + tmp10 = tmp0 + tmp3 + (ONE << (PASS1_BITS-1)); + tmp12 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp13 = tmp1 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + dataptr[DCTSIZE*2] = (DCTELEM) + RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) + RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + * i0..i3 in the paper are tmp0..tmp3 here. + */ + + tmp10 = tmp0 + tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp0 + tmp2; + tmp13 = tmp1 + tmp3; + z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS+PASS1_BITS-1); + + tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */ + tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */ + tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */ + tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */ + tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */ + tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */ + tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */ + tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */ + + tmp12 += z1; + tmp13 += z1; + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) + RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 3x6 sample block. + * + * 3-point FDCT in pass 1 (rows), 6-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1, tmp2; + INT32 tmp10, tmp11, tmp12; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + /* We scale the results further by 2 as part of output adaption */ + /* scaling for different DCT size. */ + /* 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6). */ + + dataptr = data; + for (ctr = 0; ctr < 6; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[2]); + tmp1 = GETJSAMPLE(elemptr[1]); + + tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) + ((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+1)); + dataptr[2] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp1, FIX(0.707106781)), /* c2 */ + CONST_BITS-PASS1_BITS-1); + + /* Odd part */ + + dataptr[1] = (DCTELEM) + DESCALE(MULTIPLY(tmp2, FIX(1.224744871)), /* c1 */ + CONST_BITS-PASS1_BITS-1); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + * We must also scale the output by (8/6)*(8/3) = 32/9, which we partially + * fold into the constant multipliers (other part was done in pass 1): + * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12) * 16/9. + */ + + dataptr = data; + for (ctr = 0; ctr < 3; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*5]; + tmp11 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3]; + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + tmp0 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*5]; + tmp1 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*4]; + tmp2 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3]; + + dataptr[DCTSIZE*0] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 + tmp11, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*2] = (DCTELEM) + DESCALE(MULTIPLY(tmp12, FIX(2.177324216)), /* c2 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) + DESCALE(MULTIPLY(tmp10 - tmp11 - tmp11, FIX(1.257078722)), /* c4 */ + CONST_BITS+PASS1_BITS); + + /* Odd part */ + + tmp10 = MULTIPLY(tmp0 + tmp2, FIX(0.650711829)); /* c5 */ + + dataptr[DCTSIZE*1] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp0 + tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + DESCALE(MULTIPLY(tmp0 - tmp1 - tmp2, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) + DESCALE(tmp10 + MULTIPLY(tmp2 - tmp1, FIX(1.777777778)), /* 16/9 */ + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 2x4 sample block. + * + * 2-point FDCT in pass 1 (rows), 4-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + INT32 tmp10, tmp11; + DCTELEM *dataptr; + JSAMPROW elemptr; + int ctr; + SHIFT_TEMPS + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT. */ + /* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here. */ + + dataptr = data; + for (ctr = 0; ctr < 4; ctr++) { + elemptr = sample_data[ctr] + start_col; + + /* Even part */ + + tmp0 = GETJSAMPLE(elemptr[0]); + tmp1 = GETJSAMPLE(elemptr[1]); + + /* Apply unsigned->signed conversion */ + dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3); + + /* Odd part */ + + dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We leave the results scaled up by an overall factor of 8. + * 4-point FDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. + */ + + dataptr = data; + for (ctr = 0; ctr < 2; ctr++) { + /* Even part */ + + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*3]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*2]; + + tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3]; + tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2]; + + dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1); + dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1); + + /* Odd part */ + + tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-1); + + dataptr[DCTSIZE*1] = (DCTELEM) + RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */ + CONST_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) + RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */ + CONST_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + + +/* + * Perform the forward DCT on a 1x2 sample block. + * + * 1-point FDCT in pass 1 (rows), 2-point in pass 2 (columns). + */ + +GLOBAL(void) +jpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col) +{ + INT32 tmp0, tmp1; + + /* Pre-zero output coefficient block. */ + MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2); + + tmp0 = GETJSAMPLE(sample_data[0][start_col]); + tmp1 = GETJSAMPLE(sample_data[1][start_col]); + + /* We leave the results scaled up by an overall factor of 8. + * We must also scale the output by (8/1)*(8/2) = 2**5. + */ + + /* Even part */ + /* Apply unsigned->signed conversion */ + data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5); + + /* Odd part */ + data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5); +} + +#endif /* DCT_SCALING_SUPPORTED */ #endif /* DCT_ISLOW_SUPPORTED */ diff --git a/3rdparty/libjpeg/jidctflt.c b/3rdparty/libjpeg/jidctflt.c index 0188ce3df..23ae9d333 100644 --- a/3rdparty/libjpeg/jidctflt.c +++ b/3rdparty/libjpeg/jidctflt.c @@ -2,6 +2,7 @@ * jidctflt.c * * Copyright (C) 1994-1998, Thomas G. Lane. + * Modified 2010 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -76,10 +77,9 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, FLOAT_MULT_TYPE * quantptr; FAST_FLOAT * wsptr; JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); + JSAMPLE *range_limit = cinfo->sample_range_limit; int ctr; FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ - SHIFT_TEMPS /* Pass 1: process columns from input, store into work array. */ @@ -152,12 +152,12 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ - tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ - tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ + tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */ tmp6 = tmp12 - tmp7; /* phase 2 */ tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; + tmp4 = tmp10 - tmp5; wsptr[DCTSIZE*0] = tmp0 + tmp7; wsptr[DCTSIZE*7] = tmp0 - tmp7; @@ -165,8 +165,8 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, wsptr[DCTSIZE*6] = tmp1 - tmp6; wsptr[DCTSIZE*2] = tmp2 + tmp5; wsptr[DCTSIZE*5] = tmp2 - tmp5; - wsptr[DCTSIZE*4] = tmp3 + tmp4; - wsptr[DCTSIZE*3] = tmp3 - tmp4; + wsptr[DCTSIZE*3] = tmp3 + tmp4; + wsptr[DCTSIZE*4] = tmp3 - tmp4; inptr++; /* advance pointers to next column */ quantptr++; @@ -174,7 +174,6 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, } /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3. */ wsptr = workspace; for (ctr = 0; ctr < DCTSIZE; ctr++) { @@ -187,8 +186,10 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, /* Even part */ - tmp10 = wsptr[0] + wsptr[4]; - tmp11 = wsptr[0] - wsptr[4]; + /* Apply signed->unsigned and prepare float->int conversion */ + z5 = wsptr[0] + ((FAST_FLOAT) CENTERJSAMPLE + (FAST_FLOAT) 0.5); + tmp10 = z5 + wsptr[4]; + tmp11 = z5 - wsptr[4]; tmp13 = wsptr[2] + wsptr[6]; tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; @@ -209,31 +210,23 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ - tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ - tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ + tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */ + tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */ tmp6 = tmp12 - tmp7; tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; + tmp4 = tmp10 - tmp5; - /* Final output stage: scale down by a factor of 8 and range-limit */ + /* Final output stage: float->int conversion and range-limit */ - outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3) - & RANGE_MASK]; - outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3) - & RANGE_MASK]; - outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3) - & RANGE_MASK]; - outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3) - & RANGE_MASK]; - outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3) - & RANGE_MASK]; + outptr[0] = range_limit[((int) (tmp0 + tmp7)) & RANGE_MASK]; + outptr[7] = range_limit[((int) (tmp0 - tmp7)) & RANGE_MASK]; + outptr[1] = range_limit[((int) (tmp1 + tmp6)) & RANGE_MASK]; + outptr[6] = range_limit[((int) (tmp1 - tmp6)) & RANGE_MASK]; + outptr[2] = range_limit[((int) (tmp2 + tmp5)) & RANGE_MASK]; + outptr[5] = range_limit[((int) (tmp2 - tmp5)) & RANGE_MASK]; + outptr[3] = range_limit[((int) (tmp3 + tmp4)) & RANGE_MASK]; + outptr[4] = range_limit[((int) (tmp3 - tmp4)) & RANGE_MASK]; wsptr += DCTSIZE; /* advance pointer to next row */ } diff --git a/3rdparty/libjpeg/jidctint.c b/3rdparty/libjpeg/jidctint.c index a72b3207c..dcdf7ce45 100644 --- a/3rdparty/libjpeg/jidctint.c +++ b/3rdparty/libjpeg/jidctint.c @@ -2,6 +2,7 @@ * jidctint.c * * Copyright (C) 1991-1998, Thomas G. Lane. + * Modification developed 2002-2009 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -23,6 +24,28 @@ * The advantage of this method is that no data path contains more than one * multiplication; this allows a very simple and accurate implementation in * scaled fixed-point arithmetic, with a minimal number of shifts. + * + * We also provide IDCT routines with various output sample block sizes for + * direct resolution reduction or enlargement and for direct resolving the + * common 2x1 and 1x2 subsampling cases without additional resampling: NxN + * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 input DCT block. + * + * For N<8 we simply take the corresponding low-frequency coefficients of + * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block + * to yield the downscaled outputs. + * This can be seen as direct low-pass downsampling from the DCT domain + * point of view rather than the usual spatial domain point of view, + * yielding significant computational savings and results at least + * as good as common bilinear (averaging) spatial downsampling. + * + * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as + * lower frequencies and higher frequencies assumed to be zero. + * It turns out that the computational effort is similar to the 8x8 IDCT + * regarding the output size. + * Furthermore, the scaling and descaling is the same for all IDCT sizes. + * + * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases + * since there would be too many additional constants to pre-calculate. */ #define JPEG_INTERNALS @@ -38,7 +61,7 @@ */ #if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ + Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ #endif @@ -151,7 +174,7 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, { INT32 tmp0, tmp1, tmp2, tmp3; INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; + INT32 z1, z2, z3; JCOEFPTR inptr; ISLOW_MULT_TYPE * quantptr; int * wsptr; @@ -165,6 +188,2657 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ /* furthermore, we scale the results by 2**PASS1_BITS. */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#ifdef IDCT_SCALING_SUPPORTED + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x7 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/14). + */ + +GLOBAL(void) +jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp13 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp13 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp13 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp13 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp0 = z1 + z3; + z2 -= tmp0; + tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */ + tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp0 = tmp1 - tmp2; + tmp1 += tmp2; + tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp1 += tmp2; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp0 += z2; + tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x6 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/12). + */ + +GLOBAL(void) +jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) (tmp11 + tmp1); + wsptr[6*4] = (int) (tmp11 - tmp1); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 5x5 output block. + * + * Optimized algorithm with 5 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/10). + */ + +GLOBAL(void) +jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp0 = (INT32) wsptr[2]; + tmp1 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 4x4 output block. + * + * Optimized algorithm with 3 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + +GLOBAL(void) +jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[4*0] = (int) (tmp10 + tmp0); + wsptr[4*3] = (int) (tmp10 - tmp0); + wsptr[4*1] = (int) (tmp12 + tmp2); + wsptr[4*2] = (int) (tmp12 - tmp2); + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x3 output block. + * + * Optimized algorithm with 2 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/6). + */ + +GLOBAL(void) +jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 2x2 output block. + * + * Multiplication-less algorithm. + */ + +GLOBAL(void) +jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: process columns from input. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Column 0 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + /* Add fudge factor here for final descale. */ + tmp4 += ONE << 2; + + tmp0 = tmp4 + tmp5; + tmp2 = tmp4 - tmp5; + + /* Column 1 */ + tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0+1], quantptr[DCTSIZE*0+1]); + tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1+1], quantptr[DCTSIZE*1+1]); + + tmp1 = tmp4 + tmp5; + tmp3 = tmp4 - tmp5; + + /* Pass 2: process 2 rows, store into output array. */ + + /* Row 0 */ + outptr = output_buf[0] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK]; + + /* Row 1 */ + outptr = output_buf[1] + output_col; + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 1x1 output block. + * + * We hardly need an inverse DCT routine for this: just take the + * average pixel value, which is one-eighth of the DC coefficient. + */ + +GLOBAL(void) +jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + int dcval; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* 1x1 is trivial: just take the DC coefficient divided by 8. */ + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + dcval = DEQUANTIZE(coef_block[0], quantptr[0]); + dcval = (int) DESCALE((INT32) dcval, 3); + + output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 9x9 output block. + * + * Optimized algorithm with 10 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/18). + */ + +GLOBAL(void) +jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*9]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 9 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 9; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */ + tmp1 = tmp0 + tmp3; + tmp2 = tmp0 - tmp3 - tmp3; + + tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */ + tmp11 = tmp2 + tmp0; + tmp14 = tmp2 - tmp0 - tmp0; + + tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */ + tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */ + tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */ + + tmp10 = tmp1 + tmp0 - tmp3; + tmp12 = tmp1 - tmp0 + tmp2; + tmp13 = tmp1 - tmp2 + tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */ + + tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */ + tmp0 = tmp2 + tmp3 - z2; + tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */ + tmp2 += z2 - tmp1; + tmp3 += z2 + tmp1; + tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x10 output block. + * + * Optimized algorithm with 12 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/20). + */ + +GLOBAL(void) +jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) (tmp22 + tmp12); + wsptr[8*7] = (int) (tmp22 - tmp12); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 11x11 output block. + * + * Optimized algorithm with 24 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/22). + */ + +GLOBAL(void) +jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*11]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 11 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 11; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */ + tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */ + z4 = z1 + z3; + tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */ + z4 -= z2; + tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */ + tmp21 = tmp20 + tmp23 + tmp25 - + MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */ + tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */ + tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */ + tmp24 += tmp25; + tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */ + tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */ + MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */ + tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z2; + tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */ + tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */ + tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */ + z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */ + tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */ + tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */ + z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */ + tmp11 += z1; + tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */ + tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */ + MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */ + MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x12 output block. + * + * Optimized algorithm with 15 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/24). + */ + +GLOBAL(void) +jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 13x13 output block. + * + * Optimized algorithm with 29 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/26). + */ + +GLOBAL(void) +jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*13]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 13 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 13; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */ + + tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */ + tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */ + + tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */ + tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */ + + tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */ + tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */ + + tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */ + tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */ + + tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */ + tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */ + tmp15 = z1 + z4; + tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */ + tmp10 = tmp11 + tmp12 + tmp13 - + MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */ + tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */ + tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */ + tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */ + tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */ + tmp11 += tmp14; + tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */ + tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */ + tmp12 += tmp14; + tmp13 += tmp14; + tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */ + tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */ + MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */ + z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */ + tmp14 += z1; + tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */ + MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x14 output block. + * + * Optimized algorithm with 20 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/28). + */ + +GLOBAL(void) +jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) (tmp23 + tmp13); + wsptr[8*10] = (int) (tmp23 - tmp13); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 15x15 output block. + * + * Optimized algorithm with 22 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/30). + */ + +GLOBAL(void) +jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*15]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 15 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 15; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[4]; + z4 = (INT32) wsptr[6]; + + tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */ + tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */ + + tmp12 = z1 - tmp10; + tmp13 = z1 + tmp11; + z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */ + + z4 = z2 - z3; + z3 += z2; + tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */ + z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */ + + tmp20 = tmp13 + tmp10 + tmp11; + tmp23 = tmp12 - tmp10 + tmp11 + z2; + + tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */ + + tmp25 = tmp13 - tmp10 - tmp11; + tmp26 = tmp12 + tmp10 - tmp11 - z2; + + tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */ + tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */ + + tmp21 = tmp12 + tmp10 + tmp11; + tmp24 = tmp13 - tmp10 + tmp11; + tmp11 += tmp11; + tmp22 = z1 + tmp11; /* c10 = c6-c12 */ + tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z4 = (INT32) wsptr[5]; + z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */ + z4 = (INT32) wsptr[7]; + + tmp13 = z2 - z4; + tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */ + tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */ + tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */ + + tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */ + tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */ + z2 = z1 - z4; + tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */ + + tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */ + tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */ + tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */ + z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */ + tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */ + tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x16 output block. + * + * Optimized algorithm with 28 multiplications in the 1-D kernel. + * cK represents sqrt(2) * cos(K*pi/32). + */ + +GLOBAL(void) +jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += 1 << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 16 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 16; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 16x8 output block. + * + * 8-point IDCT in pass 1 (columns), 16-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*8]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + inptr = coef_block; quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; wsptr = workspace; @@ -207,19 +2881,23 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); - tmp0 = (z2 + z3) << CONST_BITS; - tmp1 = (z2 - z3) << CONST_BITS; + tmp0 = z2 + z3; + tmp1 = z2 - z3; - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; /* Odd part per figure 8; the matrix is unitary and hence its * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. @@ -230,80 +2908,1240 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; + tmp1 += z1 + z3; + tmp2 += z1 + z2; /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); inptr++; /* advance pointers to next column */ quantptr++; wsptr++; } + + /* Pass 2: process 8 rows from work array, store into output array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + + z1 = (INT32) wsptr[4]; + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 14x7 output block. + * + * 7-point IDCT in pass 1 (columns), 14-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*7]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp23 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp23 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp23 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 7 rows from work array, store into output array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z1 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */ + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[6]; + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + z4 <<= CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */ + tmp16 += tmp15; + tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */ + tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = ((z1 - z3) << CONST_BITS) + z4; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 12x6 output block. + * + * 6-point IDCT in pass 1 (columns), 12-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp10 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp12 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = RIGHT_SHIFT(tmp10 - tmp20 - tmp20, CONST_BITS-PASS1_BITS); + tmp20 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) (tmp21 + tmp11); + wsptr[8*4] = (int) (tmp21 - tmp11); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + + z4 = (INT32) wsptr[4]; + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = (INT32) wsptr[2]; + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = (INT32) wsptr[6]; + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z4 = (INT32) wsptr[7]; + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 10x5 output block. + * + * 5-point IDCT in pass 1 (columns), 10-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*5]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp12 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp12 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp13 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp14 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp10 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp11 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 5 rows from work array, store into output array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[4]; + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + z3 <<= CONST_BITS; + z4 = (INT32) wsptr[7]; + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z3 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = ((z1 - tmp13) << CONST_BITS) - z3; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 8; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x4 output block. + * + * 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << PASS1_BITS; + tmp12 = (tmp0 - tmp2) << PASS1_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */ + CONST_BITS-PASS1_BITS); + tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */ + CONST_BITS-PASS1_BITS); + + /* Final output stage */ + + wsptr[8*0] = (int) (tmp10 + tmp0); + wsptr[8*3] = (int) (tmp10 - tmp0); + wsptr[8*1] = (int) (tmp12 + tmp2); + wsptr[8*2] = (int) (tmp12 - tmp2); + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 6x3 output block. + * + * 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*3]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 3 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[4]; + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = tmp0 - tmp10 - tmp10; + tmp10 = (INT32) wsptr[2]; + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x2 output block. + * + * 2-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[4*2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + /* Odd part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + wsptr[4*0] = tmp10 + tmp0; + wsptr[4*1] = tmp10 - tmp0; + } + + /* Pass 2: process 2 rows from work array, store into output array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = wsptr[0] + (ONE << 2); + tmp2 = wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = wsptr[1]; + z3 = wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x1 output block. + * + * 1-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Pass 1: empty. */ + + /* Pass 2: process 1 row from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + outptr = output_buf[0] + output_col; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]); + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK]; +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 8x16 output block. + * + * 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[8*16]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + + z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */ + tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */ + + tmp10 = tmp0 + tmp1; + tmp11 = tmp0 - tmp1; + tmp12 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z3 = z1 - z2; + z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */ + z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */ + + tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */ + tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */ + tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */ + tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */ + + tmp20 = tmp10 + tmp0; + tmp27 = tmp10 - tmp0; + tmp21 = tmp12 + tmp1; + tmp26 = tmp12 - tmp1; + tmp22 = tmp13 + tmp2; + tmp25 = tmp13 - tmp2; + tmp23 = tmp11 + tmp3; + tmp24 = tmp11 - tmp3; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z1 + z3; + + tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */ + tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */ + tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */ + tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */ + tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */ + tmp0 = tmp1 + tmp2 + tmp3 - + MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */ + tmp13 = tmp10 + tmp11 + tmp12 - + MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */ + z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */ + tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */ + tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */ + z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */ + tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */ + tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */ + z2 += z4; + z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */ + tmp1 += z1; + tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */ + z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */ + tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */ + tmp12 += z2; + z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */ + tmp2 += z2; + tmp3 += z2; + z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */ + tmp10 += z2; + tmp11 += z2; + + /* Final output stage */ + + wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS); + } /* Pass 2: process rows from work array, store into output array. */ /* Note that we must descale the results by a factor of 8 == 2**3, */ /* and also undo the PASS1_BITS scaling. */ wsptr = workspace; - for (ctr = 0; ctr < DCTSIZE; ctr++) { + for (ctr = 0; ctr < 16; ctr++) { outptr = output_buf[ctr] + output_col; - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * On machines with very fast multiplication, it's possible that the - * test takes more time than it's worth. In that case this section - * may be commented out. - */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - outptr[4] = dcval; - outptr[5] = dcval; - outptr[6] = dcval; - outptr[7] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif /* Even part: reverse the even part of the forward DCT. */ /* The rotator is sqrt(2)*c(-6). */ @@ -312,16 +4150,20 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, z3 = (INT32) wsptr[6]; z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); - tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS; - tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + z3 = (INT32) wsptr[4]; - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; /* Odd part per figure 8; the matrix is unitary and hence its * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. @@ -332,58 +4174,964 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, tmp2 = (INT32) wsptr[3]; tmp3 = (INT32) wsptr[1]; - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; + tmp1 += z1 + z3; + tmp2 += z1 + z2; /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3, - CONST_BITS+PASS1_BITS+3) + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; - outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3, - CONST_BITS+PASS1_BITS+3) + outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2, - CONST_BITS+PASS1_BITS+3) + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; - outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2, - CONST_BITS+PASS1_BITS+3) + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1, - CONST_BITS+PASS1_BITS+3) + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; - outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1, - CONST_BITS+PASS1_BITS+3) + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0, - CONST_BITS+PASS1_BITS+3) + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; - outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0, - CONST_BITS+PASS1_BITS+3) + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) & RANGE_MASK]; wsptr += DCTSIZE; /* advance pointer to next row */ } } + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 7x14 output block. + * + * 14-point IDCT in pass 1 (columns), 7-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[7*14]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z1 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z1 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */ + z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */ + z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */ + + tmp10 = z1 + z2; + tmp11 = z1 + z3; + tmp12 = z1 - z4; + + tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */ + + tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */ + tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */ + tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */ + MULTIPLY(z2, FIX(1.378756276)); /* c2 */ + + tmp20 = tmp10 + tmp13; + tmp26 = tmp10 - tmp13; + tmp21 = tmp11 + tmp14; + tmp25 = tmp11 - tmp14; + tmp22 = tmp12 + tmp15; + tmp24 = tmp12 - tmp15; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp13 = z4 << CONST_BITS; + + tmp14 = z1 + z3; + tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */ + tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */ + tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */ + tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */ + tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */ + z1 -= z2; + tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */ + tmp16 += tmp15; + z1 += z4; + z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */ + tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */ + tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */ + z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */ + tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */ + tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */ + + tmp13 = (z1 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[7*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[7*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[7*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[7*3] = (int) (tmp23 + tmp13); + wsptr[7*10] = (int) (tmp23 - tmp13); + wsptr[7*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[7*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + wsptr[7*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS); + wsptr[7*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 14 rows from work array, store into output array. + * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14). + */ + wsptr = workspace; + for (ctr = 0; ctr < 14; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp23 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp23 <<= CONST_BITS; + + z1 = (INT32) wsptr[2]; + z2 = (INT32) wsptr[4]; + z3 = (INT32) wsptr[6]; + + tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */ + tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */ + tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */ + tmp10 = z1 + z3; + z2 -= tmp10; + tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */ + tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */ + tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */ + tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */ + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + + tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */ + tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */ + tmp10 = tmp11 - tmp12; + tmp11 += tmp12; + tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */ + tmp11 += tmp12; + z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */ + tmp10 += z2; + tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 7; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 6x12 output block. + * + * 12-point IDCT in pass 1 (columns), 6-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[6*12]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */ + + tmp10 = z3 + z4; + tmp11 = z3 - z4; + + z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */ + z1 <<= CONST_BITS; + z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + z2 <<= CONST_BITS; + + tmp12 = z1 - z2; + + tmp21 = z3 + tmp12; + tmp24 = z3 - tmp12; + + tmp12 = z4 + z2; + + tmp20 = tmp10 + tmp12; + tmp25 = tmp10 - tmp12; + + tmp12 = z4 - z1 - z2; + + tmp22 = tmp11 + tmp12; + tmp23 = tmp11 - tmp12; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */ + tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */ + + tmp10 = z1 + z3; + tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */ + tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */ + tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */ + tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */ + tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */ + tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */ + tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */ + MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */ + + z1 -= z4; + z2 -= z3; + z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */ + tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */ + tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */ + + /* Final output stage */ + + wsptr[6*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[6*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[6*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS); + wsptr[6*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[6*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + wsptr[6*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS); + wsptr[6*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 12 rows from work array, store into output array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + wsptr = workspace; + for (ctr = 0; ctr < 12; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp10 <<= CONST_BITS; + tmp12 = (INT32) wsptr[4]; + tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */ + tmp11 = tmp10 + tmp20; + tmp21 = tmp10 - tmp20 - tmp20; + tmp20 = (INT32) wsptr[2]; + tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */ + tmp20 = tmp11 + tmp10; + tmp22 = tmp11 - tmp10; + + /* Odd part */ + + z1 = (INT32) wsptr[1]; + z2 = (INT32) wsptr[3]; + z3 = (INT32) wsptr[5]; + tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp10 = tmp11 + ((z1 + z2) << CONST_BITS); + tmp12 = tmp11 + ((z3 - z2) << CONST_BITS); + tmp11 = (z1 - z2 - z3) << CONST_BITS; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 6; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 5x10 output block. + * + * 10-point IDCT in pass 1 (columns), 5-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp10, tmp11, tmp12, tmp13, tmp14; + INT32 tmp20, tmp21, tmp22, tmp23, tmp24; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[5*10]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z3 += ONE << (CONST_BITS-PASS1_BITS-1); + z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */ + z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */ + tmp10 = z3 + z1; + tmp11 = z3 - z2; + + tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */ + CONST_BITS-PASS1_BITS); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */ + tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */ + tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */ + + tmp20 = tmp10 + tmp12; + tmp24 = tmp10 - tmp12; + tmp21 = tmp11 + tmp13; + tmp23 = tmp11 - tmp13; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + tmp11 = z2 + z4; + tmp13 = z2 - z4; + + tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */ + z5 = z3 << CONST_BITS; + + z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */ + z4 = z5 + tmp12; + + tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */ + tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */ + + z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */ + z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1)); + + tmp12 = (z1 - tmp13 - z3) << PASS1_BITS; + + tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */ + tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */ + + /* Final output stage */ + + wsptr[5*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS); + wsptr[5*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS); + wsptr[5*2] = (int) (tmp22 + tmp12); + wsptr[5*7] = (int) (tmp22 - tmp12); + wsptr[5*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS); + wsptr[5*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS); + wsptr[5*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 10 rows from work array, store into output array. + * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10). + */ + wsptr = workspace; + for (ctr = 0; ctr < 10; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp12 <<= CONST_BITS; + tmp13 = (INT32) wsptr[2]; + tmp14 = (INT32) wsptr[4]; + z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */ + z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */ + z3 = tmp12 + z2; + tmp10 = z3 + z1; + tmp11 = z3 - z1; + tmp12 -= z2 << 2; + + /* Odd part */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */ + tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */ + tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp13, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp14, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 5; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 4x8 output block. + * + * 8-point IDCT in pass 1 (columns), 4-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[4*8]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 4; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[4*0] = dcval; + wsptr[4*1] = dcval; + wsptr[4*2] = dcval; + wsptr[4*3] = dcval; + wsptr[4*4] = dcval; + wsptr[4*5] = dcval; + wsptr[4*6] = dcval; + wsptr[4*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); + tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + z2 <<= CONST_BITS; + z3 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + z2 += ONE << (CONST_BITS-PASS1_BITS-1); + + tmp0 = z2 + z3; + tmp1 = z2 - z3; + + tmp10 = tmp0 + tmp2; + tmp13 = tmp0 - tmp2; + tmp11 = tmp1 + tmp3; + tmp12 = tmp1 - tmp3; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z2 = tmp0 + tmp2; + z3 = tmp1 + tmp3; + + z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */ + z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + z2 += z1; + z3 += z1; + + z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + tmp0 += z1 + z2; + tmp3 += z1 + z3; + + z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp1 += z1 + z3; + tmp2 += z1 + z2; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[4*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[4*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[4*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[4*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[4*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process 8 rows from work array, store into output array. + * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16). + */ + wsptr = workspace; + for (ctr = 0; ctr < 8; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp2 = (INT32) wsptr[2]; + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = (INT32) wsptr[1]; + z3 = (INT32) wsptr[3]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 4; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 3x6 output block. + * + * 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[3*6]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12). + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= CONST_BITS; + /* Add fudge factor here for final descale. */ + tmp0 += ONE << (CONST_BITS-PASS1_BITS-1); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */ + tmp1 = tmp0 + tmp10; + tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS); + tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */ + tmp10 = tmp1 + tmp0; + tmp12 = tmp1 - tmp0; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */ + tmp0 = tmp1 + ((z1 + z2) << CONST_BITS); + tmp2 = tmp1 + ((z3 - z2) << CONST_BITS); + tmp1 = (z1 - z2 - z3) << PASS1_BITS; + + /* Final output stage */ + + wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS); + wsptr[3*1] = (int) (tmp11 + tmp1); + wsptr[3*4] = (int) (tmp11 - tmp1); + wsptr[3*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[3*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS); + } + + /* Pass 2: process 6 rows from work array, store into output array. + * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6). + */ + wsptr = workspace; + for (ctr = 0; ctr < 6; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2)); + tmp0 <<= CONST_BITS; + tmp2 = (INT32) wsptr[2]; + tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */ + tmp10 = tmp0 + tmp12; + tmp2 = tmp0 - tmp12 - tmp12; + + /* Odd part */ + + tmp12 = (INT32) wsptr[1]; + tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += 3; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 2x4 output block. + * + * 4-point IDCT in pass 1 (columns), 2-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + INT32 * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + INT32 workspace[2*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. + * 4-point IDCT kernel, + * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT]. + */ + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++, inptr++, quantptr++, wsptr++) { + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + + tmp10 = (tmp0 + tmp2) << CONST_BITS; + tmp12 = (tmp0 - tmp2) << CONST_BITS; + + /* Odd part */ + /* Same rotation as in the even part of the 8x8 LL&M IDCT */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */ + tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */ + tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */ + + /* Final output stage */ + + wsptr[2*0] = tmp10 + tmp0; + wsptr[2*3] = tmp10 - tmp0; + wsptr[2*1] = tmp12 + tmp2; + wsptr[2*2] = tmp12 - tmp2; + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + + /* Even part */ + + /* Add fudge factor here for final descale. */ + tmp10 = wsptr[0] + (ONE << (CONST_BITS+2)); + + /* Odd part */ + + tmp0 = wsptr[1]; + + /* Final output stage */ + + outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS+3) + & RANGE_MASK]; + + wsptr += 2; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a 1x2 output block. + * + * 2-point IDCT in pass 1 (columns), 1-point in pass 2 (rows). + */ + +GLOBAL(void) +jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* Process 1 column from input, store into output array. */ + + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Even part */ + + tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]); + /* Add fudge factor here for final descale. */ + tmp10 += ONE << 2; + + /* Odd part */ + + tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* Final output stage */ + + output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) + & RANGE_MASK]; + output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) + & RANGE_MASK]; +} + +#endif /* IDCT_SCALING_SUPPORTED */ #endif /* DCT_ISLOW_SUPPORTED */ diff --git a/3rdparty/libjpeg/jidctred.c b/3rdparty/libjpeg/jidctred.c deleted file mode 100644 index 421f3c7ca..000000000 --- a/3rdparty/libjpeg/jidctred.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * jidctred.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains inverse-DCT routines that produce reduced-size output: - * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block. - * - * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M) - * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step - * with an 8-to-4 step that produces the four averages of two adjacent outputs - * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output). - * These steps were derived by computing the corresponding values at the end - * of the normal LL&M code, then simplifying as much as possible. - * - * 1x1 is trivial: just take the DC coefficient divided by 8. - * - * See jidctint.c for additional comments. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef IDCT_SCALING_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Scaling is the same as in jidctint.c. */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */ -#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */ -#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */ -#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */ -#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */ -#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */ -#else -#define FIX_0_211164243 FIX(0.211164243) -#define FIX_0_509795579 FIX(0.509795579) -#define FIX_0_601344887 FIX(0.601344887) -#define FIX_0_720959822 FIX(0.720959822) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_850430095 FIX(0.850430095) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_061594337 FIX(1.061594337) -#define FIX_1_272758580 FIX(1.272758580) -#define FIX_1_451774981 FIX(1.451774981) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_2_172734803 FIX(2.172734803) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_624509785 FIX(3.624509785) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce an int result. In this module, both inputs and result - * are 16 bits or less, so either int or short multiply will work. - */ - -#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 4x4 output block. - */ - -GLOBAL(void) -jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp2, tmp10, tmp12; - INT32 z1, z2, z3, z4; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE*4]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { - /* Don't bother to process column 4, because second pass won't use it */ - if (ctr == DCTSIZE-4) - continue; - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 && - inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) { - /* AC terms all zero; we need not examine term 4 for 4x4 output */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - - continue; - } - - /* Even part */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp0 <<= (CONST_BITS+1); - - z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865); - - tmp10 = tmp0 + tmp2; - tmp12 = tmp0 - tmp2; - - /* Odd part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - - tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ - + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ - + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ - + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ - - tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ - + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ - + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ - + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1); - } - - /* Pass 2: process 4 rows from work array, store into output array. */ - - wsptr = workspace; - for (ctr = 0; ctr < 4; ctr++) { - outptr = output_buf[ctr] + output_col; - /* It's not clear whether a zero row test is worthwhile here ... */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1); - - tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065) - + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865); - - tmp10 = tmp0 + tmp2; - tmp12 = tmp0 - tmp2; - - /* Odd part */ - - z1 = (INT32) wsptr[7]; - z2 = (INT32) wsptr[5]; - z3 = (INT32) wsptr[3]; - z4 = (INT32) wsptr[1]; - - tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ - + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ - + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ - + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ - - tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ - + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ - + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ - + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 2x2 output block. - */ - -GLOBAL(void) -jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp10, z1; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE*2]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { - /* Don't bother to process columns 2,4,6 */ - if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6) - continue; - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) { - /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - - continue; - } - - /* Even part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp10 = z1 << (CONST_BITS+2); - - /* Odd part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2); - } - - /* Pass 2: process 2 rows from work array, store into output array. */ - - wsptr = workspace; - for (ctr = 0; ctr < 2; ctr++) { - outptr = output_buf[ctr] + output_col; - /* It's not clear whether a zero row test is worthwhile here ... */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2); - - /* Odd part */ - - tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */ - + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */ - + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */ - + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0, - CONST_BITS+PASS1_BITS+3+2) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0, - CONST_BITS+PASS1_BITS+3+2) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 1x1 output block. - */ - -GLOBAL(void) -jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - int dcval; - ISLOW_MULT_TYPE * quantptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - SHIFT_TEMPS - - /* We hardly need an inverse DCT routine for this: just take the - * average pixel value, which is one-eighth of the DC coefficient. - */ - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - dcval = DEQUANTIZE(coef_block[0], quantptr[0]); - dcval = (int) DESCALE((INT32) dcval, 3); - - output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; -} - -#endif /* IDCT_SCALING_SUPPORTED */ diff --git a/3rdparty/libjpeg/jmemmgr.c b/3rdparty/libjpeg/jmemmgr.c index 31050bf59..f0e83fb95 100644 --- a/3rdparty/libjpeg/jmemmgr.c +++ b/3rdparty/libjpeg/jmemmgr.c @@ -2,6 +2,7 @@ * jmemmgr.c * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -36,9 +37,6 @@ extern char * getenv JPP((const char * name)); #endif #endif -#if defined _MSC_VER && _MSC_VER >= 1400 -#pragma warning(disable: 4267) -#endif /* * Some important notes: @@ -824,7 +822,7 @@ access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr, undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ end_row -= ptr->cur_start_row; while (undef_row < end_row) { - jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); undef_row++; } } else { @@ -909,7 +907,7 @@ access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr, undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ end_row -= ptr->cur_start_row; while (undef_row < end_row) { - jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); undef_row++; } } else { diff --git a/3rdparty/libjpeg/jmemnobs.c b/3rdparty/libjpeg/jmemnobs.c new file mode 100644 index 000000000..eb8c33772 --- /dev/null +++ b/3rdparty/libjpeg/jmemnobs.c @@ -0,0 +1,109 @@ +/* + * jmemnobs.c + * + * Copyright (C) 1992-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides a really simple implementation of the system- + * dependent portion of the JPEG memory manager. This implementation + * assumes that no backing-store files are needed: all required space + * can be obtained from malloc(). + * This is very portable in the sense that it'll compile on almost anything, + * but you'd better have lots of main memory (or virtual memory) if you want + * to process big images. + * Note that the max_memory_to_use option is ignored by this implementation. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + + +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: although we include FAR keywords in the routine declarations, + * this file won't actually work in 80x86 small/medium model; at least, + * you probably won't be able to process useful-size images in only 64KB. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * Here we always say, "we got all you want bud!" + */ + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return max_bytes_needed; +} + + +/* + * Backing store (temporary file) management. + * Since jpeg_mem_available always promised the moon, + * this should never be called and we can just error out. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + ERREXIT(cinfo, JERR_NO_BACKING_STORE); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. Here, there isn't any. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + return 0; /* just set max_memory_to_use to 0 */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/3rdparty/libjpeg/jmorecfg.h b/3rdparty/libjpeg/jmorecfg.h index 54a7d1c44..6c085c36a 100644 --- a/3rdparty/libjpeg/jmorecfg.h +++ b/3rdparty/libjpeg/jmorecfg.h @@ -2,6 +2,7 @@ * jmorecfg.h * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -158,8 +159,14 @@ typedef short INT16; /* INT32 must hold at least signed 32-bit values. */ #ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ +#ifndef _BASETSD_H /* MinGW is slightly different */ +#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ typedef long INT32; #endif +#endif +#endif +#endif /* Datatype used for image dimensions. The JPEG standard only supports * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore @@ -209,11 +216,13 @@ typedef unsigned int JDIMENSION; * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. */ +#ifndef FAR #ifdef NEED_FAR_POINTERS #define FAR far #else #define FAR #endif +#endif /* @@ -256,8 +265,6 @@ typedef int boolean; * (You may HAVE to do that if your compiler doesn't like null source files.) */ -/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ - /* Capability options common to encoder and decoder: */ #define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ @@ -266,9 +273,10 @@ typedef int boolean; /* Encoder capability options: */ -#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ #define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ #define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ #define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ /* Note: if you selected 12-bit data precision, it is dangerous to turn off * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit @@ -282,12 +290,12 @@ typedef int boolean; /* Decoder capability options: */ -#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ #define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ #define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ #define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ #define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ #undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ #define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ #define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ @@ -304,9 +312,7 @@ typedef int boolean; * the offsets will also change the order in which colormap data is organized. * RESTRICTIONS: * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not - * useful if you are using JPEG color spaces other than YCbCr or grayscale. - * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE * is not 3 (they don't understand about dummy color components!). So you * can't use color quantization if you change that value. */ diff --git a/3rdparty/libjpeg/jpegint.h b/3rdparty/libjpeg/jpegint.h index 95b00d405..c0d5c1420 100644 --- a/3rdparty/libjpeg/jpegint.h +++ b/3rdparty/libjpeg/jpegint.h @@ -2,6 +2,7 @@ * jpegint.h * * Copyright (C) 1991-1997, Thomas G. Lane. + * Modified 1997-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -99,14 +100,16 @@ struct jpeg_downsampler { }; /* Forward DCT (also controls coefficient quantization) */ +typedef JMETHOD(void, forward_DCT_ptr, + (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks)); + struct jpeg_forward_dct { JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - /* perhaps this should be an array??? */ - JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, - jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks)); + /* It is useful to allow each component to have a separate FDCT method. */ + forward_DCT_ptr forward_DCT[MAX_COMPONENTS]; }; /* Entropy encoding */ @@ -210,10 +213,6 @@ struct jpeg_entropy_decoder { JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)); - - /* This is here to share code between baseline and progressive decoders; */ - /* other modules probably should not use it */ - boolean insufficient_data; /* set TRUE after emitting warning */ }; /* Inverse DCT (also performs dequantization) */ @@ -303,7 +302,7 @@ struct jpeg_color_quantizer { #define jinit_downsampler jIDownsampler #define jinit_forward_dct jIFDCT #define jinit_huff_encoder jIHEncoder -#define jinit_phuff_encoder jIPHEncoder +#define jinit_arith_encoder jIAEncoder #define jinit_marker_writer jIMWriter #define jinit_master_decompress jIDMaster #define jinit_d_main_controller jIDMainC @@ -312,7 +311,7 @@ struct jpeg_color_quantizer { #define jinit_input_controller jIInCtlr #define jinit_marker_reader jIMReader #define jinit_huff_decoder jIHDecoder -#define jinit_phuff_decoder jIPHDecoder +#define jinit_arith_decoder jIADecoder #define jinit_inverse_dct jIIDCT #define jinit_upsampler jIUpsampler #define jinit_color_deconverter jIDColor @@ -322,14 +321,41 @@ struct jpeg_color_quantizer { #define jinit_memory_mgr jIMemMgr #define jdiv_round_up jDivRound #define jround_up jRound +#define jzero_far jZeroFar #define jcopy_sample_rows jCopySamples #define jcopy_block_row jCopyBlocks -#define jzero_far jZeroFar #define jpeg_zigzag_order jZIGTable #define jpeg_natural_order jZAGTable +#define jpeg_natural_order7 jZAG7Table +#define jpeg_natural_order6 jZAG6Table +#define jpeg_natural_order5 jZAG5Table +#define jpeg_natural_order4 jZAG4Table +#define jpeg_natural_order3 jZAG3Table +#define jpeg_natural_order2 jZAG2Table +#define jpeg_aritab jAriTab #endif /* NEED_SHORT_EXTERNAL_NAMES */ +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines in jutils.c do it the hard way. + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */ +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case */ +#ifdef USE_FMEM +#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) +#else +EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); +#define FMEMZERO(target,size) jzero_far(target, size) +#endif +#endif + + /* Compression module initialization routines */ EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, @@ -344,7 +370,7 @@ EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo)); EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); /* Decompression module initialization routines */ EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); @@ -357,7 +383,7 @@ EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo)); EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); @@ -375,12 +401,20 @@ EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, int num_rows, JDIMENSION num_cols)); EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, JDIMENSION num_blocks)); -EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); /* Constant tables in jutils.c */ #if 0 /* This table is not actually needed in v6a */ extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ #endif extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ +extern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */ +extern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */ +extern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */ +extern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */ +extern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */ +extern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */ + +/* Arithmetic coding probability estimation tables in jaricom.c */ +extern const INT32 jpeg_aritab[]; /* Suppress undefined-structure complaints if necessary. */ diff --git a/3rdparty/libjpeg/jpeglib.h b/3rdparty/libjpeg/jpeglib.h index b12cfd55e..1327cffa9 100644 --- a/3rdparty/libjpeg/jpeglib.h +++ b/3rdparty/libjpeg/jpeglib.h @@ -2,6 +2,7 @@ * jpeglib.h * * Copyright (C) 1991-1998, Thomas G. Lane. + * Modified 2002-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -13,17 +14,6 @@ #ifndef JPEGLIB_H #define JPEGLIB_H -#ifdef __cplusplus -extern "C" { -#endif - -/* HJH modification: protect compiler options for structure alignment and enum - * size if the compiler is Borland C++ */ -#ifdef __BORLANDC__ -#pragma option push -b -#pragma option push -a4 -#endif - /* * First we include the configuration files that record how this * installation of the JPEG library is set up. jconfig.h can be @@ -37,11 +27,19 @@ extern "C" { #include "jmorecfg.h" /* seldom changed options */ -/* Version ID for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". +#ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C +extern "C" { +#endif +#endif + +/* Version IDs for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80". */ -#define JPEG_LIB_VERSION 62 /* Version 6b */ +#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */ +#define JPEG_LIB_VERSION_MAJOR 8 +#define JPEG_LIB_VERSION_MINOR 4 /* Various constants determining the sizes of things. @@ -49,7 +47,7 @@ extern "C" { * if you want to be compatible. */ -#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */ #define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ #define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ #define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ @@ -149,18 +147,18 @@ typedef struct { */ JDIMENSION width_in_blocks; JDIMENSION height_in_blocks; - /* Size of a DCT block in samples. Always DCTSIZE for compression. - * For decompression this is the size of the output from one DCT block, - * reflecting any scaling we choose to apply during the IDCT step. - * Values of 1,2,4,8 are likely to be supported. Note that different - * components may receive different IDCT scalings. + /* Size of a DCT block in samples, + * reflecting any scaling we choose to apply during the DCT step. + * Values from 1 to 16 are supported. + * Note that different components may receive different DCT scalings. */ - int DCT_scaled_size; + int DCT_h_scaled_size; + int DCT_v_scaled_size; /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface), thus - * downsampled_width = ceil(image_width * Hi/Hmax) - * and similarly for height. For decompression, IDCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + * of samples at the main buffer (preprocessing/compression interface); + * DCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) + * and similarly for height. */ JDIMENSION downsampled_width; /* actual width in samples */ JDIMENSION downsampled_height; /* actual height in samples */ @@ -175,7 +173,7 @@ typedef struct { int MCU_width; /* number of blocks per MCU, horizontally */ int MCU_height; /* number of blocks per MCU, vertically */ int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ int last_col_width; /* # of non-dummy blocks across in last MCU */ int last_row_height; /* # of non-dummy blocks down in last MCU */ @@ -302,6 +300,17 @@ struct jpeg_compress_struct { * helper routines to simplify changing parameters. */ + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + JDIMENSION jpeg_width; /* scaled JPEG image width */ + JDIMENSION jpeg_height; /* scaled JPEG image height */ + /* Dimensions of actual JPEG image that will be written to file, + * derived from input dimensions by scaling factors above. + * These fields are computed by jpeg_start_compress(). + * You can also use jpeg_calc_jpeg_dimensions() to determine these values + * in advance of calling jpeg_start_compress(). + */ + int data_precision; /* bits of precision in image data */ int num_components; /* # of color components in JPEG image */ @@ -309,14 +318,17 @@ struct jpeg_compress_struct { jpeg_component_info * comp_info; /* comp_info[i] describes component that appears i'th in SOF */ - + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - + int q_scale_factor[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined, + * and corresponding scale factors (percentage, initialized 100). + */ + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; /* ptrs to Huffman coding tables, or NULL if not defined */ - + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ @@ -332,6 +344,7 @@ struct jpeg_compress_struct { boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ int smoothing_factor; /* 1..100, or 0 for no input smoothing */ J_DCT_METHOD dct_method; /* DCT algorithm selector */ @@ -375,6 +388,9 @@ struct jpeg_compress_struct { int max_h_samp_factor; /* largest h_samp_factor */ int max_v_samp_factor; /* largest v_samp_factor */ + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ /* The coefficient controller receives data in units of MCU rows as defined * for fully interleaved scans (whether the JPEG file is interleaved or not). @@ -400,6 +416,10 @@ struct jpeg_compress_struct { int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) */ + /* * Links to compression subobjects (methods and private variables of modules) */ @@ -546,6 +566,7 @@ struct jpeg_decompress_struct { jpeg_component_info * comp_info; /* comp_info[i] describes component that appears i'th in SOF */ + boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ @@ -586,7 +607,8 @@ struct jpeg_decompress_struct { int max_h_samp_factor; /* largest h_samp_factor */ int max_v_samp_factor; /* largest v_samp_factor */ - int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ + int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ /* The coefficient controller's input and output progress is measured in @@ -594,7 +616,7 @@ struct jpeg_decompress_struct { * in fully interleaved JPEG scans, but are used whether the scan is * interleaved or not. We define an iMCU row as v_samp_factor DCT block * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. */ JSAMPLE * sample_range_limit; /* table for fast range-limiting */ @@ -618,6 +640,12 @@ struct jpeg_decompress_struct { int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + /* These fields are derived from Se of first SOS marker. + */ + int block_size; /* the basic DCT block size: 1..16 */ + const int * natural_order; /* natural-order position array for entropy decode */ + int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ + /* This field is shared between entropy decoder and marker parser. * It is either zero or the code of a JPEG marker that has been * read from the data source, but has not yet been processed. @@ -847,11 +875,14 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); #define jpeg_destroy_decompress jDestDecompress #define jpeg_stdio_dest jStdDest #define jpeg_stdio_src jStdSrc +#define jpeg_mem_dest jMemDest +#define jpeg_mem_src jMemSrc #define jpeg_set_defaults jSetDefaults #define jpeg_set_colorspace jSetColorspace #define jpeg_default_colorspace jDefColorspace #define jpeg_set_quality jSetQuality #define jpeg_set_linear_quality jSetLQuality +#define jpeg_default_qtables jDefQTables #define jpeg_add_quant_table jAddQuantTable #define jpeg_quality_scaling jQualityScaling #define jpeg_simple_progression jSimProgress @@ -861,6 +892,7 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); #define jpeg_start_compress jStrtCompress #define jpeg_write_scanlines jWrtScanlines #define jpeg_finish_compress jFinCompress +#define jpeg_calc_jpeg_dimensions jCjpegDimensions #define jpeg_write_raw_data jWrtRawData #define jpeg_write_marker jWrtMarker #define jpeg_write_m_header jWrtMHeader @@ -877,6 +909,7 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); #define jpeg_input_complete jInComplete #define jpeg_new_colormap jNewCMap #define jpeg_consume_input jConsumeInput +#define jpeg_core_output_dimensions jCoreDimensions #define jpeg_calc_output_dimensions jCalcDimensions #define jpeg_save_markers jSaveMarkers #define jpeg_set_marker_processor jSetMarker @@ -921,6 +954,14 @@ EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); +/* Data source and destination managers: memory buffers. */ +EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, + unsigned char ** outbuffer, + unsigned long * outsize)); +EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, + unsigned char * inbuffer, + unsigned long insize)); + /* Default parameter setup for compression */ EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); /* Compression parameter setup aids */ @@ -932,6 +973,8 @@ EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, int scale_factor, boolean force_baseline)); +EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, + boolean force_baseline)); EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, const unsigned int *basic_table, int scale_factor, @@ -951,12 +994,15 @@ EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, JDIMENSION num_lines)); EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); +/* Precalculate JPEG dimensions for current compression parameters. */ +EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); + /* Replaces jpeg_write_scanlines when writing raw downsampled data. */ EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, JSAMPIMAGE data, JDIMENSION num_lines)); -/* Write a special marker. See libjpeg.doc concerning safe usage. */ +/* Write a special marker. See libjpeg.txt concerning safe usage. */ EXTERN(void) jpeg_write_marker JPP((j_compress_ptr cinfo, int marker, const JOCTET * dataptr, unsigned int datalen)); @@ -1010,6 +1056,7 @@ EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); #define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ /* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); /* Control saving of COM and APPn markers into marker_list. */ @@ -1104,13 +1151,10 @@ struct jpeg_color_quantizer { long dummy; }; #include "jerror.h" /* fetch error codes too */ #endif -#ifdef __BORLANDC__ -#pragma option pop /* pop -a switch */ -#pragma option pop /* pop -b */ -#endif - #ifdef __cplusplus +#ifndef DONT_USE_EXTERN_C } #endif +#endif #endif /* JPEGLIB_H */ diff --git a/3rdparty/libjpeg/jquant1.c b/3rdparty/libjpeg/jquant1.c index b2f96aa15..9d11f7066 100644 --- a/3rdparty/libjpeg/jquant1.c +++ b/3rdparty/libjpeg/jquant1.c @@ -2,6 +2,7 @@ * jquant1.c * * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -530,8 +531,8 @@ quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, for (row = 0; row < num_rows; row++) { /* Initialize output values to 0 so can process components separately */ - jzero_far((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); + FMEMZERO((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); row_index = cquantize->row_index; for (ci = 0; ci < nc; ci++) { input_ptr = input_buf[row] + ci; @@ -635,8 +636,8 @@ quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, for (row = 0; row < num_rows; row++) { /* Initialize output values to 0 so can process components separately */ - jzero_far((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); + FMEMZERO((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); for (ci = 0; ci < nc; ci++) { input_ptr = input_buf[row] + ci; output_ptr = output_buf[row]; @@ -781,7 +782,7 @@ start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan) /* Initialize the propagated errors to zero. */ arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); for (i = 0; i < cinfo->out_color_components; i++) - jzero_far((void FAR *) cquantize->fserrors[i], arraysize); + FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize); break; default: ERREXIT(cinfo, JERR_NOT_COMPILED); diff --git a/3rdparty/libjpeg/jquant2.c b/3rdparty/libjpeg/jquant2.c index af601e334..38fc2af7a 100644 --- a/3rdparty/libjpeg/jquant2.c +++ b/3rdparty/libjpeg/jquant2.c @@ -2,6 +2,7 @@ * jquant2.c * * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -1203,7 +1204,7 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); /* Initialize the propagated errors to zero. */ - jzero_far((void FAR *) cquantize->fserrors, arraysize); + FMEMZERO((void FAR *) cquantize->fserrors, arraysize); /* Make the error-limit table if we didn't already. */ if (cquantize->error_limiter == NULL) init_error_limit(cinfo); @@ -1214,8 +1215,8 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) /* Zero the histogram or inverse color map, if necessary */ if (cquantize->needs_zeroed) { for (i = 0; i < HIST_C0_ELEMS; i++) { - jzero_far((void FAR *) histogram[i], - HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + FMEMZERO((void FAR *) histogram[i], + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); } cquantize->needs_zeroed = FALSE; } diff --git a/3rdparty/libjpeg/jutils.c b/3rdparty/libjpeg/jutils.c index d18a95556..5b16b6d03 100644 --- a/3rdparty/libjpeg/jutils.c +++ b/3rdparty/libjpeg/jutils.c @@ -2,6 +2,7 @@ * jutils.c * * Copyright (C) 1991-1996, Thomas G. Lane. + * Modified 2009-2011 by Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -63,6 +64,57 @@ const int jpeg_natural_order[DCTSIZE2+16] = { 63, 63, 63, 63, 63, 63, 63, 63 }; +const int jpeg_natural_order7[7*7+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 14, 21, 28, 35, + 42, 49, 50, 43, 36, 29, 22, 30, + 37, 44, 51, 52, 45, 38, 46, 53, + 54, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order6[6*6+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 41, 34, 27, + 20, 13, 21, 28, 35, 42, 43, 36, + 29, 37, 44, 45, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order5[5*5+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 12, + 19, 26, 33, 34, 27, 20, 28, 35, + 36, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order4[4*4+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 25, 18, 11, 19, 26, 27, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order3[3*3+16] = { + 0, 1, 8, 16, 9, 2, 10, 17, + 18, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + +const int jpeg_natural_order2[2*2+16] = { + 0, 1, 8, 9, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + /* * Arithmetic utilities @@ -96,13 +148,27 @@ jround_up (long a, long b) * is not all that great, because these routines aren't very heavily used.) */ -#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */ #define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) -#define FMEMZERO(target,size) MEMZERO(target,size) #else /* 80x86 case, define if we can */ #ifdef USE_FMEM #define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) -#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) +#else +/* This function is for use by the FMEMZERO macro defined in jpegint.h. + * Do not call this function directly, use the FMEMZERO macro instead. + */ +GLOBAL(void) +jzero_far (void FAR * target, size_t bytestozero) +/* Zero out a chunk of FAR memory. */ +/* This might be sample-array data, block-array data, or alloc_large data. */ +{ + register char FAR * ptr = (char FAR *) target; + register size_t count; + + for (count = bytestozero; count > 0; count--) { + *ptr++ = 0; + } +} #endif #endif @@ -159,21 +225,3 @@ jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, } #endif } - - -GLOBAL(void) -jzero_far (void FAR * target, size_t bytestozero) -/* Zero out a chunk of FAR memory. */ -/* This might be sample-array data, block-array data, or alloc_large data. */ -{ -#ifdef FMEMZERO - FMEMZERO(target, bytestozero); -#else - register char FAR * ptr = (char FAR *) target; - register size_t count; - - for (count = bytestozero; count > 0; count--) { - *ptr++ = 0; - } -#endif -} diff --git a/3rdparty/libjpeg/jversion.h b/3rdparty/libjpeg/jversion.h index 6472c58d3..5d4915103 100644 --- a/3rdparty/libjpeg/jversion.h +++ b/3rdparty/libjpeg/jversion.h @@ -1,7 +1,7 @@ /* * jversion.h * - * Copyright (C) 1991-1998, Thomas G. Lane. + * Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -9,6 +9,6 @@ */ -#define JVERSION "6b 27-Mar-1998" +#define JVERSION "8d 15-Jan-2012" -#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane" +#define JCOPYRIGHT "Copyright (C) 2012, Thomas G. Lane, Guido Vollbeding" diff --git a/3rdparty/libjpeg/transupp.c b/3rdparty/libjpeg/transupp.c deleted file mode 100644 index c778add1b..000000000 --- a/3rdparty/libjpeg/transupp.c +++ /dev/null @@ -1,1533 +0,0 @@ -/* - * transupp.c - * - * Copyright (C) 1997-2001, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains image transformation routines and other utility code - * used by the jpegtran sample application. These are NOT part of the core - * JPEG library. But we keep these routines separate from jpegtran.c to - * ease the task of maintaining jpegtran-like programs that have other user - * interfaces. - */ - -/* Although this file really shouldn't have access to the library internals, - * it's helpful to let it call jround_up() and jcopy_block_row(). - */ -#define JPEG_INTERNALS - -#include "jinclude.h" -#include "jpeglib.h" -#include "transupp.h" /* My own external interface */ -#include /* to declare isdigit() */ - - -#if TRANSFORMS_SUPPORTED - -/* - * Lossless image transformation routines. These routines work on DCT - * coefficient arrays and thus do not require any lossy decompression - * or recompression of the image. - * Thanks to Guido Vollbeding for the initial design and code of this feature, - * and to Ben Jackson for introducing the cropping feature. - * - * Horizontal flipping is done in-place, using a single top-to-bottom - * pass through the virtual source array. It will thus be much the - * fastest option for images larger than main memory. - * - * The other routines require a set of destination virtual arrays, so they - * need twice as much memory as jpegtran normally does. The destination - * arrays are always written in normal scan order (top to bottom) because - * the virtual array manager expects this. The source arrays will be scanned - * in the corresponding order, which means multiple passes through the source - * arrays for most of the transforms. That could result in much thrashing - * if the image is larger than main memory. - * - * If cropping or trimming is involved, the destination arrays may be smaller - * than the source arrays. Note it is not possible to do horizontal flip - * in-place when a nonzero Y crop offset is specified, since we'd have to move - * data from one block row to another but the virtual array manager doesn't - * guarantee we can touch more than one row at a time. So in that case, - * we have to use a separate destination array. - * - * Some notes about the operating environment of the individual transform - * routines: - * 1. Both the source and destination virtual arrays are allocated from the - * source JPEG object, and therefore should be manipulated by calling the - * source's memory manager. - * 2. The destination's component count should be used. It may be smaller - * than the source's when forcing to grayscale. - * 3. Likewise the destination's sampling factors should be used. When - * forcing to grayscale the destination's sampling factors will be all 1, - * and we may as well take that as the effective iMCU size. - * 4. When "trim" is in effect, the destination's dimensions will be the - * trimmed values but the source's will be untrimmed. - * 5. When "crop" is in effect, the destination's dimensions will be the - * cropped values but the source's will be uncropped. Each transform - * routine is responsible for picking up source data starting at the - * correct X and Y offset for the crop region. (The X and Y offsets - * passed to the transform routines are measured in iMCU blocks of the - * destination.) - * 6. All the routines assume that the source and destination buffers are - * padded out to a full iMCU boundary. This is true, although for the - * source buffer it is an undocumented property of jdcoefct.c. - */ - - -LOCAL(void) -do_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Crop. This is only used when no rotate/flip is requested with the crop. */ -{ - JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks; - int ci, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - jpeg_component_info *compptr; - - /* We simply have to copy the right amount of data (the destination's - * image size) starting at the given X and Y offsets in the source. - */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - jcopy_block_row(src_buffer[offset_y] + x_crop_blocks, - dst_buffer[offset_y], - compptr->width_in_blocks); - } - } - } -} - - -LOCAL(void) -do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, - jvirt_barray_ptr *src_coef_arrays) -/* Horizontal flip; done in-place, so no separate dest array is required. - * NB: this only works when y_crop_offset is zero. - */ -{ - JDIMENSION MCU_cols, comp_width, blk_x, blk_y, x_crop_blocks; - int ci, k, offset_y; - JBLOCKARRAY buffer; - JCOEFPTR ptr1, ptr2; - JCOEF temp1, temp2; - jpeg_component_info *compptr; - - /* Horizontal mirroring of DCT blocks is accomplished by swapping - * pairs of blocks in-place. Within a DCT block, we perform horizontal - * mirroring by changing the signs of odd-numbered columns. - * Partial iMCUs at the right edge are left untouched. - */ - MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - for (blk_y = 0; blk_y < compptr->height_in_blocks; - blk_y += compptr->v_samp_factor) { - buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - /* Do the mirroring */ - for (blk_x = 0; blk_x * 2 < comp_width; blk_x++) { - ptr1 = buffer[offset_y][blk_x]; - ptr2 = buffer[offset_y][comp_width - blk_x - 1]; - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - temp1 = *ptr1; /* swap even column */ - temp2 = *ptr2; - *ptr1++ = temp2; - *ptr2++ = temp1; - temp1 = *ptr1; /* swap odd column with sign change */ - temp2 = *ptr2; - *ptr1++ = -temp2; - *ptr2++ = -temp1; - } - } - if (x_crop_blocks > 0) { - /* Now left-justify the portion of the data to be kept. - * We can't use a single jcopy_block_row() call because that routine - * depends on memcpy(), whose behavior is unspecified for overlapping - * source and destination areas. Sigh. - */ - for (blk_x = 0; blk_x < compptr->width_in_blocks; blk_x++) { - jcopy_block_row(buffer[offset_y] + blk_x + x_crop_blocks, - buffer[offset_y] + blk_x, - (JDIMENSION) 1); - } - } - } - } - } -} - - -LOCAL(void) -do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Horizontal flip in general cropping case */ -{ - JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, k, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Here we must output into a separate array because we can't touch - * different rows of a single virtual array simultaneously. Otherwise, - * this is essentially the same as the routine above. - */ - MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - dst_row_ptr = dst_buffer[offset_y]; - src_row_ptr = src_buffer[offset_y]; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Do the mirrorable blocks */ - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - *dst_ptr++ = *src_ptr++; /* copy even column */ - *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */ - } - } else { - /* Copy last partial block(s) verbatim */ - jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks, - dst_row_ptr + dst_blk_x, - (JDIMENSION) 1); - } - } - } - } - } -} - - -LOCAL(void) -do_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Vertical flip */ -{ - JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* We output into a separate array because we can't touch different - * rows of the source virtual array simultaneously. Otherwise, this - * is a pretty straightforward analog of horizontal flip. - * Within a DCT block, vertical mirroring is done by changing the signs - * of odd-numbered rows. - * Partial iMCUs at the bottom edge are copied verbatim. - */ - MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_height - y_crop_blocks - dst_blk_y - - (JDIMENSION) compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - /* Bottom-edge blocks will be copied verbatim. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - dst_row_ptr = dst_buffer[offset_y]; - src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; - src_row_ptr += x_crop_blocks; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[dst_blk_x]; - for (i = 0; i < DCTSIZE; i += 2) { - /* copy even row */ - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = *src_ptr++; - /* copy odd row with sign change */ - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = - *src_ptr++; - } - } - } else { - /* Just copy row verbatim. */ - jcopy_block_row(src_buffer[offset_y] + x_crop_blocks, - dst_buffer[offset_y], - compptr->width_in_blocks); - } - } - } - } -} - - -LOCAL(void) -do_transpose (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Transpose source into destination */ -{ - JDIMENSION dst_blk_x, dst_blk_y, x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Transposing pixels within a block just requires transposing the - * DCT coefficients. - * Partial iMCUs at the edges require no special treatment; we simply - * process all the available DCT blocks for every component. - */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - src_ptr = src_buffer[offset_x][dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } -} - - -LOCAL(void) -do_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 90 degree rotation is equivalent to - * 1. Transposing the image; - * 2. Horizontal mirroring. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Because of the horizontal mirror step, we can't process partial iMCUs - * at the (output) right edge properly. They just get transposed and - * not mirrored. - */ - MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_width - x_crop_blocks - dst_blk_x - - (JDIMENSION) compptr->h_samp_factor, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } else { - /* Edge blocks are transposed but not mirrored. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - i++; - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } else { - /* Edge blocks are transposed but not mirrored. */ - src_ptr = src_buffer[offset_x] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } -} - - -LOCAL(void) -do_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 270 degree rotation is equivalent to - * 1. Horizontal mirroring; - * 2. Transposing the image. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Because of the horizontal mirror step, we can't process partial iMCUs - * at the (output) bottom edge properly. They just get transposed and - * not mirrored. - */ - MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Block is within the mirrorable area. */ - src_ptr = src_buffer[offset_x] - [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } - } else { - /* Edge blocks are transposed but not mirrored. */ - src_ptr = src_buffer[offset_x] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } -} - - -LOCAL(void) -do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 180 degree rotation is equivalent to - * 1. Vertical mirroring; - * 2. Horizontal mirroring. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); - MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the vertically mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_height - y_crop_blocks - dst_blk_y - - (JDIMENSION) compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - /* Bottom-edge rows are only mirrored horizontally. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_y + y_crop_blocks, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - dst_row_ptr = dst_buffer[offset_y]; - if (y_crop_blocks + dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Process the blocks that can be mirrored both ways. */ - src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; - for (i = 0; i < DCTSIZE; i += 2) { - /* For even row, negate every odd column. */ - for (j = 0; j < DCTSIZE; j += 2) { - *dst_ptr++ = *src_ptr++; - *dst_ptr++ = - *src_ptr++; - } - /* For odd row, negate every even column. */ - for (j = 0; j < DCTSIZE; j += 2) { - *dst_ptr++ = - *src_ptr++; - *dst_ptr++ = *src_ptr++; - } - } - } else { - /* Any remaining right-edge blocks are only mirrored vertically. */ - src_ptr = src_row_ptr[x_crop_blocks + dst_blk_x]; - for (i = 0; i < DCTSIZE; i += 2) { - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = *src_ptr++; - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = - *src_ptr++; - } - } - } - } else { - /* Remaining rows are just mirrored horizontally. */ - src_row_ptr = src_buffer[offset_y]; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Process the blocks that can be mirrored. */ - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1]; - for (i = 0; i < DCTSIZE2; i += 2) { - *dst_ptr++ = *src_ptr++; - *dst_ptr++ = - *src_ptr++; - } - } else { - /* Any remaining right-edge blocks are only copied. */ - jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks, - dst_row_ptr + dst_blk_x, - (JDIMENSION) 1); - } - } - } - } - } - } -} - - -LOCAL(void) -do_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JDIMENSION x_crop_offset, JDIMENSION y_crop_offset, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Transverse transpose is equivalent to - * 1. 180 degree rotation; - * 2. Transposition; - * or - * 1. Horizontal mirroring; - * 2. Transposition; - * 3. Horizontal mirroring. - * These steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; - JDIMENSION x_crop_blocks, y_crop_blocks; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE); - MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - x_crop_blocks = x_crop_offset * compptr->h_samp_factor; - y_crop_blocks = y_crop_offset * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_width - x_crop_blocks - dst_blk_x - - (JDIMENSION) compptr->h_samp_factor, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } else { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - dst_blk_x + x_crop_blocks, - (JDIMENSION) compptr->h_samp_factor, FALSE); - } - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - if (y_crop_blocks + dst_blk_y < comp_height) { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] - [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - i++; - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } else { - /* Right-edge blocks are mirrored in y only */ - src_ptr = src_buffer[offset_x] - [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } - } - } else { - if (x_crop_blocks + dst_blk_x < comp_width) { - /* Bottom-edge blocks are mirrored in x only */ - src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - i++; - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } else { - /* At lower right corner, just transpose, no mirroring */ - src_ptr = src_buffer[offset_x] - [dst_blk_y + offset_y + y_crop_blocks]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } - } -} - - -/* Parse an unsigned integer: subroutine for jtransform_parse_crop_spec. - * Returns TRUE if valid integer found, FALSE if not. - * *strptr is advanced over the digit string, and *result is set to its value. - */ - -LOCAL(boolean) -jt_read_integer (const char ** strptr, JDIMENSION * result) -{ - const char * ptr = *strptr; - JDIMENSION val = 0; - - for (; isdigit(*ptr); ptr++) { - val = val * 10 + (JDIMENSION) (*ptr - '0'); - } - *result = val; - if (ptr == *strptr) - return FALSE; /* oops, no digits */ - *strptr = ptr; - return TRUE; -} - - -/* Parse a crop specification (written in X11 geometry style). - * The routine returns TRUE if the spec string is valid, FALSE if not. - * - * The crop spec string should have the format - * x{+-}{+-} - * where width, height, xoffset, and yoffset are unsigned integers. - * Each of the elements can be omitted to indicate a default value. - * (A weakness of this style is that it is not possible to omit xoffset - * while specifying yoffset, since they look alike.) - * - * This code is loosely based on XParseGeometry from the X11 distribution. - */ - -GLOBAL(boolean) -jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec) -{ - info->crop = FALSE; - info->crop_width_set = JCROP_UNSET; - info->crop_height_set = JCROP_UNSET; - info->crop_xoffset_set = JCROP_UNSET; - info->crop_yoffset_set = JCROP_UNSET; - - if (isdigit(*spec)) { - /* fetch width */ - if (! jt_read_integer(&spec, &info->crop_width)) - return FALSE; - info->crop_width_set = JCROP_POS; - } - if (*spec == 'x' || *spec == 'X') { - /* fetch height */ - spec++; - if (! jt_read_integer(&spec, &info->crop_height)) - return FALSE; - info->crop_height_set = JCROP_POS; - } - if (*spec == '+' || *spec == '-') { - /* fetch xoffset */ - info->crop_xoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS; - spec++; - if (! jt_read_integer(&spec, &info->crop_xoffset)) - return FALSE; - } - if (*spec == '+' || *spec == '-') { - /* fetch yoffset */ - info->crop_yoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS; - spec++; - if (! jt_read_integer(&spec, &info->crop_yoffset)) - return FALSE; - } - /* We had better have gotten to the end of the string. */ - if (*spec != '\0') - return FALSE; - info->crop = TRUE; - return TRUE; -} - - -/* Trim off any partial iMCUs on the indicated destination edge */ - -LOCAL(void) -trim_right_edge (jpeg_transform_info *info, JDIMENSION full_width) -{ - JDIMENSION MCU_cols; - - MCU_cols = info->output_width / (info->max_h_samp_factor * DCTSIZE); - if (MCU_cols > 0 && info->x_crop_offset + MCU_cols == - full_width / (info->max_h_samp_factor * DCTSIZE)) - info->output_width = MCU_cols * (info->max_h_samp_factor * DCTSIZE); -} - -LOCAL(void) -trim_bottom_edge (jpeg_transform_info *info, JDIMENSION full_height) -{ - JDIMENSION MCU_rows; - - MCU_rows = info->output_height / (info->max_v_samp_factor * DCTSIZE); - if (MCU_rows > 0 && info->y_crop_offset + MCU_rows == - full_height / (info->max_v_samp_factor * DCTSIZE)) - info->output_height = MCU_rows * (info->max_v_samp_factor * DCTSIZE); -} - - -/* Request any required workspace. - * - * This routine figures out the size that the output image will be - * (which implies that all the transform parameters must be set before - * it is called). - * - * We allocate the workspace virtual arrays from the source decompression - * object, so that all the arrays (both the original data and the workspace) - * will be taken into account while making memory management decisions. - * Hence, this routine must be called after jpeg_read_header (which reads - * the image dimensions) and before jpeg_read_coefficients (which realizes - * the source's virtual arrays). - */ - -GLOBAL(void) -jtransform_request_workspace (j_decompress_ptr srcinfo, - jpeg_transform_info *info) -{ - jvirt_barray_ptr *coef_arrays = NULL; - boolean need_workspace, transpose_it; - jpeg_component_info *compptr; - JDIMENSION xoffset, yoffset, width_in_iMCUs, height_in_iMCUs; - JDIMENSION width_in_blocks, height_in_blocks; - int ci, h_samp_factor, v_samp_factor; - - /* Determine number of components in output image */ - if (info->force_grayscale && - srcinfo->jpeg_color_space == JCS_YCbCr && - srcinfo->num_components == 3) { - /* We'll only process the first component */ - info->num_components = 1; - } else { - /* Process all the components */ - info->num_components = srcinfo->num_components; - } - /* If there is only one output component, force the iMCU size to be 1; - * else use the source iMCU size. (This allows us to do the right thing - * when reducing color to grayscale, and also provides a handy way of - * cleaning up "funny" grayscale images whose sampling factors are not 1x1.) - */ - - switch (info->transform) { - case JXFORM_TRANSPOSE: - case JXFORM_TRANSVERSE: - case JXFORM_ROT_90: - case JXFORM_ROT_270: - info->output_width = srcinfo->image_height; - info->output_height = srcinfo->image_width; - if (info->num_components == 1) { - info->max_h_samp_factor = 1; - info->max_v_samp_factor = 1; - } else { - info->max_h_samp_factor = srcinfo->max_v_samp_factor; - info->max_v_samp_factor = srcinfo->max_h_samp_factor; - } - break; - default: - info->output_width = srcinfo->image_width; - info->output_height = srcinfo->image_height; - if (info->num_components == 1) { - info->max_h_samp_factor = 1; - info->max_v_samp_factor = 1; - } else { - info->max_h_samp_factor = srcinfo->max_h_samp_factor; - info->max_v_samp_factor = srcinfo->max_v_samp_factor; - } - break; - } - - /* If cropping has been requested, compute the crop area's position and - * dimensions, ensuring that its upper left corner falls at an iMCU boundary. - */ - if (info->crop) { - /* Insert default values for unset crop parameters */ - if (info->crop_xoffset_set == JCROP_UNSET) - info->crop_xoffset = 0; /* default to +0 */ - if (info->crop_yoffset_set == JCROP_UNSET) - info->crop_yoffset = 0; /* default to +0 */ - if (info->crop_xoffset >= info->output_width || - info->crop_yoffset >= info->output_height) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - if (info->crop_width_set == JCROP_UNSET) - info->crop_width = info->output_width - info->crop_xoffset; - if (info->crop_height_set == JCROP_UNSET) - info->crop_height = info->output_height - info->crop_yoffset; - /* Ensure parameters are valid */ - if (info->crop_width <= 0 || info->crop_width > info->output_width || - info->crop_height <= 0 || info->crop_height > info->output_height || - info->crop_xoffset > info->output_width - info->crop_width || - info->crop_yoffset > info->output_height - info->crop_height) - ERREXIT(srcinfo, JERR_BAD_CROP_SPEC); - /* Convert negative crop offsets into regular offsets */ - if (info->crop_xoffset_set == JCROP_NEG) - xoffset = info->output_width - info->crop_width - info->crop_xoffset; - else - xoffset = info->crop_xoffset; - if (info->crop_yoffset_set == JCROP_NEG) - yoffset = info->output_height - info->crop_height - info->crop_yoffset; - else - yoffset = info->crop_yoffset; - /* Now adjust so that upper left corner falls at an iMCU boundary */ - info->output_width = - info->crop_width + (xoffset % (info->max_h_samp_factor * DCTSIZE)); - info->output_height = - info->crop_height + (yoffset % (info->max_v_samp_factor * DCTSIZE)); - /* Save x/y offsets measured in iMCUs */ - info->x_crop_offset = xoffset / (info->max_h_samp_factor * DCTSIZE); - info->y_crop_offset = yoffset / (info->max_v_samp_factor * DCTSIZE); - } else { - info->x_crop_offset = 0; - info->y_crop_offset = 0; - } - - /* Figure out whether we need workspace arrays, - * and if so whether they are transposed relative to the source. - */ - need_workspace = FALSE; - transpose_it = FALSE; - switch (info->transform) { - case JXFORM_NONE: - if (info->x_crop_offset != 0 || info->y_crop_offset != 0) - need_workspace = TRUE; - /* No workspace needed if neither cropping nor transforming */ - break; - case JXFORM_FLIP_H: - if (info->trim) - trim_right_edge(info, srcinfo->image_width); - if (info->y_crop_offset != 0) - need_workspace = TRUE; - /* do_flip_h_no_crop doesn't need a workspace array */ - break; - case JXFORM_FLIP_V: - if (info->trim) - trim_bottom_edge(info, srcinfo->image_height); - /* Need workspace arrays having same dimensions as source image. */ - need_workspace = TRUE; - break; - case JXFORM_TRANSPOSE: - /* transpose does NOT have to trim anything */ - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - case JXFORM_TRANSVERSE: - if (info->trim) { - trim_right_edge(info, srcinfo->image_height); - trim_bottom_edge(info, srcinfo->image_width); - } - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - case JXFORM_ROT_90: - if (info->trim) - trim_right_edge(info, srcinfo->image_height); - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - case JXFORM_ROT_180: - if (info->trim) { - trim_right_edge(info, srcinfo->image_width); - trim_bottom_edge(info, srcinfo->image_height); - } - /* Need workspace arrays having same dimensions as source image. */ - need_workspace = TRUE; - break; - case JXFORM_ROT_270: - if (info->trim) - trim_bottom_edge(info, srcinfo->image_width); - /* Need workspace arrays having transposed dimensions. */ - need_workspace = TRUE; - transpose_it = TRUE; - break; - } - - /* Allocate workspace if needed. - * Note that we allocate arrays padded out to the next iMCU boundary, - * so that transform routines need not worry about missing edge blocks. - */ - if (need_workspace) { - coef_arrays = (jvirt_barray_ptr *) - (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE, - SIZEOF(jvirt_barray_ptr) * info->num_components); - width_in_iMCUs = (JDIMENSION) - jdiv_round_up((long) info->output_width, - (long) (info->max_h_samp_factor * DCTSIZE)); - height_in_iMCUs = (JDIMENSION) - jdiv_round_up((long) info->output_height, - (long) (info->max_v_samp_factor * DCTSIZE)); - for (ci = 0; ci < info->num_components; ci++) { - compptr = srcinfo->comp_info + ci; - if (info->num_components == 1) { - /* we're going to force samp factors to 1x1 in this case */ - h_samp_factor = v_samp_factor = 1; - } else if (transpose_it) { - h_samp_factor = compptr->v_samp_factor; - v_samp_factor = compptr->h_samp_factor; - } else { - h_samp_factor = compptr->h_samp_factor; - v_samp_factor = compptr->v_samp_factor; - } - width_in_blocks = width_in_iMCUs * h_samp_factor; - height_in_blocks = height_in_iMCUs * v_samp_factor; - coef_arrays[ci] = (*srcinfo->mem->request_virt_barray) - ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, - width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor); - } - } - - info->workspace_coef_arrays = coef_arrays; -} - - -/* Transpose destination image parameters */ - -LOCAL(void) -transpose_critical_parameters (j_compress_ptr dstinfo) -{ - int tblno, i, j, ci, itemp; - jpeg_component_info *compptr; - JQUANT_TBL *qtblptr; - UINT16 qtemp; - - /* Transpose sampling factors */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - itemp = compptr->h_samp_factor; - compptr->h_samp_factor = compptr->v_samp_factor; - compptr->v_samp_factor = itemp; - } - - /* Transpose quantization tables */ - for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { - qtblptr = dstinfo->quant_tbl_ptrs[tblno]; - if (qtblptr != NULL) { - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < i; j++) { - qtemp = qtblptr->quantval[i*DCTSIZE+j]; - qtblptr->quantval[i*DCTSIZE+j] = qtblptr->quantval[j*DCTSIZE+i]; - qtblptr->quantval[j*DCTSIZE+i] = qtemp; - } - } - } - } -} - - -/* Adjust Exif image parameters. - * - * We try to adjust the Tags ExifImageWidth and ExifImageHeight if possible. - */ - -LOCAL(void) -adjust_exif_parameters (JOCTET FAR * data, unsigned int length, - JDIMENSION new_width, JDIMENSION new_height) -{ - boolean is_motorola; /* Flag for byte order */ - unsigned int number_of_tags, tagnum; - unsigned int firstoffset, offset; - JDIMENSION new_value; - - if (length < 12) return; /* Length of an IFD entry */ - - /* Discover byte order */ - if (GETJOCTET(data[0]) == 0x49 && GETJOCTET(data[1]) == 0x49) - is_motorola = FALSE; - else if (GETJOCTET(data[0]) == 0x4D && GETJOCTET(data[1]) == 0x4D) - is_motorola = TRUE; - else - return; - - /* Check Tag Mark */ - if (is_motorola) { - if (GETJOCTET(data[2]) != 0) return; - if (GETJOCTET(data[3]) != 0x2A) return; - } else { - if (GETJOCTET(data[3]) != 0) return; - if (GETJOCTET(data[2]) != 0x2A) return; - } - - /* Get first IFD offset (offset to IFD0) */ - if (is_motorola) { - if (GETJOCTET(data[4]) != 0) return; - if (GETJOCTET(data[5]) != 0) return; - firstoffset = GETJOCTET(data[6]); - firstoffset <<= 8; - firstoffset += GETJOCTET(data[7]); - } else { - if (GETJOCTET(data[7]) != 0) return; - if (GETJOCTET(data[6]) != 0) return; - firstoffset = GETJOCTET(data[5]); - firstoffset <<= 8; - firstoffset += GETJOCTET(data[4]); - } - if (firstoffset > length - 2) return; /* check end of data segment */ - - /* Get the number of directory entries contained in this IFD */ - if (is_motorola) { - number_of_tags = GETJOCTET(data[firstoffset]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[firstoffset+1]); - } else { - number_of_tags = GETJOCTET(data[firstoffset+1]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[firstoffset]); - } - if (number_of_tags == 0) return; - firstoffset += 2; - - /* Search for ExifSubIFD offset Tag in IFD0 */ - for (;;) { - if (firstoffset > length - 12) return; /* check end of data segment */ - /* Get Tag number */ - if (is_motorola) { - tagnum = GETJOCTET(data[firstoffset]); - tagnum <<= 8; - tagnum += GETJOCTET(data[firstoffset+1]); - } else { - tagnum = GETJOCTET(data[firstoffset+1]); - tagnum <<= 8; - tagnum += GETJOCTET(data[firstoffset]); - } - if (tagnum == 0x8769) break; /* found ExifSubIFD offset Tag */ - if (--number_of_tags == 0) return; - firstoffset += 12; - } - - /* Get the ExifSubIFD offset */ - if (is_motorola) { - if (GETJOCTET(data[firstoffset+8]) != 0) return; - if (GETJOCTET(data[firstoffset+9]) != 0) return; - offset = GETJOCTET(data[firstoffset+10]); - offset <<= 8; - offset += GETJOCTET(data[firstoffset+11]); - } else { - if (GETJOCTET(data[firstoffset+11]) != 0) return; - if (GETJOCTET(data[firstoffset+10]) != 0) return; - offset = GETJOCTET(data[firstoffset+9]); - offset <<= 8; - offset += GETJOCTET(data[firstoffset+8]); - } - if (offset > length - 2) return; /* check end of data segment */ - - /* Get the number of directory entries contained in this SubIFD */ - if (is_motorola) { - number_of_tags = GETJOCTET(data[offset]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[offset+1]); - } else { - number_of_tags = GETJOCTET(data[offset+1]); - number_of_tags <<= 8; - number_of_tags += GETJOCTET(data[offset]); - } - if (number_of_tags < 2) return; - offset += 2; - - /* Search for ExifImageWidth and ExifImageHeight Tags in this SubIFD */ - do { - if (offset > length - 12) return; /* check end of data segment */ - /* Get Tag number */ - if (is_motorola) { - tagnum = GETJOCTET(data[offset]); - tagnum <<= 8; - tagnum += GETJOCTET(data[offset+1]); - } else { - tagnum = GETJOCTET(data[offset+1]); - tagnum <<= 8; - tagnum += GETJOCTET(data[offset]); - } - if (tagnum == 0xA002 || tagnum == 0xA003) { - if (tagnum == 0xA002) - new_value = new_width; /* ExifImageWidth Tag */ - else - new_value = new_height; /* ExifImageHeight Tag */ - if (is_motorola) { - data[offset+2] = 0; /* Format = unsigned long (4 octets) */ - data[offset+3] = 4; - data[offset+4] = 0; /* Number Of Components = 1 */ - data[offset+5] = 0; - data[offset+6] = 0; - data[offset+7] = 1; - data[offset+8] = 0; - data[offset+9] = 0; - data[offset+10] = (JOCTET)((new_value >> 8) & 0xFF); - data[offset+11] = (JOCTET)(new_value & 0xFF); - } else { - data[offset+2] = 4; /* Format = unsigned long (4 octets) */ - data[offset+3] = 0; - data[offset+4] = 1; /* Number Of Components = 1 */ - data[offset+5] = 0; - data[offset+6] = 0; - data[offset+7] = 0; - data[offset+8] = (JOCTET)(new_value & 0xFF); - data[offset+9] = (JOCTET)((new_value >> 8) & 0xFF); - data[offset+10] = 0; - data[offset+11] = 0; - } - } - offset += 12; - } while (--number_of_tags); -} - - -/* Adjust output image parameters as needed. - * - * This must be called after jpeg_copy_critical_parameters() - * and before jpeg_write_coefficients(). - * - * The return value is the set of virtual coefficient arrays to be written - * (either the ones allocated by jtransform_request_workspace, or the - * original source data arrays). The caller will need to pass this value - * to jpeg_write_coefficients(). - */ - -GLOBAL(jvirt_barray_ptr *) -jtransform_adjust_parameters (j_decompress_ptr srcinfo, - j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info) -{ - /* If force-to-grayscale is requested, adjust destination parameters */ - if (info->force_grayscale) { - /* First, ensure we have YCbCr or grayscale data, and that the source's - * Y channel is full resolution. (No reasonable person would make Y - * be less than full resolution, so actually coping with that case - * isn't worth extra code space. But we check it to avoid crashing.) - */ - if (((dstinfo->jpeg_color_space == JCS_YCbCr && - dstinfo->num_components == 3) || - (dstinfo->jpeg_color_space == JCS_GRAYSCALE && - dstinfo->num_components == 1)) && - srcinfo->comp_info[0].h_samp_factor == srcinfo->max_h_samp_factor && - srcinfo->comp_info[0].v_samp_factor == srcinfo->max_v_samp_factor) { - /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed - * properly. Among other things, it sets the target h_samp_factor & - * v_samp_factor to 1, which typically won't match the source. - * We have to preserve the source's quantization table number, however. - */ - int sv_quant_tbl_no = dstinfo->comp_info[0].quant_tbl_no; - jpeg_set_colorspace(dstinfo, JCS_GRAYSCALE); - dstinfo->comp_info[0].quant_tbl_no = sv_quant_tbl_no; - } else { - /* Sorry, can't do it */ - ERREXIT(dstinfo, JERR_CONVERSION_NOTIMPL); - } - } else if (info->num_components == 1) { - /* For a single-component source, we force the destination sampling factors - * to 1x1, with or without force_grayscale. This is useful because some - * decoders choke on grayscale images with other sampling factors. - */ - dstinfo->comp_info[0].h_samp_factor = 1; - dstinfo->comp_info[0].v_samp_factor = 1; - } - - /* Correct the destination's image dimensions as necessary - * for crop and rotate/flip operations. - */ - dstinfo->image_width = info->output_width; - dstinfo->image_height = info->output_height; - - /* Transpose destination image parameters */ - switch (info->transform) { - case JXFORM_TRANSPOSE: - case JXFORM_TRANSVERSE: - case JXFORM_ROT_90: - case JXFORM_ROT_270: - transpose_critical_parameters(dstinfo); - break; - default: - break; - } - - /* Adjust Exif properties */ - if (srcinfo->marker_list != NULL && - srcinfo->marker_list->marker == JPEG_APP0+1 && - srcinfo->marker_list->data_length >= 6 && - GETJOCTET(srcinfo->marker_list->data[0]) == 0x45 && - GETJOCTET(srcinfo->marker_list->data[1]) == 0x78 && - GETJOCTET(srcinfo->marker_list->data[2]) == 0x69 && - GETJOCTET(srcinfo->marker_list->data[3]) == 0x66 && - GETJOCTET(srcinfo->marker_list->data[4]) == 0 && - GETJOCTET(srcinfo->marker_list->data[5]) == 0) { - /* Suppress output of JFIF marker */ - dstinfo->write_JFIF_header = FALSE; - /* Adjust Exif image parameters */ - if (dstinfo->image_width != srcinfo->image_width || - dstinfo->image_height != srcinfo->image_height) - /* Align data segment to start of TIFF structure for parsing */ - adjust_exif_parameters(srcinfo->marker_list->data + 6, - srcinfo->marker_list->data_length - 6, - dstinfo->image_width, dstinfo->image_height); - } - - /* Return the appropriate output data set */ - if (info->workspace_coef_arrays != NULL) - return info->workspace_coef_arrays; - return src_coef_arrays; -} - - -/* Execute the actual transformation, if any. - * - * This must be called *after* jpeg_write_coefficients, because it depends - * on jpeg_write_coefficients to have computed subsidiary values such as - * the per-component width and height fields in the destination object. - * - * Note that some transformations will modify the source data arrays! - */ - -GLOBAL(void) -jtransform_execute_transform (j_decompress_ptr srcinfo, - j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info) -{ - jvirt_barray_ptr *dst_coef_arrays = info->workspace_coef_arrays; - - /* Note: conditions tested here should match those in switch statement - * in jtransform_request_workspace() - */ - switch (info->transform) { - case JXFORM_NONE: - if (info->x_crop_offset != 0 || info->y_crop_offset != 0) - do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_FLIP_H: - if (info->y_crop_offset != 0) - do_flip_h(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - else - do_flip_h_no_crop(srcinfo, dstinfo, info->x_crop_offset, - src_coef_arrays); - break; - case JXFORM_FLIP_V: - do_flip_v(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_TRANSPOSE: - do_transpose(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_TRANSVERSE: - do_transverse(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_90: - do_rot_90(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_180: - do_rot_180(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_270: - do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset, - src_coef_arrays, dst_coef_arrays); - break; - } -} - -/* jtransform_perfect_transform - * - * Determine whether lossless transformation is perfectly - * possible for a specified image and transformation. - * - * Inputs: - * image_width, image_height: source image dimensions. - * MCU_width, MCU_height: pixel dimensions of MCU. - * transform: transformation identifier. - * Parameter sources from initialized jpeg_struct - * (after reading source header): - * image_width = cinfo.image_width - * image_height = cinfo.image_height - * MCU_width = cinfo.max_h_samp_factor * DCTSIZE - * MCU_height = cinfo.max_v_samp_factor * DCTSIZE - * Result: - * TRUE = perfect transformation possible - * FALSE = perfect transformation not possible - * (may use custom action then) - */ - -GLOBAL(boolean) -jtransform_perfect_transform(JDIMENSION image_width, JDIMENSION image_height, - int MCU_width, int MCU_height, - JXFORM_CODE transform) -{ - boolean result = TRUE; /* initialize TRUE */ - - switch (transform) { - case JXFORM_FLIP_H: - case JXFORM_ROT_270: - if (image_width % (JDIMENSION) MCU_width) - result = FALSE; - break; - case JXFORM_FLIP_V: - case JXFORM_ROT_90: - if (image_height % (JDIMENSION) MCU_height) - result = FALSE; - break; - case JXFORM_TRANSVERSE: - case JXFORM_ROT_180: - if (image_width % (JDIMENSION) MCU_width) - result = FALSE; - if (image_height % (JDIMENSION) MCU_height) - result = FALSE; - break; - default: - break; - } - - return result; -} - -#endif /* TRANSFORMS_SUPPORTED */ - - -/* Setup decompression object to save desired markers in memory. - * This must be called before jpeg_read_header() to have the desired effect. - */ - -GLOBAL(void) -jcopy_markers_setup (j_decompress_ptr srcinfo, JCOPY_OPTION option) -{ -#ifdef SAVE_MARKERS_SUPPORTED - int m; - - /* Save comments except under NONE option */ - if (option != JCOPYOPT_NONE) { - jpeg_save_markers(srcinfo, JPEG_COM, 0xFFFF); - } - /* Save all types of APPn markers iff ALL option */ - if (option == JCOPYOPT_ALL) { - for (m = 0; m < 16; m++) - jpeg_save_markers(srcinfo, JPEG_APP0 + m, 0xFFFF); - } -#endif /* SAVE_MARKERS_SUPPORTED */ -} - -/* Copy markers saved in the given source object to the destination object. - * This should be called just after jpeg_start_compress() or - * jpeg_write_coefficients(). - * Note that those routines will have written the SOI, and also the - * JFIF APP0 or Adobe APP14 markers if selected. - */ - -GLOBAL(void) -jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JCOPY_OPTION option) -{ - jpeg_saved_marker_ptr marker; - - /* In the current implementation, we don't actually need to examine the - * option flag here; we just copy everything that got saved. - * But to avoid confusion, we do not output JFIF and Adobe APP14 markers - * if the encoder library already wrote one. - */ - for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { - if (dstinfo->write_JFIF_header && - marker->marker == JPEG_APP0 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x4A && - GETJOCTET(marker->data[1]) == 0x46 && - GETJOCTET(marker->data[2]) == 0x49 && - GETJOCTET(marker->data[3]) == 0x46 && - GETJOCTET(marker->data[4]) == 0) - continue; /* reject duplicate JFIF */ - if (dstinfo->write_Adobe_marker && - marker->marker == JPEG_APP0+14 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x41 && - GETJOCTET(marker->data[1]) == 0x64 && - GETJOCTET(marker->data[2]) == 0x6F && - GETJOCTET(marker->data[3]) == 0x62 && - GETJOCTET(marker->data[4]) == 0x65) - continue; /* reject duplicate Adobe */ -#ifdef NEED_FAR_POINTERS - /* We could use jpeg_write_marker if the data weren't FAR... */ - { - unsigned int i; - jpeg_write_m_header(dstinfo, marker->marker, marker->data_length); - for (i = 0; i < marker->data_length; i++) - jpeg_write_m_byte(dstinfo, marker->data[i]); - } -#else - jpeg_write_marker(dstinfo, marker->marker, - marker->data, marker->data_length); -#endif - } -} diff --git a/3rdparty/libjpeg/transupp.h b/3rdparty/libjpeg/transupp.h deleted file mode 100644 index 981b1cee7..000000000 --- a/3rdparty/libjpeg/transupp.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - * transupp.h - * - * Copyright (C) 1997-2001, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for image transformation routines and - * other utility code used by the jpegtran sample application. These are - * NOT part of the core JPEG library. But we keep these routines separate - * from jpegtran.c to ease the task of maintaining jpegtran-like programs - * that have other user interfaces. - * - * NOTE: all the routines declared here have very specific requirements - * about when they are to be executed during the reading and writing of the - * source and destination files. See the comments in transupp.c, or see - * jpegtran.c for an example of correct usage. - */ - -/* If you happen not to want the image transform support, disable it here */ -#ifndef TRANSFORMS_SUPPORTED -#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */ -#endif - -/* - * Although rotating and flipping data expressed as DCT coefficients is not - * hard, there is an asymmetry in the JPEG format specification for images - * whose dimensions aren't multiples of the iMCU size. The right and bottom - * image edges are padded out to the next iMCU boundary with junk data; but - * no padding is possible at the top and left edges. If we were to flip - * the whole image including the pad data, then pad garbage would become - * visible at the top and/or left, and real pixels would disappear into the - * pad margins --- perhaps permanently, since encoders & decoders may not - * bother to preserve DCT blocks that appear to be completely outside the - * nominal image area. So, we have to exclude any partial iMCUs from the - * basic transformation. - * - * Transpose is the only transformation that can handle partial iMCUs at the - * right and bottom edges completely cleanly. flip_h can flip partial iMCUs - * at the bottom, but leaves any partial iMCUs at the right edge untouched. - * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched. - * The other transforms are defined as combinations of these basic transforms - * and process edge blocks in a way that preserves the equivalence. - * - * The "trim" option causes untransformable partial iMCUs to be dropped; - * this is not strictly lossless, but it usually gives the best-looking - * result for odd-size images. Note that when this option is active, - * the expected mathematical equivalences between the transforms may not hold. - * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim - * followed by -rot 180 -trim trims both edges.) - * - * We also offer a lossless-crop option, which discards data outside a given - * image region but losslessly preserves what is inside. Like the rotate and - * flip transforms, lossless crop is restricted by the JPEG format: the upper - * left corner of the selected region must fall on an iMCU boundary. If this - * does not hold for the given crop parameters, we silently move the upper left - * corner up and/or left to make it so, simultaneously increasing the region - * dimensions to keep the lower right crop corner unchanged. (Thus, the - * output image covers at least the requested region, but may cover more.) - * - * If both crop and a rotate/flip transform are requested, the crop is applied - * last --- that is, the crop region is specified in terms of the destination - * image. - * - * We also offer a "force to grayscale" option, which simply discards the - * chrominance channels of a YCbCr image. This is lossless in the sense that - * the luminance channel is preserved exactly. It's not the same kind of - * thing as the rotate/flip transformations, but it's convenient to handle it - * as part of this package, mainly because the transformation routines have to - * be aware of the option to know how many components to work on. - */ - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jtransform_parse_crop_spec jTrParCrop -#define jtransform_request_workspace jTrRequest -#define jtransform_adjust_parameters jTrAdjust -#define jtransform_execute_transform jTrExec -#define jtransform_perfect_transform jTrPerfect -#define jcopy_markers_setup jCMrkSetup -#define jcopy_markers_execute jCMrkExec -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* - * Codes for supported types of image transformations. - */ - -typedef enum { - JXFORM_NONE, /* no transformation */ - JXFORM_FLIP_H, /* horizontal flip */ - JXFORM_FLIP_V, /* vertical flip */ - JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */ - JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */ - JXFORM_ROT_90, /* 90-degree clockwise rotation */ - JXFORM_ROT_180, /* 180-degree rotation */ - JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */ -} JXFORM_CODE; - -/* - * Codes for crop parameters, which can individually be unspecified, - * positive, or negative. (Negative width or height makes no sense, though.) - */ - -typedef enum { - JCROP_UNSET, - JCROP_POS, - JCROP_NEG -} JCROP_CODE; - -/* - * Transform parameters struct. - * NB: application must not change any elements of this struct after - * calling jtransform_request_workspace. - */ - -typedef struct { - /* Options: set by caller */ - JXFORM_CODE transform; /* image transform operator */ - boolean perfect; /* if TRUE, fail if partial MCUs are requested */ - boolean trim; /* if TRUE, trim partial MCUs as needed */ - boolean force_grayscale; /* if TRUE, convert color image to grayscale */ - boolean crop; /* if TRUE, crop source image */ - - /* Crop parameters: application need not set these unless crop is TRUE. - * These can be filled in by jtransform_parse_crop_spec(). - */ - JDIMENSION crop_width; /* Width of selected region */ - JCROP_CODE crop_width_set; - JDIMENSION crop_height; /* Height of selected region */ - JCROP_CODE crop_height_set; - JDIMENSION crop_xoffset; /* X offset of selected region */ - JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */ - JDIMENSION crop_yoffset; /* Y offset of selected region */ - JCROP_CODE crop_yoffset_set; /* (negative measures from bottom edge) */ - - /* Internal workspace: caller should not touch these */ - int num_components; /* # of components in workspace */ - jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */ - JDIMENSION output_width; /* cropped destination dimensions */ - JDIMENSION output_height; - JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */ - JDIMENSION y_crop_offset; - int max_h_samp_factor; /* destination iMCU size */ - int max_v_samp_factor; -} jpeg_transform_info; - - -#if TRANSFORMS_SUPPORTED - -/* Parse a crop specification (written in X11 geometry style) */ -EXTERN(boolean) jtransform_parse_crop_spec - JPP((jpeg_transform_info *info, const char *spec)); -/* Request any required workspace */ -EXTERN(void) jtransform_request_workspace - JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info)); -/* Adjust output image parameters */ -EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters - JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info)); -/* Execute the actual transformation, if any */ -EXTERN(void) jtransform_execute_transform - JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info)); -/* Determine whether lossless transformation is perfectly - * possible for a specified image and transformation. - */ -EXTERN(boolean) jtransform_perfect_transform - JPP((JDIMENSION image_width, JDIMENSION image_height, - int MCU_width, int MCU_height, - JXFORM_CODE transform)); - -/* jtransform_execute_transform used to be called - * jtransform_execute_transformation, but some compilers complain about - * routine names that long. This macro is here to avoid breaking any - * old source code that uses the original name... - */ -#define jtransform_execute_transformation jtransform_execute_transform - -#endif /* TRANSFORMS_SUPPORTED */ - - -/* - * Support for copying optional markers from source to destination file. - */ - -typedef enum { - JCOPYOPT_NONE, /* copy no optional markers */ - JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */ - JCOPYOPT_ALL /* copy all optional markers */ -} JCOPY_OPTION; - -#define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */ - -/* Setup decompression object to save desired markers in memory */ -EXTERN(void) jcopy_markers_setup - JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option)); -/* Copy markers saved in the given source object to the destination object */ -EXTERN(void) jcopy_markers_execute - JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JCOPY_OPTION option)); From 4157a640ba30bb75e0c0f1e38686a27ec7887f30 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 01:55:20 +0400 Subject: [PATCH 032/103] Apply 01-misc-fixes patch from debian libjasper-dev (1.900.1-13) package --- 3rdparty/libjasper/jas_cm.c | 11 ++-- 3rdparty/libjasper/jas_icc.c | 39 +++++++------- 3rdparty/libjasper/jas_image.c | 5 +- 3rdparty/libjasper/jas_malloc.c | 49 +++++++++++++++--- 3rdparty/libjasper/jas_seq.c | 6 +-- 3rdparty/libjasper/jas_stream.c | 20 +++---- 3rdparty/libjasper/jasper/jas_malloc.h | 9 ++++ 3rdparty/libjasper/jp2_cod.c | 72 +++++++++++++++++++++++--- 3rdparty/libjasper/jp2_cod.h | 12 +++++ 3rdparty/libjasper/jp2_dec.c | 4 +- 3rdparty/libjasper/jp2_enc.c | 61 +++++++++++++++++++--- 3rdparty/libjasper/jpc_cs.c | 17 +++--- 3rdparty/libjasper/jpc_dec.c | 31 ++++++----- 3rdparty/libjasper/jpc_enc.c | 20 +++---- 3rdparty/libjasper/jpc_mqdec.c | 2 +- 3rdparty/libjasper/jpc_mqenc.c | 2 +- 3rdparty/libjasper/jpc_qmfb.c | 16 +++--- 3rdparty/libjasper/jpc_t1enc.c | 2 +- 3rdparty/libjasper/jpc_t2cod.c | 2 +- 3rdparty/libjasper/jpc_t2dec.c | 6 +-- 3rdparty/libjasper/jpc_t2enc.c | 6 +-- 3rdparty/libjasper/jpc_tagtree.c | 2 +- 3rdparty/libjasper/jpc_util.c | 2 +- 23 files changed, 274 insertions(+), 122 deletions(-) diff --git a/3rdparty/libjasper/jas_cm.c b/3rdparty/libjasper/jas_cm.c index 9d4db7782..15100f0cf 100644 --- a/3rdparty/libjasper/jas_cm.c +++ b/3rdparty/libjasper/jas_cm.c @@ -704,8 +704,7 @@ static int jas_cmpxformseq_resize(jas_cmpxformseq_t *pxformseq, int n) { jas_cmpxform_t **p; assert(n >= pxformseq->numpxforms); - p = (!pxformseq->pxforms) ? jas_malloc(n * sizeof(jas_cmpxform_t *)) : - jas_realloc(pxformseq->pxforms, n * sizeof(jas_cmpxform_t *)); + p = jas_realloc2(pxformseq->pxforms, n, sizeof(jas_cmpxform_t *)); if (!p) { return -1; } @@ -889,13 +888,13 @@ static int jas_cmshapmatlut_set(jas_cmshapmatlut_t *lut, jas_icccurv_t *curv) jas_cmshapmatlut_cleanup(lut); if (curv->numents == 0) { lut->size = 2; - if (!(lut->data = jas_malloc(lut->size * sizeof(jas_cmreal_t)))) + if (!(lut->data = jas_alloc2(lut->size, sizeof(jas_cmreal_t)))) goto error; lut->data[0] = 0.0; lut->data[1] = 1.0; } else if (curv->numents == 1) { lut->size = 256; - if (!(lut->data = jas_malloc(lut->size * sizeof(jas_cmreal_t)))) + if (!(lut->data = jas_alloc2(lut->size, sizeof(jas_cmreal_t)))) goto error; gamma = curv->ents[0] / 256.0; for (i = 0; i < lut->size; ++i) { @@ -903,7 +902,7 @@ static int jas_cmshapmatlut_set(jas_cmshapmatlut_t *lut, jas_icccurv_t *curv) } } else { lut->size = curv->numents; - if (!(lut->data = jas_malloc(lut->size * sizeof(jas_cmreal_t)))) + if (!(lut->data = jas_alloc2(lut->size, sizeof(jas_cmreal_t)))) goto error; for (i = 0; i < lut->size; ++i) { lut->data[i] = curv->ents[i] / 65535.0; @@ -953,7 +952,7 @@ static int jas_cmshapmatlut_invert(jas_cmshapmatlut_t *invlut, return -1; } } - if (!(invlut->data = jas_malloc(n * sizeof(jas_cmreal_t)))) + if (!(invlut->data = jas_alloc2(n, sizeof(jas_cmreal_t)))) return -1; invlut->size = n; for (i = 0; i < invlut->size; ++i) { diff --git a/3rdparty/libjasper/jas_icc.c b/3rdparty/libjasper/jas_icc.c index 13f2864c4..40c9d01d6 100644 --- a/3rdparty/libjasper/jas_icc.c +++ b/3rdparty/libjasper/jas_icc.c @@ -373,7 +373,7 @@ int jas_iccprof_save(jas_iccprof_t *prof, jas_stream_t *out) jas_icctagtab_t *tagtab; tagtab = &prof->tagtab; - if (!(tagtab->ents = jas_malloc(prof->attrtab->numattrs * + if (!(tagtab->ents = jas_alloc2(prof->attrtab->numattrs, sizeof(jas_icctagtabent_t)))) goto error; tagtab->numents = prof->attrtab->numattrs; @@ -522,7 +522,7 @@ static int jas_iccprof_gettagtab(jas_stream_t *in, jas_icctagtab_t *tagtab) } if (jas_iccgetuint32(in, &tagtab->numents)) goto error; - if (!(tagtab->ents = jas_malloc(tagtab->numents * + if (!(tagtab->ents = jas_alloc2(tagtab->numents, sizeof(jas_icctagtabent_t)))) goto error; tagtabent = tagtab->ents; @@ -743,8 +743,7 @@ static int jas_iccattrtab_resize(jas_iccattrtab_t *tab, int maxents) { jas_iccattr_t *newattrs; assert(maxents >= tab->numattrs); - newattrs = tab->attrs ? jas_realloc(tab->attrs, maxents * - sizeof(jas_iccattr_t)) : jas_malloc(maxents * sizeof(jas_iccattr_t)); + newattrs = jas_realloc2(tab->attrs, maxents, sizeof(jas_iccattr_t)); if (!newattrs) return -1; tab->attrs = newattrs; @@ -999,7 +998,7 @@ static int jas_icccurv_input(jas_iccattrval_t *attrval, jas_stream_t *in, if (jas_iccgetuint32(in, &curv->numents)) goto error; - if (!(curv->ents = jas_malloc(curv->numents * sizeof(jas_iccuint16_t)))) + if (!(curv->ents = jas_alloc2(curv->numents, sizeof(jas_iccuint16_t)))) goto error; for (i = 0; i < curv->numents; ++i) { if (jas_iccgetuint16(in, &curv->ents[i])) @@ -1100,7 +1099,7 @@ static int jas_icctxtdesc_input(jas_iccattrval_t *attrval, jas_stream_t *in, if (jas_iccgetuint32(in, &txtdesc->uclangcode) || jas_iccgetuint32(in, &txtdesc->uclen)) goto error; - if (!(txtdesc->ucdata = jas_malloc(txtdesc->uclen * 2))) + if (!(txtdesc->ucdata = jas_alloc2(txtdesc->uclen, 2))) goto error; if (jas_stream_read(in, txtdesc->ucdata, txtdesc->uclen * 2) != JAS_CAST(int, txtdesc->uclen * 2)) @@ -1292,17 +1291,17 @@ static int jas_icclut8_input(jas_iccattrval_t *attrval, jas_stream_t *in, jas_iccgetuint16(in, &lut8->numouttabents)) goto error; clutsize = jas_iccpowi(lut8->clutlen, lut8->numinchans) * lut8->numoutchans; - if (!(lut8->clut = jas_malloc(clutsize * sizeof(jas_iccuint8_t))) || - !(lut8->intabsbuf = jas_malloc(lut8->numinchans * - lut8->numintabents * sizeof(jas_iccuint8_t))) || - !(lut8->intabs = jas_malloc(lut8->numinchans * + if (!(lut8->clut = jas_alloc2(clutsize, sizeof(jas_iccuint8_t))) || + !(lut8->intabsbuf = jas_alloc3(lut8->numinchans, + lut8->numintabents, sizeof(jas_iccuint8_t))) || + !(lut8->intabs = jas_alloc2(lut8->numinchans, sizeof(jas_iccuint8_t *)))) goto error; for (i = 0; i < lut8->numinchans; ++i) lut8->intabs[i] = &lut8->intabsbuf[i * lut8->numintabents]; - if (!(lut8->outtabsbuf = jas_malloc(lut8->numoutchans * - lut8->numouttabents * sizeof(jas_iccuint8_t))) || - !(lut8->outtabs = jas_malloc(lut8->numoutchans * + if (!(lut8->outtabsbuf = jas_alloc3(lut8->numoutchans, + lut8->numouttabents, sizeof(jas_iccuint8_t))) || + !(lut8->outtabs = jas_alloc2(lut8->numoutchans, sizeof(jas_iccuint8_t *)))) goto error; for (i = 0; i < lut8->numoutchans; ++i) @@ -1461,17 +1460,17 @@ static int jas_icclut16_input(jas_iccattrval_t *attrval, jas_stream_t *in, jas_iccgetuint16(in, &lut16->numouttabents)) goto error; clutsize = jas_iccpowi(lut16->clutlen, lut16->numinchans) * lut16->numoutchans; - if (!(lut16->clut = jas_malloc(clutsize * sizeof(jas_iccuint16_t))) || - !(lut16->intabsbuf = jas_malloc(lut16->numinchans * - lut16->numintabents * sizeof(jas_iccuint16_t))) || - !(lut16->intabs = jas_malloc(lut16->numinchans * + if (!(lut16->clut = jas_alloc2(clutsize, sizeof(jas_iccuint16_t))) || + !(lut16->intabsbuf = jas_alloc3(lut16->numinchans, + lut16->numintabents, sizeof(jas_iccuint16_t))) || + !(lut16->intabs = jas_alloc2(lut16->numinchans, sizeof(jas_iccuint16_t *)))) goto error; for (i = 0; i < lut16->numinchans; ++i) lut16->intabs[i] = &lut16->intabsbuf[i * lut16->numintabents]; - if (!(lut16->outtabsbuf = jas_malloc(lut16->numoutchans * - lut16->numouttabents * sizeof(jas_iccuint16_t))) || - !(lut16->outtabs = jas_malloc(lut16->numoutchans * + if (!(lut16->outtabsbuf = jas_alloc3(lut16->numoutchans, + lut16->numouttabents, sizeof(jas_iccuint16_t))) || + !(lut16->outtabs = jas_alloc2(lut16->numoutchans, sizeof(jas_iccuint16_t *)))) goto error; for (i = 0; i < lut16->numoutchans; ++i) diff --git a/3rdparty/libjasper/jas_image.c b/3rdparty/libjasper/jas_image.c index 5b188b951..fbf934005 100644 --- a/3rdparty/libjasper/jas_image.c +++ b/3rdparty/libjasper/jas_image.c @@ -142,7 +142,7 @@ jas_image_t *jas_image_create(int numcmpts, jas_image_cmptparm_t *cmptparms, image->inmem_ = true; /* Allocate memory for the per-component information. */ - if (!(image->cmpts_ = jas_malloc(image->maxcmpts_ * + if (!(image->cmpts_ = jas_alloc2(image->maxcmpts_, sizeof(jas_image_cmpt_t *)))) { jas_image_destroy(image); return 0; @@ -774,8 +774,7 @@ static int jas_image_growcmpts(jas_image_t *image, int maxcmpts) jas_image_cmpt_t **newcmpts; int cmptno; - newcmpts = (!image->cmpts_) ? jas_malloc(maxcmpts * sizeof(jas_image_cmpt_t *)) : - jas_realloc(image->cmpts_, maxcmpts * sizeof(jas_image_cmpt_t *)); + newcmpts = jas_realloc2(image->cmpts_, maxcmpts, sizeof(jas_image_cmpt_t *)); if (!newcmpts) { return -1; } diff --git a/3rdparty/libjasper/jas_malloc.c b/3rdparty/libjasper/jas_malloc.c index b993c8e86..25173af42 100644 --- a/3rdparty/libjasper/jas_malloc.c +++ b/3rdparty/libjasper/jas_malloc.c @@ -76,6 +76,9 @@ /* We need the prototype for memset. */ #include +#include +#include +#include #include "jasper/jas_malloc.h" @@ -113,18 +116,50 @@ void jas_free(void *ptr) void *jas_realloc(void *ptr, size_t size) { - return realloc(ptr, size); + return ptr ? realloc(ptr, size) : malloc(size); +} + +void *jas_realloc2(void *ptr, size_t nmemb, size_t size) +{ + if (!ptr) + return jas_alloc2(nmemb, size); + if (nmemb && SIZE_MAX / nmemb < size) { + errno = ENOMEM; + return NULL; + } + return jas_realloc(ptr, nmemb * size); + +} + +void *jas_alloc2(size_t nmemb, size_t size) +{ + if (nmemb && SIZE_MAX / nmemb < size) { + errno = ENOMEM; + return NULL; + } + + return jas_malloc(nmemb * size); +} + +void *jas_alloc3(size_t a, size_t b, size_t c) +{ + size_t n; + + if (a && SIZE_MAX / a < b) { + errno = ENOMEM; + return NULL; + } + + return jas_alloc2(a*b, c); } void *jas_calloc(size_t nmemb, size_t size) { void *ptr; - size_t n; - n = nmemb * size; - if (!(ptr = jas_malloc(n * sizeof(char)))) { - return 0; - } - memset(ptr, 0, n); + + ptr = jas_alloc2(nmemb, size); + if (ptr) + memset(ptr, 0, nmemb*size); return ptr; } diff --git a/3rdparty/libjasper/jas_seq.c b/3rdparty/libjasper/jas_seq.c index ecdcbdf68..72bfadd98 100644 --- a/3rdparty/libjasper/jas_seq.c +++ b/3rdparty/libjasper/jas_seq.c @@ -114,7 +114,7 @@ jas_matrix_t *jas_matrix_create(int numrows, int numcols) matrix->datasize_ = numrows * numcols; if (matrix->maxrows_ > 0) { - if (!(matrix->rows_ = jas_malloc(matrix->maxrows_ * + if (!(matrix->rows_ = jas_alloc2(matrix->maxrows_, sizeof(jas_seqent_t *)))) { jas_matrix_destroy(matrix); return 0; @@ -122,7 +122,7 @@ jas_matrix_t *jas_matrix_create(int numrows, int numcols) } if (matrix->datasize_ > 0) { - if (!(matrix->data_ = jas_malloc(matrix->datasize_ * + if (!(matrix->data_ = jas_alloc2(matrix->datasize_, sizeof(jas_seqent_t)))) { jas_matrix_destroy(matrix); return 0; @@ -220,7 +220,7 @@ void jas_matrix_bindsub(jas_matrix_t *mat0, jas_matrix_t *mat1, int r0, int c0, mat0->numrows_ = r1 - r0 + 1; mat0->numcols_ = c1 - c0 + 1; mat0->maxrows_ = mat0->numrows_; - mat0->rows_ = jas_malloc(mat0->maxrows_ * sizeof(jas_seqent_t *)); + mat0->rows_ = jas_alloc2(mat0->maxrows_, sizeof(jas_seqent_t *)); for (i = 0; i < mat0->numrows_; ++i) { mat0->rows_[i] = mat1->rows_[r0 + i] + c0; } diff --git a/3rdparty/libjasper/jas_stream.c b/3rdparty/libjasper/jas_stream.c index 12d2b7df0..9b89fa9e5 100644 --- a/3rdparty/libjasper/jas_stream.c +++ b/3rdparty/libjasper/jas_stream.c @@ -212,7 +212,7 @@ jas_stream_t *jas_stream_memopen(char *buf, int bufsize) if (buf) { obj->buf_ = (unsigned char *) buf; } else { - obj->buf_ = jas_malloc(obj->bufsize_ * sizeof(char)); + obj->buf_ = jas_malloc(obj->bufsize_); obj->myalloc_ = 1; } if (!obj->buf_) { @@ -361,28 +361,22 @@ jas_stream_t *jas_stream_tmpfile() } obj->fd = -1; obj->flags = 0; - obj->pathname[0] = '\0'; stream->obj_ = obj; /* Choose a file name. */ - tmpnam(obj->pathname); + snprintf(obj->pathname, L_tmpnam, "%s/tmp.XXXXXXXXXX", P_tmpdir); /* Open the underlying file. */ - if ((obj->fd = open(obj->pathname, O_CREAT | O_EXCL | O_RDWR | O_TRUNC | O_BINARY, - JAS_STREAM_PERMS)) < 0) { + if ((obj->fd = mkstemp(obj->pathname)) < 0) { jas_stream_destroy(stream); return 0; } /* Unlink the file so that it will disappear if the program terminates abnormally. */ - /* Under UNIX, one can unlink an open file and continue to do I/O - on it. Not all operating systems support this functionality, however. - For example, under Microsoft Windows the unlink operation will fail, - since the file is open. */ if (unlink(obj->pathname)) { - /* We will try unlinking the file again after it is closed. */ - obj->flags |= JAS_STREAM_FILEOBJ_DELONCLOSE; + jas_stream_destroy(stream); + return 0; } /* Use full buffering. */ @@ -553,7 +547,7 @@ int jas_stream_printf(jas_stream_t *stream, const char *fmt, ...) int ret; va_start(ap, fmt); - ret = vsprintf(buf, fmt, ap); + ret = vsnprintf(buf, sizeof buf, fmt, ap); jas_stream_puts(stream, buf); va_end(ap); return ret; @@ -992,7 +986,7 @@ static int mem_resize(jas_stream_memobj_t *m, int bufsize) unsigned char *buf; assert(m->buf_); - if (!(buf = jas_realloc(m->buf_, bufsize * sizeof(unsigned char)))) { + if (!(buf = jas_realloc(m->buf_, bufsize))) { return -1; } m->buf_ = buf; diff --git a/3rdparty/libjasper/jasper/jas_malloc.h b/3rdparty/libjasper/jasper/jas_malloc.h index 0d4156e63..f94f4758c 100644 --- a/3rdparty/libjasper/jasper/jas_malloc.h +++ b/3rdparty/libjasper/jasper/jas_malloc.h @@ -95,6 +95,9 @@ extern "C" { #define jas_free MEMFREE #define jas_realloc MEMREALLOC #define jas_calloc MEMCALLOC +#define jas_alloc2(a, b) MEMALLOC((a)*(b)) +#define jas_alloc3(a, b, c) MEMALLOC((a)*(b)*(c)) +#define jas_realloc2(p, a, b) MEMREALLOC((p), (a)*(b)) #endif /******************************************************************************\ @@ -115,6 +118,12 @@ void *jas_realloc(void *ptr, size_t size); /* Allocate a block of memory and initialize the contents to zero. */ void *jas_calloc(size_t nmemb, size_t size); +/* size-checked double allocation .*/ +void *jas_alloc2(size_t, size_t); + +void *jas_alloc3(size_t, size_t, size_t); + +void *jas_realloc2(void *, size_t, size_t); #endif #ifdef __cplusplus diff --git a/3rdparty/libjasper/jp2_cod.c b/3rdparty/libjasper/jp2_cod.c index f9000621f..894dfc1cf 100644 --- a/3rdparty/libjasper/jp2_cod.c +++ b/3rdparty/libjasper/jp2_cod.c @@ -5,6 +5,11 @@ * All rights reserved. */ +/* + * Modified by Andrey Kiselev to handle UUID + * box properly. + */ + /* __START_OF_JASPER_LICENSE__ * * JasPer License Version 2.0 @@ -127,6 +132,9 @@ static void jp2_pclr_destroy(jp2_box_t *box); static int jp2_pclr_getdata(jp2_box_t *box, jas_stream_t *in); static int jp2_pclr_putdata(jp2_box_t *box, jas_stream_t *out); static void jp2_pclr_dumpdata(jp2_box_t *box, FILE *out); +static void jp2_uuid_destroy(jp2_box_t *box); +static int jp2_uuid_getdata(jp2_box_t *box, jas_stream_t *in); +static int jp2_uuid_putdata(jp2_box_t *box, jas_stream_t *out); /******************************************************************************\ * Local data. @@ -164,7 +172,7 @@ jp2_boxinfo_t jp2_boxinfos[] = { {JP2_BOX_XML, "XML", 0, {0, 0, 0, 0, 0}}, {JP2_BOX_UUID, "UUID", 0, - {0, 0, 0, 0, 0}}, + {0, jp2_uuid_destroy, jp2_uuid_getdata, jp2_uuid_putdata, 0}}, {JP2_BOX_UINF, "UINF", JP2_BOX_SUPER, {0, 0, 0, 0, 0}}, {JP2_BOX_ULST, "ULST", 0, @@ -372,7 +380,7 @@ static int jp2_bpcc_getdata(jp2_box_t *box, jas_stream_t *in) jp2_bpcc_t *bpcc = &box->data.bpcc; unsigned int i; bpcc->numcmpts = box->datalen; - if (!(bpcc->bpcs = jas_malloc(bpcc->numcmpts * sizeof(uint_fast8_t)))) { + if (!(bpcc->bpcs = jas_alloc2(bpcc->numcmpts, sizeof(uint_fast8_t)))) { return -1; } for (i = 0; i < bpcc->numcmpts; ++i) { @@ -416,7 +424,7 @@ static int jp2_colr_getdata(jp2_box_t *box, jas_stream_t *in) break; case JP2_COLR_ICC: colr->iccplen = box->datalen - 3; - if (!(colr->iccp = jas_malloc(colr->iccplen * sizeof(uint_fast8_t)))) { + if (!(colr->iccp = jas_alloc2(colr->iccplen, sizeof(uint_fast8_t)))) { return -1; } if (jas_stream_read(in, colr->iccp, colr->iccplen) != colr->iccplen) { @@ -453,7 +461,7 @@ static int jp2_cdef_getdata(jp2_box_t *box, jas_stream_t *in) if (jp2_getuint16(in, &cdef->numchans)) { return -1; } - if (!(cdef->ents = jas_malloc(cdef->numchans * sizeof(jp2_cdefchan_t)))) { + if (!(cdef->ents = jas_alloc2(cdef->numchans, sizeof(jp2_cdefchan_t)))) { return -1; } for (channo = 0; channo < cdef->numchans; ++channo) { @@ -766,7 +774,7 @@ static int jp2_cmap_getdata(jp2_box_t *box, jas_stream_t *in) unsigned int i; cmap->numchans = (box->datalen) / 4; - if (!(cmap->ents = jas_malloc(cmap->numchans * sizeof(jp2_cmapent_t)))) { + if (!(cmap->ents = jas_alloc2(cmap->numchans, sizeof(jp2_cmapent_t)))) { return -1; } for (i = 0; i < cmap->numchans; ++i) { @@ -828,10 +836,10 @@ static int jp2_pclr_getdata(jp2_box_t *box, jas_stream_t *in) return -1; } lutsize = pclr->numlutents * pclr->numchans; - if (!(pclr->lutdata = jas_malloc(lutsize * sizeof(int_fast32_t)))) { + if (!(pclr->lutdata = jas_alloc2(lutsize, sizeof(int_fast32_t)))) { return -1; } - if (!(pclr->bpc = jas_malloc(pclr->numchans * sizeof(uint_fast8_t)))) { + if (!(pclr->bpc = jas_alloc2(pclr->numchans, sizeof(uint_fast8_t)))) { return -1; } for (i = 0; i < pclr->numchans; ++i) { @@ -876,6 +884,56 @@ static void jp2_pclr_dumpdata(jp2_box_t *box, FILE *out) } } +static void jp2_uuid_destroy(jp2_box_t *box) +{ + jp2_uuid_t *uuid = &box->data.uuid; + if (uuid->data) + { + jas_free(uuid->data); + uuid->data = NULL; + } +} + +static int jp2_uuid_getdata(jp2_box_t *box, jas_stream_t *in) +{ + jp2_uuid_t *uuid = &box->data.uuid; + int i; + + for (i = 0; i < 16; i++) + { + if (jp2_getuint8(in, &uuid->uuid[i])) + return -1; + } + + uuid->datalen = box->datalen - 16; + uuid->data = jas_malloc(uuid->datalen * sizeof(uint_fast8_t)); + for (i = 0; i < uuid->datalen; i++) + { + if (jp2_getuint8(in, &uuid->data[i])) + return -1; + } + return 0; +} + +static int jp2_uuid_putdata(jp2_box_t *box, jas_stream_t *out) +{ + jp2_uuid_t *uuid = &box->data.uuid; + int i; + + for (i = 0; i < 16; i++) + { + if (jp2_putuint8(out, uuid->uuid[i])) + return -1; + } + + for (i = 0; i < uuid->datalen; i++) + { + if (jp2_putuint8(out, uuid->data[i])) + return -1; + } + return 0; +} + static int jp2_getint(jas_stream_t *in, int s, int n, int_fast32_t *val) { int c; diff --git a/3rdparty/libjasper/jp2_cod.h b/3rdparty/libjasper/jp2_cod.h index 7c4d17590..b2b251d62 100644 --- a/3rdparty/libjasper/jp2_cod.h +++ b/3rdparty/libjasper/jp2_cod.h @@ -5,6 +5,11 @@ * All rights reserved. */ +/* + * Modified by Andrey Kiselev to handle UUID + * box properly. + */ + /* __START_OF_JASPER_LICENSE__ * * JasPer License Version 2.0 @@ -229,6 +234,12 @@ typedef struct { jp2_cmapent_t *ents; } jp2_cmap_t; +typedef struct { + uint_fast32_t datalen; + uint_fast8_t uuid[16]; + uint_fast8_t *data; +} jp2_uuid_t; + #define JP2_CMAP_DIRECT 0 #define JP2_CMAP_PALETTE 1 @@ -257,6 +268,7 @@ typedef struct { jp2_pclr_t pclr; jp2_cdef_t cdef; jp2_cmap_t cmap; + jp2_uuid_t uuid; } data; } jp2_box_t; diff --git a/3rdparty/libjasper/jp2_dec.c b/3rdparty/libjasper/jp2_dec.c index 5b9baaa26..a8f81540f 100644 --- a/3rdparty/libjasper/jp2_dec.c +++ b/3rdparty/libjasper/jp2_dec.c @@ -336,7 +336,7 @@ jas_image_t *jp2_decode(jas_stream_t *in, char *optstr) } /* Allocate space for the channel-number to component-number LUT. */ - if (!(dec->chantocmptlut = jas_malloc(dec->numchans * sizeof(uint_fast16_t)))) { + if (!(dec->chantocmptlut = jas_alloc2(dec->numchans, sizeof(uint_fast16_t)))) { jas_eprintf("error: no memory\n"); goto error; } @@ -354,7 +354,7 @@ jas_image_t *jp2_decode(jas_stream_t *in, char *optstr) if (cmapent->map == JP2_CMAP_DIRECT) { dec->chantocmptlut[channo] = channo; } else if (cmapent->map == JP2_CMAP_PALETTE) { - lutents = jas_malloc(pclrd->numlutents * sizeof(int_fast32_t)); + lutents = jas_alloc2(pclrd->numlutents, sizeof(int_fast32_t)); for (i = 0; i < pclrd->numlutents; ++i) { lutents[i] = pclrd->lutdata[cmapent->pcol + i * pclrd->numchans]; } diff --git a/3rdparty/libjasper/jp2_enc.c b/3rdparty/libjasper/jp2_enc.c index 6c3f23864..1dce5175a 100644 --- a/3rdparty/libjasper/jp2_enc.c +++ b/3rdparty/libjasper/jp2_enc.c @@ -5,6 +5,11 @@ * All rights reserved. */ +/* + * Modified by Andrey Kiselev to handle UUID + * box properly. + */ + /* __START_OF_JASPER_LICENSE__ * * JasPer License Version 2.0 @@ -86,7 +91,7 @@ static int clrspctojp2(jas_clrspc_t clrspc); * Functions. \******************************************************************************/ -int jp2_encode(jas_image_t *image, jas_stream_t *out, char *optstr) +int jp2_write_header(jas_image_t *image, jas_stream_t *out) { jp2_box_t *box; jp2_ftyp_t *ftyp; @@ -97,8 +102,6 @@ int jp2_encode(jas_image_t *image, jas_stream_t *out, char *optstr) long len; uint_fast16_t cmptno; jp2_colr_t *colr; - char buf[4096]; - uint_fast32_t overhead; jp2_cdefchan_t *cdefchanent; jp2_cdef_t *cdef; int i; @@ -191,7 +194,7 @@ int sgnd; } bpcc = &box->data.bpcc; bpcc->numcmpts = jas_image_numcmpts(image); - if (!(bpcc->bpcs = jas_malloc(bpcc->numcmpts * + if (!(bpcc->bpcs = jas_alloc2(bpcc->numcmpts, sizeof(uint_fast8_t)))) { goto error; } @@ -285,7 +288,7 @@ int sgnd; } cdef = &box->data.cdef; cdef->numchans = jas_image_numcmpts(image); - cdef->ents = jas_malloc(cdef->numchans * sizeof(jp2_cdefchan_t)); + cdef->ents = jas_alloc2(cdef->numchans, sizeof(jp2_cdefchan_t)); for (i = 0; i < jas_image_numcmpts(image); ++i) { cdefchanent = &cdef->ents[i]; cdefchanent->channo = i; @@ -326,6 +329,26 @@ int sgnd; jas_stream_close(tmpstream); tmpstream = 0; + return 0; + abort(); + +error: + + if (box) { + jp2_box_destroy(box); + } + if (tmpstream) { + jas_stream_close(tmpstream); + } + return -1; +} + +int jp2_write_codestream(jas_image_t *image, jas_stream_t *out, char *optstr) +{ + jp2_box_t *box; + char buf[4096]; + uint_fast32_t overhead; + /* * Output the contiguous code stream box. */ @@ -358,12 +381,34 @@ error: if (box) { jp2_box_destroy(box); } - if (tmpstream) { - jas_stream_close(tmpstream); - } return -1; } +int jp2_encode(jas_image_t *image, jas_stream_t *out, char *optstr) +{ + if (jp2_write_header(image, out) < 0) + return -1; + if (jp2_write_codestream(image, out, optstr) < 0) + return -1; + + return 0; +} + +int jp2_encode_uuid(jas_image_t *image, jas_stream_t *out, + char *optstr, jp2_box_t *uuid) +{ + if (jp2_write_header(image, out) < 0) + return -1; + if (uuid) { + if (jp2_box_put(uuid, out)) + return -1; + } + if (jp2_write_codestream(image, out, optstr) < 0) + return -1; + + return 0; +} + static uint_fast32_t jp2_gettypeasoc(int colorspace, int ctype) { int type; diff --git a/3rdparty/libjasper/jpc_cs.c b/3rdparty/libjasper/jpc_cs.c index a7683af13..85378d6b1 100644 --- a/3rdparty/libjasper/jpc_cs.c +++ b/3rdparty/libjasper/jpc_cs.c @@ -501,7 +501,7 @@ static int jpc_siz_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, !siz->tileheight || !siz->numcomps) { return -1; } - if (!(siz->comps = jas_malloc(siz->numcomps * sizeof(jpc_sizcomp_t)))) { + if (!(siz->comps = jas_alloc2(siz->numcomps, sizeof(jpc_sizcomp_t)))) { return -1; } for (i = 0; i < siz->numcomps; ++i) { @@ -981,7 +981,10 @@ static int jpc_qcx_getcompparms(jpc_qcxcp_t *compparms, jpc_cstate_t *cstate, compparms->numstepsizes = (len - n) / 2; break; } - if (compparms->numstepsizes > 0) { + if (compparms->numstepsizes > 3 * JPC_MAXRLVLS + 1) { + jpc_qcx_destroycompparms(compparms); + return -1; + } else if (compparms->numstepsizes > 0) { compparms->stepsizes = jas_malloc(compparms->numstepsizes * sizeof(uint_fast16_t)); assert(compparms->stepsizes); @@ -1090,7 +1093,7 @@ static int jpc_ppm_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in ppm->len = ms->len - 1; if (ppm->len > 0) { - if (!(ppm->data = jas_malloc(ppm->len * sizeof(unsigned char)))) { + if (!(ppm->data = jas_malloc(ppm->len))) { goto error; } if (JAS_CAST(uint, jas_stream_read(in, ppm->data, ppm->len)) != ppm->len) { @@ -1159,7 +1162,7 @@ static int jpc_ppt_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in } ppt->len = ms->len - 1; if (ppt->len > 0) { - if (!(ppt->data = jas_malloc(ppt->len * sizeof(unsigned char)))) { + if (!(ppt->data = jas_malloc(ppt->len))) { goto error; } if (jas_stream_read(in, (char *) ppt->data, ppt->len) != JAS_CAST(int, ppt->len)) { @@ -1222,7 +1225,7 @@ static int jpc_poc_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in uint_fast8_t tmp; poc->numpchgs = (cstate->numcomps > 256) ? (ms->len / 9) : (ms->len / 7); - if (!(poc->pchgs = jas_malloc(poc->numpchgs * sizeof(jpc_pocpchg_t)))) { + if (!(poc->pchgs = jas_alloc2(poc->numpchgs, sizeof(jpc_pocpchg_t)))) { goto error; } for (pchgno = 0, pchg = poc->pchgs; pchgno < poc->numpchgs; ++pchgno, @@ -1327,7 +1330,7 @@ static int jpc_crg_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in jpc_crgcomp_t *comp; uint_fast16_t compno; crg->numcomps = cstate->numcomps; - if (!(crg->comps = jas_malloc(cstate->numcomps * sizeof(uint_fast16_t)))) { + if (!(crg->comps = jas_alloc2(cstate->numcomps, sizeof(uint_fast16_t)))) { return -1; } for (compno = 0, comp = crg->comps; compno < cstate->numcomps; @@ -1466,7 +1469,7 @@ static int jpc_unk_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in cstate = 0; if (ms->len > 0) { - if (!(unk->data = jas_malloc(ms->len * sizeof(unsigned char)))) { + if (!(unk->data = jas_malloc(ms->len))) { return -1; } if (jas_stream_read(in, (char *) unk->data, ms->len) != JAS_CAST(int, ms->len)) { diff --git a/3rdparty/libjasper/jpc_dec.c b/3rdparty/libjasper/jpc_dec.c index 368813ee0..f03cafce9 100644 --- a/3rdparty/libjasper/jpc_dec.c +++ b/3rdparty/libjasper/jpc_dec.c @@ -449,7 +449,7 @@ static int jpc_dec_process_sot(jpc_dec_t *dec, jpc_ms_t *ms) if (dec->state == JPC_MH) { - compinfos = jas_malloc(dec->numcomps * sizeof(jas_image_cmptparm_t)); + compinfos = jas_alloc2(dec->numcomps, sizeof(jas_image_cmptparm_t)); assert(compinfos); for (cmptno = 0, cmpt = dec->cmpts, compinfo = compinfos; cmptno < dec->numcomps; ++cmptno, ++cmpt, ++compinfo) { @@ -692,7 +692,7 @@ static int jpc_dec_tileinit(jpc_dec_t *dec, jpc_dec_tile_t *tile) tile->realmode = 1; } tcomp->numrlvls = ccp->numrlvls; - if (!(tcomp->rlvls = jas_malloc(tcomp->numrlvls * + if (!(tcomp->rlvls = jas_alloc2(tcomp->numrlvls, sizeof(jpc_dec_rlvl_t)))) { return -1; } @@ -764,7 +764,7 @@ rlvl->bands = 0; rlvl->cbgheightexpn); rlvl->numbands = (!rlvlno) ? 1 : 3; - if (!(rlvl->bands = jas_malloc(rlvl->numbands * + if (!(rlvl->bands = jas_alloc2(rlvl->numbands, sizeof(jpc_dec_band_t)))) { return -1; } @@ -797,7 +797,7 @@ rlvl->bands = 0; assert(rlvl->numprcs); - if (!(band->prcs = jas_malloc(rlvl->numprcs * sizeof(jpc_dec_prc_t)))) { + if (!(band->prcs = jas_alloc2(rlvl->numprcs, sizeof(jpc_dec_prc_t)))) { return -1; } @@ -834,7 +834,7 @@ rlvl->bands = 0; if (!(prc->numimsbstagtree = jpc_tagtree_create(prc->numhcblks, prc->numvcblks))) { return -1; } - if (!(prc->cblks = jas_malloc(prc->numcblks * sizeof(jpc_dec_cblk_t)))) { + if (!(prc->cblks = jas_alloc2(prc->numcblks, sizeof(jpc_dec_cblk_t)))) { return -1; } @@ -1069,12 +1069,12 @@ static int jpc_dec_tiledecode(jpc_dec_t *dec, jpc_dec_tile_t *tile) /* Apply an inverse intercomponent transform if necessary. */ switch (tile->cp->mctid) { case JPC_MCT_RCT: - assert(dec->numcomps == 3); + assert(dec->numcomps == 3 || dec->numcomps == 4); jpc_irct(tile->tcomps[0].data, tile->tcomps[1].data, tile->tcomps[2].data); break; case JPC_MCT_ICT: - assert(dec->numcomps == 3); + assert(dec->numcomps == 3 || dec->numcomps == 4); jpc_iict(tile->tcomps[0].data, tile->tcomps[1].data, tile->tcomps[2].data); break; @@ -1181,7 +1181,7 @@ static int jpc_dec_process_siz(jpc_dec_t *dec, jpc_ms_t *ms) return -1; } - if (!(dec->cmpts = jas_malloc(dec->numcomps * sizeof(jpc_dec_cmpt_t)))) { + if (!(dec->cmpts = jas_alloc2(dec->numcomps, sizeof(jpc_dec_cmpt_t)))) { return -1; } @@ -1204,7 +1204,7 @@ static int jpc_dec_process_siz(jpc_dec_t *dec, jpc_ms_t *ms) dec->numhtiles = JPC_CEILDIV(dec->xend - dec->tilexoff, dec->tilewidth); dec->numvtiles = JPC_CEILDIV(dec->yend - dec->tileyoff, dec->tileheight); dec->numtiles = dec->numhtiles * dec->numvtiles; - if (!(dec->tiles = jas_malloc(dec->numtiles * sizeof(jpc_dec_tile_t)))) { + if (!(dec->tiles = jas_alloc2(dec->numtiles, sizeof(jpc_dec_tile_t)))) { return -1; } @@ -1228,7 +1228,7 @@ static int jpc_dec_process_siz(jpc_dec_t *dec, jpc_ms_t *ms) tile->pkthdrstreampos = 0; tile->pptstab = 0; tile->cp = 0; - if (!(tile->tcomps = jas_malloc(dec->numcomps * + if (!(tile->tcomps = jas_alloc2(dec->numcomps, sizeof(jpc_dec_tcomp_t)))) { return -1; } @@ -1489,7 +1489,7 @@ static jpc_dec_cp_t *jpc_dec_cp_create(uint_fast16_t numcomps) cp->numlyrs = 0; cp->mctid = 0; cp->csty = 0; - if (!(cp->ccps = jas_malloc(cp->numcomps * sizeof(jpc_dec_ccp_t)))) { + if (!(cp->ccps = jas_alloc2(cp->numcomps, sizeof(jpc_dec_ccp_t)))) { return 0; } if (!(cp->pchglist = jpc_pchglist_create())) { @@ -2048,7 +2048,7 @@ jpc_streamlist_t *jpc_streamlist_create() } streamlist->numstreams = 0; streamlist->maxstreams = 100; - if (!(streamlist->streams = jas_malloc(streamlist->maxstreams * + if (!(streamlist->streams = jas_alloc2(streamlist->maxstreams, sizeof(jas_stream_t *)))) { jas_free(streamlist); return 0; @@ -2068,8 +2068,8 @@ int jpc_streamlist_insert(jpc_streamlist_t *streamlist, int streamno, /* Grow the array of streams if necessary. */ if (streamlist->numstreams >= streamlist->maxstreams) { newmaxstreams = streamlist->maxstreams + 1024; - if (!(newstreams = jas_realloc(streamlist->streams, - (newmaxstreams + 1024) * sizeof(jas_stream_t *)))) { + if (!(newstreams = jas_realloc2(streamlist->streams, + (newmaxstreams + 1024), sizeof(jas_stream_t *)))) { return -1; } for (i = streamlist->numstreams; i < streamlist->maxstreams; ++i) { @@ -2155,8 +2155,7 @@ int jpc_ppxstab_grow(jpc_ppxstab_t *tab, int maxents) { jpc_ppxstabent_t **newents; if (tab->maxents < maxents) { - newents = (tab->ents) ? jas_realloc(tab->ents, maxents * - sizeof(jpc_ppxstabent_t *)) : jas_malloc(maxents * sizeof(jpc_ppxstabent_t *)); + newents = jas_realloc2(tab->ents, maxents, sizeof(jpc_ppxstabent_t *)); if (!newents) { return -1; } diff --git a/3rdparty/libjasper/jpc_enc.c b/3rdparty/libjasper/jpc_enc.c index dcd6183f7..a016299f2 100644 --- a/3rdparty/libjasper/jpc_enc.c +++ b/3rdparty/libjasper/jpc_enc.c @@ -403,7 +403,7 @@ static jpc_enc_cp_t *cp_create(char *optstr, jas_image_t *image) vsteplcm *= jas_image_cmptvstep(image, cmptno); } - if (!(cp->ccps = jas_malloc(cp->numcmpts * sizeof(jpc_enc_ccp_t)))) { + if (!(cp->ccps = jas_alloc2(cp->numcmpts, sizeof(jpc_enc_ccp_t)))) { goto error; } for (cmptno = 0, ccp = cp->ccps; cmptno < JAS_CAST(int, cp->numcmpts); ++cmptno, @@ -656,7 +656,7 @@ static jpc_enc_cp_t *cp_create(char *optstr, jas_image_t *image) if (ilyrrates && numilyrrates > 0) { tcp->numlyrs = numilyrrates + 1; - if (!(tcp->ilyrrates = jas_malloc((tcp->numlyrs - 1) * + if (!(tcp->ilyrrates = jas_alloc2((tcp->numlyrs - 1), sizeof(jpc_fix_t)))) { goto error; } @@ -940,7 +940,7 @@ startoff = jas_stream_getrwcount(enc->out); siz->tilewidth = cp->tilewidth; siz->tileheight = cp->tileheight; siz->numcomps = cp->numcmpts; - siz->comps = jas_malloc(siz->numcomps * sizeof(jpc_sizcomp_t)); + siz->comps = jas_alloc2(siz->numcomps, sizeof(jpc_sizcomp_t)); assert(siz->comps); for (i = 0; i < JAS_CAST(int, cp->numcmpts); ++i) { siz->comps[i].prec = cp->ccps[i].prec; @@ -977,7 +977,7 @@ startoff = jas_stream_getrwcount(enc->out); return -1; } crg = &enc->mrk->parms.crg; - crg->comps = jas_malloc(crg->numcomps * sizeof(jpc_crgcomp_t)); + crg->comps = jas_alloc2(crg->numcomps, sizeof(jpc_crgcomp_t)); if (jpc_putms(enc->out, enc->cstate, enc->mrk)) { jas_eprintf("cannot write CRG marker\n"); return -1; @@ -1955,7 +1955,7 @@ jpc_enc_tile_t *jpc_enc_tile_create(jpc_enc_cp_t *cp, jas_image_t *image, int ti tile->mctid = cp->tcp.mctid; tile->numlyrs = cp->tcp.numlyrs; - if (!(tile->lyrsizes = jas_malloc(tile->numlyrs * + if (!(tile->lyrsizes = jas_alloc2(tile->numlyrs, sizeof(uint_fast32_t)))) { goto error; } @@ -1964,7 +1964,7 @@ jpc_enc_tile_t *jpc_enc_tile_create(jpc_enc_cp_t *cp, jas_image_t *image, int ti } /* Allocate an array for the per-tile-component information. */ - if (!(tile->tcmpts = jas_malloc(cp->numcmpts * sizeof(jpc_enc_tcmpt_t)))) { + if (!(tile->tcmpts = jas_alloc2(cp->numcmpts, sizeof(jpc_enc_tcmpt_t)))) { goto error; } /* Initialize a few members critical for error recovery. */ @@ -2110,7 +2110,7 @@ static jpc_enc_tcmpt_t *tcmpt_create(jpc_enc_tcmpt_t *tcmpt, jpc_enc_cp_t *cp, jas_seq2d_ystart(tcmpt->data), jas_seq2d_xend(tcmpt->data), jas_seq2d_yend(tcmpt->data), bandinfos); - if (!(tcmpt->rlvls = jas_malloc(tcmpt->numrlvls * sizeof(jpc_enc_rlvl_t)))) { + if (!(tcmpt->rlvls = jas_alloc2(tcmpt->numrlvls, sizeof(jpc_enc_rlvl_t)))) { goto error; } for (rlvlno = 0, rlvl = tcmpt->rlvls; rlvlno < tcmpt->numrlvls; @@ -2213,7 +2213,7 @@ static jpc_enc_rlvl_t *rlvl_create(jpc_enc_rlvl_t *rlvl, jpc_enc_cp_t *cp, rlvl->numvprcs = JPC_FLOORDIVPOW2(brprcbry - tlprctly, rlvl->prcheightexpn); rlvl->numprcs = rlvl->numhprcs * rlvl->numvprcs; - if (!(rlvl->bands = jas_malloc(rlvl->numbands * sizeof(jpc_enc_band_t)))) { + if (!(rlvl->bands = jas_alloc2(rlvl->numbands, sizeof(jpc_enc_band_t)))) { goto error; } for (bandno = 0, band = rlvl->bands; bandno < rlvl->numbands; @@ -2290,7 +2290,7 @@ if (bandinfo->xstart != bandinfo->xend && bandinfo->ystart != bandinfo->yend) { band->synweight = bandinfo->synenergywt; if (band->data) { - if (!(band->prcs = jas_malloc(rlvl->numprcs * sizeof(jpc_enc_prc_t)))) { + if (!(band->prcs = jas_alloc2(rlvl->numprcs, sizeof(jpc_enc_prc_t)))) { goto error; } for (prcno = 0, prc = band->prcs; prcno < rlvl->numprcs; ++prcno, @@ -2422,7 +2422,7 @@ if (!rlvlno) { goto error; } - if (!(prc->cblks = jas_malloc(prc->numcblks * sizeof(jpc_enc_cblk_t)))) { + if (!(prc->cblks = jas_alloc2(prc->numcblks, sizeof(jpc_enc_cblk_t)))) { goto error; } for (cblkno = 0, cblk = prc->cblks; cblkno < prc->numcblks; diff --git a/3rdparty/libjasper/jpc_mqdec.c b/3rdparty/libjasper/jpc_mqdec.c index 6f19f0587..41c2975c6 100644 --- a/3rdparty/libjasper/jpc_mqdec.c +++ b/3rdparty/libjasper/jpc_mqdec.c @@ -118,7 +118,7 @@ jpc_mqdec_t *jpc_mqdec_create(int maxctxs, jas_stream_t *in) mqdec->in = in; mqdec->maxctxs = maxctxs; /* Allocate memory for the per-context state information. */ - if (!(mqdec->ctxs = jas_malloc(mqdec->maxctxs * sizeof(jpc_mqstate_t *)))) { + if (!(mqdec->ctxs = jas_alloc2(mqdec->maxctxs, sizeof(jpc_mqstate_t *)))) { goto error; } /* Set the current context to the first context. */ diff --git a/3rdparty/libjasper/jpc_mqenc.c b/3rdparty/libjasper/jpc_mqenc.c index 5b55ced02..2aef0f6a6 100644 --- a/3rdparty/libjasper/jpc_mqenc.c +++ b/3rdparty/libjasper/jpc_mqenc.c @@ -197,7 +197,7 @@ jpc_mqenc_t *jpc_mqenc_create(int maxctxs, jas_stream_t *out) mqenc->maxctxs = maxctxs; /* Allocate memory for the per-context state information. */ - if (!(mqenc->ctxs = jas_malloc(mqenc->maxctxs * sizeof(jpc_mqstate_t *)))) { + if (!(mqenc->ctxs = jas_alloc2(mqenc->maxctxs, sizeof(jpc_mqstate_t *)))) { goto error; } diff --git a/3rdparty/libjasper/jpc_qmfb.c b/3rdparty/libjasper/jpc_qmfb.c index a449f2b74..925f289fd 100644 --- a/3rdparty/libjasper/jpc_qmfb.c +++ b/3rdparty/libjasper/jpc_qmfb.c @@ -321,7 +321,7 @@ void jpc_qmfb_split_row(jpc_fix_t *a, int numcols, int parity) #if !defined(HAVE_VLA) /* Get a buffer. */ if (bufsize > QMFB_SPLITBUFSIZE) { - if (!(buf = jas_malloc(bufsize * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide in this case. */ abort(); } @@ -389,7 +389,7 @@ void jpc_qmfb_split_col(jpc_fix_t *a, int numrows, int stride, #if !defined(HAVE_VLA) /* Get a buffer. */ if (bufsize > QMFB_SPLITBUFSIZE) { - if (!(buf = jas_malloc(bufsize * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide in this case. */ abort(); } @@ -460,7 +460,7 @@ void jpc_qmfb_split_colgrp(jpc_fix_t *a, int numrows, int stride, #if !defined(HAVE_VLA) /* Get a buffer. */ if (bufsize > QMFB_SPLITBUFSIZE) { - if (!(buf = jas_malloc(bufsize * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide in this case. */ abort(); } @@ -549,7 +549,7 @@ void jpc_qmfb_split_colres(jpc_fix_t *a, int numrows, int numcols, #if !defined(HAVE_VLA) /* Get a buffer. */ if (bufsize > QMFB_SPLITBUFSIZE) { - if (!(buf = jas_malloc(bufsize * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide in this case. */ abort(); } @@ -633,7 +633,7 @@ void jpc_qmfb_join_row(jpc_fix_t *a, int numcols, int parity) #if !defined(HAVE_VLA) /* Allocate memory for the join buffer from the heap. */ if (bufsize > QMFB_JOINBUFSIZE) { - if (!(buf = jas_malloc(bufsize * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide. */ abort(); } @@ -698,7 +698,7 @@ void jpc_qmfb_join_col(jpc_fix_t *a, int numrows, int stride, #if !defined(HAVE_VLA) /* Allocate memory for the join buffer from the heap. */ if (bufsize > QMFB_JOINBUFSIZE) { - if (!(buf = jas_malloc(bufsize * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc2(bufsize, sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide. */ abort(); } @@ -766,7 +766,7 @@ void jpc_qmfb_join_colgrp(jpc_fix_t *a, int numrows, int stride, #if !defined(HAVE_VLA) /* Allocate memory for the join buffer from the heap. */ if (bufsize > QMFB_JOINBUFSIZE) { - if (!(buf = jas_malloc(bufsize * JPC_QMFB_COLGRPSIZE * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc2(bufsize, JPC_QMFB_COLGRPSIZE * sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide. */ abort(); } @@ -852,7 +852,7 @@ void jpc_qmfb_join_colres(jpc_fix_t *a, int numrows, int numcols, #if !defined(HAVE_VLA) /* Allocate memory for the join buffer from the heap. */ if (bufsize > QMFB_JOINBUFSIZE) { - if (!(buf = jas_malloc(bufsize * numcols * sizeof(jpc_fix_t)))) { + if (!(buf = jas_alloc3(bufsize, numcols, sizeof(jpc_fix_t)))) { /* We have no choice but to commit suicide. */ abort(); } diff --git a/3rdparty/libjasper/jpc_t1enc.c b/3rdparty/libjasper/jpc_t1enc.c index 9c8c448bc..5d80d5589 100644 --- a/3rdparty/libjasper/jpc_t1enc.c +++ b/3rdparty/libjasper/jpc_t1enc.c @@ -219,7 +219,7 @@ int jpc_enc_enccblk(jpc_enc_t *enc, jas_stream_t *out, jpc_enc_tcmpt_t *tcmpt, j cblk->numpasses = (cblk->numbps > 0) ? (3 * cblk->numbps - 2) : 0; if (cblk->numpasses > 0) { - cblk->passes = jas_malloc(cblk->numpasses * sizeof(jpc_enc_pass_t)); + cblk->passes = jas_alloc2(cblk->numpasses, sizeof(jpc_enc_pass_t)); assert(cblk->passes); } else { cblk->passes = 0; diff --git a/3rdparty/libjasper/jpc_t2cod.c b/3rdparty/libjasper/jpc_t2cod.c index d48ec7d6d..1bff357fb 100644 --- a/3rdparty/libjasper/jpc_t2cod.c +++ b/3rdparty/libjasper/jpc_t2cod.c @@ -573,7 +573,7 @@ int jpc_pchglist_insert(jpc_pchglist_t *pchglist, int pchgno, jpc_pchg_t *pchg) } if (pchglist->numpchgs >= pchglist->maxpchgs) { newmaxpchgs = pchglist->maxpchgs + 128; - if (!(newpchgs = jas_realloc(pchglist->pchgs, newmaxpchgs * sizeof(jpc_pchg_t *)))) { + if (!(newpchgs = jas_realloc2(pchglist->pchgs, newmaxpchgs, sizeof(jpc_pchg_t *)))) { return -1; } pchglist->maxpchgs = newmaxpchgs; diff --git a/3rdparty/libjasper/jpc_t2dec.c b/3rdparty/libjasper/jpc_t2dec.c index 10f483937..074040240 100644 --- a/3rdparty/libjasper/jpc_t2dec.c +++ b/3rdparty/libjasper/jpc_t2dec.c @@ -478,7 +478,7 @@ jpc_pi_t *jpc_dec_pi_create(jpc_dec_t *dec, jpc_dec_tile_t *tile) return 0; } pi->numcomps = dec->numcomps; - if (!(pi->picomps = jas_malloc(pi->numcomps * sizeof(jpc_picomp_t)))) { + if (!(pi->picomps = jas_alloc2(pi->numcomps, sizeof(jpc_picomp_t)))) { jpc_pi_destroy(pi); return 0; } @@ -490,7 +490,7 @@ jpc_pi_t *jpc_dec_pi_create(jpc_dec_t *dec, jpc_dec_tile_t *tile) for (compno = 0, tcomp = tile->tcomps, picomp = pi->picomps; compno < pi->numcomps; ++compno, ++tcomp, ++picomp) { picomp->numrlvls = tcomp->numrlvls; - if (!(picomp->pirlvls = jas_malloc(picomp->numrlvls * + if (!(picomp->pirlvls = jas_alloc2(picomp->numrlvls, sizeof(jpc_pirlvl_t)))) { jpc_pi_destroy(pi); return 0; @@ -503,7 +503,7 @@ jpc_pi_t *jpc_dec_pi_create(jpc_dec_t *dec, jpc_dec_tile_t *tile) rlvlno < picomp->numrlvls; ++rlvlno, ++pirlvl, ++rlvl) { /* XXX sizeof(long) should be sizeof different type */ pirlvl->numprcs = rlvl->numprcs; - if (!(pirlvl->prclyrnos = jas_malloc(pirlvl->numprcs * + if (!(pirlvl->prclyrnos = jas_alloc2(pirlvl->numprcs, sizeof(long)))) { jpc_pi_destroy(pi); return 0; diff --git a/3rdparty/libjasper/jpc_t2enc.c b/3rdparty/libjasper/jpc_t2enc.c index ff4774f38..68945b79f 100644 --- a/3rdparty/libjasper/jpc_t2enc.c +++ b/3rdparty/libjasper/jpc_t2enc.c @@ -565,7 +565,7 @@ jpc_pi_t *jpc_enc_pi_create(jpc_enc_cp_t *cp, jpc_enc_tile_t *tile) } pi->pktno = -1; pi->numcomps = cp->numcmpts; - if (!(pi->picomps = jas_malloc(pi->numcomps * sizeof(jpc_picomp_t)))) { + if (!(pi->picomps = jas_alloc2(pi->numcomps, sizeof(jpc_picomp_t)))) { jpc_pi_destroy(pi); return 0; } @@ -577,7 +577,7 @@ jpc_pi_t *jpc_enc_pi_create(jpc_enc_cp_t *cp, jpc_enc_tile_t *tile) for (compno = 0, tcomp = tile->tcmpts, picomp = pi->picomps; compno < pi->numcomps; ++compno, ++tcomp, ++picomp) { picomp->numrlvls = tcomp->numrlvls; - if (!(picomp->pirlvls = jas_malloc(picomp->numrlvls * + if (!(picomp->pirlvls = jas_alloc2(picomp->numrlvls, sizeof(jpc_pirlvl_t)))) { jpc_pi_destroy(pi); return 0; @@ -591,7 +591,7 @@ jpc_pi_t *jpc_enc_pi_create(jpc_enc_cp_t *cp, jpc_enc_tile_t *tile) /* XXX sizeof(long) should be sizeof different type */ pirlvl->numprcs = rlvl->numprcs; if (rlvl->numprcs) { - if (!(pirlvl->prclyrnos = jas_malloc(pirlvl->numprcs * + if (!(pirlvl->prclyrnos = jas_alloc2(pirlvl->numprcs, sizeof(long)))) { jpc_pi_destroy(pi); return 0; diff --git a/3rdparty/libjasper/jpc_tagtree.c b/3rdparty/libjasper/jpc_tagtree.c index e76ec4b9f..a8d4ab2ca 100644 --- a/3rdparty/libjasper/jpc_tagtree.c +++ b/3rdparty/libjasper/jpc_tagtree.c @@ -125,7 +125,7 @@ jpc_tagtree_t *jpc_tagtree_create(int numleafsh, int numleafsv) ++numlvls; } while (n > 1); - if (!(tree->nodes_ = jas_malloc(tree->numnodes_ * sizeof(jpc_tagtreenode_t)))) { + if (!(tree->nodes_ = jas_alloc2(tree->numnodes_, sizeof(jpc_tagtreenode_t)))) { return 0; } diff --git a/3rdparty/libjasper/jpc_util.c b/3rdparty/libjasper/jpc_util.c index c7a4fe4af..b3512eb90 100644 --- a/3rdparty/libjasper/jpc_util.c +++ b/3rdparty/libjasper/jpc_util.c @@ -109,7 +109,7 @@ int jpc_atoaf(char *s, int *numvalues, double **values) } if (n) { - if (!(vs = jas_malloc(n * sizeof(double)))) { + if (!(vs = jas_alloc2(n, sizeof(double)))) { return -1; } From c7db1c1cc81083eb5c5ccf3111486cfaa9aae202 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 01:59:32 +0400 Subject: [PATCH 033/103] Apply 02-fix-filename-buffer-overflow patch from debian libjasper-dev (1.900.1-13) package --- 3rdparty/libjasper/jasper/jas_stream.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/3rdparty/libjasper/jasper/jas_stream.h b/3rdparty/libjasper/jasper/jas_stream.h index 666e8791a..f31daa82c 100644 --- a/3rdparty/libjasper/jasper/jas_stream.h +++ b/3rdparty/libjasper/jasper/jas_stream.h @@ -77,6 +77,7 @@ #include #include +#include #if defined(HAVE_FCNTL_H) #include #endif @@ -251,7 +252,7 @@ typedef struct { typedef struct { int fd; int flags; - char pathname[L_tmpnam + 1]; + char pathname[PATH_MAX + 1]; } jas_stream_fileobj_t; #define JAS_STREAM_FILEOBJ_DELONCLOSE 0x01 From 70fed019ae4f78582d0ab17a38688e8bce409f21 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 02:03:20 +0400 Subject: [PATCH 034/103] Apply 03-CVE-2011-4516-and-CVE-2011-4517 patch from debian libjasper-dev (1.900.1-13) package --- 3rdparty/libjasper/jpc_cs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/3rdparty/libjasper/jpc_cs.c b/3rdparty/libjasper/jpc_cs.c index 85378d6b1..97d607ef7 100644 --- a/3rdparty/libjasper/jpc_cs.c +++ b/3rdparty/libjasper/jpc_cs.c @@ -743,6 +743,10 @@ static int jpc_cox_getcompparms(jpc_ms_t *ms, jpc_cstate_t *cstate, return -1; } compparms->numrlvls = compparms->numdlvls + 1; + if (compparms->numrlvls > JPC_MAXRLVLS) { + jpc_cox_destroycompparms(compparms); + return -1; + } if (prtflag) { for (i = 0; i < compparms->numrlvls; ++i) { if (jpc_getuint8(in, &tmp)) { @@ -1330,7 +1334,7 @@ static int jpc_crg_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in jpc_crgcomp_t *comp; uint_fast16_t compno; crg->numcomps = cstate->numcomps; - if (!(crg->comps = jas_alloc2(cstate->numcomps, sizeof(uint_fast16_t)))) { + if (!(crg->comps = jas_alloc2(cstate->numcomps, sizeof(jpc_crgcomp_t)))) { return -1; } for (compno = 0, comp = crg->comps; compno < cstate->numcomps; From 6e6cfdd0241a184d51adf68e079580c255577e15 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 02:05:07 +0400 Subject: [PATCH 035/103] Add changelog and copyright files from debian libjasper-dev (1.900.1-13) package --- 3rdparty/libjasper/changelog | 162 +++++++++++++++++++++++++++++++++++ 3rdparty/libjasper/copyright | 62 ++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 3rdparty/libjasper/changelog create mode 100644 3rdparty/libjasper/copyright diff --git a/3rdparty/libjasper/changelog b/3rdparty/libjasper/changelog new file mode 100644 index 000000000..809a15c12 --- /dev/null +++ b/3rdparty/libjasper/changelog @@ -0,0 +1,162 @@ +jasper (1.900.1-13) unstable; urgency=high + + * Fix CVE-2011-4516 and CVE-2011-4517: Two buffer overflow issues possibly + exploitable via specially crafted input files (Closes: #652649) + Thanks to Red Hat and Michael Gilbert + + -- Roland Stigge Wed, 04 Jan 2012 19:14:40 +0100 + +jasper (1.900.1-12) unstable; urgency=low + + * Added patch to fix filename buffer overflow, thanks to Jonas Smedegard + and Alex Cherepanov from ghostscript (Closes: #649833) + + -- Roland Stigge Sun, 27 Nov 2011 19:56:01 +0100 + +jasper (1.900.1-11) unstable; urgency=low + + * Added Multiarch support, thanks to Colin Watson (Closes: #645118) + + -- Roland Stigge Wed, 02 Nov 2011 17:16:10 +0100 + +jasper (1.900.1-10) unstable; urgency=low + + * Added debian/watch + * debian/patches/01-misc-fixes.patch: + - Separated out config.{guess,sub} + + -- Roland Stigge Mon, 15 Aug 2011 19:09:29 +0200 + +jasper (1.900.1-9) unstable; urgency=low + + * Switch to dpkg-source 3.0 (quilt) format + * Using new dh 7 build system + + -- Roland Stigge Tue, 12 Jul 2011 20:21:21 +0200 + +jasper (1.900.1-8) unstable; urgency=low + + * Removed unneeded .la file (Closes: #633162) + * debian/control: + - Standards-Version: 3.9.2 + - use libjpeg8-dev instead of libjpeg62-dev + + -- Roland Stigge Mon, 11 Jul 2011 21:27:24 +0200 + +jasper (1.900.1-7) unstable; urgency=low + + * Acknowledge NMU + * Added patch to fix Debian patch for CVE-2008-3521 (Closes: #506739) + * debian/control: Standards-Version: 3.8.4 + + -- Roland Stigge Sun, 21 Feb 2010 16:09:45 +0100 + +jasper (1.900.1-6.1) unstable; urgency=low + + * Non-maintainer upload. + * This is a fix for the GeoJP2 patch introduced in 1.900.1-5 which caused + GDAL faulting. Thanks Even Rouault. (Closes: #553429) + + -- Francesco Paolo Lovergine Wed, 28 Oct 2009 09:39:28 +0100 + +jasper (1.900.1-6) unstable; urgency=low + + * Reverted to jasper 1.900.1-6 because 1.900.1-5.1 messed up (see #528543) + but 1.900.1-5 wasn't available anymore. (Closes: #514296, #528543) + * Re-applied patch from #275619 as in 1.900.1-5 + * debian/control: Standards-Version: 3.8.2 + * Applied patch by Nico Golde (Closes: #501021) + - CVE-2008-3522[0]: Buffer overflow. + - CVE-2008-3521[1]: unsecure temporary files handling. + - CVE-2008-3520[2]: Multiple integer overflows. + + -- Roland Stigge Sat, 20 Jun 2009 15:21:16 +0200 + +jasper (1.900.1-5.1) unstable; urgency=low + + * Non-maintainer upload. + * add patches/02_security.dpatch to fix various CVEs (Closes: #501021): + + CVE-2008-3522[0]: Buffer overflow. + + CVE-2008-3521[1]: unsecure temporary files handling. + + CVE-2008-3520[2]: Multiple integer overflows. + + -- Pierre Habouzit Sun, 12 Oct 2008 21:40:59 +0200 + +jasper (1.900.1-5) unstable; urgency=low + + * Added GeoJP2 patch by Sven Geggus + (Closes: #275619) + * debian/control: Standards-Version: 3.8.0 + + -- Roland Stigge Sun, 08 Jun 2008 13:14:24 +0200 + +jasper (1.900.1-4) unstable; urgency=low + + * src/libjasper/jpc/jpc_dec.c: Extended assert() to accept 4 color + components (Closes: #469786) + * debian/rules: improve "make distclean", thanks to lintian + * debian/control: + - Standards-Version: 3.7.3 + - ${Source-Version} -> ${binary:Version} + - Removed self-dependencies of libjasper-dev + + -- Roland Stigge Sun, 09 Mar 2008 11:53:44 +0100 + +jasper (1.900.1-3) unstable; urgency=low + + * Fixed segfaults on broken images (Closes: #413041) + + -- Roland Stigge Tue, 10 Apr 2007 10:05:10 +0200 + +jasper (1.900.1-2) experimental; urgency=low + + * Added jas_tmr.h to -dev package (Closes: #414705) + + -- Roland Stigge Tue, 13 Mar 2007 14:23:58 +0100 + +jasper (1.900.1-1) experimental; urgency=low + + * New upstream release + * debian/control: + - Standards-Version: 3.7.2 + - Build-Depends: freeglut3-dev instead of libglut3-dev (Closes: #394496) + * Renamed packages to libjasper1, libjasper-dev, libjasper-runtime according + to upstream shared library naming change + + -- Roland Stigge Fri, 26 Jan 2007 14:22:18 +0100 + +jasper (1.701.0-2) unstable; urgency=low + + * Prevent compression of pdf documents in binary packages + * Added man pages for the executables (Closes: #250077) + * Again renamed binary packages to reflect Policy: + - libjasper-1.701-1 + - libjasper-1.701-dev (Provides, Replaces and Conflicts: libjasper-dev) + - libjasper-runtime + + -- Roland Stigge Sun, 20 Jun 2004 13:54:10 +0200 + +jasper (1.701.0-1) unstable; urgency=low + + * New maintainer (Closes: #217099) + * New upstream release (Closes: #217570) + - new DFSG-compliant license (Closes: #218999, #245075) + - includes newer libtool related files (Closes: #210383) + * debian/control: + - Standards-Version: 3.6.1 + - Changed binary package names, fixed interdependencies (Closes: #211592) + libjasper-1.700-2 => libjasper1 + libjasper-1.700-2-dev => libjasper-dev + libjasper-progs => libjasper-runtime + (new packages conflicting and replacing the old ones) + - Added libxi-dev, libxmu-dev, libxt-dev to Build-Depends + (Closes: #250481) + + -- Roland Stigge Sat, 19 Jun 2004 23:19:32 +0200 + +jasper (1.700.2-1) unstable; urgency=low + + * Initial Release. + + -- Christopher L Cheney Fri, 22 Aug 2003 01:30:00 -0500 + diff --git a/3rdparty/libjasper/copyright b/3rdparty/libjasper/copyright new file mode 100644 index 000000000..88a55abca --- /dev/null +++ b/3rdparty/libjasper/copyright @@ -0,0 +1,62 @@ +This package was debianized by Christopher L Cheney on +Fri, 22 Aug 2003 01:33:34 -0500. + +The current maintainer is Roland Stigge + +It was downloaded from http://www.ece.uvic.ca/~mdadams/jasper/ + +Upstream Author: Michael Adams + +License: + +JasPer License Version 2.0 + +Copyright (c) 1999-2000 Image Power, Inc. +Copyright (c) 1999-2000 The University of British Columbia +Copyright (c) 2001-2003 Michael David Adams + +All rights reserved. + +Permission is hereby granted, free of charge, to any person (the +"User") obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +1. The above copyright notices and this permission notice (which +includes the disclaimer below) shall be included in all copies or +substantial portions of the Software. + +2. The name of a copyright holder shall not be used to endorse or +promote products derived from the Software without specific prior +written permission. + +THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS +LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER +THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS +"AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO +EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL +INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING +FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE +PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE +THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY. +EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS +BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL +PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS +GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE +ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE +IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL +SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES, +AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL +SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH +THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH, +PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH +RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY +EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES. + From d8015fd6ed7664bd178ad3a3c9fd3644c7cfb245 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 29 Aug 2012 23:15:07 +0400 Subject: [PATCH 036/103] Fix libjasper build with MSVC --- 3rdparty/libjasper/CMakeLists.txt | 4 ++-- 3rdparty/libjasper/jas_malloc.c | 2 ++ 3rdparty/libjasper/jas_stream.c | 12 ++++++++++++ 3rdparty/libjasper/jasper/jas_stream.h | 4 ++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/3rdparty/libjasper/CMakeLists.txt b/3rdparty/libjasper/CMakeLists.txt index 5b850c9dd..0478ef9d4 100644 --- a/3rdparty/libjasper/CMakeLists.txt +++ b/3rdparty/libjasper/CMakeLists.txt @@ -23,8 +23,8 @@ if(MSVC) add_definitions(-DJAS_WIN_MSVC_BUILD) endif() -ocv_warnings_disable(CMAKE_C_FLAGS -Wno-implicit-function-declaration -Wno-uninitialized -Wmissing-prototypes -Wmissing-declarations -Wunused -Wshadow -Wsign-compare - /wd4013 /wd4018 /wd4715 /wd4244 /wd4101 /wd4267) +ocv_warnings_disable(CMAKE_C_FLAGS -Wno-implicit-function-declaration -Wno-uninitialized -Wmissing-prototypes -Wmissing-declarations -Wunused -Wshadow -Wsign-compare) +ocv_warnings_disable(CMAKE_C_FLAGS /wd4013 /wd4018 /wd4101 /wd4244 /wd4267 /wd4715) # vs2005 if(UNIX) if(CMAKE_COMPILER_IS_GNUCXX OR CV_ICC) diff --git a/3rdparty/libjasper/jas_malloc.c b/3rdparty/libjasper/jas_malloc.c index 25173af42..098203613 100644 --- a/3rdparty/libjasper/jas_malloc.c +++ b/3rdparty/libjasper/jas_malloc.c @@ -78,7 +78,9 @@ #include #include #include +#ifndef _WIN32 #include +#endif #include "jasper/jas_malloc.h" diff --git a/3rdparty/libjasper/jas_stream.c b/3rdparty/libjasper/jas_stream.c index 9b89fa9e5..c2ba4c86e 100644 --- a/3rdparty/libjasper/jas_stream.c +++ b/3rdparty/libjasper/jas_stream.c @@ -363,6 +363,17 @@ jas_stream_t *jas_stream_tmpfile() obj->flags = 0; stream->obj_ = obj; +#ifdef _WIN32 + /* Choose a file name. */ + tmpnam(obj->pathname); + + /* Open the underlying file. */ + if ((obj->fd = open(obj->pathname, O_CREAT | O_EXCL | O_RDWR | O_TRUNC | O_BINARY, + JAS_STREAM_PERMS)) < 0) { + jas_stream_destroy(stream); + return 0; + } +#else /* Choose a file name. */ snprintf(obj->pathname, L_tmpnam, "%s/tmp.XXXXXXXXXX", P_tmpdir); @@ -371,6 +382,7 @@ jas_stream_t *jas_stream_tmpfile() jas_stream_destroy(stream); return 0; } +#endif /* Unlink the file so that it will disappear if the program terminates abnormally. */ diff --git a/3rdparty/libjasper/jasper/jas_stream.h b/3rdparty/libjasper/jasper/jas_stream.h index f31daa82c..a77efa76b 100644 --- a/3rdparty/libjasper/jasper/jas_stream.h +++ b/3rdparty/libjasper/jasper/jas_stream.h @@ -252,7 +252,11 @@ typedef struct { typedef struct { int fd; int flags; +#if defined _WIN32 && !defined __MINGW__ && !defined __MINGW32__ + char pathname[MAX_PATH + 1]; +#else char pathname[PATH_MAX + 1]; +#endif } jas_stream_fileobj_t; #define JAS_STREAM_FILEOBJ_DELONCLOSE 0x01 From a881f165ecdaecc0faff5b794f46baa75022dd95 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Thu, 30 Aug 2012 00:56:18 +0400 Subject: [PATCH 037/103] Update readme for 3rdparty libs --- 3rdparty/readme.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/3rdparty/readme.txt b/3rdparty/readme.txt index fb1777374..ceac43dda 100644 --- a/3rdparty/readme.txt +++ b/3rdparty/readme.txt @@ -6,33 +6,33 @@ In order to use these versions of libraries instead of system ones on UNIX syste should use BUILD_ CMake flags (for example, BUILD_PNG for the libpng library). ------------------------------------------------------------------------------------ -libjpeg 6b (6.2) - The Independent JPEG Group's JPEG software. - Copyright (C) 1994-1997, Thomas G. Lane. +libjpeg 8d (8.4) - The Independent JPEG Group's JPEG software. + Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. See IGJ home page http://www.ijg.org for details and links to the source code HAVE_JPEG preprocessor flag must be set to make highgui use libjpeg. On UNIX systems configure script takes care of it. ------------------------------------------------------------------------------------ -libpng 1.5.9 - Portable Network Graphics library. - Copyright (C) 2004, 2006-2011 Glenn Randers-Pehrson. +libpng 1.5.12 - Portable Network Graphics library. + Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson. See libpng home page http://www.libpng.org for details and links to the source code HAVE_PNG preprocessor flag must be set to make highgui use libpng. On UNIX systems configure script takes care of it. ------------------------------------------------------------------------------------ -libtiff 4.0.1 - Tag Image File Format (TIFF) Software +libtiff 4.0.2 - Tag Image File Format (TIFF) Software Copyright (c) 1988-1997 Sam Leffler Copyright (c) 1991-1997 Silicon Graphics, Inc. - See libtiff home page http://www.libtiff.org + See libtiff home page http://www.remotesensing.org/libtiff/ for details and links to the source code HAVE_TIFF preprocessor flag must be set to make highgui use libtiff. On UNIX systems configure script takes care of it. In this build support for ZIP (LZ77 compression) is turned on. ------------------------------------------------------------------------------------ -zlib 1.2.6 - General purpose LZ77 compression library +zlib 1.2.7 - General purpose LZ77 compression library Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler. See zlib home page http://www.zlib.net for details and links to the source code From 29cdddd84540990b1140987facae68fac9b55eb6 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 30 Aug 2012 09:48:16 +0400 Subject: [PATCH 038/103] fixed bug in buildPointList --- modules/gpu/src/cuda/hough.cu | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/gpu/src/cuda/hough.cu b/modules/gpu/src/cuda/hough.cu index 580b9de14..9ee7621c2 100644 --- a/modules/gpu/src/cuda/hough.cu +++ b/modules/gpu/src/cuda/hough.cu @@ -64,23 +64,22 @@ namespace cv { namespace gpu { namespace device const int x = blockIdx.x * blockDim.x * PIXELS_PER_THREAD + threadIdx.x; const int y = blockIdx.y * blockDim.y + threadIdx.y; - if (y >= src.rows) - return; - if (threadIdx.x == 0) s_qsize[threadIdx.y] = 0; - __syncthreads(); - // fill the queue - const uchar* srcRow = src.ptr(y); - for (int i = 0, xx = x; i < PIXELS_PER_THREAD && xx < src.cols; ++i, xx += blockDim.x) + if (y < src.rows) { - if (srcRow[xx]) + // fill the queue + const uchar* srcRow = src.ptr(y); + for (int i = 0, xx = x; i < PIXELS_PER_THREAD && xx < src.cols; ++i, xx += blockDim.x) { - const unsigned int val = (y << 16) | xx; - const int qidx = Emulation::smem::atomicAdd(&s_qsize[threadIdx.y], 1); - s_queues[threadIdx.y][qidx] = val; + if (srcRow[xx]) + { + const unsigned int val = (y << 16) | xx; + const int qidx = Emulation::smem::atomicAdd(&s_qsize[threadIdx.y], 1); + s_queues[threadIdx.y][qidx] = val; + } } } From 44330afc7f77398818c37d6871cbacb7f4e2ecfc Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 30 Aug 2012 10:35:32 +0400 Subject: [PATCH 039/103] fixed build without CUDA --- modules/gpu/src/denoising.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/gpu/src/denoising.cpp b/modules/gpu/src/denoising.cpp index f7dd2fbfa..7a85de90f 100644 --- a/modules/gpu/src/denoising.cpp +++ b/modules/gpu/src/denoising.cpp @@ -47,7 +47,8 @@ using namespace cv::gpu; #if !defined (HAVE_CUDA) -cv::gpu::bilateralFilter(const GpuMat&, GpuMat&, int, float, float, int, Stream&) { throw_nogpu(); } +void cv::gpu::bilateralFilter(const GpuMat&, GpuMat&, int, float, float, int, Stream&) { throw_nogpu(); } +void cv::gpu::nonLocalMeans(const GpuMat&, GpuMat&, float, int, int, int, Stream&) { throw_nogpu(); } #else @@ -82,8 +83,8 @@ void cv::gpu::bilateralFilter(const GpuMat& src, GpuMat& dst, int kernel_size, f sigma_color = (sigma_color <= 0 ) ? 1 : sigma_color; sigma_spatial = (sigma_spatial <= 0 ) ? 1 : sigma_spatial; - - + + int radius = (kernel_size <= 0) ? cvRound(sigma_spatial*1.5) : kernel_size/2; kernel_size = std::max(radius, 1)*2 + 1; @@ -132,4 +133,4 @@ void cv::gpu::nonLocalMeans(const GpuMat& src, GpuMat& dst, float h, int search_ -#endif \ No newline at end of file +#endif From b929012583ab7a7a2a7187c4e512c11c134b9515 Mon Sep 17 00:00:00 2001 From: niko Date: Thu, 30 Aug 2012 16:03:46 +0800 Subject: [PATCH 040/103] performance fix of convertC3C4 add OCL 1.2 feature for setTo bug fix of integral replace the error code -217 with suitable MACRO simplify tests, no need apply a new context for each test case add more control for tests in utility.hpp --- cmake/OpenCVDetectOpenCL.cmake | 2 +- modules/ocl/include/opencv2/ocl/ocl.hpp | 21 - modules/ocl/perf/main.cpp | 25 +- modules/ocl/perf/perf_test_ocl.cpp | 1191 ----------------- modules/ocl/perf/test_arithm.cpp | 229 ++-- modules/ocl/perf/test_filters.cpp | 114 +- modules/ocl/perf/test_haar.cpp | 12 +- modules/ocl/perf/test_imgproc.cpp | 134 +- modules/ocl/perf/test_matrix_operation.cpp | 56 +- modules/ocl/perf/test_split_merge.cpp | 32 +- modules/ocl/perf/utility.hpp | 6 +- modules/ocl/src/arithm.cpp | 34 +- modules/ocl/src/filtering.cpp | 6 +- modules/ocl/src/haar.cpp | 141 +- modules/ocl/src/imgproc.cpp | 8 +- modules/ocl/src/initialization.cpp | 26 +- modules/ocl/src/kernels/convertC3C4.cl | 90 +- modules/ocl/src/kernels/imgproc_integral.cl | 20 +- .../ocl/src/kernels/imgproc_integral_sum.cl | 15 +- modules/ocl/src/matrix_operations.cpp | 53 +- modules/ocl/src/split_merge.cpp | 4 +- modules/ocl/test/main.cpp | 15 +- modules/ocl/test/test_arithm.cpp | 11 +- modules/ocl/test/test_blend.cpp | 6 +- modules/ocl/test/test_canny.cpp | 6 +- modules/ocl/test/test_columnsum.cpp | 6 +- modules/ocl/test/test_fft.cpp | 6 +- modules/ocl/test/test_filters.cpp | 72 +- modules/ocl/test/test_gemm.cpp | 4 +- modules/ocl/test/test_haar.cpp | 12 +- modules/ocl/test/test_hog.cpp | 4 +- modules/ocl/test/test_imgproc.cpp | 86 +- modules/ocl/test/test_match_template.cpp | 12 +- modules/ocl/test/test_matrix_operation.cpp | 40 +- modules/ocl/test/test_pyrdown.cpp | 10 +- modules/ocl/test/test_pyrup.cpp | 6 +- modules/ocl/test/test_split_merge.cpp | 20 +- 37 files changed, 716 insertions(+), 1819 deletions(-) delete mode 100644 modules/ocl/perf/perf_test_ocl.cpp diff --git a/cmake/OpenCVDetectOpenCL.cmake b/cmake/OpenCVDetectOpenCL.cmake index 96473a500..b62072939 100644 --- a/cmake/OpenCVDetectOpenCL.cmake +++ b/cmake/OpenCVDetectOpenCL.cmake @@ -2,7 +2,7 @@ if(APPLE) set(OPENCL_FOUND YES) set(OPENCL_LIBRARIES "-framework OpenCL") else() - #find_package(OpenCL QUIET) + find_package(OpenCL QUIET) if(WITH_OPENCLAMDFFT) find_path(CLAMDFFT_INCLUDE_DIR NAMES clAmdFft.h) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index a58cce3b3..1a60a885c 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -144,32 +144,15 @@ namespace cv //! assignment operator. Perfom blocking upload to device. oclMat &operator = (const Mat &m); - /* Fixme! To be supported in OpenCL later. */ -#if 0 - //! returns lightweight DevMem2D_ structure for passing to nvcc-compiled code. - // Contains just image size, data ptr and step. - template operator DevMem2D_() const; - template operator PtrStep_() const; -#endif //! pefroms blocking upload data to oclMat. void upload(const cv::Mat &m); - /* Fixme! To be supported in OpenCL later. */ -#if 0 - //! upload async - void upload(const CudaMem &m, Stream &stream); -#endif //! downloads data from device to host memory. Blocking calls. operator Mat() const; void download(cv::Mat &m) const; - /* Fixme! To be supported in OpenCL later. */ -#if 0 - //! download async - void download(CudaMem &m, Stream &stream) const; -#endif //! returns a new oclMatrix header for the specified row oclMat row(int y) const; @@ -855,10 +838,6 @@ namespace cv int minNeighbors, int flags, CvSize minSize = cvSize(0, 0), CvSize maxSize = cvSize(0, 0)); }; - ///////////////////////////////////////////////////////jhp_benchmark//////////////////////////////////////////////////// - void benchmark_copy_vectorize(const oclMat &src, oclMat &dst); - void benchmark_copy_offset_stride(const oclMat &src, oclMat &dst); - void benchmark_ILP(); //! computes vertical sum, supports only CV_32FC1 images CV_EXPORTS void columnSum(const oclMat& src, oclMat& sum); diff --git a/modules/ocl/perf/main.cpp b/modules/ocl/perf/main.cpp index 0d9d96791..e5b9597ba 100644 --- a/modules/ocl/perf/main.cpp +++ b/modules/ocl/perf/main.cpp @@ -74,29 +74,26 @@ void print_info() } -#if PERF_TEST_OCL -int main(int argc, char** argv) -{ - - static std::vector ocl_info; - ocl::getDevice(ocl_info); - - run_perf_test(); - return 0; -} -#else int main(int argc, char** argv) { + std::vector oclinfo; TS::ptr()->init("ocl"); InitGoogleTest(&argc, argv); print_info(); - + int devnums = getDevice(oclinfo); + if(devnums<1) + { + std::cout << "no device found\n"; + return -1; + } + //if you want to use undefault device, set it here + //setDevice(oclinfo[0]); + setBinpath(CLBINPATH); return RUN_ALL_TESTS(); } -#endif // PERF_TEST_OCL -#else // HAVE_OPENC +#else // DON'T HAVE_OPENCL int main() { diff --git a/modules/ocl/perf/perf_test_ocl.cpp b/modules/ocl/perf/perf_test_ocl.cpp deleted file mode 100644 index 67f20a33d..000000000 --- a/modules/ocl/perf/perf_test_ocl.cpp +++ /dev/null @@ -1,1191 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Multicore Ware, Inc., all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Peng Xiao, pengxiao@multicorewareinc.com -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other oclMaterials provided with the distribution. -// -// * The name of the copyright holders may not 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 Intel Corporation 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. -// -//M*/ - -#include "precomp.hpp" -#include - -#if PERF_TEST_OCL - -#ifdef HAVE_OPENCL - -#define SHOW_CPU false -#define REPEAT 1000 -#define COUNT_U 0 // count the uploading execution time for ocl mat structures -#define COUNT_D 0 - - -// the following macro section tests the target function (kernel) performance -// upload is the code snippet for converting cv::mat to cv::ocl::oclMat -// downloading is the code snippet for converting cv::ocl::oclMat back to cv::mat -// change COUNT_U and COUNT_D to take downloading and uploading time into account -#define P_TEST_FULL( upload, kernel_call, download ) \ -{ \ - std::cout<< "\n" #kernel_call "\n----------------------"; \ - {upload;} \ - R_TEST( kernel_call, 15 ); \ - double t = (double)cvGetTickCount(); \ - R_T( { \ - if( COUNT_U ) {upload;} \ - kernel_call; \ - if( COUNT_D ) {download;} \ - } ); \ - t = (double)cvGetTickCount() - t; \ - std::cout << "runtime is " << t/((double)cvGetTickFrequency()* 1000.) << "ms" << std::endl; \ -} - - -#define R_T2( test ) \ -{ \ - std::cout<< "\n" #test "\n----------------------"; \ - R_TEST( test, 15 ) \ - clock_t st = clock(); \ - R_T( test ) \ - std::cout<< clock() - st << "ms\n"; \ -} -#define R_T( test ) \ - R_TEST( test, REPEAT ) -#define R_TEST( test, repeat ) \ - try{ \ - for( int i = 0; i < repeat; i ++ ) { test; } \ - } catch( ... ) { std::cout << "||||| Exception catched! |||||\n"; return; } - -#define FILTER_TEST_IMAGE "C:/Windows/Web/Wallpaper/Landscapes/img9.jpg" -#define WARN_NRUN( name ) \ - std::cout << "Warning: " #name " is not runnable!\n"; - - -void print_info(); - -// performance base class -struct PerfTest -{ - virtual void Run() = 0; - protected: - virtual void SetUp() = 0; -}; -/////////////////////////////////////// -// Arithm -struct ArithmTestP : PerfTest -{ - int type; - cv::Scalar val; - - cv::Size size; - cv::Mat mat1, mat2; - cv::Mat mask; - cv::Mat dst; - cv::ocl::oclMat oclRes, oclmat1, oclmat2; - cv::ocl::oclMat oclmask; - std::vector dstv; - protected: - ArithmTestP() : type( CV_8UC4 ) {} - virtual void SetUp() - { - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - size = cv::Size( 3000, 3000 ); // big input image - mat1 = cvtest::randomMat(rng, size, type, 1, 255, false); - mat2 = cvtest::randomMat(rng, size, type, 1, 255, false); - mask = cvtest::randomMat(rng, size, CV_8UC1, 0, 2, false); - - cv::threshold(mask, mask, 0.5, 255., CV_8UC1); - - val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - - oclmat1 = cv::ocl::oclMat(mat1); - oclmat2 = cv::ocl::oclMat(mat2); - oclmask = cv::ocl::oclMat(mask); - } -}; - -struct AddArrayP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::add(oclmat1, oclmat2, oclRes), - oclRes.download(dst); - ); - } -}; - -struct SubtractArrayP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::subtract(oclmat1, oclmat2, oclRes), - oclRes.download(dst); - ); - } -}; - -struct MultiplyArrayP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - clock_t start = clock(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::multiply(oclmat1, oclmat2, oclRes), - oclRes.download(dst); - ); - } -}; - -struct DivideArrayP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::divide(oclmat1, oclmat2, oclRes), - oclRes.download(dst); - ); - } -}; - -struct ExpP : ArithmTestP -{ - void Run() - { - type = CV_32FC1; - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::exp(oclmat1, oclRes), - oclRes.download(dst); - ); - } -}; - -struct LogP : ArithmTestP -{ - void Run() - { - type = CV_32FC1; - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::log(oclmat1, oclRes), - oclRes.download(dst); - ); - } -}; - -struct CompareP : ArithmTestP -{ - virtual void Run() - { - type = CV_32FC1; - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::compare(oclmat1, oclmat2, oclRes, cv::CMP_EQ), - oclRes.download(dst); - ); - } -}; - -struct FlipP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::flip(oclmat1, oclRes, 0), - oclRes.download(dst); - ); - } - protected: - virtual void SetUp() - { - type = CV_8UC4; - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - size = cv::Size(3000, 3000); - mat1 = cvtest::randomMat(rng, size, type, 1, 255, false); - oclmat1 = cv::ocl::oclMat(mat1); - } -}; - -struct MagnitudeP : ArithmTestP -{ - virtual void Run() - { - type = CV_32F; - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::magnitude(oclmat1, oclmat1, oclRes), - oclRes.download(dst); - ); - } -}; - -struct LUTP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);ocllut = cv::ocl::oclMat(lut), - cv::ocl::LUT(oclmat1, ocllut, oclRes), - oclRes.download(dst); - ); - } - protected: - cv::Mat lut; - cv::ocl::oclMat ocllut; - virtual void SetUp() - { - type = CV_8UC1; - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - size = cv::Size(3000, 3000); - mat1 = cvtest::randomMat(rng, size, type, 1, 255, false); - lut = cvtest::randomMat(rng, cv::Size(256, 1), CV_8UC1, 100, 200, false); - oclmat1 = cv::ocl::oclMat(mat1); - ocllut = cv::ocl::oclMat(lut); - } -}; - -struct MinMaxP : ArithmTestP -{ - double minVal_gold, minVal; - double maxVal_gold, maxVal; - - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::minMax(oclmat1, &minVal, &maxVal, oclmat2), - {}; - ); - } - - protected: - virtual void SetUp() - { - type = CV_64F; - - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - - size = cv::Size(3000, 3000); - - mat1 = cvtest::randomMat(rng, size, type, 0.0, 127.0, false); - mat2 = cvtest::randomMat(rng, size, CV_8UC1, 0, 2, false); - - oclmat1 = cv::ocl::oclMat(mat1); - oclmat2 = cv::ocl::oclMat(mat2); - } -}; - -struct MinMaxLocP : MinMaxP -{ - cv::Point minLoc_gold; - cv::Point maxLoc_gold; - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::minMaxLoc(oclmat1, &minVal, &maxVal, &minLoc_gold, &maxLoc_gold, oclmat2), - {} - ); - } -}; - -struct CountNonZeroP : ArithmTestP -{ - int n; - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - n = cv::ocl::countNonZero(oclmat1), - {} - ); - } - protected: - virtual void SetUp() - { - type = 6; - - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - - size = cv::Size( 3000, 3000 ); - - cv::Mat matBase = cvtest::randomMat(rng, size, CV_8U, 0.0, 1.0, false); - matBase.convertTo(mat1, type); - - oclmat1 = cv::ocl::oclMat(mat1); - } -}; - -struct SumP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - cv::Scalar n; - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - n = cv::ocl::sum(oclmat1), - {} - ); - } -}; - -struct BitwiseP : ArithmTestP -{ - protected: - virtual void SetUp() - { - type = CV_8UC4; - - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - - size = cv::Size( 3000, 3000 ); - - mat1.create(size, type); - mat2.create(size, type); - - for (int i = 0; i < mat1.rows; ++i) - { - cv::Mat row1(1, static_cast(mat1.cols * mat1.elemSize()), CV_8U, (void*)mat1.ptr(i)); - rng.fill(row1, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(255)); - - cv::Mat row2(1, static_cast(mat2.cols * mat2.elemSize()), CV_8U, (void*)mat2.ptr(i)); - rng.fill(row2, cv::RNG::UNIFORM, cv::Scalar(0), cv::Scalar(255)); - } - oclmat1 = cv::ocl::oclMat(mat1); - oclmat2 = cv::ocl::oclMat(mat2); - } -}; - -struct BitwiseNotP : BitwiseP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::bitwise_not(oclmat1, oclRes), - oclRes.download(dst) - ); - } -}; - -struct BitwiseAndP : BitwiseP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::bitwise_and(oclmat1, oclmat2, oclRes), - oclRes.download(dst) - ); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::bitwise_and(oclmat1, val, oclRes), - oclRes.download(dst) - ); - } -}; - -struct BitwiseXorP : BitwiseP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::bitwise_xor(oclmat1, oclmat2, oclRes), - oclRes.download(dst) - ); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::bitwise_xor(oclmat1, val, oclRes), - oclRes.download(dst) - ); - - } -}; - -struct BitwiseOrP : BitwiseP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::bitwise_or(oclmat1, oclmat2, oclRes), - oclRes.download(dst) - ); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::bitwise_or(oclmat1, val, oclRes), - oclRes.download(dst) - ); - } -}; - -struct TransposeP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::transpose(oclmat1, oclRes), - oclRes.download(dst) - ); - } -}; - -struct AbsdiffArrayP : ArithmTestP -{ - virtual void Run() - { - type = CV_32FC1; - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::absdiff(oclmat1, oclmat2, oclRes), - oclRes.download(dst) - ); - } -}; - -struct PhaseP : ArithmTestP -{ - virtual void Run() - { - type = CV_32F; - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1);oclmat2 = cv::ocl::oclMat(mat2), - cv::ocl::phase(oclmat1,oclmat2,oclRes,1), - oclRes.download(dst) - ); - } -}; - -struct CartToPolarP : ArithmTestP -{ - cv::ocl::oclMat oclRes1; - virtual void Run() - { - type = CV_64FC4; - SetUp(); - clock_t start = clock(); - R_TEST( - cv::ocl::cartToPolar(oclmat1,oclmat2,oclRes, oclRes1, 1); - if( COUNT_D ) {oclRes.download(dst);oclRes1.download(dst);} - , 5); - std::cout<< "ocl::CartToPolar -- " << clock() - start << "ms\n"; - } -}; - -struct PolarToCartP : ArithmTestP -{ - cv::ocl::oclMat oclRes1; - virtual void Run() - { - type = CV_64FC4; - SetUp(); - clock_t start = clock(); - R_TEST( - cv::ocl::polarToCart(oclmat1,oclmat2,oclRes, oclRes1, 1); - if( COUNT_D ) {oclRes.download(dst);oclRes1.download(dst);} - , 2); - std::cout<< "ocl::polarToCart -- " << clock() - start << "ms\n"; - } -}; - -/////////////////////////////////////// -// split & merge -struct SplitP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::split(oclmat1, dev_dst), - { - dstv.resize(dev_dst.size()); - for (size_t i = 0; i < dev_dst.size(); ++i) - { - dev_dst[i].download(dstv[i]); - } - } - ); - } - protected: - std::vector dev_dst; - virtual void SetUp() - { - size = cv::Size( 3000, 3000 ); - - mat1.create(size, type); - mat1.setTo(cv::Scalar(1.0, 2.0, 3.0, 4.0)); - - oclmat1 = cv::ocl::oclMat(mat1); - } -}; - -struct MergeP : SplitP -{ - virtual void Run() - { - SetUp(); - cv::ocl::split(oclmat1, dev_dst); - cv::split(mat1, dstv); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - cv::ocl::merge(dev_dst, oclmat2), - oclmat2.download(dst) - ); - } -}; - -struct SetToP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - static cv::Scalar s = cv::Scalar(1, 2, 3, 4); - P_TEST_FULL( - oclmat2 = cv::ocl::oclMat(mat2), - oclmat1.setTo( s, oclmat2 ), - oclmat1.download(dst); - ); - } - protected: - virtual void SetUp() - { - type = CV_32FC4; - size = cv::Size(3000, 3000); - - mat1.create(size, type); - oclmat1.create(size, type); - - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - mat2 = cvtest::randomMat(rng, size, CV_8UC1, 0.0, 1.5, false); - oclmat2 = cv::ocl::oclMat(mat2); - } -}; - -struct CopyToP : SetToP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - oclmat1.copyTo( oclRes, oclmat2 ), - oclRes.download(dst) - ); - } -}; - -struct ConvertToP : ArithmTestP -{ - virtual void Run() - { - type = CV_32FC1;; - SetUp(); - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - const double a = rng.uniform(0.0, 1.0); - const double b = rng.uniform(-10.0, 10.0); - - int type2 = CV_32FC4; - - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat(mat1), - oclmat1.convertTo( oclRes, type2 /*, a, b */ ), // fails when scaling factors a and b are specified - oclRes.download(dst) - ); - } -}; - -//////////////////////////////////////////// -// Filters - -struct FilterTestP : PerfTest -{ - protected: - int ksize; - int dx, dy; - - cv::Mat img_rgba; - cv::Mat img_gray; - - cv::ocl::oclMat ocl_img_rgba; - cv::ocl::oclMat ocl_img_gray; - - cv::ocl::oclMat dev_dst_rgba; - cv::ocl::oclMat dev_dst_gray; - - cv::Mat dst_rgba; - cv::Mat dst_gray; - - cv::Mat kernel; - - int bordertype; - - virtual void SetUp() - { - bordertype = (int)cv::BORDER_DEFAULT; - ksize = 7; - dx = ksize/2; dy = ksize/2; - - kernel = cv::Mat::ones(ksize, ksize, CV_8U); - - cv::Mat img = readImage(FILTER_TEST_IMAGE); - ASSERT_FALSE(img.empty()); - - cv::cvtColor(img, img_rgba, CV_BGR2BGRA); - cv::cvtColor(img, img_gray, CV_BGR2GRAY); - - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - } -}; - -struct BlurP : FilterTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - { - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::blur(ocl_img_rgba, dev_dst_rgba, cv::Size(ksize, ksize), cv::Point(-1,-1), bordertype); - cv::ocl::blur(ocl_img_gray, dev_dst_gray, cv::Size(ksize, ksize), cv::Point(-1,-1), bordertype); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -struct SobelP : FilterTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - { - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::Sobel(ocl_img_rgba, dev_dst_rgba, -1, dx, dy, ksize, 1, 0, bordertype); - cv::ocl::Sobel(ocl_img_gray, dev_dst_gray, -1, dx, dy, ksize, 1, 0, bordertype); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -struct ScharrP : FilterTestP -{ - virtual void Run() - { - SetUp(); - dx = 0; dy = 1; - P_TEST_FULL( - { - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::Scharr(ocl_img_rgba, dev_dst_rgba, -1, dx, dy, 1, 0, bordertype); - cv::ocl::Scharr(ocl_img_gray, dev_dst_gray, -1, dx, dy, 1, 0, bordertype); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -struct GaussianBlurP : FilterTestP -{ - virtual void Run() - { - double sigma1 = 3, sigma2 = 3; - SetUp(); - P_TEST_FULL( - { - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::GaussianBlur(ocl_img_rgba, dev_dst_rgba, cv::Size(ksize, ksize), sigma1, sigma2); - cv::ocl::GaussianBlur(ocl_img_gray, dev_dst_gray, cv::Size(ksize, ksize), sigma1, sigma2); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -struct DilateP : FilterTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - { - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::dilate(ocl_img_rgba, dev_dst_rgba, kernel); - cv::ocl::dilate(ocl_img_gray, dev_dst_gray, kernel); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -struct ErodeP : FilterTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - { - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::erode(ocl_img_rgba, dev_dst_rgba, kernel); - cv::ocl::erode(ocl_img_gray, dev_dst_gray, kernel); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -struct MorphExP : FilterTestP -{ - virtual void Run() - { - SetUp(); - cv::ocl::oclMat okernel; - P_TEST_FULL( - { - okernel = cv::ocl::oclMat(kernel); - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::morphologyEx(ocl_img_rgba, dev_dst_rgba, 3, okernel); - cv::ocl::morphologyEx(ocl_img_gray, dev_dst_gray, 3, okernel); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -struct LaplacianP : FilterTestP -{ - void Run() - { - SetUp(); - P_TEST_FULL( - { - ocl_img_rgba = cv::ocl::oclMat(img_rgba); - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::Laplacian(ocl_img_rgba, dev_dst_rgba, -1, 3 ); - cv::ocl::Laplacian(ocl_img_gray, dev_dst_gray, -1, 3 ); - }, - { - dev_dst_rgba.download(dst_rgba); - dev_dst_gray.download(dst_gray); - }); - } -}; - -//////////////////// -// histograms -struct CalcHistP : PerfTest -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat = cv::ocl::oclMat( src ), - cv::ocl::calcHist(oclmat, oclRes), - oclRes.download(hist) - ); - } - protected: - cv::Size size; - cv::Mat src, hist; - - cv::ocl::oclMat oclmat; - cv::ocl::oclMat oclRes; - - virtual void SetUp() - { - cv::RNG& rng = cvtest::TS::ptr()->get_rng(); - size = cv::Size(3000, 3000); - src = cvtest::randomMat(rng, size, CV_8UC1, 0, 255, false); - oclmat = cv::ocl::oclMat( src ); - } -}; - -struct EqualizeHistP : CalcHistP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat = cv::ocl::oclMat( src ), - cv::ocl::equalizeHist(oclmat, oclRes), - oclRes.download(hist) - ); - } -}; - -struct ThresholdP : CalcHistP -{ - virtual void Run() - { - SetUp(); - int threshOp = (int)cv::THRESH_TOZERO_INV;; - double maxVal = 200; - double thresh = 125; - - clock_t start = clock(); - - P_TEST_FULL( - oclmat = cv::ocl::oclMat( src ), - cv::ocl::threshold(oclmat, oclRes, thresh, maxVal, threshOp ), - oclRes.download(hist) - ); - } -}; - -struct ResizeP : ArithmTestP -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat( mat1 ), - cv::ocl::resize(oclmat1, oclRes, cv::Size(), 2.0, 2.0), - oclRes.download(dst) - ); - } -}; - -struct CvtColorP : PerfTest -{ - virtual void Run() - { - SetUp(); - P_TEST_FULL( - oclmat = cv::ocl::oclMat( img ), - cv::ocl::cvtColor(oclmat, ocldst, cvtcode), - ocldst.download(dst) - ); - } - protected: - int type; - int cvtcode; - - cv::Mat img, dst; - cv::ocl::oclMat oclmat, ocldst; - virtual void SetUp() - { - type = CV_8U; - cvtcode = CV_BGR2GRAY; - cv::Mat imgBase = readImage(FILTER_TEST_IMAGE); - ASSERT_FALSE(imgBase.empty()); - - imgBase.convertTo(img, type, type == CV_32F ? 1.0 / 255.0 : 1.0); - oclmat = cv::ocl::oclMat( img ); - }; -}; - - -struct WarpAffineP : ArithmTestP -{ - void Run() - { - SetUp(); - const double aplha = CV_PI / 4; - double mat[2][3] = { {std::cos(aplha), -std::sin(aplha), mat1.cols / 2}, - {std::sin(aplha), std::cos(aplha), 0}}; - cv::Mat M(2, 3, CV_64F, (void*) mat); - - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat( mat1 ), - cv::ocl::warpAffine( oclmat1, oclRes, M, cv::Size(1500, 1500) ), - oclRes.download(dst) - ); - } -}; - -struct WarpPerspectiveP : ArithmTestP -{ - void Run() - { - SetUp(); - const double aplha = CV_PI / 4; - double mat[3][3] = { {std::cos(aplha), -std::sin(aplha), mat1.cols / 2}, - {std::sin(aplha), std::cos(aplha), 0}, - {0.0, 0.0, 1.0}}; - cv::Mat M(3, 3, CV_64F, (void*) mat); - - P_TEST_FULL( - oclmat1 = cv::ocl::oclMat( mat1 ), - cv::ocl::warpPerspective( oclmat1, oclRes, M, cv::Size(1500, 1500) ), - oclRes.download(dst) - ); - } -}; - - -struct CornerHarrisP : FilterTestP -{ - void Run() - { - SetUp(); - bordertype = 2; - P_TEST_FULL( - { - ocl_img_gray = cv::ocl::oclMat(img_gray); - }, - { - cv::ocl::cornerHarris(ocl_img_gray, dev_dst_gray, 3, ksize, 0.5, bordertype ); - }, - { - dev_dst_gray.download(dst_gray); - }); - } -}; - -void test() -{ - clock_t start = clock(); - std::cout << ">>>>>>>> Performance test started <<<<<<<<\n"; - /* - { - AddArrayP AddArrayP; - AddArrayP.Run(); - SubtractArrayP subarray; - subarray.Run(); - MultiplyArrayP MultiplyArrayP; - MultiplyArrayP.Run(); - DivideArrayP DivideArrayP; - DivideArrayP.Run(); - } - std::cout.flush(); - { - CompareP comp; - comp.Run(); - MagnitudeP magnitude; - magnitude.Run(); - LUTP lut; - lut.Run(); - FlipP FlipP; - FlipP.Run(); - MinMaxP minmax; - minmax.Run(); - MinMaxLocP minmaxloc; - minmaxloc.Run(); - CountNonZeroP cnz; - cnz.Run(); - SumP sum; - sum.Run(); - }*/ - /* std::cout.flush(); - { - BitwiseNotP bn; - bn.Run(); - BitwiseOrP bo; - bo.Run(); - BitwiseAndP ba; - ba.Run(); - BitwiseXorP bx; - bx.Run(); - }*/ - - std::cout.flush(); - { - // TransposeP transpose; - // transpose.Run(); - // AbsdiffArrayP absdiff; - // absdiff.Run(); - // SplitP split; - // split.Run(); - // MergeP merge; - // merge.Run(); - /* - SetToP setto; - setto.Run(); - CopyToP copyto; - copyto.Run(); - ConvertToP convertto; - convertto.Run(); - */ - } - /* - std::cout.flush(); - { - BlurP blur; - blur.Run(); - SobelP sobel; - sobel.Run(); - ScharrP scharr; - scharr.Run(); - GaussianBlurP gblur; - gblur.Run(); - DilateP dilate; - dilate.Run(); - ErodeP erode; - erode.Run(); - } - std::cout.flush(); - { - MorphExP morphex; - morphex.Run(); - CalcHistP calchist; - calchist.Run(); - EqualizeHistP eqhist; - eqhist.Run(); - ThresholdP threshold; - threshold.Run(); - ResizeP resize; - resize.Run(); - CvtColorP cvtcolor; - cvtcolor.Run(); - } - - { - LogP log; - log.Run(); - ExpP exp; - exp.Run(); - } - - std::cout.flush(); - { - //PhaseP phase; - //phase.Run(); - } - std::cout.flush(); - { - CartToPolarP ctop; - ctop.Run(); - } - std::cout.flush(); - { - PolarToCartP ptoc; - ptoc.Run(); - } - { - WarpAffineP warpA; - warpA.Run(); - WarpPerspectiveP warpP; - warpP.Run(); - } - - { - CornerHarrisP ch; - ch.Run(); - } - - { - LaplacianP laplacian; - laplacian.Run(); - } - - - */ - std::cout << ">>>>>>>> Performance test ended <<<<<<<<\ntotal - " << clock() - start << "ms\n"; - std::cout.flush(); -} - -void run_perf_test() -{ - print_info(); - cvtest::TS::ptr()->init("ocl"); - test(); -} - -#endif // WITH_OPENCL - -#endif // PREF_TEST_OCL diff --git a/modules/ocl/perf/test_arithm.cpp b/modules/ocl/perf/test_arithm.cpp index 0e6cf6e4b..60458df80 100644 --- a/modules/ocl/perf/test_arithm.cpp +++ b/modules/ocl/perf/test_arithm.cpp @@ -89,7 +89,7 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; cv::ocl::oclMat gdst1_whole; //bak @@ -119,11 +119,11 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) cv::threshold(mask, mask, 0.5, 255., CV_8UC1); val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - int devnums = getDevice(oclinfo); - CV_Assert(devnums>0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums>0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); } void Has_roi(int b) @@ -193,7 +193,7 @@ TEST_P(Lut, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;kget_rng(); @@ -1009,7 +1009,7 @@ TEST_P(Div, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;kget_rng(); @@ -1134,7 +1134,7 @@ TEST_P(Absdiff, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; cv::ocl::oclMat gdst1_whole; //bak @@ -3169,11 +3169,11 @@ PARAM_TEST_CASE ( CompareTestBase, MatType, bool) cv::threshold(mask, mask, 0.5, 255., CV_8UC1); val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - int devnums = getDevice(oclinfo); - CV_Assert(devnums>0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums>0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); } void Has_roi(int b) @@ -3235,7 +3235,7 @@ TEST_P(Compare, Mat) } int cmp_codes[] = {CMP_EQ, CMP_GT, CMP_GE, CMP_LT, CMP_LE, CMP_NE}; - //const char* cmp_str[] = {"CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE"}; + const char* cmp_str[] = {"CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE"}; int cmp_num = sizeof(cmp_codes) / sizeof(int); for (int i = 0; i < cmp_num; ++i) { @@ -3247,7 +3247,7 @@ TEST_P(Compare, Mat) double t0=0; double t1=0; double t2=0; - for(int k=1;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; cv::ocl::oclMat gdst1_whole; //bak @@ -174,7 +174,7 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -193,11 +193,11 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } @@ -237,7 +237,7 @@ TEST_P(Blur, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) @@ -375,7 +375,7 @@ TEST_P(Laplacian, Accuracy) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) @@ -521,7 +521,7 @@ TEST_P(Erode, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -683,11 +683,11 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) @@ -726,7 +726,7 @@ TEST_P(Sobel, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -821,11 +821,11 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) @@ -863,7 +863,7 @@ TEST_P(Scharr, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -963,11 +963,11 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) @@ -1006,7 +1006,7 @@ TEST_P(GaussianBlur, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; cv::ocl::OclCascadeClassifier cascade, nestedCascade; cv::CascadeClassifier cpucascade, cpunestedCascade; // Mat img; @@ -85,11 +85,11 @@ PARAM_TEST_CASE(HaarTestBase, int, int) return; } - int devnums = getDevice(oclinfo); - CV_Assert(devnums>0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath("E:\\"); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums>0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath("E:\\"); } }; diff --git a/modules/ocl/perf/test_imgproc.cpp b/modules/ocl/perf/test_imgproc.cpp index e01e97681..95eba5f43 100644 --- a/modules/ocl/perf/test_imgproc.cpp +++ b/modules/ocl/perf/test_imgproc.cpp @@ -103,7 +103,7 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType,MatType,MatType,MatType,MatType, bool) cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - std::vector oclinfo; + //std::vector oclinfo; //ocl mat cv::ocl::oclMat clmat1; cv::ocl::oclMat clmat2; @@ -128,11 +128,11 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType,MatType,MatType,MatType,MatType, bool) cv::RNG& rng = TS::ptr()->get_rng(); cv::Size size(MWIDTH, MHEIGHT); double min = 1,max = 20; - int devnums = getDevice(oclinfo); - CV_Assert(devnums>0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums>0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); if(type1!=nulltype) { mat1 = randomMat(rng, size, type1, min, max, false); @@ -289,7 +289,7 @@ TEST_P(equalizeHist, MatType) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -755,11 +755,11 @@ PARAM_TEST_CASE(WarpTestBase, MatType, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) { @@ -816,7 +816,7 @@ TEST_P(WarpAffine, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -1003,11 +1003,11 @@ PARAM_TEST_CASE(Resize, MatType, cv::Size, double, double, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, dsize, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) { @@ -1053,7 +1053,7 @@ TEST_P(Resize, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -1146,11 +1146,11 @@ PARAM_TEST_CASE(Threshold, MatType, ThreshOp) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) { @@ -1191,7 +1191,7 @@ TEST_P(Threshold, Mat) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl mat with roi cv::ocl::oclMat gsrc_roi; cv::ocl::oclMat gdst_roi; @@ -1300,11 +1300,11 @@ PARAM_TEST_CASE(meanShiftTestBase, MatType, MatType, int, int, cv::TermCriteria) dst = randomMat(rng, size, type, 5, 16, false); dstCoor = randomMat(rng, size, typeCoor, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath(CLBINPATH); } void Has_roi(int b) @@ -1380,7 +1380,7 @@ TEST_P(meanShiftFiltering, Mat) cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; } #else - for(int j = 0; j < 2; j ++) + for(int j = LOOPROISTART; j < LOOPROIEND; j ++) { Has_roi(j); @@ -1438,7 +1438,7 @@ TEST_P(meanShiftProc, Mat) cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; } #else - for(int j = 0; j < 2; j ++) + for(int j = LOOPROISTART; j < LOOPROIEND; j ++) { Has_roi(j); @@ -1482,21 +1482,21 @@ INSTANTIATE_TEST_CASE_P(ImgprocTestBase, equalizeHist, Combine( // NULL_TYPE, // Values(false))); // Values(false) is the reserved parameter -//INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine( -// Values(CV_8UC1,CV_32FC1), -// NULL_TYPE, -// ONE_TYPE(CV_32FC1), -// NULL_TYPE, -// NULL_TYPE, -// Values(false))); // Values(false) is the reserved parameter -// -//INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerHarris, Combine( -// Values(CV_8UC1,CV_32FC1), -// NULL_TYPE, -// ONE_TYPE(CV_32FC1), -// NULL_TYPE, -// NULL_TYPE, -// Values(false))); // Values(false) is the reserved parameter +INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine( + Values(CV_8UC1,CV_32FC1), + NULL_TYPE, + ONE_TYPE(CV_32FC1), + NULL_TYPE, + NULL_TYPE, + Values(false))); // Values(false) is the reserved parameter + +INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerHarris, Combine( + Values(CV_8UC1,CV_32FC1), + NULL_TYPE, + ONE_TYPE(CV_32FC1), + NULL_TYPE, + NULL_TYPE, + Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(ImgprocTestBase, integral, Combine( diff --git a/modules/ocl/perf/test_matrix_operation.cpp b/modules/ocl/perf/test_matrix_operation.cpp index cc9a142a6..434a62fab 100644 --- a/modules/ocl/perf/test_matrix_operation.cpp +++ b/modules/ocl/perf/test_matrix_operation.cpp @@ -72,7 +72,7 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType) //src mat with roi cv::Mat mat_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -90,11 +90,11 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType) mat = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); } void Has_roi(int b) @@ -141,7 +141,7 @@ TEST_P(ConvertTo, Accuracy) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -237,11 +237,11 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool) mask = randomMat(rng, size, CV_8UC1, 0, 2, false); cv::threshold(mask, mask, 0.5, 255., CV_8UC1); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); } void Has_roi(int b) @@ -293,7 +293,7 @@ TEST_P(CopyTo, Without_mask) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gmat_whole; @@ -445,11 +445,11 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool) cv::threshold(mask, mask, 0.5, 255., CV_8UC1); val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); } void Has_roi(int b) @@ -495,7 +495,7 @@ TEST_P(SetTo, Without_mask) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -111,11 +111,11 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int) mat3 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); mat4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); dst = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); } void Has_roi(int b) { @@ -174,7 +174,7 @@ TEST_P(Merge, Accuracy) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst1_whole; cv::ocl::oclMat gdst2_whole; @@ -308,11 +308,11 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int) dst2 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); dst3 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); dst4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - setBinpath(CLBINPATH); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); } void Has_roi(int b) @@ -370,7 +370,7 @@ TEST_P(Split, Accuracy) double t0=0; double t1=0; double t2=0; - for(int k=0;k<2;k++){ + for(int k=LOOPROISTART;k impl -> double_support ==0 && src1.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -370,7 +370,7 @@ void arithmetic_run(const oclMat &src1, const oclMat &src2, oclMat &dst, const o { if(src1.clCxt -> impl -> double_support ==0 && src1.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -467,7 +467,7 @@ void arithmetic_scalar_run(const oclMat &src1, const Scalar &src2, oclMat &dst, { if(src1.clCxt -> impl -> double_support ==0 && src1.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -537,7 +537,7 @@ void arithmetic_scalar_run(const oclMat &src, oclMat &dst, string kernelName, co { if(src.clCxt -> impl -> double_support ==0 && src.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -640,7 +640,7 @@ void cv::ocl::divide(double scalar, const oclMat &src, oclMat &dst) { if(src.clCxt -> impl -> double_support ==0) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -803,7 +803,7 @@ Scalar cv::ocl::sum(const oclMat &src) { if(src.clCxt->impl->double_support==0 && src.depth()==CV_64F) { - CV_Error(-217,"select device don't support double"); + CV_Error(CV_GpuNotSupported,"select device don't support double"); } static sumFunc functab[2] = { @@ -948,7 +948,7 @@ void cv::ocl::minMax(const oclMat &src, double *minVal, double *maxVal, const oc CV_Assert(src.channels() == 1); if(src.clCxt->impl->double_support==0 && src.depth()==CV_64F) { - CV_Error(-217,"select device don't support double"); + CV_Error(CV_GpuNotSupported,"select device don't support double"); } static minMaxFunc functab[8] = { @@ -1032,7 +1032,7 @@ void arithmetic_flip_rows_run(const oclMat &src, oclMat &dst, string kernelName) { if(src.clCxt -> impl -> double_support ==0 && src.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -1081,7 +1081,7 @@ void arithmetic_flip_cols_run(const oclMat &src, oclMat &dst, string kernelName, { if(src.clCxt -> impl -> double_support ==0 && src.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -1261,7 +1261,7 @@ void arithmetic_exp_log_run(const oclMat &src, oclMat &dst, string kernelName, c Context *clCxt = src.clCxt; if(clCxt -> impl -> double_support ==0 && src.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } //int channels = dst.channels(); @@ -1302,7 +1302,7 @@ void arithmetic_magnitude_phase_run(const oclMat &src1, const oclMat &src2, oclM { if(src1.clCxt -> impl -> double_support ==0 && src1.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -1350,7 +1350,7 @@ void arithmetic_phase_run(const oclMat &src1, const oclMat &src2, oclMat &dst, s { if(src1.clCxt -> impl -> double_support ==0 && src1.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -1414,7 +1414,7 @@ void arithmetic_cartToPolar_run(const oclMat &src1, const oclMat &src2, oclMat & { if(src1.clCxt -> impl -> double_support ==0 && src1.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -1469,7 +1469,7 @@ void arithmetic_ptc_run(const oclMat &src1, const oclMat &src2, oclMat &dst1, oc { if(src1.clCxt -> impl -> double_support ==0 && src1.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -1651,7 +1651,7 @@ void cv::ocl::minMaxLoc(const oclMat &src, double *minVal, double *maxVal, { if(src.clCxt->impl->double_support==0 && src.depth()==CV_64F) { - CV_Error(-217,"select device don't support double"); + CV_Error(CV_GpuNotSupported,"select device don't support double"); } static minMaxLocFunc functab[2] = { @@ -1698,7 +1698,7 @@ int cv::ocl::countNonZero(const oclMat &src) size_t groupnum = src.clCxt->impl->maxComputeUnits; if(src.clCxt->impl->double_support == 0 && src.depth()==CV_64F) { - CV_Error(-217,"select device don't support double"); + CV_Error(CV_GpuNotSupported,"select device don't support double"); } CV_Assert(groupnum != 0); groupnum = groupnum * 2; @@ -2122,7 +2122,7 @@ void transpose_run(const oclMat &src, oclMat &dst, string kernelName) { if(src.clCxt -> impl -> double_support ==0 && src.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } diff --git a/modules/ocl/src/filtering.cpp b/modules/ocl/src/filtering.cpp index c71c2a23e..02c13702f 100644 --- a/modules/ocl/src/filtering.cpp +++ b/modules/ocl/src/filtering.cpp @@ -371,7 +371,7 @@ void GPUErode(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize, c sprintf(s, "-D VAL=FLT_MAX -D GENTYPE=float4"); break; default: - CV_Error(-217,"unsupported type"); + CV_Error(CV_StsUnsupportedFormat,"unsupported type"); } char compile_option[128]; sprintf(compile_option, "-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D ERODE %s", anchor.x, anchor.y, localThreads[0], localThreads[1],s); @@ -443,7 +443,7 @@ void GPUDilate(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize, sprintf(s, "-D VAL=-FLT_MAX -D GENTYPE=float4"); break; default: - CV_Error(-217,"unsupported type"); + CV_Error(CV_StsUnsupportedFormat,"unsupported type"); } char compile_option[128]; sprintf(compile_option, "-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D DILATE %s", anchor.x, anchor.y, localThreads[0], localThreads[1],s); @@ -1501,7 +1501,7 @@ void cv::ocl::Laplacian(const oclMat &src, oclMat &dst, int ddepth, int ksize, d { if(src.clCxt -> impl -> double_support ==0 && src.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } diff --git a/modules/ocl/src/haar.cpp b/modules/ocl/src/haar.cpp index 644463e8b..c5fe777af 100644 --- a/modules/ocl/src/haar.cpp +++ b/modules/ocl/src/haar.cpp @@ -976,8 +976,8 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS cl_mem nodebuffer; cl_mem candidatebuffer; cl_mem scaleinfobuffer; - cl_kernel kernel; - kernel = openCLGetKernelFromSource(gimg.clCxt, &haarobjectdetect, "gpuRunHaarClassifierCascade"); + //cl_kernel kernel; + //kernel = openCLGetKernelFromSource(gimg.clCxt, &haarobjectdetect, "gpuRunHaarClassifierCascade"); cv::Rect roi, roi2; cv::Mat imgroi, imgroisq; cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; @@ -1060,23 +1060,22 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS //openCLVerifyCall(status); //openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->clCmdQueue,cascadebuffer,1,0,sizeof(GpuHidHaarClassifierCascade),gcascade,0,NULL,NULL)); - stagebuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, sizeof(GpuHidHaarStageClassifier) * gcascade->count, NULL, &status); - openCLVerifyCall(status); + stagebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(GpuHidHaarStageClassifier) * gcascade->count); + //openCLVerifyCall(status); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, stagebuffer, 1, 0, sizeof(GpuHidHaarStageClassifier)*gcascade->count, stage, 0, NULL, NULL)); //classifierbuffer = clCreateBuffer(gsum.clCxt->clContext,CL_MEM_READ_ONLY,sizeof(GpuHidHaarClassifier)*totalclassifier,NULL,&status); //status = clEnqueueWriteBuffer(gsum.clCxt->clCmdQueue,classifierbuffer,1,0,sizeof(GpuHidHaarClassifier)*totalclassifier,classifier,0,NULL,NULL); - nodebuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, - nodenum * sizeof(GpuHidHaarTreeNode), NULL, &status); - openCLVerifyCall(status); + nodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY,nodenum * sizeof(GpuHidHaarTreeNode)); + //openCLVerifyCall(status); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, nodebuffer, 1, 0, nodenum * sizeof(GpuHidHaarTreeNode), node, 0, NULL, NULL)); - candidatebuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_WRITE_ONLY, 4 * sizeof(int) * outputsz, NULL, &status); - openCLVerifyCall(status); - scaleinfobuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount, NULL, &status); - openCLVerifyCall(status); + candidatebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_WRITE_ONLY, 4 * sizeof(int) * outputsz); + //openCLVerifyCall(status); + scaleinfobuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount); + //openCLVerifyCall(status); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, scaleinfobuffer, 1, 0, sizeof(detect_piramid_info)*loopcount, scaleinfo, 0, NULL, NULL)); //flag = 1; //} @@ -1105,8 +1104,27 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int argcount = 0; //int grpnumperline = ((m + localThreads[0] - 1) / localThreads[0]); //int totalgrp = ((n + localThreads[1] - 1) / localThreads[1])*grpnumperline; - openCLVerifyKernel(gsum.clCxt, kernel, &blocksize, globalThreads, localThreads); + // openCLVerifyKernel(gsum.clCxt, kernel, &blocksize, globalThreads, localThreads); //openCLSafeCall(clSetKernelArg(kernel,argcount++,sizeof(cl_mem),(void*)&cascadebuffer)); + + vector > args; + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&scaleinfobuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&nodebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsqsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&candidatebuffer )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&pixelstep )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&loopcount )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&endstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startnode )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitnode )); + args.push_back ( make_pair(sizeof(cl_int4) , (void *)&p )); + args.push_back ( make_pair(sizeof(cl_int4) , (void *)&pq )); + args.push_back ( make_pair(sizeof(cl_float) , (void *)&correction )); + /* openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&stagebuffer)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&scaleinfobuffer)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&nodebuffer)); @@ -1122,19 +1140,20 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int), (void *)&splitnode)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int4), (void *)&p)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int4), (void *)&pq)); - openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_float), (void *)&correction)); + openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_float), (void *)&correction));*/ //openCLSafeCall(clSetKernelArg(kernel,argcount++,sizeof(cl_int),(void*)&n)); //openCLSafeCall(clSetKernelArg(kernel,argcount++,sizeof(cl_int),(void*)&grpnumperline)); //openCLSafeCall(clSetKernelArg(kernel,argcount++,sizeof(cl_int),(void*)&totalgrp)); - openCLSafeCall(clEnqueueNDRangeKernel(gsum.clCxt->impl->clCmdQueue, kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); + // openCLSafeCall(clEnqueueNDRangeKernel(gsum.clCxt->impl->clCmdQueue, kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); - openCLSafeCall(clFinish(gsum.clCxt->impl->clCmdQueue)); - //t = (double)cvGetTickCount() - t; + // openCLSafeCall(clFinish(gsum.clCxt->impl->clCmdQueue)); + openCLExecuteKernel(gsum.clCxt, &haarobjectdetect, "gpuRunHaarClassifierCascade", globalThreads, localThreads, args, -1, -1); + //t = (double)cvGetTickCount() - t; //printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); //t = (double)cvGetTickCount(); - openCLSafeCall(clEnqueueReadBuffer(gsum.clCxt->impl->clCmdQueue, candidatebuffer, 1, 0, 4 * sizeof(int)*outputsz, candidate, 0, NULL, NULL)); - + //openCLSafeCall(clEnqueueReadBuffer(gsum.clCxt->impl->clCmdQueue, candidatebuffer, 1, 0, 4 * sizeof(int)*outputsz, candidate, 0, NULL, NULL)); + openCLReadBuffer( gsum.clCxt, candidatebuffer, candidate, 4 * sizeof(int)*outputsz ); for(int i = 0; i < outputsz; i++) if(candidate[4*i+2] != 0) @@ -1149,7 +1168,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS openCLSafeCall(clReleaseMemObject(scaleinfobuffer)); openCLSafeCall(clReleaseMemObject(nodebuffer)); openCLSafeCall(clReleaseMemObject(candidatebuffer)); - openCLSafeCall(clReleaseKernel(kernel)); + // openCLSafeCall(clReleaseKernel(kernel)); //t = (double)cvGetTickCount() - t; //printf( "release time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); } @@ -1212,19 +1231,19 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int outputsz = 256 * globalThreads[0] / localThreads[0]; int nodenum = (datasize - sizeof(GpuHidHaarClassifierCascade) - sizeof(GpuHidHaarStageClassifier) * gcascade->count - sizeof(GpuHidHaarClassifier) * totalclassifier) / sizeof(GpuHidHaarTreeNode); - nodebuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, - nodenum * sizeof(GpuHidHaarTreeNode), NULL, &status); - openCLVerifyCall(status); + nodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, + nodenum * sizeof(GpuHidHaarTreeNode)); + //openCLVerifyCall(status); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, nodebuffer, 1, 0, nodenum * sizeof(GpuHidHaarTreeNode), node, 0, NULL, NULL)); - cl_mem newnodebuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_WRITE, - loopcount * nodenum * sizeof(GpuHidHaarTreeNode), NULL, &status); + cl_mem newnodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_WRITE, + loopcount * nodenum * sizeof(GpuHidHaarTreeNode)); int startstage = 0; int endstage = gcascade->count; - cl_kernel kernel; - kernel = openCLGetKernelFromSource(gsum.clCxt, &haarobjectdetect_scaled2, "gpuRunHaarClassifierCascade_scaled2"); - cl_kernel kernel2 = openCLGetKernelFromSource(gimg.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier"); + //cl_kernel kernel; + //kernel = openCLGetKernelFromSource(gsum.clCxt, &haarobjectdetect_scaled2, "gpuRunHaarClassifierCascade_scaled2"); + //cl_kernel kernel2 = openCLGetKernelFromSource(gimg.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier"); for(int i = 0; i < loopcount; i++) { sz = sizev[i]; @@ -1251,34 +1270,48 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int startnodenum = nodenum * i; int argcounts = 0; float factor2 = (float)factor; + /* openCLSafeCall(clSetKernelArg(kernel2, argcounts++, sizeof(cl_mem), (void *)&nodebuffer)); openCLSafeCall(clSetKernelArg(kernel2, argcounts++, sizeof(cl_mem), (void *)&newnodebuffer)); openCLSafeCall(clSetKernelArg(kernel2, argcounts++, sizeof(cl_float), (void *)&factor2)); openCLSafeCall(clSetKernelArg(kernel2, argcounts++, sizeof(cl_float), (void *)&correction[i])); openCLSafeCall(clSetKernelArg(kernel2, argcounts++, sizeof(cl_int), (void *)&startnodenum)); - size_t globalThreads2[1] = {nodenum}; - clEnqueueNDRangeKernel(gsum.clCxt->impl->clCmdQueue, kernel2, 1, NULL, globalThreads2, 0, 0, NULL, NULL); - clFinish(gsum.clCxt->impl->clCmdQueue); + */ + + vector > args1; + args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&nodebuffer )); + args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&newnodebuffer )); + args1.push_back ( make_pair(sizeof(cl_float) , (void *)&factor2 )); + args1.push_back ( make_pair(sizeof(cl_float) , (void *)&correction[i] )); + args1.push_back ( make_pair(sizeof(cl_int) , (void *)&startnodenum )); + + size_t globalThreads2[3] = {nodenum,1,1}; + size_t localThreads2[3] = {256,1,1}; + + openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier", globalThreads2, NULL/*localThreads2*/, args1, -1, -1); + + //clEnqueueNDRangeKernel(gsum.clCxt->impl->clCmdQueue, kernel2, 1, NULL, globalThreads2, 0, 0, NULL, NULL); + //clFinish(gsum.clCxt->impl->clCmdQueue); } - clReleaseKernel(kernel2); + //clReleaseKernel(kernel2); int step = gsum.step / 4; int startnode = 0; int splitstage = 3; int splitnode = stage[0].count + stage[1].count + stage[2].count; - stagebuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, sizeof(GpuHidHaarStageClassifier) * gcascade->count, NULL, &status); - openCLVerifyCall(status); + stagebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(GpuHidHaarStageClassifier) * gcascade->count); + //openCLVerifyCall(status); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, stagebuffer, 1, 0, sizeof(GpuHidHaarStageClassifier)*gcascade->count, stage, 0, NULL, NULL)); - candidatebuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, 4 * sizeof(int) * outputsz, NULL, &status); - openCLVerifyCall(status); - scaleinfobuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount, NULL, &status); - openCLVerifyCall(status); + candidatebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, 4 * sizeof(int) * outputsz); + //openCLVerifyCall(status); + scaleinfobuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount); + //openCLVerifyCall(status); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, scaleinfobuffer, 1, 0, sizeof(detect_piramid_info)*loopcount, scaleinfo, 0, NULL, NULL)); - pbuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, sizeof(cl_int4) * loopcount, NULL, &status); + pbuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(cl_int4) * loopcount); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, pbuffer, 1, 0, sizeof(cl_int4)*loopcount, p, 0, NULL, NULL)); - correctionbuffer = clCreateBuffer(gsum.clCxt->impl->clContext, CL_MEM_READ_ONLY, sizeof(cl_float) * loopcount, NULL, &status); + correctionbuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(cl_float) * loopcount); openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, correctionbuffer, 1, 0, sizeof(cl_float)*loopcount, correction, 0, NULL, NULL)); - int argcount = 0; - openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&stagebuffer)); + //int argcount = 0; + /*openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&stagebuffer)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&scaleinfobuffer)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&newnodebuffer)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&gsum.data)); @@ -1293,10 +1326,30 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int), (void *)&splitnode)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&pbuffer)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&correctionbuffer)); - openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int), (void *)&nodenum)); - openCLSafeCall(clEnqueueNDRangeKernel(gsum.clCxt->impl->clCmdQueue, kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); + openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int), (void *)&nodenum));*/ - openCLSafeCall(clFinish(gsum.clCxt->impl->clCmdQueue)); + vector > args; + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&scaleinfobuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&newnodebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsqsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&candidatebuffer )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&step )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&loopcount )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&endstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startnode )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitnode )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&pbuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&correctionbuffer )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&nodenum )); + + + openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuRunHaarClassifierCascade_scaled2", globalThreads, localThreads, args, -1, -1); + //openCLSafeCall(clEnqueueNDRangeKernel(gsum.clCxt->impl->clCmdQueue, kernel, 2, NULL, globalThreads, localThreads, 0, NULL, NULL)); + //openCLSafeCall(clFinish(gsum.clCxt->impl->clCmdQueue)); //openCLSafeCall(clEnqueueReadBuffer(gsum.clCxt->clCmdQueue,candidatebuffer,1,0,4*sizeof(int)*outputsz,candidate,0,NULL,NULL)); candidate = (int *)clEnqueueMapBuffer(gsum.clCxt->impl->clCmdQueue, candidatebuffer, 1, CL_MAP_READ, 0, 4 * sizeof(int), 0, 0, 0, &status); diff --git a/modules/ocl/src/imgproc.cpp b/modules/ocl/src/imgproc.cpp index 98ab98e0c..5e6966b97 100644 --- a/modules/ocl/src/imgproc.cpp +++ b/modules/ocl/src/imgproc.cpp @@ -672,7 +672,7 @@ namespace cv break; } default: - CV_Error(-217, "Unsupported source type"); + CV_Error(CV_StsUnsupportedFormat, "Unsupported source type"); } } @@ -898,7 +898,7 @@ namespace cv CV_Assert(src.type() == CV_8UC1); if(src.clCxt->impl->double_support == 0 && src.depth() ==CV_64F) { - CV_Error(-217,"select device don't support double"); + CV_Error(CV_GpuNotSupported,"select device don't support double"); } int vlen = 4; int offset = src.offset / vlen; @@ -1080,7 +1080,7 @@ namespace cv { if(src.clCxt->impl->double_support == 0 && src.depth() ==CV_64F) { - CV_Error(-217,"select device don't support double"); + CV_Error(CV_GpuNotSupported,"select device don't support double"); } oclMat Dx, Dy; CV_Assert(borderType == cv::BORDER_REFLECT101 || borderType == cv::BORDER_REPLICATE || borderType == cv::BORDER_REFLECT); @@ -1093,7 +1093,7 @@ namespace cv { if(src.clCxt->impl->double_support == 0 && src.depth() ==CV_64F) { - CV_Error(-217,"select device don't support double"); + CV_Error(CV_GpuNotSupported,"select device don't support double"); } oclMat Dx, Dy; CV_Assert(borderType == cv::BORDER_REFLECT101 || borderType == cv::BORDER_REPLICATE || borderType == cv::BORDER_REFLECT); diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 096b9790d..6d2eaf372 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -257,7 +257,7 @@ namespace cv _devicetype = CL_DEVICE_TYPE_ALL; break; default: - CV_Error(-217,"Unkown device type"); + CV_Error(CV_GpuApiCallError,"Unkown device type"); } int devcienums = 0; // Platform info @@ -456,7 +456,7 @@ namespace cv char **binaries = (char **)malloc( sizeof(char *) * numDevices ); if(binaries == NULL) { - CV_Error(-217,"Failed to allocate host memory.(binaries)\r\n"); + CV_Error(CV_StsNoMem,"Failed to allocate host memory.(binaries)\r\n"); } for(i = 0; i < numDevices; i++) @@ -466,7 +466,7 @@ namespace cv binaries[i] = (char *)malloc( sizeof(char) * binarySizes[i]); if(binaries[i] == NULL) { - CV_Error(-217,"Failed to allocate host memory.(binaries[i])\r\n"); + CV_Error(CV_StsNoMem,"Failed to allocate host memory.(binaries[i])\r\n"); } } else @@ -498,7 +498,7 @@ namespace cv { char *temp; sprintf(temp, "Failed to load kernel file : %s\r\n", fileName); - CV_Error(-217, temp); + CV_Error(CV_GpuApiCallError, temp); } else { @@ -661,14 +661,16 @@ namespace cv cl_kernel kernel; kernel = openCLGetKernelFromSource(clCxt, source, kernelName, build_options); - - globalThreads[0] = divUp(globalThreads[0], localThreads[0]) * localThreads[0]; - globalThreads[1] = divUp(globalThreads[1], localThreads[1]) * localThreads[1]; - globalThreads[2] = divUp(globalThreads[2], localThreads[2]) * localThreads[2]; - - size_t blockSize = localThreads[0] * localThreads[1] * localThreads[2]; - cv::ocl::openCLVerifyKernel(clCxt, kernel, &blockSize, globalThreads, localThreads); - + + if ( localThreads != NULL) + { + globalThreads[0] = divUp(globalThreads[0], localThreads[0]) * localThreads[0]; + globalThreads[1] = divUp(globalThreads[1], localThreads[1]) * localThreads[1]; + globalThreads[2] = divUp(globalThreads[2], localThreads[2]) * localThreads[2]; + + size_t blockSize = localThreads[0] * localThreads[1] * localThreads[2]; + cv::ocl::openCLVerifyKernel(clCxt, kernel, &blockSize, globalThreads, localThreads); + } for(int i = 0; i < args.size(); i ++) openCLSafeCall(clSetKernelArg(kernel, i, args[i].first, args[i].second)); diff --git a/modules/ocl/src/kernels/convertC3C4.cl b/modules/ocl/src/kernels/convertC3C4.cl index 1b21fe68c..26db9457c 100644 --- a/modules/ocl/src/kernels/convertC3C4.cl +++ b/modules/ocl/src/kernels/convertC3C4.cl @@ -33,10 +33,13 @@ // // //#pragma OPENCL EXTENSION cl_amd_printf : enable +#define WORKGROUPSIZE 256 __kernel void convertC3C4(__global const GENTYPE4 * restrict src, __global GENTYPE4 *dst, int cols, int rows, int dstStep_in_piexl,int pixel_end) { int id = get_global_id(0); + + //read data from source //int pixel_end = mul24(cols -1 , rows -1); int3 pixelid = (int3)(mul24(id,3),mad24(id,3,1),mad24(id,3,2)); pixelid = clamp(pixelid,0,pixel_end); @@ -51,18 +54,35 @@ __kernel void convertC3C4(__global const GENTYPE4 * restrict src, __global GENTY outpix2 = (GENTYPE4)(pixel1.z,pixel1.w,pixel2.x,0); outpix3 = (GENTYPE4)(pixel2.y,pixel2.z,pixel2.w,0); - int4 outy = (id<<2)/cols; - int4 outx = (id<<2)%cols; - outx.y++; - outx.z+=2; - outx.w+=3; - outy = select(outy,outy+1,outx>=cols); - outx = select(outx,outx-cols,outx>=cols); - //outpix3 = select(outpix3, outpix0, (uchar4)(outy.w>=rows)); - //outpix2 = select(outpix2, outpix0, (uchar4)(outy.z>=rows)); - //outpix1 = select(outpix1, outpix0, (uchar4)(outy.y>=rows)); - //outx = select(outx,(int4)outx.x,outy>=rows); - //outy = select(outy,(int4)outy.x,outy>=rows); + //permutate the data in LDS to avoid global memory conflict + __local GENTYPE4 rearrange[WORKGROUPSIZE*4]; + int lid = get_local_id(0)<<2; + + rearrange[lid++] = outpix0; + rearrange[lid++] = outpix1; + rearrange[lid++] = outpix2; + rearrange[lid] = outpix3; + + lid = get_local_id(0); + barrier(CLK_LOCAL_MEM_FENCE); + outpix0 = rearrange[lid]; + lid+=WORKGROUPSIZE; + outpix1 = rearrange[lid]; + lid+=WORKGROUPSIZE; + outpix2 = rearrange[lid]; + lid+=WORKGROUPSIZE; + outpix3 = rearrange[lid]; + + //calculate output index + int4 outx, outy; + int4 startid = mad24((int)get_group_id(0),WORKGROUPSIZE*4,(int)get_local_id(0)); + startid.y+=WORKGROUPSIZE; + startid.z+=WORKGROUPSIZE*2; + startid.w+=WORKGROUPSIZE*3; + outx = startid%(int4)cols; + outy = startid/(int4)cols; + + int4 addr = mad24(outy,dstStep_in_piexl,outx); if(outx.w=(int4)cols); int4 addr = mad24(y4,(int4)srcStep_in_pixel,x4); GENTYPE4 pixel0,pixel1,pixel2,pixel3, outpixel1, outpixel2; + //read data from src pixel0 = src[addr.x]; pixel1 = src[addr.y]; pixel2 = src[addr.z]; @@ -116,23 +137,40 @@ __kernel void convertC4C3(__global const GENTYPE4 * restrict src, __global GENTY outpixel2.y = pixel3.x; outpixel2.z = pixel3.y; outpixel2.w = pixel3.z; - int4 outaddr = mul24(id>>2 , 3); - outaddr.y++; - outaddr.z+=2; - //printf("%d ",outaddr.z); - if(outaddr.z <= pixel_end) + + //permutate the data in LDS to avoid global memory conflict + __local GENTYPE4 rearrange[WORKGROUPSIZE*3]; + int lid = mul24((int)get_local_id(0),3); + rearrange[lid++] = pixel0; + rearrange[lid++] = outpixel1; + rearrange[lid] = outpixel2; + barrier(CLK_LOCAL_MEM_FENCE); + lid = get_local_id(0); + pixel0 = rearrange[lid]; + lid+=WORKGROUPSIZE; + outpixel1 = rearrange[lid]; + lid+=WORKGROUPSIZE; + outpixel2 = rearrange[lid]; + + //calcultate output index + int3 startid = mad24((int)get_group_id(0),WORKGROUPSIZE*3,(int)get_local_id(0)); + startid.y+=WORKGROUPSIZE; + startid.z+=WORKGROUPSIZE*2; + //id = mul24(id>>2 , 3); + + if(startid.z <= pixel_end) { - dst[outaddr.x] = pixel0; - dst[outaddr.y] = outpixel1; - dst[outaddr.z] = outpixel2; + dst[startid.x] = pixel0; + dst[startid.y] = outpixel1; + dst[startid.z] = outpixel2; } - else if(outaddr.y <= pixel_end) + else if(startid.y <= pixel_end) { - dst[outaddr.x] = pixel0; - dst[outaddr.y] = outpixel1; + dst[startid.x] = pixel0; + dst[startid.y] = outpixel1; } - else if(outaddr.x <= pixel_end) + else if(startid.x <= pixel_end) { - dst[outaddr.x] = pixel0; - } + dst[startid.x] = pixel0; + } } diff --git a/modules/ocl/src/kernels/imgproc_integral.cl b/modules/ocl/src/kernels/imgproc_integral.cl index 5c7186483..6e72aaa83 100644 --- a/modules/ocl/src/kernels/imgproc_integral.cl +++ b/modules/ocl/src/kernels/imgproc_integral.cl @@ -74,8 +74,8 @@ kernel void integral_cols(__global uchar4 *src,__global int *sum ,__global float src_t[0] = (i + lid < rows ? convert_int4(src[src_offset + (lid+i) * src_step + gid]) : 0); src_t[1] = (i + lid < rows ? convert_int4(src[src_offset + (lid+i) * src_step + gid + 1]) : 0); - sum_t[0] = (i == 0 ? 0 : lm_sum[0][LSIZE_2 + LOG_LSIZE]); - sqsum_t[0] = (i == 0 ? 0 : lm_sqsum[0][LSIZE_2 + LOG_LSIZE]); + sum_t[0] = (i == 0 ? 0 : lm_sum[0][LSIZE_2 + LOG_LSIZE]); + sqsum_t[0] = (i == 0 ? 0 : lm_sqsum[0][LSIZE_2 + LOG_LSIZE]); sum_t[1] = (i == 0 ? 0 : lm_sum[1][LSIZE_2 + LOG_LSIZE]); sqsum_t[1] = (i == 0 ? 0 : lm_sqsum[1][LSIZE_2 + LOG_LSIZE]); barrier(CLK_LOCAL_MEM_FENCE); @@ -102,6 +102,7 @@ kernel void integral_cols(__global uchar4 *src,__global int *sum ,__global float } offset <<= 1; } + barrier(CLK_LOCAL_MEM_FENCE); if(lid < 2) { lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; @@ -124,8 +125,9 @@ kernel void integral_cols(__global uchar4 *src,__global int *sum ,__global float lm_sqsum[lid >> 7][ai] = lm_sqsum[lid >> 7][bi] - lm_sqsum[lid >> 7][ai]; } } - if(lid > 0 & (i+lid) <= rows){ - int loc_s0 = gid * dst_step + i + lid - 1 - pre_invalid * dst_step / 4, loc_s1 = loc_s0 + dst_step ; + barrier(CLK_LOCAL_MEM_FENCE); + int loc_s0 = gid * dst_step + i + lid - 1 - pre_invalid * dst_step / 4, loc_s1 = loc_s0 + dst_step ; + if(lid > 0 && (i+lid) <= rows){ lm_sum[0][bf_loc] += sum_t[0]; lm_sum[1][bf_loc] += sum_t[1]; lm_sqsum[0][bf_loc] += sqsum_t[0]; @@ -200,6 +202,7 @@ kernel void integral_rows(__global int4 *srcsum,__global float4 * srcsqsum,__glo } offset <<= 1; } + barrier(CLK_LOCAL_MEM_FENCE); if(lid < 2) { lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; @@ -222,7 +225,7 @@ kernel void integral_rows(__global int4 *srcsum,__global float4 * srcsqsum,__glo lm_sqsum[lid >> 7][ai] = lm_sqsum[lid >> 7][bi] - lm_sqsum[lid >> 7][ai]; } } - + barrier(CLK_LOCAL_MEM_FENCE); if(gid == 0 && (i + lid) <= rows) { sum[sum_offset + i + lid] = 0; @@ -239,10 +242,9 @@ kernel void integral_rows(__global int4 *srcsum,__global float4 * srcsqsum,__glo sqsum[sqsum_offset + loc1 + k * sqsum_step / 4] = 0; } } - - if(lid > 0 & (i+lid) <= rows){ - int loc_s0 = sum_offset + gid * 2 * sum_step + sum_step / 4 + i + lid, loc_s1 = loc_s0 + sum_step ; - int loc_sq0 = sqsum_offset + gid * 2 * sqsum_step + sqsum_step / 4 + i + lid, loc_sq1 = loc_sq0 + sqsum_step ; + int loc_s0 = sum_offset + gid * 2 * sum_step + sum_step / 4 + i + lid, loc_s1 = loc_s0 + sum_step ; + int loc_sq0 = sqsum_offset + gid * 2 * sqsum_step + sqsum_step / 4 + i + lid, loc_sq1 = loc_sq0 + sqsum_step ; + if(lid > 0 && (i+lid) <= rows){ lm_sum[0][bf_loc] += sum_t[0]; lm_sum[1][bf_loc] += sum_t[1]; lm_sqsum[0][bf_loc] += sqsum_t[0]; diff --git a/modules/ocl/src/kernels/imgproc_integral_sum.cl b/modules/ocl/src/kernels/imgproc_integral_sum.cl index 0d90300ac..46c526386 100644 --- a/modules/ocl/src/kernels/imgproc_integral_sum.cl +++ b/modules/ocl/src/kernels/imgproc_integral_sum.cl @@ -94,6 +94,7 @@ kernel void integral_cols(__global uchar4 *src,__global int *sum , } offset <<= 1; } + barrier(CLK_LOCAL_MEM_FENCE); if(lid < 2) { lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; @@ -112,7 +113,8 @@ kernel void integral_cols(__global uchar4 *src,__global int *sum , lm_sum[lid >> 7][ai] = lm_sum[lid >> 7][bi] - lm_sum[lid >> 7][ai]; } } - if(lid > 0 & (i+lid) <= rows){ + barrier(CLK_LOCAL_MEM_FENCE); + if(lid > 0 && (i+lid) <= rows){ int loc_s0 = gid * dst_step + i + lid - 1 - pre_invalid * dst_step / 4, loc_s1 = loc_s0 + dst_step ; lm_sum[0][bf_loc] += sum_t[0]; lm_sum[1][bf_loc] += sum_t[1]; @@ -172,6 +174,7 @@ kernel void integral_rows(__global int4 *srcsum,__global int *sum , } offset <<= 1; } + barrier(CLK_LOCAL_MEM_FENCE); if(lid < 2) { lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; @@ -190,7 +193,7 @@ kernel void integral_rows(__global int4 *srcsum,__global int *sum , lm_sum[lid >> 7][ai] = lm_sum[lid >> 7][bi] - lm_sum[lid >> 7][ai]; } } - + barrier(CLK_LOCAL_MEM_FENCE); if(gid == 0 && (i + lid) <= rows) { sum[sum_offset + i + lid] = 0; @@ -205,16 +208,16 @@ kernel void integral_rows(__global int4 *srcsum,__global int *sum , } } - if(lid > 0 & (i+lid) <= rows){ + if(lid > 0 && (i+lid) <= rows){ int loc_s0 = sum_offset + gid * 2 * sum_step + sum_step / 4 + i + lid, loc_s1 = loc_s0 + sum_step ; - lm_sum[0][bf_loc] += sum_t[0]; - lm_sum[1][bf_loc] += sum_t[1]; + lm_sum[0][bf_loc] += sum_t[0]; + lm_sum[1][bf_loc] += sum_t[1]; sum_p = (__local int*)(&(lm_sum[0][bf_loc])); for(int k = 0; k < 4; k++) { if(gid * 8 + k >= cols) break; sum[loc_s0 + k * sum_step / 4] = sum_p[k]; - } + } sum_p = (__local int*)(&(lm_sum[1][bf_loc])); for(int k = 0; k < 4; k++) { diff --git a/modules/ocl/src/matrix_operations.cpp b/modules/ocl/src/matrix_operations.cpp index 53c2821d6..798d315b1 100644 --- a/modules/ocl/src/matrix_operations.cpp +++ b/modules/ocl/src/matrix_operations.cpp @@ -157,7 +157,7 @@ void convert_C3C4(const cl_mem &src, oclMat &dst, int srcStep) sprintf(compile_option, "-D GENTYPE4=double4"); break; default: - CV_Error(-217,"unknown depth"); + CV_Error(CV_StsUnsupportedFormat,"unknown depth"); } vector< pair > args; args.push_back( make_pair( sizeof(cl_mem), (void *)&src)); @@ -205,7 +205,7 @@ void convert_C4C3(const oclMat &src, cl_mem &dst, int dstStep) sprintf(compile_option, "-D GENTYPE4=double4"); break; default: - CV_Error(-217,"unknown depth"); + CV_Error(CV_StsUnsupportedFormat,"unknown depth"); } vector< pair > args; @@ -517,7 +517,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 1: @@ -536,7 +536,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 2: @@ -555,7 +555,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 3: @@ -574,7 +574,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 4: @@ -600,7 +600,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 5: @@ -619,7 +619,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 6: @@ -638,12 +638,28 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; default: - CV_Error(-217,"unknown depth"); + CV_Error(CV_StsUnsupportedFormat,"unknown depth"); } +#if CL_VERSION_1_2 + if(dst.offset==0 && dst.cols==dst.wholecols) + { + clEnqueueFillBuffer(dst.clCxt->impl->clCmdQueue,(cl_mem)dst.data,args[0].second,args[0].first,0,dst.step*dst.rows,0,NULL,NULL); + } + else + { + args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.cols )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.rows )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); + openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads, + localThreads, args, -1, -1,compile_option); + } +#else args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.cols )); args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.rows )); @@ -651,6 +667,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads, localThreads, args, -1, -1,compile_option); +#endif } void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &mask, string kernelName) @@ -696,7 +713,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat & args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 1: @@ -715,7 +732,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat & args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 2: @@ -734,7 +751,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat & args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 3: @@ -753,7 +770,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat & args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 4: @@ -772,7 +789,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat & args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 5: @@ -791,7 +808,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat & args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; case 6: @@ -810,11 +827,11 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat & args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval )); break; default: - CV_Error(-217,"unsupported channels"); + CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); } break; default: - CV_Error(-217,"unknown depth"); + CV_Error(CV_StsUnsupportedFormat,"unknown depth"); } args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.cols )); diff --git a/modules/ocl/src/split_merge.cpp b/modules/ocl/src/split_merge.cpp index bc19773aa..df416724e 100644 --- a/modules/ocl/src/split_merge.cpp +++ b/modules/ocl/src/split_merge.cpp @@ -160,7 +160,7 @@ namespace cv { if(mat_dst.clCxt -> impl -> double_support ==0 && mat_dst.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } @@ -299,7 +299,7 @@ namespace cv if(mat_src.clCxt -> impl -> double_support ==0 && mat_src.type() == CV_64F) { - CV_Error(-217,"Selected device don't support double\r\n"); + CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); return; } diff --git a/modules/ocl/test/main.cpp b/modules/ocl/test/main.cpp index 410a3012f..641663bca 100644 --- a/modules/ocl/test/main.cpp +++ b/modules/ocl/test/main.cpp @@ -74,13 +74,6 @@ void print_info() } -#if PERF_TEST_OCL -int main(int argc, char **argv) -{ - run_perf_test(); - return 0; -} -#else int main(int argc, char **argv) { TS::ptr()->init("ocl"); @@ -89,16 +82,16 @@ int main(int argc, char **argv) print_info(); std::vector oclinfo; - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - if(devnums<1){ + int devnums = getDevice(oclinfo); + if(devnums<1) + { std::cout << "no device found\n"; return -1; } return RUN_ALL_TESTS(); } -#endif // PERF_TEST_OCL -#else // HAVE_OPENC +#else // DON'T HAVE_OPENCL int main() { diff --git a/modules/ocl/test/test_arithm.cpp b/modules/ocl/test/test_arithm.cpp index a3f350814..91c195756 100644 --- a/modules/ocl/test/test_arithm.cpp +++ b/modules/ocl/test/test_arithm.cpp @@ -94,7 +94,7 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; cv::ocl::oclMat gdst1_whole; //bak @@ -115,6 +115,7 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) cv::Size size(MWIDTH, MHEIGHT); mat1 = randomMat(rng, size, type, 5, 16, false); + //mat2 = randomMat(rng, size, type, 5, 16, false); mat2 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); dst1 = randomMat(rng, size, type, 5, 16, false); @@ -124,10 +125,10 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() diff --git a/modules/ocl/test/test_blend.cpp b/modules/ocl/test/test_blend.cpp index a0391b1bb..579b75fdc 100644 --- a/modules/ocl/test/test_blend.cpp +++ b/modules/ocl/test/test_blend.cpp @@ -33,7 +33,7 @@ void blendLinearGold(const cv::Mat& img1, const cv::Mat& img2, const cv::Mat& we PARAM_TEST_CASE(Blend, cv::Size, MatType/*, UseRoi*/) { - std::vector oclinfo; + //std::vector oclinfo; cv::Size size; int type; bool useRoi; @@ -45,8 +45,8 @@ PARAM_TEST_CASE(Blend, cv::Size, MatType/*, UseRoi*/) type = GET_PARAM(1); /*useRoi = GET_PARAM(3);*/ - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); } }; diff --git a/modules/ocl/test/test_canny.cpp b/modules/ocl/test/test_canny.cpp index c6aae6346..5cb1d0058 100644 --- a/modules/ocl/test/test_canny.cpp +++ b/modules/ocl/test/test_canny.cpp @@ -64,13 +64,13 @@ PARAM_TEST_CASE(Canny, AppertureSize, L2gradient) bool useL2gradient; cv::Mat edges_gold; - std::vector oclinfo; + //std::vector oclinfo; virtual void SetUp() { apperture_size = GET_PARAM(0); useL2gradient = GET_PARAM(1); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); } }; diff --git a/modules/ocl/test/test_columnsum.cpp b/modules/ocl/test/test_columnsum.cpp index 94e109d20..c5cbee706 100644 --- a/modules/ocl/test/test_columnsum.cpp +++ b/modules/ocl/test/test_columnsum.cpp @@ -60,14 +60,14 @@ PARAM_TEST_CASE(ColumnSum, cv::Size, bool ) cv::Size size; cv::Mat src; bool useRoi; - std::vector oclinfo; + //std::vector oclinfo; virtual void SetUp() { size = GET_PARAM(0); useRoi = GET_PARAM(1); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); } }; diff --git a/modules/ocl/test/test_fft.cpp b/modules/ocl/test/test_fft.cpp index 4b51d4fec..d0e3acd66 100644 --- a/modules/ocl/test/test_fft.cpp +++ b/modules/ocl/test/test_fft.cpp @@ -52,11 +52,11 @@ PARAM_TEST_CASE(Dft, cv::Size, bool) { cv::Size dft_size; bool dft_rows; - std::vector oclinfo; + //std::vector oclinfo; virtual void SetUp() { - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); + //int devnums = getDevice(oclinfo); + // CV_Assert(devnums > 0); dft_size = GET_PARAM(0); dft_rows = GET_PARAM(1); } diff --git a/modules/ocl/test/test_filters.cpp b/modules/ocl/test/test_filters.cpp index 9c22faa8b..3774b10fa 100644 --- a/modules/ocl/test/test_filters.cpp +++ b/modules/ocl/test/test_filters.cpp @@ -85,7 +85,7 @@ PARAM_TEST_CASE(FilterTestBase, MatType, bool) cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; cv::ocl::oclMat gdst1_whole; //bak @@ -185,7 +185,7 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -204,10 +204,10 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -285,7 +285,7 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int) //src mat with roi cv::Mat mat_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -304,10 +304,10 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int) mat = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -388,7 +388,7 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, bool) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -409,10 +409,10 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, bool) // rng.fill(kernel, cv::RNG::UNIFORM, cv::Scalar::all(0), cv::Scalar::all(3)); kernel = randomMat(rng, Size(3, 3), CV_8UC1, 0, 3, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -529,7 +529,7 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -552,10 +552,10 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -633,7 +633,7 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -656,10 +656,10 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -740,7 +740,7 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -763,10 +763,10 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -841,18 +841,18 @@ INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), - Values(1, 2), Values(0, 1), Values(3, 5, 7), Values((MatType)cv::BORDER_CONSTANT, - (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101))); + Values(1, 2), Values(0, 1), Values(3, 5), Values((MatType)cv::BORDER_CONSTANT, + (MatType)cv::BORDER_REPLICATE))); INSTANTIATE_TEST_CASE_P(Filter, Scharr, Combine( Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(0, 1), Values(0, 1), - Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101))); + Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine( Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), - Values(cv::Size(3, 3), cv::Size(5, 5), cv::Size(7, 7)), - Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101))); + Values(cv::Size(3, 3), cv::Size(5, 5)), + Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); diff --git a/modules/ocl/test/test_gemm.cpp b/modules/ocl/test/test_gemm.cpp index a836149cb..167c00431 100644 --- a/modules/ocl/test/test_gemm.cpp +++ b/modules/ocl/test/test_gemm.cpp @@ -53,13 +53,13 @@ PARAM_TEST_CASE(Gemm, int, cv::Size, int) int type; cv::Size mat_size; int flags; - vector info; + //vector info; virtual void SetUp() { type = GET_PARAM(0); mat_size = GET_PARAM(1); flags = GET_PARAM(2); - cv::ocl::getDevice(info); + //cv::ocl::getDevice(info); } }; diff --git a/modules/ocl/test/test_haar.cpp b/modules/ocl/test/test_haar.cpp index ea9932648..5499fcd20 100644 --- a/modules/ocl/test/test_haar.cpp +++ b/modules/ocl/test/test_haar.cpp @@ -63,7 +63,7 @@ struct getRect PARAM_TEST_CASE(HaarTestBase, int, int) { - std::vector oclinfo; + //std::vector oclinfo; cv::ocl::OclCascadeClassifier cascade, nestedCascade; cv::CascadeClassifier cpucascade, cpunestedCascade; // Mat img; @@ -91,11 +91,11 @@ PARAM_TEST_CASE(HaarTestBase, int, int) return; } - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); - cv::ocl::setBinpath("E:\\"); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath("E:\\"); } }; diff --git a/modules/ocl/test/test_hog.cpp b/modules/ocl/test/test_hog.cpp index f49751576..4c2a42f99 100644 --- a/modules/ocl/test/test_hog.cpp +++ b/modules/ocl/test/test_hog.cpp @@ -53,12 +53,12 @@ PARAM_TEST_CASE(HOG,cv::Size,int) { cv::Size winSize; int type; - vector info; + //vector info; virtual void SetUp() { winSize = GET_PARAM(0); type = GET_PARAM(1); - cv::ocl::getDevice(info); + //cv::ocl::getDevice(info); } }; diff --git a/modules/ocl/test/test_imgproc.cpp b/modules/ocl/test/test_imgproc.cpp index ff2f44171..775217b60 100644 --- a/modules/ocl/test/test_imgproc.cpp +++ b/modules/ocl/test/test_imgproc.cpp @@ -328,7 +328,7 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType, MatType, MatType, MatType, MatType, bo cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - std::vector oclinfo; + //std::vector oclinfo; //ocl mat cv::ocl::oclMat clmat1; cv::ocl::oclMat clmat2; @@ -353,10 +353,10 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType, MatType, MatType, MatType, MatType, bo cv::RNG &rng = TS::ptr()->get_rng(); cv::Size size(MWIDTH, MHEIGHT); double min = 1, max = 20; - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); if(type1 != nulltype) { @@ -661,7 +661,7 @@ PARAM_TEST_CASE(WarpTestBase, MatType, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -681,10 +681,10 @@ PARAM_TEST_CASE(WarpTestBase, MatType, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -807,7 +807,7 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int) cv::Mat map1; cv::Mat map2; - std::vector oclinfo; + //std::vector oclinfo; int src_roicols; int src_roirows; @@ -853,8 +853,8 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int) bordertype = GET_PARAM(4); // borderValue = GET_PARAM(6); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); cv::RNG& rng = TS::ptr()->get_rng(); //cv::Size size = cv::Size(20, 20); @@ -1006,7 +1006,7 @@ PARAM_TEST_CASE(Resize, MatType, cv::Size, double, double, int) int dstx; int dsty; - std::vector oclinfo; + //std::vector oclinfo; //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; @@ -1045,10 +1045,10 @@ PARAM_TEST_CASE(Resize, MatType, cv::Size, double, double, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, dsize, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -1133,7 +1133,7 @@ PARAM_TEST_CASE(Threshold, MatType, ThreshOp) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -1152,10 +1152,10 @@ PARAM_TEST_CASE(Threshold, MatType, ThreshOp) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -1240,7 +1240,7 @@ PARAM_TEST_CASE(meanShiftTestBase, MatType, MatType, int, int, cv::TermCriteria) cv::ocl::oclMat gdst; cv::ocl::oclMat gdstCoor; - std::vector oclinfo; + //std::vector oclinfo; //ocl mat with roi cv::ocl::oclMat gsrc_roi; cv::ocl::oclMat gdst_roi; @@ -1263,10 +1263,10 @@ PARAM_TEST_CASE(meanShiftTestBase, MatType, MatType, int, int, cv::TermCriteria) dst = randomMat(rng, size, type, 5, 16, false); dstCoor = randomMat(rng, size, typeCoor, 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -1378,21 +1378,21 @@ INSTANTIATE_TEST_CASE_P(ImgprocTestBase, equalizeHist, Combine( // NULL_TYPE, // Values(false))); // Values(false) is the reserved parameter // -//INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine( -// Values(CV_8UC1,CV_32FC1), -// NULL_TYPE, -// ONE_TYPE(CV_32FC1), -// NULL_TYPE, -// NULL_TYPE, -// Values(false))); // Values(false) is the reserved parameter -// -//INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerHarris, Combine( -// Values(CV_8UC1,CV_32FC1), -// NULL_TYPE, -// ONE_TYPE(CV_32FC1), -// NULL_TYPE, -// NULL_TYPE, -// Values(false))); // Values(false) is the reserved parameter +INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine( + Values(CV_8UC1,CV_32FC1), + NULL_TYPE, + ONE_TYPE(CV_32FC1), + NULL_TYPE, + NULL_TYPE, + Values(false))); // Values(false) is the reserved parameter + +INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerHarris, Combine( + Values(CV_8UC1,CV_32FC1), + NULL_TYPE, + ONE_TYPE(CV_32FC1), + NULL_TYPE, + NULL_TYPE, + Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(ImgprocTestBase, integral, Combine( diff --git a/modules/ocl/test/test_match_template.cpp b/modules/ocl/test/test_match_template.cpp index 7d599a615..08ea02985 100644 --- a/modules/ocl/test/test_match_template.cpp +++ b/modules/ocl/test/test_match_template.cpp @@ -60,7 +60,7 @@ PARAM_TEST_CASE(MatchTemplate8U, cv::Size, TemplateSize, Channels, TemplateMetho cv::Size templ_size; int cn; int method; - std::vector oclinfo; + //std::vector oclinfo; virtual void SetUp() { @@ -68,8 +68,8 @@ PARAM_TEST_CASE(MatchTemplate8U, cv::Size, TemplateSize, Channels, TemplateMetho templ_size = GET_PARAM(1); cn = GET_PARAM(2); method = GET_PARAM(3); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); } }; @@ -112,7 +112,7 @@ PARAM_TEST_CASE(MatchTemplate32F, cv::Size, TemplateSize, Channels, TemplateMeth cv::Size templ_size; int cn; int method; - std::vector oclinfo; + //std::vector oclinfo; virtual void SetUp() { @@ -120,8 +120,8 @@ PARAM_TEST_CASE(MatchTemplate32F, cv::Size, TemplateSize, Channels, TemplateMeth templ_size = GET_PARAM(1); cn = GET_PARAM(2); method = GET_PARAM(3); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); } }; diff --git a/modules/ocl/test/test_matrix_operation.cpp b/modules/ocl/test/test_matrix_operation.cpp index d538748fb..edf3e564b 100644 --- a/modules/ocl/test/test_matrix_operation.cpp +++ b/modules/ocl/test/test_matrix_operation.cpp @@ -72,7 +72,7 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType) //src mat with roi cv::Mat mat_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -91,10 +91,10 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType) mat = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); //std::vector oclinfo; - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -175,7 +175,7 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool) cv::Mat mat_roi; cv::Mat mask_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -197,10 +197,10 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool) cv::threshold(mask, mask, 0.5, 255., CV_8UC1); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -301,7 +301,7 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool) //src mat with roi cv::Mat mat_roi; cv::Mat mask_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gmat_whole; @@ -322,10 +322,10 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool) cv::threshold(mask, mask, 0.5, 255., CV_8UC1); val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -417,7 +417,7 @@ PARAM_TEST_CASE(convertC3C4, MatType, cv::Size) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -433,10 +433,10 @@ PARAM_TEST_CASE(convertC3C4, MatType, cv::Size) //dst = randomMat(rng, size, type, 5, 16, false); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[1]); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[1]); } void random_roi() diff --git a/modules/ocl/test/test_pyrdown.cpp b/modules/ocl/test/test_pyrdown.cpp index f2270b4a8..b19db39f9 100644 --- a/modules/ocl/test/test_pyrdown.cpp +++ b/modules/ocl/test/test_pyrdown.cpp @@ -89,7 +89,7 @@ PARAM_TEST_CASE(PyrDown, MatType, bool) cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; cv::ocl::oclMat gdst1_whole; //bak @@ -119,10 +119,10 @@ PARAM_TEST_CASE(PyrDown, MatType, bool) val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - int devnums = getDevice(oclinfo); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void Cleanup() diff --git a/modules/ocl/test/test_pyrup.cpp b/modules/ocl/test/test_pyrup.cpp index c6c5b9c10..6bc043e36 100644 --- a/modules/ocl/test/test_pyrup.cpp +++ b/modules/ocl/test/test_pyrup.cpp @@ -53,12 +53,12 @@ PARAM_TEST_CASE(PyrUp,cv::Size,int) { cv::Size size; int type; - std::vector oclinfo; + //std::vector oclinfo; virtual void SetUp() { - int devnums = cv::ocl::getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); + //int devnums = cv::ocl::getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); size = GET_PARAM(0); type = GET_PARAM(1); } diff --git a/modules/ocl/test/test_split_merge.cpp b/modules/ocl/test/test_split_merge.cpp index e13d524e3..ee880c528 100644 --- a/modules/ocl/test/test_split_merge.cpp +++ b/modules/ocl/test/test_split_merge.cpp @@ -87,7 +87,7 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int) //dst mat with roi cv::Mat dst_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -112,10 +112,10 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int) mat4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); dst = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() @@ -240,7 +240,7 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int) cv::Mat dst2_roi; cv::Mat dst3_roi; cv::Mat dst4_roi; - std::vector oclinfo; + //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst1_whole; cv::ocl::oclMat gdst2_whole; @@ -268,10 +268,10 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int) dst3 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); dst4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); - int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); + //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); + //CV_Assert(devnums > 0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); } void random_roi() From b2acf50c817c8fad3f535e1b70672b0a029fef60 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Thu, 30 Aug 2012 13:04:34 +0400 Subject: [PATCH 041/103] Fix build warning introduced in commit:424bc609b6f352a2b10f2a01ffcd037483e3591f --- modules/contrib/src/retinacolor.cpp | 920 ++++++++++++++-------------- 1 file changed, 460 insertions(+), 460 deletions(-) diff --git a/modules/contrib/src/retinacolor.cpp b/modules/contrib/src/retinacolor.cpp index b45295699..247234ffe 100644 --- a/modules/contrib/src/retinacolor.cpp +++ b/modules/contrib/src/retinacolor.cpp @@ -1,55 +1,55 @@ /*#****************************************************************************** ** IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -** +** ** By downloading, copying, installing or using the software you agree to this license. ** If you do not agree to this license, do not download, install, ** copy or use the software. -** -** +** +** ** HVStools : interfaces allowing OpenCV users to integrate Human Vision System models. Presented models originate from Jeanny Herault's original research and have been reused and adapted by the author&collaborators for computed vision applications since his thesis with Alice Caplier at Gipsa-Lab. ** Use: extract still images & image sequences features, from contours details to motion spatio-temporal features, etc. for high level visual scene analysis. Also contribute to image enhancement/compression such as tone mapping. -** +** ** Maintainers : Listic lab (code author current affiliation & applications) and Gipsa Lab (original research origins & applications) -** +** ** Creation - enhancement process 2007-2011 ** Author: Alexandre Benoit (benoit.alexandre.vision@gmail.com), LISTIC lab, Annecy le vieux, France -** +** ** Theses algorithm have been developped by Alexandre BENOIT since his thesis with Alice Caplier at Gipsa-Lab (www.gipsa-lab.inpg.fr) and the research he pursues at LISTIC Lab (www.listic.univ-savoie.fr). ** Refer to the following research paper for more information: ** Benoit A., Caplier A., Durette B., Herault, J., "USING HUMAN VISUAL SYSTEM MODELING FOR BIO-INSPIRED LOW LEVEL IMAGE PROCESSING", Elsevier, Computer Vision and Image Understanding 114 (2010), pp. 758-773, DOI: http://dx.doi.org/10.1016/j.cviu.2010.01.011 ** This work have been carried out thanks to Jeanny Herault who's research and great discussions are the basis of all this work, please take a look at his book: ** Vision: Images, Signals and Neural Networks: Models of Neural Processing in Visual Perception (Progress in Neural Processing),By: Jeanny Herault, ISBN: 9814273686. WAPI (Tower ID): 113266891. -** +** ** The retina filter includes the research contributions of phd/research collegues from which code has been redrawn by the author : ** _take a look at the retinacolor.hpp module to discover Brice Chaix de Lavarene color mosaicing/demosaicing and the reference paper: ** ====> B. Chaix de Lavarene, D. Alleysson, B. Durette, J. Herault (2007). "Efficient demosaicing through recursive filtering", IEEE International Conference on Image Processing ICIP 2007 ** _take a look at imagelogpolprojection.hpp to discover retina spatial log sampling which originates from Barthelemy Durette phd with Jeanny Herault. A Retina / V1 cortex projection is also proposed and originates from Jeanny's discussions. ** ====> more informations in the above cited Jeanny Heraults's book. -** +** ** License Agreement ** For Open Source Computer Vision Library -** +** ** Copyright (C) 2000-2008, Intel Corporation, all rights reserved. ** Copyright (C) 2008-2011, Willow Garage Inc., all rights reserved. -** +** ** For Human Visual System tools (hvstools) ** Copyright (C) 2007-2011, LISTIC Lab, Annecy le Vieux and GIPSA Lab, Grenoble, France, all rights reserved. -** +** ** Third party copyrights are property of their respective owners. -** +** ** 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. -** +** ** * The name of the copyright holders may not 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. @@ -91,28 +91,28 @@ RetinaColor::RetinaColor(const unsigned int NBrows, const unsigned int NBcolumns _colorLocalDensity(NBrows*NBcolumns*3), _imageGradient(NBrows*NBcolumns*2) { - // link to parent buffers (let's recycle !) - _luminance=&_filterOutput; - _multiplexedFrame=&_localBuffer; + // link to parent buffers (let's recycle !) + _luminance=&_filterOutput; + _multiplexedFrame=&_localBuffer; - _objectInit=false; - _samplingMethod=samplingMethod; - _saturateColors=false; - _colorSaturationValue=4.0; + _objectInit=false; + _samplingMethod=samplingMethod; + _saturateColors=false; + _colorSaturationValue=4.0; - // set default spatio-temporal filter parameters - setLPfilterParameters(0.0, 0.0, 1.5); - setLPfilterParameters(0.0, 0.0, 10.5, 1);// for the low pass filter dedicated to contours energy extraction (demultiplexing process) - setLPfilterParameters(0.f, 0.f, 0.9f, 2); + // set default spatio-temporal filter parameters + setLPfilterParameters(0.0, 0.0, 1.5); + setLPfilterParameters(0.0, 0.0, 10.5, 1);// for the low pass filter dedicated to contours energy extraction (demultiplexing process) + setLPfilterParameters(0.f, 0.f, 0.9f, 2); - // init default value on image Gradient - _imageGradient=0.57f; + // init default value on image Gradient + _imageGradient=0.57f; - // init color sampling map - _initColorSampling(); + // init color sampling map + _initColorSampling(); - // flush all buffers - clearAllBuffers(); + // flush all buffers + clearAllBuffers(); } RetinaColor::~RetinaColor() @@ -125,13 +125,13 @@ RetinaColor::~RetinaColor() */ void RetinaColor::clearAllBuffers() { - BasicRetinaFilter::clearAllBuffers(); - _tempMultiplexedFrame=0.f; - _demultiplexedTempBuffer=0.f; + BasicRetinaFilter::clearAllBuffers(); + _tempMultiplexedFrame=0.f; + _demultiplexedTempBuffer=0.f; - _demultiplexedColorFrame=0.f; - _chrominance=0.f; - _imageGradient=0.57f; + _demultiplexedColorFrame=0.f; + _chrominance=0.f; + _imageGradient=0.57f; } /** @@ -141,421 +141,421 @@ void RetinaColor::clearAllBuffers() */ void RetinaColor::resize(const unsigned int NBrows, const unsigned int NBcolumns) { - BasicRetinaFilter::clearAllBuffers(); - _colorSampling.resize(NBrows*NBcolumns); - _RGBmosaic.resize(NBrows*NBcolumns*3); - _tempMultiplexedFrame.resize(NBrows*NBcolumns); - _demultiplexedTempBuffer.resize(NBrows*NBcolumns*3); - _demultiplexedColorFrame.resize(NBrows*NBcolumns*3); - _chrominance.resize(NBrows*NBcolumns*3); - _colorLocalDensity.resize(NBrows*NBcolumns*3); - _imageGradient.resize(NBrows*NBcolumns*2); + BasicRetinaFilter::clearAllBuffers(); + _colorSampling.resize(NBrows*NBcolumns); + _RGBmosaic.resize(NBrows*NBcolumns*3); + _tempMultiplexedFrame.resize(NBrows*NBcolumns); + _demultiplexedTempBuffer.resize(NBrows*NBcolumns*3); + _demultiplexedColorFrame.resize(NBrows*NBcolumns*3); + _chrominance.resize(NBrows*NBcolumns*3); + _colorLocalDensity.resize(NBrows*NBcolumns*3); + _imageGradient.resize(NBrows*NBcolumns*2); - // link to parent buffers (let's recycle !) - _luminance=&_filterOutput; - _multiplexedFrame=&_localBuffer; + // link to parent buffers (let's recycle !) + _luminance=&_filterOutput; + _multiplexedFrame=&_localBuffer; - // init color sampling map - _initColorSampling(); + // init color sampling map + _initColorSampling(); - // clean buffers - clearAllBuffers(); + // clean buffers + clearAllBuffers(); } void RetinaColor::_initColorSampling() { - // filling the conversion table for multiplexed <=> demultiplexed frame - srand((unsigned)time(NULL)); + // filling the conversion table for multiplexed <=> demultiplexed frame + srand((unsigned)time(NULL)); - // preInit cones probabilities - _pR=_pB=_pG=0; - switch (_samplingMethod) - { - case RETINA_COLOR_RANDOM: - for (unsigned int index=0 ; indexgetNBpixels(); ++index) - { + // preInit cones probabilities + _pR=_pB=_pG=0; + switch (_samplingMethod) + { + case RETINA_COLOR_RANDOM: + for (unsigned int index=0 ; indexgetNBpixels(); ++index) + { - // random RGB sampling - unsigned int colorIndex=rand()%24; + // random RGB sampling + unsigned int colorIndex=rand()%24; - if (colorIndex<8){ - colorIndex=0; + if (colorIndex<8){ + colorIndex=0; - ++_pR; - }else - { - if (colorIndex<21){ - colorIndex=1; - ++_pG; - }else{ - colorIndex=2; - ++_pB; - } - } - _colorSampling[index] = colorIndex*this->getNBpixels()+index; - } - _pR/=(float)this->getNBpixels(); - _pG/=(float)this->getNBpixels(); - _pB/=(float)this->getNBpixels(); - std::cout<<"Color channels proportions: pR, pG, pB= "<<_pR<<", "<<_pG<<", "<<_pB<<", "<getNBpixels(); ++index) - { - _colorSampling[index] = index+((index%3+(index%_filterOutput.getNBcolumns()))%3)*_filterOutput.getNBpixels(); - } - _pR=_pB=_pG=1.f/3; - break; - case RETINA_COLOR_BAYER: // default sets bayer sampling - for (unsigned int index=0 ; index<_filterOutput.getNBpixels(); ++index) - { - //First line: R G R G - _colorSampling[index] = index+((index/_filterOutput.getNBcolumns())%2)*_filterOutput.getNBpixels()+((index%_filterOutput.getNBcolumns())%2)*_filterOutput.getNBpixels(); - //First line: G R G R - //_colorSampling[index] = 3*index+((index/_filterOutput.getNBcolumns())%2)+((index%_filterOutput.getNBcolumns()+1)%2); - } - _pR=_pB=0.25; - _pG=0.5; - break; - default: + ++_pR; + }else + { + if (colorIndex<21){ + colorIndex=1; + ++_pG; + }else{ + colorIndex=2; + ++_pB; + } + } + _colorSampling[index] = colorIndex*this->getNBpixels()+index; + } + _pR/=(float)this->getNBpixels(); + _pG/=(float)this->getNBpixels(); + _pB/=(float)this->getNBpixels(); + std::cout<<"Color channels proportions: pR, pG, pB= "<<_pR<<", "<<_pG<<", "<<_pB<<", "<getNBpixels(); ++index) + { + _colorSampling[index] = index+((index%3+(index%_filterOutput.getNBcolumns()))%3)*_filterOutput.getNBpixels(); + } + _pR=_pB=_pG=1.f/3; + break; + case RETINA_COLOR_BAYER: // default sets bayer sampling + for (unsigned int index=0 ; index<_filterOutput.getNBpixels(); ++index) + { + //First line: R G R G + _colorSampling[index] = index+((index/_filterOutput.getNBcolumns())%2)*_filterOutput.getNBpixels()+((index%_filterOutput.getNBcolumns())%2)*_filterOutput.getNBpixels(); + //First line: G R G R + //_colorSampling[index] = 3*index+((index/_filterOutput.getNBcolumns())%2)+((index%_filterOutput.getNBcolumns()+1)%2); + } + _pR=_pB=0.25; + _pG=0.5; + break; + default: #ifdef RETINACOLORDEBUG - std::cerr<<"RetinaColor::No or wrong color sampling method, skeeping"< &multiplexedColorFrame, const bool adaptiveFiltering, const float maxInputValue) { - // demultiplex the grey frame to RGB frame - // -> first set demultiplexed frame to 0 - _demultiplexedTempBuffer=0; - // -> demultiplex process - register unsigned int *colorSamplingPRT=&_colorSampling[0]; - register const float *multiplexedColorFramePTR=get_data(multiplexedColorFrame); - for (unsigned int indexa=0; indexa<_filterOutput.getNBpixels() ; ++indexa) - _demultiplexedTempBuffer[*(colorSamplingPRT++)]=*(multiplexedColorFramePTR++); + // demultiplex the grey frame to RGB frame + // -> first set demultiplexed frame to 0 + _demultiplexedTempBuffer=0; + // -> demultiplex process + register unsigned int *colorSamplingPRT=&_colorSampling[0]; + register const float *multiplexedColorFramePtr=get_data(multiplexedColorFrame); + for (unsigned int indexa=0; indexa<_filterOutput.getNBpixels() ; ++indexa) + _demultiplexedTempBuffer[*(colorSamplingPRT++)]=*(multiplexedColorFramePtr++); - // interpolate the demultiplexed frame depending on the color sampling method - if (!adaptiveFiltering) - _interpolateImageDemultiplexedImage(&_demultiplexedTempBuffer[0]); + // interpolate the demultiplexed frame depending on the color sampling method + if (!adaptiveFiltering) + _interpolateImageDemultiplexedImage(&_demultiplexedTempBuffer[0]); - // low pass filtering the demultiplexed frame - _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0], &_chrominance[0]); - _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels(), &_chrominance[0]+_filterOutput.getNBpixels()); - _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels(), &_chrominance[0]+_filterOutput.getDoubleNBpixels()); + // low pass filtering the demultiplexed frame + _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0], &_chrominance[0]); + _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels(), &_chrominance[0]+_filterOutput.getNBpixels()); + _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels(), &_chrominance[0]+_filterOutput.getDoubleNBpixels()); - /*if (_samplingMethod=BAYER) - { - _applyRIFfilter(_chrominance, _chrominance); - _applyRIFfilter(_chrominance+_filterOutput.getNBpixels(), _chrominance+_filterOutput.getNBpixels()); - _applyRIFfilter(_chrominance+_filterOutput.getDoubleNBpixels(), _chrominance+_filterOutput.getDoubleNBpixels()); - }*/ + /*if (_samplingMethod=BAYER) + { + _applyRIFfilter(_chrominance, _chrominance); + _applyRIFfilter(_chrominance+_filterOutput.getNBpixels(), _chrominance+_filterOutput.getNBpixels()); + _applyRIFfilter(_chrominance+_filterOutput.getDoubleNBpixels(), _chrominance+_filterOutput.getDoubleNBpixels()); + }*/ - // normalize by the photoreceptors local density and retrieve the local luminance - register float *chrominancePTR= &_chrominance[0]; - register float *colorLocalDensityPTR= &_colorLocalDensity[0]; - register float *luminance= &(*_luminance)[0]; - if (!adaptiveFiltering)// compute the gradient on the luminance - { - if (_samplingMethod==RETINA_COLOR_RANDOM) - for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance) - { - // normalize by photoreceptors density - float Cr=*(chrominancePTR)*_colorLocalDensity[indexc]; - float Cg=*(chrominancePTR+_filterOutput.getNBpixels())*_colorLocalDensity[indexc+_filterOutput.getNBpixels()]; - float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels())*_colorLocalDensity[indexc+_filterOutput.getDoubleNBpixels()]; - *luminance=(Cr+Cg+Cb)*_pG; - *(chrominancePTR)=Cr-*luminance; - *(chrominancePTR+_filterOutput.getNBpixels())=Cg-*luminance; - *(chrominancePTR+_filterOutput.getDoubleNBpixels())=Cb-*luminance; - } - else - for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance) - { - float Cr=*(chrominancePTR); - float Cg=*(chrominancePTR+_filterOutput.getNBpixels()); - float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels()); - *luminance=_pR*Cr+_pG*Cg+_pB*Cb; - *(chrominancePTR)=Cr-*luminance; - *(chrominancePTR+_filterOutput.getNBpixels())=Cg-*luminance; - *(chrominancePTR+_filterOutput.getDoubleNBpixels())=Cb-*luminance; - } + // normalize by the photoreceptors local density and retrieve the local luminance + register float *chrominancePTR= &_chrominance[0]; + register float *colorLocalDensityPTR= &_colorLocalDensity[0]; + register float *luminance= &(*_luminance)[0]; + if (!adaptiveFiltering)// compute the gradient on the luminance + { + if (_samplingMethod==RETINA_COLOR_RANDOM) + for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance) + { + // normalize by photoreceptors density + float Cr=*(chrominancePTR)*_colorLocalDensity[indexc]; + float Cg=*(chrominancePTR+_filterOutput.getNBpixels())*_colorLocalDensity[indexc+_filterOutput.getNBpixels()]; + float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels())*_colorLocalDensity[indexc+_filterOutput.getDoubleNBpixels()]; + *luminance=(Cr+Cg+Cb)*_pG; + *(chrominancePTR)=Cr-*luminance; + *(chrominancePTR+_filterOutput.getNBpixels())=Cg-*luminance; + *(chrominancePTR+_filterOutput.getDoubleNBpixels())=Cb-*luminance; + } + else + for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance) + { + float Cr=*(chrominancePTR); + float Cg=*(chrominancePTR+_filterOutput.getNBpixels()); + float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels()); + *luminance=_pR*Cr+_pG*Cg+_pB*Cb; + *(chrominancePTR)=Cr-*luminance; + *(chrominancePTR+_filterOutput.getNBpixels())=Cg-*luminance; + *(chrominancePTR+_filterOutput.getDoubleNBpixels())=Cb-*luminance; + } - // in order to get the color image, each colored map needs to be added the luminance - // -> to do so, compute: multiplexedColorFrame - remultiplexed chrominances - runColorMultiplexing(_chrominance, _tempMultiplexedFrame); - //lum = 1/3((f*(ImR))/(f*mR) + (f*(ImG))/(f*mG) + (f*(ImB))/(f*mB)); - float *luminancePTR= &(*_luminance)[0]; - chrominancePTR= &_chrominance[0]; - float *demultiplexedColorFramePTR= &_demultiplexedColorFrame[0]; - for (unsigned int indexp=0; indexp<_filterOutput.getNBpixels() ; ++indexp, ++luminancePTR, ++chrominancePTR, ++demultiplexedColorFramePTR) - { - *luminancePTR=(multiplexedColorFrame[indexp]-_tempMultiplexedFrame[indexp]); - *(demultiplexedColorFramePTR)=*(chrominancePTR)+*luminancePTR; - *(demultiplexedColorFramePTR+_filterOutput.getNBpixels())=*(chrominancePTR+_filterOutput.getNBpixels())+*luminancePTR; - *(demultiplexedColorFramePTR+_filterOutput.getDoubleNBpixels())=*(chrominancePTR+_filterOutput.getDoubleNBpixels())+*luminancePTR; - } + // in order to get the color image, each colored map needs to be added the luminance + // -> to do so, compute: multiplexedColorFrame - remultiplexed chrominances + runColorMultiplexing(_chrominance, _tempMultiplexedFrame); + //lum = 1/3((f*(ImR))/(f*mR) + (f*(ImG))/(f*mG) + (f*(ImB))/(f*mB)); + float *luminancePTR= &(*_luminance)[0]; + chrominancePTR= &_chrominance[0]; + float *demultiplexedColorFramePTR= &_demultiplexedColorFrame[0]; + for (unsigned int indexp=0; indexp<_filterOutput.getNBpixels() ; ++indexp, ++luminancePTR, ++chrominancePTR, ++demultiplexedColorFramePTR) + { + *luminancePTR=(multiplexedColorFrame[indexp]-_tempMultiplexedFrame[indexp]); + *(demultiplexedColorFramePTR)=*(chrominancePTR)+*luminancePTR; + *(demultiplexedColorFramePTR+_filterOutput.getNBpixels())=*(chrominancePTR+_filterOutput.getNBpixels())+*luminancePTR; + *(demultiplexedColorFramePTR+_filterOutput.getDoubleNBpixels())=*(chrominancePTR+_filterOutput.getDoubleNBpixels())+*luminancePTR; + } - }else - { - register const float *multiplexedColorFramePTR= get_data(multiplexedColorFrame); - for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance, ++multiplexedColorFramePTR) - { - // normalize by photoreceptors density - float Cr=*(chrominancePTR)*_colorLocalDensity[indexc]; - float Cg=*(chrominancePTR+_filterOutput.getNBpixels())*_colorLocalDensity[indexc+_filterOutput.getNBpixels()]; - float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels())*_colorLocalDensity[indexc+_filterOutput.getDoubleNBpixels()]; - *luminance=(Cr+Cg+Cb)*_pG; - _demultiplexedTempBuffer[_colorSampling[indexc]] = *multiplexedColorFramePTR - *luminance; + }else + { + register const float *multiplexedColorFramePTR= get_data(multiplexedColorFrame); + for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance, ++multiplexedColorFramePTR) + { + // normalize by photoreceptors density + float Cr=*(chrominancePTR)*_colorLocalDensity[indexc]; + float Cg=*(chrominancePTR+_filterOutput.getNBpixels())*_colorLocalDensity[indexc+_filterOutput.getNBpixels()]; + float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels())*_colorLocalDensity[indexc+_filterOutput.getDoubleNBpixels()]; + *luminance=(Cr+Cg+Cb)*_pG; + _demultiplexedTempBuffer[_colorSampling[indexc]] = *multiplexedColorFramePTR - *luminance; - } + } - // compute the gradient of the luminance - _computeGradient(&(*_luminance)[0]); + // compute the gradient of the luminance + _computeGradient(&(*_luminance)[0]); - // adaptively filter the submosaics to get the adaptive densities, here the buffer _chrominance is used as a temp buffer - _adaptiveSpatialLPfilter(&_RGBmosaic[0], &_chrominance[0]); - _adaptiveSpatialLPfilter(&_RGBmosaic[0]+_filterOutput.getNBpixels(), &_chrominance[0]+_filterOutput.getNBpixels()); - _adaptiveSpatialLPfilter(&_RGBmosaic[0]+_filterOutput.getDoubleNBpixels(), &_chrominance[0]+_filterOutput.getDoubleNBpixels()); + // adaptively filter the submosaics to get the adaptive densities, here the buffer _chrominance is used as a temp buffer + _adaptiveSpatialLPfilter(&_RGBmosaic[0], &_chrominance[0]); + _adaptiveSpatialLPfilter(&_RGBmosaic[0]+_filterOutput.getNBpixels(), &_chrominance[0]+_filterOutput.getNBpixels()); + _adaptiveSpatialLPfilter(&_RGBmosaic[0]+_filterOutput.getDoubleNBpixels(), &_chrominance[0]+_filterOutput.getDoubleNBpixels()); - _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0], &_demultiplexedColorFrame[0]); - _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels()); - _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getDoubleNBpixels()); + _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0], &_demultiplexedColorFrame[0]); + _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels()); + _adaptiveSpatialLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getDoubleNBpixels()); -/* for (unsigned int index=0; index<_filterOutput.getNBpixels()*3 ; ++index) // cette boucle pourrait �tre supprimee en passant la densit� � la fonction de filtrage - _demultiplexedColorFrame[index] /= _chrominance[index];*/ - _demultiplexedColorFrame/=_chrominance; // more optimal ;o) +/* for (unsigned int index=0; index<_filterOutput.getNBpixels()*3 ; ++index) // cette boucle pourrait �tre supprimee en passant la densit� � la fonction de filtrage + _demultiplexedColorFrame[index] /= _chrominance[index];*/ + _demultiplexedColorFrame/=_chrominance; // more optimal ;o) - // compute and substract the residual luminance - for (unsigned int index=0; index<_filterOutput.getNBpixels() ; ++index) - { - float residu = _pR*_demultiplexedColorFrame[index] + _pG*_demultiplexedColorFrame[index+_filterOutput.getNBpixels()] + _pB*_demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()]; - _demultiplexedColorFrame[index] = _demultiplexedColorFrame[index] - residu; - _demultiplexedColorFrame[index+_filterOutput.getNBpixels()] = _demultiplexedColorFrame[index+_filterOutput.getNBpixels()] - residu; - _demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()] = _demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()] - residu; - } + // compute and substract the residual luminance + for (unsigned int index=0; index<_filterOutput.getNBpixels() ; ++index) + { + float residu = _pR*_demultiplexedColorFrame[index] + _pG*_demultiplexedColorFrame[index+_filterOutput.getNBpixels()] + _pB*_demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()]; + _demultiplexedColorFrame[index] = _demultiplexedColorFrame[index] - residu; + _demultiplexedColorFrame[index+_filterOutput.getNBpixels()] = _demultiplexedColorFrame[index+_filterOutput.getNBpixels()] - residu; + _demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()] = _demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()] - residu; + } - // multiplex the obtained chrominance - runColorMultiplexing(_demultiplexedColorFrame, _tempMultiplexedFrame); - _demultiplexedTempBuffer=0; + // multiplex the obtained chrominance + runColorMultiplexing(_demultiplexedColorFrame, _tempMultiplexedFrame); + _demultiplexedTempBuffer=0; - // get the luminance, et and add it to each chrominance - for (unsigned int index=0; index<_filterOutput.getNBpixels() ; ++index) - { - (*_luminance)[index]=multiplexedColorFrame[index]-_tempMultiplexedFrame[index]; - _demultiplexedTempBuffer[_colorSampling[index]] = _demultiplexedColorFrame[_colorSampling[index]];//multiplexedColorFrame[index] - (*_luminance)[index]; - } + // get the luminance, et and add it to each chrominance + for (unsigned int index=0; index<_filterOutput.getNBpixels() ; ++index) + { + (*_luminance)[index]=multiplexedColorFrame[index]-_tempMultiplexedFrame[index]; + _demultiplexedTempBuffer[_colorSampling[index]] = _demultiplexedColorFrame[_colorSampling[index]];//multiplexedColorFrame[index] - (*_luminance)[index]; + } - _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0], &_demultiplexedTempBuffer[0]); - _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels(), &_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels()); - _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels(), &_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels()); + _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0], &_demultiplexedTempBuffer[0]); + _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels(), &_demultiplexedTempBuffer[0]+_filterOutput.getNBpixels()); + _spatiotemporalLPfilter(&_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels(), &_demultiplexedTempBuffer[0]+_filterOutput.getDoubleNBpixels()); - // get the luminance and add it to each chrominance - for (unsigned int index=0; index<_filterOutput.getNBpixels() ; ++index) - { - _demultiplexedColorFrame[index] = _demultiplexedTempBuffer[index]*_colorLocalDensity[index]+ (*_luminance)[index]; - _demultiplexedColorFrame[index+_filterOutput.getNBpixels()] = _demultiplexedTempBuffer[index+_filterOutput.getNBpixels()]*_colorLocalDensity[index+_filterOutput.getNBpixels()]+ (*_luminance)[index]; - _demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()] = _demultiplexedTempBuffer[index+_filterOutput.getDoubleNBpixels()]*_colorLocalDensity[index+_filterOutput.getDoubleNBpixels()]+ (*_luminance)[index]; - } - } + // get the luminance and add it to each chrominance + for (unsigned int index=0; index<_filterOutput.getNBpixels() ; ++index) + { + _demultiplexedColorFrame[index] = _demultiplexedTempBuffer[index]*_colorLocalDensity[index]+ (*_luminance)[index]; + _demultiplexedColorFrame[index+_filterOutput.getNBpixels()] = _demultiplexedTempBuffer[index+_filterOutput.getNBpixels()]*_colorLocalDensity[index+_filterOutput.getNBpixels()]+ (*_luminance)[index]; + _demultiplexedColorFrame[index+_filterOutput.getDoubleNBpixels()] = _demultiplexedTempBuffer[index+_filterOutput.getDoubleNBpixels()]*_colorLocalDensity[index+_filterOutput.getDoubleNBpixels()]+ (*_luminance)[index]; + } + } - // eliminate saturated colors by simple clipping values to the input range - clipRGBOutput_0_maxInputValue(NULL, maxInputValue); + // eliminate saturated colors by simple clipping values to the input range + clipRGBOutput_0_maxInputValue(NULL, maxInputValue); - /* transfert image gradient in order to check validity + /* transfert image gradient in order to check validity memcpy((*_luminance), _imageGradient, sizeof(float)*_filterOutput.getNBpixels()); memcpy(_demultiplexedColorFrame, _imageGradient+_filterOutput.getNBpixels(), sizeof(float)*_filterOutput.getNBpixels()); memcpy(_demultiplexedColorFrame+_filterOutput.getNBpixels(), _imageGradient+_filterOutput.getNBpixels(), sizeof(float)*_filterOutput.getNBpixels()); memcpy(_demultiplexedColorFrame+2*_filterOutput.getNBpixels(), _imageGradient+_filterOutput.getNBpixels(), sizeof(float)*_filterOutput.getNBpixels()); - */ + */ - if (_saturateColors) - { - TemplateBuffer::normalizeGrayOutputCentredSigmoide(128, _colorSaturationValue, maxInputValue, &_demultiplexedColorFrame[0], &_demultiplexedColorFrame[0], _filterOutput.getNBpixels()); - TemplateBuffer::normalizeGrayOutputCentredSigmoide(128, _colorSaturationValue, maxInputValue, &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels(), _filterOutput.getNBpixels()); - TemplateBuffer::normalizeGrayOutputCentredSigmoide(128, _colorSaturationValue, maxInputValue, &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels()*2, &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels()*2, _filterOutput.getNBpixels()); - } + if (_saturateColors) + { + TemplateBuffer::normalizeGrayOutputCentredSigmoide(128, _colorSaturationValue, maxInputValue, &_demultiplexedColorFrame[0], &_demultiplexedColorFrame[0], _filterOutput.getNBpixels()); + TemplateBuffer::normalizeGrayOutputCentredSigmoide(128, _colorSaturationValue, maxInputValue, &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels(), &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels(), _filterOutput.getNBpixels()); + TemplateBuffer::normalizeGrayOutputCentredSigmoide(128, _colorSaturationValue, maxInputValue, &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels()*2, &_demultiplexedColorFrame[0]+_filterOutput.getNBpixels()*2, _filterOutput.getNBpixels()); + } } // color multiplexing: input frame size=_NBrows*_filterOutput.getNBcolumns()*3, multiplexedFrame output size=_NBrows*_filterOutput.getNBcolumns() void RetinaColor::runColorMultiplexing(const std::valarray &demultiplexedInputFrame, std::valarray &multiplexedFrame) { - // multiply each color layer by its bayer mask - register unsigned int *colorSamplingPTR= &_colorSampling[0]; - register float *multiplexedFramePTR= &multiplexedFrame[0]; - for (unsigned int indexp=0; indexp<_filterOutput.getNBpixels(); ++indexp) - *(multiplexedFramePTR++)=demultiplexedInputFrame[*(colorSamplingPTR++)]; + // multiply each color layer by its bayer mask + register unsigned int *colorSamplingPTR= &_colorSampling[0]; + register float *multiplexedFramePTR= &multiplexedFrame[0]; + for (unsigned int indexp=0; indexp<_filterOutput.getNBpixels(); ++indexp) + *(multiplexedFramePTR++)=demultiplexedInputFrame[*(colorSamplingPTR++)]; } void RetinaColor::normalizeRGBOutput_0_maxOutputValue(const float maxOutputValue) { - //normalizeGrayOutputCentredSigmoide(0.0, 2, _chrominance); - TemplateBuffer::normalizeGrayOutput_0_maxOutputValue(&_demultiplexedColorFrame[0], 3*_filterOutput.getNBpixels(), maxOutputValue); - //normalizeGrayOutputCentredSigmoide(0.0, 2, _chrominance+_filterOutput.getNBpixels()); - //normalizeGrayOutput_0_maxOutputValue(_demultiplexedColorFrame+_filterOutput.getNBpixels(), _filterOutput.getNBpixels(), maxOutputValue); - //normalizeGrayOutputCentredSigmoide(0.0, 2, _chrominance+2*_filterOutput.getNBpixels()); - //normalizeGrayOutput_0_maxOutputValue(_demultiplexedColorFrame+_filterOutput.getDoubleNBpixels(), _filterOutput.getNBpixels(), maxOutputValue); - TemplateBuffer::normalizeGrayOutput_0_maxOutputValue(&(*_luminance)[0], _filterOutput.getNBpixels(), maxOutputValue); + //normalizeGrayOutputCentredSigmoide(0.0, 2, _chrominance); + TemplateBuffer::normalizeGrayOutput_0_maxOutputValue(&_demultiplexedColorFrame[0], 3*_filterOutput.getNBpixels(), maxOutputValue); + //normalizeGrayOutputCentredSigmoide(0.0, 2, _chrominance+_filterOutput.getNBpixels()); + //normalizeGrayOutput_0_maxOutputValue(_demultiplexedColorFrame+_filterOutput.getNBpixels(), _filterOutput.getNBpixels(), maxOutputValue); + //normalizeGrayOutputCentredSigmoide(0.0, 2, _chrominance+2*_filterOutput.getNBpixels()); + //normalizeGrayOutput_0_maxOutputValue(_demultiplexedColorFrame+_filterOutput.getDoubleNBpixels(), _filterOutput.getNBpixels(), maxOutputValue); + TemplateBuffer::normalizeGrayOutput_0_maxOutputValue(&(*_luminance)[0], _filterOutput.getNBpixels(), maxOutputValue); } /// normalize output between 0 and maxOutputValue; void RetinaColor::clipRGBOutput_0_maxInputValue(float *inputOutputBuffer, const float maxInputValue) { - //std::cout<<"RetinaColor::normalizing RGB frame..."<(0,_filterOutput.getNBpixels()*3), Parallel_clipBufferValues(inputOutputBuffer, 0, maxInputValue), tbb::auto_partitioner()); #else - register float *inputOutputBufferPTR=inputOutputBuffer; - for (register unsigned int jf = 0; jf < _filterOutput.getNBpixels()*3; ++jf, ++inputOutputBufferPTR) - { - if (*inputOutputBufferPTR>maxInputValue) - *inputOutputBufferPTR=maxInputValue; - else if (*inputOutputBufferPTR<0) - *inputOutputBufferPTR=0; - } + register float *inputOutputBufferPTR=inputOutputBuffer; + for (register unsigned int jf = 0; jf < _filterOutput.getNBpixels()*3; ++jf, ++inputOutputBufferPTR) + { + if (*inputOutputBufferPTR>maxInputValue) + *inputOutputBufferPTR=maxInputValue; + else if (*inputOutputBufferPTR<0) + *inputOutputBufferPTR=0; + } #endif - //std::cout<<"RetinaColor::...normalizing RGB frame OK"<maxValue) - maxValue=outputFrame[index]; - } - } - normalisationFactor=1.f/maxValue; - // normalisation [0, 1] + float maxValue=0.f; + float normalisationFactor=1.f/3.f; + for (unsigned int indexr=1 ; indexr<_filterOutput.getNBrows()-1; ++indexr) + { + for (unsigned int indexc=1 ; indexc<_filterOutput.getNBcolumns()-1; ++indexc) + { + unsigned int index=indexc+indexr*_filterOutput.getNBcolumns(); + outputFrame[index]=normalisationFactor*fabs(8.f*inputFrame[index]-inputFrame[index-1]-inputFrame[index+1]-inputFrame[index-_filterOutput.getNBcolumns()]-inputFrame[index+_filterOutput.getNBcolumns()]-inputFrame[index-1-_filterOutput.getNBcolumns()]-inputFrame[index-1+_filterOutput.getNBcolumns()]-inputFrame[index+1-_filterOutput.getNBcolumns()]-inputFrame[index+1+_filterOutput.getNBcolumns()]); + if (outputFrame[index]>maxValue) + maxValue=outputFrame[index]; + } + } + normalisationFactor=1.f/maxValue; + // normalisation [0, 1] for (unsigned int indexp=1 ; indexp<_filterOutput.getNBrows()-1; ++indexp) - outputFrame[indexp]=outputFrame[indexp]*normalisationFactor; + outputFrame[indexp]=outputFrame[indexp]*normalisationFactor; } ////////////////////////////////////////////////////////// @@ -565,16 +565,16 @@ void RetinaColor::_getNormalizedContoursImage(const float *inputFrame, float *ou void RetinaColor::_adaptiveSpatialLPfilter(const float *inputFrame, float *outputFrame) { - /**********/ - _gain = (1-0.57f)*(1-0.57f)*(1-0.06f)*(1-0.06f); + /**********/ + _gain = (1-0.57f)*(1-0.57f)*(1-0.06f)*(1-0.06f); - // launch the serie of 1D directional filters in order to compute the 2D low pass filter - // -> horizontal filters work with the first layer of imageGradient - _adaptiveHorizontalCausalFilter_addInput(inputFrame, outputFrame, 0, _filterOutput.getNBrows()); - _horizontalAnticausalFilter_Irregular(outputFrame, 0, _filterOutput.getNBrows(), &_imageGradient[0]); - // -> horizontal filters work with the second layer of imageGradient - _verticalCausalFilter_Irregular(outputFrame, 0, _filterOutput.getNBcolumns(), &_imageGradient[0]+_filterOutput.getNBpixels()); - _adaptiveVerticalAnticausalFilter_multGain(outputFrame, 0, _filterOutput.getNBcolumns()); + // launch the serie of 1D directional filters in order to compute the 2D low pass filter + // -> horizontal filters work with the first layer of imageGradient + _adaptiveHorizontalCausalFilter_addInput(inputFrame, outputFrame, 0, _filterOutput.getNBrows()); + _horizontalAnticausalFilter_Irregular(outputFrame, 0, _filterOutput.getNBrows(), &_imageGradient[0]); + // -> horizontal filters work with the second layer of imageGradient + _verticalCausalFilter_Irregular(outputFrame, 0, _filterOutput.getNBcolumns(), &_imageGradient[0]+_filterOutput.getNBpixels()); + _adaptiveVerticalAnticausalFilter_multGain(outputFrame, 0, _filterOutput.getNBcolumns()); } // horizontal causal filter which adds the input inside... replaces the parent _horizontalCausalFilter_Irregular_addInput by avoiding a product for each pixel @@ -583,21 +583,21 @@ void RetinaColor::_adaptiveHorizontalCausalFilter_addInput(const float *inputFra #ifdef HAVE_TBB tbb::parallel_for(tbb::blocked_range(IDrowStart,IDrowEnd), Parallel_adaptiveHorizontalCausalFilter_addInput(inputFrame, outputFrame, &_imageGradient[0], _filterOutput.getNBcolumns()), tbb::auto_partitioner()); #else - register float* outputPTR=outputFrame+IDrowStart*_filterOutput.getNBcolumns(); - register const float* inputPTR=inputFrame+IDrowStart*_filterOutput.getNBcolumns(); - register const float *imageGradientPTR= &_imageGradient[0]+IDrowStart*_filterOutput.getNBcolumns(); - for (unsigned int IDrow=IDrowStart; IDrow(IDcolumnStart,IDcolumnEnd), Parallel_adaptiveVerticalAnticausalFilter_multGain(outputFrame, &_imageGradient[0]+_filterOutput.getNBpixels(), _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _gain), tbb::auto_partitioner()); #else - float* outputOffset=outputFrame+_filterOutput.getNBpixels()-_filterOutput.getNBcolumns(); - float* gradOffset= &_imageGradient[0]+_filterOutput.getNBpixels()*2-_filterOutput.getNBcolumns(); + float* outputOffset=outputFrame+_filterOutput.getNBpixels()-_filterOutput.getNBcolumns(); + float* gradOffset= &_imageGradient[0]+_filterOutput.getNBpixels()*2-_filterOutput.getNBcolumns(); - for (unsigned int IDcolumn=IDcolumnStart; IDcolumn &result) { - bool processSuccess=true; - // basic preliminary error check - if (result.size()!=_demultiplexedColorFrame.size()) - { - std::cerr<<"RetinaColor::applyKrauskopfLMS2Acr1cr2Transform: input buffer does not match retina buffer size, conversion aborted"< &result) { - bool processSuccess=true; - // basic preliminary error check - if (result.size()!=_demultiplexedColorFrame.size()) - { - std::cerr<<"RetinaColor::applyKrauskopfLMS2Acr1cr2Transform: input buffer does not match retina buffer size, conversion aborted"< &inputFrameBuffer, std::valarray &outputFrameBuffer, const float *transformTable) { - // two step methods in order to allow inputFrame and outputFrame to be the same - unsigned int nbPixels=(unsigned int)(inputFrameBuffer.size()/3), dbpixels=(unsigned int)(2*inputFrameBuffer.size()/3); + // two step methods in order to allow inputFrame and outputFrame to be the same + unsigned int nbPixels=(unsigned int)(inputFrameBuffer.size()/3), dbpixels=(unsigned int)(2*inputFrameBuffer.size()/3); - const float *inputFrame=get_data(inputFrameBuffer); - float *outputFrame= &outputFrameBuffer[0]; + const float *inputFrame=get_data(inputFrameBuffer); + float *outputFrame= &outputFrameBuffer[0]; - for (unsigned int dataIndex=0; dataIndex Date: Thu, 30 Aug 2012 15:49:53 +0400 Subject: [PATCH 042/103] added ios tutorials by Charu Hans and Eduard Feicho --- doc/tutorials/definitions/tocDefinitions.rst | 2 +- doc/tutorials/images/opencv_ios.png | Bin 0 -> 12691 bytes .../introduction/ios_install/ios_install.rst | 21 +- .../images/ios4_logo.jpg | Bin 6970 -> 0 bytes .../images/opencv_ios.png | Bin 0 -> 12691 bytes .../table_of_content_introduction.rst | 14 +- doc/tutorials/ios/hello/hello.rst | 76 ++++++ .../image_manipulation/image_manipulation.rst | 130 ++++++++++ .../images/facedetect.jpg | Bin 0 -> 17902 bytes .../images/image_effects.png | Bin 0 -> 29966 bytes .../ios/table_of_content_ios/images/intro.png | Bin 0 -> 2584 bytes .../table_of_content_ios.rst | 75 ++++++ ...code_hello_ios_framework_drag_and_drop.png | Bin 0 -> 86585 bytes ..._hello_ios_frameworks_add_dependencies.png | Bin 0 -> 187514 bytes .../xcode_hello_ios_viewcontroller_layout.png | Bin 0 -> 24355 bytes .../ios/video_processing/video_processing.rst | 237 ++++++++++++++++++ doc/tutorials/tutorials.rst | 18 +- 17 files changed, 556 insertions(+), 17 deletions(-) create mode 100644 doc/tutorials/images/opencv_ios.png delete mode 100644 doc/tutorials/introduction/table_of_content_introduction/images/ios4_logo.jpg create mode 100644 doc/tutorials/introduction/table_of_content_introduction/images/opencv_ios.png create mode 100644 doc/tutorials/ios/hello/hello.rst create mode 100644 doc/tutorials/ios/image_manipulation/image_manipulation.rst create mode 100644 doc/tutorials/ios/table_of_content_ios/images/facedetect.jpg create mode 100755 doc/tutorials/ios/table_of_content_ios/images/image_effects.png create mode 100644 doc/tutorials/ios/table_of_content_ios/images/intro.png create mode 100644 doc/tutorials/ios/table_of_content_ios/table_of_content_ios.rst create mode 100644 doc/tutorials/ios/video_processing/images/xcode_hello_ios_framework_drag_and_drop.png create mode 100644 doc/tutorials/ios/video_processing/images/xcode_hello_ios_frameworks_add_dependencies.png create mode 100644 doc/tutorials/ios/video_processing/images/xcode_hello_ios_viewcontroller_layout.png create mode 100644 doc/tutorials/ios/video_processing/video_processing.rst diff --git a/doc/tutorials/definitions/tocDefinitions.rst b/doc/tutorials/definitions/tocDefinitions.rst index 6efdc25e8..80a745498 100644 --- a/doc/tutorials/definitions/tocDefinitions.rst +++ b/doc/tutorials/definitions/tocDefinitions.rst @@ -6,5 +6,5 @@ .. |Author_VictorE| unicode:: Victor U+0020 Eruhimov .. |Author_ArtemM| unicode:: Artem U+0020 Myagkov .. |Author_FernandoI| unicode:: Fernando U+0020 Iglesias U+0020 Garc U+00ED a - +.. |Author_EduardF| unicode:: Eduard U+0020 Feicho diff --git a/doc/tutorials/images/opencv_ios.png b/doc/tutorials/images/opencv_ios.png new file mode 100644 index 0000000000000000000000000000000000000000..7937ec17c11bdc33d1fea1dc8327891f9e317044 GIT binary patch literal 12691 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/ios_install/ios_install.rst b/doc/tutorials/introduction/ios_install/ios_install.rst index 331efd270..607418a2a 100644 --- a/doc/tutorials/introduction/ios_install/ios_install.rst +++ b/doc/tutorials/introduction/ios_install/ios_install.rst @@ -7,19 +7,19 @@ Required packages ================== * CMake 2.8.8 or higher - * Xcode 4.3 or higher + * Xcode 4.2 or higher -Getting the cutting-edge OpenCV from SourceForge SVN repository ------------------------------------------------------------------ +Getting the cutting-edge OpenCV from GIT repository +--------------------------------------------------- -Launch SVN client and checkout the current OpenCV snapshot from here: http://code.opencv.org/svn/opencv/trunk/opencv +Launch GIT client and clone OpenCV repository from here: http://github.com/itseez/opencv In MacOS it can be done using the following command in Terminal: .. code-block:: bash cd ~/ - svn co http://code.opencv.org/svn/opencv/trunk/opencv + git clone https://github.com/Itseez/opencv.git Building OpenCV from source using CMake, using the command line @@ -35,8 +35,13 @@ Building OpenCV from source using CMake, using the command line #. Build OpenCV framework .. code-block:: bash - + cd ~/ python opencv/ios/build_framework.py ios - -If everything's fine, after a few minutes you will get ~//ios/opencv2.framework. You can add this framework to your Xcode projects. + +If everything's fine, a few minutes later you will get ~//ios/opencv2.framework. You can add this framework to your Xcode projects. + + +Further Reading +===================== +You can find several OpenCV+iOS tutorials here :ref:`Table-Of-Content-iOS` diff --git a/doc/tutorials/introduction/table_of_content_introduction/images/ios4_logo.jpg b/doc/tutorials/introduction/table_of_content_introduction/images/ios4_logo.jpg deleted file mode 100644 index 28a257ffdaf985b849d290cda0b59289299bc949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6970 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 Q_@|bj{6DqCzgLU@1w@JnF8}}l diff --git a/doc/tutorials/introduction/table_of_content_introduction/images/opencv_ios.png b/doc/tutorials/introduction/table_of_content_introduction/images/opencv_ios.png new file mode 100644 index 0000000000000000000000000000000000000000..7937ec17c11bdc33d1fea1dc8327891f9e317044 GIT binary patch literal 12691 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/table_of_content_introduction/table_of_content_introduction.rst b/doc/tutorials/introduction/table_of_content_introduction/table_of_content_introduction.rst index c93647ed4..3f9081271 100644 --- a/doc/tutorials/introduction/table_of_content_introduction/table_of_content_introduction.rst +++ b/doc/tutorials/introduction/table_of_content_introduction/table_of_content_introduction.rst @@ -155,18 +155,18 @@ Here you can read tutorials about how to set up your computer to work with the O .. tabularcolumns:: m{100pt} m{300pt} .. cssclass:: toctableopencv - =========== ====================================================== - |Install_2| **Title:** :ref:`iOS-Installation` + ============= ====================================================== + |Install_iOS| **Title:** :ref:`iOS-Installation` - *Compatibility:* > OpenCV 2.3.1 + *Compatibility:* > OpenCV 2.4.2 - *Author:* |Author_ArtemM| + *Author:* |Author_ArtemM|, |Author_EduardF| - We will learn how to setup OpenCV for using it in iOS! + We will learn how to setup OpenCV for using it in iOS! - =========== ====================================================== + ============= ====================================================== - .. |Install_2| image:: images/ios4_logo.jpg + .. |Install_iOS| image:: images/opencv_ios.png :width: 90pt .. tabularcolumns:: m{100pt} m{300pt} diff --git a/doc/tutorials/ios/hello/hello.rst b/doc/tutorials/ios/hello/hello.rst new file mode 100644 index 000000000..8e6ddb88a --- /dev/null +++ b/doc/tutorials/ios/hello/hello.rst @@ -0,0 +1,76 @@ +.. _OpenCViOSHelloWorld: + +OpenCV iOS Hello +******************************* + +Goal +==== + +In this tutorial we will learn how to: + +.. container:: enumeratevisibleitemswithsquare + + * Link OpenCV framework with Xcode + * How to write simple Hello World application using OpenCV and Xcode. + +*Linking OpenCV iOS* +====================== +Follow this step by step guide to link OpenCV to iOS. + +1. Create a new XCode project. + +2. Now we need to link *opencv2.framework* with Xcode. Select the project Navigator in the left hand panel and click on project name. + +3. Under the TARGETS click on Build Phases. Expand Link Binary With Libraries option. + +4. Click on Add others and go to directory where *opencv2.framework* is located and click open + +5. Now you can start writing your application. + +.. image:: images/linking_opencv_ios.png + :alt: OpenCV iOS in Xcode + :align: center + +*Hello OpenCV iOS Application* +=============================== + +Now we will learn how to write a simple Hello World Application in Xcode using OpenCV. + +.. container:: enumeratevisibleitemswithsquare + + * Link your project with OpenCV as shown in previous section. + * Open the file named *NameOfProject-Prefix.pch* ( replace NameOfProject with name of your project) and add the following lines of code. + +.. code-block:: cpp + + #ifdef __cplusplus + #import + #endif + +.. image:: images/header_directive.png + :alt: header + :align: center + +.. container:: enumeratevisibleitemswithsquare + + * Add the following lines of code to viewDidLoad method in ViewController.m. +.. code-block:: cpp + + UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Welcome to OpenCV" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil]; + [alert show]; + +.. image:: images/view_did_load.png + :alt: view did load + :align: center + +.. container:: enumeratevisibleitemswithsquare + + * You are good to run the project. + +*Output* +========= + +.. image:: images/output.png + :alt: output + :align: center + diff --git a/doc/tutorials/ios/image_manipulation/image_manipulation.rst b/doc/tutorials/ios/image_manipulation/image_manipulation.rst new file mode 100644 index 000000000..e8d4aad5b --- /dev/null +++ b/doc/tutorials/ios/image_manipulation/image_manipulation.rst @@ -0,0 +1,130 @@ +.. _OpenCViOSImageManipulation: + +OpenCV iOS - Image Processing +******************************* + +Goal +==== + +In this tutorial we will learn how to do basic image processing using OpenCV in iOS. + + +*Introduction* +============== + +In *OpenCV* all the image processing operations are done on *Mat*. iOS uses UIImage object to display image. One of the thing is to convert UIImage object to Mat object. Below is the code to convert UIImage to Mat. + +.. code-block:: cpp + + - (cv::Mat)cvMatFromUIImage:(UIImage *)image + { + CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); + CGFloat cols = image.size.width; + CGFloat rows = image.size.height; + + cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels + + CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data + cols, // Width of bitmap + rows, // Height of bitmap + 8, // Bits per component + cvMat.step[0], // Bytes per row + colorSpace, // Colorspace + kCGImageAlphaNoneSkipLast | + kCGBitmapByteOrderDefault); // Bitmap info flags + + CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); + CGContextRelease(contextRef); + CGColorSpaceRelease(colorSpace); + + return cvMat; + } + +.. code-block:: cpp + + - (cv::Mat)cvMatGrayFromUIImage:(UIImage *)image + { + CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); + CGFloat cols = image.size.width; + CGFloat rows = image.size.height; + + cv::Mat cvMat(rows, cols, CV_8UC1); // 8 bits per component, 1 channels + + CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data + cols, // Width of bitmap + rows, // Height of bitmap + 8, // Bits per component + cvMat.step[0], // Bytes per row + colorSpace, // Colorspace + kCGImageAlphaNoneSkipLast | + kCGBitmapByteOrderDefault); // Bitmap info flags + + CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); + CGContextRelease(contextRef); + CGColorSpaceRelease(colorSpace); + + return cvMat; + } + +Once we obtain the Mat Object. We can do all our processing on Mat object, similar to cpp. For example if we want to convert image to gray, we can do it via below code. + +.. code-block:: cpp + + cv::Mat greyMat; + cv::cvtColor(inputMat, greyMat, CV_BGR2GRAY); + +After the processing we need to convert it back to UIImage. + +.. code-block:: cpp + + -(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat + { + NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()]; + CGColorSpaceRef colorSpace; + + if (cvMat.elemSize() == 1) { + colorSpace = CGColorSpaceCreateDeviceGray(); + } else { + colorSpace = CGColorSpaceCreateDeviceRGB(); + } + + CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); + + // Creating CGImage from cv::Mat + CGImageRef imageRef = CGImageCreate(cvMat.cols, //width + cvMat.rows, //height + 8, //bits per component + 8 * cvMat.elemSize(), //bits per pixel + cvMat.step[0], //bytesPerRow + colorSpace, //colorspace + kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info + provider, //CGDataProviderRef + NULL, //decode + false, //should interpolate + kCGRenderingIntentDefault //intent + ); + + + // Getting UIImage from CGImage + UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; + CGImageRelease(imageRef); + CGDataProviderRelease(provider); + CGColorSpaceRelease(colorSpace); + + return finalImage; + } + +*Output* +================================== + +.. image:: images/output.jpg + :alt: header + :align: center + +Check out an instance of running code with more Image Effects on `YouTube `_ . + +.. raw:: html + +

+ +
\ No newline at end of file diff --git a/doc/tutorials/ios/table_of_content_ios/images/facedetect.jpg b/doc/tutorials/ios/table_of_content_ios/images/facedetect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..788b7d8262b75bc416edc75495663d592fa1d4e2 GIT binary patch literal 17902 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

x5ax<_qW0y#dAIh~p33!OG=L*8bsD9JfGY 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 Syng=>03dFf8`QyFV*UrqR@d7A literal 0 HcmV?d00001 diff --git a/doc/tutorials/ios/table_of_content_ios/table_of_content_ios.rst b/doc/tutorials/ios/table_of_content_ios/table_of_content_ios.rst new file mode 100644 index 000000000..5ecda41c2 --- /dev/null +++ b/doc/tutorials/ios/table_of_content_ios/table_of_content_ios.rst @@ -0,0 +1,75 @@ +.. _Table-Of-Content-iOS: + +**OpenCV iOS** +----------------------------------------------------------- + +.. include:: ../../definitions/tocDefinitions.rst + ++ + .. tabularcolumns:: m{100pt} m{300pt} + .. cssclass:: toctableopencv + + ============ =============================================================================== + |iOSOpenCV| **Title:** :ref:`OpenCViOSHelloWorld` + + *Compatibility:* > OpenCV 2.4.3 + + *Author:* Charu Hans + + You will learn how to link OpenCV with iOS and write a basic application. + + ============ =============================================================================== + + .. |iOSOpenCV| image:: images/intro.png + :height: 120pt + :width: 90pt + ++ + .. tabularcolumns:: m{100pt} m{300pt} + .. cssclass:: toctableopencv + + ================ ============================================================================ + |iOSOpenCVImg| **Title:** :ref:`OpenCViOSImageManipulation` + + *Compatibility:* > OpenCV 2.4.3 + + *Author:* Charu Hans + + You will learn how to do simple image manipulation using OpenCV in iOS. + + ================ ============================================================================ + + .. |iOSOpenCVImg| image:: images/image_effects.png + :height: 90pt + :width: 90pt + ++ + .. tabularcolumns:: m{100pt} m{300pt} + .. cssclass:: toctableopencv + + ================= ============================================================================ + |iOSOpenCVVideo| **Title:** :ref:`OpenCViOSVideoProcessing` + + *Compatibility:* > OpenCV 2.4.3 + + *Author:* Eduard Feicho + + You will learn how to capture and process video from camera using OpenCV in iOS. + + ================= ============================================================================ + + .. |iOSOpenCVVideo| image:: images/facedetect.jpg + :height: 120pt + :width: 90pt + + +.. raw:: latex + + \pagebreak + +.. toctree:: + :hidden: + + ../hello/hello + ../image_manipulation/image_manipulation + ../video_processing/video_processing diff --git a/doc/tutorials/ios/video_processing/images/xcode_hello_ios_framework_drag_and_drop.png b/doc/tutorials/ios/video_processing/images/xcode_hello_ios_framework_drag_and_drop.png new file mode 100644 index 0000000000000000000000000000000000000000..8d935c233b49b1fa6d2164ce9d3b426255a21012 GIT binary patch literal 86585 zcmZU)1yEc;(=j0*h)&O z%1cU8s=7E^**aJP0J@>c-iVrb(+!@}4k4Dvic^3_M z06YGNrmQOsj3=fF%s-|;Sy3rU1a=GPijAbNFUgfy3PmB{uV3tl)7W$F6J)Iq4~y^= z6JQZ%(i5l)MS?em0W5A)D8;}5elx0k;$Zc`rI2Aq{iuf3+my)<=DS!K2{>2Tvlp*t6kX3#io9Th|<-4j$ z(RlM$O(VeSz;la|>hMn@O1RHR@Bx%KRWL9naM3?UJ(vP#XyTVBq<(%cQvW~*>Fo6z z5bo<779NZ?&w=jqLi!OIC;{G({1+(6I&x7U8)!is>&2Rzn?N74I;Q!HK3vh~e4d#M z;0F3+^E71fq@|`;&Un=^a<=&a8CuhYNgMS{;r|MG0M`np|HL#2y)6h_rFs0q#WZB#Tk)Q71A@a4-w*nuvB-?vA+7VTL`&O4XJF`{A_gn%Vf`{kKK<-+zGB$<- zQ=phx2OCz(DD5xIPM{@Ozr0A*80hb14<^*0W{31To>cZL>|X32KjnX9qOS9Q7ED(_ z#)!aWmr@=VCxRK50}2qq(0-7nt@D0>Z2a9MZJE*pop1Npi~KqUf42SM_ZG7thbb8n^-TGnwcJGq4C2_pa3R;q1S}?=)fU#7PJN8YUk+0M=VD z9#l){Fxa4>2ouZ^cmYZZQiNgg5B$h>;vzN(sp3LM2whwFt(alG8do^c!SYu`6F(_T zJ_J#cN`<6RDT63*LW`(q<>2OmzfzHmVBZA#<(n|zM20_z`{w(VAyot_OQO$6m*Jj- zUP#2{9nJ{ZAm|4M^fIJjSpD=i<=d-NWds&| z#Ul?F>yKgxq|RGW4PwwsLKq`#g4>Tkkx)~!Efdy6t{`?NUkt4p#9rXH!*7ZnDoCG& zwb2_$#J3@66ca?q4r3M9$vd5OJPNo&dM5M1=!&H>^J1SPWQnF7BEyZAAJ{WdV0TZ` zo&YrD(sPK_=`xdOlUBx7d0;v)ch&LghMpWEH!D=RM*zfYp5#zD>lk6RSGrB_Vc(cA^x`rJY`ur>*{7_$p= zZnMHg=|y_^mIWV67mM9X(2FOFSPDf{gv4JWA4qD5GE+}*WVMl3)WJkrv%16LQ@fq;!_N?&C z`#gMSOk_hSMTAD=!BNDX#Qx37YlMAVuAgDZW&U=F(MV%3V^Dcu zdHgZ!JU6l|4o!LjtlVl5@to2eJXfS%+G^Trt~Z-2%Prvc6KaZd)?fl{5^ZjAx+Tam zHhG|;?_?}vK!4OH#ytytkZ#Co6o1MCbdIyeu*T+LvGq%^k7&&A{l{d0D6c*mcQWjP6nl+xwW?b59q+#13fkQ)vyHb?76S4S*Io5uZ<3F04< z#HfJ=0ft|+sJ`WEZx>U`&nj>z)+_$_BCjxNT&{i`!Kt?TRlu-K(%VQ{pH_80WGwCT z?~3Y^fJM>t!OPD|B%nM#Omm9`RsA{@AzA)!&Fur)@xS(8nhat8uS`P zCpsr-r`?O2i}H&{kyc>_aA~z0p}6y`JN5gqYvOzSN9CLDjwpK_aE-kv zny5wYcsHRj-=@r_)(wUWkN52K+-2)#R!=>!9C`={4lIP>`q}QeTO!`)x|H?X=B;4My4oP06WS=vn~rj5XC43T=*$ zvW~6^tJBOmTs7_O44Lsx$=0xkgW%hOuW_zlb~b5`Xf^3xzq%=PW(_3arE{k-Cud~} zC!3|XSn>I^KrgyQf_yn2I~94piew`cKNa5>qn28is#v92FIdl6g;|P@sE>Red+uI# zbk^Z@_K4{L4@wa>m6ldHWE$wJCM-evMR(T(ld>$3TZ z-?fSzmG>3@7Jsh?ttT(*){>p%pO0Rww&u9_U(4LZtZr;=M2O~gr}C{kiynI(Q4rUW zx4Mp>ElsY4wbX9TcFp_ioH`wf#Q2^+E?%^tS70=Ys`}3e7V$1TsJ@vF*ByLcrpcBS ziMywGj7^LF=VSJ?2hr##jgv8y8P4$*A)!De%nTrh_(7!mqLNdIYT0XVjJUd4z58!V zo~!rPQhqdD+h2a&K=1bSfx7eocW%R1Fe?*RDIzEoOTeYXCCMcn))Q7?V&|{iPXf=k zV-8aUC2Yez3VvNTalK-}t{1L}w+l}(p+U}Bn^OTgPa7>ZJ>Ub`fw<)2&fF}q(^Q@m zXQ;~yPg6o`qydXT;m$67}CBhh%~Z_^g`CM1Oz&Ke4d_|m?|pM**Qiz8#x{S{J;5=jW!2ZL405;eyV?Y z?VX@%{q=EddB)RJrO%nBS$r{y zo=eJ0=V^RT?X1+aM~v1T4$hAKMFa+4Br%Tm8un}U3sLVdcq!)i{fYtdTdo5MYm+?(A+It3TIHu^mbufyz})i&LF2F3TQ5nDFb(>ubu*aU4LlqL)h zrr^49n)_itnns#&6}lWz!Y)Xaebvj;JwX?nuTfK{=ndU#^(_A(xUXaTF&p=u;xj!a z@E>2YFd4`0%jm=J8)n;w+f)N%d+2C7YIci(>J#0aq08)x?6gYgeqql>jY~~i?Xr`D zLk+Gt;GbO55onKEX^Z9)hV&Oc6DNLDBXQ}%fC5Ytcn-J~{w&f9lJ2;YNZw>D@k3>| z0#EBJ^Jwca`b93x->(+9){h4a2Yw?;d-dBaTO>G?D1u02*yQ-Mp!7(3xdnOAglE=% z1}3Uf>e}+W^0KN=Vl|mWW`sjZ@3O==W+)Lbh60Z;u6P1&Ur-Ra5 z(m68BCv}()nCYvBst_H09N1R0E*YAqJwWcCgjR)4+vGZ2T222QtQ&j(yYB3~Ez+s+ zJY#jH&@d+AIRQ)tYxOu)N$Jqdo=z+&2F~nC_U|TVP_?f zf6?pft4&|}0Ql3qMao`8l41wf!%Fc@QGmj!f>;`M#&McuP!(FWznuWeOED(s;O6kh zK_Utg;w<7a3Xn8Itn<4?8=+^?ZkkktPq}=$|I<|Dmcq&PLd6?>q%ygf`-7Y8{cgrS zSAx5d_3fzvi4k`VA2M%d4yLVuSN_}1@_2>LLzAc-y~mM>S6|rIVEx&??-bb@0*2+X@xX# z)>2|lifR04W?KSJ_oMQ|pntN!>I)4<>%qx>#6IpV0jd#Mr{0R!(b4th{rSjaSa!-fvHvhbxJm-@SlJRd* z2MIQfQo0jn{;nw>eLrD7^;u={V(C2mi+->%)1CSD5AH`x*ac`^sq4`~_2kRa%s|~~ z;Vd?kKB^FLs5OVLhue$ina=#*L)UzGKSiol>=ed?5Sz&69rSW@gcnsCJ&?-^&`SQ{ zk34Q~C;+rX^B9f+c#r~Q@xV;zVdUA*0&Wt(zQ8LO$-RpeRJ&e)i;qeCZ9fi5Fopz+ zT+JhyRd|yrg%{g5Ow8U*)o%=vnn)+?6>#_DO5&CIqesC<%6E8SAI&2pWE*NYn8}u~ zGC?A7*+a(rBt2~nt9}8 z;8@^v;Uu>zF#RhVB(FC?c<>EhCdEZtZE4(r&cXaljnpevU)g*L^V>_CWn1n|(e2n( z_YTt@-?lOC5zbfaIou&6F+2fQV!9G0WgO_ISvEbEWLh!?bDBypmENXlQj2orJ(Ac=V6AIv9K?y zh>_;a^B)c|YrZ)tUxbne3q=@VY|wTL`4Nqb1sp(FVPJk9e>n^)WsJ;EH>JVG85#4% zE>vcTcq6(@nMnfEri)0Mw#<^pE!;Iup=C_`szO|~d#QNjB9$A@9^+#k5na*e4@iT6 z3}-_NKMx})oR5)f>S}IOxbR=!E@YqN{8e->zGsX{D#<=XXR9;v^K5J5>GIbpJzNx7 z{#(oTX!{`hZ>&Qjpw^?#vdkJhyIWogwr-!s?0$s|xpuk-vCHS2Jcs0dgrY#oGY$qQLFrA`f#dIRRaLUmgSf2N@eqw}mffa-I4aGoy0Wn0)MFwD<;?^dQBu6LTBzyeg zNM4NBNY&9&)mTvHRBzT=EhjEdDKsj*R&_Nrkfv97?A!?YSz_8e3yNs9ZC_PHbsYa( z$wT71X4c^=q)oO*3YVqK-y`mKwjc0!cV1bmwrhh%w4l3w&#C7gu>NNuZv%@s(*7vD zt{5qEB%^GR5YtYU)cQ3igg_o;v_qrj9Fkm-oRTh@#F&)a>1mNGp}Y;LZS(Msd169D zM|mW*6Y12oQ2*v1T@s=%s9mF@=1OY((cSDW>EgJZIOXp@!L!vqgzh0GrRGUo7I^~X zRAnPI+pgt{wfYtJyv#%WQ}-65*4n0Am#D*snf2(G&%wE2c43~PR>W+^lKzs41^%=9N7!g^ zLkNj+ZE>__WcB+ikNkSyK3`B7q2)#ZWzCgcBeX-B6aL8X%M8oteA%O4nq`{tb98`Q6C>s$V^=~?`k zS$E;E!uR3`OO1~?$uwFQ^xe63Wf)b1*`t*&YL^=`KC#7&HQtTVw|xB*6)P?Im7uzm%>UQ@{g()}jhowdK{hr|Pfu1)E>>q3Yc>u60Rc94PBu2T|C#=Oq3`n-MGs`|Mbz)yF!e1u{X%-r1%7}KKpCY;{^1M_4GxWrVSf@sD_k52>jRRhoWwLH4K+y> z49)0gzV=%>8Qkb}@klV~gr&s~U2DX63Ux0ns-HycKQbSG_iN)<2UuO$7K|GhM0C!F z!AplI9|uFJ;7l}ent#`Z@hg-`>c+CFdS=+dhD(>T!-jDpO!%FS3?lX6K0BVf%&iE1 zlU_llCdh*KWrn4Mk)njh5@JK*9N1!kU;?nPv9a`QM)C>(IFuprQ&|ijO|v;UOwbt6 zA?OgUAcAOE%RjoME+%s-L%%poqLDH3@!tQ0lleLNCMzM8x3GHq=|hx6JvD$cKTrVU z69}+-9)!glC>|8()=a?8T_!mV2>mOSzahC$j;F~UZAv@HMW>YI)B7~&|8f;ZNo|fc zX}8mgTifW%Nvfom4xi{W^Y{f)n131k`r~yMJbZmA(_5Id?X??csZk5=e|yaGmq{Ssz|*q9upW*W)j(B*jv_fQFQO@y@pGY@61DFt8x~Hb$oiQ$({g!WR5$$IabQ_-gkQT4#-0-d%e7S zO)BhF*WKOS)kOxt!Nuj`;`-gtfP;gB5mhq0TV7dd@8IBIZ@+8F#mVXOaF+h-7nY=| zGRH|WZ8V*v&JC&UbNt-w2tErYaALFJb!X>jKW>*|xQFBhSK_Rqf<&BAON&Gr77)1g z2>!;Zqo$@NE&ahfnk2I@dGlzcrGu5DhrPepC$pj=lhpskYC9qVsIkbWl(xagcK$R-;uQbe_#27w=l&nliWX19gUPGN2i6L5AT1s{*V?n;r$W$PBZ0=lWROza5^=3JQ^vR;X+zYy8d+hh(d?0`k4^j?kA{h<#jFnXxt=4^ElSL;hyGDQ=X{ zid_oy*prQc;45Q;^c3-4PdiP=Cm{~-%hto=#`Ed?^tAV7*W*T|&FCb{gz}FYgUJq^ zp4YQoXxi!;>kJ(_w|ZWv#m6GvKIwV|KRQeE2_bp=@Q2e)iS+nk4s* zb?oy8>_z*a<2qjLlEQ1Y_8m{RVk3+GIfUhbG?hqg=4-}MfE zySNaWb!xn?D~AB)&AU-zt(@4njvV`!I1sg5n#JZ?mSLFG2x^Y^%F0nyQ*-kYdvsr) zM0md`Vc7KH?UP@aDL-lKJEWi8&d#oC$K^ypj}<<##I|!IBO{|fB}TVgJ^-S_ovbHU z!$%z95EPMIn#H2uWmtYHl)9uu%lul}1<-_mmG9K?SA5D?H3Lif5~8c=i- zMJ@ZOhY^#SIBeGaf6SFKm}>|mffoiaQ8hs^>>Bs=04{G>^>2$yAmMz-jukh_RUM;x zg#r92aT}w!t0pSO`_tlo+>`5VO>17|Hnc95#y#+b5y6=YkjF{a-A)V5xqXNvi>`nD zvHWT?h5Xlxw z-o9M#IdJYVT6r99QDQnp22_7k%z5hHsD!$?{-FK>{ke|{xqaS22aT+(_IL+a)u8J? zR{K6i5G(;GcS14)emt$f@JcDzj^|7pKd)D=!Q9BkDgFbf5-0Q&9=z!Qf9H`Bj%PoO zcT69r!fw6TO>H*sgWC>W#H9_!RY} zQ77Pj%Gp>K6#zKgbc5d2ziADr)@DM72^z0klqhoiS0I}Lr5r>ewacd-9Z!jcIM;YB zYv=bqN@oM+7Ycfyofo&_D)|K)i<5o21X-lSS6PkrUrKUFvyR;#Wr)^l_96_IJ^{I3 z+q7b-3?BEwzw=-Zze{IJnAn#c4$$x)42tOUQ)PEXM4=;afK%{F?*U!Knw95KyVD>A zp!ssG+jgyaGLz5wZ=<8@(}NFyfD)h?@I1zK$^8!kt}3PI=!fQ7ZyGLR88(MuUij^u zC$ByVi=M{ybhK>dv;h4N5o2U@$%Baj>_rU0VT6z zkg9e@lfl(&A)m3vqBvtO3+d{q&X3Tnd*$g<`s7d8Md1hQ*CSc9G0PjbM^$<%8^Fsl zDcI+qY?p86V*2z@aJd-tX||*0)$O6mI`zyv+V=hwc)f5IaxC`tmKy-HtalCn1ntay zv-)`&MxX0{03msqe(L|dw)TF&=KLemCU{M8gNxj2@2CCnR;M+EzQG|JfcU6PSI~D! z>;&j{87wBqrBi9(JMC<2)3w)3pX+__&h8uM3+6QIYB)&qR!3*y!f~;E4l3VBE{>$8 zrKN@^wKq5rTEI|IF@}qQM1f|==*xXCbK0vN&VV4zMB-~9!%R}|=@KR@25UY-fer=T z$d1puuU4(@fF((x&L4n5?83`N8Rz_^Jxqi0a~fKcf!r;e-6MwjY3x4Yn3?M}r|nt+ z-(d{8?Y2uPSoIriw)-#%Sd0zP0e{3R^=-Z2)kb+a|ey4CSr?dOhFjDI4>%}eNVQG;CJ|=Nmh4^`j z7HHQwio{dy`=5FNwm1?R_Wa%xI3eQ|0Q*ISA@fQ@~~kHHa4}EMnV=N2wMr37sF{@Qu-W6z zvjZk6jT=!=7$fo7?$=4t?EGy849q8Xpp`ma<1FWFDBz+hSUbmnhgB|3#4_Xj48THy z2b0%xeweecU*yiGrbX)ynXJ2S`tSVYgZ`@QMAn>@Er$1B(RiK&U zs!`$NuowabXcriLRhp#LOo(P86()g23BySEt4qLE@kt%r_-VQvTKD8~4s75n|EMy0 zr9J5Ap2SpTY*`!qSLz9qcxzY;|@m#0k~x@<2x; zILf($Hk&u&rUyVyLRQwlg@vSyj4__>0tSEyVK0%nhK7cVi%X-?N>{_T?xLcin$)I; zb(_fux(aubk#)n1YYuRl$;ZJbW=?&*M62USIm1u5qT$KL76)(Y5TbeqQs@faFhwjQ z1OPyaId_xlUeBvL{gq!9!lAuxcBh~j$$5VI`OT^HGv_#%5@45M8iE$c_lL?V`iW?~ zW3PMjD;x6YklVURFAIRm9_HOw-Hg&T+;l?wN(V53&+sDuHO1mlvVQ>6c|SPidZR)> z+F>s!A)d#`yU_LI7uW7Eabquqd8|dc4OCH zgOwTN5z3Ee=~$g}pstCi_DgC|)(M2vwdTUsTGDvZFE(Y|(NSDoeJp<8?8t*BNbn?S zNn}2e&UHjObTDD8Hh*y2tPOn56#(oa?6>xV>G3y(UAdY4A)%opnVm+H%i8tN*_+*6 zFs!YvHkiV#-cNH)LL_T~+|J_<&}ziMf=+TkcP->?V%N3%?p;yNDPE7)Bj=2Jt}+h; z+&@(LJtcqiB{ZMvG$r8Tg~rwTx0QBx?a$<#uaWQ^34H(bXQw##@@%GYXpGIer-_V} zDASzATN(}q->=Th*W7&a#PcHSH(6RD5fz=Y2*l%QFvcsyV(v@#=rWo4DE38 zl%$+#|FLagT;F+JdZ>4OsV7XW?jHXl-Uum|nNVVMZ~NBe`?&GjI_`ZPMn>emeuWQw zcz6g43u|s}7WIE_{lEV}7j|8?SphY#|c`cyXGjZ4v9@;u6yqd)sHZGBj({Bm2n z9Xf0rP>}@#K=TE!?nDQ<2KbgfZXZHgEqLMnBq##!4jJJX3K=C!Hw2ot+xQ@jLG`Z@ z^K>c9x_hcf=4k4rB9Ce3$+FNJFbeD0eb193D=?jB6FLhOxxz#Mc}>J8fYXpR#W#wlA8c5nIPg9{#q-{m;ys>gYWfIBNKBlcpLca} z$x^0A9bQ!k=n*s1d-wBM?1^JUbDg1(H(AYEcRanz0`9`N6!fBAD>8j-+BlAcYHu@5 z$G%Pdy}BD&2RVmTcx$9(RhLECqII)>G4IMF*8GZv44oE(cJdsa1v=G4SzG)GWo(ubFohTDgIFBuJGJiTxbIIHa41 z0&-<~&t2H1EHvkXZz?MaUIe)nNS)|8+=8F9-;S-JBu^`BLzbRy;E4XoRrVoOHLbqJ zK-Lnk0zs*c@p8hjUO?alaGSnowDlHhg?5ZxNRzKy%CVl}%AY+I@b-*O$S!VS5=|5~ zn{3F65ngEA6Y%!(NFXA4rjz2Eut?519JAB#>Md^juYw1(%Pkn;&?B0dn1NO2JJ*}4;^xg`3e3Bx0F>Ljh? zw0rC$FwH=K-F+G%P{>uIKt!+2S!x9v00=Y1k^o1Uzt)b>JT`+Y_wBfq5`Ehk#S~7Z zIr$(HZicDOKa2Usos#6y<_)aO`itE^B!nJ-u}P>gO)6vgnPE%NmJYEemlLm3Q8R8l z>mO|1C=npqqFC>4JC!mzI}gr|+IeK8<)_UPaR6e6^jKe?L$o(c%MLK( z>@3i&;j1B>s%W^^kB_kpNQ;Y&$wmD~fBs|Y5|M!pwzd&rsSKp?7)(DSw9b-8LFgBP z={b65!pwVNZiWFlVt;EU3$aD@SNS0&K|fwQ<|6qav$})VaV*I^WbZBl_QpSpe5CSk zF|GD?`C$9@U;Z$rr>c>I5#G6f)V|%0S`BnPVCQ3-<>7JE^;!66YL9+sr3;t-Lk%9k z8UHw{i<(z8C*#}rKZ(4!U7-3-oS$oIxet-h6F&J=Y(x2UO91#UvMQHR%l^6Y{Xh58dP+JYFa=xtriNp&UDt zC%0{Aj#R=vH{}jyR1eYSO!v`XMAE^X{Tnp*Z|S6Gfc<8tZ(#Lr8OV-XF>q9dqx2;9*CthYlTW3-rf5a8=K3T_*vHT4YL*Y0+Ju&gLaV;KRh3yMq z4~p9nVYWbA%AXA`$_Ptm^keibEQnq#l{_x80dboRf};=mGlZRbzmc!FSS5zgS!+x& z3*`tOn4>2T&HOGwh~$H-3TThc8Sz-@V*2l!@Vxjd@Dyo}lQ7@lyAK=4hD8YgQJDvC z4_gf~D%10%s}ypSe_r**GmkSK$p8UST>Hb&g*?v6s;eEHoR+vJt$r65747Zqp^@^} zH8yhd@ukK&)-lJLf)(_+6Ydq!bO^93D=I1~E0qRsZ~oKRzi~tu24bn(EwM)}h9^Ta z7V1?^8@y)kQj^<%_Dn1d=ozK6*NfDE$B%a`Ve1G>6G?zd^Jf^oPDVc`tt4UL12cI6 zf406NVCAE3Prol+Na+-u>X#e%^o2J|pprKFYmj=o(|S9mDEQCrbu^jKLxLjf=+xB3 zY+?AM)jW4~dAaTTX0q1e486^To_Tbzb=}Qj)5wg}lue-Yy=f#8VyC)3v8Z_*PGuXk zIIVa2dRqOrxwteiZ2bM(ZZ;VC{QTVQ|B{lFg!l1dL|EPT7X77&zPOai=04gY9+uKz zOAJ$Wiy+CC>(t69geXRRT1kJ0>r@T)xy~;K9&@`YNMFSBG*Q9WF!3ZLj5c8azzCoq zt?PX*MN|%Ub~s{Hq8U|;7A>*Xl{Ga1_lr7OTG@i`Cv~R%4!i~fEb>X}O7mmm9^ zwWrT4E&mcSGfAp83PithrVTdj9cpT6HTgZ=y!$$Hb8}yU5#AR_%E3`laeS%TfX`v& zS6Ui>z$>`3Qy57n-b9ZTe{s~6KT%(5+|FC-NhxDQK{ljE{@B3ZE-_^GlNcRXc4DGP zAW~krZlyC36Kec+qNB6%eS9n5ni4<-`r~yJT{}aW8eZ=O&!SukYie#zL&5vnGTIw* zh0XMmX1`RG&SgF2zHI1u(RTRv{Gmn@9|=B%#o%Fx#Cal1z;&Ta&7}*Aal~9*kd8=d z=VpJL&*>k(&)w17oO&tO*{%fk=;5v7N}cIs22W{jz%%%Im*%r*Wpi>-Q?X=zC^9HXhJ>B+Afl#rQWq8@egLC&t_6l`!^ABi5% zomZ8lG)}eNzX=~ZfBf~msi++O7zZutIR=h~NDcJ7Tk`Vq^5Wvb%g6C*A%#~m3|Vz` zbsry}_n?|%7@8kW-fnil0*8o+s!t4%3i|>F*S9jz@*zw7t}^%E`rn1u*R|g;TPEv2 zPuVhf4-38ZR=Z+B^5*{i-jXs-!gVjLAh18}$Kt@IW1~ixW~<4JP*eiZt3Pn>6+^#9 z3bo|W(9n0~+R{)FNq!e4mpwVXh+yg7bZQ(*TfQMeKCXY7q_*Sll>@7ZG>-R!TWzj~ zM!x4w1%hpMHG>w$t;NNbo8A82-rnzYSX0Lb=1<%xM5MErNO__08z)AFbT?0a;TU8U zRaMLk406iKGK?o5wmDdz>c}U4e!DG+I8}>8ys|mm9T6u1n8a&^lu7V?+m$ z2=Hb#!=cod1O#Fwq^C!K(9zN5<>l$7=wg`1=}@f(d-C(CgoHB9$&uhGI}6FtAtAq_ zqtO614h~=CD9^9dZLa2^ASoM@Fi!YU2^V9(P*=DVVi#-wk* z7k22Cv-sa-$*{xYdU|{0FA9L6II;kVNZ-I<-yfdNdHqw778z<2?SVWX@3h^N(5dC6 z4vgy55R`a`e!~*4;gE_G%NtS|@O12n4NQ;thDuFGM|ZK-g4s8j;DDjjH!d#yAH8B> zW1F`75{C>)nhObmXT9PWroe)Q5rcsUJWq95_stDdPaw;te$C~CP6DCVvzwE~*YbZ3 z5d%d!x}RRE#Cn7;Clm66-3>9pufL(saYk*cJ<#Fbi!Yy@b9~PA4zthQ+5;XdWr5F8 zxiPtJkQZpqG{9?>{=)Ytw8i>yL@tx}qTrf9`MZAKCwla9$}V~O%1?<;rqOB&%eBUF zp!d>Fs2s(|Wp_g@8X&76bk;9?=Al9fof*05vH?e}yvTNvl&NJnjH zX&FN<;`5I5_I#hnwEvr_<~}6s=H=}*Ghc!!9gm^qt4q6yTybsKl|4pP|8`k<`TO0T ze?`*$n@JdRmGn0(0r?D(qv$PD;d?{+%PwZSYy{k0sk`6#!4r~=%RW{a$lQAV2G@^I zetzQ-|9+W+ddBzXxX}QfC)yxAmlfhyjir4CTg=jytt)TQODc=Cx0mB z4W;4ja6BEFte#|X?z|&D?EJB=W35C8U2i%AtFOFp-)tp?mk}yc0AH{7MiW0u&lY30 zBe&l#88~-8SviHbOGFlY8+Knn{=a7d{H_Ntd!Uf3?S4y&O}yWn-b)u_G{hizGuqe?`h{6MA!g?t;ZMp_wp^q zOGp$OAP||r_}6l&D!agw+y`4tBxq9NS^2dFAR{vq5rdSF#i`kPI>#7tllm?_EgL?k zzo;bJ)!+X7ggcx_*Dx>`SHb$_{Npgm{wt2)U8b`3)NC|$qm&?(>|xD1n| z-p@{rPb%Vb_k4efh)#^BRv22};ILSnMC~K$eFJeXU4NU|GeL^=IP*H_-V|Vko|7H! zf5Dq%(zk0_gZud>Uou=>Lt{TuLg~TpZh)D#SPi7 zqh{kwbMu#KavDR}_Lv%ACxx=Rj!Y)sYvtI0qoN4kj2CDNsrZHma;<-t^GX1IUf&P3 z77OH;`xx)9vGqWfc0OFdKPF&`dcTG0ICnfwDb}V1^wXv;FOyA-PS3lqTWPSR`ORib zYom+4HKrV-oEtj_Jn#3=exhUVUwOD+%C|-{c;2RluUkDUE|l>SAxr8V`90*f%p!DA zH0G2|ivEl1TCMS221TDhB~>uu%lG%j{!Q049aF?Y4<(sSC-3#$vlC=0>#QF`B}$p# zj;scwt^7~(@E@=<-#tMRlBmeY0uD_rp1+NBLx0uP)Mg8$qxALl-!m-LiaQON&MrSC z2ToF1j8mR=!$V1&z|G9Y%ld!ahP}N@c3irs>zy~dqX^h?guNStjnUSNV{)r?mv-qf zIq}QZUYBm-eouG3Cj66RoAf^2g?8T$UT);_wDEENq;?UU-dQN{;S1|lJSr5f2RLPnSY zP&(NvGnhq-xGcYUin!&D@0%rwTrKR1bsZesvgYW{ls+a^T7M;S{j#|eATsCkx_=Ke z`mx*e__kGwy7^)Q)S8SD>soYbv4=UY3BT-lT+02cxn`*|Z2}0$-8}aYdup)`c-qaq z9~;e2+IarGHr=-M@3K94I7(Av0k#M!Lf-%E-O(8UVMo^!rVQF-}m!(PiU4GmLam>ufwMV19Sk#0k?7~ z7aQAqGFg<7aTM<=qHGr&8VFL4EdLdm9hrtb<~ouxx@SBN=_p`$dU`rtswNTjYpprm z2GhTq>`#%n8!o%6o&&zm8^&$0&pcG-28eo3V2<%!F0!&ThN_^7s~`EjP2@**Y~y|i zZG!oC`zjfpW?Hcp6QD&_uu-2!maAuTQK*J2HbYc*kxJr@i-$sEeQ$Wk9e2c;-codn?I0bQSavebg!e*?IOr-<;foa zzRkTE_<>8${N{6>|2(vCN6yg)p@%6qBOLFxE`3NEa&&jUFOp9*OCx$Op=8S;6>9RK z^=v}7!zoyeI=xO7%I8Z}QdOuD8AU`4v%-ibH$W57_0P{f-7iek*bv3GN3@q3kW zqRIK?FC>Zq8S znj83bx4t}SgbA?z=V3qx;4ApD&hq*LFasx=%f|faBRUXibIN{kq`~ypqLUOUKz!L< z6!`J;Mx*M7n^td!P=RGo+y-MX{lRASo?3J8+wd{|| z%cbx^$j;0ZDzv^%v{9y$DEJ$pqHptqj_xQd-vF;uvrIY zPhL<5erL~dzQIF7%l%*L57&c>H6NutuJM%*(?J z9~(mjBk*&U^TJit!qImaKgSdA&mN?~gE7ZMgnQ=JN`xHjM9E|#;_HnAbx_AoV;zNe zh=26&M;{w!i+=3Vj(QMazUIGLvSiY}SaMeqaJ%@sVDqq>(G*iJHAGsdspm$q9)Y}h z$Z+m}Ds3u8W})4Vu}HS!C(^8GINDvziP7d?e#5EY*z!rSc(%Smabr^SP%Ix;^<@`t z{^*B86ZTwKEj;?^LqJIOD{hVut@MwMgt(bEkU(Zu)BCvd_iNZGLR>jp3hVFg)XSF5 z9puRWbb_-~&g2jbpYkGI_=L^wEa56Ewz@iY5W8v9Vv$mg&z!pEeyfdkGH653F(_$p z`UW;yCi6rropdh z6yN(?79EY!nUulr%Q<1%&-vmZ@o%^hiJxbYj^o?1C6f4T+qK@K*b7E0bJ|x43ir^9$H&K$lX07t-vqo-#s(G!^;eMm!#5-`#U0*2e^~hB zr~nkJp)EEGM2NYC#mMk*tgdN-C0ZVe(C2PdLQ73(kx2exL%&2(^KesYSpr*T6knq0 z1FbPjE^_BSh@Xp-TgRG#sS;7u&r7|~$cm9po5flaAlHD+2^~JLitAlZI1=k)W*B9- zb)rhlP=Gn3*ZBdS=BMYL1tk=_-jy-9$FV&2!H?Z&)xNGq2J*pgAni<7nMsCDf+j8g zt(9h%vXIkL0!pRbk0WsuT@KgjrQf{ zT0H}^Kpzfo{X}@oU*1&YQaV|SuXt3RjM~-%nfeP03$9L1!|JKD=X*pI*0JRh!)#wI;ulCxB_!R7w+i4l$~m?eHJ{*+>WfB)g; ztu9ws<|G`q2s3Hr& zgnW{rH$q-!0IFaODT-i~z80d<{a}}%z@PX->T!IC*Tn?4(O~4J>0r1}fB^$pGiB~Y zk`83(PRQra-DLJ{PeIF+y zDiQ7EEgo9`)!E_|Ozgrx=L>5sU4G_}z=k95owT84xSX5WcPdbk3clVu`kIM)+Vc@A z+7H{all-pRg?K5gqGpxC%_!($=Z|orF2lzDfiAcY!4#(fy3u3F2&c2dOVlE@UYP7MeoClj(^!(OG&*pie$S%OF7xw+k;q~ z5a>e=f$sjx4kOyPSK(#VC#%RJeTT%&TVlYPB<6KNZbF;!pqWllqZ=zVwaCI%na{6E z9!z``pHf+6d@oy;dEwdTiW-^UnaoB8$XjWy7 zOw_rA^KsVMC3vl@tYq=If+2wTpQNNDPSD5H{opO@==gV1)-CY?3jqkG78VwtJ!53v zzz0$5wHQQ#isSQqx7&f_sYCF*7b3)KRp>=GAWk$kHWW!f8T~U+om@80eRIUY_(S+@ zQ&SVtQJ>6TwVeg@nfOOS(fbG$kG-ip;C3}MEx&af>yH4p?ZUF>(}Hu1e|RsCS;oX5 zvJj>y-4$#7@)5_B2p!I&$pr$W|5#CtjspH+NM~XKb8=DvwMu!GgN-Gzfh$L0G&d~7 zT-OyN9-cu_tXMDo^z}YIw{m}YSNW3y_Jq~&MN;3jud4mxXRQTiQCH3 z@h9fR>T}!Z_6K8u#a8QOKPVV^{$)|^+tBa%`Cq$uM$k^VgLX`|O`4YP?0<;5BfOC< zs5>?>p~Ay+l#1)^$a+Y9lGFH*)mleti2 z{kt6Yyf`vA2?+2gn)XW3LUv|#&CNXT-u)YRfoiC+Ta%ZU7r_<00JO{Oq$KrEpR9B# z8gGLQ*SUXkSU=vL<$z93@}CI*k4&&P7lvQ~0$Y0VlW``8d8qSkt8~i%j z+CX9p|-the&WT_ZmIXR@4jh&i-oaJV}9Vu~G5_zNe z!mtyE=vg}P(!VVcn^X*VioL}d?;Uq2WBB926Pu9W$bqvkKVPZca1i!38~sNWfAu!T z*iiLfR`x+eM8x}>lb5a+@Auc`bw*vku`)Om9v&~|Kq;P_oJCFL-i8SlH4RC$^)|70@ zmX?;lISu@9t-oHj#q7l|(&}ZFU?bde20vT;r$G`81cR0HWz5gwX_qPZa)Gho;o)6R zN4A=J?j~SDa`VO7+&q=f_4uf1ojIh7b!P1|a~NILx&v?4KY5T09sk{qe1p!QNGiCw<%@REzZvMMa;2)j4{~}vNOL%LD$w>GNnVO!S{`KqE$_nH4 zPMY?#z+;x88St=sc(g7b;hqySJn92!5+R{@@l6i z@ZjL!A99dk+u2gsayPNCOI3Vr_m;+~-cvgxqq6gO=>m+jltam6HzTNP0|R4k)_uDg z8jkAo#1axHayAH}w3oHHy`LKT40G6wg3Yt&VsLQt`Uj+N*qmIF%Y|QYV+A|t$bWEs z;~Sg*vG;*%Lc+M*_=;W!FM-NHYw11XbJ5PJxIJ>9RlYp^a{nhuMv7-hx6(}FI!V%n z6PhoCHFBf!#%3#KlLaU2_rK9>pj>eamPgmr^6>ReaF~ zOj~*RIFM*=Rvf=cMiKJ6+2L(zrWaX*ZuMxX!FA2u%-+5xpLR}t4pg1IpJ2P%jU@H$ z=@0vyQf-H`-NPbH^&^$dXdoOXr%G?G>HGKG+-ioLlzHclT8H&x+fF(rrZ?O+nG1(W z#n@o%Vz3$Z+vJVz!gj-JW|#hh@^tNj2>zl|Z0TF1CV_nNnjLOk9re07b#C|VkO9&@ z?yIkbP4Mx~O>}P)zWVF-^QhtBXSq!xy$W-8+J zrl%7o7$N0BvE;mvV{ZHZTw4?Ly#5PT9vZ1&dv30uXVyF~zENwXriO;k-F8Y#OAGg^ z6PB-a5L;2{!EBwW^=fT{@rM!bn{``W`u!S ze%0BXm$P%joVq%AJVE8QsnY9c*Q+{JQC?zXIKX`Pq~*phB~9IBMQgXEO6p!Z9p?7k zzi6>9?)RkVN!4&Cv@~I6kW{iUny%ho4CsvhL*8eNHXM83Is^g5^MYNfKHuxVi(4$6 z<4Lijlkgi>|5>By|JG>ji)HvH|ACfdXGHRTnKjNO}K>r;k<7>-nVV>Cy$>^<5Bj{8jqg#Gi%m z{9i}c!24&j*6x0Dyo!Jj241Me2}<@(x;GDAV1!7bq>Muo(aO? z4;c_Pi)C~AkI5SH&wL)tqFKVbEY!EPV(_1kNH&YtRf#1(5ZIyqw38`Q^p3a1Z5czKi7Z5F59HjKzNTK zN{kv(S_+sY@G2_W+5PvjB>!zwHNwKxpncob>lyWZ>9*m6UGJvJ47-E)D%CA1$}{@0 z>&0)Ht~II(1m8uPHz?2J?9(;*u<;V_Th4sJrah?3F|aSYiA9K6&ya`4AHpcVG6T9x zvhvc>c(Fe;T@CMY>hCA2wyWW~KpCSFM^~Zc5dYL7r6xwUPZ%5hGbu}TaR5$+dPErs zV`w+$bKn&HE6ujY3VE%DJZ$OB3IEe42{JkpMT)7w&1rIYH1x3Mt`+0huM!l~_2Sdk zkK6F6yqOOMoiX_45D1cp5q zUX_Ho@SP}XX9g^*_ub&1M|Rxn_b@aSyi=!?_X;TdG`Bh(R&l+B_w%QC4x@T43RKw>vqS&#gAkhitcFYLBb^qB)rV4 zl1M+5nbsODH9JxkZ9Y~$JQk76lTWa?vO2|4OMKtGD0kfHoBE>G{sv;%-&AVZ#1{T` zQATqnRP_u?KfMwTu$!Psl>9J4#w=7RHcl4xl?!j^>7?&EHzy13dYZz8te5Ycop*A7 zt1Z{`kVad)fPO;F$_19}w>KeVLyj}^9Yw!u?!Z2F?ncVg9}(){SbVP9L4@Sl87*P+%__1hPBCtj=Fv+>0%UJ5K31TXX6 zITftTOh4q<)!&NWqn?^Y%8U^)@-yQh`F0#XrR*#~&_&}tk}_SNwK_0)xy4*@UW5;4 zSOhavR5HJm9G~72HB>!cbX?fn+530sJar*~UXTfW1CFL%8V0=`RV(ebokp=3@~VrF zZ0DhtbhI}HZWEi>>igGKJ(p=tquTlx@5>YQu|`~7^_|$Cfdv&&&HSE7RCvCuabw1mfwC8VCva>JWoZSO~AQxImKg2 za%M$zb+!Pdg|W%xG$H^ zF*I?-j_0WYS=rRcLuYR06;j#L-Z&|z^>1`MqbQx^$_v~-u2#37%`(1CrXszj%ki#n zO{(eHRU}nSG{t{Tj~Wxy(hS=pcAwrZ-lZl+c_yn^96rKyOFtieIi zbYa-jB;Uv5VdM@O@s^Idxd#G#r6WQu86ML;| zDRgg@fJU|zDOa3iqPoxd=Bz(x07nUIw_>xj7nIN;G#quC7x**^Pti`l27wO{zeJ7K z?gKKurC`mp^nx>J7Y2#L9rg^Yb#-Q!sv6de9)8iy;Uf|MjwVw1)@KA}>!Ox@gC^yd z_c}I}I%hlQ;YCp2Jk!3^z@3@ARbJx{&trYX5}!K9ZT51{bf{VU2X!wYXTQI|U(9jA zx`LG5L#_1<^pW#nqsA4TKppL@yZKGaBz+A={@uZsODMA(zV8*akB1X{s)NX~ zWLdHwa>@DjYcn605=CHBj5`>8!iz>)Kf-3glb1Y6p{Po&J|y19@8<&&fZk$wX*HE zE}zJMXYsx28gsC1r^<37^>vS?4WOCCG@hldK=XfNXLgsul%2(wcU!u-D1QT2pL}FF zHVIr@1!_{u++)d!Z*?CM_%Mk^^`9qeS2CDoG*m;BIycYD3l3P;?+vz(5< zFgiZ(6A`6L{m5KNf#rqP9@|O6G1KRAY_IU?SsBPNG0{_#*O<^g`m&lq z`aI-)Hz8ru(fO@K$Rv@ysL4jVCjauQrLAnK_eGZ_S~M*^f$Qd=Ycj54yN8+{w14uX zruAfp!Op-y*c*~472xhpD+ z9-YOAjc(js1TYW%4kFTO82Oxxbd7U3;W^%Ny)47##mGl}e20yX%7lw6dFGs*V z{{*Uzp6coM1JrX~%w~_nG_#g#+S0Kzb>sJ^P!8<)kOSEJ zV7zHQaZ#*SSqfzKS3xWVJ{HCngmWU@lv+m>PzyjH275dk`C$R?po2C3P~G1poMQ@4 z9+aR5b5#3k7K+9%u;_|EHHaga^L}V}xE-q_CG>bVh=}nvky0Dtmzp|H$?)FQb*nSn zRyG*7S^71B+on3qEHM^~9j9!y5`NaagELkp_j*4ka(SfsmVp9W@J%(UXwb9o7 zfb9YoTE~5`%0LwxaQjt zF~}gbZAd=CLNue(E9jDuJqqEpiMYT$2OdARV40vG<88Bx0*-sUNsr8h&pW-s|s z=;zYGS%OxZ`4Y%%Obq(!f5{_=)8T@qjz(#tz)8kQMMT?(wFC}+9RoIRfs%}{5p;fp@YL=c0svviM2aI^+?>VV#0K^%l6k+8`x!m6L!EcV zheyviikdn-UD?9!88ar$@bddG_*yt$&MZ^>m^a=uvj6j}lNXDC*M<9)W{}c6hR7S3wG-l@B0t&h+$0&!m z0k*JVByy^g+~6^jrAC#TtM>`rLRMO7aEB;WehIC0jZx%#;^+wG^m@a-Ut9N)cOp`$2^KSHV!5JmonjL{g+ZAKMP6W*YYm3;h&{AoJR4XG-I+q zv|JciYAc3+v-WMMEGlfp;D@~oc)hGrhk0Zja-hc9R~YWBm3S9mtQpA0HPI)%*N?Zk zIXX{R*g&BACu)KE*n{x!@yBI7Z0Q4MR4jJ!yC(g-+Jmz2`*Nr>MWu|%v^_X+<4+Yt zfwYOa=}Tpyu?GQbv$7Yl1kZj@xu+vkRRd(OA5Y^jzDClyKRrC!4(R2mWTuo7`cxTy z2m%Fqnt`=`OSoS5SdN&$eMX+n8U3=p2@X@*+K5Q`Tpc2cJ&G(&L>|5J?0s4%AZTLX zQ##7g6@BmjM&ZkJv&j1rPJM1Dp7)elJW4sN6}Mxqc+9tG@*TCTar7>~8XT2g>M6`} zeHH}&ax#x(?=X`cE*$aL8Omtn+AjpV5GO3a)L>wgfS&|fB$wAOiVY6F8(-au4jxJu zrW)$%xXNOZ9-p61+4rbpLU74l)W2Ii`zgXQfDlpn2kMJT&WJNs7<+sXzk@DYYCqX5 zBqc(pY8#cY4f}lZ*S^O4Z@R;C1GFSH5;XD@T<@&n@>KP<==; zA9;rj_k2d-{Ref4y3P(t1xz*wUeV84@Nj5ES$Mp$zF|4J-nl2hQpU5VvqqoYH4&o6-lfid7_s^-;|D)ASgf2 z4fm9!Yw=f88%kJe;)vvOzX4~*h|jlKKbg$vmcbtUYpZ=f!GpIorpwCcHjI%%_s?#P z7Osb9&Ra}TH7dRomS2kg&9zcW#EE{=e|xBrWKlFX7qOIHoHpCJX^s2@X!PtY*4YL! zl6|j7t(MAM^;0@c&IU6_it_?;7q%uz*q%N;b>%R9G|yp!I_ftsO?|lEMP_yGzD4L* zRU0}>iOLf4ojyFo$1J=pAA_U8QZPcL=6TWhYkvC7va=Y=Z*DjETWQx?j=*I*NMOOc z{gliILREa(YsCkH3?ss?F>8#6K~Rlq`}!;->wxBlf^9DqJ0d}UBF+;jp>fji);KOm zv7c>|1ycbhk7JI@*&@Nma8vL*XYq=<@QjFqh&uy{bo#W@ho#g!XpNS`Sz z@<1LLZQv_@L4}(4SzMLX;cYKHThsDs}uJZL*3@c<#8`KaXIq8Y@T0 zuT<5tqW6)q;-hEG!U^j8 zK`jw0euhO3E?q5p@J^rhepFbU=Fmvvn8X?nD4u5h?ed;1wTHFd@5cva>;BW%v?rK> zV?+n6EREw2+?>1vSLTf}LOzI`Wr ze?R|lXl>!*>1zdedGV0E&E-*rZW8a86T#D-aHZh2p!?=2`{Mj5NlQ zBS77hAd}4_on6Ix#hwQF8jHip#4{En(wIOa#~|d4?2dxJA{;)>ni{0D#{w0rw{|`6 ztt%3OJk~%CZA3=kqD8V;IyNbD{INX|9j-tE3BH4r-VQHDs~mE+6Ka`H8_CZ65{e3TZZsn{B45mYz!P<@p>z}J(_0-nL;RKw0e)$GeZP6&P!~jNMqO*i*4NtDdiK^ z(91)Z(D7njh~|hWRX=-_O6*WOhZYw52xl5P-UXkf&!YHP=r9^gfyA3>n0~56X_n^U ziAF&Oi13`DX7|aJXtNN-H;aQ@2QH{4w?T(*=&sDJd|A_m_l1d5k>$*p+=UTMttXq*Vd54~CN6-n`g2UtB!};g`N`+4 zr~~~#=zwxR7&@Xp%k$oD@NA$3i=gad*Mc}G=I66#K;$7ld)^$I;Pz3A$5}$tRleTz zbg58f>WOtk$Kt^CLBDq<2vJ^1RE@0oV@~D9UP=(v^G0jKwWt zsths#Cjs7>YW43a;P#t!nv^}C4U(==gTF$Kb%8^Y31nq|eb@7GJM#bdL403lAjpeC zx1hGz5V%HSrzQ-9n+sJ)PzdgaqGiiQXikSqF`9b}PFp!g7Bh!`B%)@P_vR+dF?Zc2 zf!IGX5tqaFpZ#OuNfmh>`FMHdMMLl*25Pim-tFM%K!^0>inoH=BtJ2h?qjS7-UXOz zf$^A&SgG5yo6jNHUy5C=I@49);T{qz-CCIWW_IiCX}9j!{QIsgOCJY|6c_Qkf3=Zc zd-X6GGk^*}EP^!`ky)`t`X|}U_eS31Arn=H9&&PWE-o(I1>w6fyD2Quq3;5dd1ETn z9A1QWm;^MCyKK>pJyA9JeYwwFvnBf&6Zl5I--f~kY@}`ucnOl~FXhj)gy-8B=c)Xn zi~5C%!Piw};nUUSsWNaebP;h$xs9C1Gs2b_9usFYc7ZR7Hw9ffHh@=k^n(gf zC4ew}ed;m2sc))bR@HkqD>*GEXT8pB@?<37nQJqAS1A3lba+UnGbA*U9j*r{Q51?K zX6WQ5LcpE^%xkv5+jo);m{g*STYao4_%qf9N- z0^|rX@aSad+OQZwWCEkI2xJ=Kx?=~e2ii5|m8}n2os;SdOtr^L)f5yIU&CiSPtd<$ zl969sdmanyj(hoLdMeq_llxh=oFu%R%uHK%-_2@qG~LMpe_qh4>+0${IGo>Ymz2rw z{+QadtEbfi^VMwxsf1h5IB7v7sehOdtLo5+-;pvLnztU&iGRjvzkiFs;ZO} z73ZT;F4aWPBjH3e@QvirB@`X&rN~;IG|HU2{h$CF2+Ta3oL57qVlM`BI0HFIdhq_V zNc#etuIZ;U++G}d{=&jQtXD>maw_7m5_(>7oLnsD@<#ZzX~%!{Qx)=ER;OQ8_Iz6`g^rbe-eYpGIkD}gun)p&bPel-YFGB0>+(%JL@It&&Xy>VW@(>g)ThAc;BgW z@PYyB-Jljg_MzxY4F8aQpk1J}P1m$JRp2M5X$inYHhpB&D7z|m)TB@GYG?C3D3DL6 zHQI#s?Eyy>g`+r)GoI2_pK072W9z`1pFgGLs|SbD0+Dodl^oyr)~MWBCc=K4d8)4 zK8DYOFe<>71pv@uGpG+N!z{(!&At!?ngrVL|3YDzT-MruQk@zfuY_6gKh>E|fY}|i ze|N3P7%;_N-MK~Fx}5tSlobE?DCB!ToAX2W87WY|-OV1{iG@mC6gV-g5p{I{(A}Mn zu>h*b4er^DLFNy%?N&h?r4;n-^TWwiH_~JmWFtFaWBe`V8 zmP6pf*LeQVO!6s4}kpqaeoMhGCNBwFV8>y zO)6%J;rR`>X(VAstCNN;14Nqdt;ypiS|Jk4Oh(?1bxogDTQhG*b?e}srZ4kHGu%=k z#`xOt^A|k@f2mb9y12`@H?*#o0yKpLlt2&oqVwYO`7A_0+6>P<|JS?k}Ot zRf4j^p~Z9GLAN|*(QkT{Y_o$h;3-Ttku6CU@0Bxzzz_djtjlOu*VlhJD61Om?>CQg zc6PoWk`b;yqGXa$#?~#iP$;d`Z7V7$sHb3n0G5=~&b$M=LIT(XfYNgi&3F90yqw?b z*6#D?&-V6b04;zOkycWwDk;%w_>xq)=;YUx{qH>4-rf!<4op#i{sM4ou}lBu`USB< zf`*zpO})iM+dWTQzWs`AVQm9Lkv$}jVSc})+D+95I^v>(_o6lU4YsqUR4F~vt{pYAR<}_ zGC#US_~zFbUG-?i$$^szHvx^NI@vOYZ8T4Omr#OeKuAml+gI-lgBOKRGB0?oODkS7UGdwn zEL9|B<~(nX+i!%n)itW($49Rx+3yDjU$l~)y{Kg3e@Yiy$duAxz3db)O=Q(zGXWUK z9gIl-@uUn4I$b{AqN1YUiB?ch0N&A?zl%n!_@K@Kha;=;FnWOb9>iCG7abnl>tfI; z^cbM~^%(rBHIW0C%LxtlO#*3m0Gi-0%t{QvprT&9%;r4*e7t!@Hs%1{Fc|%Y=)Cu* z@-rJ7TRts)xC3B!IeUCAr={QmdW_i{4sWboJ?FnSXe>}A1wRRL!s1)Au@uiPW}g6B z*#_8swzs#zG#M0IK$BVIo7I!~z6;hU;{+_j;T5nJ76Zp0KtB->5Ue){QfK$6F!Z`8 z=0x;1BnH`7C0=2T^d4o?y=v@GmyJx@a?7^kH)DGZJx5NdiGGxA6~`UeOyE}GLo2Zz z>{^+2J0)naV=4E1lO7>#!6V}sE-z)$?y!U(KNUqyV~C&VJFnFiTD)46yBFcvQ^ZQxOp-64!wVuNu_@H1<+<7_T=pBECh{IQAr6@U9OCZq9PhD zE{(QlC}C02UQqNruMXy*o_VcTn!%k=j;E@qj;C6*YCKwQ!o$X{ztA*~>N0J2Z9K0h zT?fPNd8bjZK3^f>%BORL?cSkY?7Hir!$xnJPG%q7JUFK=T9NSB<&wdZ=cpZR_-asF zx6N_tlbU0iXQ#}gE^q8Rv;aKZ_3y75;4A`cIObZc?MHH+ghyUsbXaBVt>6D%pO_aw z#ZFI4bKfsa;Y!02Xa6agE{$-dmTkw02$OnXH1Mj?d%MRWh1c8f=|X^HjrLTYqr0pb zy8?vPMlSll&hc$;57CN;BvyWXQXc#`u<%49cscT%&aj2HvSRT|DkX73+9a>3m*5?Z z@5_*n>+!=@<~JH`C+0Yu+0>XIX)D-z(=K%8##lk>b1s(!H&Ct7xFKl5r#~IP@dPn7teWD!n*- ztl`*ktS5Q=x zoRVTGrU^=*wRHto5j1Ekm{ZE`-Y$_m6UxLpUG7Z-cO@WA2Js8k;tPKM{0Tgo+To0d1$DRvvFEh^?JwCdpemXGw>T$qf20S0`r3^p2>coK8ADlRu@ zu=v~`j+#^f8GgBk(L#yyex`o7P9k_o`dbhd7M3;Fav0Xz9S{ixTruF5Hxh8km_*tW z6D+TO{~pR2ABfM)q=o!_I2^0;*tRU?yYyd%8};D^hd{x8$awSPXxaUM2LYD%>ovD6 zM^+cB3qpwg^Ti@(xeZCI>XsQDV`4&f$*1QlBDd=Y9Tl>;K#`aZHJ-nH6O)ldefap_ zmc&)4OX1!Iey4vW%%h0GPWpVVHjVc};?g(nn$vui5x{a4VQuTosbsyILNwrt%)&ZK zOKb7yoxg~;jE*KMA~A7Ylhni$JsY!BFO7mEjzQXzO%?umS*2yw22#st2^BcUZ4LjE za`Iz1?j4pWGMpH|tdy1GsAPci&85v7kXisE_vu;(N1god&ZMp0*IH)_pSeIhLVEfa z4#M}*AX}8AX~>ET>1%9kY_;>@JP4C@{pd6J5oAID+#ako+Cpvo&5p9+0@RDQhP!{5 z;#X}_sP^k71>25W4}Sy+4cRO4p9Ri`SsJsa0n1wRX-A;-h;Q;yS|C%RcA{*K`re@S z5`VBC@Yy$BeECNGmWJjZW)JckL5+`yii!#go9;{>Msm%#u&OxVkU;m#rv)ATrrqVi zoF%w(2IOxeCkUX;*^+?o=TbPT*Uw%zD&#Qn>8&yAj^@WMHG4}fzw`btHEiB3h-Ao$ z27jgu?*w2W;!yDKo~Cke6-%;pY?q>ceK@Xs(YTTzRO`rB zR@SF)gT2n?Wxmeha60{b*ri%fLr5;(XKAe+5#!`iF<`zx#4)K}T=cq_XqO`VvuDAK zBE7im0KS~Oym-HO?GdPuLgeIm2TtlLDl?$LfCF(Y2Hk!jbprrhpqX$7*bsw8IY{&Z z?McR47e66L)sQFPy+C9@^j5jX;n~)Zw_r|>!3NI{(>ef2TY-Lk$!(tP8T2~wRCiv2 zgQ>V6g6_#jwj?|76jAc^ZPVFM*yNPVboui@0^`cqEseZFvUa}M19TDGa zt757O8BU)^H;6vVQ|n$h#o(`*LOH-%!jpr(@UH9SK?s7ze<~c|J}@|#okxx30E#3o zHn!DDb4_b2FF85bJQ2Q51wUdlz5A*7;JK3RA?2;Dy#)GKd76Yy^woTbOPj88lC7n0n)ok;a+y{keqd~k}S61(?>GTDSU$+ z{{tysZyD}<4_zpA+qd^s-M4?~-q}qMt;;_h8n>CPKg3kD-0S;BO{)+Xv2`5#LI$u% zSbkmqrYK0M^bS$oB zJ%!6(N+E-~#q#$8v+ELW$py}^D4NIh^?XA?Cr2W6NI1x!-MX5bOZ2>t=Kf=E{1*U` z4bEDivwnSge^|AAbPcT2H*20%wYBFrT`x}ra?=zqfMx-1>Lqti08oSW6D&kB_^<0H zER2kQ!BsXi+yoYP6D_b;F5G3}_=*k}O#my03akh`TtGb4-26OPkJdc)#3_l1^(JG< z0J&^70=d)mS7H$66gf0*cc+$5Z+4Wlr!9=NDyyo%h6~7mI1??~XtS{#Hc7gMMXQ(F zAt5#OD64tkrwh+#9dyd5=elj`5(tq@*U-+IPgO5H80xCWmn{+8{=&u*G2jq<5}^XT zWAJp0jF%oAOKw=ma91#9Orz@*VmXtVT3Q5nc-)4)uw`?E@UWLm-SYtWwbH)&S7y_q zBvBbxX}sLX%yHbJ1G$Woi4pXchpbpHprx*Ky&(oaQA0)d*xgwX{Yt;E8ve;<(HqX; zIhBEQlXmgi$)U|f$4VMWLkj5&SDI7i$2)yK>fP%?f`v|xGc*g?2I!#2yUXZ-!8|V} z@&*UbX||T|xjW;5B+UT+KDyG=ef*n#2<3X#oDg%ZpS9)!!Lk^(ug}?LLdK>D!X}Bn zt?#{WV8=U^aG{V;mq5c$3g475bse3I ztgMPO31c%8G<+VAFRYO9wI{b|o><7o>)(Q%6EPdp9}^vF%d8x}cje7GdP&mR(%02J zy0}Y!>8xc0ZLi~SEO|Ut7Saod9t!Ehz{6W8(`1RZFj^ zRnQ63!;d~fL3gbz2gPvEwTyD{7C*gh)z`L>z6YL3M#KT#2ARrto{zH*yNbIz68GO{ zp2}C}=4z4&23+yizh+nZD#v}(NH~*SR-59ta=_ru!$j}Ju$KFlhjZ{+s?Tt>E-iRr z*PD0V*2V>vlIaQCP7$JbJ*K2baE6^Z$r&meT89Q5y1RWT6}Sg`(ncEk&yy#!w3 z;o3})(N|}t^u&0uc+NscCnGIAwbM(JAcH8K?w+&`g!xJca9#pR%c9ZxP3+4A_qx@? zA5(Adr#G%E)0_9xQ85{BW#S8-F5}|N#(Y790uWIuN=s#>r9b2W19{G5aS3~1Y-VQW z*RNk24_~a7>*fWQ&7DJeOv;C(()pTFQ+BlTv(AUZ85wFpKMP#BjpvJ8od^cNe!o<* zd#%|3lpl5V_2RI!z8jUWg&O#Q<6TisGT<8!n#Q_<)uC*K!(!5fnijO4F^ zApm+Mq;XioLiNO^rm`-WjuNc%r*KdDu&*Zb3X=WyOZTBb+rbx9bEUD!-+Ym1i#(jj zIDvj5`j)eBFtNcgANq)*B>ioxb++8Il?TuA$aldJIrLL?1hMI5q-Ck46F+&NpLq=N z5Kx@Jp`fJX?BQ|gTjMqaWFKmvJv=>M|GVft2G!NocEFPgSSap{32ooJJ9i>h1L2dk z4r-YL)|Veyd{z2gdf4I z3Cb>zR{PKU$0;G$&ZL9;GsMSt0|_9gMB*AxAw5y>3n#+gwGKW$KAm@2qFZP36oB%os<(mt0|P*; z7H>5<#P=0J=O>v2hodX4mPVDToC9#NKpetCao?NRE}5tLP@$XqJE+r(-N}Dn+{dR= zZ};fWI+VD-#YdnDOeH9d}I>shu{!=Gn95Kk_C z&luk6l;@y6j=ng1fs_2h<^H#lQnRrxn0TkZI_5C84ce1@ld+oD7d=y-YhVL$-`;&LsChz|o?rTCULWeE^^QNH-gbT+u_CMnj+}x; z-V#mkVtgH{gc(-P5oh*0*JN5(BgOiqR5(0`_tR@epd+q>UwdGUb!c_xDjbib9FFTV z>R6QqZ!sBXINYOM_miegT<9p+EvcA3$;7s}oN9g#O2&r90QQU>{DFqc<<$`8x~ZQ{X93On`fQ zhI@`@`m2f{BtTU`0RawrVs@AcKDL-)@Ykhuf zgkE^DUzj}XcI2m`RP~E2qPcBY!jvCF&LV5PAFc=b`$29VB#^BY`_`koUG2(`O0U+Di3@X>EF@(j*-C?HvLe|k)@>eQ2bG|!=*hd#2ssIG z(Cvo<$v8e^REjvZ3cLBU&8Kq}_$KFtXfVE+L_}k=-m#VZ*gnK%MTg|amNz@T9*M4K zy=*tUO04wCF@{+;@QYbXpP|ykar`K%dbwjY?yZ=7#$ASJ#LZqX)3%SS65QwFACJyn zx1(q$C9CT!>n3BvJo|vBIb^zyy-?cjZk;RMmY&#oOyLfHLD>9uIYy3KQ;lWeg|9;9 zq^cYE!{IUTlwO?^Eu1MD@!l7+<{Zx3t=Zra>JFok4EOkc z_cPuhmgX8KYbE>MRjrs~P4g&pjMW!B-flw(P2|)9dL}}`?%!^6kOgJCh-XZH-S?^m zTu6=*>IOg$(mq&h(iQp(lc|hMy;VV33Kk^s^Rx8eJrLax<3+g~Xn?1@+9aWwfzbAnd>d5mHeaXUhYED&_IZp_J=Q@gx?HNuRL)~W zEVS=4XGdc! zHu=>edATI0(|iPY)}qouwgi?j4)>eNk4!hM;J9V~JSQhNH+71cN1{@2*>;eREIrre zs!?=#Fl#b}GkCQA*S^-Sm5y2l_Uqf|tb8>c0>_;1CX)c6A zwk37kdn0RW>rdqqrZt00M?jqeANB}gTy0OGK$@yHjI06dl(biBu?GIgkxT2UV$5BN5su$XqjIy?pj#OP-=55#H{}!r{d6MAd+nK1eKIz$ip4h8AX} z-9KNr!-hmE4^3B;HNJ6q)uW>lBA>Y^6lLq{KH2D#f188*41H-TQarou)GDg*_*egi zM^~|UY%7I#m`t`Jb`3LE!~5|vu}3TfpzvO&-JOm%?hSf6w)jgc?NC(;s_>UXq~v_h2f&bzs#a(K7l+(i*CSp= zm`J%cFDqiS!PM*jq3N8X#RF>=HlFY&fd@dJX|nBiY2>Gi|Ri-v*XAWeSe?we<`9Ef`V_Wpo{VJHV1@J zHW*VO!a`wDi|5a{&rcwP{Lp1U1+GJi!hpeJhuy*M>fxrodi)I)LXEDYo2RE9sZVxi zG?AabcXf-mYk3TH)rfu2_FP^SvjxXJOa>V4Jbt2^OzmJ&e;Jt_SD=6Vm)`7_#*>vS z;?k>*Yi^DDF^gS2zQ$GhyjZKxq|-u{)ZeRmMJaC>U|}#ajw|ACq?a~ZY0GetB}XWjj}b2eS4OnMDQ(l1X(U%R8sO#y z&W~hE)%!Y_MEzS34K2sA{zue%=OC(KU8vgu+p)_R-GO_Rt8LV)eRD(sH%@)mMXlOP z4FJH3ZF?)eVM@*zu@Wk<0ivY}HXOhZx59kdRdYi0Y7W3QjI!^1+KfL+Gh|RnP92x+ zA~CN4!q1s&z&CO7LE49QK>+(J^1TLs`(YvAx}}g+_gkr7Lt!*zS=#qA2T6sPdC&b) zMkumuUN4mi5>~RALSEY}n;$Tu5z8O9Irbol8xf{={B|0AG>$g~dV&mMN`YAWHUK(G*@r(d6XPX*-m*9B z1~Za5*U7vKzjUMa`l6`4qXspT_2N;ts@-Gu8e#)8@hygyfWv1tY$lX_0+4w3OEH7B zt<=hl1}cA^Ek8OD04Iuq0bgv;7s-5K2kW=h;WRdH*>xLSBRUeL`qov`0^MC(ZE)^7 zc9$FYus9E%B|mmP+}Xc%eY^>QKVSG>>6&ARZ%;?5mVDfRV6H?sxI{!g7jZ?lny=P; zZ{NV7*Qc098hG;HNbINklQ}Sj3A~Sw8<8=6K=4&2u4C)Nz!UBi$aJggDWH9OK=_4c zYVC-EEKCg;=(u$R6wDvN=R+nlF~MrPN0rcY`*xE&TK6y8;kO!B13;XJaWboxpf$ZQqFG@;E)7LpdC3$-= z-dQ`^Xvd4%O4gMHHHW5p5h9zX-I$1?|KN_~j3@Zj!dD|<2gW!t>p#Gz6 z=aHvL=y_+yltdRi8Ygqv2JyTA-;?PUDt@73nodqscr40MRTzzb;aR_~VC$PTkpxgB zkB&n^c>yLVbv<%RkM?{OvbhS#`pyL#9ZhA4(M&3S&}&}l)?P%!W%%fSR1i9(ud{4W zETmPv1f<2~yLwzsvn5%svzlsEd(o?3EbEi3EFA|^pV24$H!ITg^L?e3S6SM82`#~X zfF@&rU}A5z1O|vp#f_jt0Ov5F^(wjqAh#1wG*QPD<<8fS+H{9>gJutG6&vahanh2u zSgI|7?*SkeRqy#~J#9pzWv-Ta1D93XG)k+3596{&rADwrv z$m3TeW6jdnw2j|eO^Xd-{hs^hKL+BMmw%LVL7m(eCt|8WgwkuK<@GB7;)5_VH+^pt zR6T*WPL6gyx5fB(%hyK^K;$i8$7uvoe1*K+q0pz9>?JX((naS#t9yAzDdxjV@VQnHz|I?<0#Z;Y^Tt zfYNe)aQPrO-*9-q=Y6{mj+03$Bd0_Lvss{pO}C70BPC}38mJaL|4S7GYik>Wr&0X zMAAbkyBCKRRwAK)v$E?6p|lnDxoF+$d_AD#@oxn$nsR_`w#aZ!9mCEYJu-k;T(2Bl zUJ<92_s(h*&MO`Nt*AF<-%F9Wbt_?;K$A%w15PI*>7Y&2slb<}kUAJ!!z|zxs^LUy zRho_A>$#5SzhURY^N{-sFcx++V!nlnIW%equ-@)Ia1NcTgb1FIu?v2T(7*+V z9B=1-{t5>klTx}$M0EIugf(A6)I=mP_}ncn&Pgb9;vwtxt3N3~{*{iGQNsVi8f!I@ zC9~e$F7RovjG&T71ArRRRY}B*N6Snla_s%>E*~tiuC=@X&~w>?N)ux9kYCx;*8k3Q zi<(_BLlV-nJ(|K`IiCJ^BeXE7yqrO^3j71FEQQ!9xLyg)$lsNFB$P&FnnBWT8*NEaq6!!GGG^ddqyOG_ z+b}5-`PsU&Mvd-7q;qp64j6x-95Vc4i<%1Ao$#5K`uwPu_+5bYEDAqS5m>%6EJe@wR6MbQ|q^PhQc&@M8*h5SfLm zRC@^lj5wa(16KARM0tDfh=Rtw>apOTzrqH=ZuI2QLjZQXn|1?XHy=<)-p_mopuUs( zxdvf=7p#WtHqYiuV-Teyua#{6yu4|w7IL4fghPD{xH=6Myn^X2uoj<=n{0R<4n6YT zG-8!NVNKwuERM5UeU|k?%|(OMOEo@%H>OAUB0`{>kMS+<)h}qK+c}I44N_EtKyRCK zhvoQAK*1_^s@daWwYRr-xC0Dm1@j5O@9`>tH9etH3&Br_?+>-RkZWDHMy>MM!rdP) zB&d#9UepBJ;KzVKewnLj<#!H3lipj28|8P@IL8>X?%Au+t(db-s(@*(X51_TLCcpB z^R4p>p)yotZh;>c3<4)&|F8kuBF^0iqO48qKK&2)0R!+GGnJ38AH)lN;ndRMnMmLA z$!v(XM<(P^$!J8HlXMu+0UZ-|+gLm`9upZ%Y_<+9{-p7;5wsDIN&pIsgd=ZK01vw4 z4B0in%K%L>0dPsi76F?>xg!%x2_Vl$`zL^W-x~N{V?c8_36tmbRXKVGUX(ZINHP{q zY$l`jAG37a`=V&W-hGds_@VWPWvNO=?F+*C$bHMcqh&8Oy=(WvYn@g}T) z)YR>(^0>$cwF<371iO@hn1g2tOuK<<;J4Kg%od8x-!sh+nT}E`QRI&Bt~Wa+p?J5K zbh~cg^~L~Ph5lrlY1CoB0U!|$*MrT9F~f#;^EQ#PXb6Rb-|zazA87>wVRoo^&5pax zQ&36P zyTo(L$v17uu#13X&H2^=_tScV@O zic9yVdHgUx@9x`52?59 z!<|t7;tPvb4FJ6&AX%k(&7S>FRqG+ah33m~K^&EAola%Q^z~2HL2mn1EP+eo0%fD_ zma4%%_t6hbcD%7msz-TjpwM=K;Egw^1nB1gW`Oetev9~D-c_xLPv3R=IoX=(b664; zU?jRnSUv><4!g+1|Bj2J3F9R~X)auyxNgsC3R8<3fZPU8)xM)i3>!GIGBC&=Rny9O zd)wRnqxH@HZT%;NOifMgxVdc2uBot)>RSZk7#I!q=g*(8c(8V?zh6Q=S~6|u!UN3C zx4s42Cfc+cw!MSJZ&g)_XwX7iq+J04!O!3Y-I^nixKjCgIkTE65zgQtbB51HuduUD zrxWCO_3yD)_@qg@)705y$di<5jUhb9==vKFVj;=m*{; zmuYRy=z!5;>p4?)b#UV5>M)?C^D^fL68p z_jUV$jWuTvIaw}5maKfl>RvuEpB7e`6Rap`&O|e**P$ySiA&q#tytK7^a3pZTNEWj zOEwQa0y{4Zota02qey7odk>NMw4;$!Ix!u{vWO8D^lz0oNPy-c%vq7-z0WoCWrq4q zzT0&x$~?YBXzOb@xn6FIwl0j7N%xMqlXYO=Czwn_$;PAx9eU~0`qJ!*1Ag>>DW$Gx zJb^A}%NfrV0V0T|9)Jxsl?$Z6>Yj@&aI*6Xs3a$cAz6!HH&?81BN;dU+Ttt}J;Jtr z1V@#FHkdBA(xR6{Rqu%Mdck(SU!rtszDWD`XnO2+R$>z9I-)849uujiqmz-7vng2J zG`fWd)#;0`K&-{x7L?BX!?2Mn>#a5NjVJzB2ynvh6RfCqW*Zmrcrv!C_f~BsAvL7Zm zVsC9*cmgOBE0I3@d#lm@2ab&C^DXO39lSQ|IHp5;(H8#sUBk@Zu*fm3H|fkywyfu`Ky z`Kq7eC4;(%3RC)R8mshL>%iF&aGJYDr;FMctV^y)fGB8xMwXL2#*qHiiXy5?ih63eywLC z)UB(0huObZsh2MO{YB}J7)4T>(HTNxi$tk=vvqJ^PK0iJ%x}_s)dr2wIueuLD)9gO z^BZYGl(7482a8Gc)}_5E!i=%*gM11P^U(FAwH!>eQIRKy4hI6B{# ztF-&2wl;w>tZXZ6ruW7MA$7eA)Sk5>xMCC&gTjg%)({XX-lzDhm{y`3DS38SJ&P0| za=+`Lkv0R(_(xp zm3v6B_n#*Z)8ehmlW201*oQ|7?5QQn3?%DDkKOAgAdNDOULX?wG2wZUkX!sk{_o$| zIugpN<58#rhxWt$MM=VUo^>H6S!lA0SDQ_->XBsU5q;I&cTVobAGO<{i?pd0E|wmE zI!sn(Dx<*Z4m&t3l#&LPigu;zrV3ij{o}Pa;pLTX`)Pv{fDI;sp>2|5*djh+&p&?`dSdzSe zTq0z(vdO5z~Svd>?vP`0ISv>#d5xXBpxZ^%<0#&wY@y8U+@i}JG;X%y_E-z>Uz z{`gWI_U=k1s32Y+4R4vTYgcM)d>74C-RH85)= zx%BK?n2ZtIe@$MT%ogS`1Azu*91T_dLSdf;LmuXW3@AuuQzShdZE_d`OV^CIG8(^@ z;FD@LnZESun|D&LyRCGugDT|krwEa2XA>&7lCvW5`MFt|90rbT7tZCSP`~5QNv;kQ z+&vdLe$4sKM3-Sor3AK_>Nbx<27ET3#d+b2*K=UzkC^P3mX2T{CFgp~)xiC|t;^_w zI`>=2+4JXsQ|N3zOZZ~QxM}9la=!$09lH5Pp7ws&MM8)(A#h%chin0eMjxfcdoLNy z9*%BIFU{|rHtmHcdbupvgJ5>CvxvqQeVL>r@d2Bie2H2jdElz0qoLaG%TO8ZJvF_1 zjq5*)?U%(0oP4GQoy)4C$SgBx7TSzO`N=$eF>KElFn=lARxc+&{xxiCdLP20c|hnl zqG$Aw9ew3MRZOp>Gm!{B zON+*xfX7Fz#B3NFu_&1hg;u||tRKmAOOg6&Cp#rEnvy02DhWSbhz^C-P|%xz6cbf= zSQ#iFqh8fDcwxJ}<;I`|p#~5ek+v=^WHv-2i{@Km$IN!_&FCG2(`SE)oo^&{q_w>UpwGSoD4f&~)PFMdVEwzk79?$zaJ75LPl6S9nGD)V z`<^Ov1LDmp<+&P{48LMYpxR<4Q+w8bP+f>_zWDVVI2H)GQ#6tJU8DGuB=dW>5Wl%oG=kCcY2`E&`3ot9 z)z$x~)H$#0?7=KWU#6rq6jezr7^qTHc3{h&`f;61xr$@wXKRdf-mu33Q#bgmvueN^7(l9VF#Av9ifCJw^i$@%7Cghk? zxC<|E()t%TVjg}tnfU7h_a7Di@ONNI`(EE>eJ*DKJ3TnuL#8AX+_CPQMv4|!v zSIVO8sC%8O#HenCe_$|@Vv3_GKc9k&t3tjf4{Iq_pJpHS=G(gB1>G0qb~BgLO`v0$ zl*{Muw340qV*kWW)qieQSLoppdZJ%o_ni=;YqL#kJ+7)!2Z->=qE*Tvzdxj@t5KEc zyS+6+?FiO1|3cJ&4Xu3~K1~@Jp&T49f7?z8Q92J&Dc_ zE0Edi@5oTGK#6tlSN0R48xZw)2PX$?ca1LTaobJQm0Z>i)lzN2dzlZGO?7g=yws$NQVHQ8cmsi}^b?=HUA4F&;qlA$Vbn z*iEbLOUvo(j3xxYuf&7c<=DL+H##exPmyEr=|aaNoh>IVf&08oIvgUX-EYZ~!DBQi znDPf-PVKC_;dx}X@N-)xF{z(+*)OnJ=xs6i2?b!m+wDXc4vGS@-^L!RX8_1>1=>R>hB>;O?6z?Ym3~F>>MkwimjM&8xOZ%QfFPZwhci=lBnUrdO{&klDQswRi_o|2(TkMmMtad{b;CKW9HVKPv5(Yi z2%x~Rz|igJ$E(d2s%oyXpTG^TF9vjvj7}#qtB6P-ILr+Ni!37#=KbE$>hqfXb->Vh z!V_j%npVVvA`erMlA#rj6p`-e#+#eO;pF)i)y-8m^-{gp2?u;rlBL9q;J)edCu~lN z5PJeL2V#9v_IpMnhlpwq>qxl1jG+-|*luswvD&m$IY1O((=CDvl?+r}cg+3(qu}4Ki%WA4{_{ zs`;xHG%G9`Z6Zw`Mh}`PnrLrl3BffiR*w}YBBUrh5=jPb7>^D!M zhC>{)K}2E8O8Wj4uDH#MqiU~Hy+|Q8MP8O$J=TtD1pU5}F zc^n3?Ejtlc;0brkW!4C?I*`bfau^+aDO|&jCw95{+=A?QMaX1-X>gZ=A_&qj;uy zIr{YuU5^tRD1)L!1*9UMnH82;TV5Njm{!luWGd8Ar3r z;hW|~gEh6*OZ7>E*jq1C^ss{&HcJy4uo5JBvY18abQ=DF0b2`UBY5)B@#nHYrUI&?RG&+x}v0F5|(Ckk4{e~s^lfBkv14ydvwPpNi*oJTk)gD{Y z65{YNJs>lTuQM4pt@L57WBlo9a|BrykX1Fo%Wz64HCAIT5Gce$}P}~bN^RD3d zk2g`|u4ss+h*TH2MITmtz4Kd8(b2G$So9#|0nV|dJp5<;;5$U5lo!q_3mh~X3@agm zY3hmNyK6`~!R|T%Ni;-{IH}?1uHb9N0% zdGqs@^w0}#>tp}HyUuW&m3>sFzxk_@s^4~Z-_oY0z(die-j?PNkBc5ASYdMVF9O#~ z84Wtvl4wdIV8>%>SWh>I1HqzV#Exst#58I4YgyR_9H0R2@?7By)Nt8?<2_9nn#<4{ zq3(nV-$RdS5(0Tx{M(j6WxXOanf)73OnsW?Bdyb?xSWxbVTt+uG1t%Yk#s5bH6>~6qaO8(3;PF97Q??yp1W5Ff#l2R*MUF-n3>$7USXy zJ&$7oJ5LT_;Do?A_>0^v{r~+#@z3YMk>#GBpTa0DMVQ)w4D?A`+ckMw9RCgH*JK~j|*SZLs@m9=Z z)F#Pg?m{ou+30LId)3xUuklg|oqL7Dxr&!#?+p(%wUzbk-w7nPTh!1b_lC-+VcG5~ zInSADk^l>{Cwcb6&5zUGlFN+rk1-PK`!fDHkCXJz^mYny<#$Dzpn%T0jzmPr5z@3Z zR4rBXbC*3@zkAS|l0m)Q@)b$T(<~8EMAI7pExs+=HE#FDGxrwAeQ|IgFCQS(0G5de z$N7%EIezKdn=B)Jcm3Eh)Z%@9kcBAm9kTq~sqV6O*&WJd0Ye?kL#swCGDMSm-2d%5 zwSBXm2#?zYJ~x1V(HKlh+jldgS+0TtecloopRx$AUY2k(rG;4!^ASw90zqqHJi9t)QxFPIrXPm$LZ6NmZ-Eul* z35N<=_-#*BV145%@Md%SR`au|lOm6Py!GU-<;NfXmlI2*3dc{-7%3`&S6}>0Q=CVV zSiJ-Bn!0LeKEFb8zMJBF&KSU4+u>vPO9AzFuvD)cT%>fP319|DFEYW^JjYm)yyfy7 zLLP82fssT-NCrJfpRT$*nMPwI58;~9lP^;``jrUgbGsCoWot=W?M;)u#*>{%?EL~w z3%TKSpKf$`$p=9g$ipt+5=zNbIzTxs;$Hxxg)q1~4+HrJ#VSPcs5LPADL0c@q3?vN zT1e2pr%H#93=S%Cu*7V_vfC(h&UE||*3O`I&yAIKj2-H{e#^(=yhVFJKX}xX#vkzk zLNd^6H-m0TpNF{n#5Bbvo?TSkj4zKB7D?Uw=(m2!jP>q09mv=yEKS{_uxfuH2}*sXS}(|Dacd@k5e^~Izn)vx2SB* zE1jVBw#e#-p|FM2b0MXxszvCbP!rQ;-mJBi}#^#DaO{!IuMabr)Mi}C`mGA&Df1-MKd_fFP<~40Y zRw_59BsagaZ`-L7F)5Wst9}0*`eP8%I+|~4L-Nn>G{1a1z0lNs=zT~GHSqsoT#yAiB@JG6AXwR5I$8>TD~~LK>rtjm%?QjE~wW9UNqJm zRxf?{%9m7Jr6<>0+kcgyty4+`ltLJa#wueWf{Vg?0DwdqGJLXSI{;QW;y9cx&e64| z&pUut-CUd8ss=qYpB)fQU)Kxp@foQm{jfa!x}-!hZNK+{ILNE5;V)`aH?wmqZUM;a zWq<)aC|1s@{Q$_){iYLY|D^UzW~#4eRA&X0Gs5()3ciTBWq>co+mqtimOy2ofz9Wp zbwYt+a{hf1^?zk1AQg!e6U(Cf$Sew%uM3e3-LIb9>g}|Sb}zAif`~MSL;N%(2DCt1rUr?CIK0&}HOGBR3I1yRc?) zv=L2s7&C@bj%p|1L~rJF2#c|6I;jftP6aMC*4Dt1Ou*Jw$I@2D?^a70Bk&bRQDpHx z-TN}s(Y2~T+F5hW>0+@SuhDFKaTrRYw6JK!!$aV$tzjmqtTv$A=214p{braO$p1N} zbTkEY4Eq8nyro$^Ob-+52W;xsZ*>I;lO5G@8vM0TWBxpp@!tR=*#TJhBgy9209AEu z4O*yza+?}U$P}c*e?ltifv?NIU)xThy1UCLVGn=sbVCYDs)vdJu!rP3A+(FIj3V>3 zRO*8$w<_sx7Or%fdSm9vS70TJkn_YO$um?<)s?X&HL&zQeyo(0OM0DEKzz?(=bsRT zfbJksSH>6hPy9z4$tIR`QSW&4IaPnhITGV+&7HT}<4MeGXOw$s(Yqfs8gv?2M_?#w z$}kowIypf;gl|33%<|It(D?8hKE`JL%9$CokJ1YfWHFZavnQRa>8-{YHP@X)ZeSOc z`@YjhE>(7=%c$!rUpCFW@oG7^q-&K4q3PMoma?OyZIx8W<61r+B@l)>G}zR#1-a%$ z7n}~_w$(ksj0=3SN$ZXFg#c7LxPz*A?#B|Mf5!tv)1RO8r@o)2iB`d}x;%EgEV)Ci zO97-?~reFQDVrdbTH-s=uz9j5gpehl#X(oAHeW7LfgnZ;MNB(LvM_+h}swSWZCc zd0E<~_w~{hU^wgceh)Z`?<-ppSQ!BNYk$B3bg6_v1|+;Q;SFXF06%f}!F1 zJ93s~5?!m4dZSzI!d)Gotd920@&J>;>A80^t@TU;(_KI|s#llyOV01Oz|ybLUdMf{ zQ{QD_$%y^EEv|-ee&#P}1`5@POJC;S&ry6EUc2h>Z`!oNVb;@1<)1`{mhOgvW!^PH zF%3XWVXqLyMDh0-V`^?lD+8}0>#Uj@g~k%r9q=tOE6wBgtDYEwjAG+>Tgzk|nsq}) za2#!y1kaD;{`37h-gS9fp=XglVxKvMMMaeo%rEfpb8Rfc^)parO^tu+&W7edrmaDWABNbXc--czI^%L5k70+K$76yvU?OCQrmo(7% z+DiNG`M)J-4x4hInURBZrH7ZOIy?(2Y`Gl!9y|*zBc53pTQO@nthrN|Ywk3!N}tRmmV8i?5R0OwJ=tc&eivFH=!9Z8yG20YcMM2q7#@}ECx&X)G3^|pMAt*RDa*n%%#=X8*s1Hu z`PkEg0(r%ctG?(KdF-*yFtf=kZ{h*ewt~2$l{_w!AbWXb+9pRyd8aE;6W^ml&z~l~ zmbC+|xt1t8N`(GJc+Bga6e|dlQ1Cen`mbaAXc(FDrC} zOY!6{Z1`@`YRew>Fi{q=dmkowG~}^5GQ8rPuT=cMtob9z>$pD5#+!(-NaXPa1QoxG z8{{@xWB|?Ij(abnwqkV>Ajlj*Jp*%)En#{PKX5-9C9+!_uVh$g047sGEOFKA{8YPX zo)w)8qrt1Qh^z8+cPG_8+r2y9I95e?+fV{z+uq;P-M-@u9zRs|L?QOntqT*PLHF>* zQ^7llD{$KLbd^`7Am z3U-huXe_&4O|4ONSUV{%G5R0WcpJv~guCWw8&*`7&iqM>YZdZQ#FM8ri2-JA`pYZ0JWr5CEVtRl_)T ziXQ~gb3wX*35kQ;@~fSkUkngI#7{rJREASi*_xR3PArDjtY{9gocnrWo$LtXldRmo z1rG>=K!b({k>ZbNd6;Q<`syyDzFptt;qqj^`;A*MXXUtx+SppqdHw{DpLAW9%qq7p z0`c$@2uS_&ofHD2ID`e2a8Vx_WaQ+0_EWC~A>8;^?`2TCIjJ1ef!jIP6R6{D0KaEA zq%AdsN(Fdmcv3!2_czpa>*wLWVamuu&;^!1G)LJz8gj6ggJxX2L>`d)&>*W!2Tt7q zMwF!m4;C}p8c@;5egjGa_5x1uy`GF?b#_c>`25BpdL_P~2Oex8vqND_ZHKmBmDLdZ z@LzHjhapSn@cU%jJJ7LcF z(BkPtY&DPowaUp~R;SGciqa5z@}|ok+g!ZR5iJHOoa~|q8B|RC^jIFGq`xEfg;aUI zyHG4-?$uN9RM~1tQ2ROrK=y_lqK@k0=3&i!#l?9UBy$<7$mvbYLOMVZ@=In1P;Fn_ zkNZ;W?|7fWBO%#3V&?FXcpOoW)tMS1VXPt!b>W!R`u0yh*y$H_DfUe-MCX{{CC(%< z+TazZmMtBh=yc|o+&4BTj-56}cO`70jIE(07q~uFMw4ECO^~5_yj9SoWu^)rPI+S> z0v-J651}oRph$Sr|Gr#jlZXqLYYI(>Lh__a?CZ?>it)SiC_V~-&~+(1D!3gOaC-JN zO@<1?Jf7NkjOf$SXAJ^;7N;nKr)_jGI<26Ju+<$VV{shK{e<=w$c!ar;Rp$T0mj&& zXM)YOLtJP35yPOhg3Mtc;ojN|V`u)V@-)%QXHd}T(57x!u0hDoqK%m`*$I#_@Znq2 z{CR1DO8mF@&E$&8x44;DP}PZqd#x?^*HQH_*i8CGcp~X&hOsKKowt#5tFH#KPDfMK zl7S4bPlZ227a9(-80LbpdlkOL-MNxeZ=C?Y&le73EQ`@zAfE5{%SDDDxWz?F&&{rz zYD4rPqLMBFxGH6bH1=<0&UgN6wIn2OzY>DBm9!S6s+Z0ldG?ws172T4#6WYjGD^9RjiG+k?O61eecWt;2+~&CdDY~kXp*a=UeEa)@3gfo~ z#czrHr8DUm0(DKz5{-(rHBs<4NOGEt-I=}sf<=F5XlQ`#^putVF4%x&8uoT}5)?Ce zVxgP_3SetoP?DG3^jF;3rrdyzZ%7vjxc^h60@(lIbC$J-R8L4>+AQ0+O||!0FQVd zv1?_l7Gvs&nM&DwPmdUFgVvPhrCtjKCmS1aYf|< zb+&)NV@Zbka^x#%o7I1peHFsi&Kf)|X`X&@dW{WiYxiGN4zQX01OrGC3$++=;GrjY zB31bCZ%*?hk%avOlvCd0qU8WVRs1Ym0i&cWRbZ1X#aTxDTLajQ-hn~*Pzud&+0HSA z93uC>>))gsHGC}$45ruJ?i^%{5A%1NnbXP}zgiv+KzF8zL;dvi`?gE*bfBh58bK2M zPqheOr5m^MIksTasLg=>G)aQ78xPa2F4}u}4)uwgg#F*k@F^|}(SGD+H9fCkotl^! zeIBW=iQiy!YJ**X(q!#GT4!AF;&~T(tTIag@*VOd~f_~js61I-sfS1SMVsJYbQ_8!uV93 zJeL(VnYUJx)h7M*1jlM0u-;n(=>o-Q*bo#-eCtUCCH98H!Y`>mAv$PO{U}2|CbmFbK)Ni)Jj-e>b-gn-qpw;}Sb`O#+eOtLf z)M#ftruAhFnDCO{=e%M<1O6SFTw@ZQwinm+tO* zkv#5YGL>wZ+9+{aN{ajG{Kz+=+xs?bK-aBHtZJDWz0m;=4Gj}XITTslUPwAWGY$*) z&U2L)bmbGynN9HYbggRWeq-D9i98m2_xwpI92x<-usf?wA5E9}l6tgF8S!_R@`}BW z@;Qr_fp|hxW<=#peV0;2_@G}a5~@sSd>*?Jt%|rLAF27$9D%mwv5(aC-m6h4qX|9L zi=q*2y?x=#i{0i{HMz-En60f)fcw)VAXE_Z(fdUnx<2w0B7b+2D=@*o=#-Mi!BE6` zKT^rc5zhZ*pwW_uOomD$U;?v}l~fH)9)jxyb(*=O+)`CJ;Gr zy?<7=*BF&n4vT>nQ2A7SUw9Lwo4$f!6PQLf6hU?6^pV9@<-6y_KaCmU{RGt*lVf7U zwZI6!O`;P@Xl+@@VtPYCFFT@McH7Sfsi3%YY6ff3OCdmnP6z1cN%rL+YMk^BcF~-7 z7lvIACB$QQ{sa2y1XwbUd)RWD3Wz^nD~Vrwt748=$>=*o+yFrTVR|%A%?B7j=l=cQ zD6Uw2xKcma**vpDO8tpEtPe||y(k;sZ{hBqPP?iGaq<4B1vdPRvQJ|Kl zh4HQlj2#$|<2$_7Ar-s{K=dX=xh9%B8$AB^>dEbhfiyxY1&H#w-1MYe!u}-m9>+%f zRxO+M`1Pm~`9{~p;cyT-d0{3#=DVDPOS*)~XRfWj`ss5z7FSqKg6v=UU%s-`#R)hK z9;L2^0|WlTex>;?jgGkDFyR@$rO$gX$Ppp z525v-jP?PYZsThtrdBKZEujC?il^?R+WM6wsi>!i=jv#TFLT=U*tYivq?UDV zu{c~GrKz`fYehxHiN+nu7qZ+f2@~n_dZ`K+C*w*f?8e*ib*7Y*+m(6@psJd)Ny?!$i(7cEu_wE=}J-Cl;g2jMJ6R!f|M)b-1pZi$7KX+(pl7txL463S)LDM6$9=TCZ`y>=RF={Ty>rV&%s$Xct zbnE)eWBTAHuvYp_oRP||-&3X!KT@Ic?so@24fd;&vs!-OZ0{f*14=&7*+8FqT{{w! ze+$ez4PAd$CWSJUa~?6Ld5~_y=2e}?B~s|ee5jlHFjxQTw6UhIqr;Hg`W<-Xd!**G zS{-Q6sxjWosYF_Y8^~XFAz<-?rtN+=mh%2=&%i6F(!E%MWEL-D{LOeS71JBu*Y`s{ zo5U%yyGg*a!|2qYdp%+cSCfv=Pa6~TQ`UFmkH~-Rhv|dSdz4Hy> z(iB7^-`05-^m51bs3?F3)qchMR4S!OO8kT%E?UD-d8_4*FT>GmOh;lyDto8j`ToIL zk$PeAFWotlF&2ax>e47zY}mmmefQdiqMy=Ff47(LXNDpne!u{`IF2MXK)r@5L`8VO z%8?uaRSHyqw{zvU+EiT>Zj<=eSZRQRe92g@aOwoDr5~~ zg&Mu?+9vz}j#)O7fu98Y0DEhqqfw5>d9l@B(RXpGWpKIJvAY}8tZ0_oiZeSh zg7a&JJy%n_&2S~)?sW=ZlRy0NF)EYsbtk-!4|qB8k`i@b)a3Qu)8liq9su_0o%Swh z*B-_i-xw=V%3(dfYji&o*fFm+64Vg=Qe!kUa+2-fFUWhF^wBq0@FpZmf$|eMWy2pf48yXkCw7*)= z(v*k#kJ)lz4~eRT==X6zy{`nzq?l?H@L=lXM9(YtticC|>_AHDOmVl^-K;~T)}>1iwm?d) zQj1uII+Bz@fV%h5T7F`l_p-6hEP1HB#+RYRY7y>$A=wAt)2Uw*%Xd;UdKWY5#z=A= zW?Oi)FO=?!HHI05y7x(r%OMJucLuI)+)KXuO+DU8?K;PLSlV)h$J2E+Fq1S_Sgrb7 zheGFj5T1+l)-HjsAs{Y!rSkfP+?UB^?@FtWQevc62}aVp3Lg(k8hrm&zd(W-$WFuD z_U&v=`kRVYmX-n>){fgP6wB{_c`FwPxs4NC>gA_?k9APQOCmmtjJhX!0oC zJFB+wMMBJS2Ge@Do`u?I78MjAQ)nLH#MFujA6`6r=!x*ilP-;JYd{0GxvgDFz{MnB zH&K4~(`21WjWV?-g|P7O@RH6_SOWw+uBxY&&BwiPNk4%)TG*gr)`f4HoY2VI7Va^& zu*VtfyuO!jcYO}%OCD2kVT5+a}9`$z7Sms?hC%pBsdBHf!ED*tv^!~ za4^wPiLgUKK&y-PhqI+>X-iM?G&_#mPK=+p%$kH6sT*@J8e@Z69xpcT{sed_(_!Dp zd6Y~Y9Sya$!4NmaVA1W}-8$E!Nqi0qtq7@ue*U){IYF<(z94Q3nc|7WAv>-d7|E)@ zPjGo%CnIdpB~j$>Z^u-D2Hb}yd)v;Ny4+KgqKJ%fcr8Stxi@Ezv7VuJ&+p!(lBj3* zC?=`Yk1K({Y>mz*_U<8qHuqAQmxb)or+mna`~b*P^G(0ne{^_w49x}`cacH>QY|(k zE-kxe7f2?Fb>t-2&igjxG5h@5Aps#Aj&}F#Uu~PFyXLxUj3l1vQyE3vOtZ9uP(6n?Tyw`ijB@K)jf`<37316EliOEz$4xEGAk&aMja6Y{QhAh#MnyD|xKu)Ez-+nyk zw35m-xRUxYab$DMY(4 zgV#C8wACq-`J3?Ki^ugN8|ct8C?@fh?(S~E-GaMY(BK+KaCZpq?!n#N-3E8N{k-4(*1Bum z^9yFWr@PNg_u0GluBs+E>ZFFeR0xtkJdJ>x3P!7gY!c?DNVD1(b~ezz3OjQh8)TzQ zh8SUz>Wi$Us}?1~_Rk$W7Z$}?AC4zaam|m0*&Gz?I+~d^9QNB)zAi|0nEJneKBGGQ z`1l6Cy2F#hG1%MZB8EclJHnHkWJVr!zCa#jT@zuu9q<5R&ocikzKVPMzzr2Nh zxB~>^0dBzc_x2L3TYJ zMvWW_K~*2zbX&+HFgRVL$vBgIFR)%5x^oHh4*ZJ}WaHxEMMNafhfV^xOd_BorwL94 zz`#2uBLo>mZ;Ij2L-b10(=ZJ&>Ay!@*EQ(zGJ_GIx~q{Pf{fD_T%q9^TWJV!Y=57| zC|JVJk`oT#zW1CprCg{w2u=R(Inlv)Nd?V9Nqc$mco^B(4Ew&%mIogUF=*Cfx8NVH zc&gM7!q}82!Hb!}vHx9*J`C+f7Ooyhi-M8cKU|SDOK_nY@ms!NrEiw8g@lGG@`@R& zrH3~Skw&K8nghk-Pzg^>=sCFfZeR*;Z3q+h=e+K`cqs$yhq3A3qcQPtOm%uC?^#pt|Q~QvPtY zd0b2o^4G~){DiS zp=nX6bTB7Cf`5U#buDXl*{X#tkD0t#Z_h+Q`|j%Y6mcVg4{EIK@yn_V9ev(ZG8nJ2 z`R>0vxwLlXqsP^?u=E~k9ta^)uiRLHV4C%N|JtGLjb8~UjTN&ru#dYj2Yr1?g z${GyFGRDP0w&AuE1Wz(EcZy9iueD_vTc)|khdU2Uc*j*HDn0SZSz9kKE}r6r8n-+Q z+~Adi(9x$(@j9}m+2}!yPhX(=nAyd|Ch?;K4bVbi`tX)5D}yLNxdBsb(V8Db8x#NT zq83?E^;i6Jl`Sr=uZ2CBqw~LktpQ%IHw_ux;n{reOsnKQ8*&*}%3#`<{jwhz$FzR) zabxX0)GIj@aAWqLWwvAZ;9TC^*sQg{Dg)0>)f@j9os08IN}ReUs6Fp8Z0ouU8J>mJ zx)H(Mee}!c`5EeQGo7;YS{@L%t3e@okLJxl;`k5kP-)`bY;*sYBiCkNQ40hl^k|3$ zgzzLTj!4a&wmJV(~%YnqXHx7^h;F`klupfOl*72dL8?ksun7c2{+2vS6M zTVh~ecViTO;#z%j{$l)rDADTy-TB3b>M>7(d#2k>-#cwsD0L4hU zoF9Dwutos=%!|5MoS)Y|nXN~z3LconxsBfFwM6EMHq8iQjychLG&|fR$1)Z>vXKo7 zV_jd$Tt7z~Me?T;(kz`%lok&@Pg6poj7u8P*Ao4utGD@)cttN90MmB_QP`wuM5RFj zBEbqW(@v_~i=6r{S5T{syI`*GoVj0BTs)2{t-U%ayT|AR$evmhK@U0oe5 z(J^g1o1Zprvma~_)^DM7+8-^^y(=oIpPKX17J4?so*va4J&7=p`_jfCQmi}7*%s)L za-%pJbJn3PBbgBw7#ck%W}~2N`OIt7Qt2WPBI=Pb@T{%mdN- zuB5}KRP8;eclh4=lSOero#G&K^t4|n3S-p*l92% z%*gsRB%>U>+-@4KL*s`FG__wXd_E~_>kih^D`)#WnS<>XrREy=3RUjdtlsKFs63*JteLnl?xiUE^~y&VZSV@7`F!Yt;8wM6|~S6 zC4uh-Y~LE@FW#26D{9=Cuq~+U65fybT_#looc=&t!w2QCL==q5*=O_L`RFV9TEY1; za6t|P?f*4{Al+JkL>C2!1&v#Z6ucg;C(0fyO|YDe7z9b_8C#U~D1DZ^Pb>!NpPxGQW0Q1?8kZ+;_5h#_uw@8Q z<=?%(b%q1F&D;XReU9wz3^+Kfvd`IzLI+gasB~w2$|`1ptn1xmB4RYb z3oyeI=sUq%s*cXeog|!eL%2mmaDvJyqn&uIh?Ia60Ci-U9U)2ie?~r@zv%bN;As6j z^OMTn2G3Q^8(G8EYud5qajpWtV;NaSj(sI@xEA(hy48F;i^5L6%NSfxh?kx;lI`{1 zZOFZ_Z;aVJ5JOO`m}$*xrma!6m@VZ04iKIJj;^bRhlA9rXO;#xS~_do`vZcxhRd;K z=6e5pKIC=YqF3;Qo~2XvYY5aTY>Q!$#0YOyY9rylm~X5Lg$m~6@C3STsL=X`hQ&>K zo6ZqY6kka#zm+vLZyJz)ih>4-+0>)7{SG1ImF^eS&@`-==c=hI^nHJzjYv9k2=`%n zSxrdZzxFqJ84f}^-!Z<_yb90kgDgx-lBGisJMA8E?|2 zBp>2K!TCs&-{+~go{5DIB>Ai_y7wDP)ndxJVwCH&1eXJF?(VFi##+0TlHdR{tt4Zh zh2UezjQx?2vL9~DVkAGSbbmr@KM-|q$N%)S3 zl!Zqy$yLw(b*@{$J&oP3DW#Jq>Bf4T*Kp(g1$cNA)C>p$X~JV}<>J5bE~ly?hq;ed zMn0oc59u>vA|k)Ia6_{UIMAMb%p^Rkn(N%Qdg$TH*3utQe2^QfoB9GFB1zMrqF#Dx zi*25WK{Rwd_P(%{6%0!5SaH{g%#wWbnX67UX$#CCA`R~C$O2e4B2n7F*CAuGR{l4t zuI*)QA1LSVN^+wxP=6!GY%-*V0JS>4Yq87kloEi|Rhy#g22w^%4V0zXxKp z_iYW)+uSD^#d6C>NFf4f`2lUECLA z(ff%5F^?)dNI|9^=Q==vapR4I-*efx5=v~}_5sO29UjztUnfFnKYfqnisXJ^QOQa@ z_S8>AXFJs_2VCXrf(GOhYy?jijl&>miMrq}k%@Ro-~gGB_bw3M;`;Wb%)ZT9#lXtT zwbHl0JydsbY(i&A#m?VZ8J#UW-X1~B{ze8wAnf%#+}!MpCzxH|o-0{c_^uD1+cMq- zc`WzA;pHLtAV-2*4f}pr3O8OYy!xApVHb63?)nBsXKa#k#))vWQLUDXZ{R#O13x6D zNrGcyRw0%WhhK{e%XA*}KV0g+QKM>C>n7sk)bjbf|6;7|mG@GXpXrnnLUj{ra9?n& zlHgg{XKX!*uDELAwHqEb)M@s)o~kBvslUnmmHs7>m(_;G5$c4(@U4cT_;S6Bz&sS? z>0g!iT?|@B9wVhb?edO+pKH?OrDt*mNB(;HsFu=kjIqj&BRa zPYSP7$`>;o#+H>??azZ#0qCeen>A1B$7*Et_pyy>ePp!n3J6zA9yI>b4%v?qKZNA? z4AWbvsSkEKGZK>5M!US%2dOp+y~i!}-3+XMIG>OBK0QTgcs>^zX5Hm>na3|Wwh<=R z=j+c<(jEeO`R)mEG^4${rASSodurKERC1Oq-*b^L)Jxk$-7oZ+|7mA*Ezuph&U7Zc zF(neej94_s$tm7hCa<)Y&+XL)@A9;a^a`wpQf8#NP%{#iZ~-=;(`8o6UZ20}ZEKmHJ&hBJl80Viv${V(s~zJb`UK zWRQy~+Q(n-^QU4+G7XfIr@_h9ML(B0h=9r~D4EL`rs#CPfN4DNvF-({FN=Tt8f+~5 zN;ut3jikV#xdzS`L>&r_nqN8IC}HNT(3^bv)^eR&Je08iHRjw*Qb2uvc(a(!Q^&&_ zYSuQ(ig!td=#IQ%8I4^Fl!u4c=WXk4$k${1P5QBhSb{T%oG5aH$4sUja*N4D8VtMC zlrGafVtypONYn@n|#-^(S zB}Wks6?RA?&gnYPZc1!7&Zgnx6{gAr z_wUxu#fOyO<}^2Ay%5bb5?C*RB_-&s;_U`9y`6Gtll38T0XL@NwdL69Z*!_?-#4*h zGO=v4|W){zd_yf_ZBm6xhsv0K1dnF;$E#Nn)acdD) zr6fetf-t0vc8E@e`}nJ4A!!*2nomA9O7;NzCK;qOVGfiUBG2alwx2E~g!rF$SomLm z?he*j+_OwdpRtvGeHi1vATajJin`zHEB|HHO5|vl;_3urMO{V0C+0;%`&@ynzM#Jfh)0Co0({ZdHz!QTJdnXE%HvwC`Xv%%=#Kyk6oyY_pZ9IWOumj^_AKH z8BKC!!le)t@K<2^n59O{OnAC9{7DNiX3!eyONdRa52LTl zuN_DVB@n2y3T^pf;bLvIy>;v$S|O=dKcXcUzZmBLllLJgV`k`sjRVtD&^2H-h zF-E}i5GP4No$A9?e7MqvDnfvoL+oVa7vcb%^Sv?52V9Il*j?KCGVv{8n7V1jEMlex zJOoy+$Nfy96B>iXe`P>>oge>5S!E)~#mjjyI!nT0CaC~T$fuZ^=@65N1=M7A;GHWh~RGQo4`aXpYpVBxXXg_-m? zO9=Wt{2up}j4)5hoLHyH|0%&HDGeX!=>efb*VN$YvCW#8iiwp+ayOd-28hDopfdQ{ zL($(s=m#|M(X!|Gr8>A+E`dQq^XPr9MmylD>}T&`psh|EuRvyrb2#Sd)4m)~#7B25aD3}vrj}4h(`D3o zolInRPP#s|?$xhJ_`W--!jv z2mew<)NyeBoJPy_h|D$;8H~VbDJrOvOCVk7(r0)vA2)Ew<*5X+GcqL<&<{X?)QX_# z*euM`HSng`8L$v(Y7=nMKH%t=Wa7!cv$6;$6!iPUNodT7YRloJ_j%<5R;Dcu(pg=+ zKn=%#pnY1cuzknH_0{<)0cMi0m8GMJ{$en=XSzWbt-tleHK3wR6D=fK)~mnG{w}8F z4H<1nZ94IysocxL>$zRQLg>dh%|7-;>pYLk3)bZMt@Fni!SvgAP-Q_hvAb(;OpIw` z>dv>%gC1|+w_|QUr=5TOq?10%Gm(Y0UphCZN+VlPlm*#MSU?R?g3Q;v5)h+C3#2*K z@v?Scf<;MkH!K;2B*$>^yig?0ucc~p2|9`sjSpXMG6>s>@^MrfX!d;?-!a z|BU*c*T?hnrkUt{kPd&0t0j(1Wq&JEAB^I9Y}Bva%E~Ts0?!on&zNAujLOj_>O{i@ zj4XdjE*yETEY@~fuBN9;;N@f)5vBY_7@?~@wgUI|Jb(}y^GRoZ#rl?pqYxf z5bHu-W&3ut^yrp7ia%(FV7#hEpN$3h@7fCGS!UPwHhA(GRL3n*Xuv|dUV{*&Pm2|>s!141M8zs&=+>HU_nhY&a zSdS`9A85aK43V~h9SKV)->AY^V0IUmivED59;(ORPwqf8?{|6H!{9vzTrC7H6 z%xDwFetf3C8Yf_0Q9r1H-jtINv@ zI+|wfIZV7;4i;QA03&~A*>Gvu*Sn~&+=1}1ccQ;TE}4-C%t(4lUpz(m&d+Xq65ocF zt#~?9u5DrQaGXjTRPyBAnEB~LscUj!lWMqCOx1#@Mfbt-+_ra@I zM6Wu@l+7pYnO7kn!zx>0QuNTA;Pf^@s{E3*m1#aBt#+}bQCMz1V{^Fu15rW;!g#>e z*dvxFs{bxKR{G)!6LL+mwm6niACa(C4|gHVADV~0%ERvDGt$>*Y6p~TehyX!hwl6? z{TObAiu!9<-}r@^fxZwTbw+A`e@=X5G$A}S_4{%{3?>C8TZ^r*eH@B`d-D_y$c@1+ zkeI63JvSJZC>>Yl=L7)=nunJ+VjsfT6yh$kP0i(wdFqL#26&YJWAgNt$4R4*F~?Vs zRr#$3cHc}v{@%|m_c}B8y$z@TCw%7BLnE|ZEg0RDQsJp*t; zxZH}eGP(eB7ErL?ow}{Yt4EV|1dC&< zA+$Ms_CFz;G4tEPcC)T-)l&W8=3p>(`AFtr(TXsAr@c9dfddSl!f6?1~`Z9n-r73QN*?o^==jV0$;BU2JO5|gr*DPsB>nIK;l%mie&6}H8=2Jo^ZBBlO!AX@QM>~34+{JJnKaTes zh*GQnJOh6(tbAca6DCC2yU-6Tpit%S7j2m=!&Dm&CCKcs01DnLR$Uu4$p{cN={{T~ zYXD;zBcCuzR4>IBB%L;lkQtL6K-NBmhZd)98ne5afuZAK0g=vWhXHS3XMEi#ORcF8 zryi4r4eNGv{GDO}0yK1{4HmP;_(XwZF)Y%Yxgsxu)w%X5)WR(lmR{$!5dd0N?R-Bhbr2EbD*@zNKL;heX4a5t3pz5 zVcDLbnT4b;Hqf73ym`lFP$HkccSVVTMo(1ST-K@uH>JZsl2HFji2g#Jy!qv2eIUg6 z-GTCK;Rh?E8)eV9J3XT1s9f&J2oi7`y{cC)2r8^5PSsOV)N8R()DsLgK}=8oR=ek5 zpw8t8W#n<83@b1$N67p_;(FB`{}&&G?oKR(cV(C+J{Bua^x4RD)To>%M6gaXw9@lt zJi2>tvHc$?_^Z_2Ky-#IehGiA8;Xe!x3(-CLz*>~7!o|c36_{HmdC$BY!^(%18d8< zOky^40z&MqU1e8weN@6={~I*%S4|&TOWudeQ0@lftRixs$<{f65cZ>y*9?=FPqTtc zzrI9bFUoW)E<;%>xbc04;eUor37%MBiWDOe0wQtKd9BP%wq9zFMyFlLs3v-NeoPW! zVI}FTDDGyl<0E2ebZCfPb?BG>g5#aO)+G^ayw5;ze0xwG>0l=TeIkq=d<-HH7bb)k z{Wu)SA;k-I{n?n2x-TznkP#pJ>yx|O*SKU`+}}SaS$Ze?>?s3sf*DpRJ*b2u^;*6o zYusgXOJQe!y8e*lbIFDQ)fRhkmq3(Y)cF(2pj&3e3aqcqp&ZZ%aXsDqBlLSGvI)o; zBC(|RIsGcHA`bmUq7lWITp$lqtgpAVDv*|u@xK_=?YqpsL*2$lh2sQXOp$nzP*%#w zNxRs%zF)(pdXaIr4;BN{_U51mRTqRb) zZHzi0NS@yQBG2;Y)Uq$Br{TmTay!$ZdylMC%SCSR!u`Ks)}Mze#;0p~NM?$P3i^qW z{Risn0{W@n+BV`eDa@YOzxQ*%>>QwqrWd*xs)n%EsSOd}b-Zq}V~VL#5i@1^Dsix@ z#2(fv$1NvD|%2Ct@Hke>5e7UxL$S-MWU)u zR$-_507kgkiwp`28%+DJqr1D+?Nokn%^-|Y*7Dp!r_2*{6>NK+{te zRowsPj0k0}zeQiFh+qav;`AGek+%EcL?#CZ zN0BOcePiSOZqd-eYLyZoyP(BMSO>u9DotFuFfw$syb$Mqh5cwI2Y)FaNZ zwRJ+7#N&SQ+`AS-W$O48Ma%?6&D-#V9r7P>$CeLm>xZnG8sZ@r#$Nw;mAGAH9%9!E zc|`zhK;8{sKGqi(rUX!lYC7hB7{S#@<4vJnftbyqGbyJbX?nV`J_Abhsu{Q8#DADJ zh737Ihk=mwTnXSO-0)2LgZAbUP)UqBihfHMG|CjixDSag0``_+kBZ3lJ ztOIZ8{9>oF_}pdWpd^HzV$;YBJGiKrlrl4qC?uzI&5V&Uls0Huov05oRfr9X1M^Jd zUtoUrQZV>ckt=)P#+3HwW#4EFWGsSDE z>&_N?sLtj7K^uKx6^sAkOvGqqZJ3EWvfmytL|*!>(L=z|e)QVR&|V9zKvOl~_aZxq z^T_I|B9_)#l2MGTCBQDJtgHm+CSb*xZ(LklN=ix=7KebJD0sC=i5d&M(op7fnN~%$ z98%7v%2~#<>u~7*3dZy2Yun|po9H-L30!tZCDLzoJ)Y@bU+-rmZ#cKA$N9~=^iw)` zem(W_V6N=}lY7^SLJ90K(RWk8GVb{K?Qyy$Kr^f9Cl0OPkdX*w zKNpM7-mP>Ii#oWvYh(~(*2qpk&|xvD=z``eCt_iK=QObY1T^-{9Ab_;1)a4P&B83% z`%g5W(VDJJ?f&j)t&nCw#0n=%g39|>K%KG~|D9!!e|(k|7~uR2b7 z+uA~XvRsAT{V%%bIfIBPN+=59NNjTV=RcE!wun7lPyB*9)?6y{g;N?Ljob=!#KO#82;VtJ+A|qrZGje=|cB zvZ_kDxNUpJ)6l{=tp1ie-A1S9ZpXH0NYUererGLJJK5Tr`T>)6y^oM9z3%rH8l>Ff zbJDoPClgX^t*GZfo@`A;v>p7fcN)3OS0%?P<@hAM~P{vQwF)qN-72@#~BBD z5b%BnwgN|;74@bzDcT>7J)0>dE{=}q@X&gT#iT)69890cI$!tK17v#FvT?rN-j2#{flJANItl3dvl}t#lcGM~ z3WZ&Q)S3H-1LR9-ldrScI(gR)*%hAkmX=BL;(SN81+uq~{K2RB5r5ir9dY8v>X)%7 znUfudwb8f&$ZlSg7l{Q26yBC*w)`Z8$|FCCj6iB&`WO{lY4w1Bh!Qy z_uaxrY+16W4;GOY*6l%mhh~(aGn3(mca;GGW7^*IxRB3wpaj{D-dvi_Lzxx${o=`n z^KlBGVtrfuL-nQ0dv>)W{sSBBODgY(Y1Om)jziQN)mfJI3*$vr2+*Vp;ndY2Az{O? zeti4QbvlzvI+F9onwqFCuVjcGJdk%w85mQE(El?}bIohlbY!o*dT=iQQ@adoCL1p1S{O`Mn;F}h zYppf+9uEG6@@8bV^=q6;Bbq2iH+OBHlE>EP}eVcWtwA`3cKJ?dug0|PWW*K>autsTs5LJWldHAtI=YZb|dITSY z=E^EJbQouT$N|LBGKnP|Dxz^nuCA#usl4S5&b0fb?IMdd*W=zyz~a_fNL52)0pM9h z)dU+`>oxwj1TRE!Ow6J~t7vEp5PF=<$uK6T#{!G1u+g-6 zF$?jaIeoO8#16H3zPtJv2MNSbtKRJB;^Ly_{Imgl&SFWaw0=tD;_IIg5lqp=e@qB^ zJpGu;F%eKn!M^Qfzw#iI6I;U2GIDkDpUsBGa^aNKO*>Inb4>3|j%?k2{7r)v2EWjv z{-%1Ut+o^fxMB3HtTtcTeSLj>+|HL?MY_pV2b>J8xc;N!x=VHI;DO+SnD2VWG;<=w zzk-)c{!IkN{|+4fK+?pm;>Hzq_xm^@@_L1b1Dpx@!T_KZfT^zWF_5Ao2)Bo7*P#X= zQl8S#Mr%1UrS=J5icTX-*Y&>u&pJJRH6+wEGwpPh58gMG9(goicaM*#tIZ#RH3Xxz zgnIb&ELvu>Ue_}$a+0o1>CG*zP5~2DOz)iUtzB)InVBzuCr`1E|9Yrd2q7|M8Y)(w z5KpzJU|w4k@a9jSG3<&bIAiUk4j*^bA8SQ$B!$P0N;H_fL>uvSpykAn}=6!kF&`l(i6%2t)2 z0!ZL>0oz#)oft_~z!*JOEX>R630h>W!$&h$x%-i1bD-X?`6+8bqTb2Xg{^KVK$;f2 z;VVphNx$-c(4y-HmaR@I<|J9rX3KEjjaCigJji~vXqa3|N(v4RZdPBlf7IdR0N`&w zAsOrUu|Wn3Q~s_1boL8D^rN(iBaLYPfgJ$cK>#o@K)8SlwNHBYf4uA)>Y7%sH2pSr zZ8cFOB&1yc5+lNVHKIqGH0^JFW~Uzo%&sLQB_VUHbO3I*D{o{TJN|gjPdIGE{+mgm z%?(a~$qalf%BlXRZo8R1MLJqq$ryZq;#msdSEXuy?>T=1ab;LBiq`HN@Ba&;u^Y!Q zpcDsFCXe#DpDpPj*a0za%+KFezt4geGg;ak2R0`@w5I zsq1wyoQ?9sTN~3W{Md~LA=ZN(igjmPdi(Rs#i2~$&(6mf;q~Que@B|&_J=!SEDQbs zN;tPcRp32f=cz>tSp;-wxATr)UYq_O4y9_XylsECf2uBSAbB}l1XhV52UeZGv5NzT zr>f|bX!!WJs=BjY+$2GpoQ(rPm!HDGLqooRBM7r!=6Zal({KFTPoB_#{`v5zk3@2r z8ZCNsc&+M~JZZHXjGDbsLu$y|3Sen=_0GWvzMqSa(h(5eW4b0HebUm`)kW95Ha~0P zxi)y4TNUj32GAwR-=*#%?FKC&H6MJlSW0v^0?Ga+ZjTgcOvB;0XM1`7AAIcMyh)P$ zY#a`vmYnSUuKHtg!)s7V#m)DXtF4ZqO@`B#l$@MAHG!`@hA@nhcXfQN9dBLyX+wU)DiY*t!ZO0H0RwF-zez>|HtoclgnO~%? zPB{7V2|m3(uSW?sn`_)>Hqd=ZX*r$gnS`~W#yU8E-%9K!R2n4C(E6Cze$wCIZF=yo z%)NZh8Fg65ZU`#_-(P&m+H^^?Xzxkz@jFS^x1hQPIVkXT-Y53+6jxDoO$+N%j_J)-Hio~`if@KG^5HH9ysx%Yn-db_yFzEcw4W9ik8U3X&Ky;6J@+~tp| z$si;JeSLOUAX%2hKK*jspFh++wDhy+x5 zD0nmkp^JWFHdQ(sD(V4S9}~AFg)u!h%LVBCg~xr^|E$#}Ff0pC6E%P=3SaYHW5eSJ zeu+C|dIIYjMQzB2|2Ya2s3GP=nc}f_`%2**d@=mmUO3Tamu=Af*@n{XY9XWvEzDF{ zaqr!$RY)}6g7Dz_yFOkYC6hqvvv6J0SOkJY_DF*O;|+K-)@Hhu7FpNn38BRAK!Yba z&WaK~Xg8<2dddkPBg*!VeEt)1`_B4hvt0X-0Q=+oNkeTo97{r_oeXp3GMUe&2ZgY8 zis?@t`SYoeK!?;GitWDS|}nSMl1=4_GL)w{aAczY6!N&KeX7z)R87MMqA;zRrP^xM?+0& zBD9e^)H!tng(IIOR04`6B~`GfQ)jF|o<44qQsUx!7e=t=Z;top8bnV|!)=0RTQw?!zG*WWwd^^ac5V+ zSP_Yy2k&PL>qy_DR|V7<6$qZJ3xa=n`x*|cpe^KS%4JrLUqXyp(4W2bAAv;iQBol3 zzwmz?($mSo*WgeP3wUnOR(;vgS5uVoC`GGgL)U>xl)L)aBlq%R*zF z!^XyC*HCUq!?S>2>}kJ#J)x0K6pYCm@1|Mu?LNbwskfT-ZtyMKrvsFW6MSgg`_q=_ z8+W|^sH=gc_x!xXyV&FX86>;MM|De`s<7uwt{*I@c1|>FG$FocM}aGW^{h2jmk|;q zU&A(7$%D?<)uvcH8}r7_*=15G&iJxZ+?U}S!EneL@XBG@#w3uo-R$i$IA$!T#LDFn zo%zMrb+8y!IL;{qN37fpty9Gdm*>(SKbP64rwIqQbD&Gg08Yd~tg#b10f11D2; zpI`RAj+W%>*K6)AInnqxP=B!@@ zNvmK$NPz{7nCp(eWQ0NJcX6D4PM!>wTzqO5*V1+5^imQ95V0s4WT>Gq%39=^|0Gkv_znhdk6nA;;v>r z%KBOYh$(94GM*VHEq8<2BfGk~cFJo#ufnfizs7|LD;$KVf>5QH-k>B_1AmDU1QkdR zmUoQ8u}^~Bl0oZtop-xLdl=R&!g5^S@ODF1Q=eJgff|3ZuX~F*hSO19f7?{hI^9*hE5ClXR;Imp zo}YQp?Dvg~2oL8MktKUIAC$~Iss0|1^bQKW^EswqN+M)7YIh*y=w5>0O03g2qf0vE z=GziU=4>TmUghy@(qluG%Wqn1srkM%g2~$ros*lM|0$k^->6J2wLz!Q&j5QB8TEl! zet#utczuJVYK@~U%n+RL+x^ftX-SxFJ|JvX)6sTXV7!@NaxD_Xf|(W`K2#Sget+7E9C$A$VCLG8a?QG>?H5|5MU19OQQgV>kI!PlB z+4>59<9&0(hAxzod7Yp86iefs3s>3Q*JV1`;6hI#yJNHu6aZ7n8&$1Nk6^7G^9{5Q z`|xFC?F0l{hVVGrq%nI@)?~VaCbk-^AKeM@cpXrmfl}|0Y0S;BJIi1ghbs7mB`)o@!~{^XmC(1}ir-A(b3I46=KErZXJhxXnC# zn)gf(EtELzkweCX+h8Q{6dq6AQ>u#l~iFJMGMJitp9bdEcD?NsiD6KF`2E zM+(*MB93*jny*%(xVOl@$vhYn-%VtTqanIoy=*P31gXA}{hcV-OrB}$Wk$B#?=TxV z`6-zXZNciK{?|;NaxlE}{W{INLy<_~ZKK7#^)H@>$`k#>Y&bApO-tA-ys=^F&{o#p zD)TiG52GExkCs9>3~l~gs_Mu3&4U?N>nHhgN&JaF`S|%wA3gLl2QNMC-!xid4wdI#XhCxJzJ%~?fLUn- zF}5yG?7~rdnRnhx=}szsF5`&cQn`u(hy;>aMz2>S^5m*M2IJGGPc4R)`%q2)J^~tw z>Sxw<58pj#J>82Il!%|I=JnK+_w;MC)vD8OUz$2(WIzGvhylB}!Io=cs}CtEoy{~% zlZdHhVfTKp6dwqVPJA9(2Do#ATO!YMU(x#6?m8*HUSI4YG>j1Vt+C};NHLvvWaQ;? z+Z_!#p>_=}QnWqdi#)Ya7321sS|&en|9$U_og(% zcRXv0AczJ`*M&O7-c{yXGQ$$@=U_+kH1`yhk*(WtG=Eq2#l;838b24%i0;98%K&3V&I~5y1&FUusqnB;dEhyH~ZP zOKK~ZGV2KPOp5hr9@|mvWTTaCd|nyYl5ux8zTW@nS&)>q6eXL;J|tRcSgs2w$xOXy zgzAHkjY)_SbencUigXmdKZ?cyX4XrVzoprNU&>FwcRSrpw~De*jgAB!t3@*Hbdn zZh;I+aaSa~o1e&3oj>9HSiiH6Y6@6dFgPh?L68SW#C7rYfs8OL9x^))mpG+{tM1nz zLCnRAit1&+=Dt#Qc5ED!xhF9m_b79;8~~VKrXDoB#_yqTzF#fgw5aG-;GF*ELj>3T zr?UJ$ne?wJSia4B*;v8D=d8IV z?};@R0$~w*+c~-@zRXtVt?`YzdvS>ERmLJlB9%C{y}`;+4@(7s&L7`Dpng{tWNoqw zTJKewY)$0C2ozJCw`AoDUApQ1qr#)RcuH*BepE_tvRlQe+mLTODBciEP1Spf%~ z%RXQ=bl}X+PFQgpL4{pQbt7wXT`%QIXG=!If?E_97teCaQlvlpr)x#W`T8eQSNWZs z6q3RMCYCfK@iMww2WDer6|ct}!?Ue>*(>&wC&8yP@hxeY6MT^JLTVe+;ari#sd+52 zTQW#0tKEp)Z;=tq~}l^v85fi&)yziD2Za8i-?W$hEgq~et@&95;c|JbM*i*96%7BI&5Pw9*HlP+SR>t;l}fiCqP_Sa zMEtQ9hS9#yzH1!9Vm7CD1RE{Y&)=n^Q8<0v;;BFZazgDue(Ap*1T$Sz6F&Z37_O6< zXf&+7g_{!dBMAl_h(A6IvJ~0oN!TqNs~ExdY1ed{;lf6vR6$6Cm=RczXo%2TFd{kR zSfs&u@RN`MY9_lOvQZ)IFn1}bJEvZYitV8AGtob_Wj}ceS&E=vY!Sc{k zOB!-@ISekdAR{!gj{ z&xIF!JJDZZG2o*iO`{rA@jM}KMfkIb zkz17vh|J}0_V`g4a=l$`IZS6x-A2=+RX+b=%JC? zU+M}98WwxC0-LV-8+CoXY@M6q@L>>%zo3-Ww2U=$WFjP652Y5nrsa{`G|ParWLg)G zdGMg=68OiU!j!BNcjGm8K{E~!zcbWe9x zopTEJXslQ@2$CF9Vhn*ixhPBcEBn#tPsW7Sw)MDdQ@GB~?ncIuba_dJ@$YF6yYfRZ zs(Q^vE6H{94xNR&`d_td3*`>?H6Q&jjdFcD44qhu<}_C~C)7uMG*MzA3qC1&bHrrJ zRUl~%H&#AN_fDQ9IA5YMJgP?r3mBs_DI0T+1?Pz(->8g3rcT18NPnsw3VMnjydF@( zx)6DwazP1`VI(DRY?xxm<_p8qMo~gzc`B0)wnb+F#Oe27RDb4%X<9dq%lhbA#y0Qc zFNb*&LRn7awO|jk;RG&QGdM(oCg9P>UoDT?HeTP)dV;SV2S+G$ z_9R773Y0-nSUk5A3wZnx-69VO*sRzi=aV^kcGep?@Irr`!DYw`9GmetY^3u z{R&MvhO|WbMOFUg@OUh)jYd{PCPc~Mb>N@S2ze^Y3MHN&^nKYNH`{YgDw9#bk9gpVwpMUfFyHZkOE@BiqZSZ;5MK*_QR&!F84OUDlXJ)4+y;f5xH36&0uI=Qn+Q^(F)LpeAemR;*8pw+Ev~QXiK|$0ff~JzNlOoy|&3sa?Md zoPx^Y8dBPWWKv%36Qu_m0MF(4U)m0B-VS4@S$M}0*GBt;qmIl*3jV`O%7;XwK^>R5 z{(+Ru#?Ib!`Hh-g&nA|@ln`cAp)M!t%=FaE*ninc=O?f>RI>zyQru6`LDpd%v_TgMq_{i8jot0PtD&Ji>PNDn$C zRP3Ca|FsA9eV!aPl7zRrx7DJQ=x?R-X)C~{4R^l7Oj;0Ey3;2|gM?I`UINB_g0=C< zvC0zfps^&NApuz8pdLCF@(?T>Lcp`97yoPvN1X?*4ED&^f^T&mX^2Mjp8(KQNECXe zLZDVP0bx0$Q(oPHUO? zO`!rOkBUn3=m2RhV=7A8vt_^@3&=pG)1*0<$16Qt9IWer8?!OD`U$C|=e77TOGhsy9 ze?MV+iH$bhyRDC#7B}h>TBIgpkKVy0S{H6A&B@$W_K7W4hD)4xYe)^;satckj{kE0 z+Hbdylv4l!N48xg8wC=_f*Q=T*Vx^3wx`u_4Zpa+?G~sw@r3Js@eH_*&uh6WOmN|K zzKLr(QMIQYe)^)!KZq)Ph;Z7du_QLd&zqD!=w*WHe+!Zx609 zLE4Z9XPitzI$%RH{5a6zo7pJFU^6niuiA;wf{nxDc}dCbjw|Wt&T44*(fys0{VhOi zuGwcqxpyz}A}}io7LfTE$d)BP2CE(i;eCI`W~$snzVJ9qf?omK|MCte*J5u-_`dvB z?!fr3%j)jNkAd(H`ua)>y z{O-f_)*B7+!!>bQ;#IIL+Nw@!Q-eF-#NX_krVTsrhjn08j+w}=FBc09OFDBrF_-sL zim~V<-^YT@zgKJwdhB)YGQ~#Z`T=yf`7b#gu24NIIXf7kEOaS`>cR7zhi}7d8CTWMxU|7Y++wc z1ze@Ceu{ac`q^DnY~g0Sw&b-vfC|fu)TWlk7XYT;GtGFShhETpEZ=EyRBiVS~rw}pUYVgt>JEjF}ZS_EuVW(pJ+2Rk$%V2&99cZ zq}9R=@bU&dpD$^@&a;wGr-XhL=fOa6jjxQX#XhWe-5%lk8QJjK;u*Uuo+J91XUc4N z4f6RvK0}ahexErz`}i@VdMIO3uMIJ3Y7BSZ_6u!4z5E#F=ScGv{;;mb@YI&c=&Tlk zu!`9&bpGOl7SpHVWidLuSX7{*TI#*p)yMH2rcl+{mP1=1taX_>_8|mB2qg4AvWQal z-BH{C{lkvNwy*zHN)4OX_=eKrL$}^X&ZHd5H(&Hwt8v`-#g1;!+aW50&x78MxZl%D zO2xWxkgDc32^}h+cIvYNVLkx#QVB*1ny&U3KC8aJ{xzb$gTZnRR5$5?4lG?p5jGT= z6Z8Ga+0kXO;@%i@xz=Q$0p1Mll9Kgg^lDw>5eO@$*}z!lci$-+^gLC$NBEMHU8E>9 zg|Tbj&c7mXjxy9({Z7Ghe(SlbY9Q^H1fmh3;b6^PROi_Nu=@NcgA4}<%0%E=VgM9| zSC?M^A}(=nEEe7~b@_qjEQ)?MO9eqq*k63cZ4;o}88-E5d9V-a@0-fAm~TL(FRo>z zI9T6ye?h5ay++#~uZ`SrU6o_^RGuK^(oDBFi{#Uug)Zk*VB0K}G`Pf+W%HAZ*O^Ps zy#G_rESd=<`|10ZaUb^(uI8!Qj# zD9J<8jfF^V#)btpaN_V-8c5ImoP|c1Zk)JT#(o+azOdaHLD7ZszNXs8uLJb z>qWBHO(4?vl2QbK0d1YT^QZJgcf&Fh3S7+)(KvMoL+kU@A3@5nM|{E4EOE8+_l@PA z9gD$PLAGTgHVg{*K}d@gk-S!m?b-kR5%rmPX5_aO%c#P$Q0SvWY(qt9{t`k7TzyYc0%|$cB`)U6aeIH z?7Q|Vr>=JErlPz*o=)4qtZ9k|+*GyFFQ>RknZ}$OhtchQOVKhA39&%DSa~^J7C3 zV(@L*zv1%@rR|&~dR-(=D+M4TgstI1sdhRu{b-6h<$oxb)krdlkYT}`40=TJM{o>z zj^rIc2T=!>?<(pVYu?Ap2%Ch4jOsgD>{KB6joc&c)IFV$CWSQ_`=^5f;I3j~beH=7 zT1?M}PHbvTot~Jm;T^d9+R$PXZjU#5ojqB+3u-q>_E`1bX6Wg?-G{+J&?-;IK_Raw znT8{mDIf(aPm>rcux^)+IfZb?$|y~)Uz=deYFi0@_H8=2h)RBXC{_;K?dUyTTC`V_ zvgzSCbeLYeZqLVEbfb0)h-Y(GxG?LQS9KadrXpHl2R|PU5}AB#KYh69vw5$5HmyGn z`;gk&HXOxDa{gkqAK^V6BNhjs1;Gz#JWLluG}Aychr%iTyU$>z%zNQR?1(R=e_o$PhM@1!Mn3>99 zwZ3d`LcD<{_eh^Q+5ia%I=FBbt^Be1wAS$oSQ&O;$;Fg+ax%|X%VRicG|JH;*J5?#$Dy)@bq4f{^T%7c{e(1bU2D^xH-LL z8=IAgu{P2gk|Xf*DGS8C;9OP_g5QII47AW$mW04rW)(D_Y&D0D(NZL0>_*<59C~AQ zi^TuOCPZJzlqKtKsGXFQXj0pUDZI<$=Pioe<(`Q~kv0bVc=`9HR3Kp32<#pNM6_CX zxUc~{4ZU|;DDqp+sCqJE-?E-`o4t!toTke^Gk$wg^0>VWt|S)=Wc7@&Sg>qdRIO?2 zp9$*3y?@NM-EQZzrSCwcG!m0CtOiR1HeDtU88up&8uhV+2Mx2 zU)Bs!51StWu=FO0XaH!Qih;<05!M(5<5FU8yXhKXup3%A@OmY9t*2=JQLyBUP9s zh$aj#)r*k}FHRP64UOfuzga%J-b7SrgL+hoyMFYyl&90>vk}PyMI|xBrbKS$ENpH! z)A=8ePGeGzWw6}T%v9-$=Ep#Gs8P!2zsm~z)sASqY$@rt|BnSQyyFQuXic1>5$#)h zfemMuS7`fb!g#4$s|${9om|W&cSojJ_e?f-21&)ox2UE6smn+}XK&VFo>L z=Hr0>rMse$Z&N8lfNHoddjZccNCN<%SULj`2|9vlbi<`jS5Rl{H&3J05c)4>Pix;= zLNw@vfA{j`h84*gDnp)f)#!uKKQ#W&S3LP!>9{H1b!dMl8oQxdE%nAujIyulC@NFD z{_FeWUKE2n4P`k;8+edNoGRT((ey>_SVR31WP0QFZv4D3_Qf}h&7*_hIhWaQ#M5E9^b z5q=V%KY7B3NYlQ|rwsDQa6xFpq%kbxRt#QwA-007x36j+v}CNx(E>Q1CU)#J%nW^~ zEb~j>$B7GSvTlC7G_VU*)j9Tp62xq5HXm1dSis<6 zz8r&l?VGY%PXdE88Kr0>KMVyLBwh=1G$cSFC*ew-a9vi*mb{knUFjoOsmJ$<9q=6U z_Oc)d9e6ZOb43J+wisakl&QKbsvaldq;bDo;5BaRZ(Z9*pK_K|tC=;K+O|MLd-xr| z$=BhzmMK+6u{4Q7%pC}M6@!Cv9oK{tY(iP-GLs7sA-fOy1sA-;9_XrrsB5yR?lA2>kf>E_`&e(GXDU&(R(? z4X?iGy(u{v@Hy3CkSP6iZf*{fM$vbZGlJhuv)1rk^xP2JkWyw%&ulsexrac*|Mkzj zP3h!>+*sx$ETPlg;;42>ul7s0LYtShse4K9Aie%ljq|v=sWCjTMgt)xBfMWC&iGdf zrMi_!Xyv+wWJZ(%azcAsCA`HRk8VM#UbK7+01*oUg0Vh{TK2g5TuaSxjYRhNsK9he z(d4j-X-Av$ip)c$ZOjX4KxT2d;s6;qUr&IgH$%JHxE@NkuWWk&wZAMyYB1Z;F44GEt z=3(d1@Eo&sIumSIY2H3O$IKnM2n2W**vAX#^LoSPTNQc7Ti;(qlRmckSQkT{6M?sx z>=?p9j?j=nY-NyS%C2|RC?}npq`f{i4tJs0>w~$(T|UqgKTO?8=y^?G13!LQKO9BH z3lq*sf7$N#kvkq{galX*-9zN|IbXIwfrL&l08?33dQQVj8BtzPo7gbNO+F}eR7>tw zr)#xAknVy4_1sGaOg%bpE~zeL4@f zV4;#2fbc`@k4S@)Q}R1@kZ1jG25JwD4{zmw>P>@x{C+~wL~qjFH$IN>Y4lFH;BdkL zj}&rBRCFF~peN`bw^VP!e8%s@%A>=!Y@$lB{BJE~zD@ut3)*I72j&EpQIoG22)zU` z)4WJ7(Zsj<3ELM{c?^>+GPH+~Z^@f#*nlo)` zDVxI29d$6omSVDhdTs3&A-PrF6iNa6k{1o=KhN#Z+*1#9f-tk+0g!0I0CIl1wH@8R z{qcp`ac=CAZQdP4G-p5F7@B-6tFoR>D$jiseI|BHj)2;1rtC-9$4iICmy5OOj{?>) z1VEp?Xg;kY=82v8qwLY`zDk;|Vc4&~SX>oOYv%7I4q1Q>{BzX|?^ot_rnLV#& zbqz2~^xOKawc~S3_FAqWsooa4fFaRh|2GHMr9mYA;#egwmAExM3-WZ9nPk~03P!id zw<1nybjLaUeBGdhzU*K1g9Pj>Hj`6GF*tSh{VJBgU+c%3fMc(L|Ni+y~`Li?Rc?GitaI`6$0Q8Xgx=rDxE08I&8^9v0cF){Jz z0MIKVtP$Bhtg8T=2lg#C22!QwPlsZ@;76e84!d?iu*L^ZAzr0wpE0OqdR^xcFEjL%jOCo*6d~2H+cQ zNOG`^J#5mO-<-K|VxJ~ACajRVTdO#hg)swFmmwdlT3tv781Y|uvc2+tH+71^2TVao zaNSv4xIOx$+Ks^g(xG%Mv#hBAsC*D#wVwV|PlPh-uXWen-jClCo3~cc!Qo%k1wS4~B3)m3F3o84C&BPnr(YDJ6p#bJ-5}@!lK&hl2pf_q zvqV4%tXHk=QmvfM*>sYsSc_+(xE*w?N@21SCT6l7<4!4>gMqP#mPtWY7clUe9u-u3 z#5%?i{QZV`%RVOr1nw05(n^_H1*88D?;}LIz&V$#%)BhnNeWc0Y=)d20fT}1y+c|G zlU_^M_ZV8yw1BZpaC>R<&RxAY4Ei={OZ|fncONrSYd(5bfZpUfSzNjqLBfn?PU8Vk z&D~jOL-U*78vK_4OB{0a150j7YNv}ZbeZZrUiGoruXd8s#KeoC^S5p3Oe-Tsqw76?F<`Sx5F z;-ePCqfOgUu0+iZ;=x)&#=UlSMNYV%*xDhFz|&OVx`*?~yD=mHP0pROTw`R zG|HskM`@aLWO}Ukm`AVA|A-BnSu}zn=$P$nay^S+LEAlI62T}pMHneiJkfnHJ3gI| z*ZAb`WLGj#iXFW}oNz9#y$8rztmZ6`7TW;EaiIQ-Und9rAI7Bpe=sJi?N-GwLc!p| z=$rtC!#blO*umhA}ql3yViwEW=Hda zc$o~OU9i8f6Fsd26wEp(LB(WC?_9e(8~>_?mQL#gJQ z%u;SGj)HT7_1!i~*eP`j?z#03NA z9@L=wu(DzwnKWCGWu<>c%$QNps0~_gy0kGV2drxMuX7_&ajY})jOjQV{6-Gh^9tfP z!R=eoGMQGO+y9;AeSUFer6wf;C{oESLp}xlEa5?rPrbpj)UTjH{jHW8}o-Z`8-Q12CfToz|!#DHe z;N4U{J<%~$$bDP>a-ma+D~+_}4;C2q#lb<%=W{qRxPr@-yRP43cUt_1UAP#?!`;~s z{$82V<`LzoRV=_aV_2!E5J)gP*O0sP_ssR!t|3!w%KA!RRf{eZsEmU;N&u1u9loxI zzHE>V7eF;ZEe@|bU+zwFENn3GZ=@@bVv$qLg(z+VfvGd|@PT&-B?SToSp%L3!geb! z820Db&1XBNieFad4CELh#mRutnQniYkBND?@EJVrjCe4W-(?`{3;TQ(*_!97$a!vJO1* zGV_K(=fC20qm?mN1jKv##z~$T>6FVpa`J-QVJ<0)S6FE1=ihclCAmG6PsKKuQ_2sd z=0NLOVyw;Qm&c?lqo#VY)Zj(_NDJw*_S95`sRQ8&?9t3F=BH1JuI2fc4acW6nG*X6 z`b8I~wc~cs*lX)Lc>%jxHc%vn=&fWDnIJv4@_H6~a?IQOb_ZI5(V!B;g6 z*Ufy?JMQQHqI2xpx4^QL44FTgXfO4neTDVHR1;q|*mI)k3- ztqNoZs2U~oeB^nCp}XtbG!Or(z~<17Tuccg#jQiw_lydBu7E?|I#Z2eHre9+*oZz} zquO~kBl(s3;N+u-bqNZ1yycM{(_>`nZOg;%t<0J60W)?h!?dh#y%~_DinT7&iP$Gr z=^+~1cE9a1lbf4&h8~K5uoDU(8 z%&Y<#cLQEcgx$s-L`V-Xi z_AZj!cu(h$m?Hg^m6i3sRBX^vr52d`Kr^%8m1c`Zz}~8b%cbQ8@V)=2SzXz#t=k!t zEHSbEO%cFv8&KyI30}v5QRuQ{eJCu7b6$`Szl%I0rJ{PR<)U5u$F{y5P_|^P zg-b_Hz{QdYiABJ&$$7>j=~&%YS>^pJmoAJ`TCqyBcntFdGf~Sjh6;o3hsi}15>v-X z67?4@D6-;zLH%&xwyp>!Y6vDbf5G+_(7K{};BUu}4{pT6*=PmszCWWodWC=ep$6?-ReV4Nt| zTM+IrvX!Kq^l?TOsqLxvUIi7i;Caayj}22@47zj-+fc75Tyj9$NqnMJ;+Povc)urN?{yj`5Lj*kVP=bT30sXCXITQ8&AtzdqrdSQ6UJnPp!k zJ6I%e=?<{~Tw3Lg`<2WyNinv1vSCxh^fu5V|zCYg2=oXJ;(6{ekd#!og4B<)HQie zZ#-*0SysR6=)Wg|?qBJqdL3;_+0(m`0kd8@kK58H>0J$kvGT9>pDRop@_X!8-K(CU zEOHLO=4xBlP^BMnA>oW2$-K0U>}q-R;72VDkET;C@MKow?y+EopmWh1Qm9-?7WXa-Tb&}^Zgr>Ux~qsU4JrI~Jw!mwX7uOeyUPW& zWC4;bzIuzvkF76;{y#m+1IH#9Ak|3(*Tb*#kOu-a>91P8T6||Eh=tvir&cUd*-k@D ziiGkr>L)TW<}Q|`?7kDiAN0yRfdjj~<-$T4fl3FGD8@RM+cyQT@gH^3ABwv3#Wq_0 zU9P;3u0%&iJDhbtPmX`BTXjLo4PDyTfvaGHTW-A0r^Oog(KJNRtzJgk=WgAxC{wn< zdMX#KP_HDtl@up|WWC6U7&Qs?|88YRJYW`3KB1vU*=ZJgo%${r^Loo7E+I}rZ0u|S zo*UyrlnZHK99hJu5bpnAiotLtLvbZAb`Few@+`<(ld%Z<$!yS`Z1g)XH#avSVGjs= z`0!!NZC0W9RLxy73W^x*fqKbR3CbhD%9=hVjy5z(MF6%8WPai337D0)q@Z{jVgoUt zp@UYgk?mIVQ8pGZ{J#_0>&b`0Vm?WKFL*a-<@0IDw&C}c?)9@v_wwXuQM`)ScE(T$ zpNhP=_0$jm=xi@*A8&V5Zf>(5pv>ucjtsDP%tsu zi5sVO(_qr`sM#>iHadWr=*c!N*~q-m)vc+>M6e4kiSe)8C&}27A0BNnoccHq{8^$w zFlEt$EA%IoPb%x4Aby!x%-}}2evE`|a!zZ6bjCcl86RwoPtRO`>PFQXY8?%0FHPpL z$vqNw%uIxc7tk#qkRSg`qw3x0g=V{}4uYMl!~ z<9x3iZH_}Mtri%;Lb_dRz;A@J)|7>Vxj&PKoj^i;$#cT*v@PQcND2-p`-`8Tel(r3u#GcB=c6TH&}=Wfji0QdhmVA9U}Ozf9_;k zFm8m?uX^CVxnbs{US|ZSC3e&LYsl}a6m&b>w`_TEH(w;~^)jTSmqF?NR5Sn7Q&Z54 z6*dXbPnCDBI_GXuq!Gx|j7zL2G|dH~dO|ExOW(w>&_P<11-bCWFH!fy3Ve?vwmVv7 zTc46J2+wkES3kYL4u#_)^+RI=a4IofrkdBt|$ zyUq4hrDFpwHLR3(udQtvlP|}(Cjsv-XuT?u%hb+x&11<<_t9<(JqmRywC%o`74M0@(*0QE8k z3t2s`^QMih_>zl&t)eJZ3ymV2FhB3R+Zh!GijJ1pIYY&^M+5PTPNNz%tN`wcJ=di- zs&6+5gHCudFDw}6)1J-V~u?pk9#uG=v|{g&51xjxLeS$|Q# z$e$ZL4IoGD^Qc`c>*VcR`ZJliU}{A{CR@{+>|`q@C4TYet3Nh*Iq>B4lob+2PdEvt zSt+Gc+OKX*ncKKJJWNX~0Q^!JZ5_Zl^@?5-g^!_TX4`OoFVQ)mP^ny!4gDiSdv!wT zp&|pJUb7<`5xZ&|g7&z7iM@v;bfGWDq_IfQVT!P9r__vLQ5%US8qs-(R-XQL7u&)M zcYYS)7DhuJGS&V})i31Rlp|UJf6kNNAf{Ylvm^}Cn_QowQG;035&feZpyc`D?Nhll zKi|IAxW!O+Jy73gUEZ#FvL?q{8!c#8ttjW!Y10Z}&(XQHgeYnY+ezB-!%@z`!;M20 zL4=*3A{$!9sdYL!Vw=Crr=CkYI*_OgtMGb zk?^Al`a64G%$+ZH{#uA5{T-?#ssUYT4>MZ?ru@VonuQi2X;eTgV~ zn7i8L>-{UC=iS#ti_hV-=%dK9*)v#(7d;_-FgY(TuhxQO%#}IK?}wc2a8XWpmrst8 z#fkZ^+5FQ3$))Q%=74z#2@q(O*GN}X#Nn`Zi~R`qFJjx*ucJpxL52;6%~hT=>Y0uW z7_dK9Z4M;C`k>D@@7A-~W5~3!7I;{J8B7AufYp7uFMymD8&CyzCBk*GMt1Las;WD9 zOK%;u&!HN-fjxOf9Rpt3Y4ACS6M)`njnZP#4CfI>G{eOEcHLr5;d5zeu?c=T#I(a7 zyH(%{^H4@4tY3{EBO3x@=6gG4`ls`3H(U2VFB!Ah-eafrOqOdi!p8&%t+bQym6Lnq zItJn#pKcc*9C>CKScxu4`H~Mxf%qu3f_FNCaqlkys%Vd0p8|J*3*Z&T|lZ?WtBOO9>7UJpsDg3HJ5I@J!X3%V>IV?ViSu7?0}8%_iEpvyyPx*rA*5HF&P530 zoV84Yg@y!EA>3+K0Qbu3xQ-n&#x{>~T{5&t)yex*JT%_Ot&#O7_oNx>n8e zPTHcmXUjZ?CfgUU&)rV>Pbtwc ztk^D%&Fg=&#|G&*;{I59$m9>F%M+1EP&Zhod^7=#$D829C=$TaUS%@mk^g#?t$;Oc z1eOVS=eEmtwJZ8KvL4MKDx~uE?fFpjz^6yC#s|2m5nsaO+8jM__HgdQZY2seb;Pl? zQ}6eFen`DiIO3kw6tG&DCrGgWpy0^`+#Y<=O-B0F|A*PH7?`N$X*U=4H1fDSH_F}C zcyzsrLeuO9KWiPO^e;0u_i15`i_iPB-h6zwOpgHn0RX^*k`WhC??qZ8wW*Z|ch6dK zT+jR$nWL`LLGbY6ueD!mx7h}jWaGE(cvYKlznX9O$~Vc|y6?8sRGlNqqVK}#7I-Va zu01R}yr&pZW8h6IJo$^YK!MIm&ql>KR-JPQwDtwRjJ@Bn*#%U{8sic5LuB zR^Qil`maPvk}VulDM`-EPlYE0#X7aWT?7VYu89JOSovz6DU+bzRKnl{-bR-w;g=Kh z$@qHf`1o8twR>T3AYj=2wgZ?3_;wnMoFd*yKI<3Fd4~Ul6}~=4(08F~w2hXv^as)xxRFwoZUh)HWbu-h z67$)}>FB2)Iaj9L*^`zqXrivCkPvmf(u9yjT+Ts_tC7_G#&TSSJSr zZo2fVopi62md~;RVvcDb6{n_<5hVS zZ1s0Net}5dv<=O*L`qP$t9;U(x+|{0!W8ZTO8&g#8KB%satf50=*vX`)J#ex{^5`DB+ z-Y5%;fKdu;K(9fBTb@Skc02Xr)eA3slbs24ay%*w06s^b`Shl*J_Xm$WCR*0P^#Jh zoA0IYTX_etx}kev{fz}vmACPYZZgasCF@1!C7PGX+~Gk3zz--*Jz<}60aQB4x(`ij ztMoina`?{E9zX&NXE}-Fe+Fv|=EXDN@c<`gmw-+tHBn}tQs_2ie?a_FM6DT+GU6I1J zUz#UI_y!11X)ZCt{Bd7BIB>4jZAtPKFPqyDjmQJVqw=Wqd{+a~eU;UAMr7c5WSe{`v+&v;l zF%)fsJt?W!$z%l=-|9(cC|?U8vNPN*YJ?Yg9V|-;Q9^y2LG*imreL zV_u_9>=71sIf+lvO3zbdGz%MVc58UPYl(J%^>l5h8dDgwwyqS>!75ltQQgrJg2%AV z-j3n-ea;inuf({|*J<6VdFtkNJzef;g|qhRKnVT ztedm}O@;!VFL`qG1>n|P^L!8cC(?|1jBFH0^Ao}|wx@>_*opwntv^>&nQSgE$|HPJqH*sA23~3eoP+M^m>g!= zzPo_4K^V~BSQ0rY(^^NsV?w=QBQA3DqDjjnSR3p;bgaS++f?oO_#@R z88I)kg%T8?nt|=7m5|wOK(v+YXZLaqk-Dd5`KbBW)G7lsT4`%gJI{+0yxERRx%}RD zzss0x{c^f-H0Md>dmC8u+dY5;&5S=ocj_%ORzGP?W$LU!; z&J=s6IqFsOGJ;e*{pj&9r1+suX z5fMNhGZG9MOy;=jJOYqp4-R0Mq3+tx%s?Hke4@bb2Q3FwW-A0I`|*A@uzVQaUj3bZ zJXN7;)YP9VKPsW*qW-co|CPd3%t=1T~6R} zO$qTvQtvn91455S*}h?(DdKM@`wKa;Y+NcpZX|Wv?1K)m35YVml>TRG{XGbH8Vri& z?25}_1X~roeB*ScQrD+P2k@d0t`^Xvw4jRslmu40_ncXQt)%q{;s6Wu6dUmO=_g-w z)<|kqwYBp*Drmw4X034CL<^ZKtR6u)=?1-?tne7hkOL_p zf)f@lGy{|ci(2n%4=ib^KNaRyz!Kit!2>7qZ2(ReA)%1bNO8Y%*eXlY zM4ktP(a8?=w-5$UR$$DNp-U0nEHgV`+>h>?(EU{Mpa5)OUf8jF|TgX;M0iBymSyT|Uh2M-|5 z7Yr6!ynx+wfNvPk!iLSQio-8k1CkQvx_rBmbsPvH`b?G|x#cj(7Iv(Y+UsjMVPerO z9y4IAw)ljH5B4(X?$o2Ly> zof7S1ys|bdq%$GQhk8CqGbZmKeyhBEBg%N`sw?Xc=x*oZel4uHerBS>2{MTK$M1fK zP>WBU?GCCG@C8NOKS{F<_U*-n)^?%`t_0P8sCT}m%<2ZX-Xq3H{JdsBfZ-(x>|Mbj z;?pFLK|~3EX{gc#=&OYB()fNfrc#+6H{a6L4vOBnLER;{v^=HLlIWRn=?nry?@2aVs;XC6Va5_O}+f0<@izhi(pVvO7ZRoJqyk@ zyT?#r6NTy<+eV*_n)l3AFU&@mIK3fb?^e#epZ+3=vi<4 zVXVjp?2}V0g0<-Cv#D%0Zgcj?1FiD!D;3BtD&Kvgv$UDnFyp@Rz-8*SF@7e%9pR{Y zQxE(UdzPjFKeL70zEGnU&z6Ye0kO0H#e*pEk5d|H2DkMChOPd_!SkU%)63}<5~&B#pO5szbW?7SP&b+7 zPyk=5^A43HYEcw(ull|ftkVo29YD=TaZl8&Lx?fzK{_JPFMlnE5&$nB+4|r84Zjk%0YX*^E+`xLH60gs}PnL`PvCS{!E;-xTQ^b+8EFx{H7_ht?Sl?mY?lr zX%b`5xd$6pKmA>j&fbV;AIG8*RgW2^=1-4ItZls3>tA)Kq2mt9H@rgD-&dLVM>3*2 zoQPJoGR==EoVNIsYcMw4)v~3)wRpSstoBSNE zW(B=e7N$hIA@YfceeP2&Y=|m_+~sVZd}fzkv56_;QYD|*jo)?5* zvP*(C?neyS59J+03i#kwpTje7IRcSJkIIV<;(!gkFemy4j1?aeTIne;pC{sD$SA^0 zhm*dELnTT%gShvv$|-Kur9XLw8CTx9;wo*b0?S_ec7sjInA(Y%arPB$dp*~-;lFqu zg`a&lnd3#(LcH}2ot;oGd#zwHH)@GDAbjP>FdEUl7=UHdj0-iu=anr$&&Z|cc&Vr@ z@Z(!%)u&=B*3lX6Z-eH+20{%%=q{Y`cunS;)8Z(ych=JKa{ia970elLftw5MG>fj> zIwCi)BSE4Qz+;;`m<%-V@NA#&jGd8-1J^w_TdP|-O@RccfBsHLePRogd;O^6eTXo3 z!J7DMtA1NNZO-ymEEMv-C%xTGn+m>6kTia;jsKMgp7IPHdYv~ZoVtG+N$+3AiJEP* zTqdW?C6zIPDeF`e=@0v~@vCo9za;DGPpSHwE>;7NNs0rstOR@8{IaI9R?7^C0DHPG zXW-DxTA)yNW%GB0vpb%t(}OHf*!o#kRI19<;L3_$4k&dJ7VuRDw)YJ`k$rTJZU@(= zJftCiV*O#O6^0yDe(f9h9%weS*y48^4}I9M3dWs$vCr!EKk4ig7XTpV;29{VPIBfT z5n}$)As{%AS9Terme345;N)%XgDgPCr zIV1iM2wb6uVgW{F-fRnvcf;FxY;~0;P*dJ1&qgm?>hDz5JX){zb4}KMASry;)1&n( zLFg30F#Db%Vr!ddOEqU297{|3{|Y5ss5REc7F3&J3>77!_RhC`|A09^-RC^#KKFU< zeeOA*bDw+fK}6QCO;2m>#H3%3Y#hjKZbx1^M+%ZU>5%!mw8xDagzo9;|R#wzqbQ0q1o{=&Vu zWYQSvJS;RVM#;U&FnA__6YDu{6(=-kLVx-#Z-~)=$5dNw+nOO7_v;2)s*DJ&P+476w-D(ziJ2ccMO!%v zB_zGZ*z-eBp-T$@`9zuS`8I|GsLo7>m~lIC9d*jfRX`ZjP!*OTkJOoyu4-Dh^0aPXpWjDWEs)f_RBYPM zpM)@IeI*w+tQf0@=3|)U#vm)0NA3q3_-eYNLVZzf@a4>2Z)gTN-yTGMF6Uhf?jb)X z=O3XywTL;UEodWuwZL9F`Wz9s12SF;E903Q@|}7mSF`Rn<-dOIlKCn;vu2057Wig}*C|%XCHo5^)Akv|dG$GE|qzr>zmg}WZcKTZ3#k1Fan_3OtBk?5J z{)W)E_;nh->6_K4Qq3F9etOB?Xaqd5amJZ65TtlmG%Hg-)8ZLXWfk^~w=ngo&X|hf z1)@?BXx%5#5Gvvc1wr*b2elSIp%Izwxx3LmznCU7NJ3_lra&u8AqnuyYU{bw%9|CsZ)eF}H;66`}w7zq=FZ> zo|*K_%ZfCxB@!N{qc_B(%?}g>HD>#}eK1nc(~4`mXW4(aI3Bnc*p)ga@pX}nbo_dZ z=(Ry`3$}r(>bcr+&NC2Gla_iGU=i&n`5INpXbK_)t)>E+Wb0Ac@6C#Zp;x=0ZKm=8 zT7vjL9c1Tv1gt)nM5ymA5^gnxgiV7?`pq(yubB6l$zc7vxwD7s`$Z~lt7jY_%Eh9P zm?Z-^bbCvoe&)uBr3Wu($KhHgtV%w-oj*8RWx_H@VRXuq)o#XWoD(I1M_4%BF)@d3uL;fD&wTT`?38@|bbD?3*(;hV?5>uT13BhI5is*nQWGP(b8Q zDhY%8H|$3h6*)NkhBmJ~6Gao6C>cGSyR2s)GG;!~-*mTK_0{E+YX5Z? zb<#b#divw;FTdn5;=kh3tChKhQs|4ar0X6oMjz!nx@SNA0&q`o=j=OT2A5^f&#n(# z6nmiWnl!~u(7iy>NHJ4GQ-8H}T!RT6rACqY6$NNk_D36bm3vu8rZR?vBhCpWD{a$SX_`zP%JNcE&&jH@~ z;*=v)`{#%rT#PscfizD~2KA12c|*fygf$<67piZ@&6dnP4`_9b3=3XHmjb~b!ja(m z|M9m&1kx#=?)d&l1OG~bXQnbAn9|M;+7LlvXK?o{nyz0XiE@%gp()l*slDF1RA$!? z8UHR={6aJEN(;i7c-j!W&N(oy4cUqAW#I#h8lw(?+SW?Dg8HGGOMA1zF?B=0r|26z z-rB>n5KbN{$m4}Qz=o2|@swU~&o$Kd_QOP`KhP(>WlV7_8^FnUTRFM^D^NBtV3d49 w@^Jyc&U#K+Q}Bl&ikkxjWyy#{vfdBY5Hke1N!}x%OI%ViDTC(-10H1*jfmQhLR-0P{VR6aLsX>G{a8K2bU_>C%5nZ6F=I?1cv@9OH0A<) z9iH@u>s=v!o1e|qhA9HYQTu1h^I?l9ynR$$gZn124Gr76y*JZ!IB7-Z9vAp4Zae4J zpSoR9Afw-y6zd=v(sr{vmJ-^)_-!)^O(2Q9KakgFO2qT!NGx}gZd}7Nkj*xn67|xI?I0( zd7^0wyl~oF-6L(dViz^j^oRhd?nI@Gej)LF13!XlzGnua>Z&yJVolPH(^P>^AT@X< z3UyRkNL6?m7_I<}L|v zGyVYNV7YWwZl)4?h!M=PPjqkvU#+X73XV?kD1ISJ5>0ep^gjX(%^F9zs?SJT>i17Z z#Ln1SGLc4Wh%nekEK2$0NBxL}G%UH%BLy|tX4Z11vs|P1pgRT1IAtSk@X&qFltn;^ z#AFdy923Ta8k6?t#e<^!EJ0c8`3T-z-6CwBRExOS>9#Crhx&0O6~PUWKqCB{f5z#& zJ`IkhYC>Jnu>@ScybP&g`pr#eBg0NZ!Ces%*`Y(u$` zEh0mqM+`>(L>>ObOG-irJ0$#>2fIC@p&}5*P2YMQ@Y7s96ARE~%<2{B2@8I%$o(x0UVQay+4_ezc013Wf z5r+%)MbiY3=P&;VqR~!)9mQ>gIfz6QRaUn8&98<~f$vJZ5Lz{WKF?!~-54`im^lM& zsokH9ZHe<&=sRpq7?ZGO{@IM(vEM!X3y~K}XB?Ta2g@ujV+`dW5oU}`|Nc)|7S{}o zaX@_@HLFmq76X9>VP#yE8>%gh8+Q{xH`K0Y^Pga^;!hkW9ztqG{Ick^K#ILxN8T1^ zJ}Pnb&o?)Flz%{`QSz6l~3208RUZIkSkUDI>Ka1?UraPV0|TP9hd%*@aJ zn&B_bEY>bCEBsovP~uvOTryG2SR|mtC;S@qNDwHDMsA5g2#+NSTM*+I=oo$-S1T`7 zm|VzSdRG`-MqkV)=N^2?yTMJKNF&KX>V>fv5!w&CtFTM3tK?1bBJ&WKm6D-d~rYS4THd(ti90%MJ4joHn>P3%$lQSb5YJboper-ka#B zj}A|+^V=@gHpju2J^tR6$>%Jj3Ce+kf2qT+K{f$4Y1yH=*=u=x@vj(9NW>XZQA3Fq z+)Bt(q*LU~BsIJa91gr!3Y*%3T!JuNKe~#11bo=v#^1c&u)sxcOV2_GwTQTgAxJ3* z_ekRix9~dfgGjm9gcy407&y-8qZrocUX1eeRb+(UeAHT$JQPC=`!!7Chj|lm3ONe# z3&{#g3Y#U;`}+sh`yZnlqZOiEB6Oq5BJwc(DMeDI(<2gpr+JV^rp_mPNv=vFObaSe zD-kWGDa0s%ImfE4r)U!`|r>hZe^~%@DF5Dc$xHH{^ZZmAG0j; zwIkP+i9zTKzZWb=w8nTAKw$`@{p;VROovlUPmOhqUIyid8J5q1E5O!@XZt$>Y+NLp zXbS8p22aL!MgoSTs`)=Ee_sBaROM9BS8c6Hul%rUvo+GCUo&3QbSrdAbi3gDhcZSq zz-O=)y*9LL==$&bGN0OapI>Uf*7rQtB3DL+%4bf(8xrrxj?$Shm~NPStG`qmR3lf* z*;Cm|*zaB5UY1`z3AFIj5EJF{C}~c8pBl(1<%_=n-m5%}-rzrAKPldJwMW}%f~su< zzX+PD$8-T4Mqez_B)K|Ao#6_Nof^REmMCiLp7E8BFmFw z;PDOap9~XL7d0DeeFm&EqBZoPpiiyAHyAgsyIYjUlxkFO^1l>1fc+_0nH(7mslaUh zRO2*fb8fF@$Yqy6kT=^?ha9K8Kn`rlbIC&qQkg}Wl6i*3yv3|}n3>?P$}rvNOV^T} zgC>`Qo8)7^;GOT0^Rdfs-l<2MDYd>>{k>b6~14)ERT-+J2Mn7Qm4@wQ7TbXQFhU5afpNyd@t`AQ+4f>bd=O`R&slC zLu0n1-$x}zQPXQQLe%*Ga8%gxPP*_vfmGCm7xpk=sVDRH1v33_muN@J>*fy2)+z=n zQ6$}*mCa5Ne zj?AX=?2T+jx&ci6hM-?FPrJvIXL7#joJ@J$7aBH#Hd2?gYKTq?E=Dd_T5_FzZzS(yS2njdBL(xi(z!Pr1W(+LN$_il zTU^G@7bn)jnrpUZI_G>f&+Lx`V!bb(7A~8SD^QvQfA~&+FXozm{PAuyRD0;SM3EyU z5dT2(6qgaR?q&SE4_0k2i%3WcSzlTQl3o+S5-h69ZE0j6gmld(-m zhzNq)j0WTwYsaKcDy+Cc(g}QOsC|x~_yZBe8T0R05i^`@zcOJth*C((DFvMT5U298 zf|Zk`o3om=!4}jIYLX+gR5Yw6;D76A^|^!I40;M}6rYT!i?EQEmsyc%9-bY09y8R? zQl8a_Q|B#Tt$9@R)lOE7meZA$5?d0VQrwy&?Puws8EWY--uydup8JdxZ8b(|^B1{@ zF+K-`BH_&lMs-!fPlWUN>ncKeZtLIBJ(&T3j_JXPiR1taW z87FH=_&T~Y?QW#h>p;-+OWasjZ*wl zT3$9s;eBRpuB@JMb!oa=c%EP<>E@bdSPCGRxz0GOWW2Q9dzorbH}> zG8;Xh`&yA&F|<(eS1}{!3%|OXS5;W!;&qI>{{BkJ3owi#HuY$dqmjcsw|nIl)SE6B zlwMTxrCFva+&#s$$yK1^`$FetpPT+on2m$-*01gX;e$VL&08Cp?ctrw-z~wUKWQF~ zK(%8O4?{i_e<{Y4sB#5yJHb^pRj)fgQM67$SBaaQY3|5bK>AHqCkdaKJoMzo0&s6vN&NHu4Q%a!+Mctd#&eg3oOZK+5 z)tJJ7b?KDjh<$Q}ZHjLw5+d9`?Rk(4ge8jn3Q>Q4Vue}e0TNykbj6oOaiyXOA1VGS zbho%RiLn@^USLOUcr(Sccsisx^chyzuiIhVCcq#?{0>iqPK-?%kr_oTJuf4e^up9f zLr+#lUQ?c5{=4d1`FL6HZ^Uvx&1`Y|O1`Wd9pu%o-=EvsA4DJA@t5)N@yZFtG9xma zGg-4tCNvoi8L0mZR>9eM*)lJyU(qy8xkb2s<6Gf7Yn5(yZZTRv+%WW9zv<|>E7q)b zKWB0vQ8mP4V}CB&vVm*{tp0-$G3sd|yTzg!ZJsVOvfD93A4$Aaww@_I&dfNQ-(3#i zS@4j5v+T|62Ys6}P1}!5k!xpvTrRmS_LDu670N)*I>|5#s`~QB*P0jcwFEWd@b<{* zFc}dZZU$}%(Vs9&sKe2;71upwFGD=it6V12_jxjETlVy3zT%xaN|9K|_3@X~!(P?_ zdy=bx#od`MfdNM~Hv(67E~*u;N5T8<(pZJ&W22xowcD|qO5147=GEr0awoB0QPb0c zLaARc)aakLwOIGd^_*5ELN&i_-js)0E6|F`dBiAYUfD`fWBIJ8g#ZPt~?4c{)A)u z2R&je+amyvlqn{akD!Gk7)xIGSm1O_9)o)b%LS0?-54OruPZtz)2HGuI3vw1V78z! z=I>V%ulOn0H#_JReu4bTMja`awiXjU-X30)0_hOW+r})A*t6D=)xkpx6*h$7px>b=$9EH;`K~pcMHs8Mnco2U)a;V%MAlCM`#I}uo1<7D7Vhg2ib5QoqT*!Xq>$ca zi$+UmtBp4rzkyfoTIR0V&cxxn(UL^oFGCwPKF{8(4u9DIZBo_kvHZ5}3^Y5$EH*41 z{6hjJJVBBf^h|U!Yz0gKTvg%5sDUArezSqIftqiBsRyY>C?~!xm4eO>SKm#Qj4CAX zfs4txX-0`7*{w;OT~CUS1HP%eE3XtNEr+KEkq4M}I7kLW9oowt$HzP46p<41yT?V+ zT0byU@l~<)iM2(_?*%T^%v^g9i=WE(=hPQqI1Q(27t8Y+%iV1qE!REm-RDvdQ?c)m z25`0v(z=qSSJxDe9Zwm~yjB=J7(0$ukqS_+rL~!vhD#md;Ltj>%%|{MiFI{ zu6`mi4{tOg@nF_NMeW)8p+_U827k&@0rNntAY556avXfDc#jqK)g&rXs=k_)foKse zJ3=5nXAoh>$C296;aU`g_V)P=KNfj{HjCu%9sg(@$(P ztn+NnY{ce;MypamGTP&~hkDqOY0etTi(|G_wkGGwgdTA^iYAk&datc!t$DY_cca%` zyY&0qJBFCY81m?|n1k>_SiDU5RHgKa7?5u>%-W2plteTp6qU5p)XX*cWyghB)g3sz zx4H|G^Zu5%)|occ#~jC93r8G|>;;<^q5g-@I%o~5j# zu&Vk=N0i(sYBJ{%Y9?b@p+;nDFn@4*Z(ui_iGPDfRxHba=!$Z|e)zr%FiuUpv z4?nNbBoz~?J^rPAu2%ojoR7sbEwnSV&?oOu6ol6Zn&{amKeRKg+r9ZTi1rC#fQmfb!anB*eye+Pit06;n-qeDU3L5R-4B3`fAjg9X!ub!$C_DXAUqrg@@@JK&mDH_zB-dN^dn zCqiq14lPp^J>Qtp5S{ND)tbsKgoa;Tjqg(~PulR)R@c9uuk^xp4bm$#O<*$0;2@+c z8Yo+JE?utGExYDtAL*RAHXF3mH0C)+A3aWQ#Jti4=Y?5^xeJ=(w}R&(c(|251<$t+ zXYUTFgIit9pnL&dK3C(x%eme2K;|)s*5pNYcMHqC-OKABY8>T3-sG6KA7{0X&YYG| z(}BOt_Lo@^7+k2cgm1g=Uw$Lt2iMgip2Lv@dMDC|;vPheO6ZIEipdrF&Kw-0e}Nf< zO^$Dkr!*$2J6L|=(bl88Bs2Ju7wIo$qUaK-5z>_OPm)J+NK#W|pL%hIe%hUVnWaNw z7a6vcDv8l5w-q=LViwpKHj$e1Z*wfMw|ww9xH6e9XDBJ1=;nbFYyz$J4O$uf5JQB* zeJW(xUg5VQo4j8;AMMv{jf|co?JiB4c3vrONU$En=l8Z=!IIH=;;3;~ z(U7cTNu-(T*W6SJ^-JomJnP>mRRcLAm9NTIo6}x#CA8I^e`p08k^rK z7^pk>Ch_8G9coT#e(+o|WBq)3pY^iZ)kuBTdzSKW_|S@+8e1G&nGKFdR?%2(6D0jk z0bp_9;_8Zo3ZRGnc`-aVDElxtsDqqj+5x>S3A%#lH(laO0^(3@3w3ER@gUETAqdRy zO!J(2MxO-$Knjo%7g6&7p6k2&d>wccVsH1B^P)x;MVR;@3V=e2fTzc?`S-ey&(h*ku^#=#u%#zcYsC`qa46uw>mGAOyzzuyRvuVI0+Si){9&8ci|Tr z_rQCE%`-DL{tbH;i%9kgpY#e9>T4CcO{CwqB_<}Ck{DKAhfnZ!^+Y`ZG-U#&j|e7T z{QqyHPbkcv!;%PQmP&}I%r-gPcM-R*TS0hrzicnX?zVOc-vrc*Af5dtUfS`vYE!0= zefZ#oXF`sCq^FFPseFS2NZ5lnJ;)O8+Xq`V*xzup9kA6q>)TO@J(6dj`!bC76q1Jk zS_eK|Jd})w4HH0#a^O1?)LEO7l6(KP9k`C)A^C3wUm&<(eN_u)_1)Wd=yZBGKHD=4DpRM(sVaSs9`)m>v zX1NI_L|2qf7@=deGpfkTMfG%WZoXd4>e&Xl9rtv`90*cpSQ!_I&3yY6Mj6fhRZ{?*{ zK$n%DJztvaOtht&?ADrM8&zZz5fTmT$+#GxQ5>tNGhH*SS`Cz|?ADfHeZC>4oJkDU z3h&_W08LyHV!2*9vs{dXMti>%eM=7mjONhsh=fr1kyrljP9ZfrhN`N`z?1~syaZrM z3J{p}@kvU{%}DvXa6DgQ*nN9@dwP2MA!|Y~>$4EewWi$~wnn7gT2vv+klW7~+Njy( zWzd>K_r+>sWm6M2fQ^mq_U_L6;WRZViM*mrkt1BMji#d7e(K3)5qx`AdSPY;nC{dS z>F)9kPx~@DKAup3lZqi)n*(%7d^$oV7<0Sa2Rg;zcUpI=q{wOPq)?qx>Q@^m!$lF{v_JfP}st95wi1&7VQD9UJG|`|aa!47I^enEnTCXVqd%k^4`i zAs_luqt{wrRmH%|+ge-8!pFylg=n|c)!Ed<#l*x!ON&q$X%8vg;$rrB3O1wfhST&h zSn8c02eySBa@s6vsH>Nhm6Vp1k&&>qL%(csId~p*qNe*cAg(KJzAScFmDA##oM4@prVtBVCQ|f$mi#bN;pqhVD}c>tUCQzqSFp~O%w1O@{ZLHcU3|My}J87jR$jY-hnFb4kxmkf7y6Fb%kmp6z*^e zb$O3*E(txHcC@-2Ra>9`nop=6C5i5a-uT1zm-Og?&g7^bTe<8QecSr26&^5HNN0v6Yv@Y=^~a{p^&K zl%%8}9%G`Agsj!o0lBVq17+V?JPYF4W+{;}`Ow+fiY(;pCciq5o1r}4#H_5O+_W&? z5z4;WrfU0}B2gNdcT@uL=NQ(l!O#BPp2Wg6v`-tZ(s~OWHY8pzrP17q-fpMI zdM-~<(GK3J_ktIbYmyw`+f7WvrDMRQ5H2J|Pxj4eKR(%C4sx@kf?G&&$NCHj-uL$( z%N7@b@O0xLg zQc_iD3NrHa%+Y}^AZbqd^KRG9j5a=Yp~m)B%V_qsa;chn$Eo00N~hD!cgVBbumNQ) zz&OyC0wR8YgKiMrvFr~|DH|M<#ei1-Q{p-xVhnl|*JcWn5_@p9j|Aw-{6?$!?T#e2 z`$OxcKM7v!FvCRjGM4o}bo^(_QLW!N)z!aBsAHuUI#vVS#U-DBpqMwN6K%Xm+MBFF z?$_ZDT`an`_!dc}y1eEV`$K|k=jN9Y$OZlfA|b8`VML+u5NOVnG86vq8P22VDn!xiZSM=FKV^ra~-&86E>=&M$4)5+P0p5rB{;hhRql#!6 zL@4mkNO$Fvi=qGf`o7?YNa2m7oPFpNr(#KMB za`d&ewN+Gld+jildk!zmGI>2K4y#u;jvv}KvS0yic<`{U>Mj_94!MaucCm1^$artPl=QJNzbWBfzfzOC6!siosyGm^YgO<>&ki%Av1I(sb?+}Ydt`iRI|1hKe*Sk}= zs%jE@DKO2p+xVXT`ePwU{m7gez;qP}GPQ!6&7b)|-Uilw5_n1`S7xv{S&9l;MQ^wD zWmWi=E-FBO$WY*}qYpD=v}``pMO8MyWs;|?r=B-n;CAz61Ca2;=k#KZ$~D#m$WEF9 zfD4#@^!J??_0I9%C@}Ds3&0fpwfa6v5U>9}eY6ExbdEAtk>!4?t@H2@3=vJCYa$Bs z&p%Jb<7PVd9kJ7lp(PEOukm$x3GRO1TUiS$soZAP2fZ~o_-n!f00U2xt*y=JAAV^C z)4ihw9RLVZ$Z}dJ4;~FGSiu2 z#WX(>k#qyqqmiDa5nHuF44MQE><2~nqkh!ap_)e268hlB3JHp;qU*-`G=+DgY2cyZ znaZzFf%Vv;%vePuOcjm)GfvVsaDdQhs%S3V`6KGGd!=#t`O)l)$N`zsT`2d$U0G-E zj>0JTw?LYOZePemh5DAy-Nb0>mjB(tQ)3Du-_N zU&tNCBt}<5Ti;Q)2rn7Z-3uxTYM4jw$t<-ps98F2Zr!j~SC=59f|VQ`7_iC;a~-Su*r~m|*tsqi<@*th8q-Cl?n!r<@2k)nL3NMT9RFlQ^;6edo z(4EJMLrD%Z1kt{32DMO#TiONw^`kiLbR0T_Hy7e&$T|_&4Zizm^ zj(@HGd+vtxqbsQEEDR*_e#bF$`d)5w^MyDy#pn zB>AR5*NyRc-uIzOI2$*8g?-dh9lIa{HgNx6StiI)YxY#O_tCsR<=^>(_xBqYuMnO4 z?ZX3lS|abgA` zyHq2PfwOhk_AFiyjktzfD%D5iVeQc{w934I2vX zHZeWV?zC;F#B-xMgeP8C6-t!Ypo{Y7(#S(<=w{2e1HS&qa`c03V%*lT z1L#C#Ta+#qHW+8Ne#1d=Y;n4Q9`cO;00c<~2qwU;LBSOp4tHszvvG4(%Lw{NBpUU& z_|Hl?d+4`*>L@>ip*)d*efhS#&;~Cks7c;BZY2RbF8~0Sm6o!*%Wq?$0V+T>tLirg zp+9Me%FmeAq+J??%Op!UWW@+On(`DC^$#>EOY_-W8=D(hG(yM{y5)&$)UZ2xcCy^S z{7le)y)J#j|GYmhx9j1t=4f-F{Q6n7-TT{{XRS8hdlu3r@Wm@9?``bL{I<%w43_g27dtBo{qBx#|7&Yfe^C+Ru}% zV+2a@+ArsJhDZux$?UtF0MeAhVyb!WX8<6E6it+ql@oOq$hx67(SwF&46?SdoV-Dp zfJ%13xJ_>PBAYGtg~#ebBBeUx4HCH*Kic;P;SwZJ-_YPIXm~W4Gb0WdL417n`EdC1 zh@cd{np(M|#_Xm_#G4ki8aWp$x`Gf45{z;314sc z;o7CT6;j5xVG0K65IK<`&#`(eiMpK5G7phL?CRAs9rBg3LJmCvHU-rdT~nD}z2&nR zkV$*Xei+6|qQAD5*_&DB_G}ZLPt?;|KZ%Wa)6GH3XF$8)e<(W`-5)^usRDnc#lSwh zCw?KVPO0F;!+!Hm6}_{3oH!xMC{eMA2jquB(~8&fLYfc^g~%cf&-qvf zJ@(!c)S|k&P}ck?=yh1YU}S_i3$&l?`+;kZ$cVvO)5Q;>608h`h+f)~5Ea?ZmC%u> z+a8NEB_@7RSNzwrBzKr7XEi556YL%He@o&Wou!-p@3+w;jPx}W0^h^;w%$&CU1$`b zEj^!CLMfMs&Wy&nbg(2?-(Y3Yk1k`z3ERBnkcFtCKRlWl7mch=M+M%9jI5nH`;iq8 z22DWvDCJ6Ym7gCV#hAb{$S{UKUE`prGy6EJGH5%A2RMpxn#65rwqHxj$>Pa3G&BwR`|_gG zO8D_BH)~@!&sUs>x||w`VKy>pd!!I%e6mY;Oz<}q5G;~mu!ylDTG;O(DQ&d~&e6Q% zZ`uYktf6nskwVz?a-N_1CUJ2hyE}~OqA=v_*Kc|Q|FUvJ`$w=bCL$}ttNfRZfa3!j zG-nT%w?>}!GNwtXuhTvJ=1^1>TroGLu3)Mu{9b2{4uUBVUsO+t&KE0v3bHt2wy^D zUVK+OlTxky7bKNuq-OVa9*KH(tW1s5CQK@Bd<$8^^;dg_OP0@WX=xGkeMw16vtMsv z6%rC+WJCs>o}JOt(FOJV%oFtOFkp5L_<~?V$xC}uYZTo5YP6B%D&%&Nl$V-|0^sz1 zOu3{{iku5W#Y@Ua2zV&0$7!UdrX&*dk%sfc+}$$+nYOh4l@-r%*VS@dhFkWl0|vea z=FpL3P`);rp7h-Jvr<#YWB0)1HjphLB^^_k%z%pU}&To2kg( z08&;~RsjJ4Ztjm@ZzPe=nL6^&D(et6jLTuA>5uKv%y&8Yy=;mxtn?zpg~PA@IOAi7{shy-%rPD z$lV8PN$AS!IN7RuaL7F+59DDb^yd_$)aLX-W|X8~n@>){pK>*H`Dgs4BT~kRe;%t| zP06RjoSWlsz^;PqW4&;LQu9K~{mqqm4$C1l2v+4x zV}@IVPkL^=JWHfQ2%mL@RWiW!3h(s^kkIiq7Q!EW+Fa1X=^AP&7XLuL*~`E zXR`5O)>9KOYEBqq{eqn)1wQaRlZ1oSmkb~}BQI~yHD`7dpP&H}C&%%Z^&6Q;dE zApE@jCVYHf;jfc2dMa$3K4fwVijKPC$~~6Wh|56Cft(Cn2e@p}H2ge5hgW=PjpMns z(m#ZrOPCgqmiD)mHzQe_`$*a$XfxL@0)mGTfqa6z$|efngx}S51n_DM^ z?acT|=*bWv-#4NBKivvbP%zm`_NS6kp=U^KlaK|`NgAx~>&iGqKb6W>!HiwMlkc&PTz$8p@FUfgGoQ$bt_Rofbn99Z z3)}Sn6WljkjXyg5$dQtHH5xb$JePfu2@m-Cp(FlpWFHB&17##eElO-Mp@SrJ>K3Dz z@(Mb`J#9_Pl@Ui11MIFTaX(&kw&#lhFUBzp&QT_OEUI&7ZP{93j(qYE;md%CiUa4u z_HRLU@`Jt2qr(d$wEs(D{2x!!jSn78p;f)c%W^K1(TloGxcT~3d|7*YnL_+_`DeJ( zNJUcSKZg1SX?{_P=nw)!E!uSWSKUGA>{zV;lfY4aid|=d10*Q&7mFXmraq=PX}=?Q zMVQ#I*dYCN(f@xl{r>fv(|xiC0N@8B_>t zzPxP?NkAV(JX1t&ups3!TOnCApEnRM;!R}u%Wbk7f z@+WssU2l&-cY?oSKY>S~`(r!ur%$lYKBA@BQ8cUKpQVx!HKK)~ylmseZM-4>qzaH&Ez3kO#8AQ^@NF7ZMB&mCQfI{THUHD{+WltNG~H3s6tZb!@jn1sT~&R;I-s7s-yZw@yU;zUuGD@ns*9}K z@-qJ&^%gaFES>SnkgeDvPb^85-NogOp9!acbes@cxZj^J!FJhv zL3BBKKL7wlhFR$7-9OS9qQmtiV^lz{oo+60glgwgoUdj4u+TwZDxaXKk^S zhQvw#~Bd(&au#T6N&H5TdW2<#0gcLUr{EB@fc$dmn;}6 zfAVsdc=>2KeC{8N4JS8u^WVSAO@FMi#tvlV%sTJa9$cGB60h=Rt zITTEGNUTLwC7Re;#A51ZXJ_;LULsvKyZs>_REnvo={G8>D8>xIyqXU+{6MR6=}ZSe z92^|?t4)34M5pbv>?mYm$`F?y&w9M~)j!up$HvA+N9pM4+5e|uVq&5v9v&Vd6L8Hh zE`D^}E>=Ip#w|KRhGHok`C3R;-x~pM-RH^ZA_!t^2ziq6xCgcfD}k;CN%+3bZQm1x z!nhy|f_dI3d^9Y7N3E7)6_KueVtxBy-(+c_pkp$_6yedx zsOV@u*V7OYydb#Ks{Fm_7$_pr3m3CVeBM(G?90Z($)mr@Q-N5oRPGm7gNC`$Ym<=~ z#*YlSqc2~IN&Wfj_k<#ZMoA3DFb&6pCdd?h6#lbZhSyil?eKt-5CBdz68UXF1gtZ$ zu1Q3qyrKWg!0}$(b3<#yj2{{tS`p@Xtmrl&589xP6bdoVWqWXPN``z(Z z1tA<@mQep!o~4P%#xWt&tj0z4AmOD)2;M|KqeePJWC5Dt3!bbPxeX2E~t~L z7lPLLJPM>3iWy}-Cg1XTD92IE;vp+iJ-nhxZ~^bXqZ+!stEG=U3?kLU;Q8As`fY+u zIevB48*AG8<&F_Gd78SbH?Hl;$S6D$jSm;6*q60ej_-uS2)|W@k3$U%9@o7Nt911> z9A8W$lr4vLuF9#ld5-N!5qSo5jQnk{c$s?={C;&C4GA`DlIal+P&vJHlujRMy4Xln zZ_T+o$WAj`P*ay$e~ZSzha)`?Ud#i+?EUjNqj}yU^jGs?K)o-u8eLm#T5}?PlR1i*_m7e~zsOx|i<}^$ePP%o=f%P@MO2R{TtgqCHNxyCW z!c8fQgO;A&M##Ho?*V zCc&imwQOX$ZsbP(>?WMmV9ew>iO&j=6u?PT=@NEiQ4p743uCLjReClTXJb(4`gfUp z7JJCvR)XF**7P}zgoGq7IXO8!eW_fPx}Ri?5&fn zx{{)SP)E4za|vl(Q(ddy!pJ1gxG{1)07{o;0}O(W!c_RvZ(M3gh< zSz}<>Xneq^ssA+a;xI53zvbya>B2k#dFwk)vRm_ejy$T)@QXckX3TnZyD1QB|8=!U zh1%Et;QjFa>c6u4+0&5 zz=M*Zyl2Or!nYu%cDJ;tmaDiO3RJj&GGdSYv3Q}ek*Uf}btZ#P&zrTbk%xm~&LfY%N*EW;0_Y?;WFO4+ zp`m9n?2}q8jyoTgcPIuAX2;1fg29;*t){Z_!zOJQg%fdoT!BXo*6)Mj8VU7rks6s7 z+5jS$&0OO+CiXVdg!L1<+iCMn%R`abo7X<2d*8(74|e+X@uE`W4?d4${&Y)k$5&#O zL@f|Z$b?*P8HjX%B;eN+tKR&90Kf{z(!|WiUpCNrx_=M2;*z$Te!tu)i_%uh7cEPaWG`mtO@^aC$$-hAdc7iOk}(7TjB)TuTWMbi<~aBLrRA1~31}F~@w!<^ zCvq{a9K2{Tn432HjT&;3O8@B-8)Sw1JfC@&4Qp$18JbHh4~L(aqw~Utq`P zIoq!a_InNmT;KFQ<$7MvBpC%mZO4pQ7cfX&ynZ8>6w|C zS<9@yKx}4iu9(4MwAtZV{y(jSklcgqi`Z{}ULSe4vWUY!2AwbN1aLw8#PKZXi&fg} z9@js$i}H;^_)b3a92^{k6S--9IIe$Ad*WzLZ(QH3f%dA}g|cV=jQ@4qO8m+sDo(K& zyhx=ei&4Z(B<^KI7)RP6Crb}bT7=?32YPgFg5O_Z{-rVMe$+RKyXQNR63iTP{bLtS z2vLQS7;d`IZ+Al``u_L#Z}?(R7z7@Cb8{mhApyK&)NP6|kxzj8l1dsE{^OdN8BR3( zRtcU=SS_6j8|OD>+A#2x*#ZQ^2d^rG0>+RdQ)&@IQix1W!sv&Q=>m#-;( zqQ!PKTW%93U}Pxo@et>Vx~v#YR83)Sz4}yNo!fxR?x}jzFF0C3pty}=qSIZc${L?6 zz+FwfBqS=YA9WMR-m}M1d2}N=rqYK@CB2kDtwJ?q}pLNsC zwUo&9G+q^0MUx7jJw+5m@?Jh{)1)JUoHD)OK;vyEqGh|gS`$7^59|gtb~g?t5_-&}?Wd4jI}c>Tj811KNS$-R?BO<5#)UmS6zdrr(3e?OX3&~vUt&14{odfJxb3^pYI=UlSe&6_^F z+G?R3C|6Q&sch?q^u@OhN^)lg84zs}F>KhxbsLuOQZ^5A zc=qAo;6{>ISm@{|qQp?T_va5}$;Zumr<^-!B~X$v-e9J}Y_zTI4Ii*Y`P|N0t(U65 z2EbF85SaLX_J*B(rg{&=AU7o7gH!Mue8!&?dO(H%xJ7|2L9@eqB>#N*)8-ltsm#PE ztEi`%L{LYcUEod3x`A5z2;w0~sVY|&JrE^&oVNz02l0?a;Az&ct50Rk)8_TwN}cg> zcosGGdyFXos>>}qbJ}O$vt_L=0(MbP`P;Jw{fy_mIEfZl)zMb7exitVi(9gT;2hd? zhZ)x2F>fnkiZ>*ScJn9u4KK}y!$V2l^{zoVw4jyQ-_uMGXFW0jZ(4P3=U!Gp9C}E# zPxt!g^2fVpq!2Q%86S2jGGRPWtNw(bqR=OHc+hMu$j`S*oQ?s`Z-dYrdn6EBk@M`W z&}(VoTf-^_0sk5?&tO|&RALfQ7Y3qRk_{2X>hrkHGQv66sLsyY%gjTIEjlq*ICbHt ziPoVLoms~jx$|_5uMg%a~v;GMUisuR2tc}eK8-sG~wO1 z6L=r4xi@3!yOin+BMH=j5oHN?bO>Z(V)`8sLBwNE9!TcL zQZ$y3hxT)$)1QdTda>Qd%gE?2u?k*W4huvoXAS5^Er15%napVt3SeVV$%MRt=cB2q zsi*@Ag#X1FBFVXZ|Gd4ut;}v@oT5e#7ZgY97E`7w{zXmA%F@!&(UFo7NsiIYvex$V zCXN0O_pX_7%2acuVAfahkM{FgtWX~-r({&|v?zm+#Z?iMEj5|dcYq&fWnr;7og}OI zusMKf_p88Sg<`3~kFCvLgq)dK;jHlv^homHG>(mh<*XOoDL$wen2Y%7eMM;3;KwWn zK8Tj%%UkDRTt{tKwq;39i5NQB+5IElXo|rX@1LIP@D$>6s$==ZsUKiDG>+kI=khI> z|G8KmPq#l>E|o1!v6`k@_-?w<#f)yTlCyQ5EN)0)jSYL=)eiJ6BtY+N5 z@e?g`*t1#FT@O9TUM;a_QY@&^1XSOkrNX&m-Z#a_EsO>$P4%(yjY6 z^K|(qQsWF~`ql;|HMP%QF~6#+)!t=&z~Tx0;YnNTJ+#2R=94yZ`jP93Rp!vHWzL!nP=VG2Rw$W;Ww4?0(aKG-@RYT2+`Ls8zP)OkVZTV<5U#DT$jp<;% zrbSnFLa1%H-d3llPVA-i`tsRD?|rXyHz~`f>xE_QTyGX1 z1dm1%c!=7Q?9j)V8!fn3hWvSZOo^4}HLkcY-REh@JZqi}5zKcv4{o$EvU~9#6QQ*s zmfc0h{LU0&GGaRm6uguZQr%xwG82*HdwACYFuO=OxA%c)wY4t-|NeZv1DKLbMK6Dn zp9w}IX?8xGwq0$;v_K~O<64VN!~Fe08;K&d0Dyz_W@_W&;tsx$d0%v)S>trwp>nTa zICSLY{Qw$dez&ue`F}+75t%T1*4a|KpRfk~?~8~UYlZ@4_@6KwJPyBR-WC)T*aDC- zkVLNZzv7WzqbvJDYiaz2jv$YRZ}AvNmG8ET+(ck3LK^Hha!qJ zY6S$F3|z6u%(!HHuLL1p%wJ=NIW=Axtbq*)3Pgu62O{}^2&0ki(v?;*+P;%Ym+sWV z>Y~Su0>iU#JO3^7?{RZEd%ygQ_2r|h#;I%5>K2_@SDgIJtgdzzR7hx+DMXfcySZFL zP1VfI?IXJ{BPfzk7!NU2x7kQZZ8M#y022lFCPu+8RH~$)p5xhBZy!`(-Tal&^GP{#>VpUv&Gr0*BMrZ4O>-et;Phs?+U_`e`t?m&6oO zKZ-N}r;wTLc6dMBsyRKT`us*kT?=$~kP7rXXl^&%-YcDG+o?WO z@gkWHxxRPS)8MojMcQ6Vd7if;;*#gtj|@d?-q`6t6?~bT8i;oC63lr9&u+lb9Hsj+8k08H=e4#)dW@K*ovKjK$O7!f!2R ze;76L_tmF30O5Jv=Uy*~S=)#Pz2R*?K$fQ}x7;5+?WoECxbnHCrPi;YdaZY6JN2v~^7c3qZdoHi#&6k0q zI~Y?x|Lot{{>p2mc#(#AssF`F`Sk-O#U=tBWnQ)X43zUv?p!S<$TxvuWXf_=WZZnj ziJ;!NK4yxhqo~~u7vEybcxWi*&(H`-KG`K7K~o$Wv;<{~S`Ld-xg28&ajEl44G4a% z7YFPjq4qH#zmg`7F$qLvTux>oqrp(4b?>^D^oR+aI%88Yy?_GCWGs-X1U31tnyP4M zK~og5)9kN>eV6k&2BwAEky@XGlfy%FO7( zil}i`aNAy);xp?%ynQoIKe}@l?b;YP_rACvVYzZ|P1wa<@@R^m?%l~dX-yC86&IC` zsGw$}Q?{+kDakn0`oMv-^)m9CibTIYgap3(eV2Diks{vp@XFk} zBru7lspBje>5C$O16`go=P zIu^*(mKCXIFQP%sc_KsM!fE-~_{i(kHg!%~yFpd;kB7hJazb8@`vz&j6xCTmhh;>} zX)=f&JG+IKjKZMBx*FsCyK0ZDHpt54PY9Q}?u>5np#`efN8rIJ+H6As6<8$NtolA2 z#BQ}$EG5Mxiy(SzKjQy->+GB9c2#SASY)@2_L`=~cV2nvK$CzV5c@fd`y*xqT$6o# zqaa#Yk?xrg=j#OOmN{59_|5FF-K}Iz6_uG9b43BCg5UKHwh&hv8=yV+N%)f?XxQmD zJ3AY-sf3eXSy|cK%*V^CH5=6*{t#wG(JiNp)3<;9=-m#~_O)8%`KoGjce;qD4rn0b z786-nSzTRX_?{7VGpzPzY)mnbAuw7p)|$`f-UW73q7>}129XtVe}?emuW`4N zi)u(bywK&#eFGhcF^$yss8@zA)!GilkyU#|A7!AvDajI>L@uH24c-+ru(Y2neFXUl z4G<_mTMJS27Cm{s^r3f8B4_z-3_fMyt<*PuF@!L8-!bY`aXd~Rj$0Fa%4g8&(o|N3 zAT8JbB+spg25s-b(UVXIJ4Pq^vo_=g?YBRl$;!xBDoTSoImUok6GbYRD(*u~ z(OnOJc-u9H>I@V5U{Jf&gbg$6{}S=sY=i*~+b9~w^O)@t1_gS%y7M<8=n^q}naril zhY3O9yNp!1jq!bIGGBMSMMVk=!=B(bKP{Q_l)fShbRKWANcNN#J`ax|%k(%uo@nK9 zJeev!EDkn007M{*J@A`IT^bss?EtfYQ4JBhOnd1 z(>W*11}FjA5jgEzV40G&=9lPZcKLRN8blYW$~Sd%RVLGcnPcl`N))O=Ctj0 zZ)X>k_{%}wrb)FUA1a^oK|sUW?NyG)K)U@3YLc#6y~{Hdi!jr5jr$aWUAsU_f#v=0 zBzXpUQu~42dzentBz<|@{OZ=N9d^Z$<7o+dFZa#P3Sa$%*IkI8y&Wzh2MCb50t7* zL3u-bQ5&kulUizOYFb*n4qLrkvT2-Fi37*^r*a5{Ce7srKDTqHm+QqUg{`gg@^g#W zjfDYD?LVh-Mp!y@_2KNv@7lb&*v?7Vy~dl`bTB8uO_sBL@*3lrPPTR@@KfB59mBiU zD~+*E`ntN-sh{r}9snECC*sPkF*{P1v+bF6eZk_Sy}N&@_B+BK$Gv}Sa)vbJO?)u) zr)<%TYp5UNe@UOvf4Zvky##zI{lV8#dfq3$IPvctkk+96{mTAHSj^sNU1rel8@N9m z=XQ9$-!vA@K)-a1@;~Kh)wI8Ph6mbqA^&Io_ZH(y8>K$~i7T-@ zaAW%9g^hieGL@EWsGYd9hVfO})t7Wzms!fiqF5`XBbplYfif2Y^UO#gM8Sxv+*zId zI)!4fSVZMZ=H>7WDK)uPf&d-89)>FfH=yPhpi2Kp`&CGnRkwZ?3Hm=3yJIs`nzQ!)LosQiNgR28RME!Y|jTd6i&XuF`gC*i*R73~W0R52w zo5 z*3aI;MoEvb853VFpbbWopZU?jn2%$EjAs9$+{H#2itYRxn^C5?sD~BBqt&)T>law2 zuc(iX;vdZ|JKl#NUw{{=uCAWSm6GDY>J_Q5_^8ci+*!vs!XZzkhkWus7T^c^vBd5w zS8d?r-6_o4e82D~kMiI@vc$W)(ipmxm{1P&HZY3qQYAn>LhHfy&uu4gon*|DN%83RW(kFef|YzI^V6elnOzg&8>)t$Ll52jj#eV3bwAP%`+>t&MB+1?U*pSXFY!u-CTuXqZ()Z!8F4E& zIl5{uK))HF66f&jVf(n^WvZzCG2Y7hH{S~SBR(-f^V-v8(EPthqr0zCZ!l|ooKW`6 z(joWntB!9!!!Oqzc)=W}WbgVF_=p4~4=``bFYiqc5d<)`=paNsECRdN&hWC19T3Pv zol0^Rh77Fgaf49k`8lJBb}tr`T~cC1Q0^La6|DY>ApT-CC-SeSG*s+lp~9fnlM6+R zR{MzfJJ5+}n=iVNOG`_s;!#2N<8m_`a>yV_g=Fvf z&a&E8p*Frk4h{~@F&(p2cL-7G5jhpiQFgM^c#}M$NTGn+WHlm)gR|Bz7xKd+hl9Da zvJ#sj0PWRX=`4?~LiqanZ~{Hl{3qQ9D^(5|a`TjeU1C65)Qs^;t=$H^QB~%4?%qd1 z*JMqM4GU7(UXJ5E^a(vkUCJ-e-?h}7hJ2_Qq?epvHbbb8FtNf{ToqoievSwc>1rbz zbXlAtJ5vnqn+;nr=O6)n`+rCrkG&x+jwowY4Qr<+SAj!NG(RbtR?#HrNaPKP0wg}8 zODW`VPLrDM`E3*opgANvyMfjZ~9l z#2pwIh`4xjCEAm_3JL>7F4bG4ntlEHRaseCS2ta=DSB{jdO9v9#;?ZGgHJjmnl&s< z^pd@wV4H-|N$F7Kdu*qyxwOm$~KzFhKeutpod@TBpQe-;pLQaq0-6$K7U zy(k|@q!c}~i6W$T!cp+*YP(^~v+ZO^Kh` zc7*w}Wu{civww9@<=&`K4D(167^-&|4{cwLL1~6xi#vCxANt>V5CrTnOoaz@KkPIo z@<29>eVXCYd;(mW0i=yiUm#C?WNXjGCOAcWNlQ=HH89AEjh)gj1uW5x$*kIm`5~f! zFx%JH7Zw&)Z`0r=(3dIb1=Q}WH(!gORB;{CB>qg#%m5sijh9kdejTZn{PJQ~C&}4z z4LZO9x}2?OWj6hCcKs3PMF{?&4g}U#m+*6UL;{436|+b*TGmfmBk!M0TBb^jn?|4;N>mV4;fT-N%Cwc^r0Y zw>T5B)Qsk6Xgm6I4>A-nqJh|21VuWHi*@+EZI&zK_TP+bq;uQqT+T(!Vh`N7!30|R zzP*%Imz(t8PM|zHGV?t90Ct3LYPoLy-@{2i+ZR0l{Oyl@9I^l7x=4(%Qwy``-#=Uf z=Xe{O6uB8j`u|>6kKUoe?L6cuEQ6Wu^pWsK-l`u@NiVfOyzBp06aA+yM?hn2#D^F4 zYQB60aLf+z?=MgopzKH|@+c1xdsys0gv7L(?u^&qA1}&ZQz=Jk@Rs-~B<~|5BY|xn z|4k`)ZH>RoRLjlC$;b&fA4~#ophXQ}X#tEIkkfh}qSys=(Kh2k#O(>l$P56JJqkQT z_t4PQ>ViDK*2Qe_>muB!S%JmUsO^jpD@txj$x)0L+E+0-@~C~Ta0_Bk=%m|?EH;f$ z_8c{=VQPV?7QKlBsN8+7-sVE1^H>G~Q6|iwtGb2tGg6T9={~Sq52xWM2Qy zV&MB2P`%1{ujG;%Q&{-Cy?>vV0F+5GFd-U!NKUK=41gpbpaX zy(~77B&2TT;rx!~SXw!rci3_xI6!OPFGr6jUQ7mya-30Z^pA+`$kAGj$9+lnPV`{S z4?o;recwkebT`YfXUc9vj>G)TjLO`!{dO4*9_*&O|MGV8=5?WD3+WQ0zm<#rwe}hl|B>YEzo}wcOZZR@rpanwhi-_N( zCwqrSb2!qp%R~zE3~MC<4&&Z27=SH{L^k=pLCK^3D=$Y=QnDX_6N6C*w_K$Zu3~PK zfa(+NBOlPAG?~J zQzeusbrI8@`WtO@g3EPmmJsqy^8s>$a%z59w_4%D zD8{`>4d;tN2OQ*6D2>M@WNKAk=5dLZyTtA^ltn2XIU#94vfzznLm_aANZXKqVdt1V8sjCR73?IC$e?8dxfK#136 z)}Y0q9EXaUU25*XmwZ1JRET4nFV(0ZTc|kKp5$!qlx1mh&Psp}=sHLfE;lexRsBH# zAKd!45N>t0kuwUAGz#nu5$AGBEF~m@2zr~uaB*>ak*H`{SZJbdHMF$CjwQG3faB!q zTEBjtbcyd07Ew|{e;LZAuCI?4Wk8bd9-5Kx6?E~a-BC;NdGfDP(aJe~h{Bit)U-5- z<6hV#9=1DqU%)IZQp8uQv1bhd#L>`>iG3?;>)tvK0m(nSQy#t@2A?+4b>?u3!T^f- zH!~qr?8DOH;^O3FX9jLXc=!hhuZO5#fFpWTsn`l;HN}P0oI*xG=Qnqyphk?%#$*%_ zN>67f#+kK5SPYmD%!ry6iOf)sBO3W{d-_9YBS!K_Cec=bl zd{<O?FL&tfVGC)oRWE+ zR82^KW~*}oSdA%kGn|*+_ookr5fTXLNq^4)^oY{43Y5uI$io+}(iOI2}R5C@ZO0p`PC;5m-v)fh@hpxA4$V zRTi3OWueT^s}IlK?Tw8*9OU*aUyK>HS?2%UNxk(c%DZ58Bh}iveZsgV>!p=^=f~L- z{<*q7$cu497Rsi3K;n@}*H1=Ig5vaFL(Oi+HXcsxdegFXK_jCmCwJp6kj7;LWJyY8 zWklnPRRbKJ^;(NR3&--n#v1qls>`k4{iNeGes+Ht^#> zfx$Ex*KW~mnap+noGYMaI=!DO&YgRXNYipfjNc|sZnMLlao(|6jomCJ9zCc}cb2~W zTQIZ)Q;oAa@D7UE&41hKs|#A(vp=uF2<##G2Y*Qbh6R2um;3|4&grMA8PD2_O4ptJ z_eHPq&c^Uu^ZT~aqdA(PI3_K}Sg$1ADmKGPHbbIHvCeoU7$koXQXq~c7PL1~paPb3 zQ2|i^TR-mo8dIsP`uXXZ{_6R_TKSy639X8WhWygMaB0ucxS3-j}L z=j#SD9JX%Xx%(}yvZ{;P+cVV<_ee3j@3idCrYt|L9373l6wXM^;RIqpV^akBA>Muc z2{u6#y=X!C?8M!DT)KOd@C>D7%cC?{2%=7VPH(G8LIrMY{`foo7bGo`n=GwFE z&u96km+J`=6B9k=g+u$l&CO2$hK#T8{&(THuk4A68{BJ3$O^9L8s^3n1>zClPH;V2 zVRKo&Dd!~gLI*VTrD|Rv%2HDPD&O!gRxJ6_RPZ;I9Qa>=^>&}Yn1h1@V1bftvBLz4 zTZ59BapJ?!oU314!Al`k-I8@E_14t*)}27_i|~pf8^wvc{&)Yj&QB2kUKS1O@hio(U~H67&_CiARy9Pv5Y9YwZB+773(D zF9?E1?w$ZGV3LkCHO{_7r~u4eZ>anG`-6jmGQPf*mMqWC0=vSv%|;1^=dxe++l4;i zaPl9%+&`jgz6LPgeH{d2{KD`){~PfRVta=w($6ZxFwG`l-&KGscT-S#dl(+Q{8%-M zmfhIc31`MJ8Q(+5ZUzjQFVmgI!y@>HJZM(G`uMy8?j*DE^dSvBT^rak#>dnI9X{3d z+J=T`V6WF$DyM$JOePlP218OVNKRo)j1QhjR99&$k-GN8| za)W?QdU9|;F3Lp=H)Ra^JBS5FU6JU*@AcO0OdQ`zV}Ir1d!k+sTYRW+hL?Uzs0rQB zg6oiP=$L2+#}VmBft+dHU=YArC;R=nu;v#6WPdhc7|Od5>byG&CAKuJ_W@iNzLxEXjz+&^^c@C$9pq zL0DMWO)~KHgP%o5Ni~h(L}{6sZD$JPZ5zyYij-q91xZFAxY`hHbW$Gjk!c|BrU6Ne z8iDaw&R)R?xE3Hv{$2_{p1`5qUwc%I1JfE%xGz_$6IMT-Y@qdJR5Mf-yQ0*B@AU3U@0qGYw$7Kc`z6Xfuv;E?;fyJN|0RFst6+n3@4y&Rle-&YBV@E0a_rwDa{8z zp;WS8qr6n9_&JoDBz}a%y8j$aB{|b6RE7FQuMnc2F}iYlG9^-*l&%w{9^W zJ0;$n5MU5IHR~6SUnL*WM-#WQ66oUf$wj}jVR^H!j)6}`xV~dzU7^361YiV`!>-$r zpBR{tIq#AA*%#<3J@)j$O|bLGKW<0l8P_Yvjqvn_vpR`&VT`j|+t|49WhCi34gvej zfD;IhPMRJU*A2|7U_Oh_)P{$L12}0=P!N-5rHGoEHVrv7wZuX#Km-pC4({yy2$;hK z)u+T*F?J81&%m)67oP*gZci{OpiD!mOr*3dEZ%2TlNg#>YVz9j?Oa@T!>+DELqmae zeSE}GS67ZFU}9Fi634KUOZVPEWHmdeOnAy4(BDb=IX~dln>vzMSI$78xN`IqUu8Yd z`Tz523Q4yVzd%2gJ-M(Q7ZHN6GVqQLOnbdKnU2zsJ&+yIs`J2iU3N0jm%oUh`S=lyddRVo!Q%y`1@m_3fs~Fq+^uNozU!f6ax7|aF zOZi~W24~-6YzTw)gju0D#>PxXmSTmgdp}IsXZbhE;VgJ`8sp*s1IO~?8ndyIii-6X zw{rmV2AnDYOh`pVWy3`@7I^R3_V3?6V3L!NkO0h{0PGNmNWXvo7LZk#shzFm5S8|n z3?A6VY;bg_34Io$MfEoAKeVv6u3fU;&jS0(%gcZL+ExEAt*5)Yr>DopmA}Hh$i40K z^pu3;^!52Zi_1p)`}gla{&R9-@9W93s$S&X&p!BskMESu9&BIvYsUar!<+}8{LR}cm%X>9zo@Mo_2{Wl#ho6xAR zAyT%ZNP*Q^NL@cuNl-F~21dHd>(tdSFbT$)zy^YUB!@W(6hPPHY;?IA+BB5bjHJ`yh+WR7qm6&sz`0;B3`RTj-J;HD$ic3ly`7)gL z$8X&QfQA8hNktJ~dbV-QZaVXs7#qj^`7;nrrdWdq3@B*-={l)wi{xeM2!2L3nK5V@ zNYIhIQ4G&(Zq`oR1td+tOaV+eQd2*^Q=9D^OyvS?4Idw$wzf9l;Is%9Fg7Bx6-y~A z_+s`IRTL2wVz1ZjbGXu_5J=*OLv(92+4bG(TcYWkP~$j1$=mgmayM=6Pn588PFw>n z*5mIxV3E%z>ko>t2hFyoL0SH4J{$8e9R=qMz3(c!9TQ-3o#JcIa~TwLyEyD;J%!J~ zqV`YOrB7!hkODd3!q&2#3>aT2?i7TCr{>em@5db#9w2Q+7<3Y^vqjvI;0)vp({-sBJ+rBB;z~8SwR>{IcvL|My`?-&_sijhcVfdo;5u=o z{q5n!x*>x26!+NvhsqP&Q5h2F0q}>y39u(L&;2wN-sg?h-I5G63gFUj318)ZC>GVG zgi@ysn^P3XcRs?n!Q{|`@q;2v2`kUb`SmhCKkw7x2FMK4D;%G^#APg(&rWr$N=oCt zKSie{V-w=mfhWoz0(*;+7pvoPfRBC*X0tUO_q&Nq+}rbMsZUBs)MQLt+Bax)TX2n} zZWs`xbJKQ<{%rXtU`J<14pgb_j6ko%XBo>Wd6Mf65SzrAd?p3MctKExbaYdl1<=6G zQ4&z|fEWmqyeKbzz1jzYr?)_}uQ27D!6o##AZ!4hVS4x2%|DwA-nj95NJp4;5;@2U zrJ?^`C3SoMUvO)r--<>0^h5soxtL?0K|0k&WR58z4+uiU{NPUsg{_`2n2uYGvBn>0 zb|;A*DWmD#9S(D>BZ59caPBfDM2l;qLj|b_zXIetCuEJ@YBKTQ+5A< zh%^llfq=ZJ;pm;W5-rabk;}Sd=Gp#pPX-x@`I5aG{3oNlOYO6n&b0++VNE}Hneu6$ zP62vj$vO`Qv$lg3Fm>JMG6Qujl)dbf32%{b;Ef)o*e06_3W_D;~`S=gU=`P8Tt+ zEpD~-^}0Si@_~MHmhxv=9|>^gVY}tO-Y>{>li*LScgsgy)q; zry5|-i#J~UQIbT#))sFY7!d?)P%X(bB~&Z_oe?XP2!iOCbM(M#MUuYzUXaGy<9(rp zPn%$it7R&e*Z5;a+tcu2d^*xsx6TC~A#5lL^1)BA7+;VuM1s$FM}Si2y%R?iU-b%$ zVn1R%Y>6UnMRDYCl4H!aA&v1h4H5E$`gf2$X=-Kd@Al@gbayzfeNCuv)KiFme&x3} z$i6#q&}SU0^_*ex6 zomfFQ__&c-@ukO-ISh}3{yxB4y&Nbt1tr6)Q&l$CpOIt>jNIE~9F#YUs0FPPrAA+1XJ#x&-FI$*%9GyKoU0nM(i;onDycQJg^j9HoX{jG|kz}pq_ z#H#(wzpt0%CN9!x4}MhZMcyYIVOB!WNTFC6R}KN+ zW~sfQzSUclV%WQkR0!JQnLP-0vt#YMR&oE2PZH^zZ`kz?u~zrz4DYvhaocJRDTJHT zZq9F1B5{4;Al3@7$SxAJI&oN%0a6z?Vw^RU-`^f7Nr`9T=Nrx`Q5(9~nbeO&KO*w; zo9L)*{H&|U1FHhD^}Z>XFIHmaN=A}O(J0DTYOC#rUH);z><1avX>-b-{$192uHp`9 zV$93es=keu%bcHWMAx>e*U=h$QT`=v*0j0{KGFS6Kl&cg!u}(TTM(1u?G1j zdj;VTI~HPaA_Y!WVPr0yg?C~4Q2MBM%HS;rA|bIREdjYD2 zcw8mMqY&?V-JV$5e3G*?A}Ew<|JTx``npz@cX-j5)b&_8ly%_&_XyZX7~1sndW3uZ zqus2Xep7xX24F!zA>g)9O-If6@{W3I@33}L7WroaOp(+*0Iu_#8~&HelAJ{eR=Lg+ z(oj*e#H-wa$)z$QhyRrG6Ye5w2eTMUz^8h4S}r4gKL*k!rgW@bTgGe=KrO4JxVZn0`GgN8K7!3|S+v_cIq~O#mKkM~kbxc^gMJ>${k{US zY&V|s?e#{mRA^;x5j-EsNF;lb^DC0ZDWyAhy4s#Gkolw!r-9vGyQw}#bBy?mURe!T zZ&^oS2dOHeUdST)9p8Ke?`9!meQ!WP!)-Hr~Mz?-S|5$=NGVQYZYi+oJsI zuq#28?;`(`8N!Fq9(=JuU0#QCZqumV64bl6_snG~$aPMlt}qRJDQewsn}1^;zP{Y5 zK-WIKK96Dk(M_!B1c#$)T4yRU>f2v4UKt2h`dW4HM)XT?gKy7{nrGQmzT_yTyjNFw zop$}5k%UZs+ZXnW5wakFuNUtP;$LB^vrS|<7y##5oYEXW%eUFP|N1xaA`CEvXX(hM zvapq@2+ojS6}n#LzQ(i&oBU8W5f|<&Scz+|=M30R<|u?hac_C_;cAQL*(Kq9#=BWq zNmF`VHTQP)!K(z$(VwOAqJA>)@6;ag)&FGMJ~08yKhx^l>F8K_iyBYtqyWyTq;o>-IX5*fQbrcK4Axj;Lg!moDWg<%Iz}8!-1+rf$Gu4cNwfN@(KT%TR zaOc!r+`ULq6fRHrG~qFLjhFLo2tvBTx$L3jhj0^Msl$$Om7|Et+JE<%)eN0VghU7O zTW?~bk=wMmsrC+x@C!YEavYpZA0=qZcfOv_B?Zl7CbPSU{vs*<4F|c7yy?Az@!%{V zOw3@XV`qz8IOfz+;Gg@@yRN1nt11KRcQArue4Ne#FXoVLo&8LOM8AwYW?;QDaiytQ zvIw}-@_ku3t4xM<*0W#~Y~DUV0+DZO?aNQ}`ia;v^V{DTdZZC1CbBz7izcg`7p>ji zmV2V+C6784pi~h^>Kta8gpcIo5SQEQJfWt2S!_3%Swov4X7zj;oTUvMEy;zr5?Ayr zCUP2StLISBzW4FU)L=h&=QC~%Cw%#U#Osz0iTjj+`9>7?so3T=GgLgHj(Qp?JHd8+ ze(&R?!-0~@@=k>0KmyrvYfCni38ZpGE9G+0x?-{31^g!prHAXsRs5(s(HFTGkvLO1 zfdQ_HauhN_PX4`z{@>c#l8{Z9gmA(PKF_Tp4kF6xwN|T{M0%DlC^~mL>0RGqv*&De zwHAfV-C^g$>uu)XQRY9~CDtYz4N(MNCkNGbAY!^g~2)EeaDju;}4T=91-EO?96dyu1k(ooh0=MbC4q7qT`Vi8is zQc0yr>Vl7h>eANr*0a$f>u1Oj6fxLQ0=D)YFvVzL$9&EQJB+J7eKR7&4vzO}wh>d_ z@l&RPzi)`~bz&iXJZz4;F4vA@tV^fmt@pKi>>WvzSBNfJd^`+C_4;hUx`v4t6iG$1 zlYVTcr_=%7J<15#Hjj>u_YOfbi9EDLmchzbG7r&kfKzPaOHRoD6nIe--6$B{vc$%3 zmsXL->)1?rPW|3f^BJA){m1?S^?3YAtk?`=aKQqJkkXp(S^_tUd@aK%Qv&DjRGb1_ z5=&C9{Q_jF`i^UdKMRp=^<<0Qy)IpK8s@xcJ}(`560Zel;Z;HWH`s7by|T7K>(`G6 z2DVG2UY9Nniz5pai_>N3p~}Peq{ZJ_-ZT~hIf>n01H@jjK8uTByb-;b<4rcfc6%Un zQtE`-RQ_dI!1!|Q&pW0N{l551Y3lE)=@>4P`%R8Al1su^6szucO(BcJ>MqxbO+BKh zS(L`j^5bqI^tayqNAwskS{|&U0~^yhvOh2`|NXZqEIQ%fmJe8i+_kF!1hy(=s}B;l%xY z+LrzfOk{64)sTu)s;$LF$u}P1MSb#Ot~dB$4^w)k*+YCFs(~9`AXr#@=m%reo9)lA z9D2nS#WK>;*(0AK*@Qn187AmAy{oCx8f*Gzs?2!3GC1}4v*`5s!5UzwxJV>q<fIYDqPjwPy|n_JMG>+D=B z8T5O|u^xYia{y)h(Cvqs(;qB61y<5JcNrNU2_Mxbo`EUBMOf^|@HG%ae`k_yLCk#D zdmbZR+s9fy7W4St@Y4%Tm0^t(w^QDv*E7~6B*Rfi*BH@GbO+1 z_?B#E^>Tv1;jqFnFbPJu3~5X{j_-#1(3;QYt1)Ao)JMbIu-H~Ny& zOUWqt23wej!m1|0FMBT(pyrpqa9tsZPTu-vfD%k@LmmEMRg>CgE4>{~Gc8tEs*zRv~2aS4x@ zTKeqxUnu??c~^9XGhExlK#7Lh7RlG`;z|UW^hes-T1a-U!Ky4)4C=7*H%3`eH%soO zB6=2reX!Eg2xeC{x==C$B(sdFGzCb}=YE7UMzD1gYNR4L`05~Am`tWxO zzE#QK%D_`4-@H)iI5WS%m#7#(PS{iZZc6nnZs9mT!tsd*6l0p=xmrxxN06qi)3sT@ zxN~w0UVguJYyWw7oXKE5!v z*8bG(A)`jl(kna1rFZ__l6o`7df1^ky|4RGlKjUU1qHYl2kX+EA8+_MJ^fvi*Oyh8 zg41hhI-W)NrKEl-!@6Oxps*bm(Qiv4wSZ95ae1~I8?~UgR8y2ZMZFLG9to4M!vyYb(h#d0yoFtheK=iTq#=XpNQZ>?8YuhEpHVnWQQt&<29k}dif z-Uwp5{}aK|I<{heNu?iS&st$3f1Rz08+y#%W5-ZV%!On{k%s$n2+nVsK)>fDsftf1`mHJ2* z5gKT(==xiZM+J*k8nb&UhZ$6GG6Mol=j|));t2k6otmx7oKa2^5H>uRdD78xoy-db zSPH1<7s_z`;{Q$<-wqgus=WN)fpkM7EtQUX#++h5w(f?!?eBJh_C8yS{o?%1*?bQ= zI|xQ5kU4f3Apu@ZAMA&hjX$v#%G-RoaQqHm+)7XuY zuU?yT{PKgKh|71aU25QGL%4AQ$JY^HbB9=z={Uqx(sTep{;i5@7?}i9SZd{O%6Ghj zHoueuUE(1F?9?A7H9Bvq`>K%eyAG7FJ!lh|(Y^F7OB3RFuv8!x1=VOKptb9=&0 zA)BawJiCdVUFphUbP745Bq`Bq7LtYoxZ0s=+}qLc9j{^)uQ90m$5w|Zhu`mPyMw~E z8XA&(L!U9+$XT!{GVm-lT2p4sx?vrfXjKq@5EZ+tmtDKdyY`kADl?}X<%j|+K1nbV zq7)w{fb^)O9ng*lElB3BqZ8$Mb;{)MIb02l^u zvg%A@l3akU+1b=iyF+(FV?kcaD;~{SgSRAZQ&*JinrsOilHWEurY#o3Q%*=;Tp;E{AH<#xTAe}RwOt^RDW=h0;`Xu z`CUlS1SUKDA_wmq0p3K;!nu%oMq{McipI? z=T7cMbA=&D-2X;(IgSWTJDt1!+ZTeDp09GN)Grzt7+`=QcL{fC7HKn-f0Y;Hjmo@@ z7^;*njSozcGdIN5l-Jr!Xg?)?osqHVBepQ&vy`O8pf6)cv#_#`_if=9`d-?u|LtwqB@yMQMW4v>C$%lshm|vm z@60&lf;lAgoqx7)KL+>by#C%bojuru)EuUXFMy()9Id!HCR!I(g>CAV^@~Vl`FX`=JO~JHw5YrQ`QM%Y^1n zJ8c#IxF|z#iHNHT%W={n);jQx*hyY%M^^VW-Q~a%Fh|)*6Z*HH8C>@7Dn0xQu%H_w zsj{C*Q6mU|fGPMy_`DvX4}Oxa3gsi_kV)ZC1vqE8w zAJ7*0dYVHWm?qxJSePL&A-f8UMyd%{(SBCH$KQa4z*kw}uG-p>Zn;ZYPkg#09>Z?> zp^DO1LN~JT971Mob$y!*VLZG-fjJLx|9&4!18?nwlFgp;Fy3y;QHgn^H2uq8{<8>D zA3n`QvjpWV9_wFc=LpIf_N@`bxi?75F><=fa~2Eu=ESQ3dX#GmkTZQa+ChOjZzfLY zx1Vh>{}8%k(h71uOIQDs_p-48xQ2OH3hsDQnqMvz-)wx~GFp$Zf(%gCX~%2U7va?& ziM)0@_g}9rph=xJ*3+Lq%AWF{n_PbrGRD<*g}P2aU7oYI;*ydnfdQJ*khjZ3G{Z&` z&2Aj|Tut_}awaA$z(p6qSRDDDH+({0SNFGtlHEZEvJkO!jK<@+#WpTdwNa5^Ma!#> z7;gUV4+femIRPTP7N)`)+#S_2WkT8u#Id~GXmdO9^&YLVeMNSf=_Zp|{F|I8^anq_ zGq}+9=VM3I;092JtCS17@>ki(IG(3IQuD~fvhddJ zODm`_|LMUVjHm!!*IQeNNlrWWI-a*Ag@nV~A9_2~(2X}pKyjgDi zAzd5(7!#^%*B5B;9aMV|2irJmqsmlS2X zRsMaUHY@yeiKLwJPQ8?W5Yi(9Q)L1nom3H(n13lzn7{SgGd>9J3qgLqnP^%s?dd8P zb1+jVm8Ugd++y$3t^WIZKwUURqCq3bGD3xN+C2U}9-@i{q>S6<4;lX#tEh+?gZBl+ zxDkXhRg1?iEou6L_$z9SiVaX$c=D+k7WFN@lJe`g_!F|u+SG(|mEj6_#IQ^Dd z2%PE#4!dW2Z`4Fk_2wsi32(QaT{S;so4((?+5=CG#`>-D6gz?|ihKwB%2*VSwqg67 zL4+Lz#525W_>wi19AtuY=%$Ng$Z#mYB-BXgwaPSj)DgGCy)1}sfyL*ot_@mNbK%)7fs`+mJ^8Y(1 zMy@kjh8|Sfb;edRaSiiyC_}DPjS-}ubs4`#>2(^#5)SW9la@ZQ+pn`N5)}XQuZ)j% zr(`Kvgeb_ub@Nraj{|mwV=|& zCNE7UHwv@-u%A17U_6O?Au&tvs~Y=P+z~y&!>BnJ3KuTl&RA4m)J2^fe&Z&ve5p2q z%Kz2gu1Ri35(T(9|MTwuU35U-(A)>Tx-T9>E15(pmHj!uYZubp-E}Wj;PfqS%OuvX zUCC7Fwuq;H-cL{Q6nx5J!{A<@1>&#!*KR*Iel%)SfN@|#C3&8MYnZ+&!aK|$( z=!d&$&{*H-{~jb@A|vinKu$_O5BOJ3*dr_-c&y2xOU`oP?nY(x6m$ni+7UY?*?@k2 z3BIG)fV&66jWPjQ&3!J8Sl0_S`U575UCvqnZI?FIsEMFHOIq5H3Lg358a72&7ef+Z z|2EmK3u?4&r3a365q~Q`o%~i+= zWY!?bkN?EF`{^R-fFnQ*w=w1Xe+T4L6uvKIvnIPGHaIr6`?PI%vOxWU3%&5$eG;8V2dENEb)+ka~XM%ce>&uSKfve|`&1wbj=yzEe=`*~R)Fxu`7 zy`L)3wpJ{L>8gZ|Vu&Nl8`v61OCyiruRnf#=kyp(`tgd@lq!Mz!8QeWbxKn7Kh$E$ zXQ}6VwZbqG(8JApQ0gv#LTGYek0ypeC<9NCAYbqxV$6Q}DEyx&0sWB}Se)f;jQ;>9 zdk?K*a>ah5j)Wn@c|3lvJm4^aNE-Jly`>Sh&%0!e4KYSA{q`DTJ(m1|G$@-31Q8}>g}n5pXZrJTUAeSE;9TBaK23X;j#;*zY?wH07;7COOV-tB_aN& zZz*5@1=h0Giiperb1)DhAb#c=UnXI&kvVMR z+~Yx3s|Z>ob|-h|8AZ}Wj8G^|NYxh5uk6P8V;Fm7i%RVxy&h)|qVizk7Dsj$`4a^b z#<4caC`IuTSrQDA6o*&TGxFaeI^ddk{`V=25$kd8g21eG9-O&kYtpZ%7&|I@U!xZn ze@W>p-UH&Dkj=YfaQ-$Q0*+3$X=t%#`uPia6o9N00aPiV=$IHzhb7=Z`S$JWHM^B{ zum2qxd7kZm3^-bS%qSE%^!QTMsVdnoiRbDVfmAj2?p=%M60znoo}@BjAS8gYYb@JZ zOc6v(gN%%DW{4aJx#H#(`}Ty%a^uCG(`-(lkH~mqi#3l%b%!hAF6%rlYSc`n-HmG@ z%_os`l!cyxMj1|BQQ};8=pSl49-G%oi*)XJzR`P?B!_NXaoc*kg5jY!=hfJlRs3bO zNHE|Tjq0=={sKT&Ir?yMabJhaXvA4(`nauk{Rn^k-aqy|vzOW!k%{;D!(qh~@*EmI zy|=;Uv+A{u)^)s&@qDcfzKE7te|Sty;(f>9lk@MVIR{!&V3Oz~=$sS;di2K#+#$7~T~Y!=5W%i*Fp)v7 z`JFn01fY9wd@xmDfcl`v`X)P7!I}R4`#?V&i~=%@WH8m8hWL0z!(jyw;?xuIC8Bf6 zGeSB;J&rNllB}Ybpa(im3g~~c78MjK4NtDFTneWKNS7VzM-PNhj@it$3G!Q8Tdj*( z8@KQ#UiN^|Nz4$M;iC+Ex~_nZ3=K733)g@Y>49beS9tnVEWpXfz`PPI53=7Q5t1_#0IIqI_I`$P=;nQ`oyS&EiV7P)e9na}2MOyn%CW z|Hpvtm_4=hUZUTv6l6_LfZnW3Z9bk8d9NM*>`&KvELmbl8bVZiQkj^I(&3_N+U( z1iS*ltUS_0pI6o4U0q#3%5ue=fsxS&a~hJkuCA`Kva+@|;1F3E*ca1Ml=fO`N8*u1 zqk8fWN)}{OZZbxZ1oPqcbkT?i;eav3oeEQWm~!0RbwDAJ=(OTE^)A{0z?-!&$XN5+{ZTO$UUi**5 zoCz@975jq_kXfSNRO3jVZTg?IZLBB}Ze4=$m=B`Kx{pVg7X<$-cCpgYBap3$K}1_S z;#=Fjotu}7i{CVL_EN{oaeHz&?+lkSw*#`u3mK@23Rao68TvH`BV*WxTeDYzqB&u4 zGg6yD?yd%MZw2F^j)@NsFtDwUH>@UY!v7OFUD?v&4KM=^XUl39kAd{iR6fTHA@}lS zhf^fqmDSC2KqUV4Vru}%QRDt>fh80tJ*~SZ~(u^G-W!o0U7 zp)x3^jiWxbzz5@*0Vfl1OMai!-oXLb_0t7tG-(3Pp7*btx=r--zE8fm{GR1|5@}iW z_xESWyw@4W|G!!Q?+YM9pi&FSp%j|m$_%7jNL|C!JDSl)pU(~ce;=uZZ~_#wI$u<`RRh5t&gmmBY775*2z zELDR5F|cki0tW{*F@kK!Z?DYqn|mCHiz+uqJvZ_ z`Mbd-xQ*f0;nwuU)I0=*=g!H`N+e{4d+ADgNFgyH@Dt)de^gk$xm&=D)(vKv}8^4*SM z-q&9Ruz@CREtiGcLyr;d!M8$y9|+J(%aMQII%z(Q3=0!{`xHZKzu5GC?OF8cth=p2 zlzDaP?aK-ODiWQa&%ajN*-`{pbv5UzjLm$y`-%b>5dXGZjtU`UWoP^OCL=$^*oUs2 z;S91q;Gd$jjvp=~SnbYy8>apP8>Loy_N4=XA(Tgt{imvd5Cp_Pddx`zWdEe_&f6YU zI70s(9}@y8f`73X^ z2I7@gtsl^+xU7cd6%~P=morqM0s){e405Zy;ETPK;M{rnwgbXwKFm!D_+38|ji0iZu;_ce^t0LwW_3w7*6DpU!0d0_$Q7aaop?h;DAv9pqR8U)Lnv^1IN3c zc01Y)$`=}qPe+a=a8X)McYjDzHIRVmw5rB|uAygR%%KqUzkjBTj$|qRHGwPKaE<;yH1vl;b z^eA}|P(_G-2(=dc{GajVPKnOQc-hO10#X`WfFcga%>h9(1;E4QnKJ}Vr&Az>zxKo#?7Mm?WROHf>>7nz#dt`H!*@ps(Jf3iJhc|A}Asu zn%fba9EceRd16GMk_NF~Qn;{bdFzC{K@|seOb-`4&Dn<`7_&hH-j(JSZx#(Rchh9M zi9nNdos6HRtZEdF439w?e>cfQFas#?UKwHAM$^q()m$sj0I@AcZjVp*myV6w34i|Z zzHw+cX*z7;y%7$}x~r+F0Wvg*NlAr(7y%ryr^?^I2lib6$Tq;T29PZ#02C+F_u=>4 z;mF`%&LW>Gp_t^}l$sdu4A^TaE}mrZNx4$B&mA5fW^21M2e|bAGl_15vrQgOPJZxx zduDB8W0QIAe(TGl0$5K0|9lJZ=0MGot}P7AG?tc=8%yP5TbsMT+`SYeVaRX4y-XhM zJF$8@Qo@6od-!U(f5;wDKY)c&3lb3q6632z=aCP{p3_PpD5e>rf@>i%E{ivOh{xP8;d-JGTN5DJt{lYH-Dy{g6 z_}=)~J5XetJA@8HEIIU+==4CvTfz`AtQ;H|-D|#|TD{~i zXM+>$|N5qD1!P!pF<>fd-ilFr^X82zD%8`{)85|R&h98jCLFPiL`w^(7XZm$^}$!o zM%0}bC6@_wSJBem(8>;y8Ye{(uf;>mAk7-_>VRA|@gXB~45-@2D*iDX=-&g^aG;Qo6P9SB+u%Se4V_~){iLd(; zCa@%ipWL3F_-6i6^-c|FFg=gW-w4JM2Pr!ufrvBo2bNVUgCO6E!&YBp3HC78RwTs1 z$$2$}%ML`&H9|D!Fib)jYCLiI3yq3KHX=#LopqUDf$L>u%o<%}v`IDU zl_L?KAmWgi={s=Yg;@>5MKH>qM}A$E42_$dN758M0ymj)^Ay*olfXFGqS|$+kss); z&4LnH8T6@PNW1N&@5cOj!(=5kc9^#gZ^Hn3*Mq6EA3?kd2Z8+H3qMj(DNzviu!CS# zE^c}9g3Y8q@`4GvyyYtN!F+9X7VhdjnO(2LtOKSow$o>(DilDY?SHmT^y{^s` zfOrBe`bv|lEzo1;_XC^-Vs=x&SopC}wXCAz6f4o6HeYXlVFEESGJ+czSy)=0Zx;P# zHaFZnJ8D$X5ZgbwpAX%RcsL1&;XFUp$yC^qIyUq+w``?CR^yx$#UwzL&lQdCb}i@m zCYW@^lFFGMA@{yJ0zX9F?X3Jhj=e(XPAaZn_H}-|PmFjjxT^l(bNzO%B10#gr8eEv z?v(%OAj^3%N(au#sayZid)&_%B@O;b-9#iF#+#}VL+6m>WGO|23RvEj1!Vnih~A^=B^G zJn95PMTAGo8%QxC<9Zjf7BYkgSgaADI+URC#yX_9oSz32FQ?@gL5m2Wr2Ze@ui8oQ zJdvsiI~G2MP1*R5WMDKR*oRb!usm;IkzTQbqPGnH#;XNmFJ?h~>gZnLM##2D4pDpr zt*=vcEHnFR5I|(VBz8WG_d%W@KuZ(iXc9fpo22G#Hs$^~R-rXF9qK}^bGX{ct}@m0 zH_=<1^hf{1US6hC9$wAuGp?k_N3AuSIHnhCUteDU&*UgOaajcLjez(!z|b8C>=!8~ zt$k|*o&rDg9LvwT19o6WtWp8A`8H;G>&=2~qR|js__XB`OmzhrYMY?w$b5Qw@_+K@ z8qKU3hdx~G19sVxiV88yr$SXUP};o4+5M8WLH6^%g+kEE_ea0=uWq190gGTY;#fvM zW$<}Ina6`QYhnr9b?kLB0_bYtIf_Nm4TyD{v!pn>*j}AJdR*g790Fh$Y!AyP`fMOr z^Ih`dE|Je=)*iwx>0@;+X<1UMIyrKs542izf15L4v)Q!#J2#zj8{C+CUxV(x1Z zm+e-Q(g!tt_!gAH=J&(Hw)028gBBZO4fk{}!v?K%sZ}&Ti;;@Hkjm6mT%F;E#{lCo zmSJ3?Ztm9V6A8S3Be`xHYSu-lOpO?$9V#rysDfd{v%wGnWU;x)*HT@A5V3Ge(cTIC zqG7pQ!l^n4Bq-W=`;aL5c*L4$dvf_Gq_^O?1$^pwBOXvRd^?-~KH^ArW}R2Pe=qdz z&(Nt)*(?aecz5^f5nd+<3tm}Rb{|s&{#rQHZBaV}ET6rBb3JPhA1X1pn=rd4UCkSN zUhGH30;z}j*6+<_`rJ?eVQ7QdJNTr=Iqmc#O{tv4YnyT>@VUXc6BU(|Ysr!impi9$ zt+Gdv=N7NkFL_DLBpT<|IIGuFgy6n%)p2INWkKdp)rfj`4QK87m%eA# zL}r`WuE!H&(#;xGe;y{e@~=kDwDRQ|;5Hu!;dc`a^(ZQ8m_IrYtvB|GQgUKv^g6oI zGW;g-eYI{9+P{7&Fz!^@etYf7yZqg}XB+Qq$Nx5AgUno9TmXAE@NfsdTk-Y01MI3s zMn-`D3AoCEe}NuA#U3j-CtM6`I)=B z;TNIrx|qO>ot`v_gXq>rFsP3ygv}e(|q%OB&_<1^l{_Ge{irH8sT#|z!rrs z=~DK5dFy-mcgOGX^3M|C<7s2;m`a1~52{K?IESrh)(YA>iy#~oz@Q%o|Uf? zk95CiP`2A^ABd?Q=HQK)WY4>i-{SXPslk1=&-{MblBYQJmrn?xs}UT%oZY>}Ab+V& zgG}nyKitm2U1w8{PYt<{LF1KRg$fVTv!h}$Z

nX-TFR=WB|BXLoBYt$|#kPsmOz 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/ios/video_processing/images/xcode_hello_ios_viewcontroller_layout.png b/doc/tutorials/ios/video_processing/images/xcode_hello_ios_viewcontroller_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..bb523967cdee4db7121e15875a61c481dcbc49be GIT binary patch literal 24355 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

)@iu>VmLQa16t9^ib1IHL^##n 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 as&m*jhY z5bnY2A%ET8{J6ABUR6{1v*4HV8H1`S14@4?YNsgJPRZ6k%P`W#+a5PI8A1)9koQ^t zN3=i`x(PO-z?pDi+ALDT)Avt$2=|UX*?AxYk+^aR`kTrj=5o(!I(KQuW13b+SJNQ(zR11m^5punu#fqe;oqV*C)|195{ao zDfheK!DmNMTmyNb{NzUq-<0zoCKa|vtHoLjOh9FDd$VvA^||3S==vXgL~kIvA3L6s zM@&A+Ro=~b-`m3&y(xQIBF(z;?%-_O6$Wcu>(G7Ejo~&DpTm-Ji1XWa=G0dp;}Yo? zd1r|?i!NkU?h2b`&l84Qt;Yj%tUSuKXqyABzKllth@2l!4U*$Kmx$x6v;RSHp_*uU zE(5#;7h!X}1$|C+nR8eucNehct8?H7d>{V)P+S3FS1$A*iGz-LR>w z#s6E*Ne-lM?FLcZC3SF1a)_+=w5d!X?R^3kZtL+78h$cfQe9f4ak5(pb6mKX`76Jq z(C9k)BuPijx;+re$EWZACn*&dGn^(Y>I|2LSB^0kk=My3JkrJ$ZBx&Yi_Ejv3c3!V zy8mv0oJMQeKYn~!{_G7Gr^Rbsh3lZ$1Gh(8L%-NpFd_#GuB4fat|mQv>Xo|KjrI1u zc+ZsVbfms;I`6?6UE?;U?f9N?sx`bkzByMR@XBN0P8LSJ5aB~RNwyn8?c8NHH52w7 z4_7q?*8IYw-H@1LshVFVjAYY;Qy1^B6uHtI?A==++^2top7yTttnvWMl*l)$$bG`a zzl%;IXkIkoCh&6Brf+VcY92&GPS^rZ-`%!p+FF+r(Z6Vl1 zTJx=AfyFP;_`Sb$G*5;v3~K)X2q)#|jQjQ#0lk!0H*Rk^g4fQYvo2eO`Zm{RK1`RB z9LR{nP%vSuIblJ*8{q7R>7PMEOmFz=G#f_&nkAWO6id<%m8UiuZcW8j|!&p%7Ly^1u!$%h5B6;tbMqVO?bfT|lqiy0;I;uD8v*>P*Df8 zzw||)7*O&1TmTnbNTPdiV@OYQ%M^VpC-R%ngCxlL#LfBHJ55|h($OdN#1G(zlBjo# z-Ol`2a^{NVy`QfebMUzHI@0++Pe@h>i<-L11@;VTaXG*9N1~W+>^kHr)|h`vt}sbt zBa?$%E9DE_dam|Te}vQ4Q}+`354KzxTa(-h|LPglpS(3=%F6rtmke7tX9u_G-`iP% zx|xf5KpbofKg(!o?hNz=M2c~}ec4hr1LsdKU1uua(SZaVl~6jC487_xFS{JTZM=4H z+pv)lUKys3fb@%x=zV@)#LpEdXy`LNsEdQyk5K!D(T?25(uQ{%2yQA6B*p5+3SR!2 zCm9;%*${s~$B)q)n^o(QwVd6Z9l5g}&~`R92$~zn_4f7Q>$*~Y%{b@JCHK6zITggy z$SQ%$Sif?nk&mE4MD1?md3#~b`zKGh*qcONCx!goA<(5OEY-}>tNvUF8z1n*lPfOC znnuFNNEvK#V1ry3VhLE!g&FQehz9IAr$Z|eCF;c9lVvF<)*{I;Zh9Q=?U_2v?_UMd zNH((_`F$5Q!vN0JU2~FKAcj{fL+p0pl{p-!$Jq6C@u2cmB{ZtW^y1(Rm0>A7}sJ3~UW%eS^0qN-eW5

A9*N;C+eaY_uQ$W zT>4TX|1Rbw^KG`fhI`WcGwndJuVX4+2ZJ?TmW%?AYt_*c3(iU`kU+ILQ<3hBF)p+J z{T8CqbPYT`M-hA+a`)vAy6;!Zn<`PuFV%%dFNv7086Hrym3``i=+{ydgeZLIs>m=#9YnSzw z%xtmxMn0(+{aK-%aa6vY3vM#}tao^kqE}7%Ex!llhpq_qmsdJ|ZDMOhBxiT=YMjFD zXhD-ROrP48eP_RJr&FIhPE9mWggs;+1jEzi(D71 z`-_Mm(?E(_PP|fa!;_&x9T}UJUD(ZMckQPbaT$-3bN-%osTS&Yol)cV`vP1NTkuJfF<;8}&9&46}Z&s)>~$8_Gh`C=>54 zjQ-ZQ@ztsi2|hC)5|dg@l4br}@2}Zjh0hLvdr(+~U2ZU&!Pcwh3LScePn~jQiEAI$ z+Wt$K*jPwmf*-9c)I92Bb|LbGs!qp`;w>SL?#x~uO2JRVaj%ndcv(_mN<^Ugz3G;s z0AhOi-M)3Ci(x9zPf0sVLt#t@K9Jq`gfpY!GwzmXsGS(wPsR{HMQgL)T;q?RpqA5J zUHxT+4XI+>xQ=qMJ$ve^xyz)I`!>K(_}5$KAFA;4y~`#pjK-sGRvF;J-_K(EysOvj zx0YX?s(JV2c(Nd+lm@ss17h*xZLL4<%y3AB-o6_kemXn9pc7Z4<9r6us+A)ogn7^|)xoN?K=8v}bmw2@d&LnU2C`mN ze=2&pW8ecaK0uJ|b_OM`E;|RpCJLh)&s&4$+X)caHrA>{F;n1$`HQd2{FoXZpp!>O z#J?}EzNvftb3&;WZx^Vy86EZtU~tuzQ;~bH5g+o##x{n#&x-wBllIh-N2Su{Y`|%0 zpAp&q=@{0COfqFn8g9ycel%|9hJ3ImKxMwgtl1;3S7nZp1?naR(00n%x9wMifVRS5 z8AYyofi50>hj!3?csE~~Y0^7^_j#?Ex>D7m(P*&Z9B@>R8@1;f?5Bv?uXtcmuM-7k zI)0kXDBHc^vVd@7tTVvB;r1niz8xBDm9`Qj<@6%4_jKC;%(nhM^X#<})ooN%!1HhO zMPH3(zB%>yj0ZmigH-%Bo>|y;fDqO92)2WcV`avcj%<`Jb5^G1J0&=1-S8&P3Eb`U*J3dkx? zb`8`%B^#Q-FDQ4j0<+!4R!0D4pQ)P+!)L4{kuy2Ff7hBySl#D7hK&zJM%M$pYir)L z?mQWWOdR|Z4PN>EEg=7;qfl~@F@4^7)7;9+1L~Yf!5CubVnz7I5P!MV^9RF(byuVZ z#7>-ygm)+gYdT&<8s^qcY>sm-6XX%0DFo#ue0htDuILg(PjUW!=fNu40bYYe+Qf5w zYjmXMg`|vXYmWKp?1g5`naZ1wKk(wdI-U}o5F9IUXq7MKG~tL>Kbul92wBdBnYCXD zn4);HzI}}4+Uz*&%xI75DJzVz&I)NjUL3hJCzq<2N%0Zd+7aFTrjQlOww2mvePfTt zOcpvM!&*1vs+Ds2a}?`Gh7L2)tEh!}?k`>bg{vff{uz^r^8>W2J~q)`Oue zfrtAe8{?(JHq)xm0JvV#_t?LaPZA66(q^!=SR^e7jbVN}WDL0Xn#Tk?KQfnpoNEYr z5&sy_o05I6a*#AOBXzz{-95cn5XiAiOxNSpv!dcHEH%VvFa^YLVI&0`QJW7(R|W;; zMchs=wLXv-h8Lr&!&erZ;`=B|Nt=>Dr|z@kwEWwRcdA%%%v7OU+n(%ncstYzB9jv> zmiVhC2}Ag)3;6-N2%~pMlZAEVT({15j8zz!d@{ zyC%8DeI=KeN&YPk!9FW~Q?~o@v=#7iSCG=-kXY57E<$^lEc6c02hsYD7|g(i?-Xx4 zM)`c-v?BPC`jt(taSyj5Y5y)(!XTBr1b55g2Bw$J z&_^1#U@JV9HC{dt0wc4Z_d6bKpGPb%oEwL|%w~Mxxmu9l*6oV6 zlElXNJ9It1sA&{Bs4e-0Ye`E<^nvExroC&8%uF3O@=L;|!pyF(pd0jU_n1{{Qz;<_ zu(pb|9LvmG99!Nw++Xr%e%+i}&Nk+#5o@WJo}Qm*<=mCHjt6x*x2vtd zH$CIPg2@$*`{ozdY{PIhgvgn80`Pp!WZ_*l)!U90CKMZLey;=qd@kfzZzo@^OJNmr z4(${pBU=^sx-_=3M!*HXM&d)E>-d79xrd$e>&Z@5mN*NPjudY_!4i_mk%4L&+jm5pMbkLqyi*i1f8w_5W_`eZQOlx8$ep<}fo2I6tuMqd!{W80*s%XH_Z4bXRv6UCv@&(!_qt;m8xU14p56 z82sVvfsD249yTidby8F%*wQ6!V;OS|&7x;C_#}#;(a5d20O^(fHB-mJvCXAgP$CN| zFRG|RFVlE5lJA}?36A=Zwj_6Yb&&2fd_u|yE-qi^D0U$Eou!Oc;LI(7R^K_HI=JnX z`|*BrdtVA}?e5XZ9@>ZXuxKBDf0^TDnGHeZ%z~rBh%r2nS~eEuKQF4uX(pv|?qO8O z0uG2M|MG0g(4iaT8FA=K|EwBKEb(F8ckc)gVPOh%5F)>|sGAGB!LQ)N- z{}3v6T@04+7oaFFe}Ef}_D4(p@~MeL|zJOe+ha{&!4|Rqe+38Yas4>Qn%wd8n$ROTdd#c=%^z; zyvec#koUnvYCk|b@Q<#HNl68I8ngGu2gFKO;ImGoVxU9k;ql4QYjx%3)Z;KPt&!tf zaiDhK!@|+ElkLwFQ&TI51<2@|t4>WB+45OKGuYx`_y3T%W2d*nVhua~pScHKTk-XO zsLQq|g6i4-vF0ew-24>FA_6}&Af*=w)a#$IooTP1u%$M|bNnNYW~tM+R#DOEiCMDW zVZtE=M*#;nfQ4XxYT4~OW-O-lE0Z_uGjq3@xg%ZMr440k%D~C8Ob?odz2|(zs3=U6 zmHoL=?QyPTH?(8cLFTwkYh}0NydH|~V*l1ZFLAwA)@j^f}l@#X|~aC zV0=5W^fs+egq^VhrrRoi5J|_JcPk-P*U0-Hp. Alternatively follow this guide :ref:`iOS-Installation` to compile the framework manually. Once you have the framework, just drag-and-drop into XCode: + + .. image:: images/xcode_hello_ios_framework_drag_and_drop.png + + +Also you have to locate the prefix header that is used for all header files in the project. The file is typically located at "ProjectName/Supporting Files/ProjectName-Prefix.pch". There, you have add an include statement to import the opencv library. However, make sure you include opencv before you include UIKit and Foundation, because else you will get some weird compile errors that some macros like min and max are defined multiple times. For example the prefix header could look like the following: + +.. code-block:: objc + :linenos: + + // + // Prefix header for all source files of the 'VideoFilters' target in the 'VideoFilters' project + // + + #import + + #ifndef __IPHONE_4_0 + #warning "This project uses features only available in iOS SDK 4.0 and later." + #endif + + #ifdef __cplusplus + #import + #endif + + #ifdef __OBJC__ + #import + #import + #endif + + + +Example video frame processing project +-------------------------------------- +User Interface +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +First, we create a simple iOS project, for example Single View Application. Then, we create and add an UIImageView and UIButton to start the camera and display the video frames. The storyboard could look like that: + + .. image:: images/xcode_hello_ios_viewcontroller_layout.png + + +Make sure to add and connect the IBOutlets and IBActions to the corresponding ViewController: + +.. code-block:: objc + :linenos: + + @interface ViewController : UIViewController + { + IBOutlet UIImageView* imageView; + IBOutlet UIButton* button; + } + + - (IBAction)actionStart:(id)sender; + + @end + + +Adding the Camera +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We add a camera controller to the view controller and initialize it when the view has loaded: + +.. code-block:: objc + :linenos: + + #import + using namespace cv; + + + @interface ViewController : UIViewController + { + ... + CvVideoCamera* videoCamera; + } + ... + @property (nonatomic, retain) CvVideoCamera* videoCamera; + + @end + +.. code-block:: objc + :linenos: + + - (void)viewDidLoad + { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView]; + self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront; + self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288; + self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; + self.videoCamera.defaultFPS = 30; + self.videoCamera.grayscale = NO; + } + +In this case, we initialize the camera and provide the imageView as a target for rendering each frame. CvVideoCamera is basically a wrapper around AVFoundation, so we provie as properties some of the AVFoundation camera options. For example we want to use the front camera, set the video size to 352x288 and a video orientation (the video camera normally outputs in landscape mode, which results in transposed data when you design a portrait application). + +The property defaultFPS sets the FPS of the camera. If the processing is less fast than the desired FPS, frames are automatically dropped. + +The property grayscale=YES results in a different colorspace, namely "YUV (YpCbCr 4:2:0)", while grayscale=NO will output 32 bit BGRA. + + +Additionally, we have to manually add framework dependencies of the opencv framework. Finally, you should have at least the following frameworks in your project: + + +* opencv2 + +* Accelerate + +* AssetsLibrary + +* AVFoundation + +* CoreGraphics + +* CoreImage + +* CoreMedia + +* CoreVideo + +* CoreAnimation + +* QuartzCore + +* UIKit + +* Foundation + + + .. image:: images/xcode_hello_ios_frameworks_add_dependencies.png + + +Processing frames +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We follow the delegation pattern, which is very common in iOS, to provide access to each camera frame. Basically, the View Controller has to implement the CvVideoCameraDelegate protocol and has to be set as delegate to the video camera: + +.. code-block:: objc + :linenos: + + @interface ViewController : UIViewController + + + +.. code-block:: objc + :linenos: + + - (void)viewDidLoad + { + ... + self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView]; + self.videoCamera.delegate = self; + ... + } + + +.. code-block:: objc + :linenos: + + #pragma mark - Protocol CvVideoCameraDelegate + + #ifdef __cplusplus + - (void)processImage:(Mat&)image; + { + // Do some OpenCV stuff with the image + } + #endif + +Note that we are using C++ here (cv::Mat). +Important: You have to rename the view controller's extension .m into .mm, so that the compiler compiles it under the assumption of Objective-C++ (Objective-C and C++ mixed). Then, __cplusplus is defined when the compiler is processing the file for C++ code. Therefore, we put our code within a block where __cpluscplus is defined. + + + +Basic video processing +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +From here you can start processing video frames. For example the following snippet color-inverts the image: + + +.. code-block:: objc + :linenos: + + - (void)processImage:(Mat&)image; + { + // Do some OpenCV stuff with the image + Mat image_copy; + cvtColor(image, image_copy, CV_BGRA2BGR); + + // invert image + bitwise_not(image_copy, image_copy); + cvtColor(image_copy, image, CV_BGR2BGRA); + } + + +Start! +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Finally, we have to tell the camera to actually start/stop working. The following code will start the camera when you press the button, assuming you connected the UI properly: + +.. code-block:: objc + :linenos: + + #pragma mark - UI Actions + + - (IBAction)actionStart:(id)sender; + { + [self.videoCamera start]; + } + + + +Hints +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Try to avoid costly matrix copy operations as much as you can, especially if you are aiming for real-time. As the image data is passed as reference, work in-place, if possible. + +When you are working on grayscale data, turn set grayscale = YES as the YUV colorspace gives you directly access the luminance plane. + +The Accelerate framework provides some CPU-accelerated DSP filters, which come handy in your case. diff --git a/doc/tutorials/tutorials.rst b/doc/tutorials/tutorials.rst index 1238745a7..b497f3d73 100644 --- a/doc/tutorials/tutorials.rst +++ b/doc/tutorials/tutorials.rst @@ -156,11 +156,26 @@ As always, we would be happy to hear your comments and receive your contribution :width: 80pt :alt: gpu icon -* :ref:`Table-Of-Content-General` +* :ref:`Table-Of-Content-iOS` .. tabularcolumns:: m{100pt} m{300pt} .. cssclass:: toctableopencv + =========== ======================================================= + |iOS| Run OpenCV and your vision apps on an iDevice + + =========== ======================================================= + + .. |iOS| image:: images/opencv_ios.png + :height: 80pt + :width: 80pt + :alt: gpu icon + +* :ref:`Table-Of-Content-General` + + .. tabularcolumns:: m{100pt} m{300pt} + .. cssclass:: toctableopencv + =========== ======================================================= |General| These tutorials are the bottom of the iceberg as they link together multiple of the modules presented above in order to solve complex problems. @@ -189,4 +204,5 @@ As always, we would be happy to hear your comments and receive your contribution objdetect/table_of_content_objdetect/table_of_content_objdetect ml/table_of_content_ml/table_of_content_ml gpu/table_of_content_gpu/table_of_content_gpu + ios/table_of_content_ios/table_of_content_ios general/table_of_content_general/table_of_content_general From a6e2acbfee08f1bd73a278a2df53d609d50be604 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Thu, 30 Aug 2012 16:23:18 +0400 Subject: [PATCH 043/103] added a few missing images for tutorials; integrated pull request #26 --- 3rdparty/libjasper/CMakeLists.txt | 4 ++-- CMakeLists.txt | 5 ++++- .../ios/hello/images/header_directive.png | Bin 0 -> 106851 bytes .../ios/hello/images/linking_opencv_ios.png | Bin 0 -> 90335 bytes doc/tutorials/ios/hello/images/output.png | Bin 0 -> 102778 bytes .../ios/hello/images/view_did_load.png | Bin 0 -> 164211 bytes .../ios/image_manipulation/images/output.jpg | Bin 0 -> 147167 bytes modules/gpu/perf/perf_calib3d.cpp | 17 +++++++++++++---- modules/highgui/CMakeLists.txt | 1 + 9 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 doc/tutorials/ios/hello/images/header_directive.png create mode 100644 doc/tutorials/ios/hello/images/linking_opencv_ios.png create mode 100644 doc/tutorials/ios/hello/images/output.png create mode 100644 doc/tutorials/ios/hello/images/view_did_load.png create mode 100644 doc/tutorials/ios/image_manipulation/images/output.jpg diff --git a/3rdparty/libjasper/CMakeLists.txt b/3rdparty/libjasper/CMakeLists.txt index 0478ef9d4..a6fb71ec5 100644 --- a/3rdparty/libjasper/CMakeLists.txt +++ b/3rdparty/libjasper/CMakeLists.txt @@ -19,9 +19,9 @@ file(GLOB lib_ext_hdrs jasper/*.h) add_library(${JASPER_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs} ${lib_ext_hdrs}) -if(MSVC) +if(WIN32 AND NOT MINGW) add_definitions(-DJAS_WIN_MSVC_BUILD) -endif() +endif(WIN32 AND NOT MINGW) ocv_warnings_disable(CMAKE_C_FLAGS -Wno-implicit-function-declaration -Wno-uninitialized -Wmissing-prototypes -Wmissing-declarations -Wunused -Wshadow -Wsign-compare) ocv_warnings_disable(CMAKE_C_FLAGS /wd4013 /wd4018 /wd4101 /wd4244 /wd4267 /wd4715) # vs2005 diff --git a/CMakeLists.txt b/CMakeLists.txt index f9baf672e..b644212c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,9 +337,12 @@ include(cmake/OpenCVCompilerOptions.cmake REQUIRED) # ---------------------------------------------------------------------------- if(MSVC) include(cmake/OpenCVCRTLinkage.cmake REQUIRED) - add_definitions(-D_VARIADIC_MAX=10) endif(MSVC) +if(WIN32 AND NOT MINGW) + add_definitions(-D_VARIADIC_MAX=10) +endif(WIN32 AND NOT MINGW) + # ---------------------------------------------------------------------------- # CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC.. diff --git a/doc/tutorials/ios/hello/images/header_directive.png b/doc/tutorials/ios/hello/images/header_directive.png new file mode 100644 index 0000000000000000000000000000000000000000..7e41e0bd666604ee01d4b6ad417b72a44631fb94 GIT binary patch literal 106851 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�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

T}K8gG8@-juo^r{mTE3{<+(ncS2A-AA2$KmBq} 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
  • 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/ios/hello/images/linking_opencv_ios.png b/doc/tutorials/ios/hello/images/linking_opencv_ios.png new file mode 100644 index 0000000000000000000000000000000000000000..cf82caf23c74828ea2ebc6361d604c3e86b0f761 GIT binary patch literal 90335 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%0AFJbK9idx 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 DIVTYr literal 0 HcmV?d00001 diff --git a/doc/tutorials/ios/hello/images/output.png b/doc/tutorials/ios/hello/images/output.png new file mode 100644 index 0000000000000000000000000000000000000000..13d94338163151832b58a52bc81f72f0ed7bd24d GIT binary patch literal 102778 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 z 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
    2Trb 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%0Aa>X>72;f$M^aT$^ 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 Rz7N2YtfZnunV6y9{{dx&+R*?2 literal 0 HcmV?d00001 diff --git a/doc/tutorials/ios/image_manipulation/images/output.jpg b/doc/tutorials/ios/image_manipulation/images/output.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f55233ab39313d87266c56170582b1a8a4893ec GIT binary patch literal 147167 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℘{9fBh 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 pair_string; DEF_PARAM_TEST_1(ImagePair, pair_string); -PERF_TEST_P(ImagePair, Calib3D_StereoBM, Values(make_pair("gpu/perf/aloe.jpg", "gpu/perf/aloeR.jpg"))) +static pair_string make_string_pair(const string& a, const string& b) +{ +#ifdef _MSC_VER + return pair(a, b); +#else + return make_pair(a, b); +#endif +} + +PERF_TEST_P(ImagePair, Calib3D_StereoBM, Values(make_string_pair("gpu/perf/aloe.jpg", "gpu/perf/aloeR.jpg"))) { declare.time(5.0); @@ -57,7 +66,7 @@ PERF_TEST_P(ImagePair, Calib3D_StereoBM, Values(make_pair("gpu/p ////////////////////////////////////////////////////////////////////// // StereoBeliefPropagation -PERF_TEST_P(ImagePair, Calib3D_StereoBeliefPropagation, Values(make_pair("gpu/stereobp/aloe-L.png", "gpu/stereobp/aloe-R.png"))) +PERF_TEST_P(ImagePair, Calib3D_StereoBeliefPropagation, Values(make_string_pair("gpu/stereobp/aloe-L.png", "gpu/stereobp/aloe-R.png"))) { declare.time(10.0); @@ -93,7 +102,7 @@ PERF_TEST_P(ImagePair, Calib3D_StereoBeliefPropagation, Values(make_pair("gpu/stereobm/aloe-L.png", "gpu/stereobm/aloe-R.png"))) +PERF_TEST_P(ImagePair, Calib3D_StereoConstantSpaceBP, Values(make_string_pair("gpu/stereobm/aloe-L.png", "gpu/stereobm/aloe-R.png"))) { declare.time(10.0); @@ -129,7 +138,7 @@ PERF_TEST_P(ImagePair, Calib3D_StereoConstantSpaceBP, Values(make_pair("gpu/stereobm/aloe-L.png", "gpu/stereobm/aloe-disp.png"))) +PERF_TEST_P(ImagePair, Calib3D_DisparityBilateralFilter, Values(make_string_pair("gpu/stereobm/aloe-L.png", "gpu/stereobm/aloe-disp.png"))) { const cv::Mat img = readImage(GetParam().first, cv::IMREAD_GRAYSCALE); ASSERT_FALSE(img.empty()); diff --git a/modules/highgui/CMakeLists.txt b/modules/highgui/CMakeLists.txt index d53c17c40..7a57b090c 100644 --- a/modules/highgui/CMakeLists.txt +++ b/modules/highgui/CMakeLists.txt @@ -107,6 +107,7 @@ endif() if(WIN32) list(APPEND highgui_srcs src/cap_vfw.cpp src/cap_cmu.cpp src/cap_dshow.cpp) + list(APPEND HIGHGUI_LIBRARIES vfw32) endif(WIN32) if(HAVE_XINE) From 228070a74cf43f4f37e6c65110ea18587d76e4a6 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Thu, 23 Aug 2012 14:33:11 +0200 Subject: [PATCH 044/103] split FAST in order to reuse it in BRISK --- modules/features2d/src/fast.cpp | 328 +--------------------- modules/features2d/src/fast_score.cpp | 374 ++++++++++++++++++++++++++ modules/features2d/src/fast_score.hpp | 64 +++++ 3 files changed, 439 insertions(+), 327 deletions(-) create mode 100644 modules/features2d/src/fast_score.cpp create mode 100644 modules/features2d/src/fast_score.hpp diff --git a/modules/features2d/src/fast.cpp b/modules/features2d/src/fast.cpp index b9834bbf0..9beba2145 100644 --- a/modules/features2d/src/fast.cpp +++ b/modules/features2d/src/fast.cpp @@ -42,335 +42,11 @@ The references are: */ #include "precomp.hpp" +#include "fast_score.hpp" namespace cv { -static void makeOffsets(int pixel[], int row_stride, int patternSize) -{ - switch(patternSize) { - case 16: - pixel[0] = 0 + row_stride * 3; - pixel[1] = 1 + row_stride * 3; - pixel[2] = 2 + row_stride * 2; - pixel[3] = 3 + row_stride * 1; - pixel[4] = 3 + row_stride * 0; - pixel[5] = 3 + row_stride * -1; - pixel[6] = 2 + row_stride * -2; - pixel[7] = 1 + row_stride * -3; - pixel[8] = 0 + row_stride * -3; - pixel[9] = -1 + row_stride * -3; - pixel[10] = -2 + row_stride * -2; - pixel[11] = -3 + row_stride * -1; - pixel[12] = -3 + row_stride * 0; - pixel[13] = -3 + row_stride * 1; - pixel[14] = -2 + row_stride * 2; - pixel[15] = -1 + row_stride * 3; - break; - case 12: - pixel[0] = 0 + row_stride * 2; - pixel[1] = 1 + row_stride * 2; - pixel[2] = 2 + row_stride * 1; - pixel[3] = 2 + row_stride * 0; - pixel[4] = 2 + row_stride * -1; - pixel[5] = 1 + row_stride * -2; - pixel[6] = 0 + row_stride * -2; - pixel[7] = -1 + row_stride * -2; - pixel[8] = -2 + row_stride * -1; - pixel[9] = -2 + row_stride * 0; - pixel[10] = -2 + row_stride * 1; - pixel[11] = -1 + row_stride * 2; - break; - case 8: - pixel[0] = 0 + row_stride * 1; - pixel[1] = 1 + row_stride * 1; - pixel[2] = 1 + row_stride * 0; - pixel[3] = 1 + row_stride * -1; - pixel[4] = 0 + row_stride * -1; - pixel[5] = -1 + row_stride * -1; - pixel[6] = 0 + row_stride * 0; - pixel[7] = 1 + row_stride * 1; - break; - } -} - -/*static void testCorner(const uchar* ptr, const int pixel[], int K, int N, int threshold) { - // check that with the computed "threshold" the pixel is still a corner - // and that with the increased-by-1 "threshold" the pixel is not a corner anymore - for( int delta = 0; delta <= 1; delta++ ) - { - int v0 = std::min(ptr[0] + threshold + delta, 255); - int v1 = std::max(ptr[0] - threshold - delta, 0); - int c0 = 0, c1 = 0; - - for( int k = 0; k < N; k++ ) - { - int x = ptr[pixel[k]]; - if(x > v0) - { - if( ++c0 > K ) - break; - c1 = 0; - } - else if( x < v1 ) - { - if( ++c1 > K ) - break; - c0 = 0; - } - else - { - c0 = c1 = 0; - } - } - CV_Assert( (delta == 0 && std::max(c0, c1) > K) || - (delta == 1 && std::max(c0, c1) <= K) ); - } -}*/ - -template -int cornerScore(const uchar* ptr, const int pixel[], int threshold); - -template<> -int cornerScore<16>(const uchar* ptr, const int pixel[], int threshold) -{ - const int K = 8, N = 16 + K + 1; - int k, v = ptr[0]; - short d[N]; - for( k = 0; k < N; k++ ) - d[k] = (short)(v - ptr[pixel[k]]); - -#if CV_SSE2 - __m128i q0 = _mm_set1_epi16(-1000), q1 = _mm_set1_epi16(1000); - for( k = 0; k < 16; k += 8 ) - { - __m128i v0 = _mm_loadu_si128((__m128i*)(d+k+1)); - __m128i v1 = _mm_loadu_si128((__m128i*)(d+k+2)); - __m128i a = _mm_min_epi16(v0, v1); - __m128i b = _mm_max_epi16(v0, v1); - v0 = _mm_loadu_si128((__m128i*)(d+k+3)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+4)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+5)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+6)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+7)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+8)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k)); - q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); - q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); - v0 = _mm_loadu_si128((__m128i*)(d+k+9)); - q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); - q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); - } - q0 = _mm_max_epi16(q0, _mm_sub_epi16(_mm_setzero_si128(), q1)); - q0 = _mm_max_epi16(q0, _mm_unpackhi_epi64(q0, q0)); - q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 4)); - q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 2)); - threshold = (short)_mm_cvtsi128_si32(q0) - 1; -#else - int a0 = threshold; - for( k = 0; k < 16; k += 2 ) - { - int a = std::min((int)d[k+1], (int)d[k+2]); - a = std::min(a, (int)d[k+3]); - if( a <= a0 ) - continue; - a = std::min(a, (int)d[k+4]); - a = std::min(a, (int)d[k+5]); - a = std::min(a, (int)d[k+6]); - a = std::min(a, (int)d[k+7]); - a = std::min(a, (int)d[k+8]); - a0 = std::max(a0, std::min(a, (int)d[k])); - a0 = std::max(a0, std::min(a, (int)d[k+9])); - } - - int b0 = -a0; - for( k = 0; k < 16; k += 2 ) - { - int b = std::max((int)d[k+1], (int)d[k+2]); - b = std::max(b, (int)d[k+3]); - b = std::max(b, (int)d[k+4]); - b = std::max(b, (int)d[k+5]); - if( b >= b0 ) - continue; - b = std::max(b, (int)d[k+6]); - b = std::max(b, (int)d[k+7]); - b = std::max(b, (int)d[k+8]); - - b0 = std::min(b0, std::max(b, (int)d[k])); - b0 = std::min(b0, std::max(b, (int)d[k+9])); - } - - threshold = -b0-1; -#endif - -#if 0 - testCorner(ptr, pixel, K, N, threshold); -#endif - return threshold; -} - -template<> -int cornerScore<12>(const uchar* ptr, const int pixel[], int threshold) -{ - const int K = 6, N = 12 + K + 1; - int k, v = ptr[0]; - short d[N]; - for( k = 0; k < N; k++ ) - d[k] = (short)(v - ptr[pixel[k]]); - -#if CV_SSE2 - __m128i q0 = _mm_set1_epi16(-1000), q1 = _mm_set1_epi16(1000); - for( k = 0; k < 16; k += 8 ) - { - __m128i v0 = _mm_loadu_si128((__m128i*)(d+k+1)); - __m128i v1 = _mm_loadu_si128((__m128i*)(d+k+2)); - __m128i a = _mm_min_epi16(v0, v1); - __m128i b = _mm_max_epi16(v0, v1); - v0 = _mm_loadu_si128((__m128i*)(d+k+3)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+4)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+5)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+6)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k)); - q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); - q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); - v0 = _mm_loadu_si128((__m128i*)(d+k+7)); - q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); - q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); - } - q0 = _mm_max_epi16(q0, _mm_sub_epi16(_mm_setzero_si128(), q1)); - q0 = _mm_max_epi16(q0, _mm_unpackhi_epi64(q0, q0)); - q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 4)); - q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 2)); - threshold = (short)_mm_cvtsi128_si32(q0) - 1; -#else - int a0 = threshold; - for( k = 0; k < 12; k += 2 ) - { - int a = std::min((int)d[k+1], (int)d[k+2]); - if( a <= a0 ) - continue; - a = std::min(a, (int)d[k+3]); - a = std::min(a, (int)d[k+4]); - a = std::min(a, (int)d[k+5]); - a = std::min(a, (int)d[k+6]); - a0 = std::max(a0, std::min(a, (int)d[k])); - a0 = std::max(a0, std::min(a, (int)d[k+7])); - } - - int b0 = -a0; - for( k = 0; k < 12; k += 2 ) - { - int b = std::max((int)d[k+1], (int)d[k+2]); - b = std::max(b, (int)d[k+3]); - b = std::max(b, (int)d[k+4]); - if( b >= b0 ) - continue; - b = std::max(b, (int)d[k+5]); - b = std::max(b, (int)d[k+6]); - - b0 = std::min(b0, std::max(b, (int)d[k])); - b0 = std::min(b0, std::max(b, (int)d[k+7])); - } - - threshold = -b0-1; -#endif - -#if 0 - testCorner(ptr, pixel, K, N, threshold); -#endif - return threshold; -} - -template<> -int cornerScore<8>(const uchar* ptr, const int pixel[], int threshold) -{ - const int K = 4, N = 8 + K + 1; - int k, v = ptr[0]; - short d[N]; - for( k = 0; k < N; k++ ) - d[k] = (short)(v - ptr[pixel[k]]); - -#if CV_SSE2 - __m128i q0 = _mm_set1_epi16(-1000), q1 = _mm_set1_epi16(1000); - for( k = 0; k < 16; k += 8 ) - { - __m128i v0 = _mm_loadu_si128((__m128i*)(d+k+1)); - __m128i v1 = _mm_loadu_si128((__m128i*)(d+k+2)); - __m128i a = _mm_min_epi16(v0, v1); - __m128i b = _mm_max_epi16(v0, v1); - v0 = _mm_loadu_si128((__m128i*)(d+k+3)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k+4)); - a = _mm_min_epi16(a, v0); - b = _mm_max_epi16(b, v0); - v0 = _mm_loadu_si128((__m128i*)(d+k)); - q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); - q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); - v0 = _mm_loadu_si128((__m128i*)(d+k+5)); - q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); - q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); - } - q0 = _mm_max_epi16(q0, _mm_sub_epi16(_mm_setzero_si128(), q1)); - q0 = _mm_max_epi16(q0, _mm_unpackhi_epi64(q0, q0)); - q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 4)); - q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 2)); - threshold = (short)_mm_cvtsi128_si32(q0) - 1; -#else - int a0 = threshold; - for( k = 0; k < 8; k += 2 ) - { - int a = std::min((int)d[k+1], (int)d[k+2]); - if( a <= a0 ) - continue; - a = std::min(a, (int)d[k+3]); - a = std::min(a, (int)d[k+4]); - a0 = std::max(a0, std::min(a, (int)d[k])); - a0 = std::max(a0, std::min(a, (int)d[k+5])); - } - - int b0 = -a0; - for( k = 0; k < 8; k += 2 ) - { - int b = std::max((int)d[k+1], (int)d[k+2]); - b = std::max(b, (int)d[k+3]); - if( b >= b0 ) - continue; - b = std::max(b, (int)d[k+4]); - - b0 = std::min(b0, std::max(b, (int)d[k])); - b0 = std::min(b0, std::max(b, (int)d[k+5])); - } - - threshold = -b0-1; -#endif - -#if 0 - testCorner(ptr, pixel, K, N, threshold); -#endif - return threshold; -} - template void FAST_t(InputArray _img, std::vector& keypoints, int threshold, bool nonmax_suppression) { @@ -381,8 +57,6 @@ void FAST_t(InputArray _img, std::vector& keypoints, int threshold, bo #endif int i, j, k, pixel[25]; makeOffsets(pixel, (int)img.step, patternSize); - for(k = patternSize; k < 25; k++) - pixel[k] = pixel[k - patternSize]; keypoints.clear(); diff --git a/modules/features2d/src/fast_score.cpp b/modules/features2d/src/fast_score.cpp new file mode 100644 index 000000000..aa5881e2d --- /dev/null +++ b/modules/features2d/src/fast_score.cpp @@ -0,0 +1,374 @@ +/* This is FAST corner detector, contributed to OpenCV by the author, Edward Rosten. + Below is the original copyright and the references */ + +/* +Copyright (c) 2006, 2008 Edward Rosten +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 the University of Cambridge 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. +*/ + +/* +The references are: + * Machine learning for high-speed corner detection, + E. Rosten and T. Drummond, ECCV 2006 + * Faster and better: A machine learning approach to corner detection + E. Rosten, R. Porter and T. Drummond, PAMI, 2009 +*/ + +#include "fast_score.hpp" + +namespace cv +{ + +void makeOffsets(int pixel[25], int row_stride, int patternSize) +{ + CV_Assert(pixel != 0); + switch(patternSize) { + case 16: + pixel[0] = 0 + row_stride * 3; + pixel[1] = 1 + row_stride * 3; + pixel[2] = 2 + row_stride * 2; + pixel[3] = 3 + row_stride * 1; + pixel[4] = 3 + row_stride * 0; + pixel[5] = 3 + row_stride * -1; + pixel[6] = 2 + row_stride * -2; + pixel[7] = 1 + row_stride * -3; + pixel[8] = 0 + row_stride * -3; + pixel[9] = -1 + row_stride * -3; + pixel[10] = -2 + row_stride * -2; + pixel[11] = -3 + row_stride * -1; + pixel[12] = -3 + row_stride * 0; + pixel[13] = -3 + row_stride * 1; + pixel[14] = -2 + row_stride * 2; + pixel[15] = -1 + row_stride * 3; + break; + case 12: + pixel[0] = 0 + row_stride * 2; + pixel[1] = 1 + row_stride * 2; + pixel[2] = 2 + row_stride * 1; + pixel[3] = 2 + row_stride * 0; + pixel[4] = 2 + row_stride * -1; + pixel[5] = 1 + row_stride * -2; + pixel[6] = 0 + row_stride * -2; + pixel[7] = -1 + row_stride * -2; + pixel[8] = -2 + row_stride * -1; + pixel[9] = -2 + row_stride * 0; + pixel[10] = -2 + row_stride * 1; + pixel[11] = -1 + row_stride * 2; + break; + case 8: + pixel[0] = 0 + row_stride * 1; + pixel[1] = 1 + row_stride * 1; + pixel[2] = 1 + row_stride * 0; + pixel[3] = 1 + row_stride * -1; + pixel[4] = 0 + row_stride * -1; + pixel[5] = -1 + row_stride * -1; + pixel[6] = 0 + row_stride * 0; + pixel[7] = 1 + row_stride * 1; + break; + } + for(int k = patternSize; k < 25; k++) + pixel[k] = pixel[k - patternSize]; +} + +/*static void testCorner(const uchar* ptr, const int pixel[], int K, int N, int threshold) { + // check that with the computed "threshold" the pixel is still a corner + // and that with the increased-by-1 "threshold" the pixel is not a corner anymore + for( int delta = 0; delta <= 1; delta++ ) + { + int v0 = std::min(ptr[0] + threshold + delta, 255); + int v1 = std::max(ptr[0] - threshold - delta, 0); + int c0 = 0, c1 = 0; + + for( int k = 0; k < N; k++ ) + { + int x = ptr[pixel[k]]; + if(x > v0) + { + if( ++c0 > K ) + break; + c1 = 0; + } + else if( x < v1 ) + { + if( ++c1 > K ) + break; + c0 = 0; + } + else + { + c0 = c1 = 0; + } + } + CV_Assert( (delta == 0 && std::max(c0, c1) > K) || + (delta == 1 && std::max(c0, c1) <= K) ); + } +}*/ + +template<> +int cornerScore<16>(const uchar* ptr, const int pixel[], int threshold) +{ + const int K = 8, N = 16 + K + 1; + int k, v = ptr[0]; + short d[N]; + for( k = 0; k < N; k++ ) + d[k] = (short)(v - ptr[pixel[k]]); + +#if CV_SSE2 + __m128i q0 = _mm_set1_epi16(-1000), q1 = _mm_set1_epi16(1000); + for( k = 0; k < 16; k += 8 ) + { + __m128i v0 = _mm_loadu_si128((__m128i*)(d+k+1)); + __m128i v1 = _mm_loadu_si128((__m128i*)(d+k+2)); + __m128i a = _mm_min_epi16(v0, v1); + __m128i b = _mm_max_epi16(v0, v1); + v0 = _mm_loadu_si128((__m128i*)(d+k+3)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+4)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+5)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+6)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+7)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+8)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k)); + q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); + q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); + v0 = _mm_loadu_si128((__m128i*)(d+k+9)); + q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); + q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); + } + q0 = _mm_max_epi16(q0, _mm_sub_epi16(_mm_setzero_si128(), q1)); + q0 = _mm_max_epi16(q0, _mm_unpackhi_epi64(q0, q0)); + q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 4)); + q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 2)); + threshold = (short)_mm_cvtsi128_si32(q0) - 1; +#else + int a0 = threshold; + for( k = 0; k < 16; k += 2 ) + { + int a = std::min((int)d[k+1], (int)d[k+2]); + a = std::min(a, (int)d[k+3]); + if( a <= a0 ) + continue; + a = std::min(a, (int)d[k+4]); + a = std::min(a, (int)d[k+5]); + a = std::min(a, (int)d[k+6]); + a = std::min(a, (int)d[k+7]); + a = std::min(a, (int)d[k+8]); + a0 = std::max(a0, std::min(a, (int)d[k])); + a0 = std::max(a0, std::min(a, (int)d[k+9])); + } + + int b0 = -a0; + for( k = 0; k < 16; k += 2 ) + { + int b = std::max((int)d[k+1], (int)d[k+2]); + b = std::max(b, (int)d[k+3]); + b = std::max(b, (int)d[k+4]); + b = std::max(b, (int)d[k+5]); + if( b >= b0 ) + continue; + b = std::max(b, (int)d[k+6]); + b = std::max(b, (int)d[k+7]); + b = std::max(b, (int)d[k+8]); + + b0 = std::min(b0, std::max(b, (int)d[k])); + b0 = std::min(b0, std::max(b, (int)d[k+9])); + } + + threshold = -b0-1; +#endif + +#if 0 + testCorner(ptr, pixel, K, N, threshold); +#endif + return threshold; +} + +template<> +int cornerScore<12>(const uchar* ptr, const int pixel[], int threshold) +{ + const int K = 6, N = 12 + K + 1; + int k, v = ptr[0]; + short d[N]; + for( k = 0; k < N; k++ ) + d[k] = (short)(v - ptr[pixel[k]]); + +#if CV_SSE2 + __m128i q0 = _mm_set1_epi16(-1000), q1 = _mm_set1_epi16(1000); + for( k = 0; k < 16; k += 8 ) + { + __m128i v0 = _mm_loadu_si128((__m128i*)(d+k+1)); + __m128i v1 = _mm_loadu_si128((__m128i*)(d+k+2)); + __m128i a = _mm_min_epi16(v0, v1); + __m128i b = _mm_max_epi16(v0, v1); + v0 = _mm_loadu_si128((__m128i*)(d+k+3)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+4)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+5)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+6)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k)); + q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); + q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); + v0 = _mm_loadu_si128((__m128i*)(d+k+7)); + q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); + q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); + } + q0 = _mm_max_epi16(q0, _mm_sub_epi16(_mm_setzero_si128(), q1)); + q0 = _mm_max_epi16(q0, _mm_unpackhi_epi64(q0, q0)); + q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 4)); + q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 2)); + threshold = (short)_mm_cvtsi128_si32(q0) - 1; +#else + int a0 = threshold; + for( k = 0; k < 12; k += 2 ) + { + int a = std::min((int)d[k+1], (int)d[k+2]); + if( a <= a0 ) + continue; + a = std::min(a, (int)d[k+3]); + a = std::min(a, (int)d[k+4]); + a = std::min(a, (int)d[k+5]); + a = std::min(a, (int)d[k+6]); + a0 = std::max(a0, std::min(a, (int)d[k])); + a0 = std::max(a0, std::min(a, (int)d[k+7])); + } + + int b0 = -a0; + for( k = 0; k < 12; k += 2 ) + { + int b = std::max((int)d[k+1], (int)d[k+2]); + b = std::max(b, (int)d[k+3]); + b = std::max(b, (int)d[k+4]); + if( b >= b0 ) + continue; + b = std::max(b, (int)d[k+5]); + b = std::max(b, (int)d[k+6]); + + b0 = std::min(b0, std::max(b, (int)d[k])); + b0 = std::min(b0, std::max(b, (int)d[k+7])); + } + + threshold = -b0-1; +#endif + +#if 0 + testCorner(ptr, pixel, K, N, threshold); +#endif + return threshold; +} + +template<> +int cornerScore<8>(const uchar* ptr, const int pixel[], int threshold) +{ + const int K = 4, N = 8 + K + 1; + int k, v = ptr[0]; + short d[N]; + for( k = 0; k < N; k++ ) + d[k] = (short)(v - ptr[pixel[k]]); + +#if CV_SSE2 + __m128i q0 = _mm_set1_epi16(-1000), q1 = _mm_set1_epi16(1000); + for( k = 0; k < 16; k += 8 ) + { + __m128i v0 = _mm_loadu_si128((__m128i*)(d+k+1)); + __m128i v1 = _mm_loadu_si128((__m128i*)(d+k+2)); + __m128i a = _mm_min_epi16(v0, v1); + __m128i b = _mm_max_epi16(v0, v1); + v0 = _mm_loadu_si128((__m128i*)(d+k+3)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k+4)); + a = _mm_min_epi16(a, v0); + b = _mm_max_epi16(b, v0); + v0 = _mm_loadu_si128((__m128i*)(d+k)); + q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); + q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); + v0 = _mm_loadu_si128((__m128i*)(d+k+5)); + q0 = _mm_max_epi16(q0, _mm_min_epi16(a, v0)); + q1 = _mm_min_epi16(q1, _mm_max_epi16(b, v0)); + } + q0 = _mm_max_epi16(q0, _mm_sub_epi16(_mm_setzero_si128(), q1)); + q0 = _mm_max_epi16(q0, _mm_unpackhi_epi64(q0, q0)); + q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 4)); + q0 = _mm_max_epi16(q0, _mm_srli_si128(q0, 2)); + threshold = (short)_mm_cvtsi128_si32(q0) - 1; +#else + int a0 = threshold; + for( k = 0; k < 8; k += 2 ) + { + int a = std::min((int)d[k+1], (int)d[k+2]); + if( a <= a0 ) + continue; + a = std::min(a, (int)d[k+3]); + a = std::min(a, (int)d[k+4]); + a0 = std::max(a0, std::min(a, (int)d[k])); + a0 = std::max(a0, std::min(a, (int)d[k+5])); + } + + int b0 = -a0; + for( k = 0; k < 8; k += 2 ) + { + int b = std::max((int)d[k+1], (int)d[k+2]); + b = std::max(b, (int)d[k+3]); + if( b >= b0 ) + continue; + b = std::max(b, (int)d[k+4]); + + b0 = std::min(b0, std::max(b, (int)d[k])); + b0 = std::min(b0, std::max(b, (int)d[k+5])); + } + + threshold = -b0-1; +#endif + +#if 0 + testCorner(ptr, pixel, K, N, threshold); +#endif + return threshold; +} + +} diff --git a/modules/features2d/src/fast_score.hpp b/modules/features2d/src/fast_score.hpp new file mode 100644 index 000000000..f6e9f6fc6 --- /dev/null +++ b/modules/features2d/src/fast_score.hpp @@ -0,0 +1,64 @@ +/* This is FAST corner detector, contributed to OpenCV by the author, Edward Rosten. + Below is the original copyright and the references */ + +/* +Copyright (c) 2006, 2008 Edward Rosten +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 the University of Cambridge 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. +*/ + +/* +The references are: + * Machine learning for high-speed corner detection, + E. Rosten and T. Drummond, ECCV 2006 + * Faster and better: A machine learning approach to corner detection + E. Rosten, R. Porter and T. Drummond, PAMI, 2009 +*/ + +#ifndef __OPENCV_FEATURES_2D_FAST_HPP__ +#define __OPENCV_FEATURES_2D_FAST_HPP__ + +#ifdef __cplusplus + +#include "precomp.hpp" + +namespace cv +{ + +void makeOffsets(int pixel[25], int row_stride, int patternSize); + +//static void testCorner(const uchar* ptr, const int pixel[], int K, int N, int threshold); + +template +int cornerScore(const uchar* ptr, const int pixel[], int threshold); + +} + +#endif +#endif From 13ded36ecb831d512a0f92a0baebdab8bedded6f Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Thu, 23 Aug 2012 14:52:01 +0200 Subject: [PATCH 045/103] initial addition of BRISK with some tests --- .../include/opencv2/features2d/features2d.hpp | 86 + modules/features2d/src/brisk.cpp | 2277 +++++++++++++++++ modules/features2d/src/features2d_init.cpp | 7 + modules/features2d/test/test_brisk.cpp | 95 + .../test/test_descriptors_regression.cpp | 7 + .../test/test_detectors_regression.cpp | 6 + 6 files changed, 2478 insertions(+) create mode 100755 modules/features2d/src/brisk.cpp create mode 100644 modules/features2d/test/test_brisk.cpp diff --git a/modules/features2d/include/opencv2/features2d/features2d.hpp b/modules/features2d/include/opencv2/features2d/features2d.hpp index ff52822ed..a081fd4ee 100644 --- a/modules/features2d/include/opencv2/features2d/features2d.hpp +++ b/modules/features2d/include/opencv2/features2d/features2d.hpp @@ -267,6 +267,92 @@ public: static Ptr create( const string& name ); }; +/*! + BRISK implementation +*/ +class CV_EXPORTS_W BRISK : public Feature2D +{ +public: + CV_WRAP explicit BRISK(int thresh=30, int octaves=3, float patternScale=1.0f); + + virtual ~BRISK(); + + // returns the descriptor size in bytes + int descriptorSize() const; + // returns the descriptor type + int descriptorType() const; + + // Compute the BRISK features on an image + void operator()(InputArray image, InputArray mask, vector& keypoints) const; + + // Compute the BRISK features and descriptors on an image + void operator()( InputArray image, InputArray mask, vector& keypoints, + OutputArray descriptors, bool useProvidedKeypoints=false ) const; + + AlgorithmInfo* info() const; + + // custom setup + CV_WRAP explicit BRISK(std::vector &radiusList, std::vector &numberList, + float dMax=5.85f, float dMin=8.2f, std::vector indexChange=std::vector()); + + // call this to generate the kernel: + // circle of radius r (pixels), with n points; + // short pairings with dMax, long pairings with dMin + CV_WRAP void generateKernel(std::vector &radiusList, + std::vector &numberList, float dMax=5.85f, float dMin=8.2f, + std::vector indexChange=std::vector()); + +protected: + + void computeImpl( const Mat& image, vector& keypoints, Mat& descriptors ) const; + void detectImpl( const Mat& image, vector& keypoints, const Mat& mask=Mat() ) const; + + // Feature parameters + CV_PROP_RW int threshold; + CV_PROP_RW int octaves; + + // some helper structures for the Brisk pattern representation + struct BriskPatternPoint{ + float x; // x coordinate relative to center + float y; // x coordinate relative to center + float sigma; // Gaussian smoothing sigma + }; + struct BriskShortPair{ + unsigned int i; // index of the first pattern point + unsigned int j; // index of other pattern point + }; + struct BriskLongPair{ + unsigned int i; // index of the first pattern point + unsigned int j; // index of other pattern point + int weighted_dx; // 1024.0/dx + int weighted_dy; // 1024.0/dy + }; + inline int smoothedIntensity(const cv::Mat& image, + const cv::Mat& integral,const float key_x, + const float key_y, const unsigned int scale, + const unsigned int rot, const unsigned int point) const; + // pattern properties + BriskPatternPoint* patternPoints_; //[i][rotation][scale] + unsigned int points_; // total number of collocation points + float* scaleList_; // lists the scaling per scale index [scale] + unsigned int* sizeList_; // lists the total pattern size per scale index [scale] + static const unsigned int scales_; // scales discretization + static const float scalerange_; // span of sizes 40->4 Octaves - else, this needs to be adjusted... + static const unsigned int n_rot_; // discretization of the rotation look-up + + // pairs + int strings_; // number of uchars the descriptor consists of + float dMax_; // short pair maximum distance + float dMin_; // long pair maximum distance + BriskShortPair* shortPairs_; // d<_dMax + BriskLongPair* longPairs_; // d>_dMin + unsigned int noShortPairs_; // number of shortParis + unsigned int noLongPairs_; // number of longParis + + // general + static const float basicSize_; +}; + /*! ORB implementation. diff --git a/modules/features2d/src/brisk.cpp b/modules/features2d/src/brisk.cpp new file mode 100755 index 000000000..415ed7821 --- /dev/null +++ b/modules/features2d/src/brisk.cpp @@ -0,0 +1,2277 @@ +/********************************************************************* + * Software License Agreement (BSD License) + * + * Copyright (C) 2011 The Autonomous Systems Lab (ASL), ETH Zurich, + * Stefan Leutenegger, Simon Lynen and Margarita Chli. + * Copyright (c) 2009, Willow Garage, Inc. + * 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 the Willow Garage 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. + *********************************************************************/ + +/* + BRISK - Binary Robust Invariant Scalable Keypoints + Reference implementation of + [1] Stefan Leutenegger,Margarita Chli and Roland Siegwart, BRISK: + Binary Robust Invariant Scalable Keypoints, in Proceedings of + the IEEE International Conference on Computer Vision (ICCV2011). + */ + +#include +#include +#include +#include +#include + +#include "fast_score.hpp" + +namespace cv +{ + +// a layer in the Brisk detector pyramid +class CV_EXPORTS BriskLayer +{ +public: + // constructor arguments + struct CV_EXPORTS CommonParams + { + static const int HALFSAMPLE = 0; + static const int TWOTHIRDSAMPLE = 1; + }; + // construct a base layer + BriskLayer(const cv::Mat& img, float scale = 1.0f, float offset = 0.0f); + // derive a layer + BriskLayer(const BriskLayer& layer, int mode); + + // Fast/Agast without non-max suppression + void + getAgastPoints(uint8_t threshold, std::vector& keypoints); + + // get scores - attention, this is in layer coordinates, not scale=1 coordinates! + inline uint8_t + getAgastScore(int x, int y, uint8_t threshold); + inline uint8_t + getAgastScore_5_8(int x, int y, uint8_t threshold); + inline uint8_t + getAgastScore(float xf, float yf, uint8_t threshold, float scale = 1.0f); + + // accessors + inline const cv::Mat& + img() const + { + return img_; + } + inline const cv::Mat& + scores() const + { + return scores_; + } + inline float + scale() const + { + return scale_; + } + inline float + offset() const + { + return offset_; + } + + // half sampling + static inline void + halfsample(const cv::Mat& srcimg, cv::Mat& dstimg); + // two third sampling + static inline void + twothirdsample(const cv::Mat& srcimg, cv::Mat& dstimg); + +private: + // access gray values (smoothed/interpolated) + __inline__ uint8_t + value(const cv::Mat& mat, float xf, float yf, float scale); + // the image + cv::Mat img_; + // its Fast scores + cv::Mat_ scores_; + // coordinate transformation + float scale_; + float offset_; + // agast + cv::Ptr fast_9_16_; + int pixel_5_8_[25]; + int pixel_9_16_[25]; +}; + +class CV_EXPORTS BriskScaleSpace +{ +public: + // construct telling the octaves number: + BriskScaleSpace(uint8_t _octaves = 3); + ~BriskScaleSpace(); + + // construct the image pyramids + void + constructPyramid(const cv::Mat& image); + + // get Keypoints + void + getKeypoints(const uint8_t _threshold, std::vector& keypoints); + +protected: + // nonmax suppression: + __inline__ bool + isMax2D(const uint8_t layer, const int x_layer, const int y_layer); + // 1D (scale axis) refinement: + __inline__ float + refine1D(const float s_05, const float s0, const float s05, float& max); // around octave + __inline__ float + refine1D_1(const float s_05, const float s0, const float s05, float& max); // around intra + __inline__ float + refine1D_2(const float s_05, const float s0, const float s05, float& max); // around octave 0 only + // 2D maximum refinement: + __inline__ float + subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, const int s_1_0, const int s_1_1, const int s_1_2, + const int s_2_0, const int s_2_1, const int s_2_2, float& delta_x, float& delta_y); + // 3D maximum refinement centered around (x_layer,y_layer) + __inline__ float + refine3D(const uint8_t layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, bool& ismax); + + // interpolated score access with recalculation when needed: + __inline__ int + getScoreAbove(const uint8_t layer, const int x_layer, const int y_layer); + __inline__ int + getScoreBelow(const uint8_t layer, const int x_layer, const int y_layer); + + // return the maximum of score patches above or below + __inline__ float + getScoreMaxAbove(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, + float& dx, float& dy); + __inline__ float + getScoreMaxBelow(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, + float& dx, float& dy); + + // the image pyramids: + uint8_t layers_; + std::vector pyramid_; + + // some constant parameters: + static const float safetyFactor_; + static const float basicSize_; +}; + +using namespace cv; + +const float BRISK::basicSize_ = 12.0; +const unsigned int BRISK::scales_ = 64; +const float BRISK::scalerange_ = 30; // 40->4 Octaves - else, this needs to be adjusted... +const unsigned int BRISK::n_rot_ = 1024; // discretization of the rotation look-up + +const float BriskScaleSpace::safetyFactor_ = 1.0; +const float BriskScaleSpace::basicSize_ = 12.0; + +// constructors +BRISK::BRISK(int thresh, int octaves_in, float patternScale) +{ + threshold = thresh; + octaves = octaves_in; + + std::vector rList; + std::vector nList; + + // this is the standard pattern found to be suitable also + rList.resize(5); + nList.resize(5); + const double f = 0.85 * patternScale; + + rList[0] = f * 0; + rList[1] = f * 2.9; + rList[2] = f * 4.9; + rList[3] = f * 7.4; + rList[4] = f * 10.8; + + nList[0] = 1; + nList[1] = 10; + nList[2] = 14; + nList[3] = 15; + nList[4] = 20; + + generateKernel(rList, nList, 5.85 * patternScale, 8.2 * patternScale); + +} +BRISK::BRISK(std::vector &radiusList, std::vector &numberList, float dMax, float dMin, + std::vector indexChange) +{ + generateKernel(radiusList, numberList, dMax, dMin, indexChange); +} + +void +BRISK::generateKernel(std::vector &radiusList, std::vector &numberList, float dMax, + float dMin, std::vector indexChange) +{ + + dMax_ = dMax; + dMin_ = dMin; + + // get the total number of points + const int rings = radiusList.size(); + assert(radiusList.size()!=0&&radiusList.size()==numberList.size()); + points_ = 0; // remember the total number of points + for (int ring = 0; ring < rings; ring++) + { + points_ += numberList[ring]; + } + // set up the patterns + patternPoints_ = new BriskPatternPoint[points_ * scales_ * n_rot_]; + BriskPatternPoint* patternIterator = patternPoints_; + + // define the scale discretization: + static const float lb_scale = log(scalerange_) / log(2.0); + static const float lb_scale_step = lb_scale / (scales_); + + scaleList_ = new float[scales_]; + sizeList_ = new unsigned int[scales_]; + + const float sigma_scale = 1.3; + + for (unsigned int scale = 0; scale < scales_; ++scale) + { + scaleList_[scale] = pow((double) 2.0, (double) (scale * lb_scale_step)); + sizeList_[scale] = 0; + + // generate the pattern points look-up + double alpha, theta; + for (size_t rot = 0; rot < n_rot_; ++rot) + { + theta = double(rot) * 2 * M_PI / double(n_rot_); // this is the rotation of the feature + for (int ring = 0; ring < rings; ++ring) + { + for (int num = 0; num < numberList[ring]; ++num) + { + // the actual coordinates on the circle + alpha = (double(num)) * 2 * M_PI / double(numberList[ring]); + patternIterator->x = scaleList_[scale] * radiusList[ring] * cos(alpha + theta); // feature rotation plus angle of the point + patternIterator->y = scaleList_[scale] * radiusList[ring] * sin(alpha + theta); + // and the gaussian kernel sigma + if (ring == 0) + { + patternIterator->sigma = sigma_scale * scaleList_[scale] * 0.5; + } + else + { + patternIterator->sigma = sigma_scale * scaleList_[scale] * (double(radiusList[ring])) + * sin(M_PI / numberList[ring]); + } + // adapt the sizeList if necessary + const unsigned int size = ceil(((scaleList_[scale] * radiusList[ring]) + patternIterator->sigma)) + 1; + if (sizeList_[scale] < size) + { + sizeList_[scale] = size; + } + + // increment the iterator + ++patternIterator; + } + } + } + } + + // now also generate pairings + shortPairs_ = new BriskShortPair[points_ * (points_ - 1) / 2]; + longPairs_ = new BriskLongPair[points_ * (points_ - 1) / 2]; + noShortPairs_ = 0; + noLongPairs_ = 0; + + // fill indexChange with 0..n if empty + unsigned int indSize = indexChange.size(); + if (indSize == 0) + { + indexChange.resize(points_ * (points_ - 1) / 2); + indSize = indexChange.size(); + } + for (unsigned int i = 0; i < indSize; i++) + { + indexChange[i] = i; + } + const float dMin_sq = dMin_ * dMin_; + const float dMax_sq = dMax_ * dMax_; + for (unsigned int i = 1; i < points_; i++) + { + for (unsigned int j = 0; j < i; j++) + { //(find all the pairs) + // point pair distance: + const float dx = patternPoints_[j].x - patternPoints_[i].x; + const float dy = patternPoints_[j].y - patternPoints_[i].y; + const float norm_sq = (dx * dx + dy * dy); + if (norm_sq > dMin_sq) + { + // save to long pairs + BriskLongPair& longPair = longPairs_[noLongPairs_]; + longPair.weighted_dx = int((dx / (norm_sq)) * 2048.0 + 0.5); + longPair.weighted_dy = int((dy / (norm_sq)) * 2048.0 + 0.5); + longPair.i = i; + longPair.j = j; + ++noLongPairs_; + } + else if (norm_sq < dMax_sq) + { + // save to short pairs + assert(noShortPairs_ 2) + { + // now the calculation: + uchar* ptr = image.data + x_left + imagecols * y_top; + // first the corners: + ret_val = A * int(*ptr); + ptr += dx + 1; + ret_val += B * int(*ptr); + ptr += dy * imagecols + 1; + ret_val += C * int(*ptr); + ptr -= dx + 1; + ret_val += D * int(*ptr); + + // next the edges: + int* ptr_integral = (int*) integral.data + x_left + integralcols * y_top + 1; + // find a simple path through the different surface corners + const int tmp1 = (*ptr_integral); + ptr_integral += dx; + const int tmp2 = (*ptr_integral); + ptr_integral += integralcols; + const int tmp3 = (*ptr_integral); + ptr_integral++; + const int tmp4 = (*ptr_integral); + ptr_integral += dy * integralcols; + const int tmp5 = (*ptr_integral); + ptr_integral--; + const int tmp6 = (*ptr_integral); + ptr_integral += integralcols; + const int tmp7 = (*ptr_integral); + ptr_integral -= dx; + const int tmp8 = (*ptr_integral); + ptr_integral -= integralcols; + const int tmp9 = (*ptr_integral); + ptr_integral--; + const int tmp10 = (*ptr_integral); + ptr_integral -= dy * integralcols; + const int tmp11 = (*ptr_integral); + ptr_integral++; + const int tmp12 = (*ptr_integral); + + // assign the weighted surface integrals: + const int upper = (tmp3 - tmp2 + tmp1 - tmp12) * r_y_1_i; + const int middle = (tmp6 - tmp3 + tmp12 - tmp9) * scaling; + const int left = (tmp9 - tmp12 + tmp11 - tmp10) * r_x_1_i; + const int right = (tmp5 - tmp4 + tmp3 - tmp6) * r_x1_i; + const int bottom = (tmp7 - tmp6 + tmp9 - tmp8) * r_y1_i; + + return (ret_val + upper + middle + left + right + bottom + scaling2 / 2) / scaling2; + } + + // now the calculation: + uchar* ptr = image.data + x_left + imagecols * y_top; + // first row: + ret_val = A * int(*ptr); + ptr++; + const uchar* end1 = ptr + dx; + for (; ptr < end1; ptr++) + { + ret_val += r_y_1_i * int(*ptr); + } + ret_val += B * int(*ptr); + // middle ones: + ptr += imagecols - dx - 1; + uchar* end_j = ptr + dy * imagecols; + for (; ptr < end_j; ptr += imagecols - dx - 1) + { + ret_val += r_x_1_i * int(*ptr); + ptr++; + const uchar* end2 = ptr + dx; + for (; ptr < end2; ptr++) + { + ret_val += int(*ptr) * scaling; + } + ret_val += r_x1_i * int(*ptr); + } + // last row: + ret_val += D * int(*ptr); + ptr++; + const uchar* end3 = ptr + dx; + for (; ptr < end3; ptr++) + { + ret_val += r_y1_i * int(*ptr); + } + ret_val += C * int(*ptr); + + return (ret_val + scaling2 / 2) / scaling2; +} + +inline bool +RoiPredicate(const float minX, const float minY, const float maxX, const float maxY, const KeyPoint& keyPt) +{ + const Point2f& pt = keyPt.pt; + return (pt.x < minX) || (pt.x >= maxX) || (pt.y < minY) || (pt.y >= maxY); +} + +// computes the descriptor +void +BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoints, + OutputArray _descriptors, bool useProvidedKeypoints) const +{ + Mat image = _image.getMat(), mask = _mask.getMat(); + if (!useProvidedKeypoints) + detectImpl(image, keypoints, mask); + + //Remove keypoints very close to the border + size_t ksize = keypoints.size(); + std::vector kscales; // remember the scale per keypoint + kscales.resize(ksize); + static const float log2 = 0.693147180559945; + static const float lb_scalerange = log(scalerange_) / (log2); + std::vector::iterator beginning = keypoints.begin(); + std::vector::iterator beginningkscales = kscales.begin(); + static const float basicSize06 = basicSize_ * 0.6; + for (size_t k = 0; k < ksize; k++) + { + unsigned int scale; + scale = std::max((int) (scales_ / lb_scalerange * (log(keypoints[k].size / (basicSize06)) / log2) + 0.5), 0); + // saturate + if (scale >= scales_) + scale = scales_ - 1; + kscales[k] = scale; + const int border = sizeList_[scale]; + const int border_x = image.cols - border; + const int border_y = image.rows - border; + if (RoiPredicate(border, border, border_x, border_y, keypoints[k])) + { + keypoints.erase(beginning + k); + kscales.erase(beginningkscales + k); + if (k == 0) + { + beginning = keypoints.begin(); + beginningkscales = kscales.begin(); + } + ksize--; + k--; + } + } + + // first, calculate the integral image over the whole image: + // current integral image + cv::Mat _integral; // the integral image + cv::integral(image, _integral); + + int* _values = new int[points_]; // for temporary use + + // resize the descriptors: + _descriptors.create(ksize, strings_, CV_8U); + cv::Mat descriptors = _descriptors.getMat(); + descriptors.setTo(0); + + // now do the extraction for all keypoints: + + // temporary variables containing gray values at sample points: + int t1; + int t2; + + // the feature orientation + uchar* ptr = descriptors.data; + for (size_t k = 0; k < ksize; k++) + { + int theta; + cv::KeyPoint& kp = keypoints[k]; + const int& scale = kscales[k]; + int shifter = 0; + int* pvalues = _values; + const float& x = kp.pt.x; + const float& y = kp.pt.y; + if (kp.angle==-1) + { + // don't compute the gradient direction, just assign a rotation of 0° + theta = 0; + } + else + { + theta = (int) (n_rot_ * (kp.angle / (360.0)) + 0.5); + if (theta < 0) + theta += n_rot_; + if (theta >= int(n_rot_)) + theta -= n_rot_; + } + + // now also extract the stuff for the actual direction: + // let us compute the smoothed values + shifter = 0; + + //unsigned int mean=0; + pvalues = _values; + // get the gray values in the rotated pattern + for (unsigned int i = 0; i < points_; i++) + { + *(pvalues++) = smoothedIntensity(image, _integral, x, y, scale, theta, i); + } + + // now iterate through all the pairings + unsigned int* ptr2 = (unsigned int*) ptr; + const BriskShortPair* max = shortPairs_ + noShortPairs_; + for (BriskShortPair* iter = shortPairs_; iter < max; ++iter) + { + t1 = *(_values + iter->i); + t2 = *(_values + iter->j); + if (t1 > t2) + { + *ptr2 |= ((1) << shifter); + + } // else already initialized with zero + // take care of the iterators: + ++shifter; + if (shifter == 32) + { + shifter = 0; + ++ptr2; + } + } + + ptr += strings_; + } + + // clean-up + _integral.release(); + delete[] _values; +} + +int +BRISK::descriptorSize() const +{ + return strings_; +} + +int +BRISK::descriptorType() const +{ + return CV_8U; +} + +BRISK::~BRISK() +{ + delete[] patternPoints_; + delete[] shortPairs_; + delete[] longPairs_; + delete[] scaleList_; + delete[] sizeList_; +} + +void +BRISK::operator()(InputArray _image, InputArray _mask, vector& keypoints) const +{ + Mat image = _image.getMat(), mask = _mask.getMat(); + if( image.type() != CV_8UC1 ) + cvtColor(_image, image, CV_BGR2GRAY); + + BriskScaleSpace briskScaleSpace(octaves); + briskScaleSpace.constructPyramid(image); + briskScaleSpace.getKeypoints(threshold, keypoints); + + // remove invalid points + removeInvalidPoints(mask, keypoints); + + // Compute the orientations of the keypoints + //Remove keypoints very close to the border + size_t ksize = keypoints.size(); + std::vector kscales; // remember the scale per keypoint + kscales.resize(ksize); + static const float log2 = 0.693147180559945; + static const float lb_scalerange = log(scalerange_) / (log2); + std::vector::iterator beginning = keypoints.begin(); + std::vector::iterator beginningkscales = kscales.begin(); + static const float basicSize06 = basicSize_ * 0.6; + for (size_t k = 0; k < ksize; k++) + { + unsigned int scale; + scale = std::max((int) (scales_ / lb_scalerange * (log(keypoints[k].size / (basicSize06)) / log2) + 0.5), 0); + // saturate + if (scale >= scales_) + scale = scales_ - 1; + kscales[k] = scale; + const int border = sizeList_[scale]; + const int border_x = image.cols - border; + const int border_y = image.rows - border; + if (RoiPredicate(border, border, border_x, border_y, keypoints[k])) + { + keypoints.erase(beginning + k); + kscales.erase(beginningkscales + k); + if (k == 0) + { + beginning = keypoints.begin(); + beginningkscales = kscales.begin(); + } + ksize--; + k--; + } + } + + // first, calculate the integral image over the whole image: + // current integral image + cv::Mat _integral; // the integral image + cv::integral(image, _integral); + + int* _values = new int[points_]; // for temporary use + + // now do the extraction for all keypoints: + + // temporary variables containing gray values at sample points: + int t1; + int t2; + + // the feature orientation + int direction0; + int direction1; + + for (size_t k = 0; k < ksize; k++) + { + cv::KeyPoint& kp = keypoints[k]; + const int& scale = kscales[k]; + int* pvalues = _values; + const float& x = kp.pt.x; + const float& y = kp.pt.y; + // get the gray values in the unrotated pattern + for (unsigned int i = 0; i < points_; i++) + { + *(pvalues++) = smoothedIntensity(image, _integral, x, y, scale, 0, i); + } + + direction0 = 0; + direction1 = 0; + // now iterate through the long pairings + const BriskLongPair* max = longPairs_ + noLongPairs_; + for (BriskLongPair* iter = longPairs_; iter < max; ++iter) + { + t1 = *(_values + iter->i); + t2 = *(_values + iter->j); + const int delta_t = (t1 - t2); + // update the direction: + const int tmp0 = delta_t * (iter->weighted_dx) / 1024; + const int tmp1 = delta_t * (iter->weighted_dy) / 1024; + direction0 += tmp0; + direction1 += tmp1; + } + kp.angle = atan2((float) direction1, (float) direction0) / M_PI * 180.0; + if (kp.angle < 0) + kp.angle += 360; + } +} + + +void +BRISK::detectImpl( const Mat& image, vector& keypoints, const Mat& mask) const +{ + (*this)(image, mask, keypoints); +} + +void +BRISK::computeImpl( const Mat& image, vector& keypoints, Mat& descriptors) const +{ + (*this)(image, Mat(), keypoints, descriptors, true); +} + +// construct telling the octaves number: +BriskScaleSpace::BriskScaleSpace(uint8_t _octaves) +{ + if (_octaves == 0) + layers_ = 1; + else + layers_ = 2 * _octaves; +} +BriskScaleSpace::~BriskScaleSpace() +{ + +} +// construct the image pyramids +void +BriskScaleSpace::constructPyramid(const cv::Mat& image) +{ + + // set correct size: + pyramid_.clear(); + + // fill the pyramid: + pyramid_.push_back(BriskLayer(image.clone())); + if (layers_ > 1) + { + pyramid_.push_back(BriskLayer(pyramid_.back(), BriskLayer::CommonParams::TWOTHIRDSAMPLE)); + } + const int octaves2 = layers_; + + for (uint8_t i = 2; i < octaves2; i += 2) + { + pyramid_.push_back(BriskLayer(pyramid_[i - 2], BriskLayer::CommonParams::HALFSAMPLE)); + pyramid_.push_back(BriskLayer(pyramid_[i - 1], BriskLayer::CommonParams::HALFSAMPLE)); + } +} + +void +BriskScaleSpace::getKeypoints(const uint8_t _threshold, std::vector& keypoints) +{ + // make sure keypoints is empty + keypoints.resize(0); + keypoints.reserve(2000); + + // assign thresholds + uint8_t threshold_ = _threshold; + uint8_t safeThreshold_ = threshold_ * safetyFactor_; + std::vector > agastPoints; + agastPoints.resize(layers_); + + // go through the octaves and intra layers and calculate fast corner scores: + for (uint8_t i = 0; i < layers_; i++) + { + // call OAST16_9 without nms + BriskLayer& l = pyramid_[i]; + l.getAgastPoints(safeThreshold_, agastPoints[i]); + } + + if (layers_ == 1) + { + // just do a simple 2d subpixel refinement... + const int num = agastPoints[0].size(); + for (int n = 0; n < num; n++) + { + const cv::Point2f& point = agastPoints.at(0)[n].pt; + // first check if it is a maximum: + if (!isMax2D(0, point.x, point.y)) + continue; + + // let's do the subpixel and float scale refinement: + BriskLayer& l = pyramid_[0]; + register int s_0_0 = l.getAgastScore(point.x - 1, point.y - 1, 1); + register int s_1_0 = l.getAgastScore(point.x, point.y - 1, 1); + register int s_2_0 = l.getAgastScore(point.x + 1, point.y - 1, 1); + register int s_2_1 = l.getAgastScore(point.x + 1, point.y, 1); + register int s_1_1 = l.getAgastScore(point.x, point.y, 1); + register int s_0_1 = l.getAgastScore(point.x - 1, point.y, 1); + register int s_0_2 = l.getAgastScore(point.x - 1, point.y + 1, 1); + register int s_1_2 = l.getAgastScore(point.x, point.y + 1, 1); + register int s_2_2 = l.getAgastScore(point.x + 1, point.y + 1, 1); + float delta_x, delta_y; + float max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x, delta_y); + + // store: + keypoints.push_back(cv::KeyPoint(float(point.x) + delta_x, float(point.y) + delta_y, basicSize_, -1, max, 0)); + + } + + return; + } + + float x, y, scale, score; + for (uint8_t i = 0; i < layers_; i++) + { + BriskLayer& l = pyramid_[i]; + const int num = agastPoints[i].size(); + if (i == layers_ - 1) + { + for (int n = 0; n < num; n++) + { + const cv::Point2f& point = agastPoints.at(i)[n].pt; + // consider only 2D maxima... + if (!isMax2D(i, point.x, point.y)) + continue; + + bool ismax; + float dx, dy; + getScoreMaxBelow(i, point.x, point.y, l.getAgastScore(point.x, point.y, safeThreshold_), ismax, dx, dy); + if (!ismax) + continue; + + // get the patch on this layer: + register int s_0_0 = l.getAgastScore(point.x - 1, point.y - 1, 1); + register int s_1_0 = l.getAgastScore(point.x, point.y - 1, 1); + register int s_2_0 = l.getAgastScore(point.x + 1, point.y - 1, 1); + register int s_2_1 = l.getAgastScore(point.x + 1, point.y, 1); + register int s_1_1 = l.getAgastScore(point.x, point.y, 1); + register int s_0_1 = l.getAgastScore(point.x - 1, point.y, 1); + register int s_0_2 = l.getAgastScore(point.x - 1, point.y + 1, 1); + register int s_1_2 = l.getAgastScore(point.x, point.y + 1, 1); + register int s_2_2 = l.getAgastScore(point.x + 1, point.y + 1, 1); + float delta_x, delta_y; + float max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x, delta_y); + + // store: + keypoints.push_back( + cv::KeyPoint((float(point.x) + delta_x) * l.scale() + l.offset(), + (float(point.y) + delta_y) * l.scale() + l.offset(), basicSize_ * l.scale(), -1, max, i)); + } + } + else + { + // not the last layer: + for (int n = 0; n < num; n++) + { + const cv::Point2f& point = agastPoints.at(i)[n].pt; + + // first check if it is a maximum: + if (!isMax2D(i, point.x, point.y)) + continue; + + // let's do the subpixel and float scale refinement: + bool ismax; + score = refine3D(i, point.x, point.y, x, y, scale, ismax); + if (!ismax) + { + continue; + } + + // finally store the detected keypoint: + if (score > float(threshold_)) + { + keypoints.push_back(cv::KeyPoint(x, y, basicSize_ * scale, -1, score, i)); + } + } + } + } +} + +// interpolated score access with recalculation when needed: +__inline__ int +BriskScaleSpace::getScoreAbove(const uint8_t layer, const int x_layer, const int y_layer) +{ + assert(layer delta; + // put together a list of 2d-offsets to where the maximum is also reached + if (center == s_1_1) + { + delta.push_back(-1); + delta.push_back(-1); + } + if (center == s0_1) + { + delta.push_back(0); + delta.push_back(-1); + } + if (center == s1_1) + { + delta.push_back(1); + delta.push_back(-1); + } + if (center == s_10) + { + delta.push_back(-1); + delta.push_back(0); + } + if (center == s10) + { + delta.push_back(1); + delta.push_back(0); + } + if (center == s_11) + { + delta.push_back(-1); + delta.push_back(1); + } + if (center == s01) + { + delta.push_back(0); + delta.push_back(1); + } + if (center == s11) + { + delta.push_back(1); + delta.push_back(1); + } + const unsigned int deltasize = delta.size(); + if (deltasize != 0) + { + // in this case, we have to analyze the situation more carefully: + // the values are gaussian blurred and then we really decide + data = scores.data + y_layer * scorescols + x_layer; + int smoothedcenter = 4 * center + 2 * (s_10 + s10 + s0_1 + s01) + s_1_1 + s1_1 + s_11 + s11; + for (unsigned int i = 0; i < deltasize; i += 2) + { + data = scores.data + (y_layer - 1 + delta[i + 1]) * scorescols + x_layer + delta[i] - 1; + int othercenter = *data; + data++; + othercenter += 2 * (*data); + data++; + othercenter += *data; + data += scorescols; + othercenter += 2 * (*data); + data--; + othercenter += 4 * (*data); + data--; + othercenter += 2 * (*data); + data += scorescols; + othercenter += *data; + data++; + othercenter += 2 * (*data); + data++; + othercenter += *data; + if (othercenter > smoothedcenter) + return false; + } + } + return true; +} + +// 3D maximum refinement centered around (x_layer,y_layer) +__inline__ float +BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, + bool& ismax) +{ + ismax = true; + BriskLayer& thisLayer = pyramid_[layer]; + const int center = thisLayer.getAgastScore(x_layer, y_layer, 1); + + // check and get above maximum: + float delta_x_above, delta_y_above; + float max_above = getScoreMaxAbove(layer, x_layer, y_layer, center, ismax, delta_x_above, delta_y_above); + + if (!ismax) + return 0.0; + + float max; // to be returned + + if (layer % 2 == 0) + { // on octave + // treat the patch below: + float delta_x_below, delta_y_below; + float max_below_float; + uchar max_below_uchar = 0; + if (layer == 0) + { + // guess the lower intra octave... + BriskLayer& l = pyramid_[0]; + register int s_0_0 = l.getAgastScore_5_8(x_layer - 1, y_layer - 1, 1); + max_below_uchar = s_0_0; + register int s_1_0 = l.getAgastScore_5_8(x_layer, y_layer - 1, 1); + if (s_1_0 > max_below_uchar) + max_below_uchar = s_1_0; + register int s_2_0 = l.getAgastScore_5_8(x_layer + 1, y_layer - 1, 1); + if (s_2_0 > max_below_uchar) + max_below_uchar = s_2_0; + register int s_2_1 = l.getAgastScore_5_8(x_layer + 1, y_layer, 1); + if (s_2_1 > max_below_uchar) + max_below_uchar = s_2_1; + register int s_1_1 = l.getAgastScore_5_8(x_layer, y_layer, 1); + if (s_1_1 > max_below_uchar) + max_below_uchar = s_1_1; + register int s_0_1 = l.getAgastScore_5_8(x_layer - 1, y_layer, 1); + if (s_0_1 > max_below_uchar) + max_below_uchar = s_0_1; + register int s_0_2 = l.getAgastScore_5_8(x_layer - 1, y_layer + 1, 1); + if (s_0_2 > max_below_uchar) + max_below_uchar = s_0_2; + register int s_1_2 = l.getAgastScore_5_8(x_layer, y_layer + 1, 1); + if (s_1_2 > max_below_uchar) + max_below_uchar = s_1_2; + register int s_2_2 = l.getAgastScore_5_8(x_layer + 1, y_layer + 1, 1); + if (s_2_2 > max_below_uchar) + max_below_uchar = s_2_2; + + max_below_float = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_below, + delta_y_below); + max_below_float = max_below_uchar; + } + else + { + max_below_float = getScoreMaxBelow(layer, x_layer, y_layer, center, ismax, delta_x_below, delta_y_below); + if (!ismax) + return 0; + } + + // get the patch on this layer: + register int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); + register int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); + register int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); + register int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); + register int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); + register int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); + register int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); + register int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); + register int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); + float delta_x_layer, delta_y_layer; + float max_layer = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_layer, + delta_y_layer); + + // calculate the relative scale (1D maximum): + if (layer == 0) + { + scale = refine1D_2(max_below_float, std::max(float(center), max_layer), max_above, max); + } + else + scale = refine1D(max_below_float, std::max(float(center), max_layer), max_above, max); + + if (scale > 1.0) + { + // interpolate the position: + const float r0 = (1.5 - scale) / .5; + const float r1 = 1.0 - r0; + x = (r0 * delta_x_layer + r1 * delta_x_above + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); + y = (r0 * delta_y_layer + r1 * delta_y_above + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); + } + else + { + if (layer == 0) + { + // interpolate the position: + const float r0 = (scale - 0.5) / 0.5; + const float r_1 = 1.0 - r0; + x = r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer); + y = r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer); + } + else + { + // interpolate the position: + const float r0 = (scale - 0.75) / 0.25; + const float r_1 = 1.0 - r0; + x = (r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); + y = (r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); + } + } + } + else + { + // on intra + // check the patch below: + float delta_x_below, delta_y_below; + float max_below = getScoreMaxBelow(layer, x_layer, y_layer, center, ismax, delta_x_below, delta_y_below); + if (!ismax) + return 0.0; + + // get the patch on this layer: + register int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); + register int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); + register int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); + register int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); + register int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); + register int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); + register int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); + register int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); + register int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); + float delta_x_layer, delta_y_layer; + float max_layer = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_layer, + delta_y_layer); + + // calculate the relative scale (1D maximum): + scale = refine1D_1(max_below, std::max(float(center), max_layer), max_above, max); + if (scale > 1.0) + { + // interpolate the position: + const float r0 = 4.0 - scale * 3.0; + const float r1 = 1.0 - r0; + x = (r0 * delta_x_layer + r1 * delta_x_above + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); + y = (r0 * delta_y_layer + r1 * delta_y_above + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); + } + else + { + // interpolate the position: + const float r0 = scale * 3.0 - 2.0; + const float r_1 = 1.0 - r0; + x = (r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); + y = (r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); + } + } + + // calculate the absolute scale: + scale *= thisLayer.scale(); + + // that's it, return the refined maximum: + return max; +} + +// return the maximum of score patches above or below +__inline__ float +BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, + bool& ismax, float& dx, float& dy) +{ + + ismax = false; + // relevant floating point coordinates + float x_1; + float x1; + float y_1; + float y1; + + // the layer above + assert(layer+1 threshold) + return 0; + for (int x = x_1 + 1; x <= int(x1); x++) + { + tmp_max = layerAbove.getAgastScore(float(x), y_1, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + } + } + tmp_max = layerAbove.getAgastScore(x1, y_1, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + } + + // middle rows + for (int y = y_1 + 1; y <= int(y1); y++) + { + tmp_max = layerAbove.getAgastScore(x_1, float(y), 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x_1 + 1); + max_y = y; + } + for (int x = x_1 + 1; x <= int(x1); x++) + { + tmp_max = layerAbove.getAgastScore(x, y, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + max_y = y; + } + } + tmp_max = layerAbove.getAgastScore(x1, float(y), 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + max_y = y; + } + } + + // bottom row + tmp_max = layerAbove.getAgastScore(x_1, y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x_1 + 1); + max_y = int(y1); + } + for (int x = x_1 + 1; x <= int(x1); x++) + { + tmp_max = layerAbove.getAgastScore(float(x), y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + max_y = int(y1); + } + } + tmp_max = layerAbove.getAgastScore(x1, y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + max_y = int(y1); + } + + //find dx/dy: + register int s_0_0 = layerAbove.getAgastScore(max_x - 1, max_y - 1, 1); + register int s_1_0 = layerAbove.getAgastScore(max_x, max_y - 1, 1); + register int s_2_0 = layerAbove.getAgastScore(max_x + 1, max_y - 1, 1); + register int s_2_1 = layerAbove.getAgastScore(max_x + 1, max_y, 1); + register int s_1_1 = layerAbove.getAgastScore(max_x, max_y, 1); + register int s_0_1 = layerAbove.getAgastScore(max_x - 1, max_y, 1); + register int s_0_2 = layerAbove.getAgastScore(max_x - 1, max_y + 1, 1); + register int s_1_2 = layerAbove.getAgastScore(max_x, max_y + 1, 1); + register int s_2_2 = layerAbove.getAgastScore(max_x + 1, max_y + 1, 1); + float dx_1, dy_1; + float refined_max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, dx_1, dy_1); + + // calculate dx/dy in above coordinates + float real_x = float(max_x) + dx_1; + float real_y = float(max_y) + dy_1; + bool returnrefined = true; + if (layer % 2 == 0) + { + dx = (real_x * 6.0f + 1.0f) / 4.0f - float(x_layer); + dy = (real_y * 6.0f + 1.0f) / 4.0f - float(y_layer); + } + else + { + dx = (real_x * 8.0 + 1.0) / 6.0 - float(x_layer); + dy = (real_y * 8.0 + 1.0) / 6.0 - float(y_layer); + } + + // saturate + if (dx > 1.0f) + { + dx = 1.0f; + returnrefined = false; + } + if (dx < -1.0f) + { + dx = -1.0f; + returnrefined = false; + } + if (dy > 1.0f) + { + dy = 1.0f; + returnrefined = false; + } + if (dy < -1.0f) + { + dy = -1.0f; + returnrefined = false; + } + + // done and ok. + ismax = true; + if (returnrefined) + { + return std::max(refined_max, max); + } + return max; +} + +__inline__ float +BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, + bool& ismax, float& dx, float& dy) +{ + ismax = false; + + // relevant floating point coordinates + float x_1; + float x1; + float y_1; + float y1; + + if (layer % 2 == 0) + { + // octave + x_1 = float(8 * (x_layer) + 1 - 4) / 6.0; + x1 = float(8 * (x_layer) + 1 + 4) / 6.0; + y_1 = float(8 * (y_layer) + 1 - 4) / 6.0; + y1 = float(8 * (y_layer) + 1 + 4) / 6.0; + } + else + { + x_1 = float(6 * (x_layer) + 1 - 3) / 4.0; + x1 = float(6 * (x_layer) + 1 + 3) / 4.0; + y_1 = float(6 * (y_layer) + 1 - 3) / 4.0; + y1 = float(6 * (y_layer) + 1 + 3) / 4.0; + } + + // the layer below + assert(layer>0); + BriskLayer& layerBelow = pyramid_[layer - 1]; + + // check the first row + int max_x = x_1 + 1; + int max_y = y_1 + 1; + float tmp_max; + float max = layerBelow.getAgastScore(x_1, y_1, 1); + if (max > threshold) + return 0; + for (int x = x_1 + 1; x <= int(x1); x++) + { + tmp_max = layerBelow.getAgastScore(float(x), y_1, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + } + } + tmp_max = layerBelow.getAgastScore(x1, y_1, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + } + + // middle rows + for (int y = y_1 + 1; y <= int(y1); y++) + { + tmp_max = layerBelow.getAgastScore(x_1, float(y), 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x_1 + 1); + max_y = y; + } + for (int x = x_1 + 1; x <= int(x1); x++) + { + tmp_max = layerBelow.getAgastScore(x, y, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max == max) + { + const int t1 = 2 + * (layerBelow.getAgastScore(x - 1, y, 1) + layerBelow.getAgastScore(x + 1, y, 1) + + layerBelow.getAgastScore(x, y + 1, 1) + layerBelow.getAgastScore(x, y - 1, 1)) + + (layerBelow.getAgastScore(x + 1, y + 1, 1) + layerBelow.getAgastScore(x - 1, y + 1, 1) + + layerBelow.getAgastScore(x + 1, y - 1, 1) + layerBelow.getAgastScore(x - 1, y - 1, 1)); + const int t2 = 2 + * (layerBelow.getAgastScore(max_x - 1, max_y, 1) + layerBelow.getAgastScore(max_x + 1, max_y, 1) + + layerBelow.getAgastScore(max_x, max_y + 1, 1) + layerBelow.getAgastScore(max_x, max_y - 1, 1)) + + (layerBelow.getAgastScore(max_x + 1, max_y + 1, 1) + layerBelow.getAgastScore(max_x - 1, + max_y + 1, 1) + + layerBelow.getAgastScore(max_x + 1, max_y - 1, 1) + + layerBelow.getAgastScore(max_x - 1, max_y - 1, 1)); + if (t1 > t2) + { + max_x = x; + max_y = y; + } + } + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + max_y = y; + } + } + tmp_max = layerBelow.getAgastScore(x1, float(y), 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + max_y = y; + } + } + + // bottom row + tmp_max = layerBelow.getAgastScore(x_1, y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x_1 + 1); + max_y = int(y1); + } + for (int x = x_1 + 1; x <= int(x1); x++) + { + tmp_max = layerBelow.getAgastScore(float(x), y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + max_y = int(y1); + } + } + tmp_max = layerBelow.getAgastScore(x1, y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + max_y = int(y1); + } + + //find dx/dy: + register int s_0_0 = layerBelow.getAgastScore(max_x - 1, max_y - 1, 1); + register int s_1_0 = layerBelow.getAgastScore(max_x, max_y - 1, 1); + register int s_2_0 = layerBelow.getAgastScore(max_x + 1, max_y - 1, 1); + register int s_2_1 = layerBelow.getAgastScore(max_x + 1, max_y, 1); + register int s_1_1 = layerBelow.getAgastScore(max_x, max_y, 1); + register int s_0_1 = layerBelow.getAgastScore(max_x - 1, max_y, 1); + register int s_0_2 = layerBelow.getAgastScore(max_x - 1, max_y + 1, 1); + register int s_1_2 = layerBelow.getAgastScore(max_x, max_y + 1, 1); + register int s_2_2 = layerBelow.getAgastScore(max_x + 1, max_y + 1, 1); + float dx_1, dy_1; + float refined_max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, dx_1, dy_1); + + // calculate dx/dy in above coordinates + float real_x = float(max_x) + dx_1; + float real_y = float(max_y) + dy_1; + bool returnrefined = true; + if (layer % 2 == 0) + { + dx = (real_x * 6.0 + 1.0) / 8.0 - float(x_layer); + dy = (real_y * 6.0 + 1.0) / 8.0 - float(y_layer); + } + else + { + dx = (real_x * 4.0 - 1.0) / 6.0 - float(x_layer); + dy = (real_y * 4.0 - 1.0) / 6.0 - float(y_layer); + } + + // saturate + if (dx > 1.0) + { + dx = 1.0; + returnrefined = false; + } + if (dx < -1.0) + { + dx = -1.0; + returnrefined = false; + } + if (dy > 1.0) + { + dy = 1.0; + returnrefined = false; + } + if (dy < -1.0) + { + dy = -1.0; + returnrefined = false; + } + + // done and ok. + ismax = true; + if (returnrefined) + { + return std::max(refined_max, max); + } + return max; +} + +__inline__ float +BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, float& max) +{ + int i_05 = int(1024.0 * s_05 + 0.5); + int i0 = int(1024.0 * s0 + 0.5); + int i05 = int(1024.0 * s05 + 0.5); + + // 16.0000 -24.0000 8.0000 + // -40.0000 54.0000 -14.0000 + // 24.0000 -27.0000 6.0000 + + int three_a = 16 * i_05 - 24 * i0 + 8 * i05; + // second derivative must be negative: + if (three_a >= 0) + { + if (s0 >= s_05 && s0 >= s05) + { + max = s0; + return 1.0; + } + if (s_05 >= s0 && s_05 >= s05) + { + max = s_05; + return 0.75; + } + if (s05 >= s0 && s05 >= s_05) + { + max = s05; + return 1.5; + } + } + + int three_b = -40 * i_05 + 54 * i0 - 14 * i05; + // calculate max location: + float ret_val = -float(three_b) / float(2 * three_a); + // saturate and return + if (ret_val < 0.75) + ret_val = 0.75; + else if (ret_val > 1.5) + ret_val = 1.5; // allow to be slightly off bounds ...? + int three_c = +24 * i_05 - 27 * i0 + 6 * i05; + max = float(three_c) + float(three_a) * ret_val * ret_val + float(three_b) * ret_val; + max /= 3072.0; + return ret_val; +} + +__inline__ float +BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, float& max) +{ + int i_05 = int(1024.0 * s_05 + 0.5); + int i0 = int(1024.0 * s0 + 0.5); + int i05 = int(1024.0 * s05 + 0.5); + + // 4.5000 -9.0000 4.5000 + //-10.5000 18.0000 -7.5000 + // 6.0000 -8.0000 3.0000 + + int two_a = 9 * i_05 - 18 * i0 + 9 * i05; + // second derivative must be negative: + if (two_a >= 0) + { + if (s0 >= s_05 && s0 >= s05) + { + max = s0; + return 1.0; + } + if (s_05 >= s0 && s_05 >= s05) + { + max = s_05; + return 0.6666666666666666666666666667; + } + if (s05 >= s0 && s05 >= s_05) + { + max = s05; + return 1.3333333333333333333333333333; + } + } + + int two_b = -21 * i_05 + 36 * i0 - 15 * i05; + // calculate max location: + float ret_val = -float(two_b) / float(2 * two_a); + // saturate and return + if (ret_val < 0.6666666666666666666666666667) + ret_val = 0.666666666666666666666666667; + else if (ret_val > 1.33333333333333333333333333) + ret_val = 1.333333333333333333333333333; + int two_c = +12 * i_05 - 16 * i0 + 6 * i05; + max = float(two_c) + float(two_a) * ret_val * ret_val + float(two_b) * ret_val; + max /= 2048.0; + return ret_val; +} + +__inline__ float +BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, float& max) +{ + int i_05 = int(1024.0 * s_05 + 0.5); + int i0 = int(1024.0 * s0 + 0.5); + int i05 = int(1024.0 * s05 + 0.5); + + // 18.0000 -30.0000 12.0000 + // -45.0000 65.0000 -20.0000 + // 27.0000 -30.0000 8.0000 + + int a = 2 * i_05 - 4 * i0 + 2 * i05; + // second derivative must be negative: + if (a >= 0) + { + if (s0 >= s_05 && s0 >= s05) + { + max = s0; + return 1.0; + } + if (s_05 >= s0 && s_05 >= s05) + { + max = s_05; + return 0.7; + } + if (s05 >= s0 && s05 >= s_05) + { + max = s05; + return 1.5; + } + } + + int b = -5 * i_05 + 8 * i0 - 3 * i05; + // calculate max location: + float ret_val = -float(b) / float(2 * a); + // saturate and return + if (ret_val < 0.7) + ret_val = 0.7; + else if (ret_val > 1.5) + ret_val = 1.5; // allow to be slightly off bounds ...? + int c = +3 * i_05 - 3 * i0 + 1 * i05; + max = float(c) + float(a) * ret_val * ret_val + float(b) * ret_val; + max /= 1024; + return ret_val; +} + +__inline__ float +BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, const int s_1_0, const int s_1_1, + const int s_1_2, const int s_2_0, const int s_2_1, const int s_2_2, float& delta_x, + float& delta_y) +{ + + // the coefficients of the 2d quadratic function least-squares fit: + register int tmp1 = s_0_0 + s_0_2 - 2 * s_1_1 + s_2_0 + s_2_2; + register int coeff1 = 3 * (tmp1 + s_0_1 - ((s_1_0 + s_1_2) << 1) + s_2_1); + register int coeff2 = 3 * (tmp1 - ((s_0_1 + s_2_1) << 1) + s_1_0 + s_1_2); + register int tmp2 = s_0_2 - s_2_0; + register int tmp3 = (s_0_0 + tmp2 - s_2_2); + register int tmp4 = tmp3 - 2 * tmp2; + register int coeff3 = -3 * (tmp3 + s_0_1 - s_2_1); + register int coeff4 = -3 * (tmp4 + s_1_0 - s_1_2); + register int coeff5 = (s_0_0 - s_0_2 - s_2_0 + s_2_2) << 2; + register int coeff6 = -(s_0_0 + s_0_2 - ((s_1_0 + s_0_1 + s_1_2 + s_2_1) << 1) - 5 * s_1_1 + s_2_0 + s_2_2) << 1; + + // 2nd derivative test: + register int H_det = 4 * coeff1 * coeff2 - coeff5 * coeff5; + + if (H_det == 0) + { + delta_x = 0.0; + delta_y = 0.0; + return float(coeff6) / 18.0; + } + + if (!(H_det > 0 && coeff1 < 0)) + { + // The maximum must be at the one of the 4 patch corners. + int tmp_max = coeff3 + coeff4 + coeff5; + delta_x = 1.0; + delta_y = 1.0; + + int tmp = -coeff3 + coeff4 - coeff5; + if (tmp > tmp_max) + { + tmp_max = tmp; + delta_x = -1.0; + delta_y = 1.0; + } + tmp = coeff3 - coeff4 - coeff5; + if (tmp > tmp_max) + { + tmp_max = tmp; + delta_x = 1.0; + delta_y = -1.0; + } + tmp = -coeff3 - coeff4 + coeff5; + if (tmp > tmp_max) + { + tmp_max = tmp; + delta_x = -1.0; + delta_y = -1.0; + } + return float(tmp_max + coeff1 + coeff2 + coeff6) / 18.0; + } + + // this is hopefully the normal outcome of the Hessian test + delta_x = float(2 * coeff2 * coeff3 - coeff4 * coeff5) / float(-H_det); + delta_y = float(2 * coeff1 * coeff4 - coeff3 * coeff5) / float(-H_det); + // TODO: this is not correct, but easy, so perform a real boundary maximum search: + bool tx = false; + bool tx_ = false; + bool ty = false; + bool ty_ = false; + if (delta_x > 1.0) + tx = true; + else if (delta_x < -1.0) + tx_ = true; + if (delta_y > 1.0) + ty = true; + if (delta_y < -1.0) + ty_ = true; + + if (tx || tx_ || ty || ty_) + { + // get two candidates: + float delta_x1 = 0.0, delta_x2 = 0.0, delta_y1 = 0.0, delta_y2 = 0.0; + if (tx) + { + delta_x1 = 1.0; + delta_y1 = -float(coeff4 + coeff5) / float(2 * coeff2); + if (delta_y1 > 1.0) + delta_y1 = 1.0; + else if (delta_y1 < -1.0) + delta_y1 = -1.0; + } + else if (tx_) + { + delta_x1 = -1.0; + delta_y1 = -float(coeff4 - coeff5) / float(2 * coeff2); + if (delta_y1 > 1.0) + delta_y1 = 1.0; + else if (delta_y1 < -1.0) + delta_y1 = -1.0; + } + if (ty) + { + delta_y2 = 1.0; + delta_x2 = -float(coeff3 + coeff5) / float(2 * coeff1); + if (delta_x2 > 1.0) + delta_x2 = 1.0; + else if (delta_x2 < -1.0) + delta_x2 = -1.0; + } + else if (ty_) + { + delta_y2 = -1.0; + delta_x2 = -float(coeff3 - coeff5) / float(2 * coeff1); + if (delta_x2 > 1.0) + delta_x2 = 1.0; + else if (delta_x2 < -1.0) + delta_x2 = -1.0; + } + // insert both options for evaluation which to pick + float max1 = (coeff1 * delta_x1 * delta_x1 + coeff2 * delta_y1 * delta_y1 + coeff3 * delta_x1 + coeff4 * delta_y1 + + coeff5 * delta_x1 * delta_y1 + coeff6) + / 18.0; + float max2 = (coeff1 * delta_x2 * delta_x2 + coeff2 * delta_y2 * delta_y2 + coeff3 * delta_x2 + coeff4 * delta_y2 + + coeff5 * delta_x2 * delta_y2 + coeff6) + / 18.0; + if (max1 > max2) + { + delta_x = delta_x1; + delta_y = delta_x1; + return max1; + } + else + { + delta_x = delta_x2; + delta_y = delta_x2; + return max2; + } + } + + // this is the case of the maximum inside the boundaries: + return (coeff1 * delta_x * delta_x + coeff2 * delta_y * delta_y + coeff3 * delta_x + coeff4 * delta_y + + coeff5 * delta_x * delta_y + coeff6) + / 18.0; +} + +// construct a layer +BriskLayer::BriskLayer(const cv::Mat& img_in, float scale_in, float offset_in) +{ + img_ = img_in; + scores_ = cv::Mat_::zeros(img_in.rows, img_in.cols); + // attention: this means that the passed image reference must point to persistent memory + scale_ = scale_in; + offset_ = offset_in; + // create an agast detector + fast_9_16_ = new FastFeatureDetector(1, true, FastFeatureDetector::TYPE_9_16); + makeOffsets(pixel_5_8_, img_.step, 8); + makeOffsets(pixel_9_16_, img_.step, 16); +} +// derive a layer +BriskLayer::BriskLayer(const BriskLayer& layer, int mode) +{ + if (mode == CommonParams::HALFSAMPLE) + { + img_.create(layer.img().rows / 2, layer.img().cols / 2, CV_8U); + halfsample(layer.img(), img_); + scale_ = layer.scale() * 2; + offset_ = 0.5 * scale_ - 0.5; + } + else + { + img_.create(2 * (layer.img().rows / 3), 2 * (layer.img().cols / 3), CV_8U); + twothirdsample(layer.img(), img_); + scale_ = layer.scale() * 1.5; + offset_ = 0.5 * scale_ - 0.5; + } + scores_ = cv::Mat::zeros(img_.rows, img_.cols, CV_8U); + fast_9_16_ = new FastFeatureDetector(1, false, FastFeatureDetector::TYPE_9_16); + makeOffsets(pixel_5_8_, img_.step, 8); + makeOffsets(pixel_9_16_, img_.step, 16); +} + +// Fast/Agast +// wraps the agast class +void +BriskLayer::getAgastPoints(uint8_t threshold, std::vector& keypoints) +{ + fast_9_16_->set("threshold", threshold); + fast_9_16_->detect(img_, keypoints); + + // also write scores + const int num = keypoints.size(); + + for (int i = 0; i < num; i++) + scores_(keypoints[i].pt.y, keypoints[i].pt.x) = keypoints[i].response; +} +inline uint8_t +BriskLayer::getAgastScore(int x, int y, uint8_t threshold) +{ + if (x < 3 || y < 3) + return 0; + if (x >= img_.cols - 3 || y >= img_.rows - 3) + return 0; + uint8_t& score = *(scores_.data + x + y * scores_.cols); + if (score > 2) + { + return score; + } + score = cornerScore<16>(img_.data + x + y * img_.cols, pixel_9_16_, threshold - 1); + if (score < threshold) + score = 0; + return score; +} + +inline uint8_t +BriskLayer::getAgastScore_5_8(int x, int y, uint8_t threshold) +{ + if (x < 2 || y < 2) + return 0; + if (x >= img_.cols - 2 || y >= img_.rows - 2) + return 0; + uint8_t score = cornerScore<8>(img_.data + x + y * img_.cols, pixel_5_8_, threshold - 1); + if (score < threshold) + score = 0; + return score; +} + +inline uint8_t +BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_in) +{ + if (scale_in <= 1.0f) + { + // just do an interpolation inside the layer + const int x = int(xf); + const float rx1 = xf - float(x); + const float rx = 1.0f - rx1; + const int y = int(yf); + const float ry1 = yf - float(y); + const float ry = 1.0f - ry1; + + return rx * ry * getAgastScore(x, y, threshold_in) + rx1 * ry * getAgastScore(x + 1, y, threshold_in) + + rx * ry1 * getAgastScore(x, y + 1, threshold_in) + rx1 * ry1 * getAgastScore(x + 1, y + 1, threshold_in); + } + else + { + // this means we overlap area smoothing + const float halfscale = scale_in / 2.0f; + // get the scores first: + for (int x = int(xf - halfscale); x <= int(xf + halfscale + 1.0f); x++) + { + for (int y = int(yf - halfscale); y <= int(yf + halfscale + 1.0f); y++) + { + getAgastScore(x, y, threshold_in); + } + } + // get the smoothed value + return value(scores_, xf, yf, scale_in); + } +} + +// access gray values (smoothed/interpolated) +__inline__ uint8_t +BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) +{ + assert(!mat.empty()); + // get the position + const int x = floor(xf); + const int y = floor(yf); + const cv::Mat& image = mat; + const int& imagecols = image.cols; + + // get the sigma_half: + const float sigma_half = scale_in / 2; + const float area = 4.0 * sigma_half * sigma_half; + // calculate output: + int ret_val; + if (sigma_half < 0.5) + { + //interpolation multipliers: + const int r_x = (xf - x) * 1024; + const int r_y = (yf - y) * 1024; + const int r_x_1 = (1024 - r_x); + const int r_y_1 = (1024 - r_y); + uchar* ptr = image.data + x + y * imagecols; + // just interpolate: + ret_val = (r_x_1 * r_y_1 * int(*ptr)); + ptr++; + ret_val += (r_x * r_y_1 * int(*ptr)); + ptr += imagecols; + ret_val += (r_x * r_y * int(*ptr)); + ptr--; + ret_val += (r_x_1 * r_y * int(*ptr)); + return 0xFF & ((ret_val + 512) / 1024 / 1024); + } + + // this is the standard case (simple, not speed optimized yet): + + // scaling: + const int scaling = 4194304.0 / area; + const int scaling2 = float(scaling) * area / 1024.0; + + // calculate borders + const float x_1 = xf - sigma_half; + const float x1 = xf + sigma_half; + const float y_1 = yf - sigma_half; + const float y1 = yf + sigma_half; + + const int x_left = int(x_1 + 0.5); + const int y_top = int(y_1 + 0.5); + const int x_right = int(x1 + 0.5); + const int y_bottom = int(y1 + 0.5); + + // overlap area - multiplication factors: + const float r_x_1 = float(x_left) - x_1 + 0.5; + const float r_y_1 = float(y_top) - y_1 + 0.5; + const float r_x1 = x1 - float(x_right) + 0.5; + const float r_y1 = y1 - float(y_bottom) + 0.5; + const int dx = x_right - x_left - 1; + const int dy = y_bottom - y_top - 1; + const int A = (r_x_1 * r_y_1) * scaling; + const int B = (r_x1 * r_y_1) * scaling; + const int C = (r_x1 * r_y1) * scaling; + const int D = (r_x_1 * r_y1) * scaling; + const int r_x_1_i = r_x_1 * scaling; + const int r_y_1_i = r_y_1 * scaling; + const int r_x1_i = r_x1 * scaling; + const int r_y1_i = r_y1 * scaling; + + // now the calculation: + uchar* ptr = image.data + x_left + imagecols * y_top; + // first row: + ret_val = A * int(*ptr); + ptr++; + const uchar* end1 = ptr + dx; + for (; ptr < end1; ptr++) + { + ret_val += r_y_1_i * int(*ptr); + } + ret_val += B * int(*ptr); + // middle ones: + ptr += imagecols - dx - 1; + uchar* end_j = ptr + dy * imagecols; + for (; ptr < end_j; ptr += imagecols - dx - 1) + { + ret_val += r_x_1_i * int(*ptr); + ptr++; + const uchar* end2 = ptr + dx; + for (; ptr < end2; ptr++) + { + ret_val += int(*ptr) * scaling; + } + ret_val += r_x1_i * int(*ptr); + } + // last row: + ret_val += D * int(*ptr); + ptr++; + const uchar* end3 = ptr + dx; + for (; ptr < end3; ptr++) + { + ret_val += r_y1_i * int(*ptr); + } + ret_val += C * int(*ptr); + + return 0xFF & ((ret_val + scaling2 / 2) / scaling2 / 1024); +} + +// half sampling +inline void +BriskLayer::halfsample(const cv::Mat& srcimg, cv::Mat& dstimg) +{ + // make sure the destination image is of the right size: + assert(srcimg.cols/2==dstimg.cols); + assert(srcimg.rows/2==dstimg.rows); + + // handle non-SSE case + resize(srcimg, dstimg, dstimg.size(), 0, 0, INTER_AREA); +} + +inline void +BriskLayer::twothirdsample(const cv::Mat& srcimg, cv::Mat& dstimg) +{ + // make sure the destination image is of the right size: + assert((srcimg.cols/3)*2==dstimg.cols); + assert((srcimg.rows/3)*2==dstimg.rows); + + resize(srcimg, dstimg, dstimg.size(), 0, 0, INTER_AREA); +} + +} diff --git a/modules/features2d/src/features2d_init.cpp b/modules/features2d/src/features2d_init.cpp index c9abfefa9..fa11b809c 100644 --- a/modules/features2d/src/features2d_init.cpp +++ b/modules/features2d/src/features2d_init.cpp @@ -51,6 +51,12 @@ using namespace cv; Otherwise, linker may throw away some seemingly unused stuff. */ +CV_INIT_ALGORITHM(BRISK, "Feature2D.BRISK", + obj.info()->addParam(obj, "thres", obj.threshold); + obj.info()->addParam(obj, "octaves", obj.octaves)); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////// + CV_INIT_ALGORITHM(BriefDescriptorExtractor, "Feature2D.BRIEF", obj.info()->addParam(obj, "bytes", obj.bytes_)); @@ -154,6 +160,7 @@ bool cv::initModule_features2d(void) { bool all = true; all &= !BriefDescriptorExtractor_info_auto.name().empty(); + all &= !BRISK_info_auto.name().empty(); all &= !FastFeatureDetector_info_auto.name().empty(); all &= !StarDetector_info_auto.name().empty(); all &= !MSER_info_auto.name().empty(); diff --git a/modules/features2d/test/test_brisk.cpp b/modules/features2d/test/test_brisk.cpp new file mode 100644 index 000000000..10e71802a --- /dev/null +++ b/modules/features2d/test/test_brisk.cpp @@ -0,0 +1,95 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "test_precomp.hpp" + +using namespace cv; + +class CV_BRISKTest : public cvtest::BaseTest +{ +public: + CV_BRISKTest(); + ~CV_BRISKTest(); +protected: + void run(int); +}; + +CV_BRISKTest::CV_BRISKTest() {} +CV_BRISKTest::~CV_BRISKTest() {} + +void CV_BRISKTest::run( int ) +{ + Mat image1 = imread(string(ts->get_data_path()) + "inpaint/orig.jpg"); + Mat image2 = imread(string(ts->get_data_path()) + "cameracalibration/chess9.jpg"); + + if (image1.empty() || image2.empty()) + { + ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_TEST_DATA ); + return; + } + + Mat gray1, gray2; + cvtColor(image1, gray1, CV_BGR2GRAY); + cvtColor(image2, gray2, CV_BGR2GRAY); + + Ptr detector = Algorithm::create("Feature2D.BRISK"); + + vector keypoints1; + vector keypoints2; + detector->detect(image1, keypoints1); + detector->detect(image2, keypoints2); + + for(size_t i = 0; i < keypoints1.size(); ++i) + { + const KeyPoint& kp = keypoints1[i]; + ASSERT_NE(kp.angle, -1); + } + + for(size_t i = 0; i < keypoints2.size(); ++i) + { + const KeyPoint& kp = keypoints2[i]; + ASSERT_NE(kp.angle, -1); + } +} + +TEST(Features2d_BRISK, regression) { CV_BRISKTest test; test.safe_run(); } + diff --git a/modules/features2d/test/test_descriptors_regression.cpp b/modules/features2d/test/test_descriptors_regression.cpp index b53ef57f7..2185625ae 100644 --- a/modules/features2d/test/test_descriptors_regression.cpp +++ b/modules/features2d/test/test_descriptors_regression.cpp @@ -301,6 +301,13 @@ private: * Tests registrations * \****************************************************************************************/ +TEST( Features2d_DescriptorExtractor_BRISK, regression ) +{ + CV_DescriptorExtractorTest test( "descriptor-brisk", (CV_DescriptorExtractorTest::DistanceType)2.f, + DescriptorExtractor::create("BRISK") ); + test.safe_run(); +} + TEST( Features2d_DescriptorExtractor_ORB, regression ) { // TODO adjust the parameters below diff --git a/modules/features2d/test/test_detectors_regression.cpp b/modules/features2d/test/test_detectors_regression.cpp index 0077f84cc..e5e8712ce 100644 --- a/modules/features2d/test/test_detectors_regression.cpp +++ b/modules/features2d/test/test_detectors_regression.cpp @@ -247,6 +247,12 @@ void CV_FeatureDetectorTest::run( int /*start_from*/ ) * Tests registrations * \****************************************************************************************/ +TEST( Features2d_Detector_BRISK, regression ) +{ + CV_FeatureDetectorTest test( "detector-brisk", FeatureDetector::create("BRISK") ); + test.safe_run(); +} + TEST( Features2d_Detector_FAST, regression ) { CV_FeatureDetectorTest test( "detector-fast", FeatureDetector::create("FAST") ); From b325b2f9a42568c1db6fd586ca5c2075103f0036 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Fri, 24 Aug 2012 02:31:37 +0200 Subject: [PATCH 046/103] add more test to BRISK --- modules/features2d/test/test_keypoints.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/features2d/test/test_keypoints.cpp b/modules/features2d/test/test_keypoints.cpp index c3f8c6fb5..b5d01a737 100644 --- a/modules/features2d/test/test_keypoints.cpp +++ b/modules/features2d/test/test_keypoints.cpp @@ -119,6 +119,12 @@ protected: // Registration of tests +TEST(Features2d_Detector_Keypoints_BRISK, validation) +{ + CV_FeatureDetectorKeypointsTest test(Algorithm::create("Feature2D.BRISK")); + test.safe_run(); +} + TEST(Features2d_Detector_Keypoints_FAST, validation) { CV_FeatureDetectorKeypointsTest test(Algorithm::create("Feature2D.FAST")); From 92da6d381bd069751c452cff7cc1890eae4670e9 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Fri, 24 Aug 2012 03:42:58 +0200 Subject: [PATCH 047/103] add rotation tests for the descriptors --- modules/features2d/src/brisk.cpp | 3 ++ .../test_rotation_and_scale_invariance.cpp | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/modules/features2d/src/brisk.cpp b/modules/features2d/src/brisk.cpp index 415ed7821..8d5fe0d2e 100755 --- a/modules/features2d/src/brisk.cpp +++ b/modules/features2d/src/brisk.cpp @@ -530,6 +530,9 @@ BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoi OutputArray _descriptors, bool useProvidedKeypoints) const { Mat image = _image.getMat(), mask = _mask.getMat(); + if( image.type() != CV_8UC1 ) + cvtColor(image, image, CV_BGR2GRAY); + if (!useProvidedKeypoints) detectImpl(image, keypoints, mask); diff --git a/modules/features2d/test/test_rotation_and_scale_invariance.cpp b/modules/features2d/test/test_rotation_and_scale_invariance.cpp index 48dddd3ee..ac3094663 100644 --- a/modules/features2d/test/test_rotation_and_scale_invariance.cpp +++ b/modules/features2d/test/test_rotation_and_scale_invariance.cpp @@ -592,6 +592,15 @@ protected: /* * Detector's rotation invariance check */ + +TEST(Features2d_RotationInvariance_Detector_BRISK, regression) +{ + DetectorRotationInvarianceTest test(Algorithm::create("Feature2D.BRISK"), + 0.32f, + 0.81f); + test.safe_run(); +} + TEST(Features2d_RotationInvariance_Detector_ORB, regression) { DetectorRotationInvarianceTest test(Algorithm::create("Feature2D.ORB"), @@ -603,6 +612,16 @@ TEST(Features2d_RotationInvariance_Detector_ORB, regression) /* * Descriptors's rotation invariance check */ + +TEST(Features2d_RotationInvariance_Descriptor_BRISK, regression) +{ + DescriptorRotationInvarianceTest test(Algorithm::create("Feature2D.BRISK"), + Algorithm::create("Feature2D.BRISK"), + NORM_HAMMING, + 0.99f); + test.safe_run(); +} + TEST(Features2d_RotationInvariance_Descriptor_ORB, regression) { DescriptorRotationInvarianceTest test(Algorithm::create("Feature2D.ORB"), @@ -625,6 +644,14 @@ TEST(Features2d_RotationInvariance_Descriptor_ORB, regression) * Detector's scale invariance check */ +//TEST(Features2d_ScaleInvariance_Detector_BRISK, regression) +//{ +// DetectorScaleInvarianceTest test(Algorithm::create("Feature2D.BRISK"), +// 0.09f, +// 0.52f); +// test.safe_run(); +//} + //TEST(Features2d_ScaleInvariance_Detector_ORB, regression) //{ // DetectorScaleInvarianceTest test(Algorithm::create("Feature2D.ORB"), @@ -637,6 +664,15 @@ TEST(Features2d_RotationInvariance_Descriptor_ORB, regression) * Descriptor's scale invariance check */ +//TEST(Features2d_ScaleInvariance_Descriptor_BRISK, regression) +//{ +// DescriptorScaleInvarianceTest test(Algorithm::create("Feature2D.BRISK"), +// Algorithm::create("Feature2D.BRISK"), +// NORM_HAMMING, +// 0.99f); +// test.safe_run(); +//} + //TEST(Features2d_ScaleInvariance_Descriptor_ORB, regression) //{ // DescriptorScaleInvarianceTest test(Algorithm::create("Feature2D.ORB"), From da1921b2fc727062049974a61537976e44c7037a Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Fri, 24 Aug 2012 04:03:06 +0200 Subject: [PATCH 048/103] add const correctness, replace __inline__ and remote a useless release() --- modules/features2d/src/brisk.cpp | 113 +++++++++++++++---------------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/modules/features2d/src/brisk.cpp b/modules/features2d/src/brisk.cpp index 8d5fe0d2e..537b8f797 100755 --- a/modules/features2d/src/brisk.cpp +++ b/modules/features2d/src/brisk.cpp @@ -74,11 +74,11 @@ public: // get scores - attention, this is in layer coordinates, not scale=1 coordinates! inline uint8_t - getAgastScore(int x, int y, uint8_t threshold); + getAgastScore(int x, int y, uint8_t threshold) const; inline uint8_t - getAgastScore_5_8(int x, int y, uint8_t threshold); + getAgastScore_5_8(int x, int y, uint8_t threshold) const; inline uint8_t - getAgastScore(float xf, float yf, uint8_t threshold, float scale = 1.0f); + getAgastScore(float xf, float yf, uint8_t threshold, float scale = 1.0f) const; // accessors inline const cv::Mat& @@ -111,8 +111,8 @@ public: private: // access gray values (smoothed/interpolated) - __inline__ uint8_t - value(const cv::Mat& mat, float xf, float yf, float scale); + inline uint8_t + value(const cv::Mat& mat, float xf, float yf, float scale) const; // the image cv::Mat img_; // its Fast scores @@ -139,40 +139,40 @@ public: // get Keypoints void - getKeypoints(const uint8_t _threshold, std::vector& keypoints); + getKeypoints(const uint8_t _threshold, std::vector& keypoints); protected: // nonmax suppression: - __inline__ bool + inline bool isMax2D(const uint8_t layer, const int x_layer, const int y_layer); // 1D (scale axis) refinement: - __inline__ float - refine1D(const float s_05, const float s0, const float s05, float& max); // around octave - __inline__ float - refine1D_1(const float s_05, const float s0, const float s05, float& max); // around intra - __inline__ float - refine1D_2(const float s_05, const float s0, const float s05, float& max); // around octave 0 only + inline float + refine1D(const float s_05, const float s0, const float s05, float& max) const; // around octave + inline float + refine1D_1(const float s_05, const float s0, const float s05, float& max) const; // around intra + inline float + refine1D_2(const float s_05, const float s0, const float s05, float& max) const; // around octave 0 only // 2D maximum refinement: - __inline__ float + inline float subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, const int s_1_0, const int s_1_1, const int s_1_2, - const int s_2_0, const int s_2_1, const int s_2_2, float& delta_x, float& delta_y); + const int s_2_0, const int s_2_1, const int s_2_2, float& delta_x, float& delta_y) const; // 3D maximum refinement centered around (x_layer,y_layer) - __inline__ float - refine3D(const uint8_t layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, bool& ismax); + inline float + refine3D(const uint8_t layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, bool& ismax) const; // interpolated score access with recalculation when needed: - __inline__ int - getScoreAbove(const uint8_t layer, const int x_layer, const int y_layer); - __inline__ int - getScoreBelow(const uint8_t layer, const int x_layer, const int y_layer); + inline int + getScoreAbove(const uint8_t layer, const int x_layer, const int y_layer) const; + inline int + getScoreBelow(const uint8_t layer, const int x_layer, const int y_layer) const; // return the maximum of score patches above or below - __inline__ float + inline float getScoreMaxAbove(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, - float& dx, float& dy); - __inline__ float + float& dx, float& dy) const; + inline float getScoreMaxBelow(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, - float& dx, float& dy); + float& dx, float& dy) const; // the image pyramids: uint8_t layers_; @@ -354,7 +354,7 @@ BRISK::generateKernel(std::vector &radiusList, std::vector &numberLi } // simple alternative: -__inline__ int +inline int BRISK::smoothedIntensity(const cv::Mat& image, const cv::Mat& integral, const float key_x, const float key_y, const unsigned int scale, const unsigned int rot, const unsigned int point) const @@ -650,7 +650,6 @@ BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoi } // clean-up - _integral.release(); delete[] _values; } @@ -946,11 +945,11 @@ BriskScaleSpace::getKeypoints(const uint8_t _threshold, std::vector0); - BriskLayer& layerBelow = pyramid_[layer - 1]; + const BriskLayer& layerBelow = pyramid_[layer - 1]; // check the first row int max_x = x_1 + 1; @@ -1754,8 +1753,8 @@ BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const return max; } -__inline__ float -BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, float& max) +inline float +BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, float& max) const { int i_05 = int(1024.0 * s_05 + 0.5); int i0 = int(1024.0 * s0 + 0.5); @@ -1800,8 +1799,8 @@ BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, flo return ret_val; } -__inline__ float -BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, float& max) +inline float +BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, float& max) const { int i_05 = int(1024.0 * s_05 + 0.5); int i0 = int(1024.0 * s0 + 0.5); @@ -1846,8 +1845,8 @@ BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, f return ret_val; } -__inline__ float -BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, float& max) +inline float +BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, float& max) const { int i_05 = int(1024.0 * s_05 + 0.5); int i0 = int(1024.0 * s0 + 0.5); @@ -1892,10 +1891,10 @@ BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, f return ret_val; } -__inline__ float +inline float BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, const int s_1_0, const int s_1_1, const int s_1_2, const int s_2_0, const int s_2_1, const int s_2_2, float& delta_x, - float& delta_y) + float& delta_y) const { // the coefficients of the 2d quadratic function least-squares fit: @@ -2086,7 +2085,7 @@ BriskLayer::getAgastPoints(uint8_t threshold, std::vector& keypoints) scores_(keypoints[i].pt.y, keypoints[i].pt.x) = keypoints[i].response; } inline uint8_t -BriskLayer::getAgastScore(int x, int y, uint8_t threshold) +BriskLayer::getAgastScore(int x, int y, uint8_t threshold) const { if (x < 3 || y < 3) return 0; @@ -2104,7 +2103,7 @@ BriskLayer::getAgastScore(int x, int y, uint8_t threshold) } inline uint8_t -BriskLayer::getAgastScore_5_8(int x, int y, uint8_t threshold) +BriskLayer::getAgastScore_5_8(int x, int y, uint8_t threshold) const { if (x < 2 || y < 2) return 0; @@ -2117,7 +2116,7 @@ BriskLayer::getAgastScore_5_8(int x, int y, uint8_t threshold) } inline uint8_t -BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_in) +BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_in) const { if (scale_in <= 1.0f) { @@ -2150,8 +2149,8 @@ BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_ } // access gray values (smoothed/interpolated) -__inline__ uint8_t -BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) +inline uint8_t +BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) const { assert(!mat.empty()); // get the position From 84c4797030e981f46257b34a1260892cceabb0a1 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Fri, 24 Aug 2012 16:23:07 +0200 Subject: [PATCH 049/103] revert orientation computation in jeypoint detection for efficiency (like done originally) --- .../include/opencv2/features2d/features2d.hpp | 5 + modules/features2d/src/brisk.cpp | 158 +++++++----------- 2 files changed, 70 insertions(+), 93 deletions(-) diff --git a/modules/features2d/include/opencv2/features2d/features2d.hpp b/modules/features2d/include/opencv2/features2d/features2d.hpp index a081fd4ee..774b01c18 100644 --- a/modules/features2d/include/opencv2/features2d/features2d.hpp +++ b/modules/features2d/include/opencv2/features2d/features2d.hpp @@ -307,6 +307,11 @@ protected: void computeImpl( const Mat& image, vector& keypoints, Mat& descriptors ) const; void detectImpl( const Mat& image, vector& keypoints, const Mat& mask=Mat() ) const; + void computeKeypointsNoOrientation(InputArray image, InputArray mask, vector& keypoints) const; + void computeDescriptorsAndOrOrientation(InputArray image, InputArray mask, vector& keypoints, + OutputArray descriptors, bool doDescriptors, bool doOrientation, + bool useProvidedKeypoints) const; + // Feature parameters CV_PROP_RW int threshold; CV_PROP_RW int octaves; diff --git a/modules/features2d/src/brisk.cpp b/modules/features2d/src/brisk.cpp index 537b8f797..72fc9a8ab 100755 --- a/modules/features2d/src/brisk.cpp +++ b/modules/features2d/src/brisk.cpp @@ -528,13 +528,28 @@ RoiPredicate(const float minX, const float minY, const float maxX, const float m void BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoints, OutputArray _descriptors, bool useProvidedKeypoints) const +{ + bool doOrientation; + if (useProvidedKeypoints) + doOrientation = false; + computeDescriptorsAndOrOrientation(_image, _mask, keypoints, _descriptors, true, doOrientation, + useProvidedKeypoints); +} + +void +BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, vector& keypoints, + OutputArray _descriptors, bool doDescriptors, bool doOrientation, + bool useProvidedKeypoints) const { Mat image = _image.getMat(), mask = _mask.getMat(); if( image.type() != CV_8UC1 ) cvtColor(image, image, CV_BGR2GRAY); if (!useProvidedKeypoints) - detectImpl(image, keypoints, mask); + { + doOrientation = true; + computeKeypointsNoOrientation(_image, _mask, keypoints); + } //Remove keypoints very close to the border size_t ksize = keypoints.size(); @@ -578,9 +593,13 @@ BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoi int* _values = new int[points_]; // for temporary use // resize the descriptors: - _descriptors.create(ksize, strings_, CV_8U); - cv::Mat descriptors = _descriptors.getMat(); - descriptors.setTo(0); + cv::Mat descriptors; + if (doDescriptors) + { + _descriptors.create(ksize, strings_, CV_8U); + descriptors = _descriptors.getMat(); + descriptors.setTo(0); + } // now do the extraction for all keypoints: @@ -592,13 +611,44 @@ BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoi uchar* ptr = descriptors.data; for (size_t k = 0; k < ksize; k++) { - int theta; cv::KeyPoint& kp = keypoints[k]; const int& scale = kscales[k]; - int shifter = 0; int* pvalues = _values; const float& x = kp.pt.x; const float& y = kp.pt.y; + + if (doOrientation) + { + // get the gray values in the unrotated pattern + for (unsigned int i = 0; i < points_; i++) + { + *(pvalues++) = smoothedIntensity(image, _integral, x, y, scale, 0, i); + } + + int direction0 = 0; + int direction1 = 0; + // now iterate through the long pairings + const BriskLongPair* max = longPairs_ + noLongPairs_; + for (BriskLongPair* iter = longPairs_; iter < max; ++iter) + { + t1 = *(_values + iter->i); + t2 = *(_values + iter->j); + const int delta_t = (t1 - t2); + // update the direction: + const int tmp0 = delta_t * (iter->weighted_dx) / 1024; + const int tmp1 = delta_t * (iter->weighted_dy) / 1024; + direction0 += tmp0; + direction1 += tmp1; + } + kp.angle = atan2((float) direction1, (float) direction0) / M_PI * 180.0; + if (kp.angle < 0) + kp.angle += 360; + } + + if (!doDescriptors) + continue; + + int theta; if (kp.angle==-1) { // don't compute the gradient direction, just assign a rotation of 0° @@ -615,7 +665,7 @@ BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoi // now also extract the stuff for the actual direction: // let us compute the smoothed values - shifter = 0; + int shifter = 0; //unsigned int mean=0; pvalues = _values; @@ -675,7 +725,14 @@ BRISK::~BRISK() } void -BRISK::operator()(InputArray _image, InputArray _mask, vector& keypoints) const +BRISK::operator()(InputArray image, InputArray mask, vector& keypoints) const +{ + computeKeypointsNoOrientation(image, mask, keypoints); + computeDescriptorsAndOrOrientation(image, mask, keypoints, cv::noArray(), false, true, true); +} + +void +BRISK::computeKeypointsNoOrientation(InputArray _image, InputArray _mask, vector& keypoints) const { Mat image = _image.getMat(), mask = _mask.getMat(); if( image.type() != CV_8UC1 ) @@ -687,91 +744,6 @@ BRISK::operator()(InputArray _image, InputArray _mask, vector& keypoin // remove invalid points removeInvalidPoints(mask, keypoints); - - // Compute the orientations of the keypoints - //Remove keypoints very close to the border - size_t ksize = keypoints.size(); - std::vector kscales; // remember the scale per keypoint - kscales.resize(ksize); - static const float log2 = 0.693147180559945; - static const float lb_scalerange = log(scalerange_) / (log2); - std::vector::iterator beginning = keypoints.begin(); - std::vector::iterator beginningkscales = kscales.begin(); - static const float basicSize06 = basicSize_ * 0.6; - for (size_t k = 0; k < ksize; k++) - { - unsigned int scale; - scale = std::max((int) (scales_ / lb_scalerange * (log(keypoints[k].size / (basicSize06)) / log2) + 0.5), 0); - // saturate - if (scale >= scales_) - scale = scales_ - 1; - kscales[k] = scale; - const int border = sizeList_[scale]; - const int border_x = image.cols - border; - const int border_y = image.rows - border; - if (RoiPredicate(border, border, border_x, border_y, keypoints[k])) - { - keypoints.erase(beginning + k); - kscales.erase(beginningkscales + k); - if (k == 0) - { - beginning = keypoints.begin(); - beginningkscales = kscales.begin(); - } - ksize--; - k--; - } - } - - // first, calculate the integral image over the whole image: - // current integral image - cv::Mat _integral; // the integral image - cv::integral(image, _integral); - - int* _values = new int[points_]; // for temporary use - - // now do the extraction for all keypoints: - - // temporary variables containing gray values at sample points: - int t1; - int t2; - - // the feature orientation - int direction0; - int direction1; - - for (size_t k = 0; k < ksize; k++) - { - cv::KeyPoint& kp = keypoints[k]; - const int& scale = kscales[k]; - int* pvalues = _values; - const float& x = kp.pt.x; - const float& y = kp.pt.y; - // get the gray values in the unrotated pattern - for (unsigned int i = 0; i < points_; i++) - { - *(pvalues++) = smoothedIntensity(image, _integral, x, y, scale, 0, i); - } - - direction0 = 0; - direction1 = 0; - // now iterate through the long pairings - const BriskLongPair* max = longPairs_ + noLongPairs_; - for (BriskLongPair* iter = longPairs_; iter < max; ++iter) - { - t1 = *(_values + iter->i); - t2 = *(_values + iter->j); - const int delta_t = (t1 - t2); - // update the direction: - const int tmp0 = delta_t * (iter->weighted_dx) / 1024; - const int tmp1 = delta_t * (iter->weighted_dy) / 1024; - direction0 += tmp0; - direction1 += tmp1; - } - kp.angle = atan2((float) direction1, (float) direction0) / M_PI * 180.0; - if (kp.angle < 0) - kp.angle += 360; - } } From 3ca0cc22531473c2aa0adb3acf8a06d9334a2b07 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Fri, 24 Aug 2012 16:35:35 +0200 Subject: [PATCH 050/103] add a scale invariance test for the detector --- .../test/test_rotation_and_scale_invariance.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/features2d/test/test_rotation_and_scale_invariance.cpp b/modules/features2d/test/test_rotation_and_scale_invariance.cpp index ac3094663..1441c87fd 100644 --- a/modules/features2d/test/test_rotation_and_scale_invariance.cpp +++ b/modules/features2d/test/test_rotation_and_scale_invariance.cpp @@ -644,13 +644,13 @@ TEST(Features2d_RotationInvariance_Descriptor_ORB, regression) * Detector's scale invariance check */ -//TEST(Features2d_ScaleInvariance_Detector_BRISK, regression) -//{ -// DetectorScaleInvarianceTest test(Algorithm::create("Feature2D.BRISK"), -// 0.09f, -// 0.52f); -// test.safe_run(); -//} +TEST(Features2d_ScaleInvariance_Detector_BRISK, regression) +{ + DetectorScaleInvarianceTest test(Algorithm::create("Feature2D.BRISK"), + 0.08f, + 0.54f); + test.safe_run(); +} //TEST(Features2d_ScaleInvariance_Detector_ORB, regression) //{ From 85eae7b30dec42c657253be600c14c9b43618441 Mon Sep 17 00:00:00 2001 From: Sergiu Dotenco Date: Thu, 30 Aug 2012 14:52:39 +0200 Subject: [PATCH 051/103] win32: always link to vfw32 --- cmake/OpenCVFindLibsVideo.cmake | 11 +++++------ modules/highgui/CMakeLists.txt | 1 - 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cmake/OpenCVFindLibsVideo.cmake b/cmake/OpenCVFindLibsVideo.cmake index 41bfc6553..91fb6a7ec 100644 --- a/cmake/OpenCVFindLibsVideo.cmake +++ b/cmake/OpenCVFindLibsVideo.cmake @@ -169,12 +169,11 @@ endif(WITH_VIDEOINPUT) # --- Extra HighGUI libs on Windows --- if(WIN32) - list(APPEND HIGHGUI_LIBRARIES comctl32 gdi32 ole32) - if(MSVC) - list(APPEND HIGHGUI_LIBRARIES vfw32) - elseif(MINGW64) - list(APPEND HIGHGUI_LIBRARIES msvfw32 avifil32 avicap32 winmm) + list(APPEND HIGHGUI_LIBRARIES comctl32 gdi32 ole32 vfw32) + if(MINGW64) + list(APPEND HIGHGUI_LIBRARIES avifil32 avicap32 winmm msvfw32) + list(REMOVE_ITEM HIGHGUI_LIBRARIES vfw32) elseif(MINGW) - list(APPEND HIGHGUI_LIBRARIES vfw32 winmm) + list(APPEND HIGHGUI_LIBRARIES winmm) endif() endif(WIN32) diff --git a/modules/highgui/CMakeLists.txt b/modules/highgui/CMakeLists.txt index 7a57b090c..d53c17c40 100644 --- a/modules/highgui/CMakeLists.txt +++ b/modules/highgui/CMakeLists.txt @@ -107,7 +107,6 @@ endif() if(WIN32) list(APPEND highgui_srcs src/cap_vfw.cpp src/cap_cmu.cpp src/cap_dshow.cpp) - list(APPEND HIGHGUI_LIBRARIES vfw32) endif(WIN32) if(HAVE_XINE) From 014106783d854cb4d89015171b26e79dda3c2632 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Thu, 30 Aug 2012 17:32:47 +0400 Subject: [PATCH 052/103] fixed building BRISK on Windows --- modules/features2d/src/brisk.cpp | 1096 +++++++++++++++--------------- modules/imgproc/src/imgwarp.cpp | 2 +- 2 files changed, 542 insertions(+), 556 deletions(-) diff --git a/modules/features2d/src/brisk.cpp b/modules/features2d/src/brisk.cpp index 72fc9a8ab..2a54d7c1c 100755 --- a/modules/features2d/src/brisk.cpp +++ b/modules/features2d/src/brisk.cpp @@ -70,15 +70,15 @@ public: // Fast/Agast without non-max suppression void - getAgastPoints(uint8_t threshold, std::vector& keypoints); + getAgastPoints(int threshold, std::vector& keypoints); // get scores - attention, this is in layer coordinates, not scale=1 coordinates! - inline uint8_t - getAgastScore(int x, int y, uint8_t threshold) const; - inline uint8_t - getAgastScore_5_8(int x, int y, uint8_t threshold) const; - inline uint8_t - getAgastScore(float xf, float yf, uint8_t threshold, float scale = 1.0f) const; + inline int + getAgastScore(int x, int y, int threshold) const; + inline int + getAgastScore_5_8(int x, int y, int threshold) const; + inline int + getAgastScore(float xf, float yf, int threshold, float scale = 1.0f) const; // accessors inline const cv::Mat& @@ -111,7 +111,7 @@ public: private: // access gray values (smoothed/interpolated) - inline uint8_t + inline int value(const cv::Mat& mat, float xf, float yf, float scale) const; // the image cv::Mat img_; @@ -130,7 +130,7 @@ class CV_EXPORTS BriskScaleSpace { public: // construct telling the octaves number: - BriskScaleSpace(uint8_t _octaves = 3); + BriskScaleSpace(int _octaves = 3); ~BriskScaleSpace(); // construct the image pyramids @@ -139,12 +139,12 @@ public: // get Keypoints void - getKeypoints(const uint8_t _threshold, std::vector& keypoints); + getKeypoints(const int _threshold, std::vector& keypoints); protected: // nonmax suppression: inline bool - isMax2D(const uint8_t layer, const int x_layer, const int y_layer); + isMax2D(const int layer, const int x_layer, const int y_layer); // 1D (scale axis) refinement: inline float refine1D(const float s_05, const float s0, const float s05, float& max) const; // around octave @@ -158,24 +158,24 @@ protected: const int s_2_0, const int s_2_1, const int s_2_2, float& delta_x, float& delta_y) const; // 3D maximum refinement centered around (x_layer,y_layer) inline float - refine3D(const uint8_t layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, bool& ismax) const; + refine3D(const int layer, const int x_layer, const int y_layer, float& x, float& y, float& scale, bool& ismax) const; // interpolated score access with recalculation when needed: inline int - getScoreAbove(const uint8_t layer, const int x_layer, const int y_layer) const; + getScoreAbove(const int layer, const int x_layer, const int y_layer) const; inline int - getScoreBelow(const uint8_t layer, const int x_layer, const int y_layer) const; + getScoreBelow(const int layer, const int x_layer, const int y_layer) const; // return the maximum of score patches above or below inline float - getScoreMaxAbove(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, + getScoreMaxAbove(const int layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, float& dx, float& dy) const; inline float - getScoreMaxBelow(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, + getScoreMaxBelow(const int layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, float& dx, float& dy) const; // the image pyramids: - uint8_t layers_; + int layers_; std::vector pyramid_; // some constant parameters: @@ -183,15 +183,13 @@ protected: static const float basicSize_; }; -using namespace cv; - -const float BRISK::basicSize_ = 12.0; +const float BRISK::basicSize_ = 12.0f; const unsigned int BRISK::scales_ = 64; -const float BRISK::scalerange_ = 30; // 40->4 Octaves - else, this needs to be adjusted... +const float BRISK::scalerange_ = 30.f; // 40->4 Octaves - else, this needs to be adjusted... const unsigned int BRISK::n_rot_ = 1024; // discretization of the rotation look-up -const float BriskScaleSpace::safetyFactor_ = 1.0; -const float BriskScaleSpace::basicSize_ = 12.0; +const float BriskScaleSpace::safetyFactor_ = 1.0f; +const float BriskScaleSpace::basicSize_ = 12.0f; // constructors BRISK::BRISK(int thresh, int octaves_in, float patternScale) @@ -207,11 +205,11 @@ BRISK::BRISK(int thresh, int octaves_in, float patternScale) nList.resize(5); const double f = 0.85 * patternScale; - rList[0] = f * 0; - rList[1] = f * 2.9; - rList[2] = f * 4.9; - rList[3] = f * 7.4; - rList[4] = f * 10.8; + rList[0] = (float)(f * 0.); + rList[1] = (float)(f * 2.9); + rList[2] = (float)(f * 4.9); + rList[3] = (float)(f * 7.4); + rList[4] = (float)(f * 10.8); nList[0] = 1; nList[1] = 10; @@ -219,7 +217,7 @@ BRISK::BRISK(int thresh, int octaves_in, float patternScale) nList[3] = 15; nList[4] = 20; - generateKernel(rList, nList, 5.85 * patternScale, 8.2 * patternScale); + generateKernel(rList, nList, (float)(5.85 * patternScale), (float)(8.2 * patternScale)); } BRISK::BRISK(std::vector &radiusList, std::vector &numberList, float dMax, float dMin, @@ -237,7 +235,7 @@ BRISK::generateKernel(std::vector &radiusList, std::vector &numberLi dMin_ = dMin; // get the total number of points - const int rings = radiusList.size(); + const int rings = (int)radiusList.size(); assert(radiusList.size()!=0&&radiusList.size()==numberList.size()); points_ = 0; // remember the total number of points for (int ring = 0; ring < rings; ring++) @@ -249,44 +247,44 @@ BRISK::generateKernel(std::vector &radiusList, std::vector &numberLi BriskPatternPoint* patternIterator = patternPoints_; // define the scale discretization: - static const float lb_scale = log(scalerange_) / log(2.0); + static const float lb_scale = (float)(log(scalerange_) / log(2.0)); static const float lb_scale_step = lb_scale / (scales_); scaleList_ = new float[scales_]; sizeList_ = new unsigned int[scales_]; - const float sigma_scale = 1.3; + const float sigma_scale = 1.3f; for (unsigned int scale = 0; scale < scales_; ++scale) { - scaleList_[scale] = pow((double) 2.0, (double) (scale * lb_scale_step)); + scaleList_[scale] = (float)pow((double) 2.0, (double) (scale * lb_scale_step)); sizeList_[scale] = 0; // generate the pattern points look-up double alpha, theta; for (size_t rot = 0; rot < n_rot_; ++rot) { - theta = double(rot) * 2 * M_PI / double(n_rot_); // this is the rotation of the feature + theta = double(rot) * 2 * CV_PI / double(n_rot_); // this is the rotation of the feature for (int ring = 0; ring < rings; ++ring) { for (int num = 0; num < numberList[ring]; ++num) { // the actual coordinates on the circle - alpha = (double(num)) * 2 * M_PI / double(numberList[ring]); - patternIterator->x = scaleList_[scale] * radiusList[ring] * cos(alpha + theta); // feature rotation plus angle of the point - patternIterator->y = scaleList_[scale] * radiusList[ring] * sin(alpha + theta); + alpha = (double(num)) * 2 * CV_PI / double(numberList[ring]); + patternIterator->x = (float)(scaleList_[scale] * radiusList[ring] * cos(alpha + theta)); // feature rotation plus angle of the point + patternIterator->y = (float)(scaleList_[scale] * radiusList[ring] * sin(alpha + theta)); // and the gaussian kernel sigma if (ring == 0) { - patternIterator->sigma = sigma_scale * scaleList_[scale] * 0.5; + patternIterator->sigma = sigma_scale * scaleList_[scale] * 0.5f; } else { - patternIterator->sigma = sigma_scale * scaleList_[scale] * (double(radiusList[ring])) - * sin(M_PI / numberList[ring]); + patternIterator->sigma = (float)(sigma_scale * scaleList_[scale] * (double(radiusList[ring])) + * sin(CV_PI / numberList[ring])); } // adapt the sizeList if necessary - const unsigned int size = ceil(((scaleList_[scale] * radiusList[ring]) + patternIterator->sigma)) + 1; + const unsigned int size = cvCeil(((scaleList_[scale] * radiusList[ring]) + patternIterator->sigma)) + 1; if (sizeList_[scale] < size) { sizeList_[scale] = size; @@ -306,11 +304,11 @@ BRISK::generateKernel(std::vector &radiusList, std::vector &numberLi noLongPairs_ = 0; // fill indexChange with 0..n if empty - unsigned int indSize = indexChange.size(); + unsigned int indSize = (unsigned int)indexChange.size(); if (indSize == 0) { indexChange.resize(points_ * (points_ - 1) / 2); - indSize = indexChange.size(); + indSize = (unsigned int)indexChange.size(); } for (unsigned int i = 0; i < indSize; i++) { @@ -370,34 +368,30 @@ BRISK::smoothedIntensity(const cv::Mat& image, const cv::Mat& integral, const fl // get the sigma: const float sigma_half = briskPoint.sigma; - const float area = 4.0 * sigma_half * sigma_half; + const float area = 4.0f * sigma_half * sigma_half; // calculate output: int ret_val; if (sigma_half < 0.5) { //interpolation multipliers: - const int r_x = (xf - x) * 1024; - const int r_y = (yf - y) * 1024; + const int r_x = (int)((xf - x) * 1024); + const int r_y = (int)((yf - y) * 1024); const int r_x_1 = (1024 - r_x); const int r_y_1 = (1024 - r_y); - uchar* ptr = image.data + x + y * imagecols; + const uchar* ptr = &image.at(y, x); + size_t step = image.step; // just interpolate: - ret_val = (r_x_1 * r_y_1 * int(*ptr)); - ptr++; - ret_val += (r_x * r_y_1 * int(*ptr)); - ptr += imagecols; - ret_val += (r_x * r_y * int(*ptr)); - ptr--; - ret_val += (r_x_1 * r_y * int(*ptr)); + ret_val = r_x_1 * r_y_1 * ptr[0] + r_x * r_y_1 * ptr[1] + + r_x * r_y * ptr[step] + r_x_1 * r_y * ptr[step+1]; return (ret_val + 512) / 1024; } // this is the standard case (simple, not speed optimized yet): // scaling: - const int scaling = 4194304.0 / area; - const int scaling2 = float(scaling) * area / 1024.0; + const int scaling = (int)(4194304.0 / area); + const int scaling2 = int(float(scaling) * area / 1024.0); // the integral image is larger: const int integralcols = imagecols + 1; @@ -414,20 +408,20 @@ BRISK::smoothedIntensity(const cv::Mat& image, const cv::Mat& integral, const fl const int y_bottom = int(y1 + 0.5); // overlap area - multiplication factors: - const float r_x_1 = float(x_left) - x_1 + 0.5; - const float r_y_1 = float(y_top) - y_1 + 0.5; - const float r_x1 = x1 - float(x_right) + 0.5; - const float r_y1 = y1 - float(y_bottom) + 0.5; + const float r_x_1 = float(x_left) - x_1 + 0.5f; + const float r_y_1 = float(y_top) - y_1 + 0.5f; + const float r_x1 = x1 - float(x_right) + 0.5f; + const float r_y1 = y1 - float(y_bottom) + 0.5f; const int dx = x_right - x_left - 1; const int dy = y_bottom - y_top - 1; - const int A = (r_x_1 * r_y_1) * scaling; - const int B = (r_x1 * r_y_1) * scaling; - const int C = (r_x1 * r_y1) * scaling; - const int D = (r_x_1 * r_y1) * scaling; - const int r_x_1_i = r_x_1 * scaling; - const int r_y_1_i = r_y_1 * scaling; - const int r_x1_i = r_x1 * scaling; - const int r_y1_i = r_y1 * scaling; + const int A = (int)((r_x_1 * r_y_1) * scaling); + const int B = (int)((r_x1 * r_y_1) * scaling); + const int C = (int)((r_x1 * r_y1) * scaling); + const int D = (int)((r_x_1 * r_y1) * scaling); + const int r_x_1_i = (int)(r_x_1 * scaling); + const int r_y_1_i = (int)(r_y_1 * scaling); + const int r_x1_i = (int)(r_x1 * scaling); + const int r_y1_i = (int)(r_y1 * scaling); if (dx + dy > 2) { @@ -529,7 +523,7 @@ void BRISK::operator()( InputArray _image, InputArray _mask, vector& keypoints, OutputArray _descriptors, bool useProvidedKeypoints) const { - bool doOrientation; + bool doOrientation=true; if (useProvidedKeypoints) doOrientation = false; computeDescriptorsAndOrOrientation(_image, _mask, keypoints, _descriptors, true, doOrientation, @@ -555,11 +549,11 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v size_t ksize = keypoints.size(); std::vector kscales; // remember the scale per keypoint kscales.resize(ksize); - static const float log2 = 0.693147180559945; - static const float lb_scalerange = log(scalerange_) / (log2); + static const float log2 = 0.693147180559945f; + static const float lb_scalerange = (float)(log(scalerange_) / (log2)); std::vector::iterator beginning = keypoints.begin(); std::vector::iterator beginningkscales = kscales.begin(); - static const float basicSize06 = basicSize_ * 0.6; + static const float basicSize06 = basicSize_ * 0.6f; for (size_t k = 0; k < ksize; k++) { unsigned int scale; @@ -571,7 +565,7 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v const int border = sizeList_[scale]; const int border_x = image.cols - border; const int border_y = image.rows - border; - if (RoiPredicate(border, border, border_x, border_y, keypoints[k])) + if (RoiPredicate((float)border, (float)border, (float)border_x, (float)border_y, keypoints[k])) { keypoints.erase(beginning + k); kscales.erase(beginningkscales + k); @@ -596,7 +590,7 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v cv::Mat descriptors; if (doDescriptors) { - _descriptors.create(ksize, strings_, CV_8U); + _descriptors.create((int)ksize, strings_, CV_8U); descriptors = _descriptors.getMat(); descriptors.setTo(0); } @@ -640,9 +634,9 @@ BRISK::computeDescriptorsAndOrOrientation(InputArray _image, InputArray _mask, v direction0 += tmp0; direction1 += tmp1; } - kp.angle = atan2((float) direction1, (float) direction0) / M_PI * 180.0; + kp.angle = (float)(atan2((float) direction1, (float) direction0) / CV_PI * 180.0); if (kp.angle < 0) - kp.angle += 360; + kp.angle += 360.f; } if (!doDescriptors) @@ -760,7 +754,7 @@ BRISK::computeImpl( const Mat& image, vector& keypoints, Mat& descript } // construct telling the octaves number: -BriskScaleSpace::BriskScaleSpace(uint8_t _octaves) +BriskScaleSpace::BriskScaleSpace(int _octaves) { if (_octaves == 0) layers_ = 1; @@ -787,7 +781,7 @@ BriskScaleSpace::constructPyramid(const cv::Mat& image) } const int octaves2 = layers_; - for (uint8_t i = 2; i < octaves2; i += 2) + for (uchar i = 2; i < octaves2; i += 2) { pyramid_.push_back(BriskLayer(pyramid_[i - 2], BriskLayer::CommonParams::HALFSAMPLE)); pyramid_.push_back(BriskLayer(pyramid_[i - 1], BriskLayer::CommonParams::HALFSAMPLE)); @@ -795,20 +789,19 @@ BriskScaleSpace::constructPyramid(const cv::Mat& image) } void -BriskScaleSpace::getKeypoints(const uint8_t _threshold, std::vector& keypoints) +BriskScaleSpace::getKeypoints(const int threshold_, std::vector& keypoints) { // make sure keypoints is empty keypoints.resize(0); keypoints.reserve(2000); // assign thresholds - uint8_t threshold_ = _threshold; - uint8_t safeThreshold_ = threshold_ * safetyFactor_; + int safeThreshold_ = (int)(threshold_ * safetyFactor_); std::vector > agastPoints; agastPoints.resize(layers_); // go through the octaves and intra layers and calculate fast corner scores: - for (uint8_t i = 0; i < layers_; i++) + for (int i = 0; i < layers_; i++) { // call OAST16_9 without nms BriskLayer& l = pyramid_[i]; @@ -818,25 +811,25 @@ BriskScaleSpace::getKeypoints(const uint8_t _threshold, std::vector max_below_uchar) - max_below_uchar = s_1_0; - register int s_2_0 = l.getAgastScore_5_8(x_layer + 1, y_layer - 1, 1); - if (s_2_0 > max_below_uchar) - max_below_uchar = s_2_0; - register int s_2_1 = l.getAgastScore_5_8(x_layer + 1, y_layer, 1); - if (s_2_1 > max_below_uchar) - max_below_uchar = s_2_1; - register int s_1_1 = l.getAgastScore_5_8(x_layer, y_layer, 1); - if (s_1_1 > max_below_uchar) - max_below_uchar = s_1_1; - register int s_0_1 = l.getAgastScore_5_8(x_layer - 1, y_layer, 1); - if (s_0_1 > max_below_uchar) - max_below_uchar = s_0_1; - register int s_0_2 = l.getAgastScore_5_8(x_layer - 1, y_layer + 1, 1); - if (s_0_2 > max_below_uchar) - max_below_uchar = s_0_2; - register int s_1_2 = l.getAgastScore_5_8(x_layer, y_layer + 1, 1); - if (s_1_2 > max_below_uchar) - max_below_uchar = s_1_2; - register int s_2_2 = l.getAgastScore_5_8(x_layer + 1, y_layer + 1, 1); - if (s_2_2 > max_below_uchar) - max_below_uchar = s_2_2; + int s_0_0 = l.getAgastScore_5_8(x_layer - 1, y_layer - 1, 1); + max_below = s_0_0; + int s_1_0 = l.getAgastScore_5_8(x_layer, y_layer - 1, 1); + max_below = std::max(s_1_0, max_below); + int s_2_0 = l.getAgastScore_5_8(x_layer + 1, y_layer - 1, 1); + max_below = std::max(s_2_0, max_below); + int s_2_1 = l.getAgastScore_5_8(x_layer + 1, y_layer, 1); + max_below = std::max(s_2_1, max_below); + int s_1_1 = l.getAgastScore_5_8(x_layer, y_layer, 1); + max_below = std::max(s_1_1, max_below); + int s_0_1 = l.getAgastScore_5_8(x_layer - 1, y_layer, 1); + max_below = std::max(s_0_1, max_below); + int s_0_2 = l.getAgastScore_5_8(x_layer - 1, y_layer + 1, 1); + max_below = std::max(s_0_2, max_below); + int s_1_2 = l.getAgastScore_5_8(x_layer, y_layer + 1, 1); + max_below = std::max(s_1_2, max_below); + int s_2_2 = l.getAgastScore_5_8(x_layer + 1, y_layer + 1, 1); + max_below = std::max(s_2_2, max_below); max_below_float = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_below, delta_y_below); - max_below_float = max_below_uchar; + max_below_float = (float)max_below; } else { @@ -1246,15 +1231,15 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la } // get the patch on this layer: - register int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); - register int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); - register int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); - register int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); - register int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); - register int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); - register int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); - register int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); - register int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); + int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); + int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); + int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); + int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); + int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); + int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); + int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); + int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); + int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); float delta_x_layer, delta_y_layer; float max_layer = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_layer, delta_y_layer); @@ -1270,8 +1255,8 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la if (scale > 1.0) { // interpolate the position: - const float r0 = (1.5 - scale) / .5; - const float r1 = 1.0 - r0; + const float r0 = (1.5f - scale) / .5f; + const float r1 = 1.0f - r0; x = (r0 * delta_x_layer + r1 * delta_x_above + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r1 * delta_y_above + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } @@ -1280,16 +1265,16 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la if (layer == 0) { // interpolate the position: - const float r0 = (scale - 0.5) / 0.5; - const float r_1 = 1.0 - r0; + const float r0 = (scale - 0.5f) / 0.5f; + const float r_1 = 1.0f - r0; x = r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer); y = r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer); } else { // interpolate the position: - const float r0 = (scale - 0.75) / 0.25; - const float r_1 = 1.0 - r0; + const float r0 = (scale - 0.75f) / 0.25f; + const float r_1 = 1.0f - r0; x = (r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } @@ -1302,18 +1287,18 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la float delta_x_below, delta_y_below; float max_below = getScoreMaxBelow(layer, x_layer, y_layer, center, ismax, delta_x_below, delta_y_below); if (!ismax) - return 0.0; + return 0.0f; // get the patch on this layer: - register int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); - register int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); - register int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); - register int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); - register int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); - register int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); - register int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); - register int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); - register int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); + int s_0_0 = thisLayer.getAgastScore(x_layer - 1, y_layer - 1, 1); + int s_1_0 = thisLayer.getAgastScore(x_layer, y_layer - 1, 1); + int s_2_0 = thisLayer.getAgastScore(x_layer + 1, y_layer - 1, 1); + int s_2_1 = thisLayer.getAgastScore(x_layer + 1, y_layer, 1); + int s_1_1 = thisLayer.getAgastScore(x_layer, y_layer, 1); + int s_0_1 = thisLayer.getAgastScore(x_layer - 1, y_layer, 1); + int s_0_2 = thisLayer.getAgastScore(x_layer - 1, y_layer + 1, 1); + int s_1_2 = thisLayer.getAgastScore(x_layer, y_layer + 1, 1); + int s_2_2 = thisLayer.getAgastScore(x_layer + 1, y_layer + 1, 1); float delta_x_layer, delta_y_layer; float max_layer = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, delta_x_layer, delta_y_layer); @@ -1323,16 +1308,16 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la if (scale > 1.0) { // interpolate the position: - const float r0 = 4.0 - scale * 3.0; - const float r1 = 1.0 - r0; + const float r0 = 4.0f - scale * 3.0f; + const float r1 = 1.0f - r0; x = (r0 * delta_x_layer + r1 * delta_x_above + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r1 * delta_y_above + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } else { // interpolate the position: - const float r0 = scale * 3.0 - 2.0; - const float r_1 = 1.0 - r0; + const float r0 = scale * 3.0f - 2.0f; + const float r_1 = 1.0f - r0; x = (r0 * delta_x_layer + r_1 * delta_x_below + float(x_layer)) * thisLayer.scale() + thisLayer.offset(); y = (r0 * delta_y_layer + r_1 * delta_y_below + float(y_layer)) * thisLayer.scale() + thisLayer.offset(); } @@ -1347,7 +1332,7 @@ BriskScaleSpace::refine3D(const uint8_t layer, const int x_layer, const int y_la // return the maximum of score patches above or below inline float -BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, +BriskScaleSpace::getScoreMaxAbove(const int layer, const int x_layer, const int y_layer, const int threshold, bool& ismax, float& dx, float& dy) const { @@ -1365,10 +1350,10 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const if (layer % 2 == 0) { // octave - x_1 = float(4 * (x_layer) - 1 - 2) / 6.0; - x1 = float(4 * (x_layer) - 1 + 2) / 6.0; - y_1 = float(4 * (y_layer) - 1 - 2) / 6.0; - y1 = float(4 * (y_layer) - 1 + 2) / 6.0; + x_1 = float(4 * (x_layer) - 1 - 2) / 6.0f; + x1 = float(4 * (x_layer) - 1 + 2) / 6.0f; + y_1 = float(4 * (y_layer) - 1 - 2) / 6.0f; + y1 = float(4 * (y_layer) - 1 + 2) / 6.0f; } else { @@ -1380,103 +1365,103 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const } // check the first row - int max_x = x_1 + 1; - int max_y = y_1 + 1; + int max_x = (int)x_1 + 1; + int max_y = (int)y_1 + 1; float tmp_max; - float max = layerAbove.getAgastScore(x_1, y_1, 1); - if (max > threshold) + float maxval = (float)layerAbove.getAgastScore(x_1, y_1, 1); + if (maxval > threshold) return 0; - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerAbove.getAgastScore(float(x), y_1, 1); + tmp_max = (float)layerAbove.getAgastScore(float(x), y_1, 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = x; } } - tmp_max = layerAbove.getAgastScore(x1, y_1, 1); + tmp_max = (float)layerAbove.getAgastScore(x1, y_1, 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x1); } // middle rows - for (int y = y_1 + 1; y <= int(y1); y++) + for (int y = (int)y_1 + 1; y <= int(y1); y++) { - tmp_max = layerAbove.getAgastScore(x_1, float(y), 1); + tmp_max = (float)layerAbove.getAgastScore(x_1, float(y), 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x_1 + 1); max_y = y; } - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerAbove.getAgastScore(x, y, 1); + tmp_max = (float)layerAbove.getAgastScore(x, y, 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = x; max_y = y; } } - tmp_max = layerAbove.getAgastScore(x1, float(y), 1); + tmp_max = (float)layerAbove.getAgastScore(x1, float(y), 1); if (tmp_max > threshold) return 0; - if (tmp_max > max) + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x1); max_y = y; } } // bottom row - tmp_max = layerAbove.getAgastScore(x_1, y1, 1); - if (tmp_max > max) + tmp_max = (float)layerAbove.getAgastScore(x_1, y1, 1); + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x_1 + 1); max_y = int(y1); } - for (int x = x_1 + 1; x <= int(x1); x++) + for (int x = (int)x_1 + 1; x <= int(x1); x++) { - tmp_max = layerAbove.getAgastScore(float(x), y1, 1); - if (tmp_max > max) + tmp_max = (float)layerAbove.getAgastScore(float(x), y1, 1); + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = x; max_y = int(y1); } } - tmp_max = layerAbove.getAgastScore(x1, y1, 1); - if (tmp_max > max) + tmp_max = (float)layerAbove.getAgastScore(x1, y1, 1); + if (tmp_max > maxval) { - max = tmp_max; + maxval = tmp_max; max_x = int(x1); max_y = int(y1); } //find dx/dy: - register int s_0_0 = layerAbove.getAgastScore(max_x - 1, max_y - 1, 1); - register int s_1_0 = layerAbove.getAgastScore(max_x, max_y - 1, 1); - register int s_2_0 = layerAbove.getAgastScore(max_x + 1, max_y - 1, 1); - register int s_2_1 = layerAbove.getAgastScore(max_x + 1, max_y, 1); - register int s_1_1 = layerAbove.getAgastScore(max_x, max_y, 1); - register int s_0_1 = layerAbove.getAgastScore(max_x - 1, max_y, 1); - register int s_0_2 = layerAbove.getAgastScore(max_x - 1, max_y + 1, 1); - register int s_1_2 = layerAbove.getAgastScore(max_x, max_y + 1, 1); - register int s_2_2 = layerAbove.getAgastScore(max_x + 1, max_y + 1, 1); + int s_0_0 = layerAbove.getAgastScore(max_x - 1, max_y - 1, 1); + int s_1_0 = layerAbove.getAgastScore(max_x, max_y - 1, 1); + int s_2_0 = layerAbove.getAgastScore(max_x + 1, max_y - 1, 1); + int s_2_1 = layerAbove.getAgastScore(max_x + 1, max_y, 1); + int s_1_1 = layerAbove.getAgastScore(max_x, max_y, 1); + int s_0_1 = layerAbove.getAgastScore(max_x - 1, max_y, 1); + int s_0_2 = layerAbove.getAgastScore(max_x - 1, max_y + 1, 1); + int s_1_2 = layerAbove.getAgastScore(max_x, max_y + 1, 1); + int s_2_2 = layerAbove.getAgastScore(max_x + 1, max_y + 1, 1); float dx_1, dy_1; float refined_max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, dx_1, dy_1); @@ -1491,8 +1476,8 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const } else { - dx = (real_x * 8.0 + 1.0) / 6.0 - float(x_layer); - dy = (real_y * 8.0 + 1.0) / 6.0 - float(y_layer); + dx = (real_x * 8.0f + 1.0f) / 6.0f - float(x_layer); + dy = (real_y * 8.0f + 1.0f) / 6.0f - float(y_layer); } // saturate @@ -1517,6 +1502,205 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const returnrefined = false; } + // done and ok. + ismax = true; + if (returnrefined) + { + return std::max(refined_max, maxval); + } + return maxval; +} + +inline float +BriskScaleSpace::getScoreMaxBelow(const int layer, const int x_layer, const int y_layer, const int threshold, + bool& ismax, float& dx, float& dy) const +{ + ismax = false; + + // relevant floating point coordinates + float x_1; + float x1; + float y_1; + float y1; + + if (layer % 2 == 0) + { + // octave + x_1 = float(8 * (x_layer) + 1 - 4) / 6.0f; + x1 = float(8 * (x_layer) + 1 + 4) / 6.0f; + y_1 = float(8 * (y_layer) + 1 - 4) / 6.0f; + y1 = float(8 * (y_layer) + 1 + 4) / 6.0f; + } + else + { + x_1 = float(6 * (x_layer) + 1 - 3) / 4.0f; + x1 = float(6 * (x_layer) + 1 + 3) / 4.0f; + y_1 = float(6 * (y_layer) + 1 - 3) / 4.0f; + y1 = float(6 * (y_layer) + 1 + 3) / 4.0f; + } + + // the layer below + assert(layer>0); + const BriskLayer& layerBelow = pyramid_[layer - 1]; + + // check the first row + int max_x = (int)x_1 + 1; + int max_y = (int)y_1 + 1; + float tmp_max; + float max = (float)layerBelow.getAgastScore(x_1, y_1, 1); + if (max > threshold) + return 0; + for (int x = (int)x_1 + 1; x <= int(x1); x++) + { + tmp_max = (float)layerBelow.getAgastScore(float(x), y_1, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + } + } + tmp_max = (float)layerBelow.getAgastScore(x1, y_1, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + } + + // middle rows + for (int y = (int)y_1 + 1; y <= int(y1); y++) + { + tmp_max = (float)layerBelow.getAgastScore(x_1, float(y), 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x_1 + 1); + max_y = y; + } + for (int x = (int)x_1 + 1; x <= int(x1); x++) + { + tmp_max = (float)layerBelow.getAgastScore(x, y, 1); + if (tmp_max > threshold) + return 0; + if (tmp_max == max) + { + const int t1 = 2 + * (layerBelow.getAgastScore(x - 1, y, 1) + layerBelow.getAgastScore(x + 1, y, 1) + + layerBelow.getAgastScore(x, y + 1, 1) + layerBelow.getAgastScore(x, y - 1, 1)) + + (layerBelow.getAgastScore(x + 1, y + 1, 1) + layerBelow.getAgastScore(x - 1, y + 1, 1) + + layerBelow.getAgastScore(x + 1, y - 1, 1) + layerBelow.getAgastScore(x - 1, y - 1, 1)); + const int t2 = 2 + * (layerBelow.getAgastScore(max_x - 1, max_y, 1) + layerBelow.getAgastScore(max_x + 1, max_y, 1) + + layerBelow.getAgastScore(max_x, max_y + 1, 1) + layerBelow.getAgastScore(max_x, max_y - 1, 1)) + + (layerBelow.getAgastScore(max_x + 1, max_y + 1, 1) + layerBelow.getAgastScore(max_x - 1, + max_y + 1, 1) + + layerBelow.getAgastScore(max_x + 1, max_y - 1, 1) + + layerBelow.getAgastScore(max_x - 1, max_y - 1, 1)); + if (t1 > t2) + { + max_x = x; + max_y = y; + } + } + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + max_y = y; + } + } + tmp_max = (float)layerBelow.getAgastScore(x1, float(y), 1); + if (tmp_max > threshold) + return 0; + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + max_y = y; + } + } + + // bottom row + tmp_max = (float)layerBelow.getAgastScore(x_1, y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x_1 + 1); + max_y = int(y1); + } + for (int x = (int)x_1 + 1; x <= int(x1); x++) + { + tmp_max = (float)layerBelow.getAgastScore(float(x), y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = x; + max_y = int(y1); + } + } + tmp_max = (float)layerBelow.getAgastScore(x1, y1, 1); + if (tmp_max > max) + { + max = tmp_max; + max_x = int(x1); + max_y = int(y1); + } + + //find dx/dy: + int s_0_0 = layerBelow.getAgastScore(max_x - 1, max_y - 1, 1); + int s_1_0 = layerBelow.getAgastScore(max_x, max_y - 1, 1); + int s_2_0 = layerBelow.getAgastScore(max_x + 1, max_y - 1, 1); + int s_2_1 = layerBelow.getAgastScore(max_x + 1, max_y, 1); + int s_1_1 = layerBelow.getAgastScore(max_x, max_y, 1); + int s_0_1 = layerBelow.getAgastScore(max_x - 1, max_y, 1); + int s_0_2 = layerBelow.getAgastScore(max_x - 1, max_y + 1, 1); + int s_1_2 = layerBelow.getAgastScore(max_x, max_y + 1, 1); + int s_2_2 = layerBelow.getAgastScore(max_x + 1, max_y + 1, 1); + float dx_1, dy_1; + float refined_max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, dx_1, dy_1); + + // calculate dx/dy in above coordinates + float real_x = float(max_x) + dx_1; + float real_y = float(max_y) + dy_1; + bool returnrefined = true; + if (layer % 2 == 0) + { + dx = (float)((real_x * 6.0 + 1.0) / 8.0) - float(x_layer); + dy = (float)((real_y * 6.0 + 1.0) / 8.0) - float(y_layer); + } + else + { + dx = (float)((real_x * 4.0 - 1.0) / 6.0) - float(x_layer); + dy = (float)((real_y * 4.0 - 1.0) / 6.0) - float(y_layer); + } + + // saturate + if (dx > 1.0) + { + dx = 1.0f; + returnrefined = false; + } + if (dx < -1.0f) + { + dx = -1.0f; + returnrefined = false; + } + if (dy > 1.0f) + { + dy = 1.0f; + returnrefined = false; + } + if (dy < -1.0f) + { + dy = -1.0f; + returnrefined = false; + } + // done and ok. ismax = true; if (returnrefined) @@ -1526,205 +1710,6 @@ BriskScaleSpace::getScoreMaxAbove(const uint8_t layer, const int x_layer, const return max; } -inline float -BriskScaleSpace::getScoreMaxBelow(const uint8_t layer, const int x_layer, const int y_layer, const int threshold, - bool& ismax, float& dx, float& dy) const -{ - ismax = false; - - // relevant floating point coordinates - float x_1; - float x1; - float y_1; - float y1; - - if (layer % 2 == 0) - { - // octave - x_1 = float(8 * (x_layer) + 1 - 4) / 6.0; - x1 = float(8 * (x_layer) + 1 + 4) / 6.0; - y_1 = float(8 * (y_layer) + 1 - 4) / 6.0; - y1 = float(8 * (y_layer) + 1 + 4) / 6.0; - } - else - { - x_1 = float(6 * (x_layer) + 1 - 3) / 4.0; - x1 = float(6 * (x_layer) + 1 + 3) / 4.0; - y_1 = float(6 * (y_layer) + 1 - 3) / 4.0; - y1 = float(6 * (y_layer) + 1 + 3) / 4.0; - } - - // the layer below - assert(layer>0); - const BriskLayer& layerBelow = pyramid_[layer - 1]; - - // check the first row - int max_x = x_1 + 1; - int max_y = y_1 + 1; - float tmp_max; - float max = layerBelow.getAgastScore(x_1, y_1, 1); - if (max > threshold) - return 0; - for (int x = x_1 + 1; x <= int(x1); x++) - { - tmp_max = layerBelow.getAgastScore(float(x), y_1, 1); - if (tmp_max > threshold) - return 0; - if (tmp_max > max) - { - max = tmp_max; - max_x = x; - } - } - tmp_max = layerBelow.getAgastScore(x1, y_1, 1); - if (tmp_max > threshold) - return 0; - if (tmp_max > max) - { - max = tmp_max; - max_x = int(x1); - } - - // middle rows - for (int y = y_1 + 1; y <= int(y1); y++) - { - tmp_max = layerBelow.getAgastScore(x_1, float(y), 1); - if (tmp_max > threshold) - return 0; - if (tmp_max > max) - { - max = tmp_max; - max_x = int(x_1 + 1); - max_y = y; - } - for (int x = x_1 + 1; x <= int(x1); x++) - { - tmp_max = layerBelow.getAgastScore(x, y, 1); - if (tmp_max > threshold) - return 0; - if (tmp_max == max) - { - const int t1 = 2 - * (layerBelow.getAgastScore(x - 1, y, 1) + layerBelow.getAgastScore(x + 1, y, 1) - + layerBelow.getAgastScore(x, y + 1, 1) + layerBelow.getAgastScore(x, y - 1, 1)) - + (layerBelow.getAgastScore(x + 1, y + 1, 1) + layerBelow.getAgastScore(x - 1, y + 1, 1) - + layerBelow.getAgastScore(x + 1, y - 1, 1) + layerBelow.getAgastScore(x - 1, y - 1, 1)); - const int t2 = 2 - * (layerBelow.getAgastScore(max_x - 1, max_y, 1) + layerBelow.getAgastScore(max_x + 1, max_y, 1) - + layerBelow.getAgastScore(max_x, max_y + 1, 1) + layerBelow.getAgastScore(max_x, max_y - 1, 1)) - + (layerBelow.getAgastScore(max_x + 1, max_y + 1, 1) + layerBelow.getAgastScore(max_x - 1, - max_y + 1, 1) - + layerBelow.getAgastScore(max_x + 1, max_y - 1, 1) - + layerBelow.getAgastScore(max_x - 1, max_y - 1, 1)); - if (t1 > t2) - { - max_x = x; - max_y = y; - } - } - if (tmp_max > max) - { - max = tmp_max; - max_x = x; - max_y = y; - } - } - tmp_max = layerBelow.getAgastScore(x1, float(y), 1); - if (tmp_max > threshold) - return 0; - if (tmp_max > max) - { - max = tmp_max; - max_x = int(x1); - max_y = y; - } - } - - // bottom row - tmp_max = layerBelow.getAgastScore(x_1, y1, 1); - if (tmp_max > max) - { - max = tmp_max; - max_x = int(x_1 + 1); - max_y = int(y1); - } - for (int x = x_1 + 1; x <= int(x1); x++) - { - tmp_max = layerBelow.getAgastScore(float(x), y1, 1); - if (tmp_max > max) - { - max = tmp_max; - max_x = x; - max_y = int(y1); - } - } - tmp_max = layerBelow.getAgastScore(x1, y1, 1); - if (tmp_max > max) - { - max = tmp_max; - max_x = int(x1); - max_y = int(y1); - } - - //find dx/dy: - register int s_0_0 = layerBelow.getAgastScore(max_x - 1, max_y - 1, 1); - register int s_1_0 = layerBelow.getAgastScore(max_x, max_y - 1, 1); - register int s_2_0 = layerBelow.getAgastScore(max_x + 1, max_y - 1, 1); - register int s_2_1 = layerBelow.getAgastScore(max_x + 1, max_y, 1); - register int s_1_1 = layerBelow.getAgastScore(max_x, max_y, 1); - register int s_0_1 = layerBelow.getAgastScore(max_x - 1, max_y, 1); - register int s_0_2 = layerBelow.getAgastScore(max_x - 1, max_y + 1, 1); - register int s_1_2 = layerBelow.getAgastScore(max_x, max_y + 1, 1); - register int s_2_2 = layerBelow.getAgastScore(max_x + 1, max_y + 1, 1); - float dx_1, dy_1; - float refined_max = subpixel2D(s_0_0, s_0_1, s_0_2, s_1_0, s_1_1, s_1_2, s_2_0, s_2_1, s_2_2, dx_1, dy_1); - - // calculate dx/dy in above coordinates - float real_x = float(max_x) + dx_1; - float real_y = float(max_y) + dy_1; - bool returnrefined = true; - if (layer % 2 == 0) - { - dx = (real_x * 6.0 + 1.0) / 8.0 - float(x_layer); - dy = (real_y * 6.0 + 1.0) / 8.0 - float(y_layer); - } - else - { - dx = (real_x * 4.0 - 1.0) / 6.0 - float(x_layer); - dy = (real_y * 4.0 - 1.0) / 6.0 - float(y_layer); - } - - // saturate - if (dx > 1.0) - { - dx = 1.0; - returnrefined = false; - } - if (dx < -1.0) - { - dx = -1.0; - returnrefined = false; - } - if (dy > 1.0) - { - dy = 1.0; - returnrefined = false; - } - if (dy < -1.0) - { - dy = -1.0; - returnrefined = false; - } - - // done and ok. - ismax = true; - if (returnrefined) - { - return std::max(refined_max, max); - } - return max; -} - inline float BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, float& max) const { @@ -1743,17 +1728,17 @@ BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, flo if (s0 >= s_05 && s0 >= s05) { max = s0; - return 1.0; + return 1.0f; } if (s_05 >= s0 && s_05 >= s05) { max = s_05; - return 0.75; + return 0.75f; } if (s05 >= s0 && s05 >= s_05) { max = s05; - return 1.5; + return 1.5f; } } @@ -1767,7 +1752,7 @@ BriskScaleSpace::refine1D(const float s_05, const float s0, const float s05, flo ret_val = 1.5; // allow to be slightly off bounds ...? int three_c = +24 * i_05 - 27 * i0 + 6 * i05; max = float(three_c) + float(three_a) * ret_val * ret_val + float(three_b) * ret_val; - max /= 3072.0; + max /= 3072.0f; return ret_val; } @@ -1789,17 +1774,17 @@ BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, f if (s0 >= s_05 && s0 >= s05) { max = s0; - return 1.0; + return 1.0f; } if (s_05 >= s0 && s_05 >= s05) { max = s_05; - return 0.6666666666666666666666666667; + return 0.6666666666666666666666666667f; } if (s05 >= s0 && s05 >= s_05) { max = s05; - return 1.3333333333333333333333333333; + return 1.3333333333333333333333333333f; } } @@ -1807,13 +1792,13 @@ BriskScaleSpace::refine1D_1(const float s_05, const float s0, const float s05, f // calculate max location: float ret_val = -float(two_b) / float(2 * two_a); // saturate and return - if (ret_val < 0.6666666666666666666666666667) - ret_val = 0.666666666666666666666666667; - else if (ret_val > 1.33333333333333333333333333) - ret_val = 1.333333333333333333333333333; + if (ret_val < 0.6666666666666666666666666667f) + ret_val = 0.666666666666666666666666667f; + else if (ret_val > 1.33333333333333333333333333f) + ret_val = 1.333333333333333333333333333f; int two_c = +12 * i_05 - 16 * i0 + 6 * i05; max = float(two_c) + float(two_a) * ret_val * ret_val + float(two_b) * ret_val; - max /= 2048.0; + max /= 2048.0f; return ret_val; } @@ -1835,17 +1820,17 @@ BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, f if (s0 >= s_05 && s0 >= s05) { max = s0; - return 1.0; + return 1.0f; } if (s_05 >= s0 && s_05 >= s05) { max = s_05; - return 0.7; + return 0.7f; } if (s05 >= s0 && s05 >= s_05) { max = s05; - return 1.5; + return 1.5f; } } @@ -1853,10 +1838,10 @@ BriskScaleSpace::refine1D_2(const float s_05, const float s0, const float s05, f // calculate max location: float ret_val = -float(b) / float(2 * a); // saturate and return - if (ret_val < 0.7) - ret_val = 0.7; - else if (ret_val > 1.5) - ret_val = 1.5; // allow to be slightly off bounds ...? + if (ret_val < 0.7f) + ret_val = 0.7f; + else if (ret_val > 1.5f) + ret_val = 1.5f; // allow to be slightly off bounds ...? int c = +3 * i_05 - 3 * i0 + 1 * i05; max = float(c) + float(a) * ret_val * ret_val + float(b) * ret_val; max /= 1024; @@ -1870,56 +1855,56 @@ BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, c { // the coefficients of the 2d quadratic function least-squares fit: - register int tmp1 = s_0_0 + s_0_2 - 2 * s_1_1 + s_2_0 + s_2_2; - register int coeff1 = 3 * (tmp1 + s_0_1 - ((s_1_0 + s_1_2) << 1) + s_2_1); - register int coeff2 = 3 * (tmp1 - ((s_0_1 + s_2_1) << 1) + s_1_0 + s_1_2); - register int tmp2 = s_0_2 - s_2_0; - register int tmp3 = (s_0_0 + tmp2 - s_2_2); - register int tmp4 = tmp3 - 2 * tmp2; - register int coeff3 = -3 * (tmp3 + s_0_1 - s_2_1); - register int coeff4 = -3 * (tmp4 + s_1_0 - s_1_2); - register int coeff5 = (s_0_0 - s_0_2 - s_2_0 + s_2_2) << 2; - register int coeff6 = -(s_0_0 + s_0_2 - ((s_1_0 + s_0_1 + s_1_2 + s_2_1) << 1) - 5 * s_1_1 + s_2_0 + s_2_2) << 1; + int tmp1 = s_0_0 + s_0_2 - 2 * s_1_1 + s_2_0 + s_2_2; + int coeff1 = 3 * (tmp1 + s_0_1 - ((s_1_0 + s_1_2) << 1) + s_2_1); + int coeff2 = 3 * (tmp1 - ((s_0_1 + s_2_1) << 1) + s_1_0 + s_1_2); + int tmp2 = s_0_2 - s_2_0; + int tmp3 = (s_0_0 + tmp2 - s_2_2); + int tmp4 = tmp3 - 2 * tmp2; + int coeff3 = -3 * (tmp3 + s_0_1 - s_2_1); + int coeff4 = -3 * (tmp4 + s_1_0 - s_1_2); + int coeff5 = (s_0_0 - s_0_2 - s_2_0 + s_2_2) << 2; + int coeff6 = -(s_0_0 + s_0_2 - ((s_1_0 + s_0_1 + s_1_2 + s_2_1) << 1) - 5 * s_1_1 + s_2_0 + s_2_2) << 1; // 2nd derivative test: - register int H_det = 4 * coeff1 * coeff2 - coeff5 * coeff5; + int H_det = 4 * coeff1 * coeff2 - coeff5 * coeff5; if (H_det == 0) { - delta_x = 0.0; - delta_y = 0.0; - return float(coeff6) / 18.0; + delta_x = 0.0f; + delta_y = 0.0f; + return float(coeff6) / 18.0f; } if (!(H_det > 0 && coeff1 < 0)) { // The maximum must be at the one of the 4 patch corners. int tmp_max = coeff3 + coeff4 + coeff5; - delta_x = 1.0; - delta_y = 1.0; + delta_x = 1.0f; + delta_y = 1.0f; int tmp = -coeff3 + coeff4 - coeff5; if (tmp > tmp_max) { tmp_max = tmp; - delta_x = -1.0; - delta_y = 1.0; + delta_x = -1.0f; + delta_y = 1.0f; } tmp = coeff3 - coeff4 - coeff5; if (tmp > tmp_max) { tmp_max = tmp; - delta_x = 1.0; - delta_y = -1.0; + delta_x = 1.0f; + delta_y = -1.0f; } tmp = -coeff3 - coeff4 + coeff5; if (tmp > tmp_max) { tmp_max = tmp; - delta_x = -1.0; - delta_y = -1.0; + delta_x = -1.0f; + delta_y = -1.0f; } - return float(tmp_max + coeff1 + coeff2 + coeff6) / 18.0; + return float(tmp_max + coeff1 + coeff2 + coeff6) / 18.0f; } // this is hopefully the normal outcome of the Hessian test @@ -1942,50 +1927,50 @@ BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, c if (tx || tx_ || ty || ty_) { // get two candidates: - float delta_x1 = 0.0, delta_x2 = 0.0, delta_y1 = 0.0, delta_y2 = 0.0; + float delta_x1 = 0.0f, delta_x2 = 0.0f, delta_y1 = 0.0f, delta_y2 = 0.0f; if (tx) { - delta_x1 = 1.0; + delta_x1 = 1.0f; delta_y1 = -float(coeff4 + coeff5) / float(2 * coeff2); - if (delta_y1 > 1.0) - delta_y1 = 1.0; - else if (delta_y1 < -1.0) - delta_y1 = -1.0; + if (delta_y1 > 1.0f) + delta_y1 = 1.0f; + else if (delta_y1 < -1.0f) + delta_y1 = -1.0f; } else if (tx_) { - delta_x1 = -1.0; + delta_x1 = -1.0f; delta_y1 = -float(coeff4 - coeff5) / float(2 * coeff2); - if (delta_y1 > 1.0) - delta_y1 = 1.0; + if (delta_y1 > 1.0f) + delta_y1 = 1.0f; else if (delta_y1 < -1.0) - delta_y1 = -1.0; + delta_y1 = -1.0f; } if (ty) { - delta_y2 = 1.0; + delta_y2 = 1.0f; delta_x2 = -float(coeff3 + coeff5) / float(2 * coeff1); - if (delta_x2 > 1.0) - delta_x2 = 1.0; - else if (delta_x2 < -1.0) - delta_x2 = -1.0; + if (delta_x2 > 1.0f) + delta_x2 = 1.0f; + else if (delta_x2 < -1.0f) + delta_x2 = -1.0f; } else if (ty_) { - delta_y2 = -1.0; + delta_y2 = -1.0f; delta_x2 = -float(coeff3 - coeff5) / float(2 * coeff1); - if (delta_x2 > 1.0) - delta_x2 = 1.0; - else if (delta_x2 < -1.0) - delta_x2 = -1.0; + if (delta_x2 > 1.0f) + delta_x2 = 1.0f; + else if (delta_x2 < -1.0f) + delta_x2 = -1.0f; } // insert both options for evaluation which to pick float max1 = (coeff1 * delta_x1 * delta_x1 + coeff2 * delta_y1 * delta_y1 + coeff3 * delta_x1 + coeff4 * delta_y1 + coeff5 * delta_x1 * delta_y1 + coeff6) - / 18.0; + / 18.0f; float max2 = (coeff1 * delta_x2 * delta_x2 + coeff2 * delta_y2 * delta_y2 + coeff3 * delta_x2 + coeff4 * delta_y2 + coeff5 * delta_x2 * delta_y2 + coeff6) - / 18.0; + / 18.0f; if (max1 > max2) { delta_x = delta_x1; @@ -2003,7 +1988,7 @@ BriskScaleSpace::subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, c // this is the case of the maximum inside the boundaries: return (coeff1 * delta_x * delta_x + coeff2 * delta_y * delta_y + coeff3 * delta_x + coeff4 * delta_y + coeff5 * delta_x * delta_y + coeff6) - / 18.0; + / 18.0f; } // construct a layer @@ -2016,8 +2001,8 @@ BriskLayer::BriskLayer(const cv::Mat& img_in, float scale_in, float offset_in) offset_ = offset_in; // create an agast detector fast_9_16_ = new FastFeatureDetector(1, true, FastFeatureDetector::TYPE_9_16); - makeOffsets(pixel_5_8_, img_.step, 8); - makeOffsets(pixel_9_16_, img_.step, 16); + makeOffsets(pixel_5_8_, (int)img_.step, 8); + makeOffsets(pixel_9_16_, (int)img_.step, 16); } // derive a layer BriskLayer::BriskLayer(const BriskLayer& layer, int mode) @@ -2027,68 +2012,69 @@ BriskLayer::BriskLayer(const BriskLayer& layer, int mode) img_.create(layer.img().rows / 2, layer.img().cols / 2, CV_8U); halfsample(layer.img(), img_); scale_ = layer.scale() * 2; - offset_ = 0.5 * scale_ - 0.5; + offset_ = 0.5f * scale_ - 0.5f; } else { img_.create(2 * (layer.img().rows / 3), 2 * (layer.img().cols / 3), CV_8U); twothirdsample(layer.img(), img_); - scale_ = layer.scale() * 1.5; - offset_ = 0.5 * scale_ - 0.5; + scale_ = layer.scale() * 1.5f; + offset_ = 0.5f * scale_ - 0.5f; } scores_ = cv::Mat::zeros(img_.rows, img_.cols, CV_8U); fast_9_16_ = new FastFeatureDetector(1, false, FastFeatureDetector::TYPE_9_16); - makeOffsets(pixel_5_8_, img_.step, 8); - makeOffsets(pixel_9_16_, img_.step, 16); + makeOffsets(pixel_5_8_, (int)img_.step, 8); + makeOffsets(pixel_9_16_, (int)img_.step, 16); } // Fast/Agast // wraps the agast class void -BriskLayer::getAgastPoints(uint8_t threshold, std::vector& keypoints) +BriskLayer::getAgastPoints(int threshold, std::vector& keypoints) { fast_9_16_->set("threshold", threshold); fast_9_16_->detect(img_, keypoints); // also write scores - const int num = keypoints.size(); + const size_t num = keypoints.size(); - for (int i = 0; i < num; i++) - scores_(keypoints[i].pt.y, keypoints[i].pt.x) = keypoints[i].response; + for (size_t i = 0; i < num; i++) + scores_((int)keypoints[i].pt.y, (int)keypoints[i].pt.x) = saturate_cast(keypoints[i].response); } -inline uint8_t -BriskLayer::getAgastScore(int x, int y, uint8_t threshold) const + +inline int +BriskLayer::getAgastScore(int x, int y, int threshold) const { if (x < 3 || y < 3) return 0; if (x >= img_.cols - 3 || y >= img_.rows - 3) return 0; - uint8_t& score = *(scores_.data + x + y * scores_.cols); + uchar& score = (uchar&)scores_(y, x); if (score > 2) { return score; } - score = cornerScore<16>(img_.data + x + y * img_.cols, pixel_9_16_, threshold - 1); + score = (uchar)cornerScore<16>(&img_.at(y, x), pixel_9_16_, threshold - 1); if (score < threshold) score = 0; return score; } -inline uint8_t -BriskLayer::getAgastScore_5_8(int x, int y, uint8_t threshold) const +inline int +BriskLayer::getAgastScore_5_8(int x, int y, int threshold) const { if (x < 2 || y < 2) return 0; if (x >= img_.cols - 2 || y >= img_.rows - 2) return 0; - uint8_t score = cornerScore<8>(img_.data + x + y * img_.cols, pixel_5_8_, threshold - 1); + int score = cornerScore<8>(&img_.at(y, x), pixel_5_8_, threshold - 1); if (score < threshold) score = 0; return score; } -inline uint8_t -BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_in) const +inline int +BriskLayer::getAgastScore(float xf, float yf, int threshold_in, float scale_in) const { if (scale_in <= 1.0f) { @@ -2100,8 +2086,8 @@ BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_ const float ry1 = yf - float(y); const float ry = 1.0f - ry1; - return rx * ry * getAgastScore(x, y, threshold_in) + rx1 * ry * getAgastScore(x + 1, y, threshold_in) - + rx * ry1 * getAgastScore(x, y + 1, threshold_in) + rx1 * ry1 * getAgastScore(x + 1, y + 1, threshold_in); + return (uchar)(rx * ry * getAgastScore(x, y, threshold_in) + rx1 * ry * getAgastScore(x + 1, y, threshold_in) + + rx * ry1 * getAgastScore(x, y + 1, threshold_in) + rx1 * ry1 * getAgastScore(x + 1, y + 1, threshold_in)); } else { @@ -2121,26 +2107,26 @@ BriskLayer::getAgastScore(float xf, float yf, uint8_t threshold_in, float scale_ } // access gray values (smoothed/interpolated) -inline uint8_t +inline int BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) const { assert(!mat.empty()); // get the position - const int x = floor(xf); - const int y = floor(yf); + const int x = cvFloor(xf); + const int y = cvFloor(yf); const cv::Mat& image = mat; const int& imagecols = image.cols; // get the sigma_half: const float sigma_half = scale_in / 2; - const float area = 4.0 * sigma_half * sigma_half; + const float area = 4.0f * sigma_half * sigma_half; // calculate output: int ret_val; if (sigma_half < 0.5) { //interpolation multipliers: - const int r_x = (xf - x) * 1024; - const int r_y = (yf - y) * 1024; + const int r_x = (int)((xf - x) * 1024); + const int r_y = (int)((yf - y) * 1024); const int r_x_1 = (1024 - r_x); const int r_y_1 = (1024 - r_y); uchar* ptr = image.data + x + y * imagecols; @@ -2158,8 +2144,8 @@ BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) const // this is the standard case (simple, not speed optimized yet): // scaling: - const int scaling = 4194304.0 / area; - const int scaling2 = float(scaling) * area / 1024.0; + const int scaling = (int)(4194304.0f / area); + const int scaling2 = (int)(float(scaling) * area / 1024.0f); // calculate borders const float x_1 = xf - sigma_half; @@ -2173,20 +2159,20 @@ BriskLayer::value(const cv::Mat& mat, float xf, float yf, float scale_in) const const int y_bottom = int(y1 + 0.5); // overlap area - multiplication factors: - const float r_x_1 = float(x_left) - x_1 + 0.5; - const float r_y_1 = float(y_top) - y_1 + 0.5; - const float r_x1 = x1 - float(x_right) + 0.5; - const float r_y1 = y1 - float(y_bottom) + 0.5; + const float r_x_1 = float(x_left) - x_1 + 0.5f; + const float r_y_1 = float(y_top) - y_1 + 0.5f; + const float r_x1 = x1 - float(x_right) + 0.5f; + const float r_y1 = y1 - float(y_bottom) + 0.5f; const int dx = x_right - x_left - 1; const int dy = y_bottom - y_top - 1; - const int A = (r_x_1 * r_y_1) * scaling; - const int B = (r_x1 * r_y_1) * scaling; - const int C = (r_x1 * r_y1) * scaling; - const int D = (r_x_1 * r_y1) * scaling; - const int r_x_1_i = r_x_1 * scaling; - const int r_y_1_i = r_y_1 * scaling; - const int r_x1_i = r_x1 * scaling; - const int r_y1_i = r_y1 * scaling; + const int A = (int)((r_x_1 * r_y_1) * scaling); + const int B = (int)((r_x1 * r_y_1) * scaling); + const int C = (int)((r_x1 * r_y1) * scaling); + const int D = (int)((r_x_1 * r_y1) * scaling); + const int r_x_1_i = (int)(r_x_1 * scaling); + const int r_y_1_i = (int)(r_y_1 * scaling); + const int r_x1_i = (int)(r_x1 * scaling); + const int r_y1_i = (int)(r_y1 * scaling); // now the calculation: uchar* ptr = image.data + x_left + imagecols * y_top; diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index ac0bb61f1..cbe9e29b1 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -1314,7 +1314,7 @@ public: ssize.width *= cn; int dy, dx, k = 0; - VecOp vop(scale_x, scale_y, src.channels(), src.step/*, area_ofs*/); + VecOp vop(scale_x, scale_y, src.channels(), (int)src.step/*, area_ofs*/); for( dy = range.start; dy < range.end; dy++ ) { From 52b4b5b052880b2b6bec2df193b9ef559f7b8921 Mon Sep 17 00:00:00 2001 From: Alexandre Benoit Date: Thu, 30 Aug 2012 16:02:04 +0200 Subject: [PATCH 053/103] added retina module documentation --- modules/contrib/doc/contrib.rst | 1 + modules/contrib/doc/retina/index.rst | 246 +++++++++++++++++++++++++++ 2 files changed, 247 insertions(+) create mode 100644 modules/contrib/doc/retina/index.rst diff --git a/modules/contrib/doc/contrib.rst b/modules/contrib/doc/contrib.rst index 201190dd2..85a55a346 100644 --- a/modules/contrib/doc/contrib.rst +++ b/modules/contrib/doc/contrib.rst @@ -9,3 +9,4 @@ The module contains some recently added functionality that has not been stabiliz stereo FaceRecognizer Documentation + retina Documentation diff --git a/modules/contrib/doc/retina/index.rst b/modules/contrib/doc/retina/index.rst new file mode 100644 index 000000000..f8bdbc77d --- /dev/null +++ b/modules/contrib/doc/retina/index.rst @@ -0,0 +1,246 @@ +Bio mimetic human retina model +============================== + +class which allows the Gipsa/Listic Labs model to be used. This retina model allows spatio-temporal image processing (applied on still images, images sequences and video sequences). Briefly, here are the main human retina model properties: +* spectral whithening (mid-frequency details enhancement) +* high frequency spatio-temporal noise reduction (temporal noise and high frequency spatial noise are minimized) +* low frequency luminance reduction (luminance range compression) : high luminance regions do not hide details in darker regions anymore +* local logarithmic luminance compression allows details to be enhanced even in low light conditions + +USE : this model can be used basically for spatio-temporal video effects but also for : +* by using the getParvo methods : perform texture analysis with enhanced signal to noise ratio and enhanced details robust against input images luminance ranges +* by using the getMagno methods : perform motion analysis also taking benefit of the previously cited properties + +for more information, refer to the following papers : Benoit A., Caplier A., DurettF B., Herault, J., "USING HUMAN VISUAL SYSTEM MODELING FOR BIO-INSPIRED LOW LEVEL IMAGE PROCESSING", Elsevier, Computer Vision and Image Understanding 114 (2010), pp. 758-773 +DOI +Please have a look at the reference work of Jeanny Herault that you can read in his book : +Vision: Images, Signals and Neural Networks: Models of Neural Processing in Visual Perception (Progress in Neural Processing),By: Jeanny Herault, ISBN: 9814273686. WAPI (Tower ID): 113266891. + +This retina filter code includes the research contributions of phd/research collegues from which code has been redrawn by the author : +* take a look at the retinacolor.hpp module to discover Brice Chaix de Lavarene phD color mosaicing/demosaicing and his reference paper: B. Chaix de Lavarene, D. Alleysson, B. Durette, J. Herault (2007). "Efficient demosaicing through recursive filtering", IEEE International Conference on Image Processing ICIP 2007 +* take a look at imagelogpolprojection.hpp to discover retina spatial log sampling which originates from Barthelemy Durette phd with Jeanny Herault. A Retina / V1 cortex projection is also proposed and originates from Jeanny's discussions. ====> more informations in the above cited Jeanny Heraults's book. + +.. highlight:: cpp + +Retina +------ + +.. ocv:class:: Retina + +Class that provides the main controls to the human retina model, it includes protected buffer conversion methods (cv::mat <-> std::valarray) +The retina can be settled up with various parameters, by default, the retina cancels mean luminance and enforces all details of the visual scene. In order to use your own parameters, you can use at least on time the write(std::string fs) method which will write a proper XML file with all default parameters. Then, tweak it on your own and reload them at any time using method setup(std::string fs). These methods update a cv::Retina::RetinaParameters struct that is described hereafter. + + class Retina + { + class RetinaParameters; // this class is detailled later + + Retina (Size inputSize); + Retina (Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod=RETINA_COLOR_BAYER, const bool useRetinaLogSampling=false, const double reductionFactor=1.0, const double samplingStrenght=10.0); + Size inputSize (); + Size outputSize (); + void setup (std::string retinaParameterFile="", const bool applyDefaultSetupOnFailure=true); + void setup (cv::FileStorage &fs, const bool applyDefaultSetupOnFailure=true); + void setup (RetinaParameters newParameters); + struct Retina::RetinaParameters getParameters (); + const std::string printSetup (); + virtual void write (std::string fs) const; + virtual void write (FileStorage &fs) const; + void setupOPLandIPLParvoChannel (const bool colorMode=true, const bool normaliseOutput=true, const float photoreceptorsLocalAdaptationSensitivity=0.7, const float photoreceptorsTemporalConstant=0.5, const float photoreceptorsSpatialConstant=0.53, const float horizontalCellsGain=0, const float HcellsTemporalConstant=1, const float HcellsSpatialConstant=7, const float ganglionCellsSensitivity=0.7); + void setupIPLMagnoChannel (const bool normaliseOutput=true, const float parasolCells_beta=0, const float parasolCells_tau=0, const float parasolCells_k=7, const float amacrinCellsTemporalCutFrequency=1.2, const float V0CompressionParameter=0.95, const float localAdaptintegration_tau=0, const float localAdaptintegration_k=7); + void run (const Mat &inputImage); + void getParvo (Mat &retinaOutput_parvo); + void getParvo (std::valarray< float > &retinaOutput_parvo); + void getMagno (Mat &retinaOutput_magno); + void getMagno (std::valarray< float > &retinaOutput_magno); + const std::valarray< float > & getMagno () const; + const std::valarray< float > & getParvo () const; + void setColorSaturation (const bool saturateColors=true, const float colorSaturationValue=4.0); + void clearBuffers (); + void activateMovingContoursProcessing (const bool activate); + void activateContoursProcessing (const bool activate); + + }; + +Retina::Retina +-------------- + +.. ocv:function:: Retina::Retina(Size inputSize) +.. ocv:function:: Retina::Retina(Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod = RETINA_COLOR_BAYER, const bool useRetinaLogSampling = false, const double reductionFactor = 1.0, const double samplingStrenght = 10.0 ) + Constructors + :param inputSize: the input frame size + :param colorMode: the chosen processing mode : with or without color processing + :param colorSamplingMethod: specifies which kind of color sampling will be used + * RETINA_COLOR_RANDOM: each pixel position is either R, G or B in a random choice + * RETINA_COLOR_DIAGONAL: color sampling is RGBRGBRGB..., line 2 BRGBRGBRG..., line 3, GBRGBRGBR... + * RETINA_COLOR_BAYER: standard bayer sampling + :param useRetinaLogSampling: activate retina log sampling, if true, the 2 following parameters can be used + :param reductionFactor: only usefull if param useRetinaLogSampling=true, specifies the reduction factor of the output frame (as the center (fovea) is high resolution and corners can be underscaled, then a reduction of the output is allowed without precision leak + :param samplingStrenght: only usefull if param useRetinaLogSampling=true, specifies the strenght of the log scale that is applied + +Retina::activateContoursProcessing +---------------------------------- + +.. ocv:function:: void cv::Retina::activateContoursProcessing(const bool activate) + Activate/desactivate the Parvocellular pathway processing (contours information extraction), by default, it is activated + :param activate: true if Parvocellular (contours information extraction) output should be activated, false if not... if activated, the Parvocellular output can be retrieved using the getParvo methods + +Retina::activateMovingContoursProcessing +---------------------------------------- + +.. ocv:function:: void cv::Retina::activateMovingContoursProcessing(const bool activate) + Activate/desactivate the Magnocellular pathway processing (motion information extraction), by default, it is activated + :param activate:true if Magnocellular output should be activated, false if not... if activated, the Magnocellular output can be retrieved using the getMagno methods + +Retina::clearBuffers +-------------------- + +.. ocv:function:: void cv::Retina::clearBuffers() + Clears all retina buffers (equivalent to opening the eyes after a long period of eye close ;o) whatchout the temporal transition occuring just after this method call, some classical visual illusions can be explained + +Retina::getParvo +---------------- + +.. ocv:function:: void cv::Retina::getParvo(Mat & retinaOutput_parvo) +.. ocv:function:: void cv::Retina::getParvo(std::valarray< float > & retinaOutput_parvo ) + Accessor of the details channel of the retina (models foveal vision) + :param retinaOutput_parvo: the output buffer (reallocated if necessary), format can be : + * a cv::Mat, this output is rescaled for standard 8bits image processing use in OpenCV + * a 1D std::valarray Buffer (encoding is R1, R2, ... Rn), this output is the original retina filter model output, without any quantification or rescaling + +Retina::getMagno +---------------- + +.. ocv:function:: void cv::Retina::getMagno(Mat & retinaOutput_magno) +.. ocv:function:: void cv::Retina::getMagno(std::valarray< float > & retinaOutput_magno) + Accessor of the motion channel of the retina (models peripheral vision) + :param retinaOutput_magno: the output buffer (reallocated if necessary), format can be : + * a cv::Mat, this output is rescaled for standard 8bits image processing use in OpenCV + * a 1D std::valarray Buffer (encoding is R1, R2, ... Rn), this output is the original retina filter model output, without any quantification or rescaling + +Retina::getParameters +--------------------- + +.. ocv:function:: struct Retina::RetinaParameters cv::Retina::getParameters() + Returns: the current parameters setup + +Retina::inputSize +----------------- + +.. ocv:function:: Size cv::Retina::inputSize() + Retreive retina input buffer size + +Retina::outputSize +------------------ + +.. ocv:function:: Size cv::Retina::outputSize() + Retreive retina output buffer size that can be different from the input if a spatial log transformation is applied + +Retina::printSetup +------------------ + +.. ocv:function:: const std::string cv::Retina::printSetup() + Outputs a string showing the used parameters setup + :return a string which contains formatted parameters information + +Retina::run +----------- + +.. ocv:function:: void cv::Retina::run(const Mat & inputImage) + Method which allows retina to be applied on an input image, after run, encapsulated retina module is ready to deliver its outputs using dedicated acccessors, see getParvo and getMagno methods + :param inputImage: the input cv::Mat image to be processed, can be gray level or BGR coded in any format (from 8bit to 16bits) + +Retina::setColorSaturation +-------------------------- + +.. ocv:function:: void cv::Retina::setColorSaturation(const bool saturateColors = true, const float colorSaturationValue = 4.0 ) + Activate color saturation as the final step of the color demultiplexing process -> this saturation is a sigmoide function applied to each channel of the demultiplexed image. + :param saturateColors,:boolean that activates color saturation (if true) or desactivate (if false) + :param colorSaturationValue: the saturation factor : a simple factor applied on the chrominance buffers + + +Retina::setup +------------- + +.. ocv:function:: void cv::Retina::setup(std::string retinaParameterFile = "", const bool applyDefaultSetupOnFailure = true ) +.. ocv:function:: void cv::Retina::setup(cv::FileStorage & fs, const bool applyDefaultSetupOnFailure = true ) +.. ocv:function:: void cv::Retina::setup(RetinaParameters newParameters) + Try to open an XML retina parameters file to adjust current retina instance setup => if the xml file does not exist, then default setup is applied => warning, Exceptions are thrown if read XML file is not valid + :param retinaParameterFile: the parameters filename + :param applyDefaultSetupOnFailure: set to true if an error must be thrown on error + :param fs: the open Filestorage which contains retina parameters + :param newParameters: a parameters structures updated with the new target configuration + +Retina::write +------------- + +.. ocv:function:: virtual void cv::Retina::write(std::string fs) const [virtual] +.. ocv:function:: virtual void cv::Retina::write(FileStorage & fs) const [virtual] + Write xml/yml formated parameters information + :param fs : the filename of the xml file that will be open and writen with formatted parameters information + +Retina::setupIPLMagnoChannel +---------------------------- + +.. ocv:function:: void cv::Retina::setupIPLMagnoChannel(const bool normaliseOutput = true, const float parasolCells_beta = 0, const float parasolCells_tau = 0, const float parasolCells_k = 7, const float amacrinCellsTemporalCutFrequency = 1.2, const float V0CompressionParameter = 0.95, const float localAdaptintegration_tau = 0, const float localAdaptintegration_k = 7 ) + Set parameters values for the Inner Plexiform Layer (IPL) magnocellular channel this channel processes signals output from OPL processing stage in peripheral vision, it allows motion information enhancement. It is decorrelated from the details channel. See reference papers for more details. + :param normaliseOutput: specifies if (true) output is rescaled between 0 and 255 of not (false) + :param parasolCells_beta: the low pass filter gain used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), typical value is 0 + :param parasolCells_tau: the low pass filter time constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is frame, typical value is 0 (immediate response) + :param parasolCells_k: the low pass filter spatial constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is pixels, typical value is 5 + :param amacrinCellsTemporalCutFrequency: the time constant of the first order high pass fiter of the magnocellular way (motion information channel), unit is frames, tipicall value is 5 + :param V0CompressionParameter: the compression strengh of the ganglion cells local adaptation output, set a value between 160 and 250 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 200 + :param localAdaptintegration_tau: specifies the temporal constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + :param localAdaptintegration_k: specifies the spatial constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + +Retina::setupOPLandIPLParvoChannel +---------------------------------- + +.. ocv:function:: void cv::Retina::setupOPLandIPLParvoChannel(const bool colorMode = true, const bool normaliseOutput = true, const float photoreceptorsLocalAdaptationSensitivity = 0.7, const float photoreceptorsTemporalConstant = 0.5, const float photoreceptorsSpatialConstant = 0.53, const float horizontalCellsGain = 0, const float HcellsTemporalConstant = 1, const float HcellsSpatialConstant = 7, const float ganglionCellsSensitivity = 0.7 ) + Setup the OPL and IPL parvo channels (see biologocal model) OPL is referred as Outer Plexiform Layer of the retina, it allows the spatio-temporal filtering which withens the spectrum and reduces spatio-temporal noise while attenuating global luminance (low frequency energy) IPL parvo is the OPL next processing stage, it refers to a part of the Inner Plexiform layer of the retina, it allows high contours sensitivity in foveal vision. See reference papers for more informations. + :param colorMode: specifies if (true) color is processed of not (false) to then processing gray level image + :param normaliseOutput: specifies if (true) output is rescaled between 0 and 255 of not (false) + :param photoreceptorsLocalAdaptationSensitivity: the photoreceptors sensitivity renage is 0-1 (more log compression effect when value increases) + :param photoreceptorsTemporalConstant: the time constant of the first order low pass filter of the photoreceptors, use it to cut high temporal frequencies (noise or fast motion), unit is frames, typical value is 1 frame + :param photoreceptorsSpatialConstant: the spatial constant of the first order low pass filter of the photoreceptors, use it to cut high spatial frequencies (noise or thick contours), unit is pixels, typical value is 1 pixel + :param horizontalCellsGain:gain of the horizontal cells network, if 0, then the mean value of the output is zero, if the parameter is near 1, then, the luminance is not filtered and is still reachable at the output, typicall value is 0 + :param HcellsTemporalConstant:the time constant of the first order low pass filter of the horizontal cells, use it to cut low temporal frequencies (local luminance variations), unit is frames, typical value is 1 frame, as the photoreceptors + :param HcellsSpatialConstant:the spatial constant of the first order low pass filter of the horizontal cells, use it to cut low spatial frequencies (local luminance), unit is pixels, typical value is 5 pixel, this value is also used for local contrast computing when computing the local contrast adaptation at the ganglion cells level (Inner Plexiform Layer parvocellular channel model) + :param ganglionCellsSensitivity:the compression strengh of the ganglion cells local adaptation output, set a value between 160 and 250 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 230 + + +Retina::RetinaParameters +------------------------ +This structure merges all the parameters that can be adjusted threw the cv::Retina::setupOPLandIPLParvoChannel and cv::Retina::setupIPLMagnoChannel setup methods +Parameters structure for better clarity, check explenations on the comments of methods : setupOPLandIPLParvoChannel and setupIPLMagnoChannel + +.. ocv:class:: RetinaParameters + struct RetinaParameters{ + struct OPLandIplParvoParameters{ // Outer Plexiform Layer (OPL) and Inner Plexiform Layer Parvocellular (IplParvo) parameters + OPLandIplParvoParameters():colorMode(true), + normaliseOutput(true), + photoreceptorsLocalAdaptationSensitivity(0.7f), + photoreceptorsTemporalConstant(0.5f), + photoreceptorsSpatialConstant(0.53f), + horizontalCellsGain(0.0f), + hcellsTemporalConstant(1.f), + hcellsSpatialConstant(7.f), + ganglionCellsSensitivity(0.7f){};// default setup + bool colorMode, normaliseOutput; + float photoreceptorsLocalAdaptationSensitivity, photoreceptorsTemporalConstant, photoreceptorsSpatialConstant, horizontalCellsGain, hcellsTemporalConstant, hcellsSpatialConstant, ganglionCellsSensitivity; + }; + struct IplMagnoParameters{ // Inner Plexiform Layer Magnocellular channel (IplMagno) + IplMagnoParameters(): + normaliseOutput(true), + parasolCells_beta(0.f), + parasolCells_tau(0.f), + parasolCells_k(7.f), + amacrinCellsTemporalCutFrequency(1.2f), + V0CompressionParameter(0.95f), + localAdaptintegration_tau(0.f), + localAdaptintegration_k(7.f){};// default setup + bool normaliseOutput; + float parasolCells_beta, parasolCells_tau, parasolCells_k, amacrinCellsTemporalCutFrequency, V0CompressionParameter, localAdaptintegration_tau, localAdaptintegration_k; + }; + struct OPLandIplParvoParameters OPLandIplParvo; + struct IplMagnoParameters IplMagno; + }; From f02c1ad6882932fdbd7676205216f5add9575ffc Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Thu, 30 Aug 2012 22:48:36 +0400 Subject: [PATCH 054/103] Fix MinGW warning on implicit 'exit' declaration --- 3rdparty/libjpeg/jconfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libjpeg/jconfig.h b/3rdparty/libjpeg/jconfig.h index 025ff5a30..e66cc7747 100644 --- a/3rdparty/libjpeg/jconfig.h +++ b/3rdparty/libjpeg/jconfig.h @@ -9,7 +9,7 @@ /*#undef const*/ #undef CHAR_IS_UNSIGNED -#if !defined WIN32 && !defined _WIN32 +#if defined __MINGW__ || defined __MINGW32__ || (!defined WIN32 && !defined _WIN32) #define HAVE_STDDEF_H #define HAVE_STDLIB_H #endif From ecd96c8b180bfc63bbc61edc1671bb776fb668ae Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Thu, 30 Aug 2012 23:14:09 +0400 Subject: [PATCH 055/103] Fix libjasper build on 32-bit MinGW --- 3rdparty/libjasper/jas_malloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libjasper/jas_malloc.c b/3rdparty/libjasper/jas_malloc.c index 098203613..abb3498d1 100644 --- a/3rdparty/libjasper/jas_malloc.c +++ b/3rdparty/libjasper/jas_malloc.c @@ -78,7 +78,7 @@ #include #include #include -#ifndef _WIN32 +#if !defined _WIN32 || defined __MINGW__ || defined __MINGW32__ #include #endif From 6f6e990988eb2cf41b05c9e89b435dec781df3d6 Mon Sep 17 00:00:00 2001 From: niko Date: Fri, 31 Aug 2012 14:08:52 +0800 Subject: [PATCH 056/103] use mutex provided by opencv itself add getoclcontext and getoclcommandqueue so that other opencl program can interactive with opencv ocl module correct haar test cases add face detection sample --- modules/ocl/include/opencv2/ocl/ocl.hpp | 5 +- modules/ocl/perf/test_haar.cpp | 206 +++++++++------------ modules/ocl/perf/utility.hpp | 6 +- modules/ocl/src/initialization.cpp | 14 +- modules/ocl/src/threadsafe.cpp | 83 --------- modules/ocl/src/threadsafe.h | 92 ---------- modules/ocl/test/test_haar.cpp | 209 +++++++++------------ samples/ocl/facedetect.cpp | 229 ++++++++++++++++++++++++ 8 files changed, 416 insertions(+), 428 deletions(-) delete mode 100644 modules/ocl/src/threadsafe.cpp delete mode 100644 modules/ocl/src/threadsafe.h create mode 100644 samples/ocl/facedetect.cpp diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 1a60a885c..a86f3737d 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -88,7 +88,10 @@ namespace cv //CV_EXPORTS void getComputeCapability(cl_device_id device, int &major, int &minor); //optional function, if you want save opencl binary kernel to the file, set its path CV_EXPORTS void setBinpath(const char *path); - + //The two functions below are used to get opencl runtime so that opencv can interactive with + //other opencl program + CV_EXPORTS void* getoclContext(); + CV_EXPORTS void* getoclCommandQueue(); //////////////////////////////// Error handling //////////////////////// CV_EXPORTS void error(const char *error_string, const char *file, const int line, const char *func); diff --git a/modules/ocl/perf/test_haar.cpp b/modules/ocl/perf/test_haar.cpp index 45a7d4110..b91d30644 100644 --- a/modules/ocl/perf/test_haar.cpp +++ b/modules/ocl/perf/test_haar.cpp @@ -58,141 +58,113 @@ struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } } PARAM_TEST_CASE(HaarTestBase, int, int) { //std::vector oclinfo; - cv::ocl::OclCascadeClassifier cascade, nestedCascade; + cv::ocl::OclCascadeClassifier cascade, nestedCascade; cv::CascadeClassifier cpucascade, cpunestedCascade; -// Mat img; + // Mat img; - double scale; - int index; + double scale; + int index; - virtual void SetUp() - { - scale = 1.1; + virtual void SetUp() + { + scale = 1.0; + index=0; + string cascadeName="../../../data/haarcascades/haarcascade_frontalface_alt.xml"; -#if WIN32 - string cascadeName="E:\\opencvbuffer\\trunk\\data\\haarcascades\\haarcascade_frontalface_alt.xml"; -#else - string cascadeName="../data/haarcascades/haarcascade_frontalface_alt.xml"; -#endif - - if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName))) - { - cout << "ERROR: Could not load classifier cascade" << endl; - cout << "Usage: facedetect [--cascade=]\n" - " [--nested-cascade[=nested_cascade_path]]\n" - " [--scale[=\n" - " [filename|camera_index]\n" << endl ; - - return; - } - //int devnums = getDevice(oclinfo); - //CV_Assert(devnums>0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); - //cv::ocl::setBinpath("E:\\"); - } + if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName))) + { + cout << "ERROR: Could not load classifier cascade" << endl; + cout << "Usage: facedetect [--cascade=]\n" + " [--scale[=\n" + " [filename|camera_index]\n" << endl ; + return; + } + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums>0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath("E:\\"); + } }; ////////////////////////////////faceDetect///////////////////////////////////////////////// struct Haar : HaarTestBase {}; -TEST_P(Haar, FaceDetect) +TEST_F(Haar, FaceDetect) { - for(int index = 1;index < 2; index++) - { - Mat img; - char buff[256]; -#if WIN32 - sprintf(buff,"E:\\myDataBase\\%d.jpg",index); - img = imread( buff, 1 ); -#else - sprintf(buff,"%d.jpg",index); - img = imread( buff, 1 ); - std::cout << "Now test " << index << ".jpg" < faces; + if(img.empty()) + { + std::cout << "Couldn't read test" << index <<".jpg" << std::endl; + return ; + } - const static Scalar colors[] = { CV_RGB(0,0,255), - CV_RGB(0,128,255), - CV_RGB(0,255,255), - CV_RGB(0,255,0), - CV_RGB(255,128,0), - CV_RGB(255,255,0), - CV_RGB(255,0,0), - CV_RGB(255,0,255)} ; + int i = 0; + double t = 0; + vector faces, oclfaces; - Mat gray, smallImg(cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); - MemStorage storage(cvCreateMemStorage(0)); - cvtColor( img, gray, CV_BGR2GRAY ); - resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); - equalizeHist( smallImg, smallImg ); - CvMat _image = smallImg; + const static Scalar colors[] = { CV_RGB(0,0,255), + CV_RGB(0,128,255), + CV_RGB(0,255,255), + CV_RGB(0,255,0), + CV_RGB(255,128,0), + CV_RGB(255,255,0), + CV_RGB(255,0,0), + CV_RGB(255,0,255)} ; - Mat tempimg(&_image, false); + Mat gray, smallImg(cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); + MemStorage storage(cvCreateMemStorage(0)); + cvtColor( img, gray, CV_BGR2GRAY ); + resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); + equalizeHist( smallImg, smallImg ); - cv::ocl::oclMat image(tempimg); - CvSeq* _objects; + t = (double)cvGetTickCount(); + for(int k= 0; k vecAvgComp; + Seq(_objects).copyTo(vecAvgComp); + oclfaces.resize(vecAvgComp.size()); + std::transform(vecAvgComp.begin(), vecAvgComp.end(), oclfaces.begin(), getRect()); - t = (double)cvGetTickCount() - t ; - printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - } + //for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) + //{ + // Mat smallImgROI; + // Point center; + // Scalar color = colors[i%8]; + // int radius; + // center.x = cvRound((r->x + r->width*0.5)*scale); + // center.y = cvRound((r->y + r->height*0.5)*scale); + // radius = cvRound((r->width + r->height)*0.25*scale); + // circle( img, center, radius, color, 3, 8, 0 ); + //} + //namedWindow("result"); + //imshow("result",img); + //waitKey(0); + //destroyAllWindows(); -#else - cpucascade.detectMultiScale( image, faces, 1.1, - 2, 0 - |CV_HAAR_SCALE_IMAGE - , Size(30,30), Size(0, 0) ); - -#endif - vector vecAvgComp; - Seq(_objects).copyTo(vecAvgComp); - faces.resize(vecAvgComp.size()); - std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect()); - - for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) - { - Mat smallImgROI; - vector nestedObjects; - Point center; - Scalar color = colors[i%8]; - int radius; - center.x = cvRound((r->x + r->width*0.5)*scale); - center.y = cvRound((r->y + r->height*0.5)*scale); - radius = cvRound((r->width + r->height)*0.25*scale); - circle( img, center, radius, color, 3, 8, 0 ); - } - -#if WIN32 - sprintf(buff,"E:\\result1\\%d.jpg",index); - imwrite(buff,img); -#else - sprintf(buff,"testdet_%d.jpg",index); - imwrite(buff,img); -#endif - } } - - -//INSTANTIATE_TEST_CASE_P(HaarTestBase, Haar, Combine(Values(1), -// Values(1))); - - #endif // HAVE_OPENCL diff --git a/modules/ocl/perf/utility.hpp b/modules/ocl/perf/utility.hpp index 8ab243a49..8c1454458 100644 --- a/modules/ocl/perf/utility.hpp +++ b/modules/ocl/perf/utility.hpp @@ -45,10 +45,10 @@ #ifdef PRINT_KERNEL_RUN_TIME #define LOOP_TIMES 1 #else -#define LOOP_TIMES 1 +#define LOOP_TIMES 100 #endif -#define MWIDTH 256 -#define MHEIGHT 256 +#define MWIDTH 1920 +#define MHEIGHT 1080 #define CLBINPATH ".\\" #define LOOPROISTART 0 #define LOOPROIEND 1 diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 6d2eaf372..5075d3093 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -44,7 +44,6 @@ //M*/ #include "precomp.hpp" -#include "threadsafe.h" #include #include "binarycaching.hpp" @@ -348,7 +347,14 @@ namespace cv } Context::setContext(oclinfo); } - + void* getoclContext() + { + return &(Context::getContext()->impl->clContext); + } + void* getoclCommandQueue() + { + return &(Context::getContext()->impl->clCmdQueue); + } void openCLReadBuffer(Context *clCxt, cl_mem dst_buffer, void *host_buffer, size_t size) { cl_int status; @@ -772,12 +778,12 @@ namespace cv /////////////////////////////OpenCL initialization///////////////// auto_ptr Context::clCxt; int Context::val = 0; - CriticalSection cs; + Mutex cs; Context *Context::getContext() { if(val == 0) { - myAutoLock al(&cs); + AutoLock al(cs); if( NULL == clCxt.get()) clCxt.reset(new Context); diff --git a/modules/ocl/src/threadsafe.cpp b/modules/ocl/src/threadsafe.cpp deleted file mode 100644 index 25b3773e0..000000000 --- a/modules/ocl/src/threadsafe.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Niko Li, newlife20080214@gmail.com -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other oclMaterials provided with the distribution. -// -// * The name of the copyright holders may not 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 Intel Corporation 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. -// -//M*/ - -//#include "precomp.hpp" -#include "threadsafe.h" - -CriticalSection::CriticalSection() -{ -#if defined WIN32 || defined _WIN32 - InitializeCriticalSection(&m_CritSec); -#else - pthread_mutex_init(&m_CritSec, NULL); -#endif -} - -CriticalSection::~CriticalSection() -{ -#if defined WIN32 || defined _WIN32 - DeleteCriticalSection(&m_CritSec); -#else - pthread_mutex_destroy(&m_CritSec); -#endif -} - -void CriticalSection::Lock() -{ -#if defined WIN32 || defined _WIN32 - EnterCriticalSection(&m_CritSec); -#else - pthread_mutex_lock(&m_CritSec); -#endif -} - -void CriticalSection::Unlock() -{ -#if defined WIN32 || defined _WIN32 - LeaveCriticalSection(&m_CritSec); -#else - pthread_mutex_unlock(&m_CritSec); -#endif -} diff --git a/modules/ocl/src/threadsafe.h b/modules/ocl/src/threadsafe.h deleted file mode 100644 index 5905a5517..000000000 --- a/modules/ocl/src/threadsafe.h +++ /dev/null @@ -1,92 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other GpuMaterials provided with the distribution. -// -// * The name of the copyright holders may not 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 Intel Corporation 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. -// -//M*/ - -#if defined WIN32 || defined _WIN32 -#include -#undef min -#undef max -#else -#include -#endif - -class CriticalSection -{ -public: - CriticalSection(); - ~CriticalSection(); - // Jia Haipeng, jiahaipeng95@gmail.com - void Lock(); - void Unlock(); -protected: -#if defined WIN32 || defined _WIN32 - CRITICAL_SECTION m_CritSec; -#else - pthread_mutex_t m_CritSec; -#endif -}; - -class myAutoLock -{ -public: - explicit myAutoLock(CriticalSection *lock) - { - m_lock = lock; - m_lock->Lock(); - }; - ~myAutoLock() - { - m_lock->Unlock(); - }; -protected: - CriticalSection *m_lock; -}; - - - - - - - - - - diff --git a/modules/ocl/test/test_haar.cpp b/modules/ocl/test/test_haar.cpp index 5499fcd20..59faffe91 100644 --- a/modules/ocl/test/test_haar.cpp +++ b/modules/ocl/test/test_haar.cpp @@ -53,154 +53,107 @@ using namespace testing; using namespace std; using namespace cv; -struct getRect -{ - Rect operator ()(const CvAvgComp &e) const - { - return e.rect; - } -}; +struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } }; PARAM_TEST_CASE(HaarTestBase, int, int) { //std::vector oclinfo; - cv::ocl::OclCascadeClassifier cascade, nestedCascade; - cv::CascadeClassifier cpucascade, cpunestedCascade; - // Mat img; + cv::ocl::OclCascadeClassifier cascade, nestedCascade; + cv::CascadeClassifier cpucascade, cpunestedCascade; + // Mat img; - double scale; - int index; + double scale; + int index; - virtual void SetUp() - { - scale = 1.1; + virtual void SetUp() + { + scale = 1.0; + index=0; + string cascadeName="../../../data/haarcascades/haarcascade_frontalface_alt.xml"; -#if WIN32 - string cascadeName = "E:\\opencvbuffer\\trunk\\data\\haarcascades\\haarcascade_frontalface_alt.xml"; -#else - string cascadeName = "../data/haarcascades/haarcascade_frontalface_alt.xml"; -#endif - - if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName))) - { - cout << "ERROR: Could not load classifier cascade" << endl; - cout << "Usage: facedetect [--cascade=]\n" - " [--nested-cascade[=nested_cascade_path]]\n" - " [--scale[=\n" - " [filename|camera_index]\n" << endl ; - - return; - } - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); - //cv::ocl::setBinpath("E:\\"); - } + if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName))) + { + cout << "ERROR: Could not load classifier cascade" << endl; + cout << "Usage: facedetect [--cascade=]\n" + " [--scale[=\n" + " [filename|camera_index]\n" << endl ; + return; + } + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums>0); + ////if you want to use undefault device, set it here + ////setDevice(oclinfo[0]); + //cv::ocl::setBinpath("E:\\"); + } }; ////////////////////////////////faceDetect///////////////////////////////////////////////// struct Haar : HaarTestBase {}; -TEST_P(Haar, FaceDetect) -{ - - for(int index = 1; index < 2; index++) - { - Mat img; - char buff[256]; -#if WIN32 - sprintf(buff, "E:\\myDataBase\\%d.jpg", index); - img = imread( buff, 1 ); -#else - sprintf(buff, "%d.jpg", index); - img = imread( buff, 1 ); - std::cout << "Now test " << index << ".jpg" << std::endl; -#endif - if(img.empty()) - { - std::cout << "Couldn't read test" << index << ".jpg" << std::endl; - continue; - } +TEST_F(Haar, FaceDetect) +{ + string imgName = "../../../samples/c/lena.jpg"; + Mat img = imread( imgName, 1 ); - int i = 0; - double t = 0; - vector faces; + if(img.empty()) + { + std::cout << "Couldn't read test" << index <<".jpg" << std::endl; + return ; + } - const static Scalar colors[] = { CV_RGB(0, 0, 255), - CV_RGB(0, 128, 255), - CV_RGB(0, 255, 255), - CV_RGB(0, 255, 0), - CV_RGB(255, 128, 0), - CV_RGB(255, 255, 0), - CV_RGB(255, 0, 0), - CV_RGB(255, 0, 255) - } ; + int i = 0; + double t = 0; + vector faces, oclfaces; - Mat gray, smallImg(cvRound (img.rows / scale), cvRound(img.cols / scale), CV_8UC1 ); - MemStorage storage(cvCreateMemStorage(0)); - cvtColor( img, gray, CV_BGR2GRAY ); - resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); - equalizeHist( smallImg, smallImg ); - CvMat _image = smallImg; + const static Scalar colors[] = { CV_RGB(0,0,255), + CV_RGB(0,128,255), + CV_RGB(0,255,255), + CV_RGB(0,255,0), + CV_RGB(255,128,0), + CV_RGB(255,255,0), + CV_RGB(255,0,0), + CV_RGB(255,0,255)} ; - Mat tempimg(&_image, false); + Mat gray, smallImg(cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); + MemStorage storage(cvCreateMemStorage(0)); + cvtColor( img, gray, CV_BGR2GRAY ); + resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); + equalizeHist( smallImg, smallImg ); - cv::ocl::oclMat image(tempimg); - CvSeq *_objects; -#if 1 - for(int k = 0; k < 10; k++) - { - t = (double)cvGetTickCount(); - _objects = cascade.oclHaarDetectObjects( image, storage, 1.1, - 2, 0 - | CV_HAAR_SCALE_IMAGE - , Size(30, 30), Size(0, 0) ); + cv::ocl::oclMat image; + CvSeq* _objects; + image.upload(smallImg); + _objects = cascade.oclHaarDetectObjects( image, storage, 1.1, + 3, 0 + |CV_HAAR_SCALE_IMAGE + , Size(30,30), Size(0, 0) ); + vector vecAvgComp; + Seq(_objects).copyTo(vecAvgComp); + oclfaces.resize(vecAvgComp.size()); + std::transform(vecAvgComp.begin(), vecAvgComp.end(), oclfaces.begin(), getRect()); - t = (double)cvGetTickCount() - t ; - printf( "detection time = %g ms\n", t / ((double)cvGetTickFrequency() * 1000.) ); - } + cpucascade.detectMultiScale( smallImg, faces, 1.1, + 3, 0 + |CV_HAAR_SCALE_IMAGE + , Size(30,30), Size(0, 0) ); + EXPECT_EQ(faces.size(),oclfaces.size()); + /* for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) + { + Mat smallImgROI; + Point center; + Scalar color = colors[i%8]; + int radius; + center.x = cvRound((r->x + r->width*0.5)*scale); + center.y = cvRound((r->y + r->height*0.5)*scale); + radius = cvRound((r->width + r->height)*0.25*scale); + circle( img, center, radius, color, 3, 8, 0 ); + } */ + //namedWindow("result"); + //imshow("result",img); + //waitKey(0); + //destroyAllWindows(); -#else - cpucascade.detectMultiScale( image, faces, 1.1, - 2, 0 - | CV_HAAR_SCALE_IMAGE - , Size(30, 30), Size(0, 0) ); - -#endif - vector vecAvgComp; - Seq(_objects).copyTo(vecAvgComp); - faces.resize(vecAvgComp.size()); - std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect()); - - for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) - { - Mat smallImgROI; - vector nestedObjects; - Point center; - Scalar color = colors[i%8]; - int radius; - center.x = cvRound((r->x + r->width * 0.5) * scale); - center.y = cvRound((r->y + r->height * 0.5) * scale); - radius = cvRound((r->width + r->height) * 0.25 * scale); - circle( img, center, radius, color, 3, 8, 0 ); - } - -#if WIN32 - sprintf(buff, "E:\\result1\\%d.jpg", index); - imwrite(buff, img); -#else - sprintf(buff, "testdet_%d.jpg", index); - imwrite(buff, img); -#endif - } } - - -//INSTANTIATE_TEST_CASE_P(HaarTestBase, Haar, Combine(Values(1), - // Values(1))); - - #endif // HAVE_OPENCL diff --git a/samples/ocl/facedetect.cpp b/samples/ocl/facedetect.cpp new file mode 100644 index 000000000..6a35be7e9 --- /dev/null +++ b/samples/ocl/facedetect.cpp @@ -0,0 +1,229 @@ +//This sample is inherited from facedetect.cpp in smaple/c + +#include "opencv2/objdetect/objdetect.hpp" +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/imgproc/imgproc.hpp" +#include "opencv2/ocl/ocl.hpp" +#include +#include + +using namespace std; +using namespace cv; + +void help() +{ + cout << "\nThis program demonstrates the cascade recognizer.\n" + "This classifier can recognize many ~rigid objects, it's most known use is for faces.\n" + "Usage:\n" + "./facedetect [--cascade= this is the primary trained classifier such as frontal face]\n" + " [--scale=\n" + " [filename|camera_index]\n\n" + "see facedetect.cmd for one call:\n" + "./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --scale=1.3 \n" + "Hit any key to quit.\n" + "Using OpenCV version " << CV_VERSION << "\n" << endl; +} +struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } }; +void detectAndDraw( Mat& img, + cv::ocl::OclCascadeClassifier& cascade, CascadeClassifier& nestedCascade, + double scale); + +String cascadeName = "../../../data/haarcascades/haarcascade_frontalface_alt.xml"; + +int main( int argc, const char** argv ) +{ + CvCapture* capture = 0; + Mat frame, frameCopy, image; + const String scaleOpt = "--scale="; + size_t scaleOptLen = scaleOpt.length(); + const String cascadeOpt = "--cascade="; + size_t cascadeOptLen = cascadeOpt.length(); + String inputName; + + help(); + cv::ocl::OclCascadeClassifier cascade; + CascadeClassifier nestedCascade; + double scale = 1; + + for( int i = 1; i < argc; i++ ) + { + cout << "Processing " << i << " " << argv[i] << endl; + if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 ) + { + cascadeName.assign( argv[i] + cascadeOptLen ); + cout << " from which we have cascadeName= " << cascadeName << endl; + } + else if( scaleOpt.compare( 0, scaleOptLen, argv[i], scaleOptLen ) == 0 ) + { + if( !sscanf( argv[i] + scaleOpt.length(), "%lf", &scale ) || scale < 1 ) + scale = 1; + cout << " from which we read scale = " << scale << endl; + } + else if( argv[i][0] == '-' ) + { + cerr << "WARNING: Unknown option %s" << argv[i] << endl; + } + else + inputName.assign( argv[i] ); + } + + if( !cascade.load( cascadeName ) ) + { + cerr << "ERROR: Could not load classifier cascade" << endl; + cerr << "Usage: facedetect [--cascade=]\n" + " [--scale[=\n" + " [filename|camera_index]\n" << endl ; + return -1; + } + + if( inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0') ) + { + capture = cvCaptureFromCAM( inputName.empty() ? 0 : inputName.c_str()[0] - '0' ); + int c = inputName.empty() ? 0 : inputName.c_str()[0] - '0' ; + if(!capture) cout << "Capture from CAM " << c << " didn't work" << endl; + } + else if( inputName.size() ) + { + image = imread( inputName, 1 ); + if( image.empty() ) + { + capture = cvCaptureFromAVI( inputName.c_str() ); + if(!capture) cout << "Capture from AVI didn't work" << endl; + } + } + else + { + image = imread( "lena.jpg", 1 ); + if(image.empty()) cout << "Couldn't read lena.jpg" << endl; + } + + cvNamedWindow( "result", 1 ); + std::vector oclinfo; + int devnums = cv::ocl::getDevice(oclinfo); + if(devnums<1) + { + std::cout << "no device found\n"; + return -1; + } + //if you want to use undefault device, set it here + //setDevice(oclinfo[0]); + //setBinpath(CLBINPATH); + if( capture ) + { + cout << "In capture ..." << endl; + for(;;) + { + IplImage* iplImg = cvQueryFrame( capture ); + frame = iplImg; + if( frame.empty() ) + break; + if( iplImg->origin == IPL_ORIGIN_TL ) + frame.copyTo( frameCopy ); + else + flip( frame, frameCopy, 0 ); + + detectAndDraw( frameCopy, cascade, nestedCascade, scale ); + + if( waitKey( 10 ) >= 0 ) + goto _cleanup_; + } + + waitKey(0); + +_cleanup_: + cvReleaseCapture( &capture ); + } + else + { + cout << "In image read" << endl; + if( !image.empty() ) + { + detectAndDraw( image, cascade, nestedCascade, scale ); + waitKey(0); + } + else if( !inputName.empty() ) + { + /* assume it is a text file containing the + list of the image filenames to be processed - one per line */ + FILE* f = fopen( inputName.c_str(), "rt" ); + if( f ) + { + char buf[1000+1]; + while( fgets( buf, 1000, f ) ) + { + int len = (int)strlen(buf), c; + while( len > 0 && isspace(buf[len-1]) ) + len--; + buf[len] = '\0'; + cout << "file " << buf << endl; + image = imread( buf, 1 ); + if( !image.empty() ) + { + detectAndDraw( image, cascade, nestedCascade, scale ); + c = waitKey(0); + if( c == 27 || c == 'q' || c == 'Q' ) + break; + } + else + { + cerr << "Aw snap, couldn't read image " << buf << endl; + } + } + fclose(f); + } + } + } + + cvDestroyWindow("result"); + + return 0; +} + +void detectAndDraw( Mat& img, + cv::ocl::OclCascadeClassifier& cascade, CascadeClassifier& nestedCascade, + double scale) +{ + int i = 0; + double t = 0; + vector faces; + const static Scalar colors[] = { CV_RGB(0,0,255), + CV_RGB(0,128,255), + CV_RGB(0,255,255), + CV_RGB(0,255,0), + CV_RGB(255,128,0), + CV_RGB(255,255,0), + CV_RGB(255,0,0), + CV_RGB(255,0,255)} ; + cv::ocl::oclMat image(img); + cv::ocl::oclMat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); + + cv::ocl::cvtColor( image, gray, CV_BGR2GRAY ); + cv::ocl::resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); + cv::ocl::equalizeHist( smallImg, smallImg ); + + CvSeq* _objects; + MemStorage storage(cvCreateMemStorage(0)); + t = (double)cvGetTickCount(); + _objects = cascade.oclHaarDetectObjects( smallImg, storage, 1.1, + 3, 0 + |CV_HAAR_SCALE_IMAGE + , Size(30,30), Size(0, 0) ); + vector vecAvgComp; + Seq(_objects).copyTo(vecAvgComp); + faces.resize(vecAvgComp.size()); + std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect()); + t = (double)cvGetTickCount() - t; + printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); + for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) + { + Mat smallImgROI; + Point center; + Scalar color = colors[i%8]; + int radius; + center.x = cvRound((r->x + r->width*0.5)*scale); + center.y = cvRound((r->y + r->height*0.5)*scale); + radius = cvRound((r->width + r->height)*0.25*scale); + circle( img, center, radius, color, 3, 8, 0 ); + } + cv::imshow( "result", img ); +} From ffb3842ef1f5e47ddada178922bf8f04e899f421 Mon Sep 17 00:00:00 2001 From: Alexandre Benoit Date: Fri, 31 Aug 2012 11:19:46 +0200 Subject: [PATCH 057/103] updated retina documentation --- modules/contrib/doc/retina/index.rst | 377 +++++++++++++++++---------- 1 file changed, 242 insertions(+), 135 deletions(-) diff --git a/modules/contrib/doc/retina/index.rst b/modules/contrib/doc/retina/index.rst index f8bdbc77d..3d6a37dc9 100644 --- a/modules/contrib/doc/retina/index.rst +++ b/modules/contrib/doc/retina/index.rst @@ -1,243 +1,350 @@ -Bio mimetic human retina model -============================== - -class which allows the Gipsa/Listic Labs model to be used. This retina model allows spatio-temporal image processing (applied on still images, images sequences and video sequences). Briefly, here are the main human retina model properties: -* spectral whithening (mid-frequency details enhancement) -* high frequency spatio-temporal noise reduction (temporal noise and high frequency spatial noise are minimized) -* low frequency luminance reduction (luminance range compression) : high luminance regions do not hide details in darker regions anymore -* local logarithmic luminance compression allows details to be enhanced even in low light conditions - -USE : this model can be used basically for spatio-temporal video effects but also for : -* by using the getParvo methods : perform texture analysis with enhanced signal to noise ratio and enhanced details robust against input images luminance ranges -* by using the getMagno methods : perform motion analysis also taking benefit of the previously cited properties - -for more information, refer to the following papers : Benoit A., Caplier A., DurettF B., Herault, J., "USING HUMAN VISUAL SYSTEM MODELING FOR BIO-INSPIRED LOW LEVEL IMAGE PROCESSING", Elsevier, Computer Vision and Image Understanding 114 (2010), pp. 758-773 -DOI -Please have a look at the reference work of Jeanny Herault that you can read in his book : -Vision: Images, Signals and Neural Networks: Models of Neural Processing in Visual Perception (Progress in Neural Processing),By: Jeanny Herault, ISBN: 9814273686. WAPI (Tower ID): 113266891. - -This retina filter code includes the research contributions of phd/research collegues from which code has been redrawn by the author : -* take a look at the retinacolor.hpp module to discover Brice Chaix de Lavarene phD color mosaicing/demosaicing and his reference paper: B. Chaix de Lavarene, D. Alleysson, B. Durette, J. Herault (2007). "Efficient demosaicing through recursive filtering", IEEE International Conference on Image Processing ICIP 2007 -* take a look at imagelogpolprojection.hpp to discover retina spatial log sampling which originates from Barthelemy Durette phd with Jeanny Herault. A Retina / V1 cortex projection is also proposed and originates from Jeanny's discussions. ====> more informations in the above cited Jeanny Heraults's book. +Retina : a Bio mimetic human retina model +***************************************** .. highlight:: cpp Retina ------- +====== .. ocv:class:: Retina -Class that provides the main controls to the human retina model, it includes protected buffer conversion methods (cv::mat <-> std::valarray) -The retina can be settled up with various parameters, by default, the retina cancels mean luminance and enforces all details of the visual scene. In order to use your own parameters, you can use at least on time the write(std::string fs) method which will write a proper XML file with all default parameters. Then, tweak it on your own and reload them at any time using method setup(std::string fs). These methods update a cv::Retina::RetinaParameters struct that is described hereafter. +Class which provides the main controls to the Gipsa/Listic labs human retina model. Spatio-temporal filtering modelling the two main retina information channels : - class Retina - { - class RetinaParameters; // this class is detailled later +* foveal vision for detailled color vision : the parvocellular pathway). - Retina (Size inputSize); - Retina (Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod=RETINA_COLOR_BAYER, const bool useRetinaLogSampling=false, const double reductionFactor=1.0, const double samplingStrenght=10.0); - Size inputSize (); - Size outputSize (); - void setup (std::string retinaParameterFile="", const bool applyDefaultSetupOnFailure=true); - void setup (cv::FileStorage &fs, const bool applyDefaultSetupOnFailure=true); - void setup (RetinaParameters newParameters); - struct Retina::RetinaParameters getParameters (); - const std::string printSetup (); - virtual void write (std::string fs) const; - virtual void write (FileStorage &fs) const; - void setupOPLandIPLParvoChannel (const bool colorMode=true, const bool normaliseOutput=true, const float photoreceptorsLocalAdaptationSensitivity=0.7, const float photoreceptorsTemporalConstant=0.5, const float photoreceptorsSpatialConstant=0.53, const float horizontalCellsGain=0, const float HcellsTemporalConstant=1, const float HcellsSpatialConstant=7, const float ganglionCellsSensitivity=0.7); - void setupIPLMagnoChannel (const bool normaliseOutput=true, const float parasolCells_beta=0, const float parasolCells_tau=0, const float parasolCells_k=7, const float amacrinCellsTemporalCutFrequency=1.2, const float V0CompressionParameter=0.95, const float localAdaptintegration_tau=0, const float localAdaptintegration_k=7); - void run (const Mat &inputImage); - void getParvo (Mat &retinaOutput_parvo); - void getParvo (std::valarray< float > &retinaOutput_parvo); - void getMagno (Mat &retinaOutput_magno); - void getMagno (std::valarray< float > &retinaOutput_magno); - const std::valarray< float > & getMagno () const; - const std::valarray< float > & getParvo () const; - void setColorSaturation (const bool saturateColors=true, const float colorSaturationValue=4.0); - void clearBuffers (); - void activateMovingContoursProcessing (const bool activate); - void activateContoursProcessing (const bool activate); +* periphearal vision for sensitive transient signals detection (motion and events) : the magnocellular pathway. - }; +The retina can be settled up with various parameters, by default, the retina cancels mean luminance and enforces all details of the visual scene. In order to use your own parameters, you can use at least one time the *write(std::string fs)* method which will write a proper XML file with all default parameters. Then, tweak it on your own and reload them at any time using method *setup(std::string fs)*. These methods update a *cv::Retina::RetinaParameters* member structure that is described hereafter. :: + + class Retina + { + public: + // parameters setup instance + struct RetinaParameters; // this class is detailled later + + // constructors + Retina (Size inputSize); + Retina (Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod=RETINA_COLOR_BAYER, const bool useRetinaLogSampling=false, const double reductionFactor=1.0, const double samplingStrenght=10.0); + + // main method for input frame processing + void run (const Mat &inputImage); + + // output buffers retreival methods + // -> foveal color vision details channel with luminance and noise correction + void getParvo (Mat &retinaOutput_parvo); + void getParvo (std::valarray< float > &retinaOutput_parvo); + const std::valarray< float > & getParvo () const; + // -> peripheral monochrome motion and events (transient information) channel + void getMagno (Mat &retinaOutput_magno); + void getMagno (std::valarray< float > &retinaOutput_magno); + const std::valarray< float > & getMagno () const; + + // reset retina buffers... equivalent to closing your eyes for some seconds + void clearBuffers (); + + // retreive input and output buffers sizes + Size inputSize (); + Size outputSize (); + + // setup methods with specific parameters specification of global xml config file loading/write + void setup (std::string retinaParameterFile="", const bool applyDefaultSetupOnFailure=true); + void setup (cv::FileStorage &fs, const bool applyDefaultSetupOnFailure=true); + void setup (RetinaParameters newParameters); + struct Retina::RetinaParameters getParameters (); + const std::string printSetup (); + virtual void write (std::string fs) const; + virtual void write (FileStorage &fs) const; + void setupOPLandIPLParvoChannel (const bool colorMode=true, const bool normaliseOutput=true, const float photoreceptorsLocalAdaptationSensitivity=0.7, const float photoreceptorsTemporalConstant=0.5, const float photoreceptorsSpatialConstant=0.53, const float horizontalCellsGain=0, const float HcellsTemporalConstant=1, const float HcellsSpatialConstant=7, const float ganglionCellsSensitivity=0.7); + void setupIPLMagnoChannel (const bool normaliseOutput=true, const float parasolCells_beta=0, const float parasolCells_tau=0, const float parasolCells_k=7, const float amacrinCellsTemporalCutFrequency=1.2, const float V0CompressionParameter=0.95, const float localAdaptintegration_tau=0, const float localAdaptintegration_k=7); + void setColorSaturation (const bool saturateColors=true, const float colorSaturationValue=4.0); + void activateMovingContoursProcessing (const bool activate); + void activateContoursProcessing (const bool activate); + }; + + +Description ++++++++++++ + +Class which allows the `Gipsa `_ (preliminary work) / `Listic `_ (code maintainer) labs retina model to be used. This class allows human retina spatio-temporal image processing to be applied on still images, images sequences and video sequences. Briefly, here are the main human retina model properties: + +* spectral whithening (mid-frequency details enhancement) + +* high frequency spatio-temporal noise reduction (temporal noise and high frequency spatial noise are minimized) + +* low frequency luminance reduction (luminance range compression) : high luminance regions do not hide details in darker regions anymore + +* local logarithmic luminance compression allows details to be enhanced even in low light conditions + +Use : this model can be used basically for spatio-temporal video effects but also in the aim of : + +* performing texture analysis with enhanced signal to noise ratio and enhanced details robust against input images luminance ranges (check out the parvocellular retina channel output, by using the provided **getParvo** methods) + +* performing motion analysis also taking benefit of the previously cited properties (check out the magnocellular retina channel output, by using the provided **getMagno** methods) + +For more information, refer to the following papers : + +* Benoit A., Caplier A., Durette B., Herault, J., "Using Human Visual System Modeling For Bio-Inspired Low Level Image Processing", Elsevier, Computer Vision and Image Understanding 114 (2010), pp. 758-773. DOI + +* Please have a look at the reference work of Jeanny Herault that you can read in his book : + +Vision: Images, Signals and Neural Networks: Models of Neural Processing in Visual Perception (Progress in Neural Processing),By: Jeanny Herault, ISBN: 9814273686. WAPI (Tower ID): 113266891. + +This retina filter code includes the research contributions of phd/research collegues from which code has been redrawn by the author : + +* take a look at the *retinacolor.hpp* module to discover Brice Chaix de Lavarene phD color mosaicing/demosaicing and his reference paper: B. Chaix de Lavarene, D. Alleysson, B. Durette, J. Herault (2007). "Efficient demosaicing through recursive filtering", IEEE International Conference on Image Processing ICIP 2007 + +* take a look at *imagelogpolprojection.hpp* to discover retina spatial log sampling which originates from Barthelemy Durette phd with Jeanny Herault. A Retina / V1 cortex projection is also proposed and originates from Jeanny's discussions. ====> more informations in the above cited Jeanny Heraults's book. + +Demos and experiments ! +======================= + +Take a look at the C++ examples provided with OpenCV : + +* **samples/cpp/retinademo.cpp** shows how to use the retina module for details enhancement (Parvo channel output) and transient maps observation (Magno channel output). You can play with images, video sequences and webcam video. + Typical uses are (provided your OpenCV installation is situated in folder *OpenCVReleaseFolder*) + + * image processing : **OpenCVReleaseFolder/bin/retinademo -image myPicture.jpg** + + * video processing : **OpenCVReleaseFolder/bin/retinademo -video myMovie.avi** + + * webcam processing: **OpenCVReleaseFolder/bin/retinademo -video** + + **Note :** This demo generates the file *RetinaDefaultParameters.xml* which contains the default parameters of the retina. Then, rename this as *RetinaSpecificParameters.xml*, adjust the parameters the way you want and reload the program to check the effect. + + +* **samples/cpp/OpenEXRimages_HighDynamicRange_Retina_toneMapping.cpp** shows how to use the retina to perform High Dynamic Range (HDR) luminance compression + + Then, take a HDR image using bracketing with your camera and generate an OpenEXR image and then process it using the demo. + + Typical use, supposing that you have the OpenEXR image *memorial.exr* (present in the samples/cpp/ folder) + + **OpenCVReleaseFolder/bin/OpenEXRimages_HighDynamicRange_Retina_toneMapping memorial.exr** + + Note that some sliders are made available to allow you to play with luminance compression. + +Methods description +=================== + +Here are detailled the main methods to control the retina model Retina::Retina --------------- +++++++++++++++ .. ocv:function:: Retina::Retina(Size inputSize) .. ocv:function:: Retina::Retina(Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod = RETINA_COLOR_BAYER, const bool useRetinaLogSampling = false, const double reductionFactor = 1.0, const double samplingStrenght = 10.0 ) + Constructors - :param inputSize: the input frame size - :param colorMode: the chosen processing mode : with or without color processing - :param colorSamplingMethod: specifies which kind of color sampling will be used - * RETINA_COLOR_RANDOM: each pixel position is either R, G or B in a random choice - * RETINA_COLOR_DIAGONAL: color sampling is RGBRGBRGB..., line 2 BRGBRGBRG..., line 3, GBRGBRGBR... - * RETINA_COLOR_BAYER: standard bayer sampling - :param useRetinaLogSampling: activate retina log sampling, if true, the 2 following parameters can be used - :param reductionFactor: only usefull if param useRetinaLogSampling=true, specifies the reduction factor of the output frame (as the center (fovea) is high resolution and corners can be underscaled, then a reduction of the output is allowed without precision leak - :param samplingStrenght: only usefull if param useRetinaLogSampling=true, specifies the strenght of the log scale that is applied + + :param inputSize: the input frame size + :param colorMode: the chosen processing mode : with or without color processing + :param colorSamplingMethod: specifies which kind of color sampling will be used + * RETINA_COLOR_RANDOM: each pixel position is either R, G or B in a random choice + * RETINA_COLOR_DIAGONAL: color sampling is RGBRGBRGB..., line 2 BRGBRGBRG..., line 3, GBRGBRGBR... + * RETINA_COLOR_BAYER: standard bayer sampling + :param useRetinaLogSampling: activate retina log sampling, if true, the 2 following parameters can be used + :param reductionFactor: only usefull if param useRetinaLogSampling=true, specifies the reduction factor of the output frame (as the center (fovea) is high resolution and corners can be underscaled, then a reduction of the output is allowed without precision leak + :param samplingStrenght: only usefull if param useRetinaLogSampling=true, specifies the strenght of the log scale that is applied Retina::activateContoursProcessing ----------------------------------- +++++++++++++++++++++++++++++++++++ .. ocv:function:: void cv::Retina::activateContoursProcessing(const bool activate) + Activate/desactivate the Parvocellular pathway processing (contours information extraction), by default, it is activated - :param activate: true if Parvocellular (contours information extraction) output should be activated, false if not... if activated, the Parvocellular output can be retrieved using the getParvo methods + + :param activate: true if Parvocellular (contours information extraction) output should be activated, false if not... if activated, the Parvocellular output can be retrieved using the **getParvo** methods Retina::activateMovingContoursProcessing ----------------------------------------- +++++++++++++++++++++++++++++++++++++++++ .. ocv:function:: void cv::Retina::activateMovingContoursProcessing(const bool activate) + Activate/desactivate the Magnocellular pathway processing (motion information extraction), by default, it is activated - :param activate:true if Magnocellular output should be activated, false if not... if activated, the Magnocellular output can be retrieved using the getMagno methods + + :param activate: true if Magnocellular output should be activated, false if not... if activated, the Magnocellular output can be retrieved using the **getMagno** methods Retina::clearBuffers --------------------- +++++++++++++++++++++ .. ocv:function:: void cv::Retina::clearBuffers() - Clears all retina buffers (equivalent to opening the eyes after a long period of eye close ;o) whatchout the temporal transition occuring just after this method call, some classical visual illusions can be explained + + Clears all retina buffers (equivalent to opening the eyes after a long period of eye close ;o) whatchout the temporal transition occuring just after this method call. Retina::getParvo ----------------- +++++++++++++++++ .. ocv:function:: void cv::Retina::getParvo(Mat & retinaOutput_parvo) .. ocv:function:: void cv::Retina::getParvo(std::valarray< float > & retinaOutput_parvo ) + Accessor of the details channel of the retina (models foveal vision) - :param retinaOutput_parvo: the output buffer (reallocated if necessary), format can be : - * a cv::Mat, this output is rescaled for standard 8bits image processing use in OpenCV - * a 1D std::valarray Buffer (encoding is R1, R2, ... Rn), this output is the original retina filter model output, without any quantification or rescaling + + :param retinaOutput_parvo: the output buffer (reallocated if necessary), format can be : + + * a cv::Mat, this output is rescaled for standard 8bits image processing use in OpenCV + + * a 1D std::valarray Buffer (encoding is R1, R2, ... Rn), this output is the original retina filter model output, without any quantification or rescaling Retina::getMagno ----------------- +++++++++++++++++ .. ocv:function:: void cv::Retina::getMagno(Mat & retinaOutput_magno) .. ocv:function:: void cv::Retina::getMagno(std::valarray< float > & retinaOutput_magno) + Accessor of the motion channel of the retina (models peripheral vision) - :param retinaOutput_magno: the output buffer (reallocated if necessary), format can be : - * a cv::Mat, this output is rescaled for standard 8bits image processing use in OpenCV - * a 1D std::valarray Buffer (encoding is R1, R2, ... Rn), this output is the original retina filter model output, without any quantification or rescaling + + :param retinaOutput_magno: the output buffer (reallocated if necessary), format can be : + + * a cv::Mat, this output is rescaled for standard 8bits image processing use in OpenCV + + * a 1D std::valarray Buffer (encoding is R1, R2, ... Rn), this output is the original retina filter model output, without any quantification or rescaling Retina::getParameters ---------------------- ++++++++++++++++++++++ .. ocv:function:: struct Retina::RetinaParameters cv::Retina::getParameters() - Returns: the current parameters setup + + Retrieve the current parameters values in a *Retina::RetinaParameters* structure + + :return: the current parameters setup Retina::inputSize ------------------ ++++++++++++++++++ .. ocv:function:: Size cv::Retina::inputSize() + Retreive retina input buffer size + :return: the retina input buffer size + Retina::outputSize ------------------- +++++++++++++++++++ .. ocv:function:: Size cv::Retina::outputSize() + Retreive retina output buffer size that can be different from the input if a spatial log transformation is applied + :return: the retina output buffer size + Retina::printSetup ------------------- +++++++++++++++++++ .. ocv:function:: const std::string cv::Retina::printSetup() + Outputs a string showing the used parameters setup - :return a string which contains formatted parameters information + + :return: a string which contains formatted parameters information Retina::run ------------ ++++++++++++ .. ocv:function:: void cv::Retina::run(const Mat & inputImage) + Method which allows retina to be applied on an input image, after run, encapsulated retina module is ready to deliver its outputs using dedicated acccessors, see getParvo and getMagno methods - :param inputImage: the input cv::Mat image to be processed, can be gray level or BGR coded in any format (from 8bit to 16bits) + + :param inputImage: the input cv::Mat image to be processed, can be gray level or BGR coded in any format (from 8bit to 16bits) Retina::setColorSaturation --------------------------- +++++++++++++++++++++++++++ .. ocv:function:: void cv::Retina::setColorSaturation(const bool saturateColors = true, const float colorSaturationValue = 4.0 ) + Activate color saturation as the final step of the color demultiplexing process -> this saturation is a sigmoide function applied to each channel of the demultiplexed image. - :param saturateColors,:boolean that activates color saturation (if true) or desactivate (if false) - :param colorSaturationValue: the saturation factor : a simple factor applied on the chrominance buffers + + :param saturateColors: boolean that activates color saturation (if true) or desactivate (if false) + :param colorSaturationValue: the saturation factor : a simple factor applied on the chrominance buffers Retina::setup -------------- ++++++++++++++ .. ocv:function:: void cv::Retina::setup(std::string retinaParameterFile = "", const bool applyDefaultSetupOnFailure = true ) .. ocv:function:: void cv::Retina::setup(cv::FileStorage & fs, const bool applyDefaultSetupOnFailure = true ) .. ocv:function:: void cv::Retina::setup(RetinaParameters newParameters) + Try to open an XML retina parameters file to adjust current retina instance setup => if the xml file does not exist, then default setup is applied => warning, Exceptions are thrown if read XML file is not valid - :param retinaParameterFile: the parameters filename - :param applyDefaultSetupOnFailure: set to true if an error must be thrown on error - :param fs: the open Filestorage which contains retina parameters - :param newParameters: a parameters structures updated with the new target configuration + + :param retinaParameterFile: the parameters filename + :param applyDefaultSetupOnFailure: set to true if an error must be thrown on error + :param fs: the open Filestorage which contains retina parameters + :param newParameters: a parameters structures updated with the new target configuration Retina::write -------------- ++++++++++++++ + +.. ocv:function:: virtual void cv::Retina::write(std::string fs) const +.. ocv:function:: virtual void cv::Retina::write(FileStorage & fs) const -.. ocv:function:: virtual void cv::Retina::write(std::string fs) const [virtual] -.. ocv:function:: virtual void cv::Retina::write(FileStorage & fs) const [virtual] Write xml/yml formated parameters information - :param fs : the filename of the xml file that will be open and writen with formatted parameters information + + :param fs: the filename of the xml file that will be open and writen with formatted parameters information Retina::setupIPLMagnoChannel ----------------------------- +++++++++++++++++++++++++++++ .. ocv:function:: void cv::Retina::setupIPLMagnoChannel(const bool normaliseOutput = true, const float parasolCells_beta = 0, const float parasolCells_tau = 0, const float parasolCells_k = 7, const float amacrinCellsTemporalCutFrequency = 1.2, const float V0CompressionParameter = 0.95, const float localAdaptintegration_tau = 0, const float localAdaptintegration_k = 7 ) + Set parameters values for the Inner Plexiform Layer (IPL) magnocellular channel this channel processes signals output from OPL processing stage in peripheral vision, it allows motion information enhancement. It is decorrelated from the details channel. See reference papers for more details. - :param normaliseOutput: specifies if (true) output is rescaled between 0 and 255 of not (false) - :param parasolCells_beta: the low pass filter gain used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), typical value is 0 - :param parasolCells_tau: the low pass filter time constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is frame, typical value is 0 (immediate response) - :param parasolCells_k: the low pass filter spatial constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is pixels, typical value is 5 - :param amacrinCellsTemporalCutFrequency: the time constant of the first order high pass fiter of the magnocellular way (motion information channel), unit is frames, tipicall value is 5 - :param V0CompressionParameter: the compression strengh of the ganglion cells local adaptation output, set a value between 160 and 250 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 200 - :param localAdaptintegration_tau: specifies the temporal constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation - :param localAdaptintegration_k: specifies the spatial constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + + :param normaliseOutput: specifies if (true) output is rescaled between 0 and 255 of not (false) + :param parasolCells_beta: the low pass filter gain used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), typical value is 0 + :param parasolCells_tau: the low pass filter time constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is frame, typical value is 0 (immediate response) + :param parasolCells_k: the low pass filter spatial constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is pixels, typical value is 5 + :param amacrinCellsTemporalCutFrequency: the time constant of the first order high pass fiter of the magnocellular way (motion information channel), unit is frames, typical value is 1.2 + :param V0CompressionParameter: the compression strengh of the ganglion cells local adaptation output, set a value between 0.6 and 1 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 0.95 + :param localAdaptintegration_tau: specifies the temporal constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + :param localAdaptintegration_k: specifies the spatial constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation Retina::setupOPLandIPLParvoChannel ----------------------------------- +++++++++++++++++++++++++++++++++++ .. ocv:function:: void cv::Retina::setupOPLandIPLParvoChannel(const bool colorMode = true, const bool normaliseOutput = true, const float photoreceptorsLocalAdaptationSensitivity = 0.7, const float photoreceptorsTemporalConstant = 0.5, const float photoreceptorsSpatialConstant = 0.53, const float horizontalCellsGain = 0, const float HcellsTemporalConstant = 1, const float HcellsSpatialConstant = 7, const float ganglionCellsSensitivity = 0.7 ) + Setup the OPL and IPL parvo channels (see biologocal model) OPL is referred as Outer Plexiform Layer of the retina, it allows the spatio-temporal filtering which withens the spectrum and reduces spatio-temporal noise while attenuating global luminance (low frequency energy) IPL parvo is the OPL next processing stage, it refers to a part of the Inner Plexiform layer of the retina, it allows high contours sensitivity in foveal vision. See reference papers for more informations. - :param colorMode: specifies if (true) color is processed of not (false) to then processing gray level image - :param normaliseOutput: specifies if (true) output is rescaled between 0 and 255 of not (false) - :param photoreceptorsLocalAdaptationSensitivity: the photoreceptors sensitivity renage is 0-1 (more log compression effect when value increases) - :param photoreceptorsTemporalConstant: the time constant of the first order low pass filter of the photoreceptors, use it to cut high temporal frequencies (noise or fast motion), unit is frames, typical value is 1 frame - :param photoreceptorsSpatialConstant: the spatial constant of the first order low pass filter of the photoreceptors, use it to cut high spatial frequencies (noise or thick contours), unit is pixels, typical value is 1 pixel - :param horizontalCellsGain:gain of the horizontal cells network, if 0, then the mean value of the output is zero, if the parameter is near 1, then, the luminance is not filtered and is still reachable at the output, typicall value is 0 - :param HcellsTemporalConstant:the time constant of the first order low pass filter of the horizontal cells, use it to cut low temporal frequencies (local luminance variations), unit is frames, typical value is 1 frame, as the photoreceptors - :param HcellsSpatialConstant:the spatial constant of the first order low pass filter of the horizontal cells, use it to cut low spatial frequencies (local luminance), unit is pixels, typical value is 5 pixel, this value is also used for local contrast computing when computing the local contrast adaptation at the ganglion cells level (Inner Plexiform Layer parvocellular channel model) - :param ganglionCellsSensitivity:the compression strengh of the ganglion cells local adaptation output, set a value between 160 and 250 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 230 + + :param colorMode: specifies if (true) color is processed of not (false) to then processing gray level image + :param normaliseOutput: specifies if (true) output is rescaled between 0 and 255 of not (false) + :param photoreceptorsLocalAdaptationSensitivity: the photoreceptors sensitivity renage is 0-1 (more log compression effect when value increases) + :param photoreceptorsTemporalConstant: the time constant of the first order low pass filter of the photoreceptors, use it to cut high temporal frequencies (noise or fast motion), unit is frames, typical value is 1 frame + :param photoreceptorsSpatialConstant: the spatial constant of the first order low pass filter of the photoreceptors, use it to cut high spatial frequencies (noise or thick contours), unit is pixels, typical value is 1 pixel + :param horizontalCellsGain: gain of the horizontal cells network, if 0, then the mean value of the output is zero, if the parameter is near 1, then, the luminance is not filtered and is still reachable at the output, typicall value is 0 + :param HcellsTemporalConstant: the time constant of the first order low pass filter of the horizontal cells, use it to cut low temporal frequencies (local luminance variations), unit is frames, typical value is 1 frame, as the photoreceptors + :param HcellsSpatialConstant: the spatial constant of the first order low pass filter of the horizontal cells, use it to cut low spatial frequencies (local luminance), unit is pixels, typical value is 5 pixel, this value is also used for local contrast computing when computing the local contrast adaptation at the ganglion cells level (Inner Plexiform Layer parvocellular channel model) + :param ganglionCellsSensitivity: the compression strengh of the ganglion cells local adaptation output, set a value between 0.6 and 1 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 0.7 Retina::RetinaParameters ------------------------- -This structure merges all the parameters that can be adjusted threw the cv::Retina::setupOPLandIPLParvoChannel and cv::Retina::setupIPLMagnoChannel setup methods -Parameters structure for better clarity, check explenations on the comments of methods : setupOPLandIPLParvoChannel and setupIPLMagnoChannel +======================== .. ocv:class:: RetinaParameters - struct RetinaParameters{ +This structure merges all the parameters that can be adjusted threw the **cv::Retina::setup()**, **cv::Retina::setupOPLandIPLParvoChannel** and **cv::Retina::setupIPLMagnoChannel** setup methods +Parameters structure for better clarity, check explenations on the comments of methods : setupOPLandIPLParvoChannel and setupIPLMagnoChannel. :: + + class RetinaParameters{ struct OPLandIplParvoParameters{ // Outer Plexiform Layer (OPL) and Inner Plexiform Layer Parvocellular (IplParvo) parameters OPLandIplParvoParameters():colorMode(true), - normaliseOutput(true), - photoreceptorsLocalAdaptationSensitivity(0.7f), - photoreceptorsTemporalConstant(0.5f), - photoreceptorsSpatialConstant(0.53f), - horizontalCellsGain(0.0f), - hcellsTemporalConstant(1.f), - hcellsSpatialConstant(7.f), - ganglionCellsSensitivity(0.7f){};// default setup + normaliseOutput(true), // specifies if (true) output is rescaled between 0 and 255 of not (false) + photoreceptorsLocalAdaptationSensitivity(0.7f), // the photoreceptors sensitivity renage is 0-1 (more log compression effect when value increases) + photoreceptorsTemporalConstant(0.5f),// the time constant of the first order low pass filter of the photoreceptors, use it to cut high temporal frequencies (noise or fast motion), unit is frames, typical value is 1 frame + photoreceptorsSpatialConstant(0.53f),// the spatial constant of the first order low pass filter of the photoreceptors, use it to cut high spatial frequencies (noise or thick contours), unit is pixels, typical value is 1 pixel + horizontalCellsGain(0.0f),//gain of the horizontal cells network, if 0, then the mean value of the output is zero, if the parameter is near 1, then, the luminance is not filtered and is still reachable at the output, typicall value is 0 + hcellsTemporalConstant(1.f),// the time constant of the first order low pass filter of the horizontal cells, use it to cut low temporal frequencies (local luminance variations), unit is frames, typical value is 1 frame, as the photoreceptors + hcellsSpatialConstant(7.f),//the spatial constant of the first order low pass filter of the horizontal cells, use it to cut low spatial frequencies (local luminance), unit is pixels, typical value is 5 pixel, this value is also used for local contrast computing when computing the local contrast adaptation at the ganglion cells level (Inner Plexiform Layer parvocellular channel model) + ganglionCellsSensitivity(0.7f)//the compression strengh of the ganglion cells local adaptation output, set a value between 0.6 and 1 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 0.7 + {};// default setup bool colorMode, normaliseOutput; float photoreceptorsLocalAdaptationSensitivity, photoreceptorsTemporalConstant, photoreceptorsSpatialConstant, horizontalCellsGain, hcellsTemporalConstant, hcellsSpatialConstant, ganglionCellsSensitivity; }; struct IplMagnoParameters{ // Inner Plexiform Layer Magnocellular channel (IplMagno) IplMagnoParameters(): - normaliseOutput(true), - parasolCells_beta(0.f), - parasolCells_tau(0.f), - parasolCells_k(7.f), - amacrinCellsTemporalCutFrequency(1.2f), - V0CompressionParameter(0.95f), - localAdaptintegration_tau(0.f), - localAdaptintegration_k(7.f){};// default setup + normaliseOutput(true), //specifies if (true) output is rescaled between 0 and 255 of not (false) + parasolCells_beta(0.f), // the low pass filter gain used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), typical value is 0 + parasolCells_tau(0.f), //the low pass filter time constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is frame, typical value is 0 (immediate response) + parasolCells_k(7.f), //the low pass filter spatial constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is pixels, typical value is 5 + amacrinCellsTemporalCutFrequency(1.2f), //the time constant of the first order high pass fiter of the magnocellular way (motion information channel), unit is frames, typical value is 1.2 + V0CompressionParameter(0.95f), the compression strengh of the ganglion cells local adaptation output, set a value between 0.6 and 1 for best results, a high value increases more the low value sensitivity... and the output saturates faster, recommended value: 0.95 + localAdaptintegration_tau(0.f), // specifies the temporal constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + localAdaptintegration_k(7.f) // specifies the spatial constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + {};// default setup bool normaliseOutput; float parasolCells_beta, parasolCells_tau, parasolCells_k, amacrinCellsTemporalCutFrequency, V0CompressionParameter, localAdaptintegration_tau, localAdaptintegration_k; }; From 2367a195c5f9903e120e9359f7d823fd7d02b142 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Fri, 31 Aug 2012 14:35:11 +0400 Subject: [PATCH 058/103] probably fixed compile error on MacOSX 10.6 --- modules/highgui/src/cap_ffmpeg_impl.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/highgui/src/cap_ffmpeg_impl.hpp b/modules/highgui/src/cap_ffmpeg_impl.hpp index d3a5ed3ad..caf297912 100644 --- a/modules/highgui/src/cap_ffmpeg_impl.hpp +++ b/modules/highgui/src/cap_ffmpeg_impl.hpp @@ -2050,7 +2050,7 @@ bool InputMediaStream_FFMPEG::read(unsigned char** data, int* size, int* endOfFi if (ret < 0) { - if ((int64_t)ret == (int64_t)AVERROR_EOF) + if (ret == AVERROR_EOF) *endOfFile = true; return false; } From 1a2bbfafbaae2a02baf5bcca8c637a18881e0cc6 Mon Sep 17 00:00:00 2001 From: OpenCV Buildbot Date: Fri, 31 Aug 2012 14:36:22 +0400 Subject: [PATCH 059/103] update FFMPEG wrapper binaries --- 3rdparty/ffmpeg/opencv_ffmpeg.dll | Bin 9161356 -> 9160844 bytes 3rdparty/ffmpeg/opencv_ffmpeg_64.dll | Bin 9219038 -> 9219038 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3rdparty/ffmpeg/opencv_ffmpeg.dll b/3rdparty/ffmpeg/opencv_ffmpeg.dll index 2063af43c263b5b1d14f2090a45fc86fe8aca0a1..a5e9e656ffdf23bca7b0a499aa98225d510344a2 100644 GIT binary patch delta 322522 zcmZ_0bwE{F)Hlr9Cs7boP(T!ri-016Vql_RcL#_$c8i?|sCY%uqi#FL)-h0zEsotW zc8od}7-M(6zkM&x%=10Z_s>1&?6q_4)qCwbb@nEC>Woct`ed&~MpP4rxrq){+c`Mg zbx{3s6LWV+=;7cnVaD=u(#{js88_>)w`=*9QGE&-)#(m>H2m0$TyNKsgTwgC4i4)K zFR27gHfl+MG|lLT-?_#d{Qhd}$8VJJ2*2HoJaQn-H_G96vk{NqZN^0W&dm5to+TF? z>E`T^dMqU~p(dG5qr^r`j1u^Moi=&v=vH-|GtIl=Sgk!gFi19+}hz zxJoFHTG^77XN(c%R+4;-c(;Z$BV&WxO`-r}ashvOm9e3~Et!&y)Ix7*dd669PnNgl zJqL&EtKWb8utvG2%9gAl#+o7-G{cDVX+SNEwLU@g)VS!gjfNVNd?)4qt+j)LwSgrf zb>1bh3ZU>=hM!-eM7@j^meI7&@C{f^Esf&=ew07sNx&(I0*xKPEhwLnyLbayX|yTc zn10DvQ~Wri4aUHd{;qABq8lkC(6sTV~w(5m&cXf zEV}c+UgS?Yq^HJNe3K4)#AX-j=fU}XRcO2t)nd=X@hlZeUFqA z3A)&_mmRQKpdYKP^O^l~HX$W*crfM}8SOjdy0y87HO68|b+tD4#!FDD>oHBNV>5*$ z9d-p79jdZt^R7Dya(L#`zmI9yIS0HwzyvUC5H`LEO0r^%W#MJ(O!@ZXM{;IDuGDKu zhl64dp^m`%TWpwk-hJQIA^hgQFtqm&(-yGvqR!6+nnsb*!Oj;@9F^q^z@82 zr3(^vdO(>{lxQq16X@9XT~~*cn=Z+kF}{osg&Qx+1m<$gDSM$9iDin=JtHb2FxRfP z_KH_Up^uS{qMkWL2NdH1ita`PI(p_5tu}lkeCdr5UbdLyi8uC^(~SWUzQ*{nfsP|` zN`@JkC^=s?FmEtQFmb^Fz5)?`hF-3m`;*sQ9U{LExse0OB_LOf=H;r;0AohEAgXQb z#%~ehez_p_?v>$OK9EiuWy=TA3L_rBBaKP;ZE9@BZ;)}ld=UHb(vT_yf@Moo2%?Qf z3;ZSW zwf(B%mp!RzxK{LHXYG%z_QxFiW2F5NZ-3OVKZ@BOxoi(HT%|&E(HK?9g6S=-xPqc>m4zPUnoVfUXlI`RpYr#_=lisJGF%>Tc?2 z6t32ny{?ckwOU)5${UZO!+g|wUBF}dKY|uKxZ;MBLu!a6^;p)Y`bOE9$D&=$fmq`7 znzdtYV_Usal!kXN z<9j`w3K&}b;*hc8yFq=OjvFoO7iX{98j1D&u;nZ2hf!VQQvFi7JTZTl9nqHT+D6Cv zJ}gGm@O0GlZUcpgIFr$&K`Nuc#*IcrDbx7YD4g~ir5dlNLB`F-7TPznNk8m(|0bR^ z+(>N_#mZkZsyFpi-=cX|dE-fwmUPgFYU+dEj!jzxHMk1;g@ge8+NiWEzOB)2LMk~q zV!#NC5c639#;vCD^vI~xEQEF$J(^iCa#}M#T5N1;R>!ktNgy%C5`$K{7$l1%L6VKS&3!A}5BaxdhW2mGQ=;59tZo}tbP!{45}k^UHWYJ)Y#PAoqA+EY+i)1PjxbsR)r-hZuqxdN8^mMZ4I9VF<3?eO9<8U&D+wF>SPg| zh;{0inp4&hV|=?sME}Xh$+=-h- zl$wzc|DJ%?-W>;!U&gJDGZeaG^y{{VGBS#HFG+McqfL)0jJg|hdJUr&8F_loVD#Kr z+BcBBD`K4JTbC*t`TLa>Sm;-semAWBd}z6`zTa|MVl?Vs6F8mK|9s&rmo7pd=mIlh z2ZThy#^Bc>>$H(LU>PRhKhU508MOySLSiHiY$NDkU@!m9&4ho`E z#sm~CGdAFNm~jQa4QCE6PDPCpgCj7tj)QwswsCr}KOHe%4vr*$qj*9WXuxR+{v;V& z6C$aT@hqV~wKd{~_)}S9{E$d8jNL9%fq->J2Xtp z2fsCp+{3~s?~2O9h<)8`R2^QO(lW*mcO$6M*&}?5ulDaEY>YB#@gx=+f)xriFnSXt zZf5GyAt!D76=KN>&A2n74-sWF809BnV*SRprxfG#*j@C8F>zdDN;0mDD+eRSd3WIH?h~NjUI`WX_m1vu_BesxSJS8kfM2$DuU!2BrT>!#?z!K^dKWRxgDd_70D9` zte7&XCQUF-;kSX2ck)QOU`(CtQDA3QXF=FOHmb9>u!N+#K|UC}Cx2&e9~-+<2a=x= zG9`$18ZD<3rwbY5r}&B$F0)pIRJdi0qZlJ{YGt}=44t}%3K^x->Z0S(X~U_F@h(kR zgN3JkrD(%zdI%NBs6G7vqhf|Ob2`n*;4@1}pv_~mN04tu^*J7lOrzc0wzM&0+uZUJ zb;@|Qpgd8qVOf+w+cM@YI?ZUk(QRp4$eYZi{jkPT%boy5Udwx9PbV&43v(xI#c-^8 z?FvbvuExey!${8vSe;4KJ>$_DCy9z=yjee(=%~?sqZO*@&Bl84M@H4(t}zI%f?G1F zWyZBF4T&_PSjG~XWE{;HOQ$nxZhIk7Rz}&K&lp*aqI=HM6ywdFCKPGJ?2TkU_88;# zHiT_@X73dmnDOhrUy0<5x(6l`CVMfn2K6x94=$x+89NTfF^ItYhc}`9p~G{5rMM$& zfF5pioIjWssi3Z=%zpSQY! z3~S!LPS^mSJ1f;5n*}!bOUGPp#-DdAU;*i_0ixu0Lx~$l?`F__W8}RM+F`7|w*wu- z|K$%GXu@9{vccy`oBGBL}WC0I1az3A5NkZMvF%aA?;p0@@HYYjCp^T zHR?ZZ0*__kWwPIfp!Mjd}rl3E+@pUkJd#*C-Y(8iaaCbKt& z5&JA$XwPRh?fJ}GjPR_tTgw$d)hvtf-BMcsx3JzP81e4&sW)yf;j>y4i_&P|)o7YQV;1qZhs_JQ-9kP!Zcb*n7 zI=<;E)Z-fql+l|vk>qQXd>i2T*@_CgK0~WcwU6Eaqhq5w8@=CtrJ6>MciX6AM&b9( zh?Zpx_|S&vfpOyF4)$$qM&hTYjMf={e5nVF7x|h(YmHyO_5>31eCt3fGWvZBkRr1O z2-5Jd%4<^J<*?Hg6oK9cU4r3d9T1iBJ|TAwaqK+`(mv!Q2y4si)AWLx^1VcrsRjQ8 zwr>o{#nD^d-4dK8j~ka)~Pmy^V2$2E9iF$En_Sm&_CWuheHmfrzI3~$hPvL zj`UiJThPTAFt!43oQr(uFSCCxDhgG>XF5?Z+V6EDPa4dxIFX;{JM44hpDxL(L19AY zM&;<-Nbc%P#V8*y?@Zx9Nl#}A%o~Twu%Cn@nMaV~alXu%O4AU2$(hP{J)F|nVf+}X zIAoqR4s~uO%t$)IU@~Xb;eL52yySeqvyZ}mvrSbDRxM|+TV8er?~>9p$1D7ukIO?P zDT;5*L(?gOS8>4(|H%y(nnQtHh-DT(4zVwX_$H@=_{6?3=#A1zk!D}^Y`{n6-uJNwzH2ruMKVbqB? z@TL;r)#2V0MYH%WZxBu=6N1i3tmacGP<>r9B8&!*dr(yy#*exrr(6W0yZt!?T)CLwUj$Y&_EE; zxCl^|1K$_{CP!ge`kl7$^JM{ZF>90~MP;9!@w$~Mgl?KcD^qS~I>#r}rM@(SzpP7j z94&!%J?PD=*Q0iM!vkzHI+hS?pXnC9p&s?4-MmnJ+CZu1@%nU~9QXL!8)fiy4Z*}6 z`0IvLlN@=4Mquze=AcH@R-+62bW1R7Q}bC%f~G0JE48K{RKTnRgWiRT@J-#x+y9=U zZM;JXW3l=WY>@ZnKfVpX(r*K1pRpBp7a*-ExZ@? z79`XQ+%(#}+>4r%V}xR#C!l>WvtGP+AFLwM^yo{lHb?XD{?vxOA#UwYt8$efdu4y( z>l;!nI%iH8K$VDG`2K-tT$Xgrf*SSCL)mJU&-nKq7K zudn1;iFB1tn3)qO7tsWMDv8?AT5d_Ec$&|Xk|}_G|sGK72&{xF#uRos;y z6kAJw9~DF{voaA_O0|2rp`aLHhCN)-#Q_9nV+NZ~ayQJ*BTLP`DFmI-&%85*N=r0~ z=bHwK+0Uy@qr%jLx1RQhzj zGJ~qo6W(|R<~o-TnL)Fm%W}_z>N#cBm`PP6I>X1$29_t9$7Vw`gNFW|1Ig#l3vdb* z-Ej(Ihi34C9Q56TujEv`blP=+M4RO~!S-siwuaeWZFud2SI7i=46y?~__A$|Zrpt? zgxX)c_gu^=%3ME}l8FlQu=zk>N#0~W-7V$)5Ix6O+_F1Cb=jz|^S1%nUF{#bLwUQe z>MHOEz5O@uuz-Bn_se|z0{WHu@PLKTZ}oYtg)~WO{HhawMb7U0;X*1viTvwAszG^p zwMFFT{Oqqz!m?~41duE5yNIe5q)VN0g!wSYcCfdTVDG2q?~8~LP3A`ylTVc%_r$_& zCQILo|KOmr?bU{Z*0xt04jSN9Ofp71q1GyMza>;6j{~~Mt_I^CNcoQ|7WPKy5ec*pQSTF3Fx^A5>B6K9Ao?MS!a@J0Uz~@p(Hz zzK{9toivi%c-dWKp%=W}F7RPjp1KRx7rzGJioo4p1W<;0I6+*OxglSWq82+&ja+8TJf8i zbdDzS^#@_D&*2Mxr*&@SWmJ#0Rd@Og)j`KHZ+nPh^HsRq$ss*$TQRIa$P{_^cz*N{ zb#_nQ_`j#+#;Y8LJt6Uahbb;^QOJUSP=oRN@tcRqFYn7g?8P>m0ArQ8^AQRv=-<_b zlLB^}hybTBPn~&#BeY)FZbyLgj=b+tYVEeu;h(jot+TH!gc+hLbkp~2n}j~ZDhKfrlCaR&538AaCFBNHdMLs zfoH)nN6*5#O6H%=QZ@GRGOu`!enCi?FFQw{VA3x*PpK5c11>;|z%IK$T|wAeE`Z#bN?B!*Ly6|4|%^%*>1AMcC<^e}I#l zai2>t+kZDVU7`%;Q|}=Bw`T|fBq-gI>Z^n;wyAu(y%fR|ufkf*XD+x(vIJ9X=?%!J zSpND39FJhra+5|e_U#*Ab{n-O@IAL-Kc<;qZ`q?lK;=?k&XN&M1Nx&{w&<1@;jAhXkRRHqvJ=HC>< zzAff{FQB)7=dmwfmQLbxUV!3$H;=u5V@Y+n{F;KumzR7^A?!_>8T%TNf&MT@zM-u| z=XuF@w2O}N$L}bUE}LuK!=$AM)AJ*7#01POpU6jsA$8#!&8K^2pYKAo-r}!*P#wBI zyCSPc*S4pyQjEPVX6|4Nj&4PBu*}9YYHPk#Sw)H3@lv^1S45Ec>|BgfoLMqAGh}*Z z9&}-a8U1bE$;*b4V_>|U5Pi(}{A>%OeWq&x*3&l8f@~NG412Km^nho3vQy+?Zueq0 zi1zVxZx%qD@9<{9)R*7&W=E*JxvDU$N$gb%^LY_5r4@XgFJ=la#Fvev+vWg2mRq8> ze6)o%r&NC4!jfU;vemj$sB?i(Bg?+&>nxZSy~U8m0F_kvihf@SM;a;UWa8oC($ zAT8;Z=n8VM8m}760@$b8{Fh)>(QRMtP7aafU8c8#3QMbPGYn4hj9^xWuA5(jnND79 zYM~p`-VI1JO!?VU2VSHEI}h9LMG4kAPgv;p0a>q}eg7eN*`2ot!CWKwh!Eg5o!<{( z=|x8L2K#)4B_v#O;n#^dzprDTvp1hnl6e8o8%naG@J7zz;XUjNq)iJ;Sn7mJn0MMtMi3;xUK4L)7ie(WXoQQeesRCR~SQ3 zo=1nVhE$o)fMp2NsAV_{L(F1gIBUzkMe%##tRM{HPvPimgxR$;D@=5XPbkB7K*dEy z;M0}2j$jw5HZNY5EurS-$+B!KLz6KT*cLb>r6O5-*y3rCEQNjl+jOhQ3NU)aOH^jX zsFc~PGJ`R`&1_$V)sd(*UlqklQZT<1#g@|?b69l@4u+mygB?}7*M(qdz{8_i0r$i8 zfT+OwgOV49BXSD5L%6Pqn$Kxgp94Rdg3QE50&>B0`9%X(ee4`N>;&HCL~ zSDhA_oBJ`1Xg1&3AN*0>bQ-`4sT9D2hO+Lk6w-&XrR2@Shp{O%!`wTJt&FB(n!WSmW0F{K{-L>G zUF;AV8RoamU^&cpC9znlV7e!>{tC%FC6%qB_B>s?qjbVn zH3x(9nfAdyE4IP8D+kLD;GP`wb2g(m`%d&5uQm^#H+i>ttQC~UzIosa5Nyx_fvpF; z%>q_}PVnRf>@0+E^Mz~y#q$>nF&6CEMR+{ov|UG zc=AX`o5}P$-?JW~H=3&(AP+3O?*`Tkk%`O=%pD=nD;prSQ|D~Nw#M@k8`)>-Z5I0t zyT-m8=SiE;YhHeO6RSoSOsCC2C{^S2wy<{a1y*ihli^E-ZUs%%;*++rRL4I1?L&6u zo*674&-i`cMVLWHc-$fD7v3O)^{2~xZw3U+Bs14GwpBvBZl8%Ad3(%kx0Bs>Bp+V& zcSt#Jv(xX)L!v+U$Rn&e$YSpiO!Kk%=m?v{Fok}{*)v*h#-3om$X;JDDolm8*5NV) z+ENT=9pEZ#%kKQf8K|frzWpq#!ai>?-=1aA$5VOu1y+c?ZEZHXz&gpah;P1(-Uss= zmstyH#7kXae&ocPUIFvNak#<`2^}7B9Vpt*J6vb2y#Ht{Xk$pBv}pO~`fLXo7;~q2 z;X0cvu{W6AZI+J^s_FM9>!Q*q^Wp<`Tfts!e!>pWGCtrb^MzkH<0%_W{mnejm`v<@ zCGPedI?T_Ed(JWl6zci{!4pd1@+%fWZf4{wHd{gr;oMtRl0oKvdk@)j+-&&)t+9f3 zA6WPvuk06yEk5iUGrb!P?kMatE1Vmf z&tKL4E!1HdUhg}*0z~-zVAn)s`3D;jKX0MHwM(*_0ydv&@rA1>bX80nNMI*R*2o;N zfh|wl`wzH|00TL(IpBB|;N*Y64Fnh?R-S!9Dnf;4zm$rw?+dsqNrmYS4b8iSBp-~3V<1ERmUOSPffq67Wob9W(W2GJ4Tps&g~Ylew!?_QomrSq6oqTOA%m@ zKZ7Mwsib+glmxRlg%1yxK9Q9VDvdGg@{lr;7cWvqawb3V9>_j5Fk6-Zallwhh>*6+ z_n9-G`G9rdQtg2KmckXaO(5c5 zFo8?+_6?=M!hmmxWi>OuG?bzh?0B{2(s)RN%;wTWAh>o5Jd*g?7TCbLrrc7R&*(RE zNo(mIPUy_Uw$cchCYWE^0~ZLWg>{g6(N=Ro2WhQDIZN8%`cGT5; z-c>3flcy>71Z}`vo7_vPLt-AiC4=Ugzx0uY%Ruv=1EikNrF8~MtKbH`7$~(92FV}^ zCyKBs21~Wrk8ga_U}+#6P`?BW1Zqe?Zt9jS@Nio#Z zOc*AuB`U>>jF27*|7WBW3ME%&q*Ps)=R-zGKD3k19wntxFVknV#1%Sfnu$_NctfUh z5}1Y7m}Qft8e;o~r$~1t9B{Qwl|twkpO`B7yBe(^wqn-H*1XSb^IAopRJ(fwOXgi;~ z4CFr2{9~DP6l`hEUx7`;j4u2t)o1V*3a^$*lFI9^26kXSu9o6Nfc5+u=?a1;tJh*f z&~~j9z^H}!X}z?IsGgazQR=V3=k?z%&4tR}yB*XM$6sxiHqa)%cn8R$1TSi0-q~hX zQ&NO9=(Q6}bJ$GXDQ#wypI6+2;c#%a2k15VoIRj|nq1#24M2Qs#9nELuxIv4=V+RF zV4tLtJn3Ku2j1j(F;DZa{nAmD7Mg31pd1Gkn~zGB;P5>=isJb@vG5Um=P_`AhZ%WX zIuC7S<~k|()nW#p5_@3q-KVjr-u%&NsS}v0&Kc=7T~~IQxw> zj36kT-+_=Qz-;p#V%ojNZ>$*)mz^G7xw?_xXtJ5919#O4ZocFmu{RX^t2u z;EUu$RLCs-RYEvo8Q<_t>I@Uc<-6ogYk0tSpzf$S>ARG|U}`y&Tn?CwA-M_dG-s3i zfrKw6$t&SjmXYPVIJR+95Uc=2X_`Dj2p&z&WApKKc_&T`>N?6L1Oq$DrD>kI#!-g+ zE5Nyvyc%+~nzMY0vDec~Cs(*FKslOl2pT9?hoSu@P`(2m`6EbfO|H#q+nUd*SX^!avYlQWneyGZDIPQV z9q}k&Y9-`g8P;cbDcPT~kBxY%aCu1n8Pz%npDM;W1bI8Q1AueppW*T^l-Kz^BuxuT zg|wL2wg5peZ&60>LbJ`CW#q1mHk*aZ$uS@V-nqQof%cfcmzO(Aw2u2%k`Fk}FAEev zuOPfvNk+ulTv%CNEU2YYRbbhRcdsfVOOns3Do46bFAbvbfR~R3;qS8$PpvA?M6_i< zHMxRx{FjdZO5o?!slWwiM+9s>>dFOcC3H zfjI%}l>@Z=1lo+r8oX2u0KIa6#cV*wm?E}8Uw7u?YskeMPjpG6iIIoF z2EQF6`-6$8rfhMn-%&J-u{7i1wd8`TZI#7%eSnDg08!&s2YZc{_8PfF$0pw`Y5*Og zM&FzoZR|B{E2_hTYoUfeZ-j^A_jr3Bv9=m{3Wz?g=aj|STiI5#jqelHr{{p;?bU5- z>6KH~!Ct+H=%S_>Qd=%hP`O>}$h~QddA^SPoZPAYU=N`1MKkRSCyb4VtsFPEYi)3JeknGm(P(@?%I&K(=cHAQJ-xejyx657FG=NH7r zo?ZY4cnh}t=wo(kD%iG=`BzJjuwzsw2a$m4n$8QfmM^i_h4{19;LuHGXdC%6Q5`e5 zo!m%~4xYdP(_7t>8y(~*_&k?7$de_w&masYD-{}?aQ zyR(AL79-@V2t%78W8`FEtZf-9!*D_Hb)4J{X{6tITq2gWnJ-F|k9j)zcl_5&84WvF zBoxC#S<1&ukeh+s&riUF=9;f2$eUqf^5x<}Pm+0ZBD$a&X70)IHigo7W}2KS#Pc*P zM(E(_av%2Uh1ot`p34w8dp}eD4f21bA#X(%P@7pG?`3@SEMQ<8pEnCzFo@rrC0C^K zyufV0pyy}H$Ed!^=Ew_G3N@E3l$R(_>eZIZADQNUGu|QVZIW4arF{zt7qXYa!+2V-@ z^nZ&DavjLXMH`@xsDt_UM)?dA@vP1A1A=;7wpDghfr1@7p&6E#Pj<>nB=~$&_R3EY zbR4=*_VHZbyQ4h{j64{KwXD{|zuKa#IECB?T^Gk6?vrbgyBV@yZlOWfB_4s!JI+TO zg=QGQFC3K%QX4b-sJwzvf|+(gZo*&`{CP?~4^G~6THeim#PZ%}Igq_6rC`_jO4=C-}>zu!FhBSqaxhNk=9^N6|f!{5l_?mh?#Z986W?^^bsRj|@ zSXe1tFtNXF@ko<8@Ne6fxy@#UmBkEt^p%g&Ut?eEnw|V zC1o^oQ_7&PnnCnZIgJ^JPTrK})~ZSouZ+_14v}MA$88X1#*PnPe!wLN6XwEh^H5b~ ztVET}8Z{I+Onc24(Mp^|2h6`~DItWoQlUDEH!JC04ul&eXu4L6=r|<+L$%hejbg0L zJW^}@kC{K`UF#{e^DZkJkHo{E{h$)tT_psr>L~}|WR0z_EJ1*~NCO2&CNR(&Dv5{@ z^HGhJN{DQmjg?w5H8#IDSLWLcrj|+rXdC{hl>#%v4_hEI19(_rMdoE%D~0|0U>uR2 zme49^zwTUsEpaR@ih+{i#AMs?!L5~|9(z!p*1}RJ^<~!7+b}6(ENukzJm1(_sRn23 zd20oN7?ISr%2?s2{UxE<;gGXrB485X=55~p-0VUV;}dQcPdTYCle zBcx&n#a|p(byRKqjJN8h6vawMbW62&gcxw6zRC`$1En8!7A*dxzfw&2)dLg+xnQ~vQaIGl)j`<)sr=g@WugeG4p#P% zGmlD8S_|hXLAe4Ww*L^tPweLq1+spL`P)#jzfJhJVM<9@=OukMU>aLQ&Wi*fXKaF&95qc7j{v$GYi7>g!0Js}esRrXrh zZJ<>XTbajRx(;HbhgGu{7iGO}wHHc8E@@|p)I+H_=)pTqu0!T1Ly=&$VvbTv?A8-5 zo~~y2JS866WTwwomMG38FSHkCZIn>zNd8)?JfU)C;4)Ai<(mQjB|Qf|QNY*y2RF?k+Sz9Q z881i5e8Ul?T(08l>|1!liKnks+~yorGCjT?v6nUZ@2*$K>SbeM_N||}g{dbP@H|RU zOTutptEg=Sr>Uwh6Dcjax|@k}*<5NXp}2CZ_i-5J<)khq_O=V(?X2z>83lRNmWbG& z%cFWgOlRd$v&hN3;G*s&Xsl^@)lsmka^+KN!m?6eKQq4? z2z|Iazgiga^=tXnEeM89aZ~#t!u-iiO+i#LYx)>~08H4V`H?+L zWDhx6_PrI(!$xy+A$1K>S~~G|Mbrqmsnd(7LE=2Th+0%QFGbWe_O>bS<)a4so^iwu zCv}BfNRv~(3d;-FwkCB%fuQAfJi`YILn5D#x})H!ChZ+6Ef$qW|B*KFXPwJ@jjvjV z`k1eL)izWxf8+nFQem@WQFSnswt2~4eNOHR>i=5{>kq-~vsUvf0oWYF++9q?Ek!Io zP^}Ig%p0WEM^;7qAnbP(ZyKxyBW^Y-SWSgNqZC(bqe{c#YG?tf1IDcFVMU&-b+~S= zZ3_Zy<}-?`OCW5*OQ;^@YJZ1~`H>QQekO{XIe0q&9x!w0TmWe&obC8+_ou$y_?IomjPMeIzkzBf}9Q9+2h3HBh-otgw~!&)scaH zj#N@3B9qG63=nVN!9$ub6|2cHEqVz+1B4s0Dy^N2;z4^+#aj_I#9r6ur7No~E5D0C zt=1N64G(%LiXV#a+LqKCmD;!sI+cbu6rM+6T5VtPdIYaY$Jz+jY&Snt8C!+y>MGzL z*lAT%T=-aOmWxuOB%FK=i&neIgsjEd>ULoZ*8yK3d{9@#T_V`T_0=dwE@st6>O9FM z#RnrqyIT9(1kN%3sHu9%WqA=XY?igRt?&Uq(M-MWy1THb*~{9`R`|8BxwX0KPA;>( z?HvrW6<;;4v{0Lh!-b$$>MQof!z|QV^%uEo)!L}*aKQDXjhah>rS&dW9qn=KG?;XZ zj5VcXrqv;rm{ahya6ZjbtXgmo7|~gMB-BI~ObGJ33m7gJ?=HS@ z-q}UDE#KCA+h>cRb z#xDS7@Ls>Dm63R|`WLk^0x};^$i4@fzTMP95-6;4Pj!MggXpOa5@Gk!z14O?0jBlA zQjyizN4+T4))!<5f2FTF7rx%Keqbs1T%iM0oRu6gvj(bN7(`=(1T};%nIjUgu_DD~ zh&m8wW&?++tr~3q9Oqz#Et!-VB<8>BpHG{6$p86lAfS`~`Lyxyh<`rA1hf~=KTPe6 zBbA}UAl{JAF$~yb=BZ(-rvyHFI1-l@Qq8WT)R`i)=)-7K!d{J0pAt^8#;R9EisH+0 z>S2aEXxk?M_gl<`NosjwpPul`$?ES&ahaO}LDZCwo~YhJaHH)cC>GoVm^4`(DI6?T#~>NJGWhLb@3;TP+}g zgreuF&GF!KvELo|{<-QJkMw>_L<}u$k98ZE?G0hR8d>Eo!12$3D|hy@AIe? zW{24-iVC03n<-0GQ-=3eWu+P@>seROVxi?%9==xbF|BLWZVJVkuYXe?N;Jg0wpE4E z0HK%xZY*nhY*RaEurY`4QGIbBHE)j^%HEylC-#6kWS)&raKFc10JrhTz4&U$dx$UO zkc%&c@7xQP%gb-=RZAl~$z`8f06M(bKG+)VdB=SqfpO-veNaA#5bxZt-ePZinsW}Q z2myqcGY+Z|3>10vklGBko#$b7I0G-uJgWARgb#fJG>FvtlThlp_==P2IoL&mPl4u& z^7W@6=g0B0r?8P=uv3@{jF!{t6Ilq-3u+Pg;-ME*L`iFN^|IOohp4SDtHT_@vgiI( zT@}Q9@7`B&4`>GWeyA=-qXQ4Y=V<##T@BOKd<6Q!ncrifQwN(Bv*0>{tg2+I$HYC& zCy)@ZcAsGBPG-|5YOoW+L!;iS+eB_p*ca8^OJp6uy!D1<@Xy(YElq#1+2M;igORWK z>YM7v=*jl{+97fNb(OS@B0rC5<$%w zosdGRw$`mgQACX zsC}<#t6=9Y(zWq4ofmP`s^{-}InF^sW~0rbu}ydsALOV-;dCg&QL99a%omQ@<6MYm zUv<;cWO1V5silYjpQpA=W?yshX+^Zp;yl+!Lv{z_3w$wD65s8sO#{Q$_0w>Ti4XGA zen+ln*`it`&JOz*)!f5_8pqkAnjr~IQh&GB>MGT$klM>Nl?fer6F_0`SoLdAQgf-U5^wZ&Sd_ zc!R$QCM-h49~m(Y-kafT;{ zX!nux(xas2hXcMTB{3PqGxmhyGlAa@)x1ITpF_2x;t0Q#HXBi+j8fWbOn6n8c8*MQ zXt?Gt;k0{xgjOEz*~JKKLZsC9X)}7dre+0SQ$!p`q&GpE%R-a% zH6K*arXq^T2UgSq5VhkKwTm$LdsV{McAj2I^9QqUtE9aZxipnAk=guoWspz;cdnvc z5@$74(B3gmY2XT0q{@d?(;_XW!-W{P9k(6Cs}ODT@QmzGVcaEQN@3(weyN%^pZ1&m zqcnK1xW-sryX$)R5hjZ;BMo;FjSljKHM9wkMLy9O+J)DM)&|3c*%7VP#~C||(Sn6y zi_xmW8Sfo~weRFBW3*aor%G`SSyB8|4Coa;a!suv6D~zS-Iq zna-dF*o#%>>IPa1qNe88h8pDlIrDoXtrr|5U*4;U)*L9_-$aW;21uc%S`*LkDOgkj zZWQ7SMtEnC^R{bSyUgUKsEjpi@#esG%@TqZHxnjHBP!T*3<%WDiGtGXLV9M>kb}QYi@{3kMCXEm6sjWmp zxOXqm-7emumv#pUPZ7Pf(t&rUf-&2Od$1zQKC87H=P4<^^@Z2M` z1;~wAJwhv6%1Z#qZY6(=)xuC%)c1Nsp%AL9Aa0ur+`8i@O)M+1cX}6sx20| zURJG|&@EH7!16XkwXvioCEG`_?e(DhKvyFhx@vh0StL04#e-Ofrv|2BLs2*%jmE`o zC_>}tsGo}~_}`W;DK!N@p>;YxGgbSo;5|SSzc~0hI1I@K+u`=8TWoyxDRX9;c7T{q z0o-@hqWPTZ5CF^g`RUpw_R7snOxK<>5!E-ebgH>ymWE(Roar}5lkiVG$f?r4B2~*Q zIuB~oDHE4T6Y=j84i3A+_@((;3EVAOfTdsJB^Q8?kpi(m+v>P^rDQvh9&g4h)bb=Twuhvh}i6h0zd}tek~MsQi%gvN%l6Aw>zNu zidfSDFgnhK4`|2Xy>-h(Ayo9FgIZIZie5jcA^579wGL^>Ry53!N3?87Bx;?|@n z9DG`fP=#Q+sGU?rM%Z<&l@y*a3v_|tK~iP~A)9sPY#EmJTC<9bt~Xj&Moaj#ciL*G!*cJnX4T$~#MGkQC=1hoV$OPi z@5sR(<9-+Hc@-Zy!tS)~)n+9ew7uGN&kla+j?Ej}T`JeBjK}ngm znnO?&IcoU0BT0uwi>`mcchX_+@J!oZTP7WAAq<2jyyOSXt6*8c(rQ;uIu<2x6NoPX z^x^Rzw1)5vHhj>oRhc}(MhZ16xFo+9j04?)WM?pAjA+v<2U^)B`C1MX5x}2NoalVi z{vg-4p(2(&Bss07Er1rxfBmd2Lr#3HFOYt4yjFaLX@D*LrmYciRPP^JXSkx{erTn| z9a-@h%^&`N49PV+TCYb3wolVx-EHJcN$(C@L}&U0_Pv-nmFe{ud*6#+ll2q1OZ2i$ zJlc{_jo*`XH=e2JkHGJ1Ry z80o10B9hbZ=F&lnxUJ!=x51{@$)mS|reBgrKZ@{VHy7QByyic*lMEDz4Of5sK(Gqh zZ;GhF@Hc_9kCP0b~k;Uuxs7)GVJ|xp5>-jLDZm_yIvkQW#irTaN1|4yXy}T zXf}ry)c+E8cw0}sC=LNfi^mhb#8dCaJ|uI^OYeaki2+`EPmu5pFMXvj)W&=3gT+M< zZ@n=&nlXj-wjwcWaS^>7)_1vx{u&nfaUb1w`@}~dpq|ey58QvA|Kf`YJTn*h>W~*m zG4n(HWjxDIU&el@+*(xUu(|yG^$Ix5i}Tlq!!x_=uaASd*V3X#ipZr!4}v=1Y0(D> z5fGqHhGyOtpdSF0Nl7xIdX8dS6$c=3tX#%Ps7I zAW~mmrKG+K0mu&}fdt%i2-U;HHLg(oGJDsAw=IQjY|l5B(whnsEli()DW-(!e$>re z9i~Sz;jfm~=OHs}R2jXZhzyj`6U5pg>}!kAZI_55^fF!*>qE~L_y}(ZCwY5>H=V<& zO?gOJY+4@PxU6m|d>w1gKK0m^^Z0X??^gyO8J-+;xutCs$$aJ|+rYWi3jSV!Yr zy^r051X{(h1`;*T)z%ZCrJB~!eRYJp2Q|_AA)s@wiC!4~@{cBZ3HG`&4{54y?HI>6h=gq;b^hpYJ z=3ipLp*74xaXO6MJ*W7%&U!(1nV`8@W_EWSF7!p7yO(bDS~^J|2<*t#iJNmOK3EJY9BpZ0gpc$zPoR#- z_HNlnuZaI%+-=V2r*FdlFY)SwKxp-NmqEG(!fEm#{Rfdbc`y)#doBkP^qJ!NR*PYJ zCz0qrO#cWuxoNoW!r;gq7^(L`5G7=kex3Y>y=~_JqVrJ1Y{fjg{Ve!7@s>PjjQ*R; zsyFQ%(k74EUf;lJr=S=a8faG6#b%O46qS)5VjqRnfd&vfj%g@bhnrlgYr%REx-A zu{M>h1ho={cGr?2CWe{wQ}j?=3FapzLKekvnxtPr?&q~hdI1zytZM$$B@~ zAy?NEy zU{u5)W@FaK8=0fyz6I{e&C|OxeQg@JX0!#Fs@VPG3v^`PA(d{C9)io&_skZH^=$Ds zFjbdgX3z!8ba7Q|_%aXy=Currs_^5>^e)0#T#g;Vp~7;k^SF6rxsI%ao4njgeHP-V zr&j8va7_ATC1h?ex2)33iU~ zzfF&({`}8vdO&F1Q|%nGcf5unjiB?vyAuBO7<8Pm8-(2lQRpKC{)z)^fDn@ldH8m{ zq4S@6Y-Ha=)Vyd~x9i&p627{rhdJNGe^_PLc?nsZU}?j*i!unCGnilGVZ4ehp5|9^D7bwE{F_dm=zAl_5=o{N-% zf`W>QirtE0CpOrf7^v6{1|o{Nbeu89?)KO*c8#cG$Cx9S*qHo2>)h)+KF{}k`Gb9T zoO5=py=t$u_Ao$Q_C1#3ZlEaT4q)PN?0vwJ02>Z6nZ#Lt(O+{=5WetZ#I^3=-#Yay{nsPe_dr z8X_^zX|S08%W{w5`-)|(+G^du55iXFD!3k4HC?sTEO`AFeAPWE!8ZmoG~wt#o-M5E z5foP#>jpK9sSw;o>#qVX6%wxj&^R^|wttr-(0LPzcv~V9A}US2B9s#4Ry98}%_*VYKFFTxskBpb^mA2S8HM%%UDzX2a&w$n^v$1R9-*>6UVCFuvIP0&Gzc z>hKcS0`9i2z^mfW{FUVqw$6+UV2ekzCj%U72wlmrlmr^Iytc3>Zt2&+3n|q8HSn-X zV_suUW>MyA%v2B+eq&h#gUu6fu#u;b_ggR$FgksUjSTH~`}dYLti1jJY7SGT44hiOmRCswT%mHcyIBgB_BaA5nJ#h+Q0xj6YR-j>XnHvf}CYq+W7UEVs6n8 zn-QtojDf1n7;fzW?x9%P7W$TH=?A{5?XD3I!R~PE=`ag z3W%9wbCqV8Y>%5{h7WX;O2e_%noa5S&Mu|9!78ki3elFm7&Iv#%x5QQ z(q8Bk!>v*P?@O!XCtRe_Rw)FFu#%H~#-CQnDzG-yCN*WZe_i@h%u1##UFyKxyj=?b2G$(_Dxr)HW&}x$oCT-0=LoEc;GF; z#uVzcoYHJqzIx`83iDBDF5GAU5|m5I3w$somz0}3#kt9JG8f+7g`VY-regJm_(|7< z5=KLR$=wYIym_EB1Pu47Kxv$)$Klg3wX-^{E1y#9AgQQc-chPKOE=QoASqP;+RJSF zqcoOMx%BXVmzE(lSZeCg5v68yFwGhI=#nuYSX%BbR5WrFk=npym--i%uCRO(CiQoN zoA~z9=oTFR%ScOLOn9n{R25;~jO^tkT@-K>SV0=gr+QRTf?SkJV=7DKc!O4!3SdcY zSC)>uuCLL?VO&2jNpv%gRFR;moI@3>NprywU#KQQj_PY{tIqR|1LhjiZ9(|O*j`ie z6@>eAu9ozxFqeAQmeyeTJ?cpH#fy(3^(srAAPw{L)@(=PG^(pv+EE48*_gou%c10I!0s(p9#i zzt=;G%Eq3~G15xdycmD?mntytlXIX{NzAkvtp-Xr%+O+ku%<<**&wM;j>F^IxSWg# zG_g&De`16$LJwXTB-LyoQZsVAv&^3M8|;K$37F_-nLOgX6aN zjFmd_;rg&~Se{y>j+Z9DC4RL;iL8>7?^#oN! z>6_;ilYm{`fo3L1Eg-2rN|1uVb4rt>%9!rjld$v$DQS`v3h%?+lcdgI1#(Ts7d@%M zWNf_|)N!(uTm1Svjh!r2@R{fF)0bHz!rvJ3JEg=UX553x(kS_r-SOd%>C|(IR77io zC(>WAx){MwNEoe@pwuaV&O~}Q1>Y`D6{ccftElxH zKkZBeGV4fB6S0BhGh(mbs9!R0 z*?KB49cT&@ku3S+u;KUVSmhW;ZZqXemg<2SHS6k9Vlt-Cpj=XPSOA!mnRY zyi58#sR$_Y&4mD=L6pTUeW}DRm{mV&{EM^zdd4TeU~%S=?;;GgJw+}8B*BAg5rFMC z+OPgoG;lE%`I<3%F`mS(-MU07&lcoM zqwDeD?691hvnO2-36 ze8I+O7p(FQ_bln4eyoD$9aQ0JwCV9zXC3f!Z+f&2Z^QZXdH@5sh4q-ry0mjW$TJuq zPAv4ElQi<$faDaF;baZ9M3Q^zGah?fU=lP8e6YxHI~?ERNr<6Y8?dhav~z=0Kzu)% z?rgwpU!trH7{wH-zYz=C>pp?@~!BDx2CV-WAL9|JJI=C`KkHI z=%4GRJL_JOZ48WOz?qw++#VZD1+Z;WD(q1bZzg7@?V*F40r2_g)@I=7f~ZBl9R&!KeikmRf0 z9*V{%p80dAD2m)B6}FE>34r&{6SV*wAOSPz);1}xnDLmtZv#MpC)zIgiEkcLyX{gN z$Y{oPDUc03w*yJSDR_sJ#HJ=Yq$A>+Gt_P;)*BmVr_=yk$hn;o{DctcU@!0sWZ%er zKpL}+efy*UQT+VKxP1Wd3b0B%B$a|Cjfg8+qMC!|)|3|}JM;i`&tc;3Q_MN^1Kjy}aMu-$Mdv}eL7wtmkV^S~+ydyqRYQlc ziIXuP43z^IGVonDVlPPhV1`0PFM+%uHpL}rx{yw8mjNZYsMKX3wFwk+S*pgz?3bmN z&@n9fORC@>)56rL)nrXu{7C`JpLjy}4$Naoi=~Xeq(PQkd4NWarr}um3IOj3O}iqs zg_p`dSAY_4QjV)qAMq{D7Ovt$)o9aIlzPyut6*O0QJPwRRHQ`@q=ncmWgbeSpmx~$kS9Th~U_fx_!OnC_8=>jx|WM8kt0C4cerI^*_733tAHnoKP}Nt4)k`;(MkZ8#Y( ziHl(hSjJF4OCtpFV;oKS0z`)B7GI=-Oba<-@ffRTr^;V35pyZ}t8@UT7e3#lT8J<~ z?Z1PvpQat(!B_+seX=0z3isyqlhx_1CR6k%FwZZBA^JiVljPrkuKZ+Nt_Kr2S&m>wU0DuO z+XK*(q2a=Nni)kDIf~U=394L37`J+p3hoRc>NUBYfVgi~d9aN{CT@`;vca(Dx1Nnu!&7VW~=SJG%Ew2_o*^Ou)InC8} zwnendUOxKaz)?NF(lUQJKgIdUL!r!l?kBH;@IA*LbAOR4=SHqDJiLZrILa2LBV#r5s*m4K<7OVe;QeN<$N51Fkg^-8C>9pAUVpST5EB)%)Yo9Z9?U6 zM&yf%%K1T}jue$k`?PNMZ@=3`{M!~>Suwe)81f+#NaJKuZ8siFI%oWYlWS&oHTmE& z%Ev5+6Ym8Y6egDhc3T-HR}k(Re}~D}&5(U1Hi@9o7h-UIbD>$viAsw?nJ zWM$bK#~wW^%MVSZbyc|!{Do;(HMs}0<+;P<_UsE2F7JkJvUGKM0z*P|xjchkbvY+^ zf5>~qSzxOnPnV2hm{G7DP+HcIH6 zE+I59%GP19h5om$JO`&kLG|R7Aqi!pp~3Urz2)GVy={+X1pSfU@DpTTk|`n$gfb7OkQ0JBkL8(f{UBkWKkdWe?7GYVmKinLkW5>tkzRJ?qQO zAryKw05}~nrZ+(6U@UR4A@{B<`81Z}pl3{Oj9P>tY61{|qOXa(2+Zq=CUO%d=8Mmlk5Afd&Z`{y+jvU$u(d}>(LrZ zT(KgWvUvaR4%6;WfT$@C_`^ztd zI3sF+{0U+EtkgVK4sm^7stt<>2EsChyNcfwdObuw#0S`Ma&C5Ji$mX`H;j`j!T7c4 zP&vCOOf||3mv@Uy^hV0#+3;o*+G6@f$sBrZ!zfHHjwVLQ8#u<`XiRNGLl`5&<1ZU! zjs=ojKwjhIFJeYM@)$3t;G}i=csT?eJ~v+W5?~u1?ec5_?Vcd#l~%TO2pFnipD4rQ z8<7_hWOxgO(QlLFCoBm~#`3l`#3}M9Gql!J-ZhP>XDkDF)9Wd&RtFk9Zj4id3*W!zY1teq?OMv!tN2Vu`Z za^123#odjx1#%zelc~ib*#Lf1f5o=HYP9}Uj$mi6MT_NT&@a4PEbjq9Ub95LCcbu~ z2}^-LhS92}m~@y1EX6j4|M)U_r0|#VX&KWN=;N0I?IB*{a(Ojo`SNnPxcK=qxvh|6 zU;!PwLS{>5nzIUcX^U}wmAq9HK-04 zqUYd0qgdW3pA_i^sT_Qsp7w~^AC&uezCUl)l>Mou2i-a-_wpL?e`}uhrrQVQ02+2k zuIu^j-2ZtJXX}UXU^N2hG=K}YS z$dlQ6{}147?8ZOjK{#Hhaa4{JKXj+LN96)A_}O<^1TIBIl1kZvoC4#Ml+IEIw;6GW6@K2shHh92QSP( z@P!vxTFlFumjH^B^x>tvz`Csh(B}!~H4H21*H;+SE91{sa;NN&>WY7q;iNv3W@O6w z#IM6?Tc#WtI&wI+u^%`y+#1FNyFT)8y5gT5@sp8qYiEieZJ&V95~<-QIT{wQt3IIz zN5DwRFdKeOoxjK_1#b=JrRIx&nn8yLToHmz;M?gt$QQ&0>?clrgWL?IQI$Vz*NEU0Sw0WR?jPP-+(gVOOiAD6 zWh_c&$wkC>#GBhT32fnEcg0Iu^AOt_50BlcC^-daZ}JOD0GRb!oCH&M zP7ttHP=bLh)(J|qJgK1L4Ob<4Wl{1XqNc*GIME_n>NG-B5K^@O%@>s*SeWb;m1rfd zfcZqiViyRf&KVs=85SjwZo4Ywa}UXH;+sHBsO5)wSj1olwuv%IxG8{koJhGV zjWL+^?n*QiPlmfv01Dc>?#dcAmCTNBKcLmwaq9^Jds&od^?e|}l;b)6EjmUz)j860 zbiktEYFzrqqO1`=2T+QnoW{{RwUw28kmJY7%1QxlD~f^ue$arZN)aY{s&bL>uclOm z67Ybg9AGmFE57SNi>yjbw7kd3RLXBd0-4LEeC7$%9TSMe^2nF_G-L?H+7(aGwj;XY z2RZHzCn@xalOg0~R|bNQpKMnGg$KrJyYhz!)qfvPB|yybq$E!z4-SXcAq(<+hLa`q zl#_8Jdnvzz6m9fU*7JIJV*zls>8-4S$QbN{1jw2bSQh!BNngs76S-q_oRi!XlMBgE z%HfCP0`27_ggW~p0iDT>}r&iHD} zomt*d^waOY^rnb1LHstH;zE@WeOzbkgoNM?*q7WAQB6XXian-Y!xo1)W$B4EvCE&zUoO-cghrqIxm zc#WNQmsCQ*=sYf|498S1@)^enG{cL0}KQCS8(%c_b>3$`Swh#gqe2&|-}i-0bv8cNF`EOWb}wsBoGA}*i;D=Goe9ms$@X6k8h@|6TvSRYpL`ydF)oo zWr0t*qZBhZT@*F|Osk@lbdF^;vyGC8X_(qp86ey+GTQ?1AtCy-S6V}i9?)J{&U{t} z1^hk4-HysWkiw8o%5Hl~O;*m@rn-oL2FOj3^tzK$*0o;EXbPKx*rnrVW_LH*byimJ zr3yk<1;!+$sZcj`p)A$urfh)N{H~kQ+8Wp|dn~Saf6t-z5Lz(0yHc=rXi1X+$c6KP zcC5II*t)c`uTp^*y|0qbw{5onudj5^Mqz!F5MMvD_J2Qh&pqCyE39T5}1}Z*M;WAhutRY4|5O@dikOwLY*}K+j z2zIs`NpVVV;Ge;90O8%VmUF*Qj-g6F0Lz4-*bAYwb*RFYu@8n~SrEl@7)WIZ zfW~E*VrpE5DYbHc2>>GDgAOpvyjhr}!6et5cvt#!7&dw*`ZNsV^rzgzf%axoli|uC zC=_iYlxpG|gj^hE6M*(`UN-@YRf=v-0FlT+pC>4#G1%f0v5gRJXQEPMT$@}# z54i6RJby4)0q%2l^ckt!tFf5IY5&&S65_xNftNM~+mEQ^4VLSt`jS7@TgEx+Kj-}M zep`aaPxbzedNB>Uop?;;PKt_GVgY<-;+4um4I_I3<_X6ZMJ53QK!-j_IVSkp^FRld z5WL%o>a9;(o16TMF>DI91t4VqRHbL`<4a8)3cF@77f>^JG)~Cff-m8VX={z}MCCF^ zt@fM_V!n==PshUJh@KO8oN|J5vgugylT;vCnON|YkNM37!H$JI{;)N7;a6vN7qToE z4KgkyD>FrOxMK>sQjb=o;1#}fB?UMUZwB%?2YBN4MvIrmdijbCnsMTU{};yRPTL zAU_N#$DMdPhnmb&iVCnxoCn~xJ-^W!8a+=@FhLMk7?RS>y>}XVoI$a#T)pT!0T(0S z*8=nv;jo5lq3qhD5<1PdM!E|&XpblQ(3zcM+bbnDu8*&w|b%p|fu)hfK1|+-) zABG~A6BwE;Qf7&7A5z<2l^J{x`zt?C2k{(Jl5FsbivguOR-7e z`n*(W2>z?kGJJv0dX@e@$1Y&uCjXd>UC8m2!S{HX;>K$dT(#YiB&m9ju5) zgAG(`xzgUY_x#Tt+hA;6u1s`=_*#0k@)h$^VvSN<%otBy)+q7ZQDj-Gv{os_pI@s~ z$#EQ$mVOOKp^0w62f*oPrM0GC)&j<7(!sUZqp&kw3zPsPzD}uPeS8J2KjHuqt)54U0MgQ((mOtUw&-L3?SuV2%I?Mjez4(b+;pxT$J?@)Z)i}65kZiFU~ zM-osffhNa0}|inUiNUc_+FL$HARSU+mu;y8v=kC}kI@?^Qav3;4Yo zrSDQIXZIUq;#vwnq4-iw1J5G3i2>dNZfLs|93LWF^d3wwf(q?XYT!J-#$GUSaLwJT z;1m(jSodSOPt(->AZmZpru~W!FvE%c*zK$7pZ!X(ec~+aXg-%>Gahsl=LQFqfN{-I zoW(dPWBl9+c#W$oa`S}XHJo*j98WIJG27W3zn^Sx4MCIxqnKhS;~N)7!l?Q>)6pzx zZtzlmLyQ>_3FzG|?fy?6OmuT)|K0ruFh^UAI|qP`5hJ3}A@tgx`W?cC#%@2PR8;C8 z#*PA^E!#Vqs+~~0jC_Z=?LL})L|My+Fn=hopz9Akimd@BnWNYmV<_b)Sc=BvdJJ@_ zsZstIHk0JLx3wu=gWm5}{3z-K9&bS6Nu{6?w8!xcTNmdy>Yaqt#@OeS(wSoqoB|E> zrT3>Gc)+;jw9>=%TL-ggPU?6D$O9V7GYUe;|0oPQs}vDm@1XW)A6|hGDwp_k zKv2N4=ai!2=PSnTb4rZh>$VN}V{UM#JPzV`_wdHMjJB5KDtSdIB))G>?XM_{SaQ4q83a<@RmcXf*HHUwV4z?F zeGTB*-MD>C!I9lsx_2Gx)oA_=EF$9f-vF}uy2@yFL#fY>%D>$LB*I?s7M28{ehc%2 z+j?$e+F>hv=#DvU&+cH^W|QAtAfi4LaTmFYG?;UcfH{W?5jojre7TDq13@D9JuKMt zde}1XVn|Q^PP6VQ-b!CbLCy5ajsm&9qo8j3GunC&{U}6h?xB|!I?c%wv6>S7~jM-ypNTp%nUtNK0w=DojyJR1Od9zzz?^hxHKgJXCa@{lsnL=UQdT+ zU^4Z6ia7uPJXP8u{&^bbY8jSi&>=wMxb->a7ADs(lzTvzd0#5kK^MEe1nq<6-Ag4> zd{dF`y#%#fL-k&POv6C%l`;!k{o^ZO?F1^6fxX>{8gWvYVma}pc}T=}xbHCoP?}12 zxD+S1uaQ7g@LKs>dS1?P+>=EaPce9~m2WVBht&U#atm0Y{#$es;rQP|T1}=-?;v!w zpfT@&(u>flcX%nL=^dJ+QTjWjh_t^nW;;SpZ^wtWK2V&Nc@JvbpSr$Rj^M-jKR{k= zN=rZBK{&5`z{29Dj}OXO2pju8DgoYurh<4Z0z77Ur8K`7>j+{iP{v0*fV+w^l{#?1 zYMY4
  • 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ı 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ν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

    RR#3&L+5WXczaAmj|9 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≀lBKNY75?8dM*^J=Bl(0v5=LSpSKs|V7 za8rtv*ZI>DX|wRBn&0_T6-8zTPZp09_-|83WYe>_U!)OwMwFcse3)t!PD|{$6-v&* z$QO32G6s5Q*HZO=<*A|ay z^MdlHdAx3Cw~s$|@ckg}%;+nTCN_L)6c5PxmvB>Z{%0XpX(~4$;WAVnK%z_vg^?*s zGu0t>IVw#dS_LYd!v(Rj8RRY`eji~$@MKC(Q^?7FfQ_bfXj|(ZFe#H4Si$eYv^WWh#Z7Z&_k)? zW~6*0S4Rv%F?!7T0E-uCPGQYoxJ4+eAfVe6~FGk!iK1lo%`))Bdys}DL z+P2|bwn$rs>lt5Xw}o3^i?PcvL|S(lFD2SU zf}2w99?pP>lFNgIP+E66p4LP~-j8vp^Y(H($c6nL3!!C*+cPS+zRn`xDtv{U zMZd%>vi3s*(Wb|w!oq(%m{U~#BseEUPfRO`6Z`p3FhJpfPGwm9vJ!t<$v-V|>QgL< zAvUZ^jLwhpA4B}TD)FrA=w~>Y_(b;4@mE~nujj?1&x0@F|JPj&3X8mJ5D$x*YtT{~ z<*aYjwfMs~#+jW@R9=U3nKdrCJzSfIA%4qUUw7>+QE$Cm#<$#Mto?;-I6l!Z*LWG1 zo7gFl)_iIa(J6|9wRb|A$P&QMaaGxX;f=qY=3J1aY{WB-_#|frnHyYORNRQg@J&t= z%ln5)2y1Jwv@llVe}-=gmQJ|*4f!V#NX~1MBF{-hM4OGl$|A?+VBb{FyUB;}z0J7j z^9J2{$OmoZ`&g}zEADD}V!JoX6GC*lQyDmhnE9R)bFTL8K>RbPc;-W9QmFz_XHjV_ zWj2*z5N!^Xi4Y}BWp*z~b15x@_?J-G05Mik*(IwsQ8@w8w>gqI#!-BVTfhQKAmFX7Bfhz%tGHC!&chF2Hh|c53E}K$3un?ni$_>c{?*{SxOl3GE z!bDcZnaq_{r)ky4kmwmIUqZ}tRCX?`i$*r3V+h$7sa%Fwmt1i-!MN!8E!IQ3j0Yv_ zm^G8m5d8+t7?5~|xLxssiQBQ}{+rGNoxTPs^%kxB4q`Dm1&Q3I znLi=gU02-Rc+JwprXIbU=v_o;JAy^A{M~opaEUv1@4!Jl^1E9kN4eYwm{o?jZKC4T z4lJVbN18}$IHkBax-(d=fO5|*bYsdNu_t#0pUje~-_JaJ9td*wV-rD0-c&$b*fLwvUn_3(yAc{j%Q9hk6`~ zF`mN?;56$OB@W_gh(Et9kY|BmqRsJO12OAh@MLo

    E^!#Yhxz8_O~11yPxdftVTM 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 Z_|&mAr{TZT@!$9G-x;y7HD?YS^M6li2#Wv! delta 544548 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\MQlEj zy~v=&R~yatgssG>quB;bAlWsVoyrU)4acy(DtZ2hI)-&sm=_-Ff)UDoDfw*-8^K`Ox-G%m*hbfOQ?R#c#H<2X@a zRdRvi&McmUKIFET1Wm$loJ#mfz|A2&CjrNjc|gK4`4$R1K+aJI>m-W9h&vg$XT&fW zz&fP+WDKLQr8OC&aTT&_G8!W+DO2G0q+6aZh6rPRUp8o27$ zu(DDL(!?|)j9yQcim;fXpDPW01O@UXUfH0BF%0TJW{?e*1~NYzEGLrRDNrPTQRgLj zPjNq!=&8WnAZb$p^d+OI)1EAu%GOgM{+X%BJV%~T=tNR!8XS?tO+&;?GH@Cqt|D_N z@CJ@v;rNnE6nBg`O=p8u_VY>Y=@_9n(sH^Sf8=x^Ym#+9LcCZ+fvd

    f9jiIcx(b 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 Date: Sun, 19 Aug 2012 15:56:19 +0400 Subject: [PATCH 060/103] "SimpleFlow" optical flow estimation algorithm (GSoC project) declaration in includes, implementation, usage example, test --- .../motion_analysis_and_object_tracking.rst | 44 + .../video/include/opencv2/video/tracking.hpp | 21 +- modules/video/src/simpleflow.cpp | 757 ++++++++++++++++++ modules/video/src/simpleflow.hpp | 125 +++ modules/video/test/test_simpleflow.cpp | 193 +++++ samples/cpp/simpleflow_demo.cpp | 96 +++ 6 files changed, 1235 insertions(+), 1 deletion(-) create mode 100644 modules/video/src/simpleflow.cpp create mode 100644 modules/video/src/simpleflow.hpp create mode 100644 modules/video/test/test_simpleflow.cpp create mode 100644 samples/cpp/simpleflow_demo.cpp diff --git a/modules/video/doc/motion_analysis_and_object_tracking.rst b/modules/video/doc/motion_analysis_and_object_tracking.rst index 6c196c2ff..ebb9290cc 100644 --- a/modules/video/doc/motion_analysis_and_object_tracking.rst +++ b/modules/video/doc/motion_analysis_and_object_tracking.rst @@ -597,6 +597,48 @@ Returns background image See :ocv:func:`BackgroundSubtractor::getBackgroundImage`. +calcOpticalFlowSF +----------- +Calculate an optical flow using "SimpleFlow" algorithm. + +.. ocv:function:: void calcOpticalFlowSF( Mat& prev, Mat& next, Mat& flowX, Mat& flowY, int layers, int averaging_block_size, int max_flow, double sigma_dist, double sigma_color, int postprocess_window, double sigma_dist_fix, double sigma_color_fix, double occ_thr, int upscale_averaging_radiud, double upscale_sigma_dist, double upscale_sigma_color, double speed_up_thr) + + :param prev: First 8-bit 3-channel image. + + :param next: Second 8-bit 3-channel image + + :param flowX: X-coordinate of estimated flow + + :param flowY: Y-coordinate of estimated flow + + :param layers: Number of layers + + :param averaging_block_size: Size of block through which we sum up when calculate cost function for pixel + + :param max_flow: maximal flow that we search at each level + + :param sigma_dist: vector smooth spatial sigma parameter + + :param sigma_color: vector smooth color sigma parameter + + :param postprocess_window: window size for postprocess cross bilateral filter + + :param sigma_dist_fix: spatial sigma for postprocess cross bilateralf filter + + :param sigma_color_fix: color sigma for postprocess cross bilateral filter + + :param occ_thr: threshold for detecting occlusions + + :param upscale_averaging_radiud: window size for bilateral upscale operation + + :param upscale_sigma_dist: spatial sigma for bilateral upscale operation + + :param upscale_sigma_color: color sigma for bilateral upscale operation + + :param speed_up_thr: threshold to detect point with irregular flow - where flow should be recalculated after upscale + +See [Tao2012]_. And site of project - http://graphics.berkeley.edu/papers/Tao-SAN-2012-05/. + .. [Bouguet00] Jean-Yves Bouguet. Pyramidal Implementation of the Lucas Kanade Feature Tracker. .. [Bradski98] Bradski, G.R. "Computer Vision Face Tracking for Use in a Perceptual User Interface", Intel, 1998 @@ -612,3 +654,5 @@ See :ocv:func:`BackgroundSubtractor::getBackgroundImage`. .. [Lucas81] Lucas, B., and Kanade, T. An Iterative Image Registration Technique with an Application to Stereo Vision, Proc. of 7th International Joint Conference on Artificial Intelligence (IJCAI), pp. 674-679. .. [Welch95] Greg Welch and Gary Bishop “An Introduction to the Kalman Filterâ€, 1995 + +.. [Tao2012] Michael Tao, Jiamin Bai, Pushmeet Kohli and Sylvain Paris. SimpleFlow: A Non-iterative, Sublinear Optical Flow Algorithm. Computer Graphics Forum (Eurographics 2012) diff --git a/modules/video/include/opencv2/video/tracking.hpp b/modules/video/include/opencv2/video/tracking.hpp index 75668d228..85c18817a 100644 --- a/modules/video/include/opencv2/video/tracking.hpp +++ b/modules/video/include/opencv2/video/tracking.hpp @@ -326,7 +326,26 @@ CV_EXPORTS_W void calcOpticalFlowFarneback( InputArray prev, InputArray next, // that maps one 2D point set to another or one image to another. CV_EXPORTS_W Mat estimateRigidTransform( InputArray src, InputArray dst, bool fullAffine); - + +//! computes dense optical flow using Simple Flow algorithm +CV_EXPORTS_W void calcOpticalFlowSF(Mat& from, + Mat& to, + Mat& flowX, + Mat& flowY, + int layers, + int averaging_block_size, + int max_flow, + double sigma_dist, + double sigma_color, + int postprocess_window, + double sigma_dist_fix, + double sigma_color_fix, + double occ_thr, + int upscale_averaging_radius, + double upscale_sigma_dist, + double upscale_sigma_color, + double speed_up_thr); + } #endif diff --git a/modules/video/src/simpleflow.cpp b/modules/video/src/simpleflow.cpp new file mode 100644 index 000000000..1fda3618c --- /dev/null +++ b/modules/video/src/simpleflow.cpp @@ -0,0 +1,757 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include "simpleflow.hpp" + +// +// 2D dense optical flow algorithm from the following paper: +// Michael Tao, Jiamin Bai, Pushmeet Kohli, and Sylvain Paris. +// "SimpleFlow: A Non-iterative, Sublinear Optical Flow Algorithm" +// Computer Graphics Forum (Eurographics 2012) +// http://graphics.berkeley.edu/papers/Tao-SAN-2012-05/ +// + +namespace cv +{ + +WeightedCrossBilateralFilter::WeightedCrossBilateralFilter( + const Mat& _image, + int _windowSize, + double _sigmaDist, + double _sigmaColor) + : image(_image), + windowSize(_windowSize), + sigmaDist(_sigmaDist), + sigmaColor(_sigmaColor) { + + expDist.resize(2*windowSize*windowSize+1); + const double sigmaDistSqr = 2 * sigmaDist * sigmaDist; + for (int i = 0; i <= 2*windowSize*windowSize; ++i) { + expDist[i] = exp(-i/sigmaDistSqr); + } + + const double sigmaColorSqr = 2 * sigmaColor * sigmaColor; + wc.resize(image.rows); + for (int row = 0; row < image.rows; ++row) { + wc[row].resize(image.cols); + for (int col = 0; col < image.cols; ++col) { + int beginRow = max(0, row - windowSize); + int beginCol = max(0, col - windowSize); + int endRow = min(image.rows - 1, row + windowSize); + int endCol = min(image.cols - 1, col + windowSize); + wc[row][col] = build(endRow - beginRow + 1, endCol - beginCol + 1); + + for (int r = beginRow; r <= endRow; ++r) { + for (int c = beginCol; c <= endCol; ++c) { + wc[row][col][r - beginRow][c - beginCol] = + exp(-dist(image.at(row, col), + image.at(r, c)) + / sigmaColorSqr); + } + } + } + } +} + +Mat WeightedCrossBilateralFilter::apply(Mat& matrix, Mat& weights) { + int rows = matrix.rows; + int cols = matrix.cols; + + Mat result = Mat::zeros(rows, cols, CV_64F); + for (int row = 0; row < rows; ++row) { + for(int col = 0; col < cols; ++col) { + result.at(row, col) = + convolution(matrix, row, col, weights); + } + } + return result; +} + +double WeightedCrossBilateralFilter::convolution(Mat& matrix, + int row, int col, + Mat& weights) { + double result = 0, weightsSum = 0; + int beginRow = max(0, row - windowSize); + int beginCol = max(0, col - windowSize); + int endRow = min(matrix.rows - 1, row + windowSize); + int endCol = min(matrix.cols - 1, col + windowSize); + for (int r = beginRow; r <= endRow; ++r) { + double* ptr = matrix.ptr(r); + for (int c = beginCol; c <= endCol; ++c) { + const double w = expDist[dist(row, col, r, c)] * + wc[row][col][r - beginRow][c - beginCol] * + weights.at(r, c); + result += ptr[c] * w; + weightsSum += w; + } + } + return result / weightsSum; +} + +static void removeOcclusions(const Flow& flow, + const Flow& flow_inv, + double occ_thr, + Mat& confidence) { + const int rows = flow.u.rows; + const int cols = flow.v.cols; + int occlusions = 0; + for (int r = 0; r < rows; ++r) { + for (int c = 0; c < cols; ++c) { + if (dist(flow.u.at(r, c), flow.v.at(r, c), + -flow_inv.u.at(r, c), -flow_inv.v.at(r, c)) > occ_thr) { + confidence.at(r, c) = 0; + occlusions++; + } + } + } +} + +static Mat wd(int top_shift, int bottom_shift, int left_shift, int right_shift, double sigma) { + const double factor = 1.0 / (2.0 * sigma * sigma); + Mat d = Mat(top_shift + bottom_shift + 1, right_shift + left_shift + 1, CV_64F); + for (int dr = -top_shift, r = 0; dr <= bottom_shift; ++dr, ++r) { + for (int dc = -left_shift, c = 0; dc <= right_shift; ++dc, ++c) { + d.at(r, c) = -(dr*dr + dc*dc) * factor; + } + } + Mat ed; + exp(d, ed); + return ed; +} + +static Mat wc(const Mat& image, int r0, int c0, int top_shift, int bottom_shift, int left_shift, int right_shift, double sigma) { + const double factor = 1.0 / (2.0 * sigma * sigma); + Mat d = Mat(top_shift + bottom_shift + 1, right_shift + left_shift + 1, CV_64F); + for (int dr = r0-top_shift, r = 0; dr <= r0+bottom_shift; ++dr, ++r) { + for (int dc = c0-left_shift, c = 0; dc <= c0+right_shift; ++dc, ++c) { + d.at(r, c) = -dist(image.at(r0, c0), image.at(dr, dc)) * factor; + } + } + Mat ed; + exp(d, ed); + return ed; +} + +inline static void dist(const Mat& m1, const Mat& m2, Mat& result) { + const int rows = m1.rows; + const int cols = m1.cols; + for (int r = 0; r < rows; ++r) { + const Vec3b *m1_row = m1.ptr(r); + const Vec3b *m2_row = m2.ptr(r); + double* row = result.ptr(r); + for (int c = 0; c < cols; ++c) { + row[c] = dist(m1_row[c], m2_row[c]); + } + } +} + +static void calcOpticalFlowSingleScaleSF(const Mat& prev, + const Mat& next, + const Mat& mask, + Flow& flow, + Mat& confidence, + int averaging_radius, + int max_flow, + double sigma_dist, + double sigma_color) { + const int rows = prev.rows; + const int cols = prev.cols; + confidence = Mat::zeros(rows, cols, CV_64F); + + for (int r0 = 0; r0 < rows; ++r0) { + for (int c0 = 0; c0 < cols; ++c0) { + int u0 = floor(flow.u.at(r0, c0) + 0.5); + int v0 = floor(flow.v.at(r0, c0) + 0.5); + + const int min_row_shift = -min(r0 + u0, max_flow); + const int max_row_shift = min(rows - 1 - (r0 + u0), max_flow); + const int min_col_shift = -min(c0 + v0, max_flow); + const int max_col_shift = min(cols - 1 - (c0 + v0), max_flow); + + double min_cost = DBL_MAX, best_u = u0, best_v = v0; + + Mat w_full_window; + double w_full_window_sum; + Mat diff_storage; + + if (r0 - averaging_radius >= 0 && + r0 + averaging_radius < rows && + c0 - averaging_radius >= 0 && + c0 + averaging_radius < cols && + mask.at(r0, c0)) { + w_full_window = wd(averaging_radius, + averaging_radius, + averaging_radius, + averaging_radius, + sigma_dist).mul( + wc(prev, r0, c0, + averaging_radius, + averaging_radius, + averaging_radius, + averaging_radius, + sigma_color)); + + w_full_window_sum = sum(w_full_window)[0]; + diff_storage = Mat::zeros(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_64F); + } + + bool first_flow_iteration = true; + double sum_e, min_e; + + for (int u = min_row_shift; u <= max_row_shift; ++u) { + for (int v = min_col_shift; v <= max_col_shift; ++v) { + double e = dist(prev.at(r0, c0), next.at(r0 + u0 + u, c0 + v0 + v)); + if (first_flow_iteration) { + sum_e = e; + min_e = e; + first_flow_iteration = false; + } else { + sum_e += e; + min_e = std::min(min_e, e); + } + if (!mask.at(r0, c0)) { + continue; + } + + const int window_top_shift = min(r0, r0 + u + u0, averaging_radius); + const int window_bottom_shift = min(rows - 1 - r0, + rows - 1 - (r0 + u + u0), + averaging_radius); + const int window_left_shift = min(c0, c0 + v + v0, averaging_radius); + const int window_right_shift = min(cols - 1 - c0, + cols - 1 - (c0 + v + v0), + averaging_radius); + + const Range prev_row_range(r0 - window_top_shift, r0 + window_bottom_shift + 1); + const Range prev_col_range(c0 - window_left_shift, c0 + window_right_shift + 1); + + const Range next_row_range(r0 + u0 + u - window_top_shift, + r0 + u0 + u + window_bottom_shift + 1); + const Range next_col_range(c0 + v0 + v - window_left_shift, + c0 + v0 + v + window_right_shift + 1); + + Mat diff2; + Mat w; + double w_sum; + if (window_top_shift == averaging_radius && + window_bottom_shift == averaging_radius && + window_left_shift == averaging_radius && + window_right_shift == averaging_radius) { + w = w_full_window; + w_sum = w_full_window_sum; + diff2 = diff_storage; + + dist(prev(prev_row_range, prev_col_range), next(next_row_range, next_col_range), diff2); + } else { + diff2 = Mat::zeros(window_bottom_shift + window_top_shift + 1, + window_right_shift + window_left_shift + 1, CV_64F); + + dist(prev(prev_row_range, prev_col_range), next(next_row_range, next_col_range), diff2); + + w = wd(window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_dist).mul( + wc(prev, r0, c0, window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_color)); + w_sum = sum(w)[0]; + } + multiply(diff2, w, diff2); + + const double cost = sum(diff2)[0] / w_sum; + if (cost < min_cost) { + min_cost = cost; + best_u = u + u0; + best_v = v + v0; + } + } + } + int square = (max_row_shift - min_row_shift + 1) * + (max_col_shift - min_col_shift + 1); + confidence.at(r0, c0) = (square == 0) ? 0 + : sum_e / square - min_e; + if (mask.at(r0, c0)) { + flow.u.at(r0, c0) = best_u; + flow.v.at(r0, c0) = best_v; + } + } + } +} + +static Flow upscaleOpticalFlow(int new_rows, + int new_cols, + const Mat& image, + const Mat& confidence, + const Flow& flow, + int averaging_radius, + double sigma_dist, + double sigma_color) { + const int rows = image.rows; + const int cols = image.cols; + Flow new_flow(new_rows, new_cols); + for (int r = 0; r < rows; ++r) { + for (int c = 0; c < cols; ++c) { + const int window_top_shift = min(r, averaging_radius); + const int window_bottom_shift = min(rows - 1 - r, averaging_radius); + const int window_left_shift = min(c, averaging_radius); + const int window_right_shift = min(cols - 1 - c, averaging_radius); + + const Range row_range(r - window_top_shift, r + window_bottom_shift + 1); + const Range col_range(c - window_left_shift, c + window_right_shift + 1); + + const Mat w = confidence(row_range, col_range).mul( + wd(window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_dist)).mul( + wc(image, r, c, window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_color)); + + const double w_sum = sum(w)[0]; + double new_u, new_v; + if (fabs(w_sum) < 1e-9) { + new_u = flow.u.at(r, c); + new_v = flow.v.at(r, c); + } else { + new_u = sum(flow.u(row_range, col_range).mul(w))[0] / w_sum; + new_v = sum(flow.v(row_range, col_range).mul(w))[0] / w_sum; + } + + for (int dr = 0; dr <= 1; ++dr) { + int nr = 2*r + dr; + for (int dc = 0; dc <= 1; ++dc) { + int nc = 2*c + dc; + if (nr < new_rows && nc < new_cols) { + new_flow.u.at(nr, nc) = 2 * new_u; + new_flow.v.at(nr, nc) = 2 * new_v; + } + } + } + } + } + return new_flow; +} + +static Mat calcIrregularityMat(const Flow& flow, int radius) { + const int rows = flow.u.rows; + const int cols = flow.v.cols; + Mat irregularity = Mat::zeros(rows, cols, CV_64F); + for (int r = 0; r < rows; ++r) { + const int start_row = max(0, r - radius); + const int end_row = min(rows - 1, r + radius); + for (int c = 0; c < cols; ++c) { + const int start_col = max(0, c - radius); + const int end_col = min(cols - 1, c + radius); + for (int dr = start_row; dr <= end_row; ++dr) { + for (int dc = start_col; dc <= end_col; ++dc) { + const double diff = dist(flow.u.at(r, c), flow.v.at(r, c), + flow.u.at(dr, dc), flow.v.at(dr, dc)); + if (diff > irregularity.at(r, c)) { + irregularity.at(r, c) = diff; + } + } + } + } + } + return irregularity; +} + +static void selectPointsToRecalcFlow(const Flow& flow, + int irregularity_metric_radius, + int speed_up_thr, + int curr_rows, + int curr_cols, + const Mat& prev_speed_up, + Mat& speed_up, + Mat& mask) { + const int prev_rows = flow.u.rows; + const int prev_cols = flow.v.cols; + + Mat is_flow_regular = calcIrregularityMat(flow, + irregularity_metric_radius) + < speed_up_thr; + Mat done = Mat::zeros(prev_rows, prev_cols, CV_8U); + speed_up = Mat::zeros(curr_rows, curr_cols, CV_8U); + mask = Mat::zeros(curr_rows, curr_cols, CV_8U); + + for (int r = 0; r < is_flow_regular.rows; ++r) { + for (int c = 0; c < is_flow_regular.cols; ++c) { + if (!done.at(r, c)) { + if (is_flow_regular.at(r, c) && + 2*r + 1 < curr_rows && 2*c + 1< curr_cols) { + + bool all_flow_in_region_regular = true; + int speed_up_at_this_point = prev_speed_up.at(r, c); + int step = (1 << speed_up_at_this_point) - 1; + int prev_top = r; + int prev_bottom = std::min(r + step, prev_rows - 1); + int prev_left = c; + int prev_right = std::min(c + step, prev_cols - 1); + + for (int rr = prev_top; rr <= prev_bottom; ++rr) { + for (int cc = prev_left; cc <= prev_right; ++cc) { + done.at(rr, cc) = 1; + if (!is_flow_regular.at(rr, cc)) { + all_flow_in_region_regular = false; + } + } + } + + int curr_top = std::min(2 * r, curr_rows - 1); + int curr_bottom = std::min(2*(r + step) + 1, curr_rows - 1); + int curr_left = std::min(2 * c, curr_cols - 1); + int curr_right = std::min(2*(c + step) + 1, curr_cols - 1); + + if (all_flow_in_region_regular && + curr_top != curr_bottom && + curr_left != curr_right) { + mask.at(curr_top, curr_left) = MASK_TRUE_VALUE; + mask.at(curr_bottom, curr_left) = MASK_TRUE_VALUE; + mask.at(curr_top, curr_right) = MASK_TRUE_VALUE; + mask.at(curr_bottom, curr_right) = MASK_TRUE_VALUE; + for (int rr = curr_top; rr <= curr_bottom; ++rr) { + for (int cc = curr_left; cc <= curr_right; ++cc) { + speed_up.at(rr, cc) = speed_up_at_this_point + 1; + } + } + } else { + for (int rr = curr_top; rr <= curr_bottom; ++rr) { + for (int cc = curr_left; cc <= curr_right; ++cc) { + mask.at(rr, cc) = MASK_TRUE_VALUE; + } + } + } + } else { + done.at(r, c) = 1; + for (int dr = 0; dr <= 1; ++dr) { + int nr = 2*r + dr; + for (int dc = 0; dc <= 1; ++dc) { + int nc = 2*c + dc; + if (nr < curr_rows && nc < curr_cols) { + mask.at(nr, nc) = MASK_TRUE_VALUE; + } + } + } + } + } + } + } +} + +static inline double extrapolateValueInRect(int height, int width, + double v11, double v12, + double v21, double v22, + int r, int c) { + if (r == 0 && c == 0) { return v11;} + if (r == 0 && c == width) { return v12;} + if (r == height && c == 0) { return v21;} + if (r == height && c == width) { return v22;} + + double qr = double(r) / height; + double pr = 1.0 - qr; + double qc = double(c) / width; + double pc = 1.0 - qc; + + return v11*pr*pc + v12*pr*qc + v21*qr*pc + v22*qc*qr; +} + +static void extrapolateFlow(Flow& flow, + const Mat& speed_up) { + const int rows = flow.u.rows; + const int cols = flow.u.cols; + Mat done = Mat::zeros(rows, cols, CV_8U); + for (int r = 0; r < rows; ++r) { + for (int c = 0; c < cols; ++c) { + if (!done.at(r, c) && speed_up.at(r, c) > 1) { + int step = (1 << speed_up.at(r, c)) - 1; + int top = r; + int bottom = std::min(r + step, rows - 1); + int left = c; + int right = std::min(c + step, cols - 1); + + int height = bottom - top; + int width = right - left; + for (int rr = top; rr <= bottom; ++rr) { + for (int cc = left; cc <= right; ++cc) { + done.at(rr, cc) = 1; + flow.u.at(rr, cc) = extrapolateValueInRect( + height, width, + flow.u.at(top, left), + flow.u.at(top, right), + flow.u.at(bottom, left), + flow.u.at(bottom, right), + rr-top, cc-left); + + flow.v.at(rr, cc) = extrapolateValueInRect( + height, width, + flow.v.at(top, left), + flow.v.at(top, right), + flow.v.at(bottom, left), + flow.v.at(bottom, right), + rr-top, cc-left); + } + } + } + } + } +} + +static void buildPyramidWithResizeMethod(Mat& src, + vector& pyramid, + int layers, + int interpolation_type) { + pyramid.push_back(src); + for (int i = 1; i <= layers; ++i) { + Mat prev = pyramid[i - 1]; + if (prev.rows <= 1 || prev.cols <= 1) { + break; + } + + Mat next; + resize(prev, next, Size((prev.cols + 1) / 2, (prev.rows + 1) / 2), 0, 0, interpolation_type); + pyramid.push_back(next); + } +} + +static Flow calcOpticalFlowSF(Mat& from, + Mat& to, + int layers, + int averaging_block_size, + int max_flow, + double sigma_dist, + double sigma_color, + int postprocess_window, + double sigma_dist_fix, + double sigma_color_fix, + double occ_thr, + int upscale_averaging_radius, + double upscale_sigma_dist, + double upscale_sigma_color, + double speed_up_thr) { + vector pyr_from_images; + vector pyr_to_images; + + buildPyramidWithResizeMethod(from, pyr_from_images, layers - 1, INTER_CUBIC); + buildPyramidWithResizeMethod(to, pyr_to_images, layers - 1, INTER_CUBIC); +// buildPyramid(from, pyr_from_images, layers - 1, BORDER_WRAP); +// buildPyramid(to, pyr_to_images, layers - 1, BORDER_WRAP); + + if ((int)pyr_from_images.size() != layers) { + exit(1); + } + + if ((int)pyr_to_images.size() != layers) { + exit(1); + } + + Mat first_from_image = pyr_from_images[layers - 1]; + Mat first_to_image = pyr_to_images[layers - 1]; + + Mat mask = Mat::ones(first_from_image.rows, first_from_image.cols, CV_8U); + Mat mask_inv = Mat::ones(first_from_image.rows, first_from_image.cols, CV_8U); + + Flow flow(first_from_image.rows, first_from_image.cols); + Flow flow_inv(first_to_image.rows, first_to_image.cols); + + Mat confidence; + Mat confidence_inv; + + calcOpticalFlowSingleScaleSF(first_from_image, + first_to_image, + mask, + flow, + confidence, + averaging_block_size, + max_flow, + sigma_dist, + sigma_color); + + calcOpticalFlowSingleScaleSF(first_to_image, + first_from_image, + mask_inv, + flow_inv, + confidence_inv, + averaging_block_size, + max_flow, + sigma_dist, + sigma_color); + + removeOcclusions(flow, + flow_inv, + occ_thr, + confidence); + + removeOcclusions(flow_inv, + flow, + occ_thr, + confidence_inv); + + Mat speed_up = Mat::zeros(first_from_image.rows, first_from_image.cols, CV_8U); + Mat speed_up_inv = Mat::zeros(first_from_image.rows, first_from_image.cols, CV_8U); + + for (int curr_layer = layers - 2; curr_layer >= 0; --curr_layer) { + const Mat curr_from = pyr_from_images[curr_layer]; + const Mat curr_to = pyr_to_images[curr_layer]; + const Mat prev_from = pyr_from_images[curr_layer + 1]; + const Mat prev_to = pyr_to_images[curr_layer + 1]; + + const int curr_rows = curr_from.rows; + const int curr_cols = curr_from.cols; + + Mat new_speed_up, new_speed_up_inv; + + selectPointsToRecalcFlow(flow, + averaging_block_size, + speed_up_thr, + curr_rows, + curr_cols, + speed_up, + new_speed_up, + mask); + + int points_to_recalculate = sum(mask)[0] / MASK_TRUE_VALUE; + + selectPointsToRecalcFlow(flow_inv, + averaging_block_size, + speed_up_thr, + curr_rows, + curr_cols, + speed_up_inv, + new_speed_up_inv, + mask_inv); + + points_to_recalculate = sum(mask_inv)[0] / MASK_TRUE_VALUE; + + speed_up = new_speed_up; + speed_up_inv = new_speed_up_inv; + + flow = upscaleOpticalFlow(curr_rows, + curr_cols, + prev_from, + confidence, + flow, + upscale_averaging_radius, + upscale_sigma_dist, + upscale_sigma_color); + + flow_inv = upscaleOpticalFlow(curr_rows, + curr_cols, + prev_to, + confidence_inv, + flow_inv, + upscale_averaging_radius, + upscale_sigma_dist, + upscale_sigma_color); + + calcOpticalFlowSingleScaleSF(curr_from, + curr_to, + mask, + flow, + confidence, + averaging_block_size, + max_flow, + sigma_dist, + sigma_color); + + calcOpticalFlowSingleScaleSF(curr_to, + curr_from, + mask_inv, + flow_inv, + confidence_inv, + averaging_block_size, + max_flow, + sigma_dist, + sigma_color); + + extrapolateFlow(flow, speed_up); + extrapolateFlow(flow_inv, speed_up_inv); + + removeOcclusions(flow, flow_inv, occ_thr, confidence); + removeOcclusions(flow_inv, flow, occ_thr, confidence_inv); + } + + WeightedCrossBilateralFilter filter_postprocess(pyr_from_images[0], + postprocess_window, + sigma_dist_fix, + sigma_color_fix); + + flow.u = filter_postprocess.apply(flow.u, confidence); + flow.v = filter_postprocess.apply(flow.v, confidence); + + Mat blured_u, blured_v; + GaussianBlur(flow.u, blured_u, Size(3, 3), 5); + GaussianBlur(flow.v, blured_v, Size(3, 3), 5); + + return Flow(blured_v, blured_u); +} + +void calcOpticalFlowSF(Mat& from, + Mat& to, + Mat& flowX, + Mat& flowY, + int layers, + int averaging_block_size, + int max_flow, + double sigma_dist, + double sigma_color, + int postprocess_window, + double sigma_dist_fix, + double sigma_color_fix, + double occ_thr, + int upscale_averaging_radius, + double upscale_sigma_dist, + double upscale_sigma_color, + double speed_up_thr) { + + Flow flow = calcOpticalFlowSF(from, to, + layers, + averaging_block_size, + max_flow, + sigma_dist, + sigma_color, + postprocess_window, + sigma_dist_fix, + sigma_color_fix, + occ_thr, + upscale_averaging_radius, + upscale_sigma_dist, + upscale_sigma_color, + speed_up_thr); + flowX = flow.u; + flowY = flow.v; +} + +} + diff --git a/modules/video/src/simpleflow.hpp b/modules/video/src/simpleflow.hpp new file mode 100644 index 000000000..55052fd05 --- /dev/null +++ b/modules/video/src/simpleflow.hpp @@ -0,0 +1,125 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#ifndef __OPENCV_SIMPLEFLOW_H__ +#define __OPENCV_SIMPLEFLOW_H__ + +#include + +using namespace std; + +#define MASK_TRUE_VALUE 255 +#define UNKNOWN_FLOW_THRESH 1e9 + +namespace cv { + +struct Flow { + Mat u, v; + + Flow() {;} + + Flow(Mat& _u, Mat& _v) + : u(_u), v(_v) {;} + + Flow(int rows, int cols) { + u = Mat::zeros(rows, cols, CV_64F); + v = Mat::zeros(rows, cols, CV_64F); + } +}; + +inline static double dist(const Vec3b& p1, const Vec3b& p2) { + return (p1[0] - p2[0]) * (p1[0] - p2[0]) + + (p1[1] - p2[1]) * (p1[1] - p2[1]) + + (p1[2] - p2[2]) * (p1[2] - p2[2]); +} + +inline static double dist(const Point2f& p1, const Point2f& p2) { + return (p1.x - p2.x) * (p1.x - p2.x) + + (p1.y - p2.y) * (p1.y - p2.y); +} + +inline static double dist(double x1, double y1, double x2, double y2) { + return (x1 - x2) * (x1 - x2) + + (y1 - y2) * (y1 - y2); +} + +inline static int dist(int x1, int y1, int x2, int y2) { + return (x1 - x2) * (x1 - x2) + + (y1 - y2) * (y1 - y2); +} + +template +inline static T min(T t1, T t2, T t3) { + return (t1 <= t2 && t1 <= t3) ? t1 : min(t2, t3); +} + +template +vector > build(int n, int m) { + vector > res(n); + for (int i = 0; i < n; ++i) { + res[i].resize(m, 0); + } + return res; +} + +class WeightedCrossBilateralFilter { +public: + WeightedCrossBilateralFilter(const Mat& _image, + int _windowSize, + double _sigmaDist, + double _sigmaColor); + + Mat apply(Mat& matrix, Mat& weights); + +private: + double convolution(Mat& matrix, int row, int col, Mat& weights); + + Mat image; + int windowSize; + double sigmaDist, sigmaColor; + + vector expDist; + vector > > > wc; +}; +} + +#endif diff --git a/modules/video/test/test_simpleflow.cpp b/modules/video/test/test_simpleflow.cpp new file mode 100644 index 000000000..186ba8f56 --- /dev/null +++ b/modules/video/test/test_simpleflow.cpp @@ -0,0 +1,193 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of Intel Corporation may not 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 Intel Corporation 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. +// +//M*/ + +#include "test_precomp.hpp" + +#include + +using namespace std; + +/* ///////////////////// simpleflow_test ///////////////////////// */ + +class CV_SimpleFlowTest : public cvtest::BaseTest +{ +public: + CV_SimpleFlowTest(); +protected: + void run(int); +}; + + +CV_SimpleFlowTest::CV_SimpleFlowTest() {} + +static void readOpticalFlowFromFile(FILE* file, cv::Mat& flowX, cv::Mat& flowY) { + char header[5]; + if (fread(header, 1, 4, file) < 4 && (string)header != "PIEH") { + return; + } + + int cols, rows; + if (fread(&cols, sizeof(int), 1, file) != 1|| + fread(&rows, sizeof(int), 1, file) != 1) { + return; + } + + flowX = cv::Mat::zeros(rows, cols, CV_64F); + flowY = cv::Mat::zeros(rows, cols, CV_64F); + + for (int i = 0; i < rows; ++i) { + for (int j = 0; j < cols; ++j) { + float uPoint, vPoint; + if (fread(&uPoint, sizeof(float), 1, file) != 1 || + fread(&vPoint, sizeof(float), 1, file) != 1) { + flowX.release(); + flowY.release(); + return; + } + + flowX.at(i, j) = uPoint; + flowY.at(i, j) = vPoint; + } + } +} + +static bool isFlowCorrect(double u) { + return !isnan(u) && (fabs(u) < 1e9); +} + +static double calc_rmse(cv::Mat flow1X, cv::Mat flow1Y, cv::Mat flow2X, cv::Mat flow2Y) { + long double sum; + int counter = 0; + const int rows = flow1X.rows; + const int cols = flow1X.cols; + + for (int y = 0; y < rows; ++y) { + for (int x = 0; x < cols; ++x) { + double u1 = flow1X.at(y, x); + double v1 = flow1Y.at(y, x); + double u2 = flow2X.at(y, x); + double v2 = flow2Y.at(y, x); + if (isFlowCorrect(u1) && isFlowCorrect(u2) && isFlowCorrect(v1) && isFlowCorrect(v2)) { + sum += (u1-u2)*(u1-u2) + (v1-v2)*(v1-v2); + counter++; + } + } + } + return sqrt((double)sum / (1e-9 + counter)); +} + +void CV_SimpleFlowTest::run(int) { + int code = cvtest::TS::OK; + + const double MAX_RMSE = 0.6; + const string frame1_path = ts->get_data_path() + "optflow/RubberWhale1.png"; + const string frame2_path = ts->get_data_path() + "optflow/RubberWhale2.png"; + const string gt_flow_path = ts->get_data_path() + "optflow/RubberWhale.flo"; + + cv::Mat frame1 = cv::imread(frame1_path); + cv::Mat frame2 = cv::imread(frame2_path); + + if (frame1.empty()) { + ts->printf(cvtest::TS::LOG, "could not read image %s\n", frame2_path.c_str()); + ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); + return; + } + + if (frame2.empty()) { + ts->printf(cvtest::TS::LOG, "could not read image %s\n", frame2_path.c_str()); + ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); + return; + } + + if (frame1.rows != frame2.rows && frame1.cols != frame2.cols) { + ts->printf(cvtest::TS::LOG, "images should be of equal sizes (%s and %s)", + frame1_path.c_str(), frame2_path.c_str()); + ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); + return; + } + + if (frame1.type() != 16 || frame2.type() != 16) { + ts->printf(cvtest::TS::LOG, "images should be of equal type CV_8UC3 (%s and %s)", + frame1_path.c_str(), frame2_path.c_str()); + ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); + return; + } + + cv::Mat flowX_gt, flowY_gt; + + FILE* gt_flow_file = fopen(gt_flow_path.c_str(), "rb"); + if (gt_flow_file == NULL) { + ts->printf(cvtest::TS::LOG, "could not read ground-thuth flow from file %s", + gt_flow_path.c_str()); + ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); + return; + } + readOpticalFlowFromFile(gt_flow_file, flowX_gt, flowY_gt); + if (flowX_gt.empty() || flowY_gt.empty()) { + ts->printf(cvtest::TS::LOG, "error while reading flow data from file %s", + gt_flow_path.c_str()); + ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); + return; + } + fclose(gt_flow_file); + + cv::Mat flowX, flowY; + cv::calcOpticalFlowSF(frame1, frame2, + flowX, flowY, + 3, 4, 2, 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5, 10); + + double rmse = calc_rmse(flowX_gt, flowY_gt, flowX, flowY); + + ts->printf(cvtest::TS::LOG, "Optical flow estimation RMSE for SimpleFlow algorithm : %lf\n", + rmse); + + if (rmse > MAX_RMSE) { + ts->printf( cvtest::TS::LOG, + "Too big rmse error : %lf ( >= %lf )\n", rmse, MAX_RMSE); + ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); + return; + } +} + + +TEST(Video_OpticalFlowSimpleFlow, accuracy) { CV_SimpleFlowTest test; test.safe_run(); } + +/* End of file. */ diff --git a/samples/cpp/simpleflow_demo.cpp b/samples/cpp/simpleflow_demo.cpp new file mode 100644 index 000000000..6a195fe89 --- /dev/null +++ b/samples/cpp/simpleflow_demo.cpp @@ -0,0 +1,96 @@ +#include "opencv2/video/tracking.hpp" +#include "opencv2/imgproc/imgproc.hpp" +#include "opencv2/highgui/highgui.hpp" + +#include +#include + +using namespace cv; +using namespace std; + +static void help() +{ + // print a welcome message, and the OpenCV version + printf("This is a demo of SimpleFlow optical flow algorithm,\n" + "Using OpenCV version %s\n\n", CV_VERSION); + + printf("Usage: simpleflow_demo frame1 frame2 output_flow" + "\nApplication will write estimated flow " + "\nbetween 'frame1' and 'frame2' in binary format" + "\ninto file 'output_flow'" + "\nThen one can use code from http://vision.middlebury.edu/flow/data/" + "\nto convert flow in binary file to image\n"); +} + +// binary file format for flow data specified here: +// http://vision.middlebury.edu/flow/data/ +static void writeOpticalFlowToFile(const Mat& u, const Mat& v, FILE* file) { + int cols = u.cols; + int rows = u.rows; + + fprintf(file, "PIEH"); + + if (fwrite(&cols, sizeof(int), 1, file) != 1 || + fwrite(&rows, sizeof(int), 1, file) != 1) { + fprintf(stderr, "writeOpticalFlowToFile : problem writing header\n"); + exit(1); + } + + for (int i= 0; i < u.rows; ++i) { + for (int j = 0; j < u.cols; ++j) { + float uPoint = u.at(i, j); + float vPoint = v.at(i, j); + + if (fwrite(&uPoint, sizeof(float), 1, file) != 1 || + fwrite(&vPoint, sizeof(float), 1, file) != 1) { + fprintf(stderr, "writeOpticalFlowToFile : problem writing data\n"); + exit(1); + } + } + } +} +int main(int argc, char** argv) { + help(); + + if (argc < 4) { + fprintf(stderr, "Wrong number of command line arguments : %d (expected %d)\n", argc, 4); + exit(1); + } + + Mat frame1 = imread(argv[1]); + Mat frame2 = imread(argv[2]); + + if (frame1.empty() || frame2.empty()) { + fprintf(stderr, "simpleflow_demo : Images cannot be read\n"); + exit(1); + } + + if (frame1.rows != frame2.rows && frame1.cols != frame2.cols) { + fprintf(stderr, "simpleflow_demo : Images should be of equal sizes\n"); + exit(1); + } + + if (frame1.type() != 16 || frame2.type() != 16) { + fprintf(stderr, "simpleflow_demo : Images should be of equal type CV_8UC3\n"); + exit(1); + } + + printf("simpleflow_demo : Read two images of size [rows = %d, cols = %d]\n", + frame1.rows, frame1.cols); + + Mat flowX, flowY; + + calcOpticalFlowSF(frame1, frame2, + flowX, flowY, + 3, 2, 4, 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5, 10); + + FILE* file = fopen(argv[3], "wb"); + if (file == NULL) { + fprintf(stderr, "simpleflow_demo : Unable to open file '%s' for writing\n", argv[3]); + exit(1); + } + printf("simpleflow_demo : Writing to file\n"); + writeOpticalFlowToFile(flowX, flowY, file); + fclose(file); + return 0; +} From 784c09d6f9f85f1aa0774fdca56387cd6817868d Mon Sep 17 00:00:00 2001 From: Yury Zemlyanskiy Date: Mon, 27 Aug 2012 14:40:57 +0400 Subject: [PATCH 061/103] Updates for SimpleFlow algorithm + New format for flow data - CV_32C2 + Memory optimization + Cross Bilateral Filter optimization + Minor optimizations + Sample for calcOpticalFlowSF improved --- .../video/include/opencv2/video/tracking.hpp | 5 +- modules/video/src/simpleflow.cpp | 448 +++++++----------- modules/video/src/simpleflow.hpp | 53 +-- modules/video/test/test_simpleflow.cpp | 63 +-- samples/cpp/simpleflow_demo.cpp | 243 +++++++--- 5 files changed, 390 insertions(+), 422 deletions(-) diff --git a/modules/video/include/opencv2/video/tracking.hpp b/modules/video/include/opencv2/video/tracking.hpp index 85c18817a..6800c6337 100644 --- a/modules/video/include/opencv2/video/tracking.hpp +++ b/modules/video/include/opencv2/video/tracking.hpp @@ -329,9 +329,8 @@ CV_EXPORTS_W Mat estimateRigidTransform( InputArray src, InputArray dst, //! computes dense optical flow using Simple Flow algorithm CV_EXPORTS_W void calcOpticalFlowSF(Mat& from, - Mat& to, - Mat& flowX, - Mat& flowY, + Mat& to, + Mat& flow, int layers, int averaging_block_size, int max_flow, diff --git a/modules/video/src/simpleflow.cpp b/modules/video/src/simpleflow.cpp index 1fda3618c..0cd320d6e 100644 --- a/modules/video/src/simpleflow.cpp +++ b/modules/video/src/simpleflow.cpp @@ -54,193 +54,154 @@ namespace cv { -WeightedCrossBilateralFilter::WeightedCrossBilateralFilter( - const Mat& _image, - int _windowSize, - double _sigmaDist, - double _sigmaColor) - : image(_image), - windowSize(_windowSize), - sigmaDist(_sigmaDist), - sigmaColor(_sigmaColor) { - - expDist.resize(2*windowSize*windowSize+1); - const double sigmaDistSqr = 2 * sigmaDist * sigmaDist; - for (int i = 0; i <= 2*windowSize*windowSize; ++i) { - expDist[i] = exp(-i/sigmaDistSqr); - } - - const double sigmaColorSqr = 2 * sigmaColor * sigmaColor; - wc.resize(image.rows); - for (int row = 0; row < image.rows; ++row) { - wc[row].resize(image.cols); - for (int col = 0; col < image.cols; ++col) { - int beginRow = max(0, row - windowSize); - int beginCol = max(0, col - windowSize); - int endRow = min(image.rows - 1, row + windowSize); - int endCol = min(image.cols - 1, col + windowSize); - wc[row][col] = build(endRow - beginRow + 1, endCol - beginCol + 1); - - for (int r = beginRow; r <= endRow; ++r) { - for (int c = beginCol; c <= endCol; ++c) { - wc[row][col][r - beginRow][c - beginCol] = - exp(-dist(image.at(row, col), - image.at(r, c)) - / sigmaColorSqr); - } - } - } - } -} - -Mat WeightedCrossBilateralFilter::apply(Mat& matrix, Mat& weights) { - int rows = matrix.rows; - int cols = matrix.cols; - - Mat result = Mat::zeros(rows, cols, CV_64F); - for (int row = 0; row < rows; ++row) { - for(int col = 0; col < cols; ++col) { - result.at(row, col) = - convolution(matrix, row, col, weights); - } - } - return result; -} - -double WeightedCrossBilateralFilter::convolution(Mat& matrix, - int row, int col, - Mat& weights) { - double result = 0, weightsSum = 0; - int beginRow = max(0, row - windowSize); - int beginCol = max(0, col - windowSize); - int endRow = min(matrix.rows - 1, row + windowSize); - int endCol = min(matrix.cols - 1, col + windowSize); - for (int r = beginRow; r <= endRow; ++r) { - double* ptr = matrix.ptr(r); - for (int c = beginCol; c <= endCol; ++c) { - const double w = expDist[dist(row, col, r, c)] * - wc[row][col][r - beginRow][c - beginCol] * - weights.at(r, c); - result += ptr[c] * w; - weightsSum += w; - } - } - return result / weightsSum; -} - -static void removeOcclusions(const Flow& flow, - const Flow& flow_inv, - double occ_thr, +static void removeOcclusions(const Mat& flow, + const Mat& flow_inv, + float occ_thr, Mat& confidence) { - const int rows = flow.u.rows; - const int cols = flow.v.cols; - int occlusions = 0; + const int rows = flow.rows; + const int cols = flow.cols; for (int r = 0; r < rows; ++r) { for (int c = 0; c < cols; ++c) { - if (dist(flow.u.at(r, c), flow.v.at(r, c), - -flow_inv.u.at(r, c), -flow_inv.v.at(r, c)) > occ_thr) { - confidence.at(r, c) = 0; - occlusions++; + if (dist(flow.at(r, c), -flow_inv.at(r, c)) > occ_thr) { + confidence.at(r, c) = 0; + } else { + confidence.at(r, c) = 1; } } } } -static Mat wd(int top_shift, int bottom_shift, int left_shift, int right_shift, double sigma) { - const double factor = 1.0 / (2.0 * sigma * sigma); - Mat d = Mat(top_shift + bottom_shift + 1, right_shift + left_shift + 1, CV_64F); +static void wd(Mat& d, int top_shift, int bottom_shift, int left_shift, int right_shift, float sigma) { + const float factor = 1.0 / (2.0 * sigma * sigma); for (int dr = -top_shift, r = 0; dr <= bottom_shift; ++dr, ++r) { for (int dc = -left_shift, c = 0; dc <= right_shift; ++dc, ++c) { - d.at(r, c) = -(dr*dr + dc*dc) * factor; + d.at(r, c) = -(dr*dr + dc*dc) * factor; } } - Mat ed; - exp(d, ed); - return ed; + exp(d, d); } -static Mat wc(const Mat& image, int r0, int c0, int top_shift, int bottom_shift, int left_shift, int right_shift, double sigma) { - const double factor = 1.0 / (2.0 * sigma * sigma); - Mat d = Mat(top_shift + bottom_shift + 1, right_shift + left_shift + 1, CV_64F); +static void wc(const Mat& image, Mat& d, int r0, int c0, + int top_shift, int bottom_shift, int left_shift, int right_shift, float sigma) { + const float factor = 1.0 / (2.0 * sigma * sigma); + const Vec3b centeral_point = image.at(r0, c0); for (int dr = r0-top_shift, r = 0; dr <= r0+bottom_shift; ++dr, ++r) { + const Vec3b *row = image.ptr(dr); + float *d_row = d.ptr(r); for (int dc = c0-left_shift, c = 0; dc <= c0+right_shift; ++dc, ++c) { - d.at(r, c) = -dist(image.at(r0, c0), image.at(dr, dc)) * factor; + d_row[c] = -dist(centeral_point, row[dc]) * factor; } } - Mat ed; - exp(d, ed); - return ed; + exp(d, d); } -inline static void dist(const Mat& m1, const Mat& m2, Mat& result) { +static void dist(const Mat& m1, const Mat& m2, Mat& result) { const int rows = m1.rows; const int cols = m1.cols; for (int r = 0; r < rows; ++r) { const Vec3b *m1_row = m1.ptr(r); const Vec3b *m2_row = m2.ptr(r); - double* row = result.ptr(r); + float* row = result.ptr(r); for (int c = 0; c < cols; ++c) { row[c] = dist(m1_row[c], m2_row[c]); } } } +static void crossBilateralFilter(const Mat& image, const Mat& edge_image, const Mat confidence, Mat& dst, int d, float sigma_color, float sigma_space, bool flag=false) { + const int rows = image.rows; + const int cols = image.cols; + Mat image_extended, edge_image_extended, confidence_extended; + copyMakeBorder(image, image_extended, d, d, d, d, BORDER_DEFAULT); + copyMakeBorder(edge_image, edge_image_extended, d, d, d, d, BORDER_DEFAULT); + copyMakeBorder(confidence, confidence_extended, d, d, d, d, BORDER_CONSTANT, Scalar(0)); + Mat weights_space(2*d+1, 2*d+1, CV_32F); + wd(weights_space, d, d, d, d, sigma_space); + Mat weights(2*d+1, 2*d+1, CV_32F); + Mat weighted_sum(2*d+1, 2*d+1, CV_32F); + + + vector image_extended_channels; + split(image_extended, image_extended_channels); + + for (int row = 0; row < rows; ++row) { + for (int col = 0; col < cols; ++col) { + wc(edge_image_extended, weights, row+d, col+d, d, d, d, d, sigma_color); + + Range window_rows(row,row+2*d+1); + Range window_cols(col,col+2*d+1); + + multiply(weights, confidence_extended(window_rows, window_cols), weights); + multiply(weights, weights_space, weights); + float weights_sum = sum(weights)[0]; + + for (int ch = 0; ch < 2; ++ch) { + multiply(weights, image_extended_channels[ch](window_rows, window_cols), weighted_sum); + float total_sum = sum(weighted_sum)[0]; + + dst.at(row, col)[ch] = (flag && fabs(weights_sum) < 1e-9) + ? image.at(row, col) + : total_sum / weights_sum; + } + } + } +} + static void calcOpticalFlowSingleScaleSF(const Mat& prev, const Mat& next, const Mat& mask, - Flow& flow, + Mat& flow, Mat& confidence, int averaging_radius, int max_flow, - double sigma_dist, - double sigma_color) { + float sigma_dist, + float sigma_color) { const int rows = prev.rows; const int cols = prev.cols; - confidence = Mat::zeros(rows, cols, CV_64F); + confidence = Mat::zeros(rows, cols, CV_32F); + + Mat diff_storage(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); + Mat w_full_window(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); + Mat wd_full_window(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); + float w_full_window_sum; + + Mat prev_extended; + copyMakeBorder(prev, prev_extended, + averaging_radius, averaging_radius, averaging_radius, averaging_radius, + BORDER_DEFAULT); + + wd(wd_full_window, averaging_radius, averaging_radius, averaging_radius, averaging_radius, sigma_dist); for (int r0 = 0; r0 < rows; ++r0) { for (int c0 = 0; c0 < cols; ++c0) { - int u0 = floor(flow.u.at(r0, c0) + 0.5); - int v0 = floor(flow.v.at(r0, c0) + 0.5); + Vec2f flow_at_point = flow.at(r0, c0); + int u0 = floor(flow_at_point[0] + 0.5); + if (r0 + u0 < 0) { u0 = -r0; } + if (r0 + u0 >= rows) { u0 = rows - 1 - r0; } + int v0 = floor(flow_at_point[1] + 0.5); + if (c0 + v0 < 0) { v0 = -c0; } + if (c0 + v0 >= cols) { v0 = cols - 1 - c0; } const int min_row_shift = -min(r0 + u0, max_flow); const int max_row_shift = min(rows - 1 - (r0 + u0), max_flow); const int min_col_shift = -min(c0 + v0, max_flow); const int max_col_shift = min(cols - 1 - (c0 + v0), max_flow); - double min_cost = DBL_MAX, best_u = u0, best_v = v0; - - Mat w_full_window; - double w_full_window_sum; - Mat diff_storage; - - if (r0 - averaging_radius >= 0 && - r0 + averaging_radius < rows && - c0 - averaging_radius >= 0 && - c0 + averaging_radius < cols && - mask.at(r0, c0)) { - w_full_window = wd(averaging_radius, - averaging_radius, - averaging_radius, - averaging_radius, - sigma_dist).mul( - wc(prev, r0, c0, - averaging_radius, - averaging_radius, - averaging_radius, - averaging_radius, - sigma_color)); + float min_cost = DBL_MAX, best_u = u0, best_v = v0; + if (mask.at(r0, c0)) { + wc(prev_extended, w_full_window, r0 + averaging_radius, c0 + averaging_radius, + averaging_radius, averaging_radius, averaging_radius, averaging_radius, sigma_color); + multiply(w_full_window, wd_full_window, w_full_window); w_full_window_sum = sum(w_full_window)[0]; - diff_storage = Mat::zeros(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_64F); } bool first_flow_iteration = true; - double sum_e, min_e; + float sum_e, min_e; for (int u = min_row_shift; u <= max_row_shift; ++u) { for (int v = min_col_shift; v <= max_col_shift; ++v) { - double e = dist(prev.at(r0, c0), next.at(r0 + u0 + u, c0 + v0 + v)); + float e = dist(prev.at(r0, c0), next.at(r0 + u0 + u, c0 + v0 + v)); if (first_flow_iteration) { sum_e = e; min_e = e; @@ -269,10 +230,11 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, r0 + u0 + u + window_bottom_shift + 1); const Range next_col_range(c0 + v0 + v - window_left_shift, c0 + v0 + v + window_right_shift + 1); - + + Mat diff2; Mat w; - double w_sum; + float w_sum; if (window_top_shift == averaging_radius && window_bottom_shift == averaging_radius && window_left_shift == averaging_radius && @@ -280,21 +242,23 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, w = w_full_window; w_sum = w_full_window_sum; diff2 = diff_storage; - dist(prev(prev_row_range, prev_col_range), next(next_row_range, next_col_range), diff2); } else { - diff2 = Mat::zeros(window_bottom_shift + window_top_shift + 1, - window_right_shift + window_left_shift + 1, CV_64F); + diff2 = diff_storage(Range(averaging_radius - window_top_shift, + averaging_radius + 1 + window_bottom_shift), + Range(averaging_radius - window_left_shift, + averaging_radius + 1 + window_right_shift)); dist(prev(prev_row_range, prev_col_range), next(next_row_range, next_col_range), diff2); - - w = wd(window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_dist).mul( - wc(prev, r0, c0, window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_color)); + w = w_full_window(Range(averaging_radius - window_top_shift, + averaging_radius + 1 + window_bottom_shift), + Range(averaging_radius - window_left_shift, + averaging_radius + 1 + window_right_shift)); w_sum = sum(w)[0]; } multiply(diff2, w, diff2); - const double cost = sum(diff2)[0] / w_sum; + const float cost = sum(diff2)[0] / w_sum; if (cost < min_cost) { min_cost = cost; best_u = u + u0; @@ -302,72 +266,37 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, } } } - int square = (max_row_shift - min_row_shift + 1) * - (max_col_shift - min_col_shift + 1); - confidence.at(r0, c0) = (square == 0) ? 0 - : sum_e / square - min_e; + int windows_square = (max_row_shift - min_row_shift + 1) * + (max_col_shift - min_col_shift + 1); + confidence.at(r0, c0) = (windows_square == 0) ? 0 + : sum_e / windows_square - min_e; + CV_Assert(confidence.at(r0, c0) >= 0); // TODO: remove it after testing if (mask.at(r0, c0)) { - flow.u.at(r0, c0) = best_u; - flow.v.at(r0, c0) = best_v; + flow.at(r0, c0) = Vec2f(best_u, best_v); } } } } -static Flow upscaleOpticalFlow(int new_rows, +static Mat upscaleOpticalFlow(int new_rows, int new_cols, const Mat& image, const Mat& confidence, - const Flow& flow, + Mat& flow, int averaging_radius, - double sigma_dist, - double sigma_color) { - const int rows = image.rows; - const int cols = image.cols; - Flow new_flow(new_rows, new_cols); - for (int r = 0; r < rows; ++r) { - for (int c = 0; c < cols; ++c) { - const int window_top_shift = min(r, averaging_radius); - const int window_bottom_shift = min(rows - 1 - r, averaging_radius); - const int window_left_shift = min(c, averaging_radius); - const int window_right_shift = min(cols - 1 - c, averaging_radius); - - const Range row_range(r - window_top_shift, r + window_bottom_shift + 1); - const Range col_range(c - window_left_shift, c + window_right_shift + 1); - - const Mat w = confidence(row_range, col_range).mul( - wd(window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_dist)).mul( - wc(image, r, c, window_top_shift, window_bottom_shift, window_left_shift, window_right_shift, sigma_color)); - - const double w_sum = sum(w)[0]; - double new_u, new_v; - if (fabs(w_sum) < 1e-9) { - new_u = flow.u.at(r, c); - new_v = flow.v.at(r, c); - } else { - new_u = sum(flow.u(row_range, col_range).mul(w))[0] / w_sum; - new_v = sum(flow.v(row_range, col_range).mul(w))[0] / w_sum; - } - - for (int dr = 0; dr <= 1; ++dr) { - int nr = 2*r + dr; - for (int dc = 0; dc <= 1; ++dc) { - int nc = 2*c + dc; - if (nr < new_rows && nc < new_cols) { - new_flow.u.at(nr, nc) = 2 * new_u; - new_flow.v.at(nr, nc) = 2 * new_v; - } - } - } - } - } + float sigma_dist, + float sigma_color) { + crossBilateralFilter(flow, image, confidence, flow, averaging_radius, sigma_color, sigma_dist, false); + Mat new_flow; + resize(flow, new_flow, Size(new_cols, new_rows), 0, 0, INTER_NEAREST); + new_flow *= 2; return new_flow; } -static Mat calcIrregularityMat(const Flow& flow, int radius) { - const int rows = flow.u.rows; - const int cols = flow.v.cols; - Mat irregularity = Mat::zeros(rows, cols, CV_64F); +static Mat calcIrregularityMat(const Mat& flow, int radius) { + const int rows = flow.rows; + const int cols = flow.cols; + Mat irregularity(rows, cols, CV_32F); for (int r = 0; r < rows; ++r) { const int start_row = max(0, r - radius); const int end_row = min(rows - 1, r + radius); @@ -376,10 +305,9 @@ static Mat calcIrregularityMat(const Flow& flow, int radius) { const int end_col = min(cols - 1, c + radius); for (int dr = start_row; dr <= end_row; ++dr) { for (int dc = start_col; dc <= end_col; ++dc) { - const double diff = dist(flow.u.at(r, c), flow.v.at(r, c), - flow.u.at(dr, dc), flow.v.at(dr, dc)); - if (diff > irregularity.at(r, c)) { - irregularity.at(r, c) = diff; + const float diff = dist(flow.at(r, c), flow.at(dr, dc)); + if (diff > irregularity.at(r, c)) { + irregularity.at(r, c) = diff; } } } @@ -388,7 +316,7 @@ static Mat calcIrregularityMat(const Flow& flow, int radius) { return irregularity; } -static void selectPointsToRecalcFlow(const Flow& flow, +static void selectPointsToRecalcFlow(const Mat& flow, int irregularity_metric_radius, int speed_up_thr, int curr_rows, @@ -396,11 +324,10 @@ static void selectPointsToRecalcFlow(const Flow& flow, const Mat& prev_speed_up, Mat& speed_up, Mat& mask) { - const int prev_rows = flow.u.rows; - const int prev_cols = flow.v.cols; + const int prev_rows = flow.rows; + const int prev_cols = flow.cols; - Mat is_flow_regular = calcIrregularityMat(flow, - irregularity_metric_radius) + Mat is_flow_regular = calcIrregularityMat(flow, irregularity_metric_radius) < speed_up_thr; Mat done = Mat::zeros(prev_rows, prev_cols, CV_8U); speed_up = Mat::zeros(curr_rows, curr_cols, CV_8U); @@ -470,28 +397,28 @@ static void selectPointsToRecalcFlow(const Flow& flow, } } -static inline double extrapolateValueInRect(int height, int width, - double v11, double v12, - double v21, double v22, +static inline float extrapolateValueInRect(int height, int width, + float v11, float v12, + float v21, float v22, int r, int c) { if (r == 0 && c == 0) { return v11;} if (r == 0 && c == width) { return v12;} if (r == height && c == 0) { return v21;} if (r == height && c == width) { return v22;} - double qr = double(r) / height; - double pr = 1.0 - qr; - double qc = double(c) / width; - double pc = 1.0 - qc; + float qr = float(r) / height; + float pr = 1.0 - qr; + float qc = float(c) / width; + float pc = 1.0 - qc; return v11*pr*pc + v12*pr*qc + v21*qr*pc + v22*qc*qr; } -static void extrapolateFlow(Flow& flow, +static void extrapolateFlow(Mat& flow, const Mat& speed_up) { - const int rows = flow.u.rows; - const int cols = flow.u.cols; - Mat done = Mat::zeros(rows, cols, CV_8U); + const int rows = flow.rows; + const int cols = flow.cols; + Mat done(rows, cols, CV_8U); for (int r = 0; r < rows; ++r) { for (int c = 0; c < cols; ++c) { if (!done.at(r, c) && speed_up.at(r, c) > 1) { @@ -506,21 +433,22 @@ static void extrapolateFlow(Flow& flow, for (int rr = top; rr <= bottom; ++rr) { for (int cc = left; cc <= right; ++cc) { done.at(rr, cc) = 1; - flow.u.at(rr, cc) = extrapolateValueInRect( - height, width, - flow.u.at(top, left), - flow.u.at(top, right), - flow.u.at(bottom, left), - flow.u.at(bottom, right), - rr-top, cc-left); + Vec2f flow_at_point; + Vec2f top_left = flow.at(top, left); + Vec2f top_right = flow.at(top, right); + Vec2f bottom_left = flow.at(bottom, left); + Vec2f bottom_right = flow.at(bottom, right); - flow.v.at(rr, cc) = extrapolateValueInRect( - height, width, - flow.v.at(top, left), - flow.v.at(top, right), - flow.v.at(bottom, left), - flow.v.at(bottom, right), - rr-top, cc-left); + flow_at_point[0] = extrapolateValueInRect(height, width, + top_left[0], top_right[0], + bottom_left[0], bottom_right[0], + rr-top, cc-left); + + flow_at_point[1] = extrapolateValueInRect(height, width, + top_left[1], top_right[1], + bottom_left[1], bottom_right[1], + rr-top, cc-left); + flow.at(rr, cc) = flow_at_point; } } } @@ -545,8 +473,9 @@ static void buildPyramidWithResizeMethod(Mat& src, } } -static Flow calcOpticalFlowSF(Mat& from, +void calcOpticalFlowSF(Mat& from, Mat& to, + Mat& resulted_flow, int layers, int averaging_block_size, int max_flow, @@ -565,8 +494,6 @@ static Flow calcOpticalFlowSF(Mat& from, buildPyramidWithResizeMethod(from, pyr_from_images, layers - 1, INTER_CUBIC); buildPyramidWithResizeMethod(to, pyr_to_images, layers - 1, INTER_CUBIC); -// buildPyramid(from, pyr_from_images, layers - 1, BORDER_WRAP); -// buildPyramid(to, pyr_to_images, layers - 1, BORDER_WRAP); if ((int)pyr_from_images.size() != layers) { exit(1); @@ -582,8 +509,8 @@ static Flow calcOpticalFlowSF(Mat& from, Mat mask = Mat::ones(first_from_image.rows, first_from_image.cols, CV_8U); Mat mask_inv = Mat::ones(first_from_image.rows, first_from_image.cols, CV_8U); - Flow flow(first_from_image.rows, first_from_image.cols); - Flow flow_inv(first_to_image.rows, first_to_image.cols); + Mat flow(first_from_image.rows, first_from_image.cols, CV_32FC2); + Mat flow_inv(first_to_image.rows, first_to_image.cols, CV_32FC2); Mat confidence; Mat confidence_inv; @@ -641,8 +568,6 @@ static Flow calcOpticalFlowSF(Mat& from, new_speed_up, mask); - int points_to_recalculate = sum(mask)[0] / MASK_TRUE_VALUE; - selectPointsToRecalcFlow(flow_inv, averaging_block_size, speed_up_thr, @@ -652,8 +577,6 @@ static Flow calcOpticalFlowSF(Mat& from, new_speed_up_inv, mask_inv); - points_to_recalculate = sum(mask_inv)[0] / MASK_TRUE_VALUE; - speed_up = new_speed_up; speed_up_inv = new_speed_up_inv; @@ -702,55 +625,14 @@ static Flow calcOpticalFlowSF(Mat& from, removeOcclusions(flow_inv, flow, occ_thr, confidence_inv); } - WeightedCrossBilateralFilter filter_postprocess(pyr_from_images[0], - postprocess_window, - sigma_dist_fix, - sigma_color_fix); + crossBilateralFilter(flow, pyr_from_images[0], confidence, flow, + postprocess_window, sigma_color_fix, sigma_dist_fix); - flow.u = filter_postprocess.apply(flow.u, confidence); - flow.v = filter_postprocess.apply(flow.v, confidence); + GaussianBlur(flow, flow, Size(3, 3), 5); - Mat blured_u, blured_v; - GaussianBlur(flow.u, blured_u, Size(3, 3), 5); - GaussianBlur(flow.v, blured_v, Size(3, 3), 5); - - return Flow(blured_v, blured_u); -} - -void calcOpticalFlowSF(Mat& from, - Mat& to, - Mat& flowX, - Mat& flowY, - int layers, - int averaging_block_size, - int max_flow, - double sigma_dist, - double sigma_color, - int postprocess_window, - double sigma_dist_fix, - double sigma_color_fix, - double occ_thr, - int upscale_averaging_radius, - double upscale_sigma_dist, - double upscale_sigma_color, - double speed_up_thr) { - - Flow flow = calcOpticalFlowSF(from, to, - layers, - averaging_block_size, - max_flow, - sigma_dist, - sigma_color, - postprocess_window, - sigma_dist_fix, - sigma_color_fix, - occ_thr, - upscale_averaging_radius, - upscale_sigma_dist, - upscale_sigma_color, - speed_up_thr); - flowX = flow.u; - flowY = flow.v; + resulted_flow = Mat(flow.size(), CV_32FC2); + int from_to[] = {0,1 , 1,0}; + mixChannels(&flow, 1, &resulted_flow, 1, from_to, 2); } } diff --git a/modules/video/src/simpleflow.hpp b/modules/video/src/simpleflow.hpp index 55052fd05..c4aa02355 100644 --- a/modules/video/src/simpleflow.hpp +++ b/modules/video/src/simpleflow.hpp @@ -52,32 +52,23 @@ using namespace std; namespace cv { -struct Flow { - Mat u, v; - - Flow() {;} - - Flow(Mat& _u, Mat& _v) - : u(_u), v(_v) {;} - - Flow(int rows, int cols) { - u = Mat::zeros(rows, cols, CV_64F); - v = Mat::zeros(rows, cols, CV_64F); - } -}; - -inline static double dist(const Vec3b& p1, const Vec3b& p2) { +inline static float dist(const Vec3b& p1, const Vec3b& p2) { return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) + (p1[2] - p2[2]) * (p1[2] - p2[2]); } -inline static double dist(const Point2f& p1, const Point2f& p2) { +inline static float dist(const Vec2f& p1, const Vec2f& p2) { + return (p1[0] - p2[0]) * (p1[0] - p2[0]) + + (p1[1] - p2[1]) * (p1[1] - p2[1]); +} + +inline static float dist(const Point2f& p1, const Point2f& p2) { return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y); } -inline static double dist(double x1, double y1, double x2, double y2) { +inline static float dist(float x1, float y1, float x2, float y2) { return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); } @@ -92,34 +83,6 @@ inline static T min(T t1, T t2, T t3) { return (t1 <= t2 && t1 <= t3) ? t1 : min(t2, t3); } -template -vector > build(int n, int m) { - vector > res(n); - for (int i = 0; i < n; ++i) { - res[i].resize(m, 0); - } - return res; -} - -class WeightedCrossBilateralFilter { -public: - WeightedCrossBilateralFilter(const Mat& _image, - int _windowSize, - double _sigmaDist, - double _sigmaColor); - - Mat apply(Mat& matrix, Mat& weights); - -private: - double convolution(Mat& matrix, int row, int col, Mat& weights); - - Mat image; - int windowSize; - double sigmaDist, sigmaColor; - - vector expDist; - vector > > > wc; -}; } #endif diff --git a/modules/video/test/test_simpleflow.cpp b/modules/video/test/test_simpleflow.cpp index 186ba8f56..050d595d1 100644 --- a/modules/video/test/test_simpleflow.cpp +++ b/modules/video/test/test_simpleflow.cpp @@ -58,66 +58,67 @@ protected: CV_SimpleFlowTest::CV_SimpleFlowTest() {} -static void readOpticalFlowFromFile(FILE* file, cv::Mat& flowX, cv::Mat& flowY) { +static bool readOpticalFlowFromFile(FILE* file, cv::Mat& flow) { char header[5]; if (fread(header, 1, 4, file) < 4 && (string)header != "PIEH") { - return; + return false; } int cols, rows; if (fread(&cols, sizeof(int), 1, file) != 1|| fread(&rows, sizeof(int), 1, file) != 1) { - return; + return false; } - flowX = cv::Mat::zeros(rows, cols, CV_64F); - flowY = cv::Mat::zeros(rows, cols, CV_64F); + flow = cv::Mat::zeros(rows, cols, CV_32FC2); for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { - float uPoint, vPoint; - if (fread(&uPoint, sizeof(float), 1, file) != 1 || - fread(&vPoint, sizeof(float), 1, file) != 1) { - flowX.release(); - flowY.release(); - return; + cv::Vec2f flow_at_point; + if (fread(&(flow_at_point[0]), sizeof(float), 1, file) != 1 || + fread(&(flow_at_point[1]), sizeof(float), 1, file) != 1) { + return false; } - - flowX.at(i, j) = uPoint; - flowY.at(i, j) = vPoint; + flow.at(i, j) = flow_at_point; } } + + return true; } -static bool isFlowCorrect(double u) { +static bool isFlowCorrect(float u) { return !isnan(u) && (fabs(u) < 1e9); } -static double calc_rmse(cv::Mat flow1X, cv::Mat flow1Y, cv::Mat flow2X, cv::Mat flow2Y) { - long double sum; +static float calc_rmse(cv::Mat flow1, cv::Mat flow2) { + float sum; int counter = 0; - const int rows = flow1X.rows; - const int cols = flow1X.cols; + const int rows = flow1.rows; + const int cols = flow1.cols; for (int y = 0; y < rows; ++y) { for (int x = 0; x < cols; ++x) { - double u1 = flow1X.at(y, x); - double v1 = flow1Y.at(y, x); - double u2 = flow2X.at(y, x); - double v2 = flow2Y.at(y, x); + cv::Vec2f flow1_at_point = flow1.at(y, x); + cv::Vec2f flow2_at_point = flow2.at(y, x); + + float u1 = flow1_at_point[0]; + float v1 = flow1_at_point[1]; + float u2 = flow2_at_point[0]; + float v2 = flow2_at_point[1]; + if (isFlowCorrect(u1) && isFlowCorrect(u2) && isFlowCorrect(v1) && isFlowCorrect(v2)) { sum += (u1-u2)*(u1-u2) + (v1-v2)*(v1-v2); counter++; } } } - return sqrt((double)sum / (1e-9 + counter)); + return sqrt(sum / (1e-9 + counter)); } void CV_SimpleFlowTest::run(int) { int code = cvtest::TS::OK; - const double MAX_RMSE = 0.6; + const float MAX_RMSE = 0.6; const string frame1_path = ts->get_data_path() + "optflow/RubberWhale1.png"; const string frame2_path = ts->get_data_path() + "optflow/RubberWhale2.png"; const string gt_flow_path = ts->get_data_path() + "optflow/RubberWhale.flo"; @@ -151,7 +152,7 @@ void CV_SimpleFlowTest::run(int) { return; } - cv::Mat flowX_gt, flowY_gt; + cv::Mat flow_gt; FILE* gt_flow_file = fopen(gt_flow_path.c_str(), "rb"); if (gt_flow_file == NULL) { @@ -160,8 +161,8 @@ void CV_SimpleFlowTest::run(int) { ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); return; } - readOpticalFlowFromFile(gt_flow_file, flowX_gt, flowY_gt); - if (flowX_gt.empty() || flowY_gt.empty()) { + + if (!readOpticalFlowFromFile(gt_flow_file, flow_gt)) { ts->printf(cvtest::TS::LOG, "error while reading flow data from file %s", gt_flow_path.c_str()); ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA); @@ -169,12 +170,12 @@ void CV_SimpleFlowTest::run(int) { } fclose(gt_flow_file); - cv::Mat flowX, flowY; + cv::Mat flow; cv::calcOpticalFlowSF(frame1, frame2, - flowX, flowY, + flow, 3, 4, 2, 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5, 10); - double rmse = calc_rmse(flowX_gt, flowY_gt, flowX, flowY); + float rmse = calc_rmse(flow_gt, flow); ts->printf(cvtest::TS::LOG, "Optical flow estimation RMSE for SimpleFlow algorithm : %lf\n", rmse); diff --git a/samples/cpp/simpleflow_demo.cpp b/samples/cpp/simpleflow_demo.cpp index 6a195fe89..332df7821 100644 --- a/samples/cpp/simpleflow_demo.cpp +++ b/samples/cpp/simpleflow_demo.cpp @@ -8,89 +8,212 @@ using namespace cv; using namespace std; +#define APP_NAME "simpleflow_demo : " + static void help() { - // print a welcome message, and the OpenCV version - printf("This is a demo of SimpleFlow optical flow algorithm,\n" - "Using OpenCV version %s\n\n", CV_VERSION); + // print a welcome message, and the OpenCV version + printf("This is a demo of SimpleFlow optical flow algorithm,\n" + "Using OpenCV version %s\n\n", CV_VERSION); - printf("Usage: simpleflow_demo frame1 frame2 output_flow" - "\nApplication will write estimated flow " - "\nbetween 'frame1' and 'frame2' in binary format" - "\ninto file 'output_flow'" - "\nThen one can use code from http://vision.middlebury.edu/flow/data/" - "\nto convert flow in binary file to image\n"); + printf("Usage: simpleflow_demo frame1 frame2 output_flow" + "\nApplication will write estimated flow " + "\nbetween 'frame1' and 'frame2' in binary format" + "\ninto file 'output_flow'" + "\nThen one can use code from http://vision.middlebury.edu/flow/data/" + "\nto convert flow in binary file to image\n"); } // binary file format for flow data specified here: // http://vision.middlebury.edu/flow/data/ -static void writeOpticalFlowToFile(const Mat& u, const Mat& v, FILE* file) { - int cols = u.cols; - int rows = u.rows; +static void writeOpticalFlowToFile(const Mat& flow, FILE* file) { + int cols = flow.cols; + int rows = flow.rows; fprintf(file, "PIEH"); - + if (fwrite(&cols, sizeof(int), 1, file) != 1 || fwrite(&rows, sizeof(int), 1, file) != 1) { - fprintf(stderr, "writeOpticalFlowToFile : problem writing header\n"); + printf(APP_NAME "writeOpticalFlowToFile : problem writing header\n"); exit(1); } - for (int i= 0; i < u.rows; ++i) { - for (int j = 0; j < u.cols; ++j) { - float uPoint = u.at(i, j); - float vPoint = v.at(i, j); + for (int i= 0; i < rows; ++i) { + for (int j = 0; j < cols; ++j) { + Vec2f flow_at_point = flow.at(i, j); - if (fwrite(&uPoint, sizeof(float), 1, file) != 1 || - fwrite(&vPoint, sizeof(float), 1, file) != 1) { - fprintf(stderr, "writeOpticalFlowToFile : problem writing data\n"); + if (fwrite(&(flow_at_point[0]), sizeof(float), 1, file) != 1 || + fwrite(&(flow_at_point[1]), sizeof(float), 1, file) != 1) { + printf(APP_NAME "writeOpticalFlowToFile : problem writing data\n"); exit(1); } } } } -int main(int argc, char** argv) { - help(); - if (argc < 4) { - fprintf(stderr, "Wrong number of command line arguments : %d (expected %d)\n", argc, 4); - exit(1); - } - - Mat frame1 = imread(argv[1]); - Mat frame2 = imread(argv[2]); - - if (frame1.empty() || frame2.empty()) { - fprintf(stderr, "simpleflow_demo : Images cannot be read\n"); - exit(1); - } - - if (frame1.rows != frame2.rows && frame1.cols != frame2.cols) { - fprintf(stderr, "simpleflow_demo : Images should be of equal sizes\n"); - exit(1); - } - - if (frame1.type() != 16 || frame2.type() != 16) { - fprintf(stderr, "simpleflow_demo : Images should be of equal type CV_8UC3\n"); - exit(1); - } - - printf("simpleflow_demo : Read two images of size [rows = %d, cols = %d]\n", - frame1.rows, frame1.cols); - - Mat flowX, flowY; - - calcOpticalFlowSF(frame1, frame2, - flowX, flowY, - 3, 2, 4, 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5, 10); - - FILE* file = fopen(argv[3], "wb"); - if (file == NULL) { - fprintf(stderr, "simpleflow_demo : Unable to open file '%s' for writing\n", argv[3]); +static void run(int argc, char** argv) { + if (argc < 3) { + printf(APP_NAME "Wrong number of command line arguments for mode `run`: %d (expected %d)\n", + argc, 3); exit(1); } - printf("simpleflow_demo : Writing to file\n"); - writeOpticalFlowToFile(flowX, flowY, file); + + Mat frame1 = imread(argv[0]); + Mat frame2 = imread(argv[1]); + + if (frame1.empty()) { + printf(APP_NAME "Image #1 : %s cannot be read\n", argv[0]); + exit(1); + } + + if (frame2.empty()) { + printf(APP_NAME "Image #2 : %s cannot be read\n", argv[1]); + exit(1); + } + + if (frame1.rows != frame2.rows && frame1.cols != frame2.cols) { + printf(APP_NAME "Images should be of equal sizes\n"); + exit(1); + } + + if (frame1.type() != 16 || frame2.type() != 16) { + printf(APP_NAME "Images should be of equal type CV_8UC3\n"); + exit(1); + } + + printf(APP_NAME "Read two images of size [rows = %d, cols = %d]\n", + frame1.rows, frame1.cols); + + Mat flow; + + float start = getTickCount(); + calcOpticalFlowSF(frame1, frame2, + flow, + 3, 2, 4, 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5, 10); + printf(APP_NAME "calcOpticalFlowSF : %lf sec\n", (getTickCount() - start) / getTickFrequency()); + + FILE* file = fopen(argv[2], "wb"); + if (file == NULL) { + printf(APP_NAME "Unable to open file '%s' for writing\n", argv[2]); + exit(1); + } + printf(APP_NAME "Writing to file\n"); + writeOpticalFlowToFile(flow, file); fclose(file); +} + +static bool readOpticalFlowFromFile(FILE* file, Mat& flow) { + char header[5]; + if (fread(header, 1, 4, file) < 4 && (string)header != "PIEH") { + return false; + } + + int cols, rows; + if (fread(&cols, sizeof(int), 1, file) != 1|| + fread(&rows, sizeof(int), 1, file) != 1) { + return false; + } + + flow = Mat::zeros(rows, cols, CV_32FC2); + + for (int i = 0; i < rows; ++i) { + for (int j = 0; j < cols; ++j) { + Vec2f flow_at_point; + if (fread(&(flow_at_point[0]), sizeof(float), 1, file) != 1 || + fread(&(flow_at_point[1]), sizeof(float), 1, file) != 1) { + return false; + } + flow.at(i, j) = flow_at_point; + } + } + + return true; +} + +static bool isFlowCorrect(float u) { + return !isnan(u) && (fabs(u) < 1e9); +} + +static float calc_rmse(Mat flow1, Mat flow2) { + float sum; + int counter = 0; + const int rows = flow1.rows; + const int cols = flow1.cols; + + for (int y = 0; y < rows; ++y) { + for (int x = 0; x < cols; ++x) { + Vec2f flow1_at_point = flow1.at(y, x); + Vec2f flow2_at_point = flow2.at(y, x); + + float u1 = flow1_at_point[0]; + float v1 = flow1_at_point[1]; + float u2 = flow2_at_point[0]; + float v2 = flow2_at_point[1]; + + if (isFlowCorrect(u1) && isFlowCorrect(u2) && isFlowCorrect(v1) && isFlowCorrect(v2)) { + sum += (u1-u2)*(u1-u2) + (v1-v2)*(v1-v2); + counter++; + } + } + } + return sqrt(sum / (1e-9 + counter)); +} + +static void eval(int argc, char** argv) { + if (argc < 2) { + printf(APP_NAME "Wrong number of command line arguments for mode `eval` : %d (expected %d)\n", + argc, 2); + exit(1); + } + + Mat flow1, flow2; + + FILE* flow_file_1 = fopen(argv[0], "rb"); + if (flow_file_1 == NULL) { + printf(APP_NAME "Cannot open file with first flow : %s\n", argv[0]); + exit(1); + } + if (!readOpticalFlowFromFile(flow_file_1, flow1)) { + printf(APP_NAME "Cannot read flow data from file %s\n", argv[0]); + exit(1); + } + fclose(flow_file_1); + + FILE* flow_file_2 = fopen(argv[1], "rb"); + if (flow_file_2 == NULL) { + printf(APP_NAME "Cannot open file with first flow : %s\n", argv[1]); + exit(1); + } + if (!readOpticalFlowFromFile(flow_file_2, flow2)) { + printf(APP_NAME "Cannot read flow data from file %s\n", argv[1]); + exit(1); + } + fclose(flow_file_2); + + float rmse = calc_rmse(flow1, flow2); + printf("%lf\n", rmse); +} + +int main(int argc, char** argv) { + if (argc < 2) { + printf(APP_NAME "Mode is not specified\n"); + help(); + exit(1); + } + string mode = (string)argv[1]; + int new_argc = argc - 2; + char** new_argv = &argv[2]; + + if ("run" == mode) { + run(new_argc, new_argv); + } else if ("eval" == mode) { + eval(new_argc, new_argv); + } else if ("help" == mode) + help(); + else { + printf(APP_NAME "Unknown mode : %s\n", argv[1]); + help(); + } + return 0; } From 1fde18419203c17dc112948f7559989466de523c Mon Sep 17 00:00:00 2001 From: Yury Zemlyanskiy Date: Fri, 31 Aug 2012 13:27:14 +0400 Subject: [PATCH 062/103] Small fixes for SimpleFlow algorithm + Fixed warnings + Add new function calcOpticalFlow with smaller number of arguments + Add asserts to algorithm and remove 'exit(1)' --- .../motion_analysis_and_object_tracking.rst | 2 ++ .../video/include/opencv2/video/tracking.hpp | 7 ++++ modules/video/src/simpleflow.cpp | 35 +++++++++++-------- modules/video/test/test_simpleflow.cpp | 8 ++--- samples/cpp/simpleflow_demo.cpp | 2 +- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/modules/video/doc/motion_analysis_and_object_tracking.rst b/modules/video/doc/motion_analysis_and_object_tracking.rst index ebb9290cc..6db525a74 100644 --- a/modules/video/doc/motion_analysis_and_object_tracking.rst +++ b/modules/video/doc/motion_analysis_and_object_tracking.rst @@ -601,6 +601,8 @@ calcOpticalFlowSF ----------- Calculate an optical flow using "SimpleFlow" algorithm. +.. ocv:function:: void calcOpticalFlowSF( Mat& prev, Mat& next, Mat& flowX, Mat& flowY, int layers, int averaging_block_size, int max_flow) + .. ocv:function:: void calcOpticalFlowSF( Mat& prev, Mat& next, Mat& flowX, Mat& flowY, int layers, int averaging_block_size, int max_flow, double sigma_dist, double sigma_color, int postprocess_window, double sigma_dist_fix, double sigma_color_fix, double occ_thr, int upscale_averaging_radiud, double upscale_sigma_dist, double upscale_sigma_color, double speed_up_thr) :param prev: First 8-bit 3-channel image. diff --git a/modules/video/include/opencv2/video/tracking.hpp b/modules/video/include/opencv2/video/tracking.hpp index 6800c6337..2be030d76 100644 --- a/modules/video/include/opencv2/video/tracking.hpp +++ b/modules/video/include/opencv2/video/tracking.hpp @@ -328,6 +328,13 @@ CV_EXPORTS_W Mat estimateRigidTransform( InputArray src, InputArray dst, bool fullAffine); //! computes dense optical flow using Simple Flow algorithm +CV_EXPORTS_W void calcOpticalFlowSF(Mat& from, + Mat& to, + Mat& flow, + int layers, + int averaging_block_size, + int max_flow); + CV_EXPORTS_W void calcOpticalFlowSF(Mat& from, Mat& to, Mat& flow, diff --git a/modules/video/src/simpleflow.cpp b/modules/video/src/simpleflow.cpp index 0cd320d6e..59fafdcf3 100644 --- a/modules/video/src/simpleflow.cpp +++ b/modules/video/src/simpleflow.cpp @@ -72,26 +72,27 @@ static void removeOcclusions(const Mat& flow, } static void wd(Mat& d, int top_shift, int bottom_shift, int left_shift, int right_shift, float sigma) { - const float factor = 1.0 / (2.0 * sigma * sigma); for (int dr = -top_shift, r = 0; dr <= bottom_shift; ++dr, ++r) { for (int dc = -left_shift, c = 0; dc <= right_shift; ++dc, ++c) { - d.at(r, c) = -(dr*dr + dc*dc) * factor; + d.at(r, c) = -(dr*dr + dc*dc); } } + d *= 1.0 / (2.0 * sigma * sigma); exp(d, d); } static void wc(const Mat& image, Mat& d, int r0, int c0, int top_shift, int bottom_shift, int left_shift, int right_shift, float sigma) { - const float factor = 1.0 / (2.0 * sigma * sigma); const Vec3b centeral_point = image.at(r0, c0); + int left_border = c0-left_shift, right_border = c0+right_shift; for (int dr = r0-top_shift, r = 0; dr <= r0+bottom_shift; ++dr, ++r) { const Vec3b *row = image.ptr(dr); float *d_row = d.ptr(r); - for (int dc = c0-left_shift, c = 0; dc <= c0+right_shift; ++dc, ++c) { - d_row[c] = -dist(centeral_point, row[dc]) * factor; + for (int dc = left_border, c = 0; dc <= right_border; ++dc, ++c) { + d_row[c] = -dist(centeral_point, row[dc]); } } + d *= 1.0 / (2.0 * sigma * sigma); exp(d, d); } @@ -163,7 +164,7 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, Mat diff_storage(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); Mat w_full_window(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); Mat wd_full_window(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); - float w_full_window_sum; + float w_full_window_sum = 1e-9; Mat prev_extended; copyMakeBorder(prev, prev_extended, @@ -197,7 +198,7 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, } bool first_flow_iteration = true; - float sum_e, min_e; + float sum_e = 0, min_e = 0; for (int u = min_row_shift; u <= max_row_shift; ++u) { for (int v = min_col_shift; v <= max_col_shift; ++v) { @@ -286,7 +287,7 @@ static Mat upscaleOpticalFlow(int new_rows, int averaging_radius, float sigma_dist, float sigma_color) { - crossBilateralFilter(flow, image, confidence, flow, averaging_radius, sigma_color, sigma_dist, false); + crossBilateralFilter(flow, image, confidence, flow, averaging_radius, sigma_color, sigma_dist, true); Mat new_flow; resize(flow, new_flow, Size(new_cols, new_rows), 0, 0, INTER_NEAREST); new_flow *= 2; @@ -495,13 +496,7 @@ void calcOpticalFlowSF(Mat& from, buildPyramidWithResizeMethod(from, pyr_from_images, layers - 1, INTER_CUBIC); buildPyramidWithResizeMethod(to, pyr_to_images, layers - 1, INTER_CUBIC); - if ((int)pyr_from_images.size() != layers) { - exit(1); - } - - if ((int)pyr_to_images.size() != layers) { - exit(1); - } + CV_Assert((int)pyr_from_images.size() == layers && (int)pyr_to_images.size() == layers); Mat first_from_image = pyr_from_images[layers - 1]; Mat first_to_image = pyr_to_images[layers - 1]; @@ -635,5 +630,15 @@ void calcOpticalFlowSF(Mat& from, mixChannels(&flow, 1, &resulted_flow, 1, from_to, 2); } +CV_EXPORTS_W void calcOpticalFlowSF(Mat& from, + Mat& to, + Mat& flow, + int layers, + int averaging_block_size, + int max_flow) { + calcOpticalFlowSF(from, to, flow, layers, averaging_block_size, max_flow, + 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5, 10); +} + } diff --git a/modules/video/test/test_simpleflow.cpp b/modules/video/test/test_simpleflow.cpp index 050d595d1..fe96e7004 100644 --- a/modules/video/test/test_simpleflow.cpp +++ b/modules/video/test/test_simpleflow.cpp @@ -91,7 +91,7 @@ static bool isFlowCorrect(float u) { } static float calc_rmse(cv::Mat flow1, cv::Mat flow2) { - float sum; + float sum = 0; int counter = 0; const int rows = flow1.rows; const int cols = flow1.cols; @@ -116,8 +116,6 @@ static float calc_rmse(cv::Mat flow1, cv::Mat flow2) { } void CV_SimpleFlowTest::run(int) { - int code = cvtest::TS::OK; - const float MAX_RMSE = 0.6; const string frame1_path = ts->get_data_path() + "optflow/RubberWhale1.png"; const string frame2_path = ts->get_data_path() + "optflow/RubberWhale2.png"; @@ -171,9 +169,7 @@ void CV_SimpleFlowTest::run(int) { fclose(gt_flow_file); cv::Mat flow; - cv::calcOpticalFlowSF(frame1, frame2, - flow, - 3, 4, 2, 4.1, 25.5, 18, 55.0, 25.5, 0.35, 18, 55.0, 25.5, 10); + cv::calcOpticalFlowSF(frame1, frame2, flow, 3, 2, 4); float rmse = calc_rmse(flow_gt, flow); diff --git a/samples/cpp/simpleflow_demo.cpp b/samples/cpp/simpleflow_demo.cpp index 332df7821..2727fe640 100644 --- a/samples/cpp/simpleflow_demo.cpp +++ b/samples/cpp/simpleflow_demo.cpp @@ -135,7 +135,7 @@ static bool isFlowCorrect(float u) { } static float calc_rmse(Mat flow1, Mat flow2) { - float sum; + float sum = 0; int counter = 0; const int rows = flow1.rows; const int cols = flow1.cols; From e5f9f97954406f22cb873b385e28e7eda5ec4f2d Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Fri, 31 Aug 2012 14:56:28 +0400 Subject: [PATCH 063/103] fixed build warnings on Windows --- modules/video/src/simpleflow.cpp | 68 +++++++++++++------------- modules/video/src/simpleflow.hpp | 4 +- modules/video/test/test_simpleflow.cpp | 6 +-- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/modules/video/src/simpleflow.cpp b/modules/video/src/simpleflow.cpp index 59fafdcf3..6b4264a1b 100644 --- a/modules/video/src/simpleflow.cpp +++ b/modules/video/src/simpleflow.cpp @@ -74,7 +74,7 @@ static void removeOcclusions(const Mat& flow, static void wd(Mat& d, int top_shift, int bottom_shift, int left_shift, int right_shift, float sigma) { for (int dr = -top_shift, r = 0; dr <= bottom_shift; ++dr, ++r) { for (int dc = -left_shift, c = 0; dc <= right_shift; ++dc, ++c) { - d.at(r, c) = -(dr*dr + dc*dc); + d.at(r, c) = (float)-(dr*dr + dc*dc); } } d *= 1.0 / (2.0 * sigma * sigma); @@ -134,11 +134,11 @@ static void crossBilateralFilter(const Mat& image, const Mat& edge_image, const multiply(weights, confidence_extended(window_rows, window_cols), weights); multiply(weights, weights_space, weights); - float weights_sum = sum(weights)[0]; + float weights_sum = (float)sum(weights)[0]; for (int ch = 0; ch < 2; ++ch) { multiply(weights, image_extended_channels[ch](window_rows, window_cols), weighted_sum); - float total_sum = sum(weighted_sum)[0]; + float total_sum = (float)sum(weighted_sum)[0]; dst.at(row, col)[ch] = (flag && fabs(weights_sum) < 1e-9) ? image.at(row, col) @@ -164,7 +164,7 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, Mat diff_storage(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); Mat w_full_window(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); Mat wd_full_window(averaging_radius*2 + 1, averaging_radius*2 + 1, CV_32F); - float w_full_window_sum = 1e-9; + float w_full_window_sum = 1e-9f; Mat prev_extended; copyMakeBorder(prev, prev_extended, @@ -176,10 +176,10 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, for (int r0 = 0; r0 < rows; ++r0) { for (int c0 = 0; c0 < cols; ++c0) { Vec2f flow_at_point = flow.at(r0, c0); - int u0 = floor(flow_at_point[0] + 0.5); + int u0 = cvRound(flow_at_point[0]); if (r0 + u0 < 0) { u0 = -r0; } if (r0 + u0 >= rows) { u0 = rows - 1 - r0; } - int v0 = floor(flow_at_point[1] + 0.5); + int v0 = cvRound(flow_at_point[1]); if (c0 + v0 < 0) { v0 = -c0; } if (c0 + v0 >= cols) { v0 = cols - 1 - c0; } @@ -188,13 +188,13 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, const int min_col_shift = -min(c0 + v0, max_flow); const int max_col_shift = min(cols - 1 - (c0 + v0), max_flow); - float min_cost = DBL_MAX, best_u = u0, best_v = v0; + float min_cost = FLT_MAX, best_u = (float)u0, best_v = (float)v0; if (mask.at(r0, c0)) { wc(prev_extended, w_full_window, r0 + averaging_radius, c0 + averaging_radius, averaging_radius, averaging_radius, averaging_radius, averaging_radius, sigma_color); multiply(w_full_window, wd_full_window, w_full_window); - w_full_window_sum = sum(w_full_window)[0]; + w_full_window_sum = (float)sum(w_full_window)[0]; } bool first_flow_iteration = true; @@ -255,15 +255,15 @@ static void calcOpticalFlowSingleScaleSF(const Mat& prev, averaging_radius + 1 + window_bottom_shift), Range(averaging_radius - window_left_shift, averaging_radius + 1 + window_right_shift)); - w_sum = sum(w)[0]; + w_sum = (float)sum(w)[0]; } multiply(diff2, w, diff2); - const float cost = sum(diff2)[0] / w_sum; + const float cost = (float)(sum(diff2)[0] / w_sum); if (cost < min_cost) { min_cost = cost; - best_u = u + u0; - best_v = v + v0; + best_u = (float)(u + u0); + best_v = (float)(v + v0); } } } @@ -371,7 +371,7 @@ static void selectPointsToRecalcFlow(const Mat& flow, mask.at(curr_bottom, curr_right) = MASK_TRUE_VALUE; for (int rr = curr_top; rr <= curr_bottom; ++rr) { for (int cc = curr_left; cc <= curr_right; ++cc) { - speed_up.at(rr, cc) = speed_up_at_this_point + 1; + speed_up.at(rr, cc) = (uchar)(speed_up_at_this_point + 1); } } } else { @@ -408,9 +408,9 @@ static inline float extrapolateValueInRect(int height, int width, if (r == height && c == width) { return v22;} float qr = float(r) / height; - float pr = 1.0 - qr; + float pr = 1.0f - qr; float qc = float(c) / width; - float pc = 1.0 - qc; + float pc = 1.0f - qc; return v11*pr*pc + v12*pr*qc + v21*qr*pc + v22*qc*qr; } @@ -517,8 +517,8 @@ void calcOpticalFlowSF(Mat& from, confidence, averaging_block_size, max_flow, - sigma_dist, - sigma_color); + (float)sigma_dist, + (float)sigma_color); calcOpticalFlowSingleScaleSF(first_to_image, first_from_image, @@ -527,17 +527,17 @@ void calcOpticalFlowSF(Mat& from, confidence_inv, averaging_block_size, max_flow, - sigma_dist, - sigma_color); + (float)sigma_dist, + (float)sigma_color); removeOcclusions(flow, flow_inv, - occ_thr, + (float)occ_thr, confidence); removeOcclusions(flow_inv, flow, - occ_thr, + (float)occ_thr, confidence_inv); Mat speed_up = Mat::zeros(first_from_image.rows, first_from_image.cols, CV_8U); @@ -556,7 +556,7 @@ void calcOpticalFlowSF(Mat& from, selectPointsToRecalcFlow(flow, averaging_block_size, - speed_up_thr, + (int)speed_up_thr, curr_rows, curr_cols, speed_up, @@ -565,7 +565,7 @@ void calcOpticalFlowSF(Mat& from, selectPointsToRecalcFlow(flow_inv, averaging_block_size, - speed_up_thr, + (int)speed_up_thr, curr_rows, curr_cols, speed_up_inv, @@ -581,8 +581,8 @@ void calcOpticalFlowSF(Mat& from, confidence, flow, upscale_averaging_radius, - upscale_sigma_dist, - upscale_sigma_color); + (float)upscale_sigma_dist, + (float)upscale_sigma_color); flow_inv = upscaleOpticalFlow(curr_rows, curr_cols, @@ -590,8 +590,8 @@ void calcOpticalFlowSF(Mat& from, confidence_inv, flow_inv, upscale_averaging_radius, - upscale_sigma_dist, - upscale_sigma_color); + (float)upscale_sigma_dist, + (float)upscale_sigma_color); calcOpticalFlowSingleScaleSF(curr_from, curr_to, @@ -600,8 +600,8 @@ void calcOpticalFlowSF(Mat& from, confidence, averaging_block_size, max_flow, - sigma_dist, - sigma_color); + (float)sigma_dist, + (float)sigma_color); calcOpticalFlowSingleScaleSF(curr_to, curr_from, @@ -610,18 +610,18 @@ void calcOpticalFlowSF(Mat& from, confidence_inv, averaging_block_size, max_flow, - sigma_dist, - sigma_color); + (float)sigma_dist, + (float)sigma_color); extrapolateFlow(flow, speed_up); extrapolateFlow(flow_inv, speed_up_inv); - removeOcclusions(flow, flow_inv, occ_thr, confidence); - removeOcclusions(flow_inv, flow, occ_thr, confidence_inv); + removeOcclusions(flow, flow_inv, (float)occ_thr, confidence); + removeOcclusions(flow_inv, flow, (float)occ_thr, confidence_inv); } crossBilateralFilter(flow, pyr_from_images[0], confidence, flow, - postprocess_window, sigma_color_fix, sigma_dist_fix); + postprocess_window, (float)sigma_color_fix, (float)sigma_dist_fix); GaussianBlur(flow, flow, Size(3, 3), 5); diff --git a/modules/video/src/simpleflow.hpp b/modules/video/src/simpleflow.hpp index c4aa02355..cab276687 100644 --- a/modules/video/src/simpleflow.hpp +++ b/modules/video/src/simpleflow.hpp @@ -53,9 +53,9 @@ using namespace std; namespace cv { inline static float dist(const Vec3b& p1, const Vec3b& p2) { - return (p1[0] - p2[0]) * (p1[0] - p2[0]) + + return (float)((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) + - (p1[2] - p2[2]) * (p1[2] - p2[2]); + (p1[2] - p2[2]) * (p1[2] - p2[2])); } inline static float dist(const Vec2f& p1, const Vec2f& p2) { diff --git a/modules/video/test/test_simpleflow.cpp b/modules/video/test/test_simpleflow.cpp index fe96e7004..d1d2a1074 100644 --- a/modules/video/test/test_simpleflow.cpp +++ b/modules/video/test/test_simpleflow.cpp @@ -87,7 +87,7 @@ static bool readOpticalFlowFromFile(FILE* file, cv::Mat& flow) { } static bool isFlowCorrect(float u) { - return !isnan(u) && (fabs(u) < 1e9); + return !cvIsNaN(u) && (fabs(u) < 1e9); } static float calc_rmse(cv::Mat flow1, cv::Mat flow2) { @@ -112,11 +112,11 @@ static float calc_rmse(cv::Mat flow1, cv::Mat flow2) { } } } - return sqrt(sum / (1e-9 + counter)); + return (float)sqrt(sum / (1e-9 + counter)); } void CV_SimpleFlowTest::run(int) { - const float MAX_RMSE = 0.6; + const float MAX_RMSE = 0.6f; const string frame1_path = ts->get_data_path() + "optflow/RubberWhale1.png"; const string frame2_path = ts->get_data_path() + "optflow/RubberWhale2.png"; const string gt_flow_path = ts->get_data_path() + "optflow/RubberWhale.flo"; From 5a6114e29975f66240ab7acae6e35fca65064a2c Mon Sep 17 00:00:00 2001 From: Alexandre Benoit Date: Fri, 31 Aug 2012 14:14:57 +0200 Subject: [PATCH 064/103] updated code for more flexible parallelisation : TBB parallel for loops are replaced by opencv parallel_for_ wrapper --- modules/contrib/src/basicretinafilter.cpp | 28 ++++++------ modules/contrib/src/basicretinafilter.hpp | 54 +++++++++++------------ modules/contrib/src/magnoretinafilter.cpp | 4 +- modules/contrib/src/magnoretinafilter.hpp | 22 ++++----- modules/contrib/src/parvoretinafilter.cpp | 4 +- modules/contrib/src/parvoretinafilter.hpp | 22 ++++----- modules/contrib/src/retinacolor.cpp | 14 +++--- modules/contrib/src/retinacolor.hpp | 26 +++++------ modules/contrib/src/templatebuffer.hpp | 19 ++++---- 9 files changed, 96 insertions(+), 97 deletions(-) diff --git a/modules/contrib/src/basicretinafilter.cpp b/modules/contrib/src/basicretinafilter.cpp index a4270aa74..c9e6a92e4 100644 --- a/modules/contrib/src/basicretinafilter.cpp +++ b/modules/contrib/src/basicretinafilter.cpp @@ -345,8 +345,8 @@ void BasicRetinaFilter::_localLuminanceAdaptation(const float *inputFrame, const //float tempMeanValue=meanLuminance+_meanInputValue*_tau; updateCompressionParameter(meanLuminance); } -#ifdef HAVE_TBB - tbb::parallel_for(tbb::blocked_range(0,_filterOutput.getNBpixels()), Parallel_localAdaptation(localLuminance, inputFrame, outputFrame, _localLuminanceFactor, _localLuminanceAddon, _maxInputValue), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL + cv::parallel_for_(cv::Range(0,_filterOutput.getNBpixels()), Parallel_localAdaptation(localLuminance, inputFrame, outputFrame, _localLuminanceFactor, _localLuminanceAddon, _maxInputValue)); #else //std::cout<(IDrowStart,IDrowEnd), Parallel_horizontalCausalFilter_addInput(inputFrame, outputFrame, IDrowStart, _filterOutput.getNBcolumns(), _a, _tau), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL + cv::parallel_for_(cv::Range(IDrowStart,IDrowEnd), Parallel_horizontalCausalFilter_addInput(inputFrame, outputFrame, IDrowStart, _filterOutput.getNBcolumns(), _a, _tau)); #else for (unsigned int IDrow=IDrowStart; IDrow(IDrowStart,IDrowEnd), Parallel_horizontalAnticausalFilter(outputFrame, IDrowEnd, _filterOutput.getNBcolumns(), _a ), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL + cv::parallel_for_(cv::Range(IDrowStart,IDrowEnd), Parallel_horizontalAnticausalFilter(outputFrame, IDrowEnd, _filterOutput.getNBcolumns(), _a )); #else for (unsigned int IDrow=IDrowStart; IDrow(IDcolumnStart,IDcolumnEnd), Parallel_verticalCausalFilter(outputFrame, _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _a ), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL + cv::parallel_for_(cv::Range(IDcolumnStart,IDcolumnEnd), Parallel_verticalCausalFilter(outputFrame, _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _a )); #else for (unsigned int IDcolumn=IDcolumnStart; IDcolumn(IDcolumnStart,IDcolumnEnd), Parallel_verticalAnticausalFilter_multGain(outputFrame, _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _a, _gain ), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL + cv::parallel_for_(cv::Range(IDcolumnStart,IDcolumnEnd), Parallel_verticalAnticausalFilter_multGain(outputFrame, _filterOutput.getNBrows(), _filterOutput.getNBcolumns(), _a, _gain )); #else float* offset=outputFrame+_filterOutput.getNBpixels()-_filterOutput.getNBcolumns(); //#pragma omp parallel for @@ -819,8 +819,8 @@ void BasicRetinaFilter::_horizontalCausalFilter_Irregular_addInput(const float * // horizontal anticausal filter (basic way, no add on) void BasicRetinaFilter::_horizontalAnticausalFilter_Irregular(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd, const float *spatialConstantBuffer) { -#ifdef HAVE_TBB - tbb::parallel_for(tbb::blocked_range(IDrowStart,IDrowEnd), Parallel_horizontalAnticausalFilter_Irregular(outputFrame, spatialConstantBuffer, IDrowEnd, _filterOutput.getNBcolumns()), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL + cv::parallel_for_(cv::Range(IDrowStart,IDrowEnd), Parallel_horizontalAnticausalFilter_Irregular(outputFrame, spatialConstantBuffer, IDrowEnd, _filterOutput.getNBcolumns())); #else register float* outputPTR=outputFrame+IDrowEnd*(_filterOutput.getNBcolumns())-1; register const float* spatialConstantPTR=spatialConstantBuffer+IDrowEnd*(_filterOutput.getNBcolumns())-1; @@ -841,8 +841,8 @@ void BasicRetinaFilter::_horizontalAnticausalFilter_Irregular(float *outputFrame // vertical anticausal filter void BasicRetinaFilter::_verticalCausalFilter_Irregular(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd, const float *spatialConstantBuffer) { -#ifdef HAVE_TBB - tbb::parallel_for(tbb::blocked_range(IDcolumnStart,IDcolumnEnd), Parallel_verticalCausalFilter_Irregular(outputFrame, spatialConstantBuffer, _filterOutput.getNBrows(), _filterOutput.getNBcolumns()), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL + cv::parallel_for_(cv::Range(IDcolumnStart,IDcolumnEnd), Parallel_verticalCausalFilter_Irregular(outputFrame, spatialConstantBuffer, _filterOutput.getNBrows(), _filterOutput.getNBcolumns())); #else for (unsigned int IDcolumn=IDcolumnStart; IDcolumn main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary ** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised ** ==> functors constructors can differ from the parameters used with their related serial functions */ #define _DEBUG_TBB // define DEBUG_TBB in order to display additionnal data on stdout - class Parallel_horizontalAnticausalFilter + class Parallel_horizontalAnticausalFilter: public cv::ParallelLoopBody { private: float *outputFrame; @@ -465,16 +465,16 @@ protected: #endif } - void operator()( const tbb::blocked_range& r ) const { + virtual void operator()( const Range& r ) const { #ifdef DEBUG_TBB std::cout<<"Parallel_horizontalAnticausalFilter::operator() :" <<"\n\t range size="< declare usefull generic tools template -class Parallel_clipBufferValues +class Parallel_clipBufferValues: public cv::ParallelLoopBody { private: type *bufferToClip; @@ -89,9 +88,9 @@ public: Parallel_clipBufferValues(type* bufferToProcess, const type min, const type max) : bufferToClip(bufferToProcess), minValue(min), maxValue(max){} - void operator()( const tbb::blocked_range& r ) const { - register type *inputOutputBufferPTR=bufferToClip+r.begin(); - for (register unsigned int jf = r.begin(); jf != r.end(); ++jf, ++inputOutputBufferPTR) + virtual void operator()( const cv::Range &r ) const { + register type *inputOutputBufferPTR=bufferToClip+r.start; + for (register int jf = r.start; jf != r.end; ++jf, ++inputOutputBufferPTR) { if (*inputOutputBufferPTR>maxValue) *inputOutputBufferPTR=maxValue; @@ -389,8 +388,8 @@ public: std::cout<<"this->min()"<min()<<"minThreshold="<Buffer(); -#ifdef HAVE_TBB // call the TemplateBuffer TBB clipping method - tbb::parallel_for(tbb::blocked_range(0,this->size()), Parallel_clipBufferValues(bufferPTR, updatedLowValue, updatedHighValue), tbb::auto_partitioner()); +#ifdef MAKE_PARALLEL // call the TemplateBuffer TBB clipping method + parallel_for_(tbb::blocked_range(0,this->size()), Parallel_clipBufferValues(bufferPTR, updatedLowValue, updatedHighValue)); #else for (unsigned int i=0;isize();++i, ++bufferPTR) From 37fe2a252a57ce281efcf00884d7216d380bae62 Mon Sep 17 00:00:00 2001 From: Alexandre Benoit Date: Fri, 31 Aug 2012 14:55:32 +0200 Subject: [PATCH 065/103] updated Retina module code for more flexible parallelisation : TBB parallel for loops are replaced by opencv parallel_for_ wrapper... compile error corrected --- modules/contrib/doc/contrib.rst | 2 +- modules/contrib/src/templatebuffer.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/contrib/doc/contrib.rst b/modules/contrib/doc/contrib.rst index 85a55a346..c3ceb20f5 100644 --- a/modules/contrib/doc/contrib.rst +++ b/modules/contrib/doc/contrib.rst @@ -9,4 +9,4 @@ The module contains some recently added functionality that has not been stabiliz stereo FaceRecognizer Documentation - retina Documentation + Retina Documentation diff --git a/modules/contrib/src/templatebuffer.hpp b/modules/contrib/src/templatebuffer.hpp index 50aedce38..1ce4d593b 100644 --- a/modules/contrib/src/templatebuffer.hpp +++ b/modules/contrib/src/templatebuffer.hpp @@ -388,8 +388,8 @@ public: std::cout<<"this->min()"<min()<<"minThreshold="<Buffer(); -#ifdef MAKE_PARALLEL // call the TemplateBuffer TBB clipping method - parallel_for_(tbb::blocked_range(0,this->size()), Parallel_clipBufferValues(bufferPTR, updatedLowValue, updatedHighValue)); +#ifdef MAKE_PARALLEL // call the TemplateBuffer multitreaded clipping method + parallel_for_(cv::Range(0,this->size()), Parallel_clipBufferValues(bufferPTR, updatedLowValue, updatedHighValue)); #else for (unsigned int i=0;isize();++i, ++bufferPTR) From bd12f636c8afbfc22f00342438112fe068551537 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Fri, 31 Aug 2012 12:36:24 +0400 Subject: [PATCH 066/103] Unify manifest files in Android examples --- cmake/OpenCVPCHSupport.cmake | 1 + samples/android/15-puzzle/AndroidManifest.xml | 30 +++++++++------- .../color-blob-detection/AndroidManifest.xml | 35 +++++++++++-------- .../face-detection/AndroidManifest.xml | 25 +++++++------ .../image-manipulations/AndroidManifest.xml | 25 +++++++------ .../AndroidManifest.xml | 32 +++++++++-------- .../tutorial-1-addopencv/AndroidManifest.xml | 25 +++++++------ .../AndroidManifest.xml | 25 +++++++------ .../tutorial-3-native/AndroidManifest.xml | 25 +++++++------ .../tutorial-4-mixed/AndroidManifest.xml | 25 +++++++------ 10 files changed, 140 insertions(+), 108 deletions(-) diff --git a/cmake/OpenCVPCHSupport.cmake b/cmake/OpenCVPCHSupport.cmake index 16dbb06a9..f65e27ff5 100644 --- a/cmake/OpenCVPCHSupport.cmake +++ b/cmake/OpenCVPCHSupport.cmake @@ -113,6 +113,7 @@ MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _output) SET(${out_command} ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input} ) + message("!!!!!!!!!!!!!!!!${${out_command}}!!!!") ELSE(CMAKE_CXX_COMPILER_ARG1) SET(${out_command} ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input} diff --git a/samples/android/15-puzzle/AndroidManifest.xml b/samples/android/15-puzzle/AndroidManifest.xml index 02a6cc975..5c60b62a4 100644 --- a/samples/android/15-puzzle/AndroidManifest.xml +++ b/samples/android/15-puzzle/AndroidManifest.xml @@ -1,17 +1,11 @@ + package="org.opencv.samples.puzzle15" + android:versionCode="21" + android:versionName="2.1"> - - - - + @@ -22,9 +16,19 @@ + + - - + + + + + + \ No newline at end of file diff --git a/samples/android/color-blob-detection/AndroidManifest.xml b/samples/android/color-blob-detection/AndroidManifest.xml index a580be645..f8bf4939d 100644 --- a/samples/android/color-blob-detection/AndroidManifest.xml +++ b/samples/android/color-blob-detection/AndroidManifest.xml @@ -1,27 +1,34 @@ + package="org.opencv.example.colorblobdetect" + android:versionCode="21" + android:versionName="2.1" > - - - - + + - + + + + - - + + + + + \ No newline at end of file diff --git a/samples/android/face-detection/AndroidManifest.xml b/samples/android/face-detection/AndroidManifest.xml index 285bcb9fa..eaa90dfd0 100644 --- a/samples/android/face-detection/AndroidManifest.xml +++ b/samples/android/face-detection/AndroidManifest.xml @@ -1,14 +1,8 @@ - - + package="org.opencv.samples.fd" + android:versionCode="21" + android:versionName="2.1"> + + - - + + + + + diff --git a/samples/android/image-manipulations/AndroidManifest.xml b/samples/android/image-manipulations/AndroidManifest.xml index 72df75e44..b83f799fe 100644 --- a/samples/android/image-manipulations/AndroidManifest.xml +++ b/samples/android/image-manipulations/AndroidManifest.xml @@ -1,14 +1,8 @@ - - + package="org.opencv.samples.imagemanipulations" + android:versionCode="21" + android:versionName="2.1"> + + - - + + + + + diff --git a/samples/android/tutorial-0-androidcamera/AndroidManifest.xml b/samples/android/tutorial-0-androidcamera/AndroidManifest.xml index 714b0095a..d703810c1 100644 --- a/samples/android/tutorial-0-androidcamera/AndroidManifest.xml +++ b/samples/android/tutorial-0-androidcamera/AndroidManifest.xml @@ -1,20 +1,8 @@ - - - - - - - - + package="org.opencv.samples.tutorial0" + android:versionCode="21" + android:versionName="2.1"> + + + + + + + + + + diff --git a/samples/android/tutorial-1-addopencv/AndroidManifest.xml b/samples/android/tutorial-1-addopencv/AndroidManifest.xml index 51cc50f7f..5ec908429 100644 --- a/samples/android/tutorial-1-addopencv/AndroidManifest.xml +++ b/samples/android/tutorial-1-addopencv/AndroidManifest.xml @@ -1,14 +1,8 @@ - - + package="org.opencv.samples.tutorial1" + android:versionCode="21" + android:versionName="2.1"> + + - - + + + + + diff --git a/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml b/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml index 7daacd164..71e9c9985 100644 --- a/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml +++ b/samples/android/tutorial-2-opencvcamera/AndroidManifest.xml @@ -1,14 +1,8 @@ - - + package="org.opencv.samples.tutorial2" + android:versionCode="21" + android:versionName="2.1"> + + - - + + + + + diff --git a/samples/android/tutorial-3-native/AndroidManifest.xml b/samples/android/tutorial-3-native/AndroidManifest.xml index 8ee38142b..b8cd0488e 100644 --- a/samples/android/tutorial-3-native/AndroidManifest.xml +++ b/samples/android/tutorial-3-native/AndroidManifest.xml @@ -1,14 +1,8 @@ - - + package="org.opencv.samples.tutorial3" + android:versionCode="21" + android:versionName="2.1"> + + - - + + + + + diff --git a/samples/android/tutorial-4-mixed/AndroidManifest.xml b/samples/android/tutorial-4-mixed/AndroidManifest.xml index 524c76399..51460d34b 100644 --- a/samples/android/tutorial-4-mixed/AndroidManifest.xml +++ b/samples/android/tutorial-4-mixed/AndroidManifest.xml @@ -1,14 +1,8 @@ - - + package="org.opencv.samples.tutorial4" + android:versionCode="21" + android:versionName="2.1"> + + - - + + + + + From fc93518449b6c128766266910faea5fe72d0e69d Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Fri, 31 Aug 2012 14:23:52 +0400 Subject: [PATCH 067/103] Fix package name of Android color blob detection sample --- samples/android/color-blob-detection/AndroidManifest.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/android/color-blob-detection/AndroidManifest.xml b/samples/android/color-blob-detection/AndroidManifest.xml index f8bf4939d..567e5648a 100644 --- a/samples/android/color-blob-detection/AndroidManifest.xml +++ b/samples/android/color-blob-detection/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionName="2.1"> - \ No newline at end of file + From 067744d07109713a7cbf1db16d831580f6d65ea3 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Fri, 31 Aug 2012 14:26:22 +0400 Subject: [PATCH 068/103] Fix Android samples for devices having front camera only (Nexus 7) --- .../samples/puzzle15/SampleCvViewBase.java | 78 ++++----- .../samples/puzzle15/puzzle15Activity.java | 33 ++-- .../opencv/samples/puzzle15/puzzle15View.java | 21 ++- .../ColorBlobDetectionActivity.java | 19 +-- .../ColorBlobDetectionView.java | 44 +++-- .../colorblobdetect/ColorBlobDetector.java | 20 +-- .../colorblobdetect/SampleCvViewBase.java | 74 ++++----- .../samples/fd/DetectionBasedTracker.java | 4 - .../src/org/opencv/samples/fd/FdActivity.java | 28 ++-- .../src/org/opencv/samples/fd/FdView.java | 28 ++-- .../src/org/opencv/samples/fd/FpsMeter.java | 2 +- .../opencv/samples/fd/SampleCvViewBase.java | 80 ++++------ .../samples/imagemanipulations/FpsMeter.java | 2 +- .../ImageManipulationsActivity.java | 25 ++- .../ImageManipulationsView.java | 51 +++--- .../imagemanipulations/SampleCvViewBase.java | 82 ++++------ .../opencv/samples/tutorial0/Sample0Base.java | 16 +- .../opencv/samples/tutorial0/Sample0View.java | 17 +- .../samples/tutorial0/SampleViewBase.java | 131 ++++++++------- .../opencv/samples/tutorial1/Sample1Java.java | 20 +-- .../opencv/samples/tutorial1/Sample1View.java | 34 ++-- .../samples/tutorial1/SampleViewBase.java | 148 ++++++++++------- .../tutorial2/Sample2NativeCamera.java | 24 +-- .../opencv/samples/tutorial2/Sample2View.java | 12 +- .../samples/tutorial2/SampleCvViewBase.java | 80 ++++------ .../samples/tutorial3/Sample3Native.java | 18 +-- .../opencv/samples/tutorial3/Sample3View.java | 17 +- .../samples/tutorial3/SampleViewBase.java | 148 ++++++++++------- .../samples/tutorial4/Sample4Mixed.java | 22 +-- .../opencv/samples/tutorial4/Sample4View.java | 50 +++--- .../samples/tutorial4/SampleViewBase.java | 151 ++++++++++-------- 31 files changed, 771 insertions(+), 708 deletions(-) diff --git a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/SampleCvViewBase.java b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/SampleCvViewBase.java index ac9159399..d307a9055 100644 --- a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/SampleCvViewBase.java +++ b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/SampleCvViewBase.java @@ -14,7 +14,7 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample-15puzzle::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private SurfaceHolder mHolder; private VideoCapture mCamera; @@ -26,76 +26,67 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol Log.i(TAG, "Instantiated new " + this.getClass()); } - public boolean openCamera() { - Log.i(TAG, "openCamera"); - synchronized (this) { + public synchronized boolean openCamera() { + Log.i(TAG, "Opening Camera"); + mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); + if (!mCamera.isOpened()) { releaseCamera(); - mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); - if (!mCamera.isOpened()) { - releaseCamera(); - Log.e(TAG, "Failed to open native camera"); - return false; - } + Log.e(TAG, "Can't open native camera"); + return false; } return true; } - public void releaseCamera() { - Log.i(TAG, "releaseCamera"); - synchronized (this) { - if (mCamera != null) { - mCamera.release(); - mCamera = null; - } + public synchronized void releaseCamera() { + Log.i(TAG, "Releasing Camera"); + if (mCamera != null) { + mCamera.release(); + mCamera = null; } } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera("+width+", "+height+")"); - synchronized (this) { - if (mCamera != null && mCamera.isOpened()) { - List sizes = mCamera.getSupportedPreviewSizes(); - int mFrameWidth = width; - int mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null && mCamera.isOpened()) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + List sizes = mCamera.getSupportedPreviewSizes(); + int mFrameWidth = width; + int mFrameHeight = height; - // selecting optimal camera preview size - { - double minDiff = Double.MAX_VALUE; - for (Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = (int) size.width; - mFrameHeight = (int) size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + double minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = (int) size.width; + mFrameHeight = (int) size.height; + minDiff = Math.abs(size.height - height); } } - - mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); - mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); } - } + mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); + mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); + } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); + Log.i(TAG, "called surfaceDestroyed"); } protected abstract Bitmap processFrame(VideoCapture capture); public void run() { - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); while (true) { Bitmap bmp = null; @@ -120,7 +111,6 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol bmp.recycle(); } } - - Log.i(TAG, "Finishing processing thread"); + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15Activity.java b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15Activity.java index fa5be233d..c143b54e2 100644 --- a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15Activity.java +++ b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15Activity.java @@ -15,9 +15,8 @@ import android.view.Window; import android.view.WindowManager; /** Activity class implements LoaderCallbackInterface to handle OpenCV initialization status **/ -public class puzzle15Activity extends Activity -{ - private static final String TAG = "Sample::Activity"; +public class puzzle15Activity extends Activity { + private static final String TAG = "OCVSample::Activity"; private MenuItem mItemNewGame; private MenuItem mItemToggleNumbers; @@ -33,6 +32,7 @@ public class puzzle15Activity extends Activity // Create and set View mView = new puzzle15View(mAppContext); setContentView(mView); + // Check native OpenCV camera if( !mView.openCamera() ) { AlertDialog ad = new AlertDialog.Builder(mAppContext).create(); @@ -40,13 +40,14 @@ public class puzzle15Activity extends Activity ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); } } break; + /** OpenCV loader cannot start Google Play **/ case LoaderCallbackInterface.MARKET_ERROR: { @@ -76,7 +77,7 @@ public class puzzle15Activity extends Activity @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); if (null != mView) mView.releaseCamera(); super.onPause(); @@ -84,12 +85,11 @@ public class puzzle15Activity extends Activity @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -97,16 +97,15 @@ public class puzzle15Activity extends Activity /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } @Override public boolean onCreateOptionsMenu(Menu menu) { - Log.i(TAG, "onCreateOptionsMenu"); + Log.i(TAG, "called onCreateOptionsMenu"); mItemNewGame = menu.add("Start new game"); mItemToggleNumbers = menu.add("Show/hide tile numbers"); return true; @@ -114,12 +113,10 @@ public class puzzle15Activity extends Activity @Override public boolean onOptionsItemSelected(MenuItem item) { - Log.i(TAG, "Menu Item selected " + item); - if (item == mItemNewGame) { - synchronized (mView) { - mView.startNewGame(); - } - } else if (item == mItemToggleNumbers) + Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); + if (item == mItemNewGame) + mView.startNewGame(); + else if (item == mItemToggleNumbers) mView.tolggleTileNumbers(); return true; } diff --git a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15View.java b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15View.java index 58db67adb..4423dcdcb 100644 --- a/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15View.java +++ b/samples/android/15-puzzle/src/org/opencv/samples/puzzle15/puzzle15View.java @@ -18,6 +18,8 @@ import android.view.View; import android.view.View.OnTouchListener; public class puzzle15View extends SampleCvViewBase implements OnTouchListener { + private static final String TAG = "OCVSample::View"; + private Mat mRgba; private Mat mRgba15; private Mat[] mCells; @@ -42,14 +44,17 @@ public class puzzle15View extends SampleCvViewBase implements OnTouchListener { mTextHeights[i] = (int) s.height; mTextWidths[i] = (int) s.width; } + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override public void surfaceCreated(SurfaceHolder holder) { + Log.i(TAG, "called surfaceCreated"); synchronized (this) { // initialize Mat before usage mRgba = new Mat(); } + super.surfaceCreated(holder); } @@ -102,7 +107,14 @@ public class puzzle15View extends SampleCvViewBase implements OnTouchListener { startNewGame(); } - public void startNewGame() { + private void drawGrid(int cols, int rows) { + for (int i = 1; i < gridSize; i++) { + Core.line(mRgba15, new Point(0, i * rows / gridSize), new Point(cols, i * rows / gridSize), new Scalar(0, 255, 0, 255), 3); + Core.line(mRgba15, new Point(i * cols / gridSize, 0), new Point(i * cols / gridSize, rows), new Scalar(0, 255, 0, 255), 3); + } + } + + public synchronized void startNewGame() { do { shuffle(mIndexses); } while (!isPuzzleSolvable()); @@ -154,13 +166,6 @@ public class puzzle15View extends SampleCvViewBase implements OnTouchListener { } } - private void drawGrid(int cols, int rows) { - for (int i = 1; i < gridSize; i++) { - Core.line(mRgba15, new Point(0, i * rows / gridSize), new Point(cols, i * rows / gridSize), new Scalar(0, 255, 0, 255), 3); - Core.line(mRgba15, new Point(i * cols / gridSize, 0), new Point(i * cols / gridSize, rows), new Scalar(0, 255, 0, 255), 3); - } - } - @Override public void run() { super.run(); diff --git a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java index b9b372f07..c64327958 100644 --- a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java +++ b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java @@ -13,9 +13,9 @@ import android.view.Window; import android.view.WindowManager; public class ColorBlobDetectionActivity extends Activity { + private static final String TAG = "OCVSample::Activity"; - private static final String TAG = "Sample-ColorBlobDetection::Activity"; - private ColorBlobDetectionView mView; + private ColorBlobDetectionView mView; private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { @Override @@ -27,6 +27,7 @@ public class ColorBlobDetectionActivity extends Activity { // Create and set View mView = new ColorBlobDetectionView(mAppContext); setContentView(mView); + // Check native OpenCV camera if( !mView.openCamera() ) { AlertDialog ad = new AlertDialog.Builder(mAppContext).create(); @@ -34,13 +35,14 @@ public class ColorBlobDetectionActivity extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); } } break; + /** OpenCV loader cannot start Google Play **/ case LoaderCallbackInterface.MARKET_ERROR: { @@ -70,7 +72,7 @@ public class ColorBlobDetectionActivity extends Activity { @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); if (null != mView) mView.releaseCamera(); super.onPause(); @@ -78,12 +80,11 @@ public class ColorBlobDetectionActivity extends Activity { @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -91,7 +92,7 @@ public class ColorBlobDetectionActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); diff --git a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionView.java b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionView.java index dbb93f057..e7fdbcf21 100644 --- a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionView.java +++ b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionView.java @@ -22,29 +22,27 @@ import android.view.View; import android.view.View.OnTouchListener; public class ColorBlobDetectionView extends SampleCvViewBase implements OnTouchListener { + private static final String TAG = "OCVSample::View"; - private Mat mRgba; - - private boolean mIsColorSelected = false; - private Scalar mBlobColorRgba = new Scalar(255); - private Scalar mBlobColorHsv = new Scalar(255); - private ColorBlobDetector mDetector = new ColorBlobDetector(); - private Mat mSpectrum = new Mat(); - private static Size SPECTRUM_SIZE = new Size(200, 32); - - // Logcat tag - private static final String TAG = "Sample-ColorBlobDetection::View"; - - private static final Scalar CONTOUR_COLOR = new Scalar(255,0,0,255); + private Mat mRgba; + private boolean mIsColorSelected = false; + private Scalar mBlobColorRgba = new Scalar(255); + private Scalar mBlobColorHsv = new Scalar(255); + private ColorBlobDetector mDetector = new ColorBlobDetector(); + private Mat mSpectrum = new Mat(); + private static Size SPECTRUM_SIZE = new Size(200, 32); + private static final Scalar CONTOUR_COLOR = new Scalar(255,0,0,255); public ColorBlobDetectionView(Context context) { super(context); setOnTouchListener(this); + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override public void surfaceCreated(SurfaceHolder holder) { + Log.i(TAG, "called surfaceCreated"); synchronized (this) { // initialize Mat before usage mRgba = new Mat(); @@ -53,6 +51,14 @@ public class ColorBlobDetectionView extends SampleCvViewBase implements OnTouchL super.surfaceCreated(holder); } + private Scalar converScalarHsv2Rgba(Scalar hsvColor) { + Mat pointMatRgba = new Mat(); + Mat pointMatHsv = new Mat(1, 1, CvType.CV_8UC3, hsvColor); + Imgproc.cvtColor(pointMatHsv, pointMatRgba, Imgproc.COLOR_HSV2RGB_FULL, 4); + + return new Scalar(pointMatRgba.get(0, 0)); + } + public boolean onTouch(View v, MotionEvent event) { int cols = mRgba.cols(); int rows = mRgba.rows(); @@ -110,8 +116,8 @@ public class ColorBlobDetectionView extends SampleCvViewBase implements OnTouchL mDetector.process(mRgba); List contours = mDetector.getContours(); Log.e(TAG, "Contours count: " + contours.size()); - Core.drawContours(mRgba, contours, -1, CONTOUR_COLOR); - + Core.drawContours(mRgba, contours, -1, CONTOUR_COLOR); + Mat colorLabel = mRgba.submat(2, 34, 2, 34); colorLabel.setTo(mBlobColorRgba); @@ -130,14 +136,6 @@ public class ColorBlobDetectionView extends SampleCvViewBase implements OnTouchL return bmp; } - private Scalar converScalarHsv2Rgba(Scalar hsvColor) { - Mat pointMatRgba = new Mat(); - Mat pointMatHsv = new Mat(1, 1, CvType.CV_8UC3, hsvColor); - Imgproc.cvtColor(pointMatHsv, pointMatRgba, Imgproc.COLOR_HSV2RGB_FULL, 4); - - return new Scalar(pointMatRgba.get(0, 0)); - } - @Override public void run() { super.run(); diff --git a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java index 74d24a502..08c499a58 100644 --- a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java +++ b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetector.java @@ -12,6 +12,16 @@ import org.opencv.core.Scalar; import org.opencv.imgproc.Imgproc; public class ColorBlobDetector { + // Lower and Upper bounds for range checking in HSV color space + private Scalar mLowerBound = new Scalar(0); + private Scalar mUpperBound = new Scalar(0); + // Minimum contour area in percent for contours filtering + private static double mMinContourArea = 0.1; + // Color radius for range checking in HSV color space + private Scalar mColorRadius = new Scalar(25,50,50,0); + private Mat mSpectrum = new Mat(); + private List mContours = new ArrayList(); + public void setColorRadius(Scalar radius) { mColorRadius = radius; } @@ -94,14 +104,4 @@ public class ColorBlobDetector { public List getContours() { return mContours; } - - // Lower and Upper bounds for range checking in HSV color space - private Scalar mLowerBound = new Scalar(0); - private Scalar mUpperBound = new Scalar(0); - // Minimum contour area in percent for contours filtering - private static double mMinContourArea = 0.1; - // Color radius for range checking in HSV color space - private Scalar mColorRadius = new Scalar(25,50,50,0); - private Mat mSpectrum = new Mat(); - private List mContours = new ArrayList(); } diff --git a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/SampleCvViewBase.java b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/SampleCvViewBase.java index 9bd975ab2..47cc3c85a 100644 --- a/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/SampleCvViewBase.java +++ b/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/SampleCvViewBase.java @@ -14,7 +14,7 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private SurfaceHolder mHolder; private VideoCapture mCamera; @@ -26,76 +26,67 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol Log.i(TAG, "Instantiated new " + this.getClass()); } - public boolean openCamera() { - Log.i(TAG, "openCamera"); - synchronized (this) { + public synchronized boolean openCamera() { + Log.i(TAG, "Opening Camera"); + mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); + if (!mCamera.isOpened()) { releaseCamera(); - mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); - if (!mCamera.isOpened()) { - releaseCamera(); - Log.e(TAG, "Failed to open native camera"); - return false; - } + Log.e(TAG, "Can't open native camera"); + return false; } return true; } - public void releaseCamera() { - Log.i(TAG, "releaseCamera"); - synchronized (this) { - if (mCamera != null) { + public synchronized void releaseCamera() { + Log.i(TAG, "Releasing Camera"); + if (mCamera != null) { mCamera.release(); mCamera = null; - } } } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera("+width+", "+height+")"); - synchronized (this) { - if (mCamera != null && mCamera.isOpened()) { - List sizes = mCamera.getSupportedPreviewSizes(); - int mFrameWidth = width; - int mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null && mCamera.isOpened()) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + List sizes = mCamera.getSupportedPreviewSizes(); + int mFrameWidth = width; + int mFrameHeight = height; - // selecting optimal camera preview size - { - double minDiff = Double.MAX_VALUE; - for (Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = (int) size.width; - mFrameHeight = (int) size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + double minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = (int) size.width; + mFrameHeight = (int) size.height; + minDiff = Math.abs(size.height - height); } } - - mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); - mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); } - } + mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); + mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); + } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); + Log.i(TAG, "called surfaceDestroyed"); } protected abstract Bitmap processFrame(VideoCapture capture); public void run() { - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); while (true) { Bitmap bmp = null; @@ -121,7 +112,6 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol bmp.recycle(); } } - - Log.i(TAG, "Finishing processing thread"); + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBasedTracker.java b/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBasedTracker.java index 63a9e3291..9e4600543 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBasedTracker.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBasedTracker.java @@ -38,8 +38,4 @@ public class DetectionBasedTracker private static native void nativeStop(long thiz); private static native void nativeSetFaceSize(long thiz, int size); private static native void nativeDetect(long thiz, long inputImage, long faces); - - static { - System.loadLibrary("detection_based_tracker"); - } } diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java b/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java index 6839b5f5b..9c4750c48 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/FdActivity.java @@ -15,7 +15,7 @@ import android.view.Window; import android.view.WindowManager; public class FdActivity extends Activity { - private static final String TAG = "Sample-FD::Activity"; + private static final String TAG = "OCVSample::Activity"; private MenuItem mItemFace50; private MenuItem mItemFace40; @@ -42,6 +42,7 @@ public class FdActivity extends Activity { mView.setDetectorType(mDetectorType); mView.setMinFaceSize(0.2f); setContentView(mView); + // Check native OpenCV camera if( !mView.openCamera() ) { AlertDialog ad = new AlertDialog.Builder(mAppContext).create(); @@ -49,13 +50,14 @@ public class FdActivity extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); } } break; + /** OpenCV loader cannot start Google Play **/ case LoaderCallbackInterface.MARKET_ERROR: { @@ -80,28 +82,27 @@ public class FdActivity extends Activity { }; public FdActivity() { - Log.i(TAG, "Instantiated new " + this.getClass()); mDetectorName = new String[2]; mDetectorName[FdView.JAVA_DETECTOR] = "Java"; mDetectorName[FdView.NATIVE_DETECTOR] = "Native (tracking)"; + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override protected void onPause() { - Log.i(TAG, "onPause"); - if (mView != null) + Log.i(TAG, "called onPause"); + if (null != mView) mView.releaseCamera(); super.onPause(); } @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -109,7 +110,7 @@ public class FdActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -117,7 +118,7 @@ public class FdActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { - Log.i(TAG, "onCreateOptionsMenu"); + Log.i(TAG, "called onCreateOptionsMenu"); mItemFace50 = menu.add("Face size 50%"); mItemFace40 = menu.add("Face size 40%"); mItemFace30 = menu.add("Face size 30%"); @@ -128,7 +129,7 @@ public class FdActivity extends Activity { @Override public boolean onOptionsItemSelected(MenuItem item) { - Log.i(TAG, "Menu Item selected " + item); + Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); if (item == mItemFace50) mView.setMinFaceSize(0.5f); else if (item == mItemFace40) @@ -137,8 +138,7 @@ public class FdActivity extends Activity { mView.setMinFaceSize(0.3f); else if (item == mItemFace20) mView.setMinFaceSize(0.2f); - else if (item == mItemType) - { + else if (item == mItemType) { mDetectorType = (mDetectorType + 1) % mDetectorName.length; item.setTitle(mDetectorName[mDetectorType]); mView.setDetectorType(mDetectorType); diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java b/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java index 5c12bb6e4..a9e4c2c09 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java @@ -22,22 +22,22 @@ import android.util.Log; import android.view.SurfaceHolder; class FdView extends SampleCvViewBase { - private static final String TAG = "Sample-FD::View"; - private Mat mRgba; - private Mat mGray; - private File mCascadeFile; - private CascadeClassifier mJavaDetector; - private DetectionBasedTracker mNativeDetector; + private static final String TAG = "OCVSample::View"; + private Mat mRgba; + private Mat mGray; + private File mCascadeFile; + private CascadeClassifier mJavaDetector; + private DetectionBasedTracker mNativeDetector; - private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255); + private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255); - public static final int JAVA_DETECTOR = 0; - public static final int NATIVE_DETECTOR = 1; + public static final int JAVA_DETECTOR = 0; + public static final int NATIVE_DETECTOR = 1; - private int mDetectorType = JAVA_DETECTOR; + private int mDetectorType = JAVA_DETECTOR; - private float mRelativeFaceSize = 0; - private int mAbsoluteFaceSize = 0; + private float mRelativeFaceSize = 0; + private int mAbsoluteFaceSize = 0; public void setMinFaceSize(float faceSize) { mRelativeFaceSize = faceSize; @@ -62,6 +62,7 @@ class FdView extends SampleCvViewBase { super(context); try { + // load cascade file from application resources InputStream is = context.getResources().openRawResource(R.raw.lbpcascade_frontalface); File cascadeDir = context.getDir("cascade", Context.MODE_PRIVATE); mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml"); @@ -90,10 +91,13 @@ class FdView extends SampleCvViewBase { e.printStackTrace(); Log.e(TAG, "Failed to load cascade. Exception thrown: " + e); } + + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override public void surfaceCreated(SurfaceHolder holder) { + Log.i(TAG, "called surfaceCreated"); synchronized (this) { // initialize Mats before usage mGray = new Mat(); diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/FpsMeter.java b/samples/android/face-detection/src/org/opencv/samples/fd/FpsMeter.java index 5e96574d0..2c8f3bc7b 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/FpsMeter.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/FpsMeter.java @@ -10,7 +10,7 @@ import android.graphics.Paint; import android.util.Log; public class FpsMeter { - private static final String TAG = "Sample::FpsMeter"; + private static final String TAG = "OCVSample::FpsMeter"; int step; int framesCouner; double freq; diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/SampleCvViewBase.java b/samples/android/face-detection/src/org/opencv/samples/fd/SampleCvViewBase.java index f24f602c5..e633e5acc 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/SampleCvViewBase.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/SampleCvViewBase.java @@ -14,7 +14,7 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private SurfaceHolder mHolder; private VideoCapture mCamera; @@ -28,77 +28,66 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol Log.i(TAG, "Instantiated new " + this.getClass()); } - public boolean openCamera() { - Log.i(TAG, "openCamera"); - synchronized (this) { + public synchronized boolean openCamera() { + Log.i(TAG, "Opening Camera"); + mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); + if (!mCamera.isOpened()) { releaseCamera(); - mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); - if (!mCamera.isOpened()) { - Log.e(TAG, "Failed to open native camera"); - releaseCamera(); - return false; - } + Log.e(TAG, "Can't open native camera"); + return false; } return true; } - public void releaseCamera() { - Log.i(TAG, "releaseCamera"); - synchronized (this) { - if (mCamera != null) { - mCamera.release(); - mCamera = null; - } + public synchronized void releaseCamera() { + Log.i(TAG, "Releasing Camera"); + if (mCamera != null) { + mCamera.release(); + mCamera = null; } } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera("+width+", "+height+")"); - synchronized (this) { - if (mCamera != null && mCamera.isOpened()) { - List sizes = mCamera.getSupportedPreviewSizes(); - int mFrameWidth = width; - int mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null && mCamera.isOpened()) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + List sizes = mCamera.getSupportedPreviewSizes(); + int mFrameWidth = width; + int mFrameHeight = height; - // selecting optimal camera preview size - { - double minDiff = Double.MAX_VALUE; - for (Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = (int) size.width; - mFrameHeight = (int) size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + double minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = (int) size.width; + mFrameHeight = (int) size.height; + minDiff = Math.abs(size.height - height); } } - - mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); - mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); } - } + mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); + mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); + } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); - Log.i(TAG, "surfaceDestroyed2"); + Log.i(TAG, "called surfaceDestroyed"); } - protected abstract Bitmap processFrame(VideoCapture capture); public void run() { - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); mFps.init(); while (true) { @@ -128,7 +117,6 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol bmp.recycle(); } } - - Log.i(TAG, "Finishing processing thread"); + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/FpsMeter.java b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/FpsMeter.java index f00865427..2f802366c 100644 --- a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/FpsMeter.java +++ b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/FpsMeter.java @@ -10,7 +10,7 @@ import android.graphics.Paint; import android.util.Log; public class FpsMeter { - private static final String TAG = "Sample::FpsMeter"; + private static final String TAG = "OCVSample::FpsMeter"; int step; int framesCouner; double freq; diff --git a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java index 153a11ae8..78809599f 100644 --- a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java +++ b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsActivity.java @@ -15,8 +15,7 @@ import android.view.Window; import android.view.WindowManager; public class ImageManipulationsActivity extends Activity { - - private static final String TAG = "Sample-ImageManipulations::Activity"; + private static final String TAG = "OCVSample::Activity"; public static final int VIEW_MODE_RGBA = 0; public static final int VIEW_MODE_HIST = 1; @@ -35,11 +34,10 @@ public class ImageManipulationsActivity extends Activity { private MenuItem mItemPreviewZoom; private MenuItem mItemPreviewPixelize; private MenuItem mItemPreviewPosterize; + private ImageManipulationsView mView; public static int viewMode = VIEW_MODE_RGBA; - private ImageManipulationsView mView; - private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { @@ -50,6 +48,7 @@ public class ImageManipulationsActivity extends Activity { // Create and set View mView = new ImageManipulationsView(mAppContext); setContentView(mView); + // Check native OpenCV camera if( !mView.openCamera() ) { AlertDialog ad = new AlertDialog.Builder(mAppContext).create(); @@ -57,13 +56,14 @@ public class ImageManipulationsActivity extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); } } break; + /** OpenCV loader cannot start Google Play **/ case LoaderCallbackInterface.MARKET_ERROR: { @@ -93,7 +93,7 @@ public class ImageManipulationsActivity extends Activity { @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); if (null != mView) mView.releaseCamera(); super.onPause(); @@ -101,12 +101,11 @@ public class ImageManipulationsActivity extends Activity { @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -114,7 +113,7 @@ public class ImageManipulationsActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -122,7 +121,7 @@ public class ImageManipulationsActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { - Log.i(TAG, "onCreateOptionsMenu"); + Log.i(TAG, "called onCreateOptionsMenu"); mItemPreviewRGBA = menu.add("Preview RGBA"); mItemPreviewHist = menu.add("Histograms"); mItemPreviewCanny = menu.add("Canny"); @@ -136,7 +135,7 @@ public class ImageManipulationsActivity extends Activity { @Override public boolean onOptionsItemSelected(MenuItem item) { - Log.i(TAG, "Menu Item selected " + item); + Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); if (item == mItemPreviewRGBA) viewMode = VIEW_MODE_RGBA; if (item == mItemPreviewHist) diff --git a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsView.java b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsView.java index 5a1c1f5ed..418974c24 100644 --- a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsView.java +++ b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/ImageManipulationsView.java @@ -21,28 +21,32 @@ import android.util.Log; import android.view.SurfaceHolder; class ImageManipulationsView extends SampleCvViewBase { - private Size mSize0; - private Size mSizeRgba; - private Size mSizeRgbaInner; + private static final String TAG = "OCVSample::View"; + private Size mSize0; + private Size mSizeRgba; + private Size mSizeRgbaInner; - private Mat mRgba; - private Mat mGray; - private Mat mIntermediateMat; - private Mat mHist, mMat0; - private MatOfInt mChannels[], mHistSize; - private int mHistSizeNum; - private MatOfFloat mRanges; - private Scalar mColorsRGB[], mColorsHue[], mWhilte; - private Point mP1, mP2; - float mBuff[]; - - private Mat mRgbaInnerWindow; - private Mat mGrayInnerWindow; - private Mat mBlurWindow; - private Mat mZoomWindow; - private Mat mZoomCorner; - - private Mat mSepiaKernel; + private Mat mRgba; + private Mat mGray; + private Mat mIntermediateMat; + private Mat mHist; + private Mat mMat0; + private MatOfInt mChannels[]; + private MatOfInt mHistSize; + private int mHistSizeNum; + private MatOfFloat mRanges; + private Scalar mColorsRGB[]; + private Scalar mColorsHue[]; + private Scalar mWhilte; + private Point mP1; + private Point mP2; + private float mBuff[]; + private Mat mRgbaInnerWindow; + private Mat mGrayInnerWindow; + private Mat mBlurWindow; + private Mat mZoomWindow; + private Mat mZoomCorner; + private Mat mSepiaKernel; public ImageManipulationsView(Context context) { super(context); @@ -52,10 +56,13 @@ class ImageManipulationsView extends SampleCvViewBase { mSepiaKernel.put(1, 0, /* G */0.168f, 0.686f, 0.349f, 0f); mSepiaKernel.put(2, 0, /* B */0.131f, 0.534f, 0.272f, 0f); mSepiaKernel.put(3, 0, /* A */0.000f, 0.000f, 0.000f, 1f); + + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override public void surfaceCreated(SurfaceHolder holder) { + Log.i(TAG, "called surfaceCreated"); synchronized (this) { // initialize Mats before usage mGray = new Mat(); @@ -234,7 +241,7 @@ class ImageManipulationsView extends SampleCvViewBase { Utils.matToBitmap(mRgba, bmp); return bmp; } catch(Exception e) { - Log.e("org.opencv.samples.puzzle15", "Utils.matToBitmap() throws an exception: " + e.getMessage()); + Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage()); bmp.recycle(); return null; } diff --git a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/SampleCvViewBase.java b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/SampleCvViewBase.java index 2bf7a922e..1a5f42173 100644 --- a/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/SampleCvViewBase.java +++ b/samples/android/image-manipulations/src/org/opencv/samples/imagemanipulations/SampleCvViewBase.java @@ -14,7 +14,7 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample-ImageManipulations::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private SurfaceHolder mHolder; private VideoCapture mCamera; @@ -28,86 +28,75 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol Log.i(TAG, "Instantiated new " + this.getClass()); } - public boolean openCamera() { - Log.i(TAG, "openCamera"); - synchronized (this) { + public synchronized boolean openCamera() { + Log.i(TAG, "Opening Camera"); + mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); + if (!mCamera.isOpened()) { releaseCamera(); - mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); - if (!mCamera.isOpened()) { - releaseCamera(); - Log.e(TAG, "Failed to open native camera"); - return false; - } + Log.e(TAG, "Can't open native camera"); + return false; } return true; } - public void releaseCamera() { - Log.i(TAG, "releaseCamera"); - synchronized (this) { - if (mCamera != null) { - mCamera.release(); - mCamera = null; - } + public synchronized void releaseCamera() { + Log.i(TAG, "Releasing Camera"); + if (mCamera != null) { + mCamera.release(); + mCamera = null; } } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera("+width+", "+height+")"); - synchronized (this) { - if (mCamera != null && mCamera.isOpened()) { - List sizes = mCamera.getSupportedPreviewSizes(); - int mFrameWidth = width; - int mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null && mCamera.isOpened()) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + List sizes = mCamera.getSupportedPreviewSizes(); + int mFrameWidth = width; + int mFrameHeight = height; - // selecting optimal camera preview size - { - double minDiff = Double.MAX_VALUE; - for (Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = (int) size.width; - mFrameHeight = (int) size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + double minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = (int) size.width; + mFrameHeight = (int) size.height; + minDiff = Math.abs(size.height - height); } } - - mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); - mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); } - } + mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); + mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); + } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); + Log.i(TAG, "called surfaceDestroyed"); } protected abstract Bitmap processFrame(VideoCapture capture); public void run() { - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); mFps.init(); while (true) { Bitmap bmp = null; synchronized (this) { - if (mCamera == null) { - Log.i(TAG, "mCamera == null"); + if (mCamera == null) break; - } if (!mCamera.grab()) { Log.e(TAG, "mCamera.grab() failed"); @@ -129,7 +118,6 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol bmp.recycle(); } } - - Log.i(TAG, "Finishing processing thread"); + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0Base.java b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0Base.java index 47361cfc1..4706b7478 100644 --- a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0Base.java +++ b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0Base.java @@ -11,7 +11,7 @@ import android.view.Window; public class Sample0Base extends Activity { - private static final String TAG = "Sample::Activity"; + private static final String TAG = "OCVSample::Activity"; private MenuItem mItemPreviewRGBA; private MenuItem mItemPreviewGray; @@ -23,14 +23,14 @@ public class Sample0Base extends Activity { @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); super.onPause(); mView.releaseCamera(); } @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); if( !mView.openCamera() ) { AlertDialog ad = new AlertDialog.Builder(this).create(); @@ -38,8 +38,8 @@ public class Sample0Base extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); @@ -49,7 +49,7 @@ public class Sample0Base extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); mView = new Sample0View(this); @@ -58,7 +58,7 @@ public class Sample0Base extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { - Log.i(TAG, "onCreateOptionsMenu"); + Log.i(TAG, "called onCreateOptionsMenu"); mItemPreviewRGBA = menu.add("Preview RGBA"); mItemPreviewGray = menu.add("Preview GRAY"); return true; @@ -66,7 +66,7 @@ public class Sample0Base extends Activity { @Override public boolean onOptionsItemSelected(MenuItem item) { - Log.i(TAG, "Menu Item selected " + item); + Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); if (item == mItemPreviewRGBA) mView.setViewMode(Sample0View.VIEW_MODE_RGBA); else if (item == mItemPreviewGray) diff --git a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java index a0278187c..dbe694719 100644 --- a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java +++ b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/Sample0View.java @@ -6,20 +6,21 @@ import android.util.Log; class Sample0View extends SampleViewBase { - private static final String TAG = "Sample::View"; - int mSize; - int[] mRGBA; - private Bitmap mBitmap; - private int mViewMode; + private static final String TAG = "OCVSample::View"; public static final int VIEW_MODE_RGBA = 0; public static final int VIEW_MODE_GRAY = 1; + int mSize; + int[] mRGBA; + private Bitmap mBitmap; + private int mViewMode; public Sample0View(Context context) { super(context); mSize = 0; mViewMode = VIEW_MODE_RGBA; + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override @@ -64,7 +65,7 @@ class Sample0View extends SampleViewBase { @Override protected void onPreviewStarted(int previewWidth, int previewHeight) { - Log.i(TAG, "onPreviewStarted("+previewWidth+", "+previewHeight+")"); + Log.i(TAG, "called onPreviewStarted("+previewWidth+", "+previewHeight+")"); /* Create a bitmap that will be used through to calculate the image to */ mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); mRGBA = new int[previewWidth * previewHeight]; @@ -72,7 +73,7 @@ class Sample0View extends SampleViewBase { @Override protected void onPreviewStopped() { - Log.i(TAG, "onPreviewStopped"); + Log.i(TAG, "called onPreviewStopped"); if(mBitmap != null) { mBitmap.recycle(); mBitmap = null; @@ -84,7 +85,7 @@ class Sample0View extends SampleViewBase { } public void setViewMode(int viewMode) { - Log.i(TAG, "setViewMode("+viewMode+")"); + Log.i(TAG, "called setViewMode("+viewMode+")"); mViewMode = viewMode; } } \ No newline at end of file diff --git a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java index c1cc15872..ca4251d33 100644 --- a/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java +++ b/samples/android/tutorial-0-androidcamera/src/org/opencv/samples/tutorial0/SampleViewBase.java @@ -16,7 +16,7 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private Camera mCamera; private SurfaceHolder mHolder; @@ -52,19 +52,30 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde mCamera.setPreviewDisplay(null); } - public boolean openCamera() { - Log.i(TAG, "openCamera"); + Log.i(TAG, "Opening Camera"); mCamera = null; + try { mCamera = Camera.open(); } catch (Exception e){ - Log.e(TAG, "Camera is not available (in use or does not exist)"); - e.printStackTrace(); + Log.e(TAG, "Camera is not available (in use or does not exist): " + e.getLocalizedMessage()); } + + if(mCamera == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) { + try { + mCamera = Camera.open(camIdx); + } + catch (RuntimeException e) { + Log.e(TAG, "Camera #" + camIdx + "failed to open: " + e.getLocalizedMessage()); + } + } + } + if(mCamera == null) { - Log.e(TAG, "Failed to open camera"); + Log.e(TAG, "Can't open any camera"); return false; } @@ -77,11 +88,12 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde camera.addCallbackBuffer(mBuffer); } }); + return true; } public void releaseCamera() { - Log.i(TAG, "releaseCamera"); + Log.i(TAG, "Releasing Camera"); mThreadRun = false; synchronized (this) { if (mCamera != null) { @@ -93,64 +105,61 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde onPreviewStopped(); } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera"); - synchronized (this) { - if (mCamera != null) { - Log.i(TAG, "setupCamera - " + width + "x" + height); - Camera.Parameters params = mCamera.getParameters(); - List sizes = params.getSupportedPreviewSizes(); - mFrameWidth = width; - mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + Camera.Parameters params = mCamera.getParameters(); + List sizes = params.getSupportedPreviewSizes(); + mFrameWidth = width; + mFrameHeight = height; - // selecting optimal camera preview size - { - int minDiff = Integer.MAX_VALUE; - for (Camera.Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = size.width; - mFrameHeight = size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + int minDiff = Integer.MAX_VALUE; + for (Camera.Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = size.width; + mFrameHeight = size.height; + minDiff = Math.abs(size.height - height); } } - - params.setPreviewSize(getFrameWidth(), getFrameHeight()); - - List FocusModes = params.getSupportedFocusModes(); - if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) - { - params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); - } - - mCamera.setParameters(params); - - /* Now allocate the buffer */ - params = mCamera.getParameters(); - int size = params.getPreviewSize().width * params.getPreviewSize().height; - size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; - mBuffer = new byte[size]; - /* The buffer where the current frame will be copied */ - mFrame = new byte [size]; - mCamera.addCallbackBuffer(mBuffer); - - /* Notify that the preview is about to be started and deliver preview size */ - onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); - - try { - setPreview(); - } catch (IOException e) { - Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); - } - - /* Now we can start a preview */ - mCamera.startPreview(); } + + params.setPreviewSize(getFrameWidth(), getFrameHeight()); + + List FocusModes = params.getSupportedFocusModes(); + if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) + { + params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); + } + + mCamera.setParameters(params); + + /* Now allocate the buffer */ + params = mCamera.getParameters(); + int size = params.getPreviewSize().width * params.getPreviewSize().height; + size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; + mBuffer = new byte[size]; + /* The buffer where the current frame will be copied */ + mFrame = new byte [size]; + mCamera.addCallbackBuffer(mBuffer); + + /* Notify that the preview is about to be started and deliver preview size */ + onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); + + try { + setPreview(); + } catch (IOException e) { + Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); + } + + /* Now we can start a preview */ + mCamera.startPreview(); } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); // stop preview before making changes try { mCamera.stopPreview(); @@ -163,12 +172,12 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); + Log.i(TAG, "called surfaceDestroyed"); } /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */ @@ -191,7 +200,7 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde public void run() { mThreadRun = true; - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); while (mThreadRun) { Bitmap bmp = null; @@ -214,6 +223,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } } } - Log.i(TAG, "Finishing processing thread"); + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java index 502b6e7d9..1e9cfc30f 100644 --- a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java +++ b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1Java.java @@ -15,7 +15,7 @@ import android.view.Window; import android.view.WindowManager; public class Sample1Java extends Activity { - private static final String TAG = "Sample::Activity"; + private static final String TAG = "OCVSample::Activity"; private MenuItem mItemPreviewRGBA; private MenuItem mItemPreviewGray; @@ -32,6 +32,7 @@ public class Sample1Java extends Activity { // Create and set View mView = new Sample1View(mAppContext); setContentView(mView); + // Check native OpenCV camera if( !mView.openCamera() ) { AlertDialog ad = new AlertDialog.Builder(mAppContext).create(); @@ -39,8 +40,8 @@ public class Sample1Java extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); @@ -76,7 +77,7 @@ public class Sample1Java extends Activity { @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); if (null != mView) mView.releaseCamera(); super.onPause(); @@ -84,12 +85,11 @@ public class Sample1Java extends Activity { @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -97,7 +97,7 @@ public class Sample1Java extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -105,7 +105,7 @@ public class Sample1Java extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { - Log.i(TAG, "onCreateOptionsMenu"); + Log.i(TAG, "called onCreateOptionsMenu"); mItemPreviewRGBA = menu.add("Preview RGBA"); mItemPreviewGray = menu.add("Preview GRAY"); mItemPreviewCanny = menu.add("Canny"); @@ -114,7 +114,7 @@ public class Sample1Java extends Activity { @Override public boolean onOptionsItemSelected(MenuItem item) { - Log.i(TAG, "Menu Item selected " + item); + Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); if (item == mItemPreviewRGBA) { mView.setViewMode(Sample1View.VIEW_MODE_RGBA); } else if (item == mItemPreviewGray) { diff --git a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1View.java b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1View.java index 99906769c..fd949cc31 100644 --- a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1View.java +++ b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/Sample1View.java @@ -13,41 +13,46 @@ import android.graphics.Bitmap; import android.util.Log; class Sample1View extends SampleViewBase { + private static final String TAG = "OCVSample::View"; public static final int VIEW_MODE_RGBA = 0; public static final int VIEW_MODE_GRAY = 1; public static final int VIEW_MODE_CANNY = 2; - private Mat mYuv; - private Mat mRgba; - private Mat mGraySubmat; - private Mat mIntermediateMat; - private Bitmap mBitmap; - private int mViewMode; + private Mat mYuv; + private Mat mRgba; + private Mat mGraySubmat; + private Mat mIntermediateMat; + private Bitmap mBitmap; + private int mViewMode; public Sample1View(Context context) { super(context); mViewMode = VIEW_MODE_RGBA; + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override protected void onPreviewStarted(int previewWidth, int previewHeight) { - synchronized (this) { - // initialize Mats before usage - mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1); - mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth()); + Log.i(TAG, "called onPreviewStarted("+previewWidth+", "+previewHeight+")"); - mRgba = new Mat(); - mIntermediateMat = new Mat(); + // initialize Mats before usage + mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1); + mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth()); - mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); - } + mRgba = new Mat(); + mIntermediateMat = new Mat(); + + mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); } @Override protected void onPreviewStopped() { + Log.i(TAG, "called onPreviewStopped"); + if(mBitmap != null) { mBitmap.recycle(); + mBitmap = null; } synchronized (this) { @@ -101,6 +106,7 @@ class Sample1View extends SampleViewBase { } public void setViewMode(int viewMode) { + Log.i(TAG, "called setViewMode("+viewMode+")"); mViewMode = viewMode; } diff --git a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/SampleViewBase.java b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/SampleViewBase.java index 6151eb095..e7c62dcef 100644 --- a/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/SampleViewBase.java +++ b/samples/android/tutorial-1-addopencv/src/org/opencv/samples/tutorial1/SampleViewBase.java @@ -16,14 +16,14 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private Camera mCamera; private SurfaceHolder mHolder; private int mFrameWidth; private int mFrameHeight; private byte[] mFrame; - private boolean mThreadRun; + private volatile boolean mThreadRun; private byte[] mBuffer; private SurfaceTexture mSf; @@ -53,11 +53,29 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } public boolean openCamera() { - Log.i(TAG, "openCamera"); - releaseCamera(); - mCamera = Camera.open(); + Log.i(TAG, "Opening Camera"); + mCamera = null; + + try { + mCamera = Camera.open(); + } + catch (Exception e){ + Log.e(TAG, "Camera is not available (in use or does not exist): " + e.getLocalizedMessage()); + } + + if(mCamera == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) { + try { + mCamera = Camera.open(camIdx); + } + catch (RuntimeException e) { + Log.e(TAG, "Camera #" + camIdx + "failed to open: " + e.getLocalizedMessage()); + } + } + } + if(mCamera == null) { - Log.e(TAG, "Can't open camera!"); + Log.e(TAG, "Can't open any camera"); return false; } @@ -70,16 +88,16 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde camera.addCallbackBuffer(mBuffer); } }); + return true; } public void releaseCamera() { - Log.i(TAG, "releaseCamera"); + Log.i(TAG, "Releasing Camera"); mThreadRun = false; synchronized (this) { if (mCamera != null) { mCamera.stopPreview(); - mCamera.setPreviewCallback(null); mCamera.release(); mCamera = null; } @@ -87,74 +105,79 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde onPreviewStopped(); } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera"); - synchronized (this) { - if (mCamera != null) { - Camera.Parameters params = mCamera.getParameters(); - List sizes = params.getSupportedPreviewSizes(); - mFrameWidth = width; - mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + Camera.Parameters params = mCamera.getParameters(); + List sizes = params.getSupportedPreviewSizes(); + mFrameWidth = width; + mFrameHeight = height; - // selecting optimal camera preview size - { - int minDiff = Integer.MAX_VALUE; - for (Camera.Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = size.width; - mFrameHeight = size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + int minDiff = Integer.MAX_VALUE; + for (Camera.Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = size.width; + mFrameHeight = size.height; + minDiff = Math.abs(size.height - height); } } - - params.setPreviewSize(getFrameWidth(), getFrameHeight()); - - List FocusModes = params.getSupportedFocusModes(); - if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) - { - params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); - } - - mCamera.setParameters(params); - - /* Now allocate the buffer */ - params = mCamera.getParameters(); - int size = params.getPreviewSize().width * params.getPreviewSize().height; - size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; - mBuffer = new byte[size]; - /* The buffer where the current frame will be copied */ - mFrame = new byte [size]; - mCamera.addCallbackBuffer(mBuffer); - - /* Notify that the preview is about to be started and deliver preview size */ - onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); - - try { - setPreview(); - } catch (IOException e) { - Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); - } - - /* Now we can start a preview */ - mCamera.startPreview(); } + + params.setPreviewSize(getFrameWidth(), getFrameHeight()); + + List FocusModes = params.getSupportedFocusModes(); + if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) + { + params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); + } + + mCamera.setParameters(params); + + /* Now allocate the buffer */ + params = mCamera.getParameters(); + int size = params.getPreviewSize().width * params.getPreviewSize().height; + size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; + mBuffer = new byte[size]; + /* The buffer where the current frame will be copied */ + mFrame = new byte [size]; + mCamera.addCallbackBuffer(mBuffer); + + /* Notify that the preview is about to be started and deliver preview size */ + onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); + + try { + setPreview(); + } catch (IOException e) { + Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); + } + + /* Now we can start a preview */ + mCamera.startPreview(); } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); + // stop preview before making changes + try { + mCamera.stopPreview(); + } catch (Exception e){ + // ignore: tried to stop a non-existent preview + } + + // start preview with new settings setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); + Log.i(TAG, "called surfaceDestroyed"); } /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */ @@ -177,13 +200,15 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde public void run() { mThreadRun = true; - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); while (mThreadRun) { Bitmap bmp = null; synchronized (this) { try { this.wait(); + if (!mThreadRun) + break; bmp = processFrame(mFrame); } catch (InterruptedException e) { e.printStackTrace(); @@ -198,5 +223,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } } } + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java index 8a190c77c..fc9ff0fb5 100644 --- a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java +++ b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2NativeCamera.java @@ -15,7 +15,7 @@ import android.view.Window; import android.view.WindowManager; public class Sample2NativeCamera extends Activity { - private static final String TAG = "Sample::Activity"; + private static final String TAG = "OCVSample::Activity"; public static final int VIEW_MODE_RGBA = 0; public static final int VIEW_MODE_GRAY = 1; @@ -24,11 +24,10 @@ public class Sample2NativeCamera extends Activity { private MenuItem mItemPreviewRGBA; private MenuItem mItemPreviewGray; private MenuItem mItemPreviewCanny; + private Sample2View mView; public static int viewMode = VIEW_MODE_RGBA; - private Sample2View mView; - private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { @@ -39,6 +38,7 @@ public class Sample2NativeCamera extends Activity { // Create and set View mView = new Sample2View(mAppContext); setContentView(mView); + // Check native OpenCV camera if( !mView.openCamera() ) { AlertDialog ad = new AlertDialog.Builder(mAppContext).create(); @@ -46,13 +46,14 @@ public class Sample2NativeCamera extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); } } break; + /** OpenCV loader cannot start Google Play **/ case LoaderCallbackInterface.MARKET_ERROR: { @@ -82,7 +83,7 @@ public class Sample2NativeCamera extends Activity { @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); if (null != mView) mView.releaseCamera(); super.onPause(); @@ -90,12 +91,11 @@ public class Sample2NativeCamera extends Activity { @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -103,7 +103,7 @@ public class Sample2NativeCamera extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -111,7 +111,7 @@ public class Sample2NativeCamera extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { - Log.i(TAG, "onCreateOptionsMenu"); + Log.i(TAG, "called onCreateOptionsMenu"); mItemPreviewRGBA = menu.add("Preview RGBA"); mItemPreviewGray = menu.add("Preview GRAY"); mItemPreviewCanny = menu.add("Canny"); @@ -120,7 +120,7 @@ public class Sample2NativeCamera extends Activity { @Override public boolean onOptionsItemSelected(MenuItem item) { - Log.i(TAG, "Menu Item selected " + item); + Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); if (item == mItemPreviewRGBA) viewMode = VIEW_MODE_RGBA; else if (item == mItemPreviewGray) diff --git a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java index 18bc54bc1..e61dd4043 100644 --- a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java +++ b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/Sample2View.java @@ -15,16 +15,20 @@ import android.util.Log; import android.view.SurfaceHolder; class Sample2View extends SampleCvViewBase { - private Mat mRgba; - private Mat mGray; - private Mat mIntermediateMat; + private static final String TAG = "OCVSample::View"; + + private Mat mRgba; + private Mat mGray; + private Mat mIntermediateMat; public Sample2View(Context context) { super(context); + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override public void surfaceCreated(SurfaceHolder holder) { + Log.i(TAG, "called surfaceCreated"); synchronized (this) { // initialize Mats before usage mGray = new Mat(); @@ -59,7 +63,7 @@ class Sample2View extends SampleCvViewBase { Utils.matToBitmap(mRgba, bmp); return bmp; } catch(Exception e) { - Log.e("org.opencv.samples.tutorial2", "Utils.matToBitmap() throws an exception: " + e.getMessage()); + Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage()); bmp.recycle(); return null; } diff --git a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/SampleCvViewBase.java b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/SampleCvViewBase.java index 381c67127..76924570e 100644 --- a/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/SampleCvViewBase.java +++ b/samples/android/tutorial-2-opencvcamera/src/org/opencv/samples/tutorial2/SampleCvViewBase.java @@ -14,7 +14,7 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private SurfaceHolder mHolder; private VideoCapture mCamera; @@ -26,76 +26,67 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol Log.i(TAG, "Instantiated new " + this.getClass()); } - public boolean openCamera() { - Log.i(TAG, "openCamera"); - synchronized (this) { + public synchronized boolean openCamera() { + Log.i(TAG, "Opening Camera"); + mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); + if (!mCamera.isOpened()) { releaseCamera(); - mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); - if (!mCamera.isOpened()) { - releaseCamera(); - Log.e(TAG, "Failed to open native camera"); - return false; - } + Log.e(TAG, "Can't open native camera"); + return false; } return true; } - public void releaseCamera() { - Log.i(TAG, "releaseCamera"); - synchronized (this) { - if (mCamera != null) { - mCamera.release(); - mCamera = null; - } + public synchronized void releaseCamera() { + Log.i(TAG, "Releasing Camera"); + if (mCamera != null) { + mCamera.release(); + mCamera = null; } } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera("+width+", "+height+")"); - synchronized (this) { - if (mCamera != null && mCamera.isOpened()) { - List sizes = mCamera.getSupportedPreviewSizes(); - int mFrameWidth = width; - int mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null && mCamera.isOpened()) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + List sizes = mCamera.getSupportedPreviewSizes(); + int mFrameWidth = width; + int mFrameHeight = height; - // selecting optimal camera preview size - { - double minDiff = Double.MAX_VALUE; - for (Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = (int) size.width; - mFrameHeight = (int) size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + double minDiff = Double.MAX_VALUE; + for (Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = (int) size.width; + mFrameHeight = (int) size.height; + minDiff = Math.abs(size.height - height); } } - - mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); - mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); } - } + mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); + mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); + } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); + Log.i(TAG, "called surfaceDestroyed"); } protected abstract Bitmap processFrame(VideoCapture capture); public void run() { - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); while (true) { Bitmap bmp = null; @@ -115,13 +106,12 @@ public abstract class SampleCvViewBase extends SurfaceView implements SurfaceHol Canvas canvas = mHolder.lockCanvas(); if (canvas != null) { canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR); - canvas.drawBitmap(bmp, (canvas.getWidth()-bmp.getWidth()) / 2, (canvas.getHeight()-bmp.getHeight()) / 2, null); + canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2, null); mHolder.unlockCanvasAndPost(canvas); } bmp.recycle(); } } - - Log.i(TAG, "Finishing processing thread"); + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java index 3cc4d6754..51e5003c4 100644 --- a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java +++ b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3Native.java @@ -13,8 +13,9 @@ import android.view.Window; import android.view.WindowManager; public class Sample3Native extends Activity { - private static final String TAG = "Sample::Activity"; - private Sample3View mView; + private static final String TAG = "OCVSample::Activity"; + + private Sample3View mView; private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { @Override @@ -37,8 +38,8 @@ public class Sample3Native extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); @@ -73,7 +74,7 @@ public class Sample3Native extends Activity { @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); if (null != mView) mView.releaseCamera(); super.onPause(); @@ -81,12 +82,11 @@ public class Sample3Native extends Activity { @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -94,7 +94,7 @@ public class Sample3Native extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.i(TAG, "onCreate"); + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); diff --git a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3View.java b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3View.java index d16cbb72d..c4b1caa06 100644 --- a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3View.java +++ b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/Sample3View.java @@ -2,22 +2,27 @@ package org.opencv.samples.tutorial3; import android.content.Context; import android.graphics.Bitmap; +import android.util.Log; class Sample3View extends SampleViewBase { + private static final String TAG = "OCVSample::View"; - private int mFrameSize; - private Bitmap mBitmap; - private int[] mRGBA; + private int mFrameSize; + private Bitmap mBitmap; + private int[] mRGBA; public Sample3View(Context context) { super(context); + Log.i(TAG, "Instantiated new " + this.getClass()); } @Override - protected void onPreviewStarted(int previewWidtd, int previewHeight) { - mFrameSize = previewWidtd * previewHeight; + protected void onPreviewStarted(int previewWidth, int previewHeight) { + Log.i(TAG, "called onPreviewStarted("+previewWidth+", "+previewHeight+")"); + + mFrameSize = previewWidth * previewHeight; mRGBA = new int[mFrameSize]; - mBitmap = Bitmap.createBitmap(previewWidtd, previewHeight, Bitmap.Config.ARGB_8888); + mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); } @Override diff --git a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/SampleViewBase.java b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/SampleViewBase.java index f4666ed39..449de6926 100644 --- a/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/SampleViewBase.java +++ b/samples/android/tutorial-3-native/src/org/opencv/samples/tutorial3/SampleViewBase.java @@ -15,14 +15,14 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private Camera mCamera; private SurfaceHolder mHolder; private int mFrameWidth; private int mFrameHeight; private byte[] mFrame; - private boolean mThreadRun; + private volatile boolean mThreadRun; private byte[] mBuffer; private SurfaceTexture mSf; @@ -52,11 +52,29 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } public boolean openCamera() { - Log.i(TAG, "openCamera"); - releaseCamera(); - mCamera = Camera.open(); + Log.i(TAG, "Opening Camera"); + mCamera = null; + + try { + mCamera = Camera.open(); + } + catch (Exception e){ + Log.e(TAG, "Camera is not available (in use or does not exist): " + e.getLocalizedMessage()); + } + + if(mCamera == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) { + try { + mCamera = Camera.open(camIdx); + } + catch (RuntimeException e) { + Log.e(TAG, "Camera #" + camIdx + "failed to open: " + e.getLocalizedMessage()); + } + } + } + if(mCamera == null) { - Log.e(TAG, "Can't open camera!"); + Log.e(TAG, "Can't open any camera"); return false; } @@ -69,11 +87,12 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde camera.addCallbackBuffer(mBuffer); } }); + return true; } public void releaseCamera() { - Log.i(TAG, "releaseCamera"); + Log.i(TAG, "Releasing Camera"); mThreadRun = false; synchronized (this) { if (mCamera != null) { @@ -86,77 +105,81 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde onPreviewStopped(); } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera"); - synchronized (this) { - if (mCamera != null) { - Camera.Parameters params = mCamera.getParameters(); - List sizes = params.getSupportedPreviewSizes(); - mFrameWidth = width; - mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + Camera.Parameters params = mCamera.getParameters(); + List sizes = params.getSupportedPreviewSizes(); + mFrameWidth = width; + mFrameHeight = height; - // selecting optimal camera preview size - { - int minDiff = Integer.MAX_VALUE; - for (Camera.Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = size.width; - mFrameHeight = size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + int minDiff = Integer.MAX_VALUE; + for (Camera.Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = size.width; + mFrameHeight = size.height; + minDiff = Math.abs(size.height - height); } } - - params.setPreviewSize(getFrameWidth(), getFrameHeight()); - - List FocusModes = params.getSupportedFocusModes(); - if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) - { - params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); - } - - mCamera.setParameters(params); - - /* Now allocate the buffer */ - params = mCamera.getParameters(); - int size = params.getPreviewSize().width * params.getPreviewSize().height; - size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; - mBuffer = new byte[size]; - /* The buffer where the current frame will be copied */ - mFrame = new byte [size]; - mCamera.addCallbackBuffer(mBuffer); - - /* Notify that the preview is about to be started and deliver preview size */ - onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); - - try { - setPreview(); - } catch (IOException e) { - Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); - } - - /* Now we can start a preview */ - mCamera.startPreview(); } + + params.setPreviewSize(getFrameWidth(), getFrameHeight()); + + List FocusModes = params.getSupportedFocusModes(); + if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) + { + params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); + } + + mCamera.setParameters(params); + + /* Now allocate the buffer */ + params = mCamera.getParameters(); + int size = params.getPreviewSize().width * params.getPreviewSize().height; + size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; + mBuffer = new byte[size]; + /* The buffer where the current frame will be copied */ + mFrame = new byte [size]; + mCamera.addCallbackBuffer(mBuffer); + + /* Notify that the preview is about to be started and deliver preview size */ + onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); + + try { + setPreview(); + } catch (IOException e) { + Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); + } + + /* Now we can start a preview */ + mCamera.startPreview(); } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); + // stop preview before making changes + try { + mCamera.stopPreview(); + } catch (Exception e){ + // ignore: tried to stop a non-existent preview + } + + // start preview with new settings setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); + Log.i(TAG, "called surfaceDestroyed"); } - /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */ protected abstract Bitmap processFrame(byte[] data); @@ -177,13 +200,15 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde public void run() { mThreadRun = true; - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); while (mThreadRun) { Bitmap bmp = null; synchronized (this) { try { this.wait(); + if (!mThreadRun) + break; bmp = processFrame(mFrame); } catch (InterruptedException e) { e.printStackTrace(); @@ -198,5 +223,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } } } + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file diff --git a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java index 1c320a6a3..929f29b35 100644 --- a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java +++ b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4Mixed.java @@ -15,7 +15,7 @@ import android.view.Window; import android.view.WindowManager; public class Sample4Mixed extends Activity { - private static final String TAG = "Sample::Activity"; + private static final String TAG = "OCVSample::Activity"; private MenuItem mItemPreviewRGBA; private MenuItem mItemPreviewGray; @@ -45,13 +45,14 @@ public class Sample4Mixed extends Activity { ad.setMessage("Fatal error: can't open camera!"); ad.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - finish(); + dialog.dismiss(); + finish(); } }); ad.show(); } } break; + /** OpenCV loader cannot start Google Play **/ case LoaderCallbackInterface.MARKET_ERROR: { @@ -81,7 +82,7 @@ public class Sample4Mixed extends Activity { @Override protected void onPause() { - Log.i(TAG, "onPause"); + Log.i(TAG, "called onPause"); if (null != mView) mView.releaseCamera(); super.onPause(); @@ -89,12 +90,11 @@ public class Sample4Mixed extends Activity { @Override protected void onResume() { - Log.i(TAG, "onResume"); + Log.i(TAG, "called onResume"); super.onResume(); Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { + if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) { Log.e(TAG, "Cannot connect to OpenCV Manager"); } } @@ -102,14 +102,15 @@ public class Sample4Mixed extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { + Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); - Log.i(TAG, "onCreate"); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } + @Override public boolean onCreateOptionsMenu(Menu menu) { - Log.i(TAG, "onCreateOptionsMenu"); + Log.i(TAG, "called onCreateOptionsMenu"); mItemPreviewRGBA = menu.add("Preview RGBA"); mItemPreviewGray = menu.add("Preview GRAY"); mItemPreviewCanny = menu.add("Canny"); @@ -117,8 +118,9 @@ public class Sample4Mixed extends Activity { return true; } + @Override public boolean onOptionsItemSelected(MenuItem item) { - Log.i(TAG, "Menu Item selected " + item); + Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); if (item == mItemPreviewRGBA) { mView.setViewMode(Sample4View.VIEW_MODE_RGBA); } else if (item == mItemPreviewGray) { diff --git a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4View.java b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4View.java index 708a6730d..2b44ecac9 100644 --- a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4View.java +++ b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/Sample4View.java @@ -10,26 +10,28 @@ import android.graphics.Bitmap; import android.util.Log; class Sample4View extends SampleViewBase { + private static final String TAG = "OCVSample::View"; public static final int VIEW_MODE_RGBA = 0; public static final int VIEW_MODE_GRAY = 1; public static final int VIEW_MODE_CANNY = 2; public static final int VIEW_MODE_FEATURES = 5; - private Mat mYuv; - private Mat mRgba; - private Mat mGraySubmat; - private Mat mIntermediateMat; - - private int mViewMode; - private Bitmap mBitmap; + private Mat mYuv; + private Mat mRgba; + private Mat mGraySubmat; + private Mat mIntermediateMat; + private Bitmap mBitmap; + private int mViewMode; public Sample4View(Context context) { super(context); } @Override - protected void onPreviewStarted(int previewWidtd, int previewHeight) { + protected void onPreviewStarted(int previewWidth, int previewHeight) { + Log.i(TAG, "called onPreviewStarted("+previewWidth+", "+previewHeight+")"); + // initialize Mats before usage mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1); mGraySubmat = mYuv.submat(0, getFrameHeight(), 0, getFrameWidth()); @@ -37,31 +39,34 @@ class Sample4View extends SampleViewBase { mRgba = new Mat(); mIntermediateMat = new Mat(); - mBitmap = Bitmap.createBitmap(previewWidtd, previewHeight, Bitmap.Config.ARGB_8888); + mBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Bitmap.Config.ARGB_8888); } @Override protected void onPreviewStopped() { + Log.i(TAG, "called onPreviewStopped"); if (mBitmap != null) { mBitmap.recycle(); mBitmap = null; } - // Explicitly deallocate Mats - if (mYuv != null) - mYuv.release(); - if (mRgba != null) - mRgba.release(); - if (mGraySubmat != null) - mGraySubmat.release(); - if (mIntermediateMat != null) - mIntermediateMat.release(); + synchronized (this) { + // Explicitly deallocate Mats + if (mYuv != null) + mYuv.release(); + if (mRgba != null) + mRgba.release(); + if (mGraySubmat != null) + mGraySubmat.release(); + if (mIntermediateMat != null) + mIntermediateMat.release(); - mYuv = null; - mRgba = null; - mGraySubmat = null; - mIntermediateMat = null; + mYuv = null; + mRgba = null; + mGraySubmat = null; + mIntermediateMat = null; + } } @@ -105,6 +110,7 @@ class Sample4View extends SampleViewBase { public native void FindFeatures(long matAddrGr, long matAddrRgba); public void setViewMode(int viewMode) { + Log.i(TAG, "called setViewMode("+viewMode+")"); mViewMode = viewMode; } } diff --git a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/SampleViewBase.java b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/SampleViewBase.java index 4991e3033..19efbcd64 100644 --- a/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/SampleViewBase.java +++ b/samples/android/tutorial-4-mixed/src/org/opencv/samples/tutorial4/SampleViewBase.java @@ -2,6 +2,7 @@ package org.opencv.samples.tutorial4; import java.io.IOException; import java.util.List; + import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -15,14 +16,14 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; public abstract class SampleViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { - private static final String TAG = "Sample::SurfaceView"; + private static final String TAG = "OCVSample::BaseView"; private Camera mCamera; private SurfaceHolder mHolder; private int mFrameWidth; private int mFrameHeight; private byte[] mFrame; - private boolean mThreadRun; + private volatile boolean mThreadRun; private byte[] mBuffer; private SurfaceTexture mSf; @@ -52,11 +53,29 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } public boolean openCamera() { - Log.i(TAG, "openCamera"); - releaseCamera(); - mCamera = Camera.open(); + Log.i(TAG, "Opening Camera"); + mCamera = null; + + try { + mCamera = Camera.open(); + } + catch (Exception e){ + Log.e(TAG, "Camera is not available (in use or does not exist): " + e.getLocalizedMessage()); + } + + if(mCamera == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) { + try { + mCamera = Camera.open(camIdx); + } + catch (RuntimeException e) { + Log.e(TAG, "Camera #" + camIdx + "failed to open: " + e.getLocalizedMessage()); + } + } + } + if(mCamera == null) { - Log.e(TAG, "Can't open camera!"); + Log.e(TAG, "Can't open any camera"); return false; } @@ -69,16 +88,16 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde camera.addCallbackBuffer(mBuffer); } }); + return true; } public void releaseCamera() { - Log.i(TAG, "releaseCamera"); + Log.i(TAG, "Releasing Camera"); mThreadRun = false; synchronized (this) { if (mCamera != null) { mCamera.stopPreview(); - mCamera.setPreviewCallback(null); mCamera.release(); mCamera = null; } @@ -86,78 +105,81 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde onPreviewStopped(); } - public void setupCamera(int width, int height) { - Log.i(TAG, "setupCamera"); - synchronized (this) { - if (mCamera != null) { - Camera.Parameters params = mCamera.getParameters(); - List sizes = params.getSupportedPreviewSizes(); - mFrameWidth = width; - mFrameHeight = height; + public synchronized void setupCamera(int width, int height) { + if (mCamera != null) { + Log.i(TAG, "Setup Camera - " + width + "x" + height); + Camera.Parameters params = mCamera.getParameters(); + List sizes = params.getSupportedPreviewSizes(); + mFrameWidth = width; + mFrameHeight = height; - // selecting optimal camera preview size - { - int minDiff = Integer.MAX_VALUE; - for (Camera.Size size : sizes) { - if (Math.abs(size.height - height) < minDiff) { - mFrameWidth = size.width; - mFrameHeight = size.height; - minDiff = Math.abs(size.height - height); - } + // selecting optimal camera preview size + { + int minDiff = Integer.MAX_VALUE; + for (Camera.Size size : sizes) { + if (Math.abs(size.height - height) < minDiff) { + mFrameWidth = size.width; + mFrameHeight = size.height; + minDiff = Math.abs(size.height - height); } } - - params.setPreviewSize(getFrameWidth(), getFrameHeight()); - - List FocusModes = params.getSupportedFocusModes(); - if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) - { - params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); - } - - mCamera.setParameters(params); - - /* Now allocate the buffer */ - params = mCamera.getParameters(); - int size = params.getPreviewSize().width * params.getPreviewSize().height; - size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; - mBuffer = new byte[size]; - /* The buffer where the current frame will be copied */ - mFrame = new byte [size]; - mCamera.addCallbackBuffer(mBuffer); - - /* Notify that the preview is about to be started and deliver preview size */ - onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); - - try { - setPreview(); - } catch (IOException e) { - Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); - } - - /* Now we can start a preview */ - mCamera.startPreview(); } + + params.setPreviewSize(getFrameWidth(), getFrameHeight()); + + List FocusModes = params.getSupportedFocusModes(); + if (FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) + { + params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); + } + + mCamera.setParameters(params); + + /* Now allocate the buffer */ + params = mCamera.getParameters(); + int size = params.getPreviewSize().width * params.getPreviewSize().height; + size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8; + mBuffer = new byte[size]; + /* The buffer where the current frame will be copied */ + mFrame = new byte [size]; + mCamera.addCallbackBuffer(mBuffer); + + /* Notify that the preview is about to be started and deliver preview size */ + onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); + + try { + setPreview(); + } catch (IOException e) { + Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); + } + + /* Now we can start a preview */ + mCamera.startPreview(); } } public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { - Log.i(TAG, "surfaceChanged"); + Log.i(TAG, "called surfaceChanged"); + // stop preview before making changes + try { + mCamera.stopPreview(); + } catch (Exception e){ + // ignore: tried to stop a non-existent preview + } + + // start preview with new settings setupCamera(width, height); } public void surfaceCreated(SurfaceHolder holder) { - Log.i(TAG, "surfaceCreated"); + Log.i(TAG, "called surfaceCreated"); (new Thread(this)).start(); } public void surfaceDestroyed(SurfaceHolder holder) { - Log.i(TAG, "surfaceDestroyed"); - releaseCamera(); + Log.i(TAG, "called surfaceDestroyed"); } - - /* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */ protected abstract Bitmap processFrame(byte[] data); @@ -178,13 +200,15 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde public void run() { mThreadRun = true; - Log.i(TAG, "Starting processing thread"); + Log.i(TAG, "Started processing thread"); while (mThreadRun) { Bitmap bmp = null; synchronized (this) { try { this.wait(); + if (!mThreadRun) + break; bmp = processFrame(mFrame); } catch (InterruptedException e) { e.printStackTrace(); @@ -199,5 +223,6 @@ public abstract class SampleViewBase extends SurfaceView implements SurfaceHolde } } } + Log.i(TAG, "Finished processing thread"); } } \ No newline at end of file From 44da71daf4f845d2b8209ba5c57d430a7bad2ce9 Mon Sep 17 00:00:00 2001 From: kir Date: Fri, 31 Aug 2012 18:38:42 +0400 Subject: [PATCH 069/103] removed duplicated sample (for facedetect) --- samples/cpp/multicascadeclassifier.cpp | 163 ------------------------- 1 file changed, 163 deletions(-) delete mode 100644 samples/cpp/multicascadeclassifier.cpp diff --git a/samples/cpp/multicascadeclassifier.cpp b/samples/cpp/multicascadeclassifier.cpp deleted file mode 100644 index c5a683072..000000000 --- a/samples/cpp/multicascadeclassifier.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// WARNING: this sample is under construction! Use it on your own risk. - -#include "opencv2/objdetect/objdetect.hpp" -#include "opencv2/highgui/highgui.hpp" -#include "opencv2/imgproc/imgproc.hpp" - -#include -#include - -using namespace std; -using namespace cv; - -static void help() -{ - cout << "\nThis program demonstrates the multi cascade recognizer. It is a generalization of facedetect sample.\n\n" - "Usage: ./multicascadeclassifier \n" - " --cascade1= this is the primary trained classifier such as frontal face\n" - " [--cascade2=[this an optional secondary classifier such as profile face or eyes]]\n" - " input video or image\n\n" - "Example: ./multicascadeclassifier --cascade1=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --cascade2=\"../../data/haarcascades/haarcascade_eye.xml\"\n\n" - "Using OpenCV version " << CV_VERSION << endl << endl; -} - -void DetectAndDraw(Mat& img, CascadeClassifier& cascade); - -String cascadeName = "../../data/haarcascades/haarcascade_frontalface_alt.xml"; -String nestedCascadeName = "../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; - -int main( int argc, const char** argv ) -{ - CvCapture* capture = 0; - Mat frame, image; - - if (argc == 0) - { - help(); - return 0; - } - - const String cascadeOpt = "--cascade1="; - size_t cascadeOptLen = cascadeOpt.length(); - string inputName; - for( int i = 1; i < argc; i++ ) - { - cout << "Processing argument #" << i << ": " << argv[i] << endl; - if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 ) - { - cascadeName.assign( argv[i] + cascadeOptLen ); - cout << " from which we have cascadeName= " << cascadeName << endl; - } - else if( argv[i][0] == '-' ) - { - cerr << "WARNING: Unknown option " << argv[i] << endl; - } - else - inputName.assign( argv[i] ); - } - - CascadeClassifier cascade; - if( !cascade.load( cascadeName ) ) - { - cerr << "ERROR: Could not load cascade classifier \"" << cascadeName << "\"" << endl; - help(); - - return -1; - } - - if( inputName.size() ) - { - image = imread( inputName, 1 ); - if( image.empty() ) - { - capture = cvCaptureFromAVI( inputName.c_str() ); - if( !capture ) - cout << "Capture from AVI don't work" << endl; - } - } - else - { - cout << "Please provide input file." << endl; - return -1; - } - - cvNamedWindow( "result", 1 ); - - if( capture ) - { - for(;;) - { - IplImage* iplImg = cvQueryFrame( capture ); - frame = iplImg; - if( frame.empty() ) - break; - - DetectAndDraw( frame, cascade ); - - if( waitKey( 10 ) >= 0 ) - goto _cleanup_; - } - - waitKey(0); -_cleanup_: - cvReleaseCapture( &capture ); - } - else if( !image.empty() ) - { - DetectAndDraw( image, cascade ); - waitKey(0); - } - else - { - cout << "Please provide correct input file." << endl; - } - - cvDestroyWindow("result"); - - return 0; -} - -void DetectAndDraw( Mat& img, CascadeClassifier& cascade) -{ - int i = 0; - double t = 0; - vector faces; - const static Scalar colors[] = { CV_RGB(0,0,255), - CV_RGB(0,128,255), - CV_RGB(0,255,255), - CV_RGB(0,255,0), - CV_RGB(255,128,0), - CV_RGB(255,255,0), - CV_RGB(255,0,0), - CV_RGB(255,0,255)} ; - Mat gray; - Mat frame( cvRound(img.rows), cvRound(img.cols), CV_8UC1 ); - - cvtColor( img, gray, CV_BGR2GRAY ); - resize( gray, frame, frame.size(), 0, 0, INTER_LINEAR ); - equalizeHist( frame, frame ); - - t = (double)cvGetTickCount(); - cascade.detectMultiScale( frame, faces, - 1.1, 2, 0 - //|CV_HAAR_FIND_BIGGEST_OBJECT - //|CV_HAAR_DO_ROUGH_SEARCH - |CV_HAAR_SCALE_IMAGE - , - Size(30, 30) ); - t = (double)cvGetTickCount() - t; - printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - - for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) - { - Point center; - Scalar color = colors[i%8]; - int radius; - center.x = cvRound(r->x + r->width*0.5); - center.y = cvRound(r->y + r->height*0.5); - radius = (int)(cvRound(r->width + r->height)*0.25); - circle( img, center, radius, color, 3, 8, 0 ); - } - - cv::imshow( "result", img ); -} From ce4ac2d74ad917b9d9b92d7a1fc7745368d67f08 Mon Sep 17 00:00:00 2001 From: Vsevolod Glumov Date: Fri, 31 Aug 2012 19:32:07 +0400 Subject: [PATCH 070/103] Cleaned 'old_basic_structures' of undocumented parameters. --- modules/core/doc/old_basic_structures.rst | 151 +++++++++------------- 1 file changed, 63 insertions(+), 88 deletions(-) diff --git a/modules/core/doc/old_basic_structures.rst b/modules/core/doc/old_basic_structures.rst index 17bf4ce1d..3ee7b0f04 100644 --- a/modules/core/doc/old_basic_structures.rst +++ b/modules/core/doc/old_basic_structures.rst @@ -7,19 +7,6 @@ The section describes the main data structures, used by the OpenCV 1.x API, and CvPoint ------- - -.. ocv:struct:: CvPoint - - 2D point with integer coordinates (usually zero-based). - - .. ocv:member:: int x - - x-coordinate - - .. ocv:member:: int y - - y-coordinate - .. ocv:cfunction:: CvPoint cvPoint( int x, int y ) constructs ``CvPoint`` structure. @@ -28,23 +15,21 @@ CvPoint converts ``CvPoint2D32f`` to ``CvPoint``. +.. ocv:struct:: CvPoint + + 2D point with integer coordinates (usually zero-based). + + :param x: x-coordinate of the point. + + :param y: y-coordinate of the point. + + :param point: the point to convert. + .. seealso:: :ocv:class:`Point\_` CvPoint2D32f ------------ -.. ocv:struct:: CvPoint2D32f - - 2D point with floating-point coordinates. - - .. ocv:member:: float x - - x-coordinate - - .. ocv:member:: float y - - y-coordinate - .. ocv:cfunction:: CvPoint2D32f cvPoint2D32f( double x, double y ) constructs ``CvPoint2D32f`` structure. @@ -53,6 +38,16 @@ CvPoint2D32f converts ``CvPoint`` to ``CvPoint2D32f``. +.. ocv:struct:: CvPoint2D32f + + 2D point with floating-point coordinates. + + :param x: floating-point x-coordinate of the point. + + :param y: floating-point y-coordinate of the point. + + :param point: the point to convert. + .. seealso:: :ocv:class:`Point\_` CvPoint3D32f @@ -62,22 +57,16 @@ CvPoint3D32f 3D point with floating-point coordinates - .. ocv:member:: float x - - x-coordinate - - .. ocv:member:: float y - - y-coordinate - - .. ocv:member:: float z - - z-coordinate - .. ocv:cfunction:: CvPoint3D32f cvPoint3D32f( double x, double y, double z ) constructs ``CvPoint3D32f`` structure. + :param x: floating-point x-coordinate of the point. + + :param y: floating-point y-coordinate of the point. + + :param z: floating-point z-coordinate of the point. + .. seealso:: :ocv:class:`Point3\_` CvPoint2D64f @@ -87,18 +76,14 @@ CvPoint2D64f 2D point with double-precision floating-point coordinates. - .. ocv:member:: double x - - x-coordinate - - .. ocv:member:: double y - - y-coordinate - .. ocv:cfunction:: CvPoint2D64f cvPoint2D64f( double x, double y ) constructs ``CvPoint2D64f`` structure. + :param x: double-precision floating-point x-coordinate of the point. + + :param y: double-precision floating-point y-coordinate of the point. + .. seealso:: :ocv:class:`Point\_` CvPoint3D64f @@ -108,20 +93,16 @@ CvPoint3D64f 3D point with double-precision floating-point coordinates. - .. ocv:member:: double x - - x-coordinate - - .. ocv:member:: double y - - y-coordinate - - .. ocv:member:: double z - .. ocv:cfunction:: CvPoint3D64f cvPoint3D64f( double x, double y, double z ) constructs ``CvPoint3D64f`` structure. + :param x: double-precision floating-point x-coordinate of the point. + + :param y: double-precision floating-point y-coordinate of the point. + + :param z: double-precision floating-point z-coordinate of the point. + .. seealso:: :ocv:class:`Point3\_` CvSize @@ -131,18 +112,14 @@ CvSize Size of a rectangle or an image. - .. ocv:member:: int width - - Width of the rectangle - - .. ocv:member:: int height - - Height of the rectangle - .. ocv:cfunction:: CvSize cvSize( int width, int height ) constructs ``CvSize`` structure. + :param width: width of the rectangle. + + :param height: height of the rectangle. + .. seealso:: :ocv:class:`Size\_` CvSize2D32f @@ -152,18 +129,14 @@ CvSize2D32f Sub-pixel accurate size of a rectangle. - .. ocv:member:: float width - - Width of the rectangle - - .. ocv:member:: float height - - Height of the rectangle - .. ocv:cfunction:: CvSize2D32f cvSize2D32f( double width, double height ) constructs ``CvSize2D32f`` structure. + :param width: floating-point width of the rectangle. + + :param height: floating-point height of the rectangle. + .. seealso:: :ocv:class:`Size\_` CvRect @@ -173,26 +146,18 @@ CvRect Stores coordinates of a rectangle. - .. ocv:member:: int x - - x-coordinate of the top-left corner - - .. ocv:member:: int y - - y-coordinate of the top-left corner (sometimes bottom-left corner) - - .. ocv:member:: int width - - Width of the rectangle - - .. ocv:member:: int height - - Height of the rectangle - .. ocv:cfunction:: CvRect cvRect( int x, int y, int width, int height ) constructs ``CvRect`` structure. + :param x: x-coordinate of the top-left corner. + + :param y: y-coordinate of the top-left corner (sometimes bottom-left corner). + + :param width: width of the rectangle. + + :param height: height of the rectangle. + .. seealso:: :ocv:class:`Rect\_` @@ -1666,7 +1631,17 @@ SetIPLAllocators ---------------- Makes OpenCV use IPL functions for allocating IplImage and IplROI structures. -.. ocv:cfunction:: void cvSetIPLAllocators( Cv_iplCreateImageHeader create_header, Cv_iplAllocateImageData allocate_data, Cv_iplDeallocate deallocate, Cv_iplCreateROI create_roi, Cv_iplCloneImage clone_image ) +.. ocv:cfunction:: void cvSetIPLAllocators( Cv_iplCreateImageHeader create_header, Cv_iplAllocateImageData allocate_data, Cv_iplDeallocate deallocate, Cv_iplCreateROI create_roi, Cv_iplCloneImage clone_image ) + + :param create_header: pointer to a function, creating IPL image header. + + :param allocate_data: pointer to a function, allocating IPL image data. + + :param deallocate: pointer to a function, deallocating IPL image. + + :param create_roi: pointer to a function, creating IPL image ROI (i.e. Region of Interest). + + :param clone_image: pointer to a function, cloning an IPL image. Normally, the function is not called directly. Instead, a simple macro ``CV_TURN_ON_IPL_COMPATIBILITY()`` is used that calls ``cvSetIPLAllocators`` and passes there pointers to IPL allocation functions. :: From 3fb3851c7a77ee25f6acc2c9d54bbdd238da8753 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sat, 1 Sep 2012 08:42:07 +0400 Subject: [PATCH 071/103] Remove debug print --- cmake/OpenCVPCHSupport.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/OpenCVPCHSupport.cmake b/cmake/OpenCVPCHSupport.cmake index f65e27ff5..16dbb06a9 100644 --- a/cmake/OpenCVPCHSupport.cmake +++ b/cmake/OpenCVPCHSupport.cmake @@ -113,7 +113,6 @@ MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _output) SET(${out_command} ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input} ) - message("!!!!!!!!!!!!!!!!${${out_command}}!!!!") ELSE(CMAKE_CXX_COMPILER_ARG1) SET(${out_command} ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input} From c9dbb0d31450163d7b5d97b16533fea80ebb6382 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sun, 2 Sep 2012 01:02:50 +0400 Subject: [PATCH 072/103] Several small fixes in Android CMake toolchain * fix formatting * honor Windows-style paths * suppress warnings inside try_compile * correct caching of toolchain variables --- android/android.toolchain.cmake | 104 +++++++++++++++++--------------- 1 file changed, 57 insertions(+), 47 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index 53bb0e54a..abcad7d7a 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -3,7 +3,7 @@ # Requires cmake 2.6.3 or newer (2.8.5 or newer is recommended). # See home page: http://code.google.com/p/android-cmake/ # -# The file is mantained by the OpenCV project. And also can be found at +# The file is mantained by the OpenCV project. The latest version can be get at # http://code.opencv.org/projects/opencv/repository/revisions/master/changes/android/android.toolchain.cmake # # Usage Linux: @@ -29,7 +29,7 @@ # $ cmake.exe -G"MinGW Makefiles" # -DCMAKE_TOOLCHAIN_FILE=path\to\the\android.toolchain.cmake # -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows\bin\make.exe" .. -# $ "%ANDROID_NDK%\prebuilt\windows\bin\make.exe" +# $ cmake.exe --build . # # # Options (can be set as cmake parameters: -D=): @@ -41,7 +41,7 @@ # (ignored if ANDROID_NDK is set). # Can be set as environment variable. Can be set only at first cmake run. # -# ANDROID_ABI=armeabi-v7a - specifies the target Application Binary +# ANDROID_ABI=armeabi-v7a - specifies the target Application Binary # Interface (ABI). This option nearly matches to the APP_ABI variable # used by ndk-build tool from Android NDK. # @@ -58,27 +58,28 @@ # "x86" - matches to the NDK ABI with the same name. # See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation. # "mips" - matches to the NDK ABI with the same name -# (not testes on real devices) +# (It is not tested on real devices by the authos of this toolchain) +# See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation. # # ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for. -# Option is read-only when standalone toolchain used. +# Option is read-only when standalone toolchain is used. # -# ANDROID_FORCE_ARM_BUILD=OFF - set true to generate 32-bit ARM instructions -# instead of Thumb-1. Is not available for "x86" (inapplicable) and -# "armeabi-v6 with VFP" (forced) ABIs. +# ANDROID_FORCE_ARM_BUILD=OFF - set ON to generate 32-bit ARM instructions +# instead of Thumb. Is not available for "x86" (inapplicable) and +# "armeabi-v6 with VFP" (is forced to be ON) ABIs. # -# ANDROID_NO_UNDEFINED=ON - set true to show all undefined symbols as linker +# ANDROID_NO_UNDEFINED=ON - set ON to show all undefined symbols as linker # errors even if they are not used. # -# ANDROID_SO_UNDEFINED=OFF - set true to allow undefined symbols in shared -# libraries. Automatically turned on for NDK r5x and r6x due to GLESv2 +# ANDROID_SO_UNDEFINED=OFF - set ON to allow undefined symbols in shared +# libraries. Automatically turned for NDK r5x and r6x due to GLESv2 # problems. # # LIBRARY_OUTPUT_PATH_ROOT=${CMAKE_SOURCE_DIR} - where to output binary # files. See additional details below. # -# ANDROID_SET_OBSOLETE_VARIABLES=ON - it set, then toolchain defines some -# obsolete variables which were set by previous versions of this file for +# ANDROID_SET_OBSOLETE_VARIABLES=ON - if set, then toolchain defines some +# obsolete variables which were used by previous versions of this file for # backward compatibility. # # @@ -94,15 +95,15 @@ # Make sure to do the following in your scripts: # SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${my_cxx_flags}" ) # SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${my_cxx_flags}" ) -# The flags will be prepopulated with critical flags, so don't loose them. -# Also be aware that toolchain also sets configuration-specific compiler -# flags and linker flags. +# The flags will be prepopulated with critical flags, so don't loose them. +# Also be aware that toolchain also sets configuration-specific compiler +# flags and linker flags. # # ANDROID and BUILD_ANDROID will be set to true, you may test any of these # variables to make necessary Android-specific configuration changes. # -# Also ARMEABI or ARMEABI_V7A or X86 will be set true, mutually exclusive. -# NEON option will be set true if VFP is set to NEON. +# Also ARMEABI or ARMEABI_V7A or X86 or MIPS will be set true, mutually +# exclusive. NEON option will be set true if VFP is set to NEON. # # LIBRARY_OUTPUT_PATH_ROOT should be set in cache to determine where Android # libraries will be installed. @@ -185,7 +186,7 @@ # [+] added mips architecture support # - modified August 2012 # [+] updated for NDK r8b -# [~] all intermediate files generated by toolchain are moved into CMakeFiles +# [~] all intermediate files generated by toolchain are moved to CMakeFiles # [~] libstdc++ and libsupc are removed from explicit link libraries # [+] added CCache support (via NDK_CCACHE environment or cmake variable) # [+] added gold linker support for NDK r8b @@ -199,7 +200,7 @@ if( DEFINED CMAKE_CROSSCOMPILING ) return() endif() -get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE) +get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE ) if( _CMAKE_IN_TRY_COMPILE ) include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL ) endif() @@ -279,15 +280,15 @@ macro( __INIT_VARIABLE var_name ) if( NOT "${__value}" STREQUAL "" ) if( __test_path ) if( EXISTS "${__value}" ) - set( ${var_name} "${__value}" ) - if( __obsolete ) + file( TO_CMAKE_PATH "${__value}" ${var_name} ) + if( __obsolete AND NOT _CMAKE_IN_TRY_COMPILE ) message( WARNING "Using value of obsolete variable ${__var} as initial value for ${var_name}. Please note, that ${__var} can be completely removed in future versions of the toolchain." ) endif() break() endif() else() set( ${var_name} "${__value}" ) - if( __obsolete ) + if( __obsolete AND NOT _CMAKE_IN_TRY_COMPILE ) message( WARNING "Using value of obsolete variable ${__var} as initial value for ${var_name}. Please note, that ${__var} can be completely removed in future versions of the toolchain." ) endif() break() @@ -298,6 +299,8 @@ macro( __INIT_VARIABLE var_name ) unset( __value ) unset( __values ) unset( __obsolete ) + elseif( __test_path ) + file( TO_CMAKE_PATH "${${var_name}}" ${var_name} ) endif() unset( __test_path ) endmacro() @@ -314,19 +317,23 @@ macro( __DETECT_NATIVE_API_LEVEL _var _path ) endmacro() macro( __DETECT_TOOLCHAIN_MACHINE_NAME _var _root ) - file( GLOB __gccExePath "${_root}/bin/*-gcc${TOOL_OS_SUFFIX}" ) - __LIST_FILTER( __gccExePath "bin/[.].*-gcc${TOOL_OS_SUFFIX}$" ) - list( LENGTH __gccExePath __gccExePathsCount ) - if( NOT __gccExePathsCount EQUAL 1 ) - message( WARNING "Could not uniquely determine machine name for compiler from ${_root}." ) - set( ${_var} "" ) + if( EXISTS "${_root}" ) + file( GLOB __gccExePath "${_root}/bin/*-gcc${TOOL_OS_SUFFIX}" ) + __LIST_FILTER( __gccExePath "bin/[.].*-gcc${TOOL_OS_SUFFIX}$" ) + list( LENGTH __gccExePath __gccExePathsCount ) + if( NOT __gccExePathsCount EQUAL 1 AND NOT _CMAKE_IN_TRY_COMPILE ) + message( WARNING "Could not determine machine name for compiler from ${_root}" ) + set( ${_var} "" ) + else() + get_filename_component( __gccExeName "${__gccExePath}" NAME_WE ) + string( REPLACE "-gcc" "" ${_var} "${__gccExeName}" ) + endif() + unset( __gccExePath ) + unset( __gccExePathsCount ) + unset( __gccExeName ) else() - get_filename_component( __gccExeName "${__gccExePath}" NAME_WE ) - string( REPLACE "-gcc" "" ${_var} "${__gccExeName}" ) + set( ${_var} "" ) endif() - unset( __gccExePath ) - unset( __gccExePathsCount ) - unset( __gccExeName ) endmacro() macro( __COPY_IF_DIFFERENT _source _destination ) @@ -403,7 +410,6 @@ if( NOT ANDROID_NDK ) endif( ANDROID_NDK ) endif( NOT ANDROID_STANDALONE_TOOLCHAIN ) endif( NOT ANDROID_NDK ) - # remember found paths if( ANDROID_NDK ) get_filename_component( ANDROID_NDK "${ANDROID_NDK}" ABSOLUTE ) @@ -412,12 +418,13 @@ if( ANDROID_NDK ) string( LENGTH "${ANDROID_NDK}" __length ) string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidNdkPreviousPath ) if( NOT __androidNdkPreviousPath STREQUAL ANDROID_NDK ) - message( FATAL_ERROR "It is not possible to change path to the NDK on subsequent run." ) + message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all files from your build folder first. + " ) endif() unset( __androidNdkPreviousPath ) unset( __length ) endif() - set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" ) + set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE ) set( BUILD_WITH_ANDROID_NDK True ) elseif( ANDROID_STANDALONE_TOOLCHAIN ) get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE ) @@ -431,7 +438,7 @@ elseif( ANDROID_STANDALONE_TOOLCHAIN ) unset( __androidStandaloneToolchainPreviousPath ) unset( __length ) endif() - set( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" CACHE INTERNAL "Path of the Android standalone toolchain" ) + set( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" CACHE INTERNAL "Path of the Android standalone toolchain" FORCE ) set( BUILD_WITH_STANDALONE_TOOLCHAIN True ) else() list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH) @@ -585,7 +592,7 @@ if( CMAKE_BINARY_DIR AND EXISTS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMa file( APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" "SET(CMAKE_SYSTEM_PROCESSOR \"${CMAKE_SYSTEM_PROCESSOR}\")\n" ) endif() -set( ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_FULLNAME}} CACHE INTERNAL "ANDROID_ABI can be changed only to one of these ABIs. Changing to any other ABI requires to reset cmake cache." ) +set( ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_FULLNAME}} CACHE INTERNAL "ANDROID_ABI can be changed only to one of these ABIs. Changing to any other ABI requires to reset cmake cache." FORCE ) if( CMAKE_VERSION VERSION_GREATER "2.8" ) list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_FULLNAME} ) set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_FULLNAME}} ) @@ -636,8 +643,8 @@ endif() list( GET __availableToolchains ${__toolchainIdx} ANDROID_TOOLCHAIN_NAME ) list( GET __availableToolchainMachines ${__toolchainIdx} ANDROID_TOOLCHAIN_MACHINE_NAME ) list( GET __availableToolchainCompilerVersions ${__toolchainIdx} ANDROID_COMPILER_VERSION ) -set( ANDROID_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" CACHE INTERNAL "Name of toolchain used" ) -set( ANDROID_COMPILER_VERSION "${ANDROID_COMPILER_VERSION}" CACHE INTERNAL "compiler version from selected toolchain" ) +set( ANDROID_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" CACHE INTERNAL "Name of toolchain used" FORCE ) +set( ANDROID_COMPILER_VERSION "${ANDROID_COMPILER_VERSION}" CACHE INTERNAL "compiler version from selected toolchain" FORCE ) unset( __toolchainIdx ) unset( __availableToolchains ) unset( __availableToolchainMachines ) @@ -769,8 +776,10 @@ endif() # flags and definitions if(ANDROID_SYSROOT MATCHES "[ ;\"]") set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" ) - # quotes will break try_compile and compiler identification - message(WARNING "Your Android system root has non-alphanumeric symbols. It can break compiler features detection and the whole build.") + if( NOT _CMAKE_IN_TRY_COMPILE ) + # quotes will break try_compile and compiler identification + message(WARNING "Your Android system root has non-alphanumeric symbols. It can break compiler features detection and the whole build.") + endif() else() set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" ) endif() @@ -981,8 +990,8 @@ include_directories( SYSTEM ${ANDROID_SYSTEM_INCLUDE_DIRS} ) link_directories( ${ANDROID_SYSTEM_LIB_DIRS} ) # finish flags -set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Extra Android compiler flags") -set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Extra Android linker flags") +set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Extra Android compiler flags" ) +set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Extra Android linker flags" ) set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" ) set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" ) if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK MATCHES "-r8$" ) @@ -1129,16 +1138,17 @@ endif() # NEON : TRUE if NEON unit is enabled # VFPV3 : TRUE if VFP version 3 is enabled # X86 : TRUE if configured for x86 +# MIPS : TRUE if configured for mips # BUILD_ANDROID : always TRUE # BUILD_WITH_ANDROID_NDK : TRUE if NDK is used # BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used # ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform -# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a" or "x86" depending on ANDROID_ABI +# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86" or "mips" depending on ANDROID_ABI # ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI -# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform # ANDROID_SYSROOT : path to the compiler sysroot # ANDROID_SYSTEM_INCLUDE_DIRS # ANDROID_SYSTEM_LIB_DIRS +# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform # Obsolete: # ARMEABI_NDK_NAME : superseded by ANDROID_NDK_ABI_NAME # From 21a536f999e553122f6566739bfdbd6d6b536b51 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sun, 2 Sep 2012 01:11:41 +0400 Subject: [PATCH 073/103] Add NDK release detection into CMake toolchain --- android/android.toolchain.cmake | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index abcad7d7a..96772e9e8 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -191,6 +191,8 @@ # [+] added CCache support (via NDK_CCACHE environment or cmake variable) # [+] added gold linker support for NDK r8b # [~] fixed mips linker flags for NDK r8b +# - modified September 2012 +# [+] added NDK release name detection (see ANDROID_NDK_RELEASE) # ------------------------------------------------------------------------------ cmake_minimum_required( VERSION 2.6.3 ) @@ -426,6 +428,7 @@ if( ANDROID_NDK ) endif() set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE ) set( BUILD_WITH_ANDROID_NDK True ) + file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE LIMIT_COUNT 1 REGEX r[0-9]+[a-z]? ) elseif( ANDROID_STANDALONE_TOOLCHAIN ) get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE ) # try to detect change @@ -939,8 +942,9 @@ if( ANDROID_NO_UNDEFINED ) set( ANDROID_LINKER_FLAGS "-Wl,--no-undefined ${ANDROID_LINKER_FLAGS}" ) endif() -if (ANDROID_NDK MATCHES "-r[56].?$") - # libGLESv2.so in NDK's prior to r7 refers to exteranal symbols. So this flag option is required for all projects using OpenGL from native. +if (ANDROID_NDK_RELEASE STRLESS "r7") + # libGLESv2.so in NDK's prior to r7 refers to missing exteranal symbols. + # So this flag option is required for all projects using OpenGL from native. __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON ) else() __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES OFF ) @@ -994,7 +998,7 @@ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Extra Androi set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Extra Android linker flags" ) set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" ) set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" ) -if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK MATCHES "-r8$" ) +if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" ) set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" ) set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.xsc ${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" ) set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/mipself.x ${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" ) @@ -1144,6 +1148,7 @@ endif() # BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used # ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform # ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86" or "mips" depending on ANDROID_ABI +# ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b; set only for NDK # ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI # ANDROID_SYSROOT : path to the compiler sysroot # ANDROID_SYSTEM_INCLUDE_DIRS From 867777f82531a51eba4a3b9f926d53e4471ab7f6 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sat, 25 Aug 2012 00:31:49 +0400 Subject: [PATCH 074/103] Added OpenEXR library v1.7.1 --- 3rdparty/ilmimf/README | 123 - 3rdparty/openexr/AUTHORS.ilmbase | 21 + 3rdparty/openexr/AUTHORS.openexr | 41 + 3rdparty/openexr/CMakeLists.txt | 62 + 3rdparty/openexr/ChangeLog.ilmbase | 109 + 3rdparty/openexr/ChangeLog.openexr | 666 + 3rdparty/openexr/Half/eLut.cpp | 114 + 3rdparty/openexr/Half/eLut.h | 71 + 3rdparty/openexr/Half/half.cpp | 311 + 3rdparty/openexr/Half/half.h | 766 + 3rdparty/openexr/Half/halfFunction.h | 178 + 3rdparty/openexr/Half/halfLimits.h | 102 + 3rdparty/openexr/Half/toFloat.cpp | 164 + 3rdparty/openexr/Half/toFloat.h | 16391 +++++++++++++++ 3rdparty/openexr/Iex/Iex.h | 60 + 3rdparty/openexr/Iex/IexBaseExc.cpp | 129 + 3rdparty/openexr/Iex/IexBaseExc.h | 266 + 3rdparty/openexr/Iex/IexErrnoExc.h | 210 + 3rdparty/openexr/Iex/IexMacros.h | 148 + 3rdparty/openexr/Iex/IexMathExc.h | 58 + 3rdparty/openexr/Iex/IexThrowErrnoExc.cpp | 859 + 3rdparty/openexr/Iex/IexThrowErrnoExc.h | 96 + 3rdparty/openexr/IlmBaseConfig.h.cmakein | 30 + 3rdparty/openexr/IlmImf/ImfAcesFile.cpp | 631 + 3rdparty/openexr/IlmImf/ImfAcesFile.h | 322 + 3rdparty/openexr/IlmImf/ImfArray.h | 261 + 3rdparty/openexr/IlmImf/ImfAttribute.cpp | 156 + 3rdparty/openexr/IlmImf/ImfAttribute.h | 427 + 3rdparty/openexr/IlmImf/ImfAutoArray.h | 93 + 3rdparty/openexr/IlmImf/ImfB44Compressor.cpp | 1069 + 3rdparty/openexr/IlmImf/ImfB44Compressor.h | 117 + 3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp | 110 + 3rdparty/openexr/IlmImf/ImfBoxAttribute.h | 73 + 3rdparty/openexr/IlmImf/ImfCRgbaFile.cpp | 1434 ++ 3rdparty/openexr/IlmImf/ImfCRgbaFile.h | 467 + 3rdparty/openexr/IlmImf/ImfChannelList.cpp | 321 + 3rdparty/openexr/IlmImf/ImfChannelList.h | 433 + .../IlmImf/ImfChannelListAttribute.cpp | 145 + .../openexr/IlmImf/ImfChannelListAttribute.h | 67 + .../openexr/IlmImf/ImfCheckedArithmetic.h | 161 + 3rdparty/openexr/IlmImf/ImfChromaticities.cpp | 135 + 3rdparty/openexr/IlmImf/ImfChromaticities.h | 120 + .../IlmImf/ImfChromaticitiesAttribute.cpp | 86 + .../IlmImf/ImfChromaticitiesAttribute.h | 72 + 3rdparty/openexr/IlmImf/ImfCompression.h | 75 + .../IlmImf/ImfCompressionAttribute.cpp | 76 + .../openexr/IlmImf/ImfCompressionAttribute.h | 66 + 3rdparty/openexr/IlmImf/ImfCompressor.cpp | 192 + 3rdparty/openexr/IlmImf/ImfCompressor.h | 252 + 3rdparty/openexr/IlmImf/ImfConvert.cpp | 139 + 3rdparty/openexr/IlmImf/ImfConvert.h | 104 + .../openexr/IlmImf/ImfDoubleAttribute.cpp | 57 + 3rdparty/openexr/IlmImf/ImfDoubleAttribute.h | 63 + 3rdparty/openexr/IlmImf/ImfEnvmap.cpp | 328 + 3rdparty/openexr/IlmImf/ImfEnvmap.h | 322 + .../openexr/IlmImf/ImfEnvmapAttribute.cpp | 75 + 3rdparty/openexr/IlmImf/ImfEnvmapAttribute.h | 65 + 3rdparty/openexr/IlmImf/ImfFloatAttribute.cpp | 57 + 3rdparty/openexr/IlmImf/ImfFloatAttribute.h | 63 + 3rdparty/openexr/IlmImf/ImfFrameBuffer.cpp | 226 + 3rdparty/openexr/IlmImf/ImfFrameBuffer.h | 383 + .../openexr/IlmImf/ImfFramesPerSecond.cpp | 75 + 3rdparty/openexr/IlmImf/ImfFramesPerSecond.h | 88 + 3rdparty/openexr/IlmImf/ImfHeader.cpp | 1106 ++ 3rdparty/openexr/IlmImf/ImfHeader.h | 627 + 3rdparty/openexr/IlmImf/ImfHuf.cpp | 1086 + 3rdparty/openexr/IlmImf/ImfHuf.h | 79 + 3rdparty/openexr/IlmImf/ImfIO.cpp | 109 + 3rdparty/openexr/IlmImf/ImfIO.h | 252 + 3rdparty/openexr/IlmImf/ImfInputFile.cpp | 648 + 3rdparty/openexr/IlmImf/ImfInputFile.h | 209 + 3rdparty/openexr/IlmImf/ImfInt64.h | 52 + 3rdparty/openexr/IlmImf/ImfIntAttribute.cpp | 57 + 3rdparty/openexr/IlmImf/ImfIntAttribute.h | 63 + 3rdparty/openexr/IlmImf/ImfKeyCode.cpp | 216 + 3rdparty/openexr/IlmImf/ImfKeyCode.h | 161 + .../openexr/IlmImf/ImfKeyCodeAttribute.cpp | 98 + 3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.h | 72 + 3rdparty/openexr/IlmImf/ImfLineOrder.h | 64 + .../openexr/IlmImf/ImfLineOrderAttribute.cpp | 77 + .../openexr/IlmImf/ImfLineOrderAttribute.h | 66 + 3rdparty/openexr/IlmImf/ImfLut.cpp | 176 + 3rdparty/openexr/IlmImf/ImfLut.h | 185 + .../openexr/IlmImf/ImfMatrixAttribute.cpp | 260 + 3rdparty/openexr/IlmImf/ImfMatrixAttribute.h | 87 + 3rdparty/openexr/IlmImf/ImfMisc.cpp | 787 + 3rdparty/openexr/IlmImf/ImfMisc.h | 255 + 3rdparty/openexr/IlmImf/ImfMultiView.cpp | 396 + 3rdparty/openexr/IlmImf/ImfMultiView.h | 164 + 3rdparty/openexr/IlmImf/ImfName.h | 146 + .../openexr/IlmImf/ImfOpaqueAttribute.cpp | 125 + 3rdparty/openexr/IlmImf/ImfOpaqueAttribute.h | 114 + 3rdparty/openexr/IlmImf/ImfOutputFile.cpp | 1287 ++ 3rdparty/openexr/IlmImf/ImfOutputFile.h | 241 + 3rdparty/openexr/IlmImf/ImfPixelType.h | 61 + 3rdparty/openexr/IlmImf/ImfPizCompressor.cpp | 666 + 3rdparty/openexr/IlmImf/ImfPizCompressor.h | 115 + 3rdparty/openexr/IlmImf/ImfPreviewImage.cpp | 103 + 3rdparty/openexr/IlmImf/ImfPreviewImage.h | 131 + .../IlmImf/ImfPreviewImageAttribute.cpp | 102 + .../openexr/IlmImf/ImfPreviewImageAttribute.h | 71 + .../openexr/IlmImf/ImfPxr24Compressor.cpp | 550 + 3rdparty/openexr/IlmImf/ImfPxr24Compressor.h | 108 + 3rdparty/openexr/IlmImf/ImfRational.cpp | 125 + 3rdparty/openexr/IlmImf/ImfRational.h | 93 + .../openexr/IlmImf/ImfRationalAttribute.cpp | 73 + .../openexr/IlmImf/ImfRationalAttribute.h | 70 + 3rdparty/openexr/IlmImf/ImfRgba.h | 104 + 3rdparty/openexr/IlmImf/ImfRgbaFile.cpp | 1404 ++ 3rdparty/openexr/IlmImf/ImfRgbaFile.h | 344 + 3rdparty/openexr/IlmImf/ImfRgbaYca.cpp | 495 + 3rdparty/openexr/IlmImf/ImfRgbaYca.h | 248 + 3rdparty/openexr/IlmImf/ImfRleCompressor.cpp | 331 + 3rdparty/openexr/IlmImf/ImfRleCompressor.h | 79 + .../openexr/IlmImf/ImfScanLineInputFile.cpp | 1021 + .../openexr/IlmImf/ImfScanLineInputFile.h | 172 + .../openexr/IlmImf/ImfStandardAttributes.cpp | 118 + .../openexr/IlmImf/ImfStandardAttributes.h | 343 + 3rdparty/openexr/IlmImf/ImfStdIO.cpp | 240 + 3rdparty/openexr/IlmImf/ImfStdIO.h | 156 + .../openexr/IlmImf/ImfStringAttribute.cpp | 79 + 3rdparty/openexr/IlmImf/ImfStringAttribute.h | 66 + .../IlmImf/ImfStringVectorAttribute.cpp | 94 + .../openexr/IlmImf/ImfStringVectorAttribute.h | 66 + 3rdparty/openexr/IlmImf/ImfTestFile.cpp | 135 + 3rdparty/openexr/IlmImf/ImfTestFile.h | 63 + 3rdparty/openexr/IlmImf/ImfThreading.cpp | 60 + 3rdparty/openexr/IlmImf/ImfThreading.h | 92 + 3rdparty/openexr/IlmImf/ImfTileDescription.h | 102 + .../IlmImf/ImfTileDescriptionAttribute.cpp | 85 + .../IlmImf/ImfTileDescriptionAttribute.h | 73 + 3rdparty/openexr/IlmImf/ImfTileOffsets.cpp | 385 + 3rdparty/openexr/IlmImf/ImfTileOffsets.h | 107 + 3rdparty/openexr/IlmImf/ImfTiledInputFile.cpp | 1302 ++ 3rdparty/openexr/IlmImf/ImfTiledInputFile.h | 381 + 3rdparty/openexr/IlmImf/ImfTiledMisc.cpp | 301 + 3rdparty/openexr/IlmImf/ImfTiledMisc.h | 75 + .../openexr/IlmImf/ImfTiledOutputFile.cpp | 1692 ++ 3rdparty/openexr/IlmImf/ImfTiledOutputFile.h | 475 + 3rdparty/openexr/IlmImf/ImfTiledRgbaFile.cpp | 1162 ++ 3rdparty/openexr/IlmImf/ImfTiledRgbaFile.h | 479 + 3rdparty/openexr/IlmImf/ImfTimeCode.cpp | 415 + 3rdparty/openexr/IlmImf/ImfTimeCode.h | 226 + .../openexr/IlmImf/ImfTimeCodeAttribute.cpp | 78 + .../openexr/IlmImf/ImfTimeCodeAttribute.h | 72 + 3rdparty/openexr/IlmImf/ImfVecAttribute.cpp | 216 + 3rdparty/openexr/IlmImf/ImfVecAttribute.h | 101 + 3rdparty/openexr/IlmImf/ImfVersion.cpp | 59 + 3rdparty/openexr/IlmImf/ImfVersion.h | 120 + 3rdparty/openexr/IlmImf/ImfWav.cpp | 390 + 3rdparty/openexr/IlmImf/ImfWav.h | 70 + 3rdparty/openexr/IlmImf/ImfXdr.h | 916 + 3rdparty/openexr/IlmImf/ImfZipCompressor.cpp | 240 + 3rdparty/openexr/IlmImf/ImfZipCompressor.h | 83 + 3rdparty/openexr/IlmImf/b44ExpLogTable.cpp | 136 + 3rdparty/openexr/IlmImf/b44ExpLogTable.h | 16396 ++++++++++++++++ 3rdparty/openexr/IlmThread/IlmThread.cpp | 80 + 3rdparty/openexr/IlmThread/IlmThread.h | 151 + 3rdparty/openexr/IlmThread/IlmThreadMutex.cpp | 59 + 3rdparty/openexr/IlmThread/IlmThreadMutex.h | 158 + .../openexr/IlmThread/IlmThreadMutexPosix.cpp | 85 + .../openexr/IlmThread/IlmThreadMutexWin32.cpp | 73 + 3rdparty/openexr/IlmThread/IlmThreadPool.cpp | 456 + 3rdparty/openexr/IlmThread/IlmThreadPool.h | 156 + 3rdparty/openexr/IlmThread/IlmThreadPosix.cpp | 98 + .../openexr/IlmThread/IlmThreadSemaphore.cpp | 60 + .../openexr/IlmThread/IlmThreadSemaphore.h | 110 + .../IlmThread/IlmThreadSemaphorePosix.cpp | 103 + .../IlmThreadSemaphorePosixCompat.cpp | 155 + .../IlmThread/IlmThreadSemaphoreWin32.cpp | 146 + 3rdparty/openexr/IlmThread/IlmThreadWin32.cpp | 95 + 3rdparty/openexr/Imath/ImathBox.cpp | 37 + 3rdparty/openexr/Imath/ImathBox.h | 850 + 3rdparty/openexr/Imath/ImathBoxAlgo.h | 1015 + 3rdparty/openexr/Imath/ImathColor.h | 734 + 3rdparty/openexr/Imath/ImathColorAlgo.cpp | 178 + 3rdparty/openexr/Imath/ImathColorAlgo.h | 256 + 3rdparty/openexr/Imath/ImathEuler.h | 924 + 3rdparty/openexr/Imath/ImathExc.h | 73 + 3rdparty/openexr/Imath/ImathFrame.h | 190 + 3rdparty/openexr/Imath/ImathFrustum.h | 739 + 3rdparty/openexr/Imath/ImathFrustumTest.h | 410 + 3rdparty/openexr/Imath/ImathFun.cpp | 181 + 3rdparty/openexr/Imath/ImathFun.h | 267 + 3rdparty/openexr/Imath/ImathGL.h | 159 + 3rdparty/openexr/Imath/ImathGLU.h | 54 + 3rdparty/openexr/Imath/ImathHalfLimits.h | 66 + 3rdparty/openexr/Imath/ImathInt64.h | 61 + 3rdparty/openexr/Imath/ImathInterval.h | 224 + 3rdparty/openexr/Imath/ImathLimits.h | 267 + 3rdparty/openexr/Imath/ImathLine.h | 184 + 3rdparty/openexr/Imath/ImathLineAlgo.h | 287 + 3rdparty/openexr/Imath/ImathMath.h | 208 + 3rdparty/openexr/Imath/ImathMatrix.h | 3442 ++++ 3rdparty/openexr/Imath/ImathMatrixAlgo.cpp | 1251 ++ 3rdparty/openexr/Imath/ImathMatrixAlgo.h | 1435 ++ 3rdparty/openexr/Imath/ImathPlane.h | 256 + 3rdparty/openexr/Imath/ImathPlatform.h | 112 + 3rdparty/openexr/Imath/ImathQuat.h | 963 + 3rdparty/openexr/Imath/ImathRandom.cpp | 195 + 3rdparty/openexr/Imath/ImathRandom.h | 398 + 3rdparty/openexr/Imath/ImathRoots.h | 219 + 3rdparty/openexr/Imath/ImathShear.cpp | 54 + 3rdparty/openexr/Imath/ImathShear.h | 659 + 3rdparty/openexr/Imath/ImathSphere.h | 177 + 3rdparty/openexr/Imath/ImathVec.cpp | 540 + 3rdparty/openexr/Imath/ImathVec.h | 2226 +++ 3rdparty/openexr/Imath/ImathVecAlgo.h | 146 + 3rdparty/{ilmimf => openexr}/LICENSE | 2 +- 3rdparty/openexr/OpenEXRConfig.h.cmakein | 36 + CMakeLists.txt | 18 +- cmake/OpenCVFindLibsGrfmt.cmake | 14 +- modules/highgui/CMakeLists.txt | 4 +- 213 files changed, 95123 insertions(+), 134 deletions(-) delete mode 100644 3rdparty/ilmimf/README create mode 100644 3rdparty/openexr/AUTHORS.ilmbase create mode 100644 3rdparty/openexr/AUTHORS.openexr create mode 100644 3rdparty/openexr/CMakeLists.txt create mode 100644 3rdparty/openexr/ChangeLog.ilmbase create mode 100644 3rdparty/openexr/ChangeLog.openexr create mode 100644 3rdparty/openexr/Half/eLut.cpp create mode 100644 3rdparty/openexr/Half/eLut.h create mode 100644 3rdparty/openexr/Half/half.cpp create mode 100644 3rdparty/openexr/Half/half.h create mode 100644 3rdparty/openexr/Half/halfFunction.h create mode 100644 3rdparty/openexr/Half/halfLimits.h create mode 100644 3rdparty/openexr/Half/toFloat.cpp create mode 100644 3rdparty/openexr/Half/toFloat.h create mode 100644 3rdparty/openexr/Iex/Iex.h create mode 100644 3rdparty/openexr/Iex/IexBaseExc.cpp create mode 100644 3rdparty/openexr/Iex/IexBaseExc.h create mode 100644 3rdparty/openexr/Iex/IexErrnoExc.h create mode 100644 3rdparty/openexr/Iex/IexMacros.h create mode 100644 3rdparty/openexr/Iex/IexMathExc.h create mode 100644 3rdparty/openexr/Iex/IexThrowErrnoExc.cpp create mode 100644 3rdparty/openexr/Iex/IexThrowErrnoExc.h create mode 100644 3rdparty/openexr/IlmBaseConfig.h.cmakein create mode 100644 3rdparty/openexr/IlmImf/ImfAcesFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfAcesFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfArray.h create mode 100644 3rdparty/openexr/IlmImf/ImfAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfAutoArray.h create mode 100644 3rdparty/openexr/IlmImf/ImfB44Compressor.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfB44Compressor.h create mode 100644 3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfBoxAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfCRgbaFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfCRgbaFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfChannelList.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfChannelList.h create mode 100644 3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfChannelListAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfCheckedArithmetic.h create mode 100644 3rdparty/openexr/IlmImf/ImfChromaticities.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfChromaticities.h create mode 100644 3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfCompression.h create mode 100644 3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfCompressionAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfCompressor.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfCompressor.h create mode 100644 3rdparty/openexr/IlmImf/ImfConvert.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfConvert.h create mode 100644 3rdparty/openexr/IlmImf/ImfDoubleAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfDoubleAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfEnvmap.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfEnvmap.h create mode 100644 3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfEnvmapAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfFloatAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfFloatAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfFrameBuffer.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfFrameBuffer.h create mode 100644 3rdparty/openexr/IlmImf/ImfFramesPerSecond.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfFramesPerSecond.h create mode 100644 3rdparty/openexr/IlmImf/ImfHeader.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfHeader.h create mode 100644 3rdparty/openexr/IlmImf/ImfHuf.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfHuf.h create mode 100644 3rdparty/openexr/IlmImf/ImfIO.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfIO.h create mode 100644 3rdparty/openexr/IlmImf/ImfInputFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfInputFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfInt64.h create mode 100644 3rdparty/openexr/IlmImf/ImfIntAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfIntAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfKeyCode.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfKeyCode.h create mode 100644 3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfLineOrder.h create mode 100644 3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfLineOrderAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfLut.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfLut.h create mode 100644 3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfMatrixAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfMisc.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfMisc.h create mode 100644 3rdparty/openexr/IlmImf/ImfMultiView.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfMultiView.h create mode 100644 3rdparty/openexr/IlmImf/ImfName.h create mode 100644 3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfOpaqueAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfOutputFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfOutputFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfPixelType.h create mode 100644 3rdparty/openexr/IlmImf/ImfPizCompressor.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfPizCompressor.h create mode 100644 3rdparty/openexr/IlmImf/ImfPreviewImage.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfPreviewImage.h create mode 100644 3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfPxr24Compressor.h create mode 100644 3rdparty/openexr/IlmImf/ImfRational.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfRational.h create mode 100644 3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfRationalAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfRgba.h create mode 100644 3rdparty/openexr/IlmImf/ImfRgbaFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfRgbaFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfRgbaYca.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfRgbaYca.h create mode 100644 3rdparty/openexr/IlmImf/ImfRleCompressor.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfRleCompressor.h create mode 100644 3rdparty/openexr/IlmImf/ImfScanLineInputFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfScanLineInputFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfStandardAttributes.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfStandardAttributes.h create mode 100644 3rdparty/openexr/IlmImf/ImfStdIO.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfStdIO.h create mode 100644 3rdparty/openexr/IlmImf/ImfStringAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfStringAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfStringVectorAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfTestFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTestFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfThreading.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfThreading.h create mode 100644 3rdparty/openexr/IlmImf/ImfTileDescription.h create mode 100644 3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfTileOffsets.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTileOffsets.h create mode 100644 3rdparty/openexr/IlmImf/ImfTiledInputFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTiledInputFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfTiledMisc.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTiledMisc.h create mode 100644 3rdparty/openexr/IlmImf/ImfTiledOutputFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTiledOutputFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfTiledRgbaFile.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTiledRgbaFile.h create mode 100644 3rdparty/openexr/IlmImf/ImfTimeCode.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTimeCode.h create mode 100644 3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfVecAttribute.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfVecAttribute.h create mode 100644 3rdparty/openexr/IlmImf/ImfVersion.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfVersion.h create mode 100644 3rdparty/openexr/IlmImf/ImfWav.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfWav.h create mode 100644 3rdparty/openexr/IlmImf/ImfXdr.h create mode 100644 3rdparty/openexr/IlmImf/ImfZipCompressor.cpp create mode 100644 3rdparty/openexr/IlmImf/ImfZipCompressor.h create mode 100644 3rdparty/openexr/IlmImf/b44ExpLogTable.cpp create mode 100644 3rdparty/openexr/IlmImf/b44ExpLogTable.h create mode 100644 3rdparty/openexr/IlmThread/IlmThread.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThread.h create mode 100644 3rdparty/openexr/IlmThread/IlmThreadMutex.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadMutex.h create mode 100644 3rdparty/openexr/IlmThread/IlmThreadMutexPosix.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadMutexWin32.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadPool.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadPool.h create mode 100644 3rdparty/openexr/IlmThread/IlmThreadPosix.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadSemaphore.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadSemaphore.h create mode 100644 3rdparty/openexr/IlmThread/IlmThreadSemaphorePosix.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadSemaphorePosixCompat.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadSemaphoreWin32.cpp create mode 100644 3rdparty/openexr/IlmThread/IlmThreadWin32.cpp create mode 100644 3rdparty/openexr/Imath/ImathBox.cpp create mode 100644 3rdparty/openexr/Imath/ImathBox.h create mode 100644 3rdparty/openexr/Imath/ImathBoxAlgo.h create mode 100644 3rdparty/openexr/Imath/ImathColor.h create mode 100644 3rdparty/openexr/Imath/ImathColorAlgo.cpp create mode 100644 3rdparty/openexr/Imath/ImathColorAlgo.h create mode 100644 3rdparty/openexr/Imath/ImathEuler.h create mode 100644 3rdparty/openexr/Imath/ImathExc.h create mode 100644 3rdparty/openexr/Imath/ImathFrame.h create mode 100644 3rdparty/openexr/Imath/ImathFrustum.h create mode 100644 3rdparty/openexr/Imath/ImathFrustumTest.h create mode 100644 3rdparty/openexr/Imath/ImathFun.cpp create mode 100644 3rdparty/openexr/Imath/ImathFun.h create mode 100644 3rdparty/openexr/Imath/ImathGL.h create mode 100644 3rdparty/openexr/Imath/ImathGLU.h create mode 100644 3rdparty/openexr/Imath/ImathHalfLimits.h create mode 100644 3rdparty/openexr/Imath/ImathInt64.h create mode 100644 3rdparty/openexr/Imath/ImathInterval.h create mode 100644 3rdparty/openexr/Imath/ImathLimits.h create mode 100644 3rdparty/openexr/Imath/ImathLine.h create mode 100644 3rdparty/openexr/Imath/ImathLineAlgo.h create mode 100644 3rdparty/openexr/Imath/ImathMath.h create mode 100644 3rdparty/openexr/Imath/ImathMatrix.h create mode 100644 3rdparty/openexr/Imath/ImathMatrixAlgo.cpp create mode 100644 3rdparty/openexr/Imath/ImathMatrixAlgo.h create mode 100644 3rdparty/openexr/Imath/ImathPlane.h create mode 100644 3rdparty/openexr/Imath/ImathPlatform.h create mode 100644 3rdparty/openexr/Imath/ImathQuat.h create mode 100644 3rdparty/openexr/Imath/ImathRandom.cpp create mode 100644 3rdparty/openexr/Imath/ImathRandom.h create mode 100644 3rdparty/openexr/Imath/ImathRoots.h create mode 100644 3rdparty/openexr/Imath/ImathShear.cpp create mode 100644 3rdparty/openexr/Imath/ImathShear.h create mode 100644 3rdparty/openexr/Imath/ImathSphere.h create mode 100644 3rdparty/openexr/Imath/ImathVec.cpp create mode 100644 3rdparty/openexr/Imath/ImathVec.h create mode 100644 3rdparty/openexr/Imath/ImathVecAlgo.h rename 3rdparty/{ilmimf => openexr}/LICENSE (96%) create mode 100644 3rdparty/openexr/OpenEXRConfig.h.cmakein diff --git a/3rdparty/ilmimf/README b/3rdparty/ilmimf/README deleted file mode 100644 index 20494d3a0..000000000 --- a/3rdparty/ilmimf/README +++ /dev/null @@ -1,123 +0,0 @@ -ABOUT THE OPENEXR LIBRARIES ----------------------------- - -Half is a class that encapsulates our 16-bit floating-point format. - -IlmThread is a thread abstraction library for use with IlmImf. It -currently supports pthreads and Windows threads. - -IlmImf is our "EXR" file format for storing 16-bit FP images. - -Imath is a math library. IlmImf only uses a subset of it, -but we're releasing the full library because it's easier for us to -maintain, and we think it'll be useful to others. - -Iex is an exception-handling library. - -See the IlmImfExamples directory for some code that demonstrates how -to use the IlmImf library to read and write OpenEXR files. The doc -directory contains some high-level documentation and history about the -OpenEXR format. - -If you have questions about using the OpenEXR libraries, you may want -to join our developer mailing list. See http://www.openexr.com for -details. - - -LICENSE -------- - -The OpenEXR source code distribution is free software. See the file -named COPYING (included in this distribution) for details. - - -WHAT'S INCLUDED ---------------- - -Besides the core OpenEXR libraries, the release includes several -utilities for reading, writing, viewing, and manipulating OpenEXR -images. These include: - - * exrdisplay, an image viewer. - * exrheader, a utility for dumping header information. - * exrstdattr, a utility for modifying OpenEXR standard attributes. - * exrmaketiled, for generating tiled and rip/mipmapped images. - * exrenvmap, for creating OpenEXR environment maps. - * exrmakepreview, for creating preview images for OpenEXR files. - -exrdisplay requires FLTK 1.1 or greater and OpenGL. exrdisplay -supports fragment shaders if you have the Nvidia Cg SDK and a graphics -card capable of running fp30 profile fragment shaders. See -exrdisplay/README for details. - -We have also released an OpenEXR display driver for Renderman, a file -I/O plugin for Shake, and a file I/O plugin for Adobe Photoshop (on -both Windows and MacOS). These are packaged separately. Go to -http://www.openexr.com to download them. NOTE: the most recent -versions of these applications now have native support for OpenEXR, so -you should only use our open-source versions of the plugins if you -have an older version of the application. - - -BUILDING OPENEXR ----------------- - -Building OpenEXR requires the zlib library. If you want to build the -'exrdisplay' image viewer, you'll also need FLTK 1.1, but this program -is not required to use OpenEXR's libraries in your application. -exrdisplay can also accelerate the display of OpenEXR images if you -have the NVIDIA Cg SDK. - -Your OS distribution may already include these libraries, or supply -packages for them. That is the preferred way to obtain them for use -with OpenEXR. If not, you can obtain the source code for zlib and -FLTK from: - - http://www.zlib.net - http://www.fltk.org - -and you can download the NVIDIA Cg SDK from -http://developer.nvidia.com. - -If you're building OpenEXR on a Windows platform, see README.win32 for -instructions on how to build OpenEXR. The remainder of this file -applies only to GNU/Linux or other UNIX-like systems. - -After installing the required libraries, to build OpenEXR on -GNU/Linux or other UNIX-like systems, do this: - -./configure -make -make install - -unless you obtained OpenEXR directly from CVS, in which case you -should first read README.CVS. - -If you have the Nvidia Cg SDK and you want to build support for -fragment shaders into exrdisplay, specify the path to the SDK using -the "--with-cg-prefix" flag. There are some additional compile-time -configuration options available; type `./configure --help` for more -information. - -See README.OSX for details on building OpenEXR in MacOS X. - -Do `make check` to run the OpenEXR confidence tests. They should all -pass; if you find a test that does not pass on your system, please let -us know. - -Other UNIX variants haven't been tested, but should be easy to build. -Let us know if you're having problems porting OpenEXR to a particular -platform. - -All include files needed to use the OpenEXR libraries are installed in the -OpenEXR subdirectory of the install prefix, e.g. /usr/local/include/OpenEXR. - - -USING OPENEXR IN YOUR APPLICATIONS ----------------------------------- - -On systems with support for pkg-config, use `pkg-config --cflags -OpenEXR` for the C++ flags required to compile against OpenEXR -headers; and `pkg-config --libs OpenEXR` for the linker flags required -to link against OpenEXR libraries. - diff --git a/3rdparty/openexr/AUTHORS.ilmbase b/3rdparty/openexr/AUTHORS.ilmbase new file mode 100644 index 000000000..51c1f9cea --- /dev/null +++ b/3rdparty/openexr/AUTHORS.ilmbase @@ -0,0 +1,21 @@ +Developers: +----------- + +Florian Kainz +Rod Bogart +Drew Hess +Bill Anderson +Wojciech Jarosz + +Contributors: +------------- + +Rito Trevino +Josh Pines +Christian Rouet + +Win32 build system: +------------------- + +Nick Porcino +Kimball Thurston diff --git a/3rdparty/openexr/AUTHORS.openexr b/3rdparty/openexr/AUTHORS.openexr new file mode 100644 index 000000000..2926b13e8 --- /dev/null +++ b/3rdparty/openexr/AUTHORS.openexr @@ -0,0 +1,41 @@ +Developers: +----------- + +Florian Kainz +Rod Bogart +Drew Hess +Paul Schneider +Bill Anderson +Wojciech Jarosz +Andrew Kunz + +Contributors: +------------- + +Simon Green +Rito Trevino +Josh Pines +Christian Rouet +Rodrigo Damazio +Greg Ward +Joseph Goldstone +Loren Carpenter, Pixar Animation Studios + +Win32 build system: +------------------- + +Nick Porcino +Kimball Thurston + +Win32 port contributors: +------------------------ + +Dustin Graves +Jukka Liimatta +Baumann Konstantin +Daniel Koch +E. Scott Larsen +stephan mantler +Andreas Kahler +Frank Jargstorff +Lutz Latta diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt new file mode 100644 index 000000000..3b811e2ee --- /dev/null +++ b/3rdparty/openexr/CMakeLists.txt @@ -0,0 +1,62 @@ +# ---------------------------------------------------------------------------- +# CMake file for openexr +# +# ---------------------------------------------------------------------------- + +project(openexr CXX) + +if(UNIX) + set(HAVE_PTHREAD 1) + include(CheckIncludeFile) + check_include_file(semaphore.h HAVE_POSIX_SEMAPHORES) +endif() + +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/IlmBaseConfig.h.cmakein" + "${CMAKE_CURRENT_BINARY_DIR}/IlmBaseConfig.h" @ONLY) +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenEXRConfig.h.cmakein" + "${CMAKE_CURRENT_BINARY_DIR}/OpenEXRConfig.h" @ONLY) + +set(OPENEXR_INCLUDE_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/Half" + "${CMAKE_CURRENT_SOURCE_DIR}/Iex" + "${CMAKE_CURRENT_SOURCE_DIR}/IlmThread" + "${CMAKE_CURRENT_SOURCE_DIR}/Imath" + "${CMAKE_CURRENT_SOURCE_DIR}/IlmImf") + +ocv_include_directories("${CMAKE_CURRENT_BINARY_DIR}" ${ZLIB_INCLUDE_DIR} ${OPENEXR_INCLUDE_PATHS}) + +file(GLOB lib_srcs Half/half.cpp Iex/*.cpp IlmThread/*.cpp Imath/*.cpp IlmImf/*.cpp) +file(GLOB lib_hdrs Half/*.h Iex/Iex*.h IlmThread/IlmThread*.h Imath/Imath*.h IlmImf/*.h) +list(APPEND lib_hdrs "${CMAKE_CURRENT_BINARY_DIR}/IlmBaseConfig.h" "${CMAKE_CURRENT_BINARY_DIR}/OpenEXRConfig.h") + +if(WIN32) + ocv_list_filterout(lib_srcs Posix.*cpp) +else() + ocv_list_filterout(lib_srcs Win32.cpp) +endif() + +source_group("Include" FILES ${lib_hdrs} ) +source_group("Src" FILES ${lib_srcs}) + +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Wunused -Wsign-compare -Wundef -Wmissing-declarations -Wuninitialized -Wswitch + /wd4018 /wd4099 /wd4100 /wd4101 /wd4127 /wd4189 /wd4244 /wd4245 /wd4267 /wd4305 /wd4334 /wd4389 /wd4512 /wd4701 /wd4702 /wd4706 /wd4800) + +add_library(IlmImf STATIC ${lib_hdrs} ${lib_srcs}) +target_link_libraries(IlmImf ${ZLIB_LIBRARIES}) + +set_target_properties(IlmImf + PROPERTIES + OUTPUT_NAME "IlmImf" + DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" + ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH} + ) + +if(ENABLE_SOLUTION_FOLDERS) + set_target_properties(IlmImf PROPERTIES FOLDER "3rdparty") +endif() + +if(NOT BUILD_SHARED_LIBS) + install(TARGETS IlmImf ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT main) +endif() + +set(OPENEXR_INCLUDE_PATHS ${OPENEXR_INCLUDE_PATHS} PARENT_SCOPE) +set(OPENEXR_VERSION "1.7.1" PARENT_SCOPE) diff --git a/3rdparty/openexr/ChangeLog.ilmbase b/3rdparty/openexr/ChangeLog.ilmbase new file mode 100644 index 000000000..2e409d2de --- /dev/null +++ b/3rdparty/openexr/ChangeLog.ilmbase @@ -0,0 +1,109 @@ +Version 1.0.3 + * Added support for enabling/disabling large stack optimisations, used in + halfFunction.h. + (Piotr Stanczyk) + * Added ImathNoise.(h/cpp) files. Initializes Perlin noise to match the + Renderman implmenetation. + (Pixar Contribution) + * Fixed a number of missing includes to comply with stricter + enforcement by gnu compilers. + (Piotr Stanczyk) + * Depracated compiler flag: -Wno-long-double since it is no longer + supported under OS X. + (Piotr Stanczyk) + * A minor API change to Imath::Frustum has been made: the functions + 'near' and 'far' have been renamed to 'nearPlane' and 'farPlane' due + to conflicts with certain windows headers. The former alternate + accessor names for these values on windows ('hither' and 'yon') + remain, though should be considered deprecated. + (David Lenihan) + * Added SVD, eigenvalue solver, and procrustes fit calculations + to ImathMatrixAlgo. + (Chris Twigg, Ji Hun Yu) + * Added Imath::FrustumTest for frustum visibility testing. + (Eric Johnston) + * Fixed a stack corruption in the matrix minorOf functions. + (Nick Rasmussen) + * Visual studio 2008 project files have been added to the vc/vc9 + directory, and several minor visual studio compile fixes have + been applied. + (Nick Rasmussen) + * Updated the so verison to 7. + (Piotr Stanczyk) + * Depracated the MacCode_Warrior and Shake submodules. + (Piotr Stanczyk) + +Version 1.0.2 + * Added support for targetting builds on 64bit Windows and minimising + number of compiler warnings on Windows. Thanks to Ger Hobbelt for his + contributions to CreateDLL. + (Ji Hun Yu) + * Removed a spurious restrict qualifier in the matrix manipulation code + that was causing the 64-bit MS compiler to generate code in release + mode that caused incorrect results. + (Ji Hun Yu) + * Added patches for improving universal binaries on OS X. Thanks to + Paul Schneider for the contribution + (Piotr Stanczyk) + * Imath::Box optimization: remove loops from methods by partially + specializing the class, for boxes of two and three dimensions. + (Piotr Stanczyk) + * Added explicit copy constructors to Imath::Matrix33 and + ImathMatrix44 to make conversions between float and double + matrices more convenient. + (Florian Kainz) + * Added slerpShortestArc() and euclideanInnerProduct() functions + to Imath::Quat. + (Nick Porcino) + * Added 4D vector class template Imath::Vec4. + (Nick Porcino) + * Copy constructors and assignment operators for Matrix33 + and Matrix44 are up to 25% faster. Added matrix constructors + that do not initialize the matrix (this is faster in cases where + the initial value of the matrix is immediately overwritten anyway). + (Nick Porcino) + * Rewrote function closestPointOnBox(point,box). Shortened + the code, improved numerical accuracy, fixed a bug where + closestPointOnBox(box.center(),box) would return the center + of the +Z side of the box, even if the +/-X or +/-Y sides + were closer. + (Florian Kainz) + * Rewrote function findEntryAndExitPoints() in ImathBoxAlgo.h. + Results are now consistent with those from intersect(), also + in ImathBoxAlgo.h. + (Florian Kainz) + * Made Vec2::length() and Vec3::length() more accurate for + vectors whose length is less than sqrt(limits::smallest()); + (Florian Kainz) + * Made Quat::angle() more accurate for small angles. + (Don Hatch) + +Version 1.0.1: + * Removed Windows .suo files from distribution. + (Eric Wimmer) + +Version 1.0.0: + * Bumped DSO version number to 6.0 + (Florian Kainz) + * Rounding during float-to-half conversion now implements + "round to nearest even" mode: if the original float value + is exactly in the middle between the two closest half values + then rounding chooses the half value whose least significant + bit is zero. + (Florian Kainz) + * Installation Tuning: + - Corrected version number on dso's (libtool) - now 5.0 + - Separated ILMBASE_LDFLAGS and ILMBASE_LIBS so that test programs + in configure scripts of packages dependent on IlmBase can link + with static libraries properly + - eliminated some warning messages during install + (Andrew Kunz) + +Version 0.9.0: + * Initial release of this code as a separate library. + Previously the libraries contained were part of + version 1.4.0 of OpenEXR + * New build scripts for Linux/Unix + (Andrew Kunz) + * New Windows project files and build scripts + (Kimball Thurston) diff --git a/3rdparty/openexr/ChangeLog.openexr b/3rdparty/openexr/ChangeLog.openexr new file mode 100644 index 000000000..58212f41b --- /dev/null +++ b/3rdparty/openexr/ChangeLog.openexr @@ -0,0 +1,666 @@ +Version 1.7.1: + * Updated the .so verison to 7. + (Piotr Stanczyk) + +Version 1.7.0: + * Added support for targetting builds on 64bit Windows and minimising + number of compiler warnings on Windows. Thanks to Ger Hobbelt for his + contributions to CreateDLL. + (Ji Hun Yu) + * Added new atttribute types: + M33dAttribute 3x3 double-precision matrix + M44dAttribute 4x4 double-precision matrix + V2d 2D double-precision vector + V3d 3D double-precision vector + (Florian Kainz) + * Bug fix: crash when reading a damaged image file (found + by Apple). An exception thrown inside the PIZ Huffman + decoder bypasses initialization of an array of pointers. + The uninitialized pointers are later passed to operator + delete. + (Florian Kainz) + * Bug fix: crash when reading a damaged image file (found by + Apple). Computing the size of input certain buffers may + overflow and wrap around to a small number, later causing + writes beyond the end of the buffer. + (Florian Kainz) + * In the "Technical Introduction" document, added + Premultiplied vs. Un-Premulitiplied Color section: + states explicitly that pixels with zero alpha and non-zero + RGB are allowed, points out that preserving such a pixel can + be a problem in application programs with un-premultiplied + internal image representations. + (Florian Kainz) + * exrenvmap improvements: + - New command line flags set the type of the input image to + latitude-longitude map or cube-face map, overriding the + envmap attribute in the input file header. + - Cube-face maps can now be assembled from or split into six + square sub-images. + - Converting a cube-face map into a new cube-face map with + the same face size copies the image instead of resampling + it. This avoids blurring when a cube-face map is assembled + from or split into sub-images. + (Florian Kainz) + * Updated standard chromaticities in ImfAcesFile.cpp to match + final ACES (Academy Color Encoding Specification) document. + (Florian Kainz) + * Added worldToCamera and worldToNDC matrices to + ImfStandardAttributes.h (Florian Kainz) + * Increased the maximum length of attribute and channel names + from 31 to 255 characters. For files that do contain names + longer than 31 characters, a new LONG_NAMES_FLAG in the fil + version number is set. This flag causes older versions of + the IlmImf library (1.6.1 and earlier) to reject files with + long names. Without the flag, older library versions would + mis-interpret files with long names as broken. + (Florian Kainz) + * Reading luminance/chroma-encoded files via the RGBA + interface is faster: buffer padding avoids cache thrashing + for certain image sizes, redundant calls to saturation() + have been eliminated. + (Mike Wall) + * Added "hemispherical blur" option to exrenvmap. + (Florian Kainz) + * Added experimental version of I/O classes for ACES file + format (restricted OpenEXR format with special primaries + and white point); added exr2aces file converter. + (Florian Kainz) + * Added new constructors to classes Imf::RgbaInputFile and + Imf::TiledRgbaInputFile. The new constructors have a + layerName parameter, which allows the caller to specify + which layer of a multi-layer or multi-view image will + be read. + (Florian Kainz) + * A number of member functions in classes Imf::Header, + Imf::ChannelList and Imf::FrameBuffer have parameters + of type "const char *". Added equivalent functions that + take "const std::string &" parameters. + (Florian Kainz) + * Added library support for Weta Digital multi-view images: + StringVector attribute type, multiView standard attribute + of type StringVector, utility functions related to grouping + channels into separate views. + (Peter Hillman, Florian Kainz) + +Version 1.6.1: + * Removed Windows .suo files from distribution. + (Eric Wimmer) + * Bug fix: crashes, memory leaks and file descriptor leaks + when reading damaged image files (some reported by Apple, + others found by running IlmImfFuzzTest). + (Florian Kainz) + * Added new IlmImfFuzzTest program to test how resilient the + IlmImf library is with respect broken input files: the program + first damages OpenEXR files by partially overwriting them with + random data; then it tries to read the damaged files. If all + goes well, the program doesn't crash. + (Florian Kainz) + +Version 1.6.0: + * Bumped DSO version number to 6.0 + (Florian Kainz) + * Added new standard attributes related to color rendering with + CTL (Color Transformation Language): renderingTransform, + lookModTransform and adoptedNeutral. + (Florian Kainz) + * Bug fix: for pixels with luminance near HALF_MIN, conversion + from RGB to luminance/chroma produces NaNs and infinities + (Florian Kainz) + * Bug fix: excessive desaturation of small details with certain + colors after repeatedly loading and saving luminance/chroma + encoded images with B44 compression. + (Florian Kainz) + * Added B44A compression, a minor variation of B44: in most cases, + the compression ratio is 2.28:1, the same as with B44, but in + uniform image areas where all pixels have the same value, the + compression ratio increases to 10.66:1. Uniform areas occur, for + example, in an image's alpha channel, which typically contains + large patches that are solid black or white, or in computer- + generated images with a black background. + (Florian Kainz) + * Added flag to configure.ac to enable or disable use of large + auto arrays in the IlmImf library. Default is "enable" for + Linux, "disable" for everything else. + (Darby Johnston, Florian Kainz) + * corrected version number on dso's (libtool) - now 5.0 + * Separated ILMBASE_LDFLAGS and ILMBASE_LIBS so that test programs + can link with static libraries properly + * eliminated some warning messages during install + (Andrew Kunz) + +Version 1.5.0: + * reorganized packaging of OpenEXR libraries to facilitate + integration with CTL. Now this library depends on the library + IlmBase. Some functionality has been moved into OpenEXR_Viewers, + which depends on two other libraries, CTL and OpenEXR_CTL. + Note: previously there were separate releases of + OpenEXR-related plugins for Renderman, Shake and Photoshop. + OpenEXR is supported natively by Rendermand and Photoshop, so + these plugins will not be supported for this or future + versions of OpenEXR. + (Andrew Kunz) + * New build scripts for Linux/Unix + (Andrew Kunz) + * New Windows project files and build scripts + (Kimball Thurston) + * float-to-half conversion now preserves the sign of float zeroes + and of floats that are so small that they become half zeroes. + (Florian Kainz) + * Bug fix: Imath::Frustum::planes() returns incorrect planes + if the frustum is orthogonal. + (Philip Hubbard) + * added new framesPerSecond optional standard attribute + (Florian Kainz) + * Imath cleanup: + - Rewrote function Imath::Quat::setRotation() to make it + numerically more accurate, added confidence tests + - Rewrote function Imath::Quat::slerp() using Don Hatch's + method, which is numerically more accurate, added confidence + tests. + - Rewrote functions Imath::closestPoints(), Imath::intersect(), + added confidence tests. + - Removed broken function Imath::nearestPointOnTriangle(). + - Rewrote Imath::drand48(), Imath::lrand48(), etc. to make + them functionally identical with the Unix/Linux versions + of drand48(), lrand48() and friends. + - Replaced redundant definitions of Int64 in Imath and IlmImf + with a single definition in ImathInt64.h. + (Florian Kainz) + * exrdisplay: if the file's and the display's RGB chromaticities + differ, the pixels RGB values are transformed from the file's + to the display's RGB space. + (Florian Kainz) + * Added new lossy B44 compression method. HALF channels are + compressed with a fixed ratio of 2.28:1. UINT and FLOAT + channels are stored verbatim, without compression. + (Florian Kainz) + +Version 1.4.0a: + * Fixed the ReleaseDLL targets for Visual Studio 2003. + (Barnaby Robson) + +Version 1.4.0: + * Production release. + * Bug Fix: calling setFrameBuffer() for every scan line + while reading a tiled file through the scan line API + returns bad pixel data. (Paul Schneider, Florian Kainz) + +Version 1.3.1: + * Fixed the ReleaseDLL targets for Visual Studio 2005. + (Nick Porcino, Drew Hess) + * Fixes/enhancements for createDLL. + (Nick Porcino) + +Version 1.3.0: + * Removed openexr.spec file, it's out of date and broken to + boot. + (Drew Hess) + * Support for Visual Studio 2005. + (Drew Hess, Nick Porcino) + * When compiling against OpenEXR headers on Windows, you + no longer need to define any HAVE_* or PLATFORM_* + macros in your projects. If you are using any OpenEXR + DLLs, however, you must define OPENEXR_DLL in your + project's preprocessor directives. + (Drew Hess) + * Many fixes to the Windows VC7 build system. + (Drew Hess, Nick Porcino) + * Support for building universal binaries on OS X 10.4. + (Drew Hess, Paul Schneider) + * Minor configure.ac fix to accomodate OS X's automake. + (Drew Hess) + * Removed CPU-specific optimizations from configure.ac, + autoconf's guess at the CPU type isn't very useful, + anyway. Closes #13429. + (Drew Hess) + * Fixed quoting for tests in configure.ac. Closes #13428. + (Drew Hess) + * Use host specification instead of target in configure.ac. + Closes #13427. + (Drew Hess) + * Fix use of AC_ARG_ENABLE in configure.ac. Closes + #13426. + (Drew Hess) + * Removed workaround for OS X istream::read bug. + (Drew Hess) + * Added pthread support to OpenEXR pkg-config file. + (Drew Hess) + * Added -no-undefined to LDFLAGS and required libs to LIBADD + for library projects with other library dependencies, per + Rex Dieter's patch. + (Drew Hess) + * HAVE_* macros are now defined in the OpenEXRConfig.h header + file instead of via compiler flags. There are a handful of + public headers which rely on the value of these macros, + and projects including these headers have previously needed + to define the same macros and values as used by OpenEXR's + 'configure', which is bad form. Now 'configure' writes these + values to the OpenEXRConfig.h header file, which is included + by any OpenEXR source files that need these macros. This + method of specifying HAVE_* macros guarantees that projects + will get the proper settings without needing to add compile- + time flags to accomodate OpenEXR. Note that this isn't + implemented properly for Windows yet. + (Drew Hess) + * Platform cleanups: + - No more support for IRIX or OSF1. + - No more explicit support for SunOS, because we have no way to + verify that it's working. I suspect that newish versions of + SunOS will just work out of the box, but let me know if not. + - No more PLATFORM_* macros (vestiges of the ILM internal build + system). PLATFORM_DARWIN_PPC is replaced by HAVE_DARWIN. + PLATFORM_REDHAT_IA32 (which was only used in IlmImfTest) is + replaced by HAVE_LINUX_PROCFS. + - OS X 10.4, which is the minimum version we're going to support + with this version, appears to have support for nrand48 and friends, + so no need to use the Imath-supplied version of them anymore. + (Drew Hess) + * No more PLATFORM_WINDOWS or PLATFORM_WIN32, replace with + proper standard Windows macros. (Drew Hess) + * Remove support for gcc 2.95, no longer supported. (Drew Hess) + * Eliminate HAVE_IOS_BASE macro, OpenEXR now requires support for + ios_base. (Drew Hess) + * Eliminate HAVE_STL_LIMITS macro, OpenEXR now requires the ISO C++ + header. (Drew Hess) + * Use double quote-style include dirctives for OpenEXR + includes. (Drew Hess) + * Added a document that gives an overview of the on-disk + layout of OpenEXR files (Florian Kainz) + * Added sections on layers and on memory-mapped file input + to the documentation. (Florian Kainz) + * Bug fix: reading an incomplete file causes a deadlock while + waiting on a semaphore. (Florian Kainz) + * Updated documentation (ReadingAndWritingImageFiles.sxw) and + sample code (IlmImfExamples): + Added a section about multi-threading, updated section on + thread-safety, changed documentation and sample code to use + readTiles()/writeTiles() instead of readTile()/writeTile() + where possible, mentioned that environment maps contain + redundant pixels, updated section on testing if a file is + an OpenEXR file. + (Florian Kainz) + * Multi-threading bug fixes (exceptions could be thrown + multiple times, some operations were not thread safe), + updated some comments, added comments, more multithreaded + testing. + (Florian Kainz) + * Added multi-threading support: multiple threads + cooperate to read or write a single OpenEXR file. + (Wojciech Jarosz) + * Added operator== and operator!= to Imath::Frustum. + (Andre Mazzone) + * Bug fix: Reading a PIZ-compressed file with an invalid + Huffman code table caused crashes by indexing off the + end of an array. + (Florian Kainz) + +Version 1.2.2: + * Updated README to remove option for building with Visual C++ 6.0. + (Drew Hess) + * Some older versions of gcc don't support a full iomanip + implemenation; check for this during configuration. + (Drew Hess) + * Install PDF versions of documentation, remove old/out-of-date + HTML documentation. (Florian Kainz) + * Removed vc/vc6 directory; Visual C++ 6.0 is no longer + supported. (Drew Hess) + * Updated README.win32 with details of new build system. + (Florian Kainz, Drew Hess) + * New build system for Windows / Visual C++ 7 builds both + static libraries and DLLs. + (Nick Porcino) + * Removed Imath::TMatrix and related classes, which are not + used anywhere in OpenEXR. + (Florian Kainz) + * Added minimal support for "image layers" to class Imf::ChannelList + (Florian Kainz) + * Added new isComplete() method to InputFile, TiledInputFile + etc., that checks if a file is complete or if any pixels + are missing (for example, because writing the file was + aborted prematurely). + (Florian Kainz) + * Exposed staticInitialize() function in ImfHeader.h in order + to allow thread-safe library initialization in multithreaded + programs. + (Florian Kainz) + * Added a new "time code" attribute + (Florian Kainz) + * exrmaketiled: when a MIPMAP_LEVELS or RIPMAP_LEVELS image + is produced, low-pass filtering takes samples outside the + image's data window. This requires extrapolating the image. + The user can now specify how the image is extrapolated + horizontally and vertically (image is surrounded by black / + outermost row of pixels repeats / entire image repeats / + entire image repeats, every other copy is a mirror image). + exrdisplay: added option to swap the top and botton half, + and the left and right half of an image, so that the image's + four corners end up in the center. This is useful for checking + the seams of wrap-around texture map images. + IlmImf library: Added new "wrapmodes" standard attribute + to indicate the extrapolation mode for MIPMAP_LEVELS and + RIPMAP_LEVELS images. + (Florian Kainz) + * Added a new "key code" attribute to identify motion picture + film frames. + (Florian Kainz) + * Removed #include from ImfAttribute.h, ImfHeader.h + and ImfXdr.h so that including header files such as + ImfInputFile.h no longer defines ASSERT and THROW macros, + which may conflict with similar macros defined by + application programs. + (Florian Kainz) + * Converted HTML documentation to OpenOffice format to + make maintaining the documents easier: + api.html -> ReadingAndWritingImageFiles.sxw + details.html -> TechnicalIntroduction.sxw + (Florian Kainz) + +Version 1.2.1: + * exrenvmap and exrmaketiled use slightly less memory + (Florian Kainz) + * Added functions to IlmImf for quickly testing if a file + is an OpenEXR file, and whether the file is scan-line + based or tiled. (Florian Kainz) + * Added preview image examples to IlmImfExamples. Added + description of preview images and environment maps to + docs/api.html (Florian Kainz) + * Bug fix: PXR24 compression did not work properly for channels + with ySampling != 1. + (Florian Kainz) + * Made template become template for + the transform(ObjectS, ObjectT) methods. This was done to allow + for differing templated objects to be passed in e.g. say a + Box> and a Matrix44, where S=float and T=double. + (Jeff Yost, Arkell Rasiah) + * New method Matrix44::setTheMatrix(). Used for assigning a + M44f to a M44d. (Jeff Yost, Arkell Rasiah) + * Added convenience Color typedefs for half versions of Color3 + and Color4. Note the Makefile.am for both Imath and ImathTest + have been updated with -I and/or -L pathing to Half. + (Max Chen, Arkell Rasiah) + * Methods equalWithAbsError() and equalWithRelError() are now + declared as const. (Colette Mullenhoff, Arkell Rasiah) + * Fixes for gcc34. Mainly typename/template/using/this syntax + correctness changes. (Nick Ramussen, Arkell Rasiah) + * Added Custom low-level file I/O examples to IlmImfExamples + and to the docs/api.html document. (Florian Kainz) + * Eliminated most warnings messages when OpenEXR is compiled + with Visual C++. The OpenEXR code uses lots of (intentional + and unintended) implicit type conversions. By default, Visual + C++ warns about almost all of them. Most implicit conversions + have been removed from the .h files, so that including them + should not generate warnings even at warning level 3. Most + .cpp files are now compiled with warning level 1. + (Florian Kainz) + +Version 1.2.0: + * Production-ready release. + * Disable long double warnings on OS X. (Drew Hess) + * Add new source files to VC7 IlmImfDll target. (Drew Hess) + * Iex: change the way that APPEND_EXC and REPLACE_EXC modify + their what() string to work around an issue with Visual C++ + 7.1. (Florian Kainz, Nick Porcino) + * Bumped OpenEXR version to 1.2 and .so versions to 2.0.0 in + preparation for the release. (Drew Hess) + * Imath: fixed ImathTMatrix.h to work with gcc 3.4. (Drew Hess) + * Another quoting fix in openexr.m4. (Drew Hess) + * Quoting fix in acinclude.m4 for automake 1.8. (Brad Hards) + * Imath: put inline at beginning of declaration in ImathMatrix.h + to fix a warning. (Ken McGaugh) + * Imath: made Vec equalWith*Error () methods const. + * Cleaned up compile-time Win32 support. (Florian Kainz) + * Bug fix: Reading a particular broken PIZ-compressed file + caused crashes by indexing off the end of an array. + (Florian Kainz) + +Version 1.1.1: + * Half: operator= and variants now return by reference rather + than by value. This brings half into conformance with + built-in types. (Drew Hess) + * Half: remove copy constructor, let compiler supply its + own. This improves performance up to 25% on some + expressions using half. (Drew Hess) + * configure: don't try to be fancy with CXXFLAGS, just use + what the user supplies or let configure choose a sensible + default if CXXFLAGS is not defined. + * IlmImf: fixed a bug in reading scanline files on big-endian + architectures. (Drew Hess) + * exrmaketiled: Added an option to select compression type. + (Florian Kainz) + * exrenvmap: Added an option to select compression type. + (Florian Kainz) + * exrdisplay: Added some new command-line options. (Florian Kainz) + * IlmImf: Added Pixar's new "slightly lossy" image compression + method. The new method, named PXR24, preserves HALF and + UINT data without loss, but FLOAT pixels are converted to + a 24-bit representation. PXR24 appears to compress + FLOAT depth buffers very well without losing much accuracy. + (Loren Carpenter, Florian Kainz) + * Changed top-level LICENSE file to allow for other copyright + holders for individual files. + * IlmImf: TILED FILE FORMAT CHANGE. TiledOutputFile was + incorrectly interleaving channels and scanlines before + passing pixel data to a compressor. The lossless compressors + still work, but lossy compressors do not. Fix the bug by + interleaving channels and scanlines in tiled files in the + same way as ScanLineOutputFile does. Programs compiled with + the new version of IlmImf cannot read tiled images produced + with version 1.1.0. (Florian Kainz) + * IlmImf: ImfXdr.h fix for 64-bit architectures. (Florian Kainz) + * IlmImf: OpenEXR now supports YCA (luminance/chroma/alpha) + images with subsampled chroma channels. When an image + is written with the RGBA convenience interface, selecting + WRITE_YCA instead of WRITE_RGBA causes the library to + convert the pixels to YCA format. If WRITE_Y is selected, + only luminance is stored in the file (for black and white + images). When an image file is read with the RGBA convenience + interface, YCA data are automatically converted back to RGBA. + (Florian Kainz) + * IlmImf: speed up reading tiled files as scan lines. + (Florian Kainz) + * Half: Fixed subtle bug in Half where signaling float NaNs + were being converted to inf in half. (Florian Kainz) + * gcc 3.3 compiler warning cleanups. (various) + * Imath: ImathEuler.h fixes for gcc 3.4. (Garrick Meeker) + +Version 1.1.0: + * Added new targets to Visual C++ .NET 2003 project + for exrmaketiled, exrenvmap, exrmakepreview, and exrstdattr. + (Drew Hess) + * A few assorted Win32 fixes for Imath. (Drew Hess) + * GNU autoconf builds now produce versioned libraries. + This release is 1:0:0. (Drew Hess) + * Fixes for Visual C++ .NET 2003. (Paul Schneider) + * Updated Visual C++ zlib project file to zlib 1.2.1. + (Drew Hess) + * exrdisplay: Fixed fragment shader version. (Drew Hess) + * *Test: Fixed some compiler issues. (Drew Hess) + * Imath: Handle "restrict" keyword properly. (Drew Hess) + * IlmImfExamples: Updated to latest versions of example + source code, includes tiling and multi-res images. + (Florian Kainz) + * exrmakepreview: A new utility to create preview images. + (Florian Kainz) + * exrenvmap: A new utility to create OpenEXR environment + maps. (Florian Kainz) + * exrstdattr: A new utility to modify standard + attributes. (Florian Kainz) + * Updated exrheader to print level rounding mode and + preview image size. (Florian Kainz) + * Updated exrmaketiled to use level rounding mode. + (Florian Kainz) + * IlmImf: Changed the orientation of lat-long envmaps to + match typical panoramic camera setups. (Florian Kainz) + * IlmImf: Fixed a bug where partially-completed files with + DECREASING_Y could not be read. (Florian Kainz) + * IlmImf: Added support for selectable rounding mode (up/down) + when generating multiresolution files. (Florian Kainz) + * exrdisplay: Support for tiled images, mip/ripmaps, preview + images, and display windows. (Florian Kainz, Drew Hess) + * exrmaketiled: A new utility which generates tiled + versions of OpenEXR images. (Florian Kainz) + * IlmImf: Changed Imf::VERSION to Imf::EXR_VERSION to + work around problems with autoconf VERSION macro + conflict. (Drew Hess) + * exrheader: Support for tiles, mipmaps, environment + maps. (Florian Kainz) + * IlmImf: Environment map support. (Florian Kainz) + * IlmImf: Abstracted stream I/O support. (Florian Kainz) + * IlmImf: Support for tiled and mip/ripmapped files; + requires new file format. (Wojciech Jarosz, Florian Kainz) + * Imath: TMatrix*, generic 2D matricies and algorithms. + (Francesco Callari) + * Imath: major quaternions cleanup. (Cary Phillips) + * Imath: added GLBegin, GLPushAttrib, GLPushMatrix objects + for automatic cleanup on exceptions. (Cary Phillips) + * Imath: removed implicit scalar->vector promotions and vector + comparisons. (Nick Rasmussen) + +Version 1.0.7: + * Fixed a typo in one of the IlmImfTest tests. (Paul Schneider) + * Fixed a bug in exrdisplay that causes the image to display + as all black if there's a NaN or infinity in an OpenEXR + image. (Florian Kainz) + * Updated exrheader per recent changes to IlmImf library. + (Florian Kainz) + * Changed an errant float to a T in ImathFrame.h nextFrame(). + (Cary Phillips) + * Support for new "optional standard" attributes + (chromaticities, luminance, comments, etc.). + (Florian Kainz, Greg Ward, Joseph Goldstone) + * Fixed a buffer overrun in ImfOpaqueAttribute. (Paul Schneider) + * Added new function, isImfMagic (). (Florian Kainz) + +Version 1.0.6: + * Added README.win32 to disted files. + * Fixed OpenEXR.pc.in pkg-config file, OpenEXR now works + with pkg-config. + * Random fixes to readme files for new release. + * Fixed openexr.m4, now looks in /usr by default. + * Added Visual Studio .NET 2003 "solution." + * Fixes for Visual Studio .NET 2003 w/ Microsoft C++ compiler. + (Various) + * Random Imath fixes and enhancements. Note that + extractSHRT now takes an additional optional + argument, see ImathMatrixAlgo.h for details. (Various) + * Added Wojciech Jarosz to AUTHORS file. + * Added test cases for uncompressed case, preview images, + frame buffer type conversion. (Wojciech Jarosz, + Florian Kainz) + * Fix a bug in IlmImf where uncompressed data doesn't get + read/written correctly. (Wojciech Jarosz) + * Added support for preview images and preview image + attributes (thumbnail images) in IlmImf. (Florian Kainz) + * Added support for automatic frame buffer type conversion + in IlmImf. (Florian Kainz) + * Cleaned up some compile-time checks. + * Added HalfTest unit tests. + * [exrdisplay] Download half framebuffer to texture memory + instead of converting to float first. Requires latest + Nvidia drivers. + +Version 1.0.5: + * Fixed IlmImf.dll to use static runtime libs (Andreas). + * Added exrheader project to Visual Studio 6.0 workspace. + * Added some example code showing how to use the IlmImf library. + (Florian) + * Use DLL runtime libs for Win32 libraries rather than static + runtime libs. + * Add an exrdisplay_fragshader project to the Visual Studio 6.0 + workspace to enable fragment shaders in Win32. + * Add an IlmImfDll project to the Visual Studio 6.0 workspace. + * In Win32, export the ImfCRgbaFile C interface via a DLL so + that Visual C++ 6.0 users can link against an Intel-compiled + IlmImf. (Andreas Kahler) + * Use auto_ptr in ImfAutoArray on Win32, it doesn't like large + automatic stacks. + * Performance improvements in PIZ decoding, between + 20 and 60% speedup on Athlon and Pentium 4 systems. + (Florian) + * Updated the README with various information, made + some cosmetic changes for readability. + * Added fragment shader support to exrdisplay. + * Bumped the version to 1.0.5 in prep for release. + * Updated README and README.OSX to talk about CodeWarrior + project files. + * Incorporated Rodrigo Damazio's patch for an openexr.m4 + macro file and an openexr.spec file for building RPMs. + * Small change in ImfAttribute.h to make IlmImf compile with gcc 2.95. + * Updated ImfDoubleAttribute.h for Codewarrior on MacOS. + * Added exrheader utility. + * Update to AUTHORS file. + * Added a README.win32 file. + * Added project files for Visual Studio 6.0. + * Initial Win32 port. Requires Visual Studio 6.0 and Intel C++ + compiler version 7.0. + * Added new intersectT method in ImathSphere.h + * Fixed some bugs in ImathQuat.h + * Proper use of fltk-config to get platform-specific FLTK + compile- and link-time flags. + * exrdisplay uses Imath::Math::pow instead of powf now. + powf is not availble on all platforms. + * Roll OS X "hack" into the source until Apple fixes their + istream implementation. + +Version 1.0.4: + * OpenEXR is now covered by a modified BSD license. See LICENSE + for the new terms. + +Version 1.0.3: + + * OpenEXR is now in sf.net CVS. + * Imf::Xdr namespace cleanups. + * Some IlmImfTest cleanups for OS X. + * Use .cpp extension in exrdisplay sources. + * Iex cleanups. + * Make IlmImf compile with Metrowerks Codewarrior. + * Change large automatic stacks in ImfHuf.C to auto_ptrs allocated + off the heap. MacOS X default stack size isn't large enough. + * std::ios fix for MacOS X in ImfInputFile.C. + * Added new FP predecessor/successor functions to Imath, added + tests to ImathTest + * Fixed a bug in Imath::extractSHRT for 3x3 matricies when + exactly one of the original scaling factors is negative, updated + ImathTest to check this case. + * Install include files when 'make install' is run. + * exrdisplay requires fltk 1.1+ now in an effort to support + a MacOS X display program (fltk 1.1 runs on OS X), though this + is untested. + * renamed configure.in to configure.ac + * Removed some tests from IexTest that are no longer used. + * Removed ImfHalfXdr.h, it's not used anymore. + * Revamped the autoconf system, added some compile-time + optimizations, a pkgconfig target, and some maintainer-specific + stuff. + +Version 1.0.2: + + * More OS X fixes in Imath, IlmImf and IlmImfTest. + * Imath updates. + * Fixed a rotation bug in Imath + +Version 1.0.1: + + * Used autoconf 2.53 and automake 1.6 to generate build environment. + * Makefile.am cleanups. + * OS X fixes. + * removed images directory (now distributed separately). + +Version 1.0: + + * first official release. + * added some high-level documentation, removed the old OpenEXR.html + documentation. + * fixed a few nagging build problems. + * bumped IMV_VERSION_NUMBER to 2 + +Version 0.9: + + * added exrdisplay viewer application. + * cleanup _data in Imf::InputFile and Imf::OutputFile constructors. + * removed old ILM copyright notices. + +Version 0.8: + + * Initial release. diff --git a/3rdparty/openexr/Half/eLut.cpp b/3rdparty/openexr/Half/eLut.cpp new file mode 100644 index 000000000..ce64b50dd --- /dev/null +++ b/3rdparty/openexr/Half/eLut.cpp @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + + +#include +#include + +using namespace std; + +//----------------------------------------------------- +// Compute a lookup table for float-to-half conversion. +// +// When indexed with the combined sign and exponent of +// a float, the table either returns the combined sign +// and exponent of the corresponding half, or zero if +// the corresponding half may not be normalized (zero, +// denormalized, overflow). +//----------------------------------------------------- + +void +initELut (unsigned short eLut[]) +{ + for (int i = 0; i < 0x100; i++) + { + int e = (i & 0x0ff) - (127 - 15); + + if (e <= 0 || e >= 30) + { + // + // Special case + // + + eLut[i] = 0; + eLut[i | 0x100] = 0; + } + else + { + // + // Common case - normalized half, no exponent overflow possible + // + + eLut[i] = (e << 10); + eLut[i | 0x100] = ((e << 10) | 0x8000); + } + } +} + + +//------------------------------------------------------------ +// Main - prints the sign-and-exponent conversion lookup table +//------------------------------------------------------------ + +int +main () +{ + const int tableSize = 1 << 9; + unsigned short eLut[tableSize]; + initELut (eLut); + + cout << "//\n" + "// This is an automatically generated file.\n" + "// Do not edit.\n" + "//\n\n"; + + cout << "{\n "; + + for (int i = 0; i < tableSize; i++) + { + cout << setw (5) << eLut[i] << ", "; + + if (i % 8 == 7) + { + cout << "\n"; + + if (i < tableSize - 1) + cout << " "; + } + } + + cout << "};\n"; + return 0; +} diff --git a/3rdparty/openexr/Half/eLut.h b/3rdparty/openexr/Half/eLut.h new file mode 100644 index 000000000..f028cdbb7 --- /dev/null +++ b/3rdparty/openexr/Half/eLut.h @@ -0,0 +1,71 @@ +// +// This is an automatically generated file. +// Do not edit. +// + +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, + 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, + 16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552, + 24576, 25600, 26624, 27648, 28672, 29696, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 33792, 34816, 35840, 36864, 37888, 38912, 39936, + 40960, 41984, 43008, 44032, 45056, 46080, 47104, 48128, + 49152, 50176, 51200, 52224, 53248, 54272, 55296, 56320, + 57344, 58368, 59392, 60416, 61440, 62464, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; diff --git a/3rdparty/openexr/Half/half.cpp b/3rdparty/openexr/Half/half.cpp new file mode 100644 index 000000000..1a3f650c9 --- /dev/null +++ b/3rdparty/openexr/Half/half.cpp @@ -0,0 +1,311 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +// Primary authors: +// Florian Kainz +// Rod Bogart + + +//--------------------------------------------------------------------------- +// +// class half -- +// implementation of non-inline members +// +//--------------------------------------------------------------------------- + +#include +#include "half.h" + +using namespace std; + +//------------------------------------------------------------- +// Lookup tables for half-to-float and float-to-half conversion +//------------------------------------------------------------- + +HALF_EXPORT_CONST half::uif half::_toFloat[1 << 16] = +#include "toFloat.h" +HALF_EXPORT_CONST unsigned short half::_eLut[1 << 9] = +#include "eLut.h" + + +//----------------------------------------------- +// Overflow handler for float-to-half conversion; +// generates a hardware floating-point overflow, +// which may be trapped by the operating system. +//----------------------------------------------- + +float +half::overflow () +{ + volatile float f = 1e10; + + for (int i = 0; i < 10; i++) + f *= f; // this will overflow before + // the for­loop terminates + return f; +} + + +//----------------------------------------------------- +// Float-to-half conversion -- general case, including +// zeroes, denormalized numbers and exponent overflows. +//----------------------------------------------------- + +short +half::convert (int i) +{ + // + // Our floating point number, f, is represented by the bit + // pattern in integer i. Disassemble that bit pattern into + // the sign, s, the exponent, e, and the significand, m. + // Shift s into the position where it will go in in the + // resulting half number. + // Adjust e, accounting for the different exponent bias + // of float and half (127 versus 15). + // + + register int s = (i >> 16) & 0x00008000; + register int e = ((i >> 23) & 0x000000ff) - (127 - 15); + register int m = i & 0x007fffff; + + // + // Now reassemble s, e and m into a half: + // + + if (e <= 0) + { + if (e < -10) + { + // + // E is less than -10. The absolute value of f is + // less than HALF_MIN (f may be a small normalized + // float, a denormalized float or a zero). + // + // We convert f to a half zero with the same sign as f. + // + + return s; + } + + // + // E is between -10 and 0. F is a normalized float + // whose magnitude is less than HALF_NRM_MIN. + // + // We convert f to a denormalized half. + // + + // + // Add an explicit leading 1 to the significand. + // + + m = m | 0x00800000; + + // + // Round to m to the nearest (10+e)-bit value (with e between + // -10 and 0); in case of a tie, round to the nearest even value. + // + // Rounding may cause the significand to overflow and make + // our number normalized. Because of the way a half's bits + // are laid out, we don't have to treat this case separately; + // the code below will handle it correctly. + // + + int t = 14 - e; + int a = (1 << (t - 1)) - 1; + int b = (m >> t) & 1; + + m = (m + a + b) >> t; + + // + // Assemble the half from s, e (zero) and m. + // + + return s | m; + } + else if (e == 0xff - (127 - 15)) + { + if (m == 0) + { + // + // F is an infinity; convert f to a half + // infinity with the same sign as f. + // + + return s | 0x7c00; + } + else + { + // + // F is a NAN; we produce a half NAN that preserves + // the sign bit and the 10 leftmost bits of the + // significand of f, with one exception: If the 10 + // leftmost bits are all zero, the NAN would turn + // into an infinity, so we have to set at least one + // bit in the significand. + // + + m >>= 13; + return s | 0x7c00 | m | (m == 0); + } + } + else + { + // + // E is greater than zero. F is a normalized float. + // We try to convert f to a normalized half. + // + + // + // Round to m to the nearest 10-bit value. In case of + // a tie, round to the nearest even value. + // + + m = m + 0x00000fff + ((m >> 13) & 1); + + if (m & 0x00800000) + { + m = 0; // overflow in significand, + e += 1; // adjust exponent + } + + // + // Handle exponent overflow + // + + if (e > 30) + { + overflow (); // Cause a hardware floating point overflow; + return s | 0x7c00; // if this returns, the half becomes an + } // infinity with the same sign as f. + + // + // Assemble the half from s, e and m. + // + + return s | (e << 10) | (m >> 13); + } +} + + +//--------------------- +// Stream I/O operators +//--------------------- + +ostream & +operator << (ostream &os, half h) +{ + os << float (h); + return os; +} + + +istream & +operator >> (istream &is, half &h) +{ + float f; + is >> f; + h = half (f); + return is; +} + + +//--------------------------------------- +// Functions to print the bit-layout of +// floats and halfs, mostly for debugging +//--------------------------------------- + +void +printBits (ostream &os, half h) +{ + unsigned short b = h.bits(); + + for (int i = 15; i >= 0; i--) + { + os << (((b >> i) & 1)? '1': '0'); + + if (i == 15 || i == 10) + os << ' '; + } +} + + +void +printBits (ostream &os, float f) +{ + half::uif x; + x.f = f; + + for (int i = 31; i >= 0; i--) + { + os << (((x.i >> i) & 1)? '1': '0'); + + if (i == 31 || i == 23) + os << ' '; + } +} + + +void +printBits (char c[19], half h) +{ + unsigned short b = h.bits(); + + for (int i = 15, j = 0; i >= 0; i--, j++) + { + c[j] = (((b >> i) & 1)? '1': '0'); + + if (i == 15 || i == 10) + c[++j] = ' '; + } + + c[18] = 0; +} + + +void +printBits (char c[35], float f) +{ + half::uif x; + x.f = f; + + for (int i = 31, j = 0; i >= 0; i--, j++) + { + c[j] = (((x.i >> i) & 1)? '1': '0'); + + if (i == 31 || i == 23) + c[++j] = ' '; + } + + c[34] = 0; +} diff --git a/3rdparty/openexr/Half/half.h b/3rdparty/openexr/Half/half.h new file mode 100644 index 000000000..5e707efc4 --- /dev/null +++ b/3rdparty/openexr/Half/half.h @@ -0,0 +1,766 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +// Primary authors: +// Florian Kainz +// Rod Bogart + +//--------------------------------------------------------------------------- +// +// half -- a 16-bit floating point number class: +// +// Type half can represent positive and negative numbers whose +// magnitude is between roughly 6.1e-5 and 6.5e+4 with a relative +// error of 9.8e-4; numbers smaller than 6.1e-5 can be represented +// with an absolute error of 6.0e-8. All integers from -2048 to +// +2048 can be represented exactly. +// +// Type half behaves (almost) like the built-in C++ floating point +// types. In arithmetic expressions, half, float and double can be +// mixed freely. Here are a few examples: +// +// half a (3.5); +// float b (a + sqrt (a)); +// a += b; +// b += a; +// b = a + 7; +// +// Conversions from half to float are lossless; all half numbers +// are exactly representable as floats. +// +// Conversions from float to half may not preserve a float's value +// exactly. If a float is not representable as a half, then the +// float value is rounded to the nearest representable half. If a +// float value is exactly in the middle between the two closest +// representable half values, then the float value is rounded to +// the closest half whose least significant bit is zero. +// +// Overflows during float-to-half conversions cause arithmetic +// exceptions. An overflow occurs when the float value to be +// converted is too large to be represented as a half, or if the +// float value is an infinity or a NAN. +// +// The implementation of type half makes the following assumptions +// about the implementation of the built-in C++ types: +// +// float is an IEEE 754 single-precision number +// sizeof (float) == 4 +// sizeof (unsigned int) == sizeof (float) +// alignof (unsigned int) == alignof (float) +// sizeof (unsigned short) == 2 +// +//--------------------------------------------------------------------------- + +#ifndef _HALF_H_ +#define _HALF_H_ + +#include + +#if defined(OPENEXR_DLL) + #if defined(HALF_EXPORTS) + #define HALF_EXPORT __declspec(dllexport) + #else + #define HALF_EXPORT __declspec(dllimport) + #endif + #define HALF_EXPORT_CONST +#else + #define HALF_EXPORT + #define HALF_EXPORT_CONST const +#endif + +class HALF_EXPORT half +{ + public: + + //------------- + // Constructors + //------------- + + half (); // no initialization + half (float f); + + + //-------------------- + // Conversion to float + //-------------------- + + operator float () const; + + + //------------ + // Unary minus + //------------ + + half operator - () const; + + + //----------- + // Assignment + //----------- + + half & operator = (half h); + half & operator = (float f); + + half & operator += (half h); + half & operator += (float f); + + half & operator -= (half h); + half & operator -= (float f); + + half & operator *= (half h); + half & operator *= (float f); + + half & operator /= (half h); + half & operator /= (float f); + + + //--------------------------------------------------------- + // Round to n-bit precision (n should be between 0 and 10). + // After rounding, the significand's 10-n least significant + // bits will be zero. + //--------------------------------------------------------- + + half round (unsigned int n) const; + + + //-------------------------------------------------------------------- + // Classification: + // + // h.isFinite() returns true if h is a normalized number, + // a denormalized number or zero + // + // h.isNormalized() returns true if h is a normalized number + // + // h.isDenormalized() returns true if h is a denormalized number + // + // h.isZero() returns true if h is zero + // + // h.isNan() returns true if h is a NAN + // + // h.isInfinity() returns true if h is a positive + // or a negative infinity + // + // h.isNegative() returns true if the sign bit of h + // is set (negative) + //-------------------------------------------------------------------- + + bool isFinite () const; + bool isNormalized () const; + bool isDenormalized () const; + bool isZero () const; + bool isNan () const; + bool isInfinity () const; + bool isNegative () const; + + + //-------------------------------------------- + // Special values + // + // posInf() returns +infinity + // + // negInf() returns -infinity + // + // qNan() returns a NAN with the bit + // pattern 0111111111111111 + // + // sNan() returns a NAN with the bit + // pattern 0111110111111111 + //-------------------------------------------- + + static half posInf (); + static half negInf (); + static half qNan (); + static half sNan (); + + + //-------------------------------------- + // Access to the internal representation + //-------------------------------------- + + unsigned short bits () const; + void setBits (unsigned short bits); + + + public: + + union uif + { + unsigned int i; + float f; + }; + + private: + + static short convert (int i); + static float overflow (); + + unsigned short _h; + + static HALF_EXPORT_CONST uif _toFloat[1 << 16]; + static HALF_EXPORT_CONST unsigned short _eLut[1 << 9]; +}; + +//----------- +// Stream I/O +//----------- + +HALF_EXPORT std::ostream & operator << (std::ostream &os, half h); +HALF_EXPORT std::istream & operator >> (std::istream &is, half &h); + + +//---------- +// Debugging +//---------- + +HALF_EXPORT void printBits (std::ostream &os, half h); +HALF_EXPORT void printBits (std::ostream &os, float f); +HALF_EXPORT void printBits (char c[19], half h); +HALF_EXPORT void printBits (char c[35], float f); + + +//------------------------------------------------------------------------- +// Limits +// +// Visual C++ will complain if HALF_MIN, HALF_NRM_MIN etc. are not float +// constants, but at least one other compiler (gcc 2.96) produces incorrect +// results if they are. +//------------------------------------------------------------------------- + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER + + #define HALF_MIN 5.96046448e-08f // Smallest positive half + + #define HALF_NRM_MIN 6.10351562e-05f // Smallest positive normalized half + + #define HALF_MAX 65504.0f // Largest positive half + + #define HALF_EPSILON 0.00097656f // Smallest positive e for which + // half (1.0 + e) != half (1.0) +#else + + #define HALF_MIN 5.96046448e-08 // Smallest positive half + + #define HALF_NRM_MIN 6.10351562e-05 // Smallest positive normalized half + + #define HALF_MAX 65504.0 // Largest positive half + + #define HALF_EPSILON 0.00097656 // Smallest positive e for which + // half (1.0 + e) != half (1.0) +#endif + + +#define HALF_MANT_DIG 11 // Number of digits in mantissa + // (significand + hidden leading 1) + +#define HALF_DIG 2 // Number of base 10 digits that + // can be represented without change + +#define HALF_RADIX 2 // Base of the exponent + +#define HALF_MIN_EXP -13 // Minimum negative integer such that + // HALF_RADIX raised to the power of + // one less than that integer is a + // normalized half + +#define HALF_MAX_EXP 16 // Maximum positive integer such that + // HALF_RADIX raised to the power of + // one less than that integer is a + // normalized half + +#define HALF_MIN_10_EXP -4 // Minimum positive integer such + // that 10 raised to that power is + // a normalized half + +#define HALF_MAX_10_EXP 4 // Maximum positive integer such + // that 10 raised to that power is + // a normalized half + + +//--------------------------------------------------------------------------- +// +// Implementation -- +// +// Representation of a float: +// +// We assume that a float, f, is an IEEE 754 single-precision +// floating point number, whose bits are arranged as follows: +// +// 31 (msb) +// | +// | 30 23 +// | | | +// | | | 22 0 (lsb) +// | | | | | +// X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX +// +// s e m +// +// S is the sign-bit, e is the exponent and m is the significand. +// +// If e is between 1 and 254, f is a normalized number: +// +// s e-127 +// f = (-1) * 2 * 1.m +// +// If e is 0, and m is not zero, f is a denormalized number: +// +// s -126 +// f = (-1) * 2 * 0.m +// +// If e and m are both zero, f is zero: +// +// f = 0.0 +// +// If e is 255, f is an "infinity" or "not a number" (NAN), +// depending on whether m is zero or not. +// +// Examples: +// +// 0 00000000 00000000000000000000000 = 0.0 +// 0 01111110 00000000000000000000000 = 0.5 +// 0 01111111 00000000000000000000000 = 1.0 +// 0 10000000 00000000000000000000000 = 2.0 +// 0 10000000 10000000000000000000000 = 3.0 +// 1 10000101 11110000010000000000000 = -124.0625 +// 0 11111111 00000000000000000000000 = +infinity +// 1 11111111 00000000000000000000000 = -infinity +// 0 11111111 10000000000000000000000 = NAN +// 1 11111111 11111111111111111111111 = NAN +// +// Representation of a half: +// +// Here is the bit-layout for a half number, h: +// +// 15 (msb) +// | +// | 14 10 +// | | | +// | | | 9 0 (lsb) +// | | | | | +// X XXXXX XXXXXXXXXX +// +// s e m +// +// S is the sign-bit, e is the exponent and m is the significand. +// +// If e is between 1 and 30, h is a normalized number: +// +// s e-15 +// h = (-1) * 2 * 1.m +// +// If e is 0, and m is not zero, h is a denormalized number: +// +// S -14 +// h = (-1) * 2 * 0.m +// +// If e and m are both zero, h is zero: +// +// h = 0.0 +// +// If e is 31, h is an "infinity" or "not a number" (NAN), +// depending on whether m is zero or not. +// +// Examples: +// +// 0 00000 0000000000 = 0.0 +// 0 01110 0000000000 = 0.5 +// 0 01111 0000000000 = 1.0 +// 0 10000 0000000000 = 2.0 +// 0 10000 1000000000 = 3.0 +// 1 10101 1111000001 = -124.0625 +// 0 11111 0000000000 = +infinity +// 1 11111 0000000000 = -infinity +// 0 11111 1000000000 = NAN +// 1 11111 1111111111 = NAN +// +// Conversion: +// +// Converting from a float to a half requires some non-trivial bit +// manipulations. In some cases, this makes conversion relatively +// slow, but the most common case is accelerated via table lookups. +// +// Converting back from a half to a float is easier because we don't +// have to do any rounding. In addition, there are only 65536 +// different half numbers; we can convert each of those numbers once +// and store the results in a table. Later, all conversions can be +// done using only simple table lookups. +// +//--------------------------------------------------------------------------- + + +//-------------------- +// Simple constructors +//-------------------- + +inline +half::half () +{ + // no initialization +} + + +//---------------------------- +// Half-from-float constructor +//---------------------------- + +inline +half::half (float f) +{ + uif x; + + x.f = f; + + if (f == 0) + { + // + // Common special case - zero. + // Preserve the zero's sign bit. + // + + _h = (x.i >> 16); + } + else + { + // + // We extract the combined sign and exponent, e, from our + // floating-point number, f. Then we convert e to the sign + // and exponent of the half number via a table lookup. + // + // For the most common case, where a normalized half is produced, + // the table lookup returns a non-zero value; in this case, all + // we have to do is round f's significand to 10 bits and combine + // the result with e. + // + // For all other cases (overflow, zeroes, denormalized numbers + // resulting from underflow, infinities and NANs), the table + // lookup returns zero, and we call a longer, non-inline function + // to do the float-to-half conversion. + // + + register int e = (x.i >> 23) & 0x000001ff; + + e = _eLut[e]; + + if (e) + { + // + // Simple case - round the significand, m, to 10 + // bits and combine it with the sign and exponent. + // + + register int m = x.i & 0x007fffff; + _h = e + ((m + 0x00000fff + ((m >> 13) & 1)) >> 13); + } + else + { + // + // Difficult case - call a function. + // + + _h = convert (x.i); + } + } +} + + +//------------------------------------------ +// Half-to-float conversion via table lookup +//------------------------------------------ + +inline +half::operator float () const +{ + return _toFloat[_h].f; +} + + +//------------------------- +// Round to n-bit precision +//------------------------- + +inline half +half::round (unsigned int n) const +{ + // + // Parameter check. + // + + if (n >= 10) + return *this; + + // + // Disassemble h into the sign, s, + // and the combined exponent and significand, e. + // + + unsigned short s = _h & 0x8000; + unsigned short e = _h & 0x7fff; + + // + // Round the exponent and significand to the nearest value + // where ones occur only in the (10-n) most significant bits. + // Note that the exponent adjusts automatically if rounding + // up causes the significand to overflow. + // + + e >>= 9 - n; + e += e & 1; + e <<= 9 - n; + + // + // Check for exponent overflow. + // + + if (e >= 0x7c00) + { + // + // Overflow occurred -- truncate instead of rounding. + // + + e = _h; + e >>= 10 - n; + e <<= 10 - n; + } + + // + // Put the original sign bit back. + // + + half h; + h._h = s | e; + + return h; +} + + +//----------------------- +// Other inline functions +//----------------------- + +inline half +half::operator - () const +{ + half h; + h._h = _h ^ 0x8000; + return h; +} + + +inline half & +half::operator = (half h) +{ + _h = h._h; + return *this; +} + + +inline half & +half::operator = (float f) +{ + *this = half (f); + return *this; +} + + +inline half & +half::operator += (half h) +{ + *this = half (float (*this) + float (h)); + return *this; +} + + +inline half & +half::operator += (float f) +{ + *this = half (float (*this) + f); + return *this; +} + + +inline half & +half::operator -= (half h) +{ + *this = half (float (*this) - float (h)); + return *this; +} + + +inline half & +half::operator -= (float f) +{ + *this = half (float (*this) - f); + return *this; +} + + +inline half & +half::operator *= (half h) +{ + *this = half (float (*this) * float (h)); + return *this; +} + + +inline half & +half::operator *= (float f) +{ + *this = half (float (*this) * f); + return *this; +} + + +inline half & +half::operator /= (half h) +{ + *this = half (float (*this) / float (h)); + return *this; +} + + +inline half & +half::operator /= (float f) +{ + *this = half (float (*this) / f); + return *this; +} + + +inline bool +half::isFinite () const +{ + unsigned short e = (_h >> 10) & 0x001f; + return e < 31; +} + + +inline bool +half::isNormalized () const +{ + unsigned short e = (_h >> 10) & 0x001f; + return e > 0 && e < 31; +} + + +inline bool +half::isDenormalized () const +{ + unsigned short e = (_h >> 10) & 0x001f; + unsigned short m = _h & 0x3ff; + return e == 0 && m != 0; +} + + +inline bool +half::isZero () const +{ + return (_h & 0x7fff) == 0; +} + + +inline bool +half::isNan () const +{ + unsigned short e = (_h >> 10) & 0x001f; + unsigned short m = _h & 0x3ff; + return e == 31 && m != 0; +} + + +inline bool +half::isInfinity () const +{ + unsigned short e = (_h >> 10) & 0x001f; + unsigned short m = _h & 0x3ff; + return e == 31 && m == 0; +} + + +inline bool +half::isNegative () const +{ + return (_h & 0x8000) != 0; +} + + +inline half +half::posInf () +{ + half h; + h._h = 0x7c00; + return h; +} + + +inline half +half::negInf () +{ + half h; + h._h = 0xfc00; + return h; +} + + +inline half +half::qNan () +{ + half h; + h._h = 0x7fff; + return h; +} + + +inline half +half::sNan () +{ + half h; + h._h = 0x7dff; + return h; +} + + +inline unsigned short +half::bits () const +{ + return _h; +} + + +inline void +half::setBits (unsigned short bits) +{ + _h = bits; +} + +#endif diff --git a/3rdparty/openexr/Half/halfFunction.h b/3rdparty/openexr/Half/halfFunction.h new file mode 100644 index 000000000..37dbf50dc --- /dev/null +++ b/3rdparty/openexr/Half/halfFunction.h @@ -0,0 +1,178 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +// Primary authors: +// Florian Kainz +// Rod Bogart + + +//--------------------------------------------------------------------------- +// +// halfFunction -- a class for fast evaluation +// of half --> T functions +// +// The constructor for a halfFunction object, +// +// halfFunction (function, +// domainMin, domainMax, +// defaultValue, +// posInfValue, negInfValue, +// nanValue); +// +// evaluates the function for all finite half values in the interval +// [domainMin, domainMax], and stores the results in a lookup table. +// For finite half values that are not in [domainMin, domainMax], the +// constructor stores defaultValue in the table. For positive infinity, +// negative infinity and NANs, posInfValue, negInfValue and nanValue +// are stored in the table. +// +// The tabulated function can then be evaluated quickly for arbitrary +// half values by calling the the halfFunction object's operator() +// method. +// +// Example: +// +// #include +// #include +// +// halfFunction hsin (sin); +// +// halfFunction hsqrt (sqrt, // function +// 0, HALF_MAX, // domain +// half::qNan(), // sqrt(x) for x < 0 +// half::posInf(), // sqrt(+inf) +// half::qNan(), // sqrt(-inf) +// half::qNan()); // sqrt(nan) +// +// half x = hsin (1); +// half y = hsqrt (3.5); +// +//--------------------------------------------------------------------------- + +#ifndef _HALF_FUNCTION_H_ +#define _HALF_FUNCTION_H_ + +#include "half.h" + +#include +#ifndef ILMBASE_HAVE_LARGE_STACK +#include // need this for memset +#else +#endif + +#include + + +template +class halfFunction +{ + public: + + //------------ + // Constructor + //------------ + + template + halfFunction (Function f, + half domainMin = -HALF_MAX, + half domainMax = HALF_MAX, + T defaultValue = 0, + T posInfValue = 0, + T negInfValue = 0, + T nanValue = 0); + +#ifndef ILMBASE_HAVE_LARGE_STACK + ~halfFunction () { delete [] _lut; } +#endif + + //----------- + // Evaluation + //----------- + + T operator () (half x) const; + + private: +#ifdef ILMBASE_HAVE_LARGE_STACK + T _lut[1 << 16]; +#else + T * _lut; +#endif +}; + + +//--------------- +// Implementation +//--------------- + +template +template +halfFunction::halfFunction (Function f, + half domainMin, + half domainMax, + T defaultValue, + T posInfValue, + T negInfValue, + T nanValue) +{ +#ifndef ILMBASE_HAVE_LARGE_STACK + _lut = new T[1<<16]; + memset (_lut, 0 , (1<<16) * sizeof(T)); +#endif + + for (int i = 0; i < (1 << 16); i++) + { + half x; + x.setBits (i); + + if (x.isNan()) + _lut[i] = nanValue; + else if (x.isInfinity()) + _lut[i] = x.isNegative()? negInfValue: posInfValue; + else if (x < domainMin || x > domainMax) + _lut[i] = defaultValue; + else + _lut[i] = f (x); + } +} + + +template +inline T +halfFunction::operator () (half x) const +{ + return _lut[x.bits()]; +} + + +#endif diff --git a/3rdparty/openexr/Half/halfLimits.h b/3rdparty/openexr/Half/halfLimits.h new file mode 100644 index 000000000..404f58936 --- /dev/null +++ b/3rdparty/openexr/Half/halfLimits.h @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +// Primary authors: +// Florian Kainz +// Rod Bogart + + +#ifndef INCLUDED_HALF_LIMITS_H +#define INCLUDED_HALF_LIMITS_H + + +//------------------------------------------------------------------------ +// +// C++ standard library-style numeric_limits for class half +// +//------------------------------------------------------------------------ + +#include +#include "half.h" + +namespace std { + +template <> +class numeric_limits +{ + public: + + static const bool is_specialized = true; + + static half min () throw () {return HALF_NRM_MIN;} + static half max () throw () {return HALF_MAX;} + + static const int digits = HALF_MANT_DIG; + static const int digits10 = HALF_DIG; + static const bool is_signed = true; + static const bool is_integer = false; + static const bool is_exact = false; + static const int radix = HALF_RADIX; + static half epsilon () throw () {return HALF_EPSILON;} + static half round_error () throw () {return HALF_EPSILON / 2;} + + static const int min_exponent = HALF_MIN_EXP; + static const int min_exponent10 = HALF_MIN_10_EXP; + static const int max_exponent = HALF_MAX_EXP; + static const int max_exponent10 = HALF_MAX_10_EXP; + + static const bool has_infinity = true; + static const bool has_quiet_NaN = true; + static const bool has_signaling_NaN = true; + static const float_denorm_style has_denorm = denorm_present; + static const bool has_denorm_loss = false; + static half infinity () throw () {return half::posInf();} + static half quiet_NaN () throw () {return half::qNan();} + static half signaling_NaN () throw () {return half::sNan();} + static half denorm_min () throw () {return HALF_MIN;} + + static const bool is_iec559 = false; + static const bool is_bounded = false; + static const bool is_modulo = false; + + static const bool traps = true; + static const bool tinyness_before = false; + static const float_round_style round_style = round_to_nearest; +}; + + +} // namespace std + +#endif diff --git a/3rdparty/openexr/Half/toFloat.cpp b/3rdparty/openexr/Half/toFloat.cpp new file mode 100644 index 000000000..001bc51be --- /dev/null +++ b/3rdparty/openexr/Half/toFloat.cpp @@ -0,0 +1,164 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +//--------------------------------------------------------------------------- +// +// toFloat +// +// A program to generate the lookup table for half-to-float +// conversion needed by class half. +// The program loops over all 65536 possible half numbers, +// converts each of them to a float, and prints the result. +// +//--------------------------------------------------------------------------- + + +#include +#include + +using namespace std; + +//--------------------------------------------------- +// Interpret an unsigned short bit pattern as a half, +// and convert that half to the corresponding float's +// bit pattern. +//--------------------------------------------------- + +unsigned int +halfToFloat (unsigned short y) +{ + + int s = (y >> 15) & 0x00000001; + int e = (y >> 10) & 0x0000001f; + int m = y & 0x000003ff; + + if (e == 0) + { + if (m == 0) + { + // + // Plus or minus zero + // + + return s << 31; + } + else + { + // + // Denormalized number -- renormalize it + // + + while (!(m & 0x00000400)) + { + m <<= 1; + e -= 1; + } + + e += 1; + m &= ~0x00000400; + } + } + else if (e == 31) + { + if (m == 0) + { + // + // Positive or negative infinity + // + + return (s << 31) | 0x7f800000; + } + else + { + // + // Nan -- preserve sign and significand bits + // + + return (s << 31) | 0x7f800000 | (m << 13); + } + } + + // + // Normalized number + // + + e = e + (127 - 15); + m = m << 13; + + // + // Assemble s, e and m. + // + + return (s << 31) | (e << 23) | m; +} + + +//--------------------------------------------- +// Main - prints the half-to-float lookup table +//--------------------------------------------- + +int +main () +{ + cout.precision (9); + cout.setf (ios_base::hex, ios_base::basefield); + + cout << "//\n" + "// This is an automatically generated file.\n" + "// Do not edit.\n" + "//\n\n"; + + cout << "{\n "; + + const int iMax = (1 << 16); + + for (int i = 0; i < iMax; i++) + { + cout << "{0x" << setfill ('0') << setw (8) << halfToFloat (i) << "}, "; + + if (i % 4 == 3) + { + cout << "\n"; + + if (i < iMax - 1) + cout << " "; + } + } + + cout << "};\n"; + return 0; +} diff --git a/3rdparty/openexr/Half/toFloat.h b/3rdparty/openexr/Half/toFloat.h new file mode 100644 index 000000000..37c95563a --- /dev/null +++ b/3rdparty/openexr/Half/toFloat.h @@ -0,0 +1,16391 @@ +// +// This is an automatically generated file. +// Do not edit. +// + +{ + {0x00000000}, {0x33800000}, {0x34000000}, {0x34400000}, + {0x34800000}, {0x34a00000}, {0x34c00000}, {0x34e00000}, + {0x35000000}, {0x35100000}, {0x35200000}, {0x35300000}, + {0x35400000}, {0x35500000}, {0x35600000}, {0x35700000}, + {0x35800000}, {0x35880000}, {0x35900000}, {0x35980000}, + {0x35a00000}, {0x35a80000}, {0x35b00000}, {0x35b80000}, + {0x35c00000}, {0x35c80000}, {0x35d00000}, {0x35d80000}, + {0x35e00000}, {0x35e80000}, {0x35f00000}, {0x35f80000}, + {0x36000000}, {0x36040000}, {0x36080000}, {0x360c0000}, + {0x36100000}, {0x36140000}, {0x36180000}, {0x361c0000}, + {0x36200000}, {0x36240000}, {0x36280000}, {0x362c0000}, + {0x36300000}, {0x36340000}, {0x36380000}, {0x363c0000}, + {0x36400000}, {0x36440000}, {0x36480000}, {0x364c0000}, + {0x36500000}, {0x36540000}, {0x36580000}, {0x365c0000}, + {0x36600000}, {0x36640000}, {0x36680000}, {0x366c0000}, + {0x36700000}, {0x36740000}, {0x36780000}, {0x367c0000}, + {0x36800000}, {0x36820000}, {0x36840000}, {0x36860000}, + {0x36880000}, {0x368a0000}, {0x368c0000}, {0x368e0000}, + {0x36900000}, {0x36920000}, {0x36940000}, {0x36960000}, + {0x36980000}, {0x369a0000}, {0x369c0000}, {0x369e0000}, + {0x36a00000}, {0x36a20000}, {0x36a40000}, {0x36a60000}, + {0x36a80000}, {0x36aa0000}, {0x36ac0000}, {0x36ae0000}, + {0x36b00000}, {0x36b20000}, {0x36b40000}, {0x36b60000}, + {0x36b80000}, {0x36ba0000}, {0x36bc0000}, {0x36be0000}, + {0x36c00000}, {0x36c20000}, {0x36c40000}, {0x36c60000}, + {0x36c80000}, {0x36ca0000}, {0x36cc0000}, {0x36ce0000}, + {0x36d00000}, {0x36d20000}, {0x36d40000}, {0x36d60000}, + {0x36d80000}, {0x36da0000}, {0x36dc0000}, {0x36de0000}, + {0x36e00000}, {0x36e20000}, {0x36e40000}, {0x36e60000}, + {0x36e80000}, {0x36ea0000}, {0x36ec0000}, {0x36ee0000}, + {0x36f00000}, {0x36f20000}, {0x36f40000}, {0x36f60000}, + {0x36f80000}, {0x36fa0000}, {0x36fc0000}, {0x36fe0000}, + {0x37000000}, {0x37010000}, {0x37020000}, {0x37030000}, + {0x37040000}, {0x37050000}, {0x37060000}, {0x37070000}, + {0x37080000}, {0x37090000}, {0x370a0000}, {0x370b0000}, + {0x370c0000}, {0x370d0000}, {0x370e0000}, {0x370f0000}, + {0x37100000}, {0x37110000}, {0x37120000}, {0x37130000}, + {0x37140000}, {0x37150000}, {0x37160000}, {0x37170000}, + {0x37180000}, {0x37190000}, {0x371a0000}, {0x371b0000}, + {0x371c0000}, {0x371d0000}, {0x371e0000}, {0x371f0000}, + {0x37200000}, {0x37210000}, {0x37220000}, {0x37230000}, + {0x37240000}, {0x37250000}, {0x37260000}, {0x37270000}, + {0x37280000}, {0x37290000}, {0x372a0000}, {0x372b0000}, + {0x372c0000}, {0x372d0000}, {0x372e0000}, {0x372f0000}, + {0x37300000}, {0x37310000}, {0x37320000}, {0x37330000}, + {0x37340000}, {0x37350000}, {0x37360000}, {0x37370000}, + {0x37380000}, {0x37390000}, {0x373a0000}, {0x373b0000}, + {0x373c0000}, {0x373d0000}, {0x373e0000}, {0x373f0000}, + {0x37400000}, {0x37410000}, {0x37420000}, {0x37430000}, + {0x37440000}, {0x37450000}, {0x37460000}, {0x37470000}, + {0x37480000}, {0x37490000}, {0x374a0000}, {0x374b0000}, + {0x374c0000}, {0x374d0000}, {0x374e0000}, {0x374f0000}, + {0x37500000}, {0x37510000}, {0x37520000}, {0x37530000}, + {0x37540000}, {0x37550000}, {0x37560000}, {0x37570000}, + {0x37580000}, {0x37590000}, {0x375a0000}, {0x375b0000}, + {0x375c0000}, {0x375d0000}, {0x375e0000}, {0x375f0000}, + {0x37600000}, {0x37610000}, {0x37620000}, {0x37630000}, + {0x37640000}, {0x37650000}, {0x37660000}, {0x37670000}, + {0x37680000}, {0x37690000}, {0x376a0000}, {0x376b0000}, + {0x376c0000}, {0x376d0000}, {0x376e0000}, {0x376f0000}, + {0x37700000}, {0x37710000}, {0x37720000}, {0x37730000}, + {0x37740000}, {0x37750000}, {0x37760000}, {0x37770000}, + {0x37780000}, {0x37790000}, {0x377a0000}, {0x377b0000}, + {0x377c0000}, {0x377d0000}, {0x377e0000}, {0x377f0000}, + {0x37800000}, {0x37808000}, {0x37810000}, {0x37818000}, + {0x37820000}, {0x37828000}, {0x37830000}, {0x37838000}, + {0x37840000}, {0x37848000}, {0x37850000}, {0x37858000}, + {0x37860000}, {0x37868000}, {0x37870000}, {0x37878000}, + {0x37880000}, {0x37888000}, {0x37890000}, {0x37898000}, + {0x378a0000}, {0x378a8000}, {0x378b0000}, {0x378b8000}, + {0x378c0000}, {0x378c8000}, {0x378d0000}, {0x378d8000}, + {0x378e0000}, {0x378e8000}, {0x378f0000}, {0x378f8000}, + {0x37900000}, {0x37908000}, {0x37910000}, {0x37918000}, + {0x37920000}, {0x37928000}, {0x37930000}, {0x37938000}, + {0x37940000}, {0x37948000}, {0x37950000}, {0x37958000}, + {0x37960000}, {0x37968000}, {0x37970000}, {0x37978000}, + {0x37980000}, {0x37988000}, {0x37990000}, {0x37998000}, + {0x379a0000}, {0x379a8000}, {0x379b0000}, {0x379b8000}, + {0x379c0000}, {0x379c8000}, {0x379d0000}, {0x379d8000}, + {0x379e0000}, {0x379e8000}, {0x379f0000}, {0x379f8000}, + {0x37a00000}, {0x37a08000}, {0x37a10000}, {0x37a18000}, + {0x37a20000}, {0x37a28000}, {0x37a30000}, {0x37a38000}, + {0x37a40000}, {0x37a48000}, {0x37a50000}, {0x37a58000}, + {0x37a60000}, {0x37a68000}, {0x37a70000}, {0x37a78000}, + {0x37a80000}, {0x37a88000}, {0x37a90000}, {0x37a98000}, + {0x37aa0000}, {0x37aa8000}, {0x37ab0000}, {0x37ab8000}, + {0x37ac0000}, {0x37ac8000}, {0x37ad0000}, {0x37ad8000}, + {0x37ae0000}, {0x37ae8000}, {0x37af0000}, {0x37af8000}, + {0x37b00000}, {0x37b08000}, {0x37b10000}, {0x37b18000}, + {0x37b20000}, {0x37b28000}, {0x37b30000}, {0x37b38000}, + {0x37b40000}, {0x37b48000}, {0x37b50000}, {0x37b58000}, + {0x37b60000}, {0x37b68000}, {0x37b70000}, {0x37b78000}, + {0x37b80000}, {0x37b88000}, {0x37b90000}, {0x37b98000}, + {0x37ba0000}, {0x37ba8000}, {0x37bb0000}, {0x37bb8000}, + {0x37bc0000}, {0x37bc8000}, {0x37bd0000}, {0x37bd8000}, + {0x37be0000}, {0x37be8000}, {0x37bf0000}, {0x37bf8000}, + {0x37c00000}, {0x37c08000}, {0x37c10000}, {0x37c18000}, + {0x37c20000}, {0x37c28000}, {0x37c30000}, {0x37c38000}, + {0x37c40000}, {0x37c48000}, {0x37c50000}, {0x37c58000}, + {0x37c60000}, {0x37c68000}, {0x37c70000}, {0x37c78000}, + {0x37c80000}, {0x37c88000}, {0x37c90000}, {0x37c98000}, + {0x37ca0000}, {0x37ca8000}, {0x37cb0000}, {0x37cb8000}, + {0x37cc0000}, {0x37cc8000}, {0x37cd0000}, {0x37cd8000}, + {0x37ce0000}, {0x37ce8000}, {0x37cf0000}, {0x37cf8000}, + {0x37d00000}, {0x37d08000}, {0x37d10000}, {0x37d18000}, + {0x37d20000}, {0x37d28000}, {0x37d30000}, {0x37d38000}, + {0x37d40000}, {0x37d48000}, {0x37d50000}, {0x37d58000}, + {0x37d60000}, {0x37d68000}, {0x37d70000}, {0x37d78000}, + {0x37d80000}, {0x37d88000}, {0x37d90000}, {0x37d98000}, + {0x37da0000}, {0x37da8000}, {0x37db0000}, {0x37db8000}, + {0x37dc0000}, {0x37dc8000}, {0x37dd0000}, {0x37dd8000}, + {0x37de0000}, {0x37de8000}, {0x37df0000}, {0x37df8000}, + {0x37e00000}, {0x37e08000}, {0x37e10000}, {0x37e18000}, + {0x37e20000}, {0x37e28000}, {0x37e30000}, {0x37e38000}, + {0x37e40000}, {0x37e48000}, {0x37e50000}, {0x37e58000}, + {0x37e60000}, {0x37e68000}, {0x37e70000}, {0x37e78000}, + {0x37e80000}, {0x37e88000}, {0x37e90000}, {0x37e98000}, + {0x37ea0000}, {0x37ea8000}, {0x37eb0000}, {0x37eb8000}, + {0x37ec0000}, {0x37ec8000}, {0x37ed0000}, {0x37ed8000}, + {0x37ee0000}, {0x37ee8000}, {0x37ef0000}, {0x37ef8000}, + {0x37f00000}, {0x37f08000}, {0x37f10000}, {0x37f18000}, + {0x37f20000}, {0x37f28000}, {0x37f30000}, {0x37f38000}, + {0x37f40000}, {0x37f48000}, {0x37f50000}, {0x37f58000}, + {0x37f60000}, {0x37f68000}, {0x37f70000}, {0x37f78000}, + {0x37f80000}, {0x37f88000}, {0x37f90000}, {0x37f98000}, + {0x37fa0000}, {0x37fa8000}, {0x37fb0000}, {0x37fb8000}, + {0x37fc0000}, {0x37fc8000}, {0x37fd0000}, {0x37fd8000}, + {0x37fe0000}, {0x37fe8000}, {0x37ff0000}, {0x37ff8000}, + {0x38000000}, {0x38004000}, {0x38008000}, {0x3800c000}, + {0x38010000}, {0x38014000}, {0x38018000}, {0x3801c000}, + {0x38020000}, {0x38024000}, {0x38028000}, {0x3802c000}, + {0x38030000}, {0x38034000}, {0x38038000}, {0x3803c000}, + {0x38040000}, {0x38044000}, {0x38048000}, {0x3804c000}, + {0x38050000}, {0x38054000}, {0x38058000}, {0x3805c000}, + {0x38060000}, {0x38064000}, {0x38068000}, {0x3806c000}, + {0x38070000}, {0x38074000}, {0x38078000}, {0x3807c000}, + {0x38080000}, {0x38084000}, {0x38088000}, {0x3808c000}, + {0x38090000}, {0x38094000}, {0x38098000}, {0x3809c000}, + {0x380a0000}, {0x380a4000}, {0x380a8000}, {0x380ac000}, + {0x380b0000}, {0x380b4000}, {0x380b8000}, {0x380bc000}, + {0x380c0000}, {0x380c4000}, {0x380c8000}, {0x380cc000}, + {0x380d0000}, {0x380d4000}, {0x380d8000}, {0x380dc000}, + {0x380e0000}, {0x380e4000}, {0x380e8000}, {0x380ec000}, + {0x380f0000}, {0x380f4000}, {0x380f8000}, {0x380fc000}, + {0x38100000}, {0x38104000}, {0x38108000}, {0x3810c000}, + {0x38110000}, {0x38114000}, {0x38118000}, {0x3811c000}, + {0x38120000}, {0x38124000}, {0x38128000}, {0x3812c000}, + {0x38130000}, {0x38134000}, {0x38138000}, {0x3813c000}, + {0x38140000}, {0x38144000}, {0x38148000}, {0x3814c000}, + {0x38150000}, {0x38154000}, {0x38158000}, {0x3815c000}, + {0x38160000}, {0x38164000}, {0x38168000}, {0x3816c000}, + {0x38170000}, {0x38174000}, {0x38178000}, {0x3817c000}, + {0x38180000}, {0x38184000}, {0x38188000}, {0x3818c000}, + {0x38190000}, {0x38194000}, {0x38198000}, {0x3819c000}, + {0x381a0000}, {0x381a4000}, {0x381a8000}, {0x381ac000}, + {0x381b0000}, {0x381b4000}, {0x381b8000}, {0x381bc000}, + {0x381c0000}, {0x381c4000}, {0x381c8000}, {0x381cc000}, + {0x381d0000}, {0x381d4000}, {0x381d8000}, {0x381dc000}, + {0x381e0000}, {0x381e4000}, {0x381e8000}, {0x381ec000}, + {0x381f0000}, {0x381f4000}, {0x381f8000}, {0x381fc000}, + {0x38200000}, {0x38204000}, {0x38208000}, {0x3820c000}, + {0x38210000}, {0x38214000}, {0x38218000}, {0x3821c000}, + {0x38220000}, {0x38224000}, {0x38228000}, {0x3822c000}, + {0x38230000}, {0x38234000}, {0x38238000}, {0x3823c000}, + {0x38240000}, {0x38244000}, {0x38248000}, {0x3824c000}, + {0x38250000}, {0x38254000}, {0x38258000}, {0x3825c000}, + {0x38260000}, {0x38264000}, {0x38268000}, {0x3826c000}, + {0x38270000}, {0x38274000}, {0x38278000}, {0x3827c000}, + {0x38280000}, {0x38284000}, {0x38288000}, {0x3828c000}, + {0x38290000}, {0x38294000}, {0x38298000}, {0x3829c000}, + {0x382a0000}, {0x382a4000}, {0x382a8000}, {0x382ac000}, + {0x382b0000}, {0x382b4000}, {0x382b8000}, {0x382bc000}, + {0x382c0000}, {0x382c4000}, {0x382c8000}, {0x382cc000}, + {0x382d0000}, {0x382d4000}, {0x382d8000}, {0x382dc000}, + {0x382e0000}, {0x382e4000}, {0x382e8000}, {0x382ec000}, + {0x382f0000}, {0x382f4000}, {0x382f8000}, {0x382fc000}, + {0x38300000}, {0x38304000}, {0x38308000}, {0x3830c000}, + {0x38310000}, {0x38314000}, {0x38318000}, {0x3831c000}, + {0x38320000}, {0x38324000}, {0x38328000}, {0x3832c000}, + {0x38330000}, {0x38334000}, {0x38338000}, {0x3833c000}, + {0x38340000}, {0x38344000}, {0x38348000}, {0x3834c000}, + {0x38350000}, {0x38354000}, {0x38358000}, {0x3835c000}, + {0x38360000}, {0x38364000}, {0x38368000}, {0x3836c000}, + {0x38370000}, {0x38374000}, {0x38378000}, {0x3837c000}, + {0x38380000}, {0x38384000}, {0x38388000}, {0x3838c000}, + {0x38390000}, {0x38394000}, {0x38398000}, {0x3839c000}, + {0x383a0000}, {0x383a4000}, {0x383a8000}, {0x383ac000}, + {0x383b0000}, {0x383b4000}, {0x383b8000}, {0x383bc000}, + {0x383c0000}, {0x383c4000}, {0x383c8000}, {0x383cc000}, + {0x383d0000}, {0x383d4000}, {0x383d8000}, {0x383dc000}, + {0x383e0000}, {0x383e4000}, {0x383e8000}, {0x383ec000}, + {0x383f0000}, {0x383f4000}, {0x383f8000}, {0x383fc000}, + {0x38400000}, {0x38404000}, {0x38408000}, {0x3840c000}, + {0x38410000}, {0x38414000}, {0x38418000}, {0x3841c000}, + {0x38420000}, {0x38424000}, {0x38428000}, {0x3842c000}, + {0x38430000}, {0x38434000}, {0x38438000}, {0x3843c000}, + {0x38440000}, {0x38444000}, {0x38448000}, {0x3844c000}, + {0x38450000}, {0x38454000}, {0x38458000}, {0x3845c000}, + {0x38460000}, {0x38464000}, {0x38468000}, {0x3846c000}, + {0x38470000}, {0x38474000}, {0x38478000}, {0x3847c000}, + {0x38480000}, {0x38484000}, {0x38488000}, {0x3848c000}, + {0x38490000}, {0x38494000}, {0x38498000}, {0x3849c000}, + {0x384a0000}, {0x384a4000}, {0x384a8000}, {0x384ac000}, + {0x384b0000}, {0x384b4000}, {0x384b8000}, {0x384bc000}, + {0x384c0000}, {0x384c4000}, {0x384c8000}, {0x384cc000}, + {0x384d0000}, {0x384d4000}, {0x384d8000}, {0x384dc000}, + {0x384e0000}, {0x384e4000}, {0x384e8000}, {0x384ec000}, + {0x384f0000}, {0x384f4000}, {0x384f8000}, {0x384fc000}, + {0x38500000}, {0x38504000}, {0x38508000}, {0x3850c000}, + {0x38510000}, {0x38514000}, {0x38518000}, {0x3851c000}, + {0x38520000}, {0x38524000}, {0x38528000}, {0x3852c000}, + {0x38530000}, {0x38534000}, {0x38538000}, {0x3853c000}, + {0x38540000}, {0x38544000}, {0x38548000}, {0x3854c000}, + {0x38550000}, {0x38554000}, {0x38558000}, {0x3855c000}, + {0x38560000}, {0x38564000}, {0x38568000}, {0x3856c000}, + {0x38570000}, {0x38574000}, {0x38578000}, {0x3857c000}, + {0x38580000}, {0x38584000}, {0x38588000}, {0x3858c000}, + {0x38590000}, {0x38594000}, {0x38598000}, {0x3859c000}, + {0x385a0000}, {0x385a4000}, {0x385a8000}, {0x385ac000}, + {0x385b0000}, {0x385b4000}, {0x385b8000}, {0x385bc000}, + {0x385c0000}, {0x385c4000}, {0x385c8000}, {0x385cc000}, + {0x385d0000}, {0x385d4000}, {0x385d8000}, {0x385dc000}, + {0x385e0000}, {0x385e4000}, {0x385e8000}, {0x385ec000}, + {0x385f0000}, {0x385f4000}, {0x385f8000}, {0x385fc000}, + {0x38600000}, {0x38604000}, {0x38608000}, {0x3860c000}, + {0x38610000}, {0x38614000}, {0x38618000}, {0x3861c000}, + {0x38620000}, {0x38624000}, {0x38628000}, {0x3862c000}, + {0x38630000}, {0x38634000}, {0x38638000}, {0x3863c000}, + {0x38640000}, {0x38644000}, {0x38648000}, {0x3864c000}, + {0x38650000}, {0x38654000}, {0x38658000}, {0x3865c000}, + {0x38660000}, {0x38664000}, {0x38668000}, {0x3866c000}, + {0x38670000}, {0x38674000}, {0x38678000}, {0x3867c000}, + {0x38680000}, {0x38684000}, {0x38688000}, {0x3868c000}, + {0x38690000}, {0x38694000}, {0x38698000}, {0x3869c000}, + {0x386a0000}, {0x386a4000}, {0x386a8000}, {0x386ac000}, + {0x386b0000}, {0x386b4000}, {0x386b8000}, {0x386bc000}, + {0x386c0000}, {0x386c4000}, {0x386c8000}, {0x386cc000}, + {0x386d0000}, {0x386d4000}, {0x386d8000}, {0x386dc000}, + {0x386e0000}, {0x386e4000}, {0x386e8000}, {0x386ec000}, + {0x386f0000}, {0x386f4000}, {0x386f8000}, {0x386fc000}, + {0x38700000}, {0x38704000}, {0x38708000}, {0x3870c000}, + {0x38710000}, {0x38714000}, {0x38718000}, {0x3871c000}, + {0x38720000}, {0x38724000}, {0x38728000}, {0x3872c000}, + {0x38730000}, {0x38734000}, {0x38738000}, {0x3873c000}, + {0x38740000}, {0x38744000}, {0x38748000}, {0x3874c000}, + {0x38750000}, {0x38754000}, {0x38758000}, {0x3875c000}, + {0x38760000}, {0x38764000}, {0x38768000}, {0x3876c000}, + {0x38770000}, {0x38774000}, {0x38778000}, {0x3877c000}, + {0x38780000}, {0x38784000}, {0x38788000}, {0x3878c000}, + {0x38790000}, {0x38794000}, {0x38798000}, {0x3879c000}, + {0x387a0000}, {0x387a4000}, {0x387a8000}, {0x387ac000}, + {0x387b0000}, {0x387b4000}, {0x387b8000}, {0x387bc000}, + {0x387c0000}, {0x387c4000}, {0x387c8000}, {0x387cc000}, + {0x387d0000}, {0x387d4000}, {0x387d8000}, {0x387dc000}, + {0x387e0000}, {0x387e4000}, {0x387e8000}, {0x387ec000}, + {0x387f0000}, {0x387f4000}, {0x387f8000}, {0x387fc000}, + {0x38800000}, {0x38802000}, {0x38804000}, {0x38806000}, + {0x38808000}, {0x3880a000}, {0x3880c000}, {0x3880e000}, + {0x38810000}, {0x38812000}, {0x38814000}, {0x38816000}, + {0x38818000}, {0x3881a000}, {0x3881c000}, {0x3881e000}, + {0x38820000}, {0x38822000}, {0x38824000}, {0x38826000}, + {0x38828000}, {0x3882a000}, {0x3882c000}, {0x3882e000}, + {0x38830000}, {0x38832000}, {0x38834000}, {0x38836000}, + {0x38838000}, {0x3883a000}, {0x3883c000}, {0x3883e000}, + {0x38840000}, {0x38842000}, {0x38844000}, {0x38846000}, + {0x38848000}, {0x3884a000}, {0x3884c000}, {0x3884e000}, + {0x38850000}, {0x38852000}, {0x38854000}, {0x38856000}, + {0x38858000}, {0x3885a000}, {0x3885c000}, {0x3885e000}, + {0x38860000}, {0x38862000}, {0x38864000}, {0x38866000}, + {0x38868000}, {0x3886a000}, {0x3886c000}, {0x3886e000}, + {0x38870000}, {0x38872000}, {0x38874000}, {0x38876000}, + {0x38878000}, {0x3887a000}, {0x3887c000}, {0x3887e000}, + {0x38880000}, {0x38882000}, {0x38884000}, {0x38886000}, + {0x38888000}, {0x3888a000}, {0x3888c000}, {0x3888e000}, + {0x38890000}, {0x38892000}, {0x38894000}, {0x38896000}, + {0x38898000}, {0x3889a000}, {0x3889c000}, {0x3889e000}, + {0x388a0000}, {0x388a2000}, {0x388a4000}, {0x388a6000}, + {0x388a8000}, {0x388aa000}, {0x388ac000}, {0x388ae000}, + {0x388b0000}, {0x388b2000}, {0x388b4000}, {0x388b6000}, + {0x388b8000}, {0x388ba000}, {0x388bc000}, {0x388be000}, + {0x388c0000}, {0x388c2000}, {0x388c4000}, {0x388c6000}, + {0x388c8000}, {0x388ca000}, {0x388cc000}, {0x388ce000}, + {0x388d0000}, {0x388d2000}, {0x388d4000}, {0x388d6000}, + {0x388d8000}, {0x388da000}, {0x388dc000}, {0x388de000}, + {0x388e0000}, {0x388e2000}, {0x388e4000}, {0x388e6000}, + {0x388e8000}, {0x388ea000}, {0x388ec000}, {0x388ee000}, + {0x388f0000}, {0x388f2000}, {0x388f4000}, {0x388f6000}, + {0x388f8000}, {0x388fa000}, {0x388fc000}, {0x388fe000}, + {0x38900000}, {0x38902000}, {0x38904000}, {0x38906000}, + {0x38908000}, {0x3890a000}, {0x3890c000}, {0x3890e000}, + {0x38910000}, {0x38912000}, {0x38914000}, {0x38916000}, + {0x38918000}, {0x3891a000}, {0x3891c000}, {0x3891e000}, + {0x38920000}, {0x38922000}, {0x38924000}, {0x38926000}, + {0x38928000}, {0x3892a000}, {0x3892c000}, {0x3892e000}, + {0x38930000}, {0x38932000}, {0x38934000}, {0x38936000}, + {0x38938000}, {0x3893a000}, {0x3893c000}, {0x3893e000}, + {0x38940000}, {0x38942000}, {0x38944000}, {0x38946000}, + {0x38948000}, {0x3894a000}, {0x3894c000}, {0x3894e000}, + {0x38950000}, {0x38952000}, {0x38954000}, {0x38956000}, + {0x38958000}, {0x3895a000}, {0x3895c000}, {0x3895e000}, + {0x38960000}, {0x38962000}, {0x38964000}, {0x38966000}, + {0x38968000}, {0x3896a000}, {0x3896c000}, {0x3896e000}, + {0x38970000}, {0x38972000}, {0x38974000}, {0x38976000}, + {0x38978000}, {0x3897a000}, {0x3897c000}, {0x3897e000}, + {0x38980000}, {0x38982000}, {0x38984000}, {0x38986000}, + {0x38988000}, {0x3898a000}, {0x3898c000}, {0x3898e000}, + {0x38990000}, {0x38992000}, {0x38994000}, {0x38996000}, + {0x38998000}, {0x3899a000}, {0x3899c000}, {0x3899e000}, + {0x389a0000}, {0x389a2000}, {0x389a4000}, {0x389a6000}, + {0x389a8000}, {0x389aa000}, {0x389ac000}, {0x389ae000}, + {0x389b0000}, {0x389b2000}, {0x389b4000}, {0x389b6000}, + {0x389b8000}, {0x389ba000}, {0x389bc000}, {0x389be000}, + {0x389c0000}, {0x389c2000}, {0x389c4000}, {0x389c6000}, + {0x389c8000}, {0x389ca000}, {0x389cc000}, {0x389ce000}, + {0x389d0000}, {0x389d2000}, {0x389d4000}, {0x389d6000}, + {0x389d8000}, {0x389da000}, {0x389dc000}, {0x389de000}, + {0x389e0000}, {0x389e2000}, {0x389e4000}, {0x389e6000}, + {0x389e8000}, {0x389ea000}, {0x389ec000}, {0x389ee000}, + {0x389f0000}, {0x389f2000}, {0x389f4000}, {0x389f6000}, + {0x389f8000}, {0x389fa000}, {0x389fc000}, {0x389fe000}, + {0x38a00000}, {0x38a02000}, {0x38a04000}, {0x38a06000}, + {0x38a08000}, {0x38a0a000}, {0x38a0c000}, {0x38a0e000}, + {0x38a10000}, {0x38a12000}, {0x38a14000}, {0x38a16000}, + {0x38a18000}, {0x38a1a000}, {0x38a1c000}, {0x38a1e000}, + {0x38a20000}, {0x38a22000}, {0x38a24000}, {0x38a26000}, + {0x38a28000}, {0x38a2a000}, {0x38a2c000}, {0x38a2e000}, + {0x38a30000}, {0x38a32000}, {0x38a34000}, {0x38a36000}, + {0x38a38000}, {0x38a3a000}, {0x38a3c000}, {0x38a3e000}, + {0x38a40000}, {0x38a42000}, {0x38a44000}, {0x38a46000}, + {0x38a48000}, {0x38a4a000}, {0x38a4c000}, {0x38a4e000}, + {0x38a50000}, {0x38a52000}, {0x38a54000}, {0x38a56000}, + {0x38a58000}, {0x38a5a000}, {0x38a5c000}, {0x38a5e000}, + {0x38a60000}, {0x38a62000}, {0x38a64000}, {0x38a66000}, + {0x38a68000}, {0x38a6a000}, {0x38a6c000}, {0x38a6e000}, + {0x38a70000}, {0x38a72000}, {0x38a74000}, {0x38a76000}, + {0x38a78000}, {0x38a7a000}, {0x38a7c000}, {0x38a7e000}, + {0x38a80000}, {0x38a82000}, {0x38a84000}, {0x38a86000}, + {0x38a88000}, {0x38a8a000}, {0x38a8c000}, {0x38a8e000}, + {0x38a90000}, {0x38a92000}, {0x38a94000}, {0x38a96000}, + {0x38a98000}, {0x38a9a000}, {0x38a9c000}, {0x38a9e000}, + {0x38aa0000}, {0x38aa2000}, {0x38aa4000}, {0x38aa6000}, + {0x38aa8000}, {0x38aaa000}, {0x38aac000}, {0x38aae000}, + {0x38ab0000}, {0x38ab2000}, {0x38ab4000}, {0x38ab6000}, + {0x38ab8000}, {0x38aba000}, {0x38abc000}, {0x38abe000}, + {0x38ac0000}, {0x38ac2000}, {0x38ac4000}, {0x38ac6000}, + {0x38ac8000}, {0x38aca000}, {0x38acc000}, {0x38ace000}, + {0x38ad0000}, {0x38ad2000}, {0x38ad4000}, {0x38ad6000}, + {0x38ad8000}, {0x38ada000}, {0x38adc000}, {0x38ade000}, + {0x38ae0000}, {0x38ae2000}, {0x38ae4000}, {0x38ae6000}, + {0x38ae8000}, {0x38aea000}, {0x38aec000}, {0x38aee000}, + {0x38af0000}, {0x38af2000}, {0x38af4000}, {0x38af6000}, + {0x38af8000}, {0x38afa000}, {0x38afc000}, {0x38afe000}, + {0x38b00000}, {0x38b02000}, {0x38b04000}, {0x38b06000}, + {0x38b08000}, {0x38b0a000}, {0x38b0c000}, {0x38b0e000}, + {0x38b10000}, {0x38b12000}, {0x38b14000}, {0x38b16000}, + {0x38b18000}, {0x38b1a000}, {0x38b1c000}, {0x38b1e000}, + {0x38b20000}, {0x38b22000}, {0x38b24000}, {0x38b26000}, + {0x38b28000}, {0x38b2a000}, {0x38b2c000}, {0x38b2e000}, + {0x38b30000}, {0x38b32000}, {0x38b34000}, {0x38b36000}, + {0x38b38000}, {0x38b3a000}, {0x38b3c000}, {0x38b3e000}, + {0x38b40000}, {0x38b42000}, {0x38b44000}, {0x38b46000}, + {0x38b48000}, {0x38b4a000}, {0x38b4c000}, {0x38b4e000}, + {0x38b50000}, {0x38b52000}, {0x38b54000}, {0x38b56000}, + {0x38b58000}, {0x38b5a000}, {0x38b5c000}, {0x38b5e000}, + {0x38b60000}, {0x38b62000}, {0x38b64000}, {0x38b66000}, + {0x38b68000}, {0x38b6a000}, {0x38b6c000}, {0x38b6e000}, + {0x38b70000}, {0x38b72000}, {0x38b74000}, {0x38b76000}, + {0x38b78000}, {0x38b7a000}, {0x38b7c000}, {0x38b7e000}, + {0x38b80000}, {0x38b82000}, {0x38b84000}, {0x38b86000}, + {0x38b88000}, {0x38b8a000}, {0x38b8c000}, {0x38b8e000}, + {0x38b90000}, {0x38b92000}, {0x38b94000}, {0x38b96000}, + {0x38b98000}, {0x38b9a000}, {0x38b9c000}, {0x38b9e000}, + {0x38ba0000}, {0x38ba2000}, {0x38ba4000}, {0x38ba6000}, + {0x38ba8000}, {0x38baa000}, {0x38bac000}, {0x38bae000}, + {0x38bb0000}, {0x38bb2000}, {0x38bb4000}, {0x38bb6000}, + {0x38bb8000}, {0x38bba000}, {0x38bbc000}, {0x38bbe000}, + {0x38bc0000}, {0x38bc2000}, {0x38bc4000}, {0x38bc6000}, + {0x38bc8000}, {0x38bca000}, {0x38bcc000}, {0x38bce000}, + {0x38bd0000}, {0x38bd2000}, {0x38bd4000}, {0x38bd6000}, + {0x38bd8000}, {0x38bda000}, {0x38bdc000}, {0x38bde000}, + {0x38be0000}, {0x38be2000}, {0x38be4000}, {0x38be6000}, + {0x38be8000}, {0x38bea000}, {0x38bec000}, {0x38bee000}, + {0x38bf0000}, {0x38bf2000}, {0x38bf4000}, {0x38bf6000}, + {0x38bf8000}, {0x38bfa000}, {0x38bfc000}, {0x38bfe000}, + {0x38c00000}, {0x38c02000}, {0x38c04000}, {0x38c06000}, + {0x38c08000}, {0x38c0a000}, {0x38c0c000}, {0x38c0e000}, + {0x38c10000}, {0x38c12000}, {0x38c14000}, {0x38c16000}, + {0x38c18000}, {0x38c1a000}, {0x38c1c000}, {0x38c1e000}, + {0x38c20000}, {0x38c22000}, {0x38c24000}, {0x38c26000}, + {0x38c28000}, {0x38c2a000}, {0x38c2c000}, {0x38c2e000}, + {0x38c30000}, {0x38c32000}, {0x38c34000}, {0x38c36000}, + {0x38c38000}, {0x38c3a000}, {0x38c3c000}, {0x38c3e000}, + {0x38c40000}, {0x38c42000}, {0x38c44000}, {0x38c46000}, + {0x38c48000}, {0x38c4a000}, {0x38c4c000}, {0x38c4e000}, + {0x38c50000}, {0x38c52000}, {0x38c54000}, {0x38c56000}, + {0x38c58000}, {0x38c5a000}, {0x38c5c000}, {0x38c5e000}, + {0x38c60000}, {0x38c62000}, {0x38c64000}, {0x38c66000}, + {0x38c68000}, {0x38c6a000}, {0x38c6c000}, {0x38c6e000}, + {0x38c70000}, {0x38c72000}, {0x38c74000}, {0x38c76000}, + {0x38c78000}, {0x38c7a000}, {0x38c7c000}, {0x38c7e000}, + {0x38c80000}, {0x38c82000}, {0x38c84000}, {0x38c86000}, + {0x38c88000}, {0x38c8a000}, {0x38c8c000}, {0x38c8e000}, + {0x38c90000}, {0x38c92000}, {0x38c94000}, {0x38c96000}, + {0x38c98000}, {0x38c9a000}, {0x38c9c000}, {0x38c9e000}, + {0x38ca0000}, {0x38ca2000}, {0x38ca4000}, {0x38ca6000}, + {0x38ca8000}, {0x38caa000}, {0x38cac000}, {0x38cae000}, + {0x38cb0000}, {0x38cb2000}, {0x38cb4000}, {0x38cb6000}, + {0x38cb8000}, {0x38cba000}, {0x38cbc000}, {0x38cbe000}, + {0x38cc0000}, {0x38cc2000}, {0x38cc4000}, {0x38cc6000}, + {0x38cc8000}, {0x38cca000}, {0x38ccc000}, {0x38cce000}, + {0x38cd0000}, {0x38cd2000}, {0x38cd4000}, {0x38cd6000}, + {0x38cd8000}, {0x38cda000}, {0x38cdc000}, {0x38cde000}, + {0x38ce0000}, {0x38ce2000}, {0x38ce4000}, {0x38ce6000}, + {0x38ce8000}, {0x38cea000}, {0x38cec000}, {0x38cee000}, + {0x38cf0000}, {0x38cf2000}, {0x38cf4000}, {0x38cf6000}, + {0x38cf8000}, {0x38cfa000}, {0x38cfc000}, {0x38cfe000}, + {0x38d00000}, {0x38d02000}, {0x38d04000}, {0x38d06000}, + {0x38d08000}, {0x38d0a000}, {0x38d0c000}, {0x38d0e000}, + {0x38d10000}, {0x38d12000}, {0x38d14000}, {0x38d16000}, + {0x38d18000}, {0x38d1a000}, {0x38d1c000}, {0x38d1e000}, + {0x38d20000}, {0x38d22000}, {0x38d24000}, {0x38d26000}, + {0x38d28000}, {0x38d2a000}, {0x38d2c000}, {0x38d2e000}, + {0x38d30000}, {0x38d32000}, {0x38d34000}, {0x38d36000}, + {0x38d38000}, {0x38d3a000}, {0x38d3c000}, {0x38d3e000}, + {0x38d40000}, {0x38d42000}, {0x38d44000}, {0x38d46000}, + {0x38d48000}, {0x38d4a000}, {0x38d4c000}, {0x38d4e000}, + {0x38d50000}, {0x38d52000}, {0x38d54000}, {0x38d56000}, + {0x38d58000}, {0x38d5a000}, {0x38d5c000}, {0x38d5e000}, + {0x38d60000}, {0x38d62000}, {0x38d64000}, {0x38d66000}, + {0x38d68000}, {0x38d6a000}, {0x38d6c000}, {0x38d6e000}, + {0x38d70000}, {0x38d72000}, {0x38d74000}, {0x38d76000}, + {0x38d78000}, {0x38d7a000}, {0x38d7c000}, {0x38d7e000}, + {0x38d80000}, {0x38d82000}, {0x38d84000}, {0x38d86000}, + {0x38d88000}, {0x38d8a000}, {0x38d8c000}, {0x38d8e000}, + {0x38d90000}, {0x38d92000}, {0x38d94000}, {0x38d96000}, + {0x38d98000}, {0x38d9a000}, {0x38d9c000}, {0x38d9e000}, + {0x38da0000}, {0x38da2000}, {0x38da4000}, {0x38da6000}, + {0x38da8000}, {0x38daa000}, {0x38dac000}, {0x38dae000}, + {0x38db0000}, {0x38db2000}, {0x38db4000}, {0x38db6000}, + {0x38db8000}, {0x38dba000}, {0x38dbc000}, {0x38dbe000}, + {0x38dc0000}, {0x38dc2000}, {0x38dc4000}, {0x38dc6000}, + {0x38dc8000}, {0x38dca000}, {0x38dcc000}, {0x38dce000}, + {0x38dd0000}, {0x38dd2000}, {0x38dd4000}, {0x38dd6000}, + {0x38dd8000}, {0x38dda000}, {0x38ddc000}, {0x38dde000}, + {0x38de0000}, {0x38de2000}, {0x38de4000}, {0x38de6000}, + {0x38de8000}, {0x38dea000}, {0x38dec000}, {0x38dee000}, + {0x38df0000}, {0x38df2000}, {0x38df4000}, {0x38df6000}, + {0x38df8000}, {0x38dfa000}, {0x38dfc000}, {0x38dfe000}, + {0x38e00000}, {0x38e02000}, {0x38e04000}, {0x38e06000}, + {0x38e08000}, {0x38e0a000}, {0x38e0c000}, {0x38e0e000}, + {0x38e10000}, {0x38e12000}, {0x38e14000}, {0x38e16000}, + {0x38e18000}, {0x38e1a000}, {0x38e1c000}, {0x38e1e000}, + {0x38e20000}, {0x38e22000}, {0x38e24000}, {0x38e26000}, + {0x38e28000}, {0x38e2a000}, {0x38e2c000}, {0x38e2e000}, + {0x38e30000}, {0x38e32000}, {0x38e34000}, {0x38e36000}, + {0x38e38000}, {0x38e3a000}, {0x38e3c000}, {0x38e3e000}, + {0x38e40000}, {0x38e42000}, {0x38e44000}, {0x38e46000}, + {0x38e48000}, {0x38e4a000}, {0x38e4c000}, {0x38e4e000}, + {0x38e50000}, {0x38e52000}, {0x38e54000}, {0x38e56000}, + {0x38e58000}, {0x38e5a000}, {0x38e5c000}, {0x38e5e000}, + {0x38e60000}, {0x38e62000}, {0x38e64000}, {0x38e66000}, + {0x38e68000}, {0x38e6a000}, {0x38e6c000}, {0x38e6e000}, + {0x38e70000}, {0x38e72000}, {0x38e74000}, {0x38e76000}, + {0x38e78000}, {0x38e7a000}, {0x38e7c000}, {0x38e7e000}, + {0x38e80000}, {0x38e82000}, {0x38e84000}, {0x38e86000}, + {0x38e88000}, {0x38e8a000}, {0x38e8c000}, {0x38e8e000}, + {0x38e90000}, {0x38e92000}, {0x38e94000}, {0x38e96000}, + {0x38e98000}, {0x38e9a000}, {0x38e9c000}, {0x38e9e000}, + {0x38ea0000}, {0x38ea2000}, {0x38ea4000}, {0x38ea6000}, + {0x38ea8000}, {0x38eaa000}, {0x38eac000}, {0x38eae000}, + {0x38eb0000}, {0x38eb2000}, {0x38eb4000}, {0x38eb6000}, + {0x38eb8000}, {0x38eba000}, {0x38ebc000}, {0x38ebe000}, + {0x38ec0000}, {0x38ec2000}, {0x38ec4000}, {0x38ec6000}, + {0x38ec8000}, {0x38eca000}, {0x38ecc000}, {0x38ece000}, + {0x38ed0000}, {0x38ed2000}, {0x38ed4000}, {0x38ed6000}, + {0x38ed8000}, {0x38eda000}, {0x38edc000}, {0x38ede000}, + {0x38ee0000}, {0x38ee2000}, {0x38ee4000}, {0x38ee6000}, + {0x38ee8000}, {0x38eea000}, {0x38eec000}, {0x38eee000}, + {0x38ef0000}, {0x38ef2000}, {0x38ef4000}, {0x38ef6000}, + {0x38ef8000}, {0x38efa000}, {0x38efc000}, {0x38efe000}, + {0x38f00000}, {0x38f02000}, {0x38f04000}, {0x38f06000}, + {0x38f08000}, {0x38f0a000}, {0x38f0c000}, {0x38f0e000}, + {0x38f10000}, {0x38f12000}, {0x38f14000}, {0x38f16000}, + {0x38f18000}, {0x38f1a000}, {0x38f1c000}, {0x38f1e000}, + {0x38f20000}, {0x38f22000}, {0x38f24000}, {0x38f26000}, + {0x38f28000}, {0x38f2a000}, {0x38f2c000}, {0x38f2e000}, + {0x38f30000}, {0x38f32000}, {0x38f34000}, {0x38f36000}, + {0x38f38000}, {0x38f3a000}, {0x38f3c000}, {0x38f3e000}, + {0x38f40000}, {0x38f42000}, {0x38f44000}, {0x38f46000}, + {0x38f48000}, {0x38f4a000}, {0x38f4c000}, {0x38f4e000}, + {0x38f50000}, {0x38f52000}, {0x38f54000}, {0x38f56000}, + {0x38f58000}, {0x38f5a000}, {0x38f5c000}, {0x38f5e000}, + {0x38f60000}, {0x38f62000}, {0x38f64000}, {0x38f66000}, + {0x38f68000}, {0x38f6a000}, {0x38f6c000}, {0x38f6e000}, + {0x38f70000}, {0x38f72000}, {0x38f74000}, {0x38f76000}, + {0x38f78000}, {0x38f7a000}, {0x38f7c000}, {0x38f7e000}, + {0x38f80000}, {0x38f82000}, {0x38f84000}, {0x38f86000}, + {0x38f88000}, {0x38f8a000}, {0x38f8c000}, {0x38f8e000}, + {0x38f90000}, {0x38f92000}, {0x38f94000}, {0x38f96000}, + {0x38f98000}, {0x38f9a000}, {0x38f9c000}, {0x38f9e000}, + {0x38fa0000}, {0x38fa2000}, {0x38fa4000}, {0x38fa6000}, + {0x38fa8000}, {0x38faa000}, {0x38fac000}, {0x38fae000}, + {0x38fb0000}, {0x38fb2000}, {0x38fb4000}, {0x38fb6000}, + {0x38fb8000}, {0x38fba000}, {0x38fbc000}, {0x38fbe000}, + {0x38fc0000}, {0x38fc2000}, {0x38fc4000}, {0x38fc6000}, + {0x38fc8000}, {0x38fca000}, {0x38fcc000}, {0x38fce000}, + {0x38fd0000}, {0x38fd2000}, {0x38fd4000}, {0x38fd6000}, + {0x38fd8000}, {0x38fda000}, {0x38fdc000}, {0x38fde000}, + {0x38fe0000}, {0x38fe2000}, {0x38fe4000}, {0x38fe6000}, + {0x38fe8000}, {0x38fea000}, {0x38fec000}, {0x38fee000}, + {0x38ff0000}, {0x38ff2000}, {0x38ff4000}, {0x38ff6000}, + {0x38ff8000}, {0x38ffa000}, {0x38ffc000}, {0x38ffe000}, + {0x39000000}, {0x39002000}, {0x39004000}, {0x39006000}, + {0x39008000}, {0x3900a000}, {0x3900c000}, {0x3900e000}, + {0x39010000}, {0x39012000}, {0x39014000}, {0x39016000}, + {0x39018000}, {0x3901a000}, {0x3901c000}, {0x3901e000}, + {0x39020000}, {0x39022000}, {0x39024000}, {0x39026000}, + {0x39028000}, {0x3902a000}, {0x3902c000}, {0x3902e000}, + {0x39030000}, {0x39032000}, {0x39034000}, {0x39036000}, + {0x39038000}, {0x3903a000}, {0x3903c000}, {0x3903e000}, + {0x39040000}, {0x39042000}, {0x39044000}, {0x39046000}, + {0x39048000}, {0x3904a000}, {0x3904c000}, {0x3904e000}, + {0x39050000}, {0x39052000}, {0x39054000}, {0x39056000}, + {0x39058000}, {0x3905a000}, {0x3905c000}, {0x3905e000}, + {0x39060000}, {0x39062000}, {0x39064000}, {0x39066000}, + {0x39068000}, {0x3906a000}, {0x3906c000}, {0x3906e000}, + {0x39070000}, {0x39072000}, {0x39074000}, {0x39076000}, + {0x39078000}, {0x3907a000}, {0x3907c000}, {0x3907e000}, + {0x39080000}, {0x39082000}, {0x39084000}, {0x39086000}, + {0x39088000}, {0x3908a000}, {0x3908c000}, {0x3908e000}, + {0x39090000}, {0x39092000}, {0x39094000}, {0x39096000}, + {0x39098000}, {0x3909a000}, {0x3909c000}, {0x3909e000}, + {0x390a0000}, {0x390a2000}, {0x390a4000}, {0x390a6000}, + {0x390a8000}, {0x390aa000}, {0x390ac000}, {0x390ae000}, + {0x390b0000}, {0x390b2000}, {0x390b4000}, {0x390b6000}, + {0x390b8000}, {0x390ba000}, {0x390bc000}, {0x390be000}, + {0x390c0000}, {0x390c2000}, {0x390c4000}, {0x390c6000}, + {0x390c8000}, {0x390ca000}, {0x390cc000}, {0x390ce000}, + {0x390d0000}, {0x390d2000}, {0x390d4000}, {0x390d6000}, + {0x390d8000}, {0x390da000}, {0x390dc000}, {0x390de000}, + {0x390e0000}, {0x390e2000}, {0x390e4000}, {0x390e6000}, + {0x390e8000}, {0x390ea000}, {0x390ec000}, {0x390ee000}, + {0x390f0000}, {0x390f2000}, {0x390f4000}, {0x390f6000}, + {0x390f8000}, {0x390fa000}, {0x390fc000}, {0x390fe000}, + {0x39100000}, {0x39102000}, {0x39104000}, {0x39106000}, + {0x39108000}, {0x3910a000}, {0x3910c000}, {0x3910e000}, + {0x39110000}, {0x39112000}, {0x39114000}, {0x39116000}, + {0x39118000}, {0x3911a000}, {0x3911c000}, {0x3911e000}, + {0x39120000}, {0x39122000}, {0x39124000}, {0x39126000}, + {0x39128000}, {0x3912a000}, {0x3912c000}, {0x3912e000}, + {0x39130000}, {0x39132000}, {0x39134000}, {0x39136000}, + {0x39138000}, {0x3913a000}, {0x3913c000}, {0x3913e000}, + {0x39140000}, {0x39142000}, {0x39144000}, {0x39146000}, + {0x39148000}, {0x3914a000}, {0x3914c000}, {0x3914e000}, + {0x39150000}, {0x39152000}, {0x39154000}, {0x39156000}, + {0x39158000}, {0x3915a000}, {0x3915c000}, {0x3915e000}, + {0x39160000}, {0x39162000}, {0x39164000}, {0x39166000}, + {0x39168000}, {0x3916a000}, {0x3916c000}, {0x3916e000}, + {0x39170000}, {0x39172000}, {0x39174000}, {0x39176000}, + {0x39178000}, {0x3917a000}, {0x3917c000}, {0x3917e000}, + {0x39180000}, {0x39182000}, {0x39184000}, {0x39186000}, + {0x39188000}, {0x3918a000}, {0x3918c000}, {0x3918e000}, + {0x39190000}, {0x39192000}, {0x39194000}, {0x39196000}, + {0x39198000}, {0x3919a000}, {0x3919c000}, {0x3919e000}, + {0x391a0000}, {0x391a2000}, {0x391a4000}, {0x391a6000}, + {0x391a8000}, {0x391aa000}, {0x391ac000}, {0x391ae000}, + {0x391b0000}, {0x391b2000}, {0x391b4000}, {0x391b6000}, + {0x391b8000}, {0x391ba000}, {0x391bc000}, {0x391be000}, + {0x391c0000}, {0x391c2000}, {0x391c4000}, {0x391c6000}, + {0x391c8000}, {0x391ca000}, {0x391cc000}, {0x391ce000}, + {0x391d0000}, {0x391d2000}, {0x391d4000}, {0x391d6000}, + {0x391d8000}, {0x391da000}, {0x391dc000}, {0x391de000}, + {0x391e0000}, {0x391e2000}, {0x391e4000}, {0x391e6000}, + {0x391e8000}, {0x391ea000}, {0x391ec000}, {0x391ee000}, + {0x391f0000}, {0x391f2000}, {0x391f4000}, {0x391f6000}, + {0x391f8000}, {0x391fa000}, {0x391fc000}, {0x391fe000}, + {0x39200000}, {0x39202000}, {0x39204000}, {0x39206000}, + {0x39208000}, {0x3920a000}, {0x3920c000}, {0x3920e000}, + {0x39210000}, {0x39212000}, {0x39214000}, {0x39216000}, + {0x39218000}, {0x3921a000}, {0x3921c000}, {0x3921e000}, + {0x39220000}, {0x39222000}, {0x39224000}, {0x39226000}, + {0x39228000}, {0x3922a000}, {0x3922c000}, {0x3922e000}, + {0x39230000}, {0x39232000}, {0x39234000}, {0x39236000}, + {0x39238000}, {0x3923a000}, {0x3923c000}, {0x3923e000}, + {0x39240000}, {0x39242000}, {0x39244000}, {0x39246000}, + {0x39248000}, {0x3924a000}, {0x3924c000}, {0x3924e000}, + {0x39250000}, {0x39252000}, {0x39254000}, {0x39256000}, + {0x39258000}, {0x3925a000}, {0x3925c000}, {0x3925e000}, + {0x39260000}, {0x39262000}, {0x39264000}, {0x39266000}, + {0x39268000}, {0x3926a000}, {0x3926c000}, {0x3926e000}, + {0x39270000}, {0x39272000}, {0x39274000}, {0x39276000}, + {0x39278000}, {0x3927a000}, {0x3927c000}, {0x3927e000}, + {0x39280000}, {0x39282000}, {0x39284000}, {0x39286000}, + {0x39288000}, {0x3928a000}, {0x3928c000}, {0x3928e000}, + {0x39290000}, {0x39292000}, {0x39294000}, {0x39296000}, + {0x39298000}, {0x3929a000}, {0x3929c000}, {0x3929e000}, + {0x392a0000}, {0x392a2000}, {0x392a4000}, {0x392a6000}, + {0x392a8000}, {0x392aa000}, {0x392ac000}, {0x392ae000}, + {0x392b0000}, {0x392b2000}, {0x392b4000}, {0x392b6000}, + {0x392b8000}, {0x392ba000}, {0x392bc000}, {0x392be000}, + {0x392c0000}, {0x392c2000}, {0x392c4000}, {0x392c6000}, + {0x392c8000}, {0x392ca000}, {0x392cc000}, {0x392ce000}, + {0x392d0000}, {0x392d2000}, {0x392d4000}, {0x392d6000}, + {0x392d8000}, {0x392da000}, {0x392dc000}, {0x392de000}, + {0x392e0000}, {0x392e2000}, {0x392e4000}, {0x392e6000}, + {0x392e8000}, {0x392ea000}, {0x392ec000}, {0x392ee000}, + {0x392f0000}, {0x392f2000}, {0x392f4000}, {0x392f6000}, + {0x392f8000}, {0x392fa000}, {0x392fc000}, {0x392fe000}, + {0x39300000}, {0x39302000}, {0x39304000}, {0x39306000}, + {0x39308000}, {0x3930a000}, {0x3930c000}, {0x3930e000}, + {0x39310000}, {0x39312000}, {0x39314000}, {0x39316000}, + {0x39318000}, {0x3931a000}, {0x3931c000}, {0x3931e000}, + {0x39320000}, {0x39322000}, {0x39324000}, {0x39326000}, + {0x39328000}, {0x3932a000}, {0x3932c000}, {0x3932e000}, + {0x39330000}, {0x39332000}, {0x39334000}, {0x39336000}, + {0x39338000}, {0x3933a000}, {0x3933c000}, {0x3933e000}, + {0x39340000}, {0x39342000}, {0x39344000}, {0x39346000}, + {0x39348000}, {0x3934a000}, {0x3934c000}, {0x3934e000}, + {0x39350000}, {0x39352000}, {0x39354000}, {0x39356000}, + {0x39358000}, {0x3935a000}, {0x3935c000}, {0x3935e000}, + {0x39360000}, {0x39362000}, {0x39364000}, {0x39366000}, + {0x39368000}, {0x3936a000}, {0x3936c000}, {0x3936e000}, + {0x39370000}, {0x39372000}, {0x39374000}, {0x39376000}, + {0x39378000}, {0x3937a000}, {0x3937c000}, {0x3937e000}, + {0x39380000}, {0x39382000}, {0x39384000}, {0x39386000}, + {0x39388000}, {0x3938a000}, {0x3938c000}, {0x3938e000}, + {0x39390000}, {0x39392000}, {0x39394000}, {0x39396000}, + {0x39398000}, {0x3939a000}, {0x3939c000}, {0x3939e000}, + {0x393a0000}, {0x393a2000}, {0x393a4000}, {0x393a6000}, + {0x393a8000}, {0x393aa000}, {0x393ac000}, {0x393ae000}, + {0x393b0000}, {0x393b2000}, {0x393b4000}, {0x393b6000}, + {0x393b8000}, {0x393ba000}, {0x393bc000}, {0x393be000}, + {0x393c0000}, {0x393c2000}, {0x393c4000}, {0x393c6000}, + {0x393c8000}, {0x393ca000}, {0x393cc000}, {0x393ce000}, + {0x393d0000}, {0x393d2000}, {0x393d4000}, {0x393d6000}, + {0x393d8000}, {0x393da000}, {0x393dc000}, {0x393de000}, + {0x393e0000}, {0x393e2000}, {0x393e4000}, {0x393e6000}, + {0x393e8000}, {0x393ea000}, {0x393ec000}, {0x393ee000}, + {0x393f0000}, {0x393f2000}, {0x393f4000}, {0x393f6000}, + {0x393f8000}, {0x393fa000}, {0x393fc000}, {0x393fe000}, + {0x39400000}, {0x39402000}, {0x39404000}, {0x39406000}, + {0x39408000}, {0x3940a000}, {0x3940c000}, {0x3940e000}, + {0x39410000}, {0x39412000}, {0x39414000}, {0x39416000}, + {0x39418000}, {0x3941a000}, {0x3941c000}, {0x3941e000}, + {0x39420000}, {0x39422000}, {0x39424000}, {0x39426000}, + {0x39428000}, {0x3942a000}, {0x3942c000}, {0x3942e000}, + {0x39430000}, {0x39432000}, {0x39434000}, {0x39436000}, + {0x39438000}, {0x3943a000}, {0x3943c000}, {0x3943e000}, + {0x39440000}, {0x39442000}, {0x39444000}, {0x39446000}, + {0x39448000}, {0x3944a000}, {0x3944c000}, {0x3944e000}, + {0x39450000}, {0x39452000}, {0x39454000}, {0x39456000}, + {0x39458000}, {0x3945a000}, {0x3945c000}, {0x3945e000}, + {0x39460000}, {0x39462000}, {0x39464000}, {0x39466000}, + {0x39468000}, {0x3946a000}, {0x3946c000}, {0x3946e000}, + {0x39470000}, {0x39472000}, {0x39474000}, {0x39476000}, + {0x39478000}, {0x3947a000}, {0x3947c000}, {0x3947e000}, + {0x39480000}, {0x39482000}, {0x39484000}, {0x39486000}, + {0x39488000}, {0x3948a000}, {0x3948c000}, {0x3948e000}, + {0x39490000}, {0x39492000}, {0x39494000}, {0x39496000}, + {0x39498000}, {0x3949a000}, {0x3949c000}, {0x3949e000}, + {0x394a0000}, {0x394a2000}, {0x394a4000}, {0x394a6000}, + {0x394a8000}, {0x394aa000}, {0x394ac000}, {0x394ae000}, + {0x394b0000}, {0x394b2000}, {0x394b4000}, {0x394b6000}, + {0x394b8000}, {0x394ba000}, {0x394bc000}, {0x394be000}, + {0x394c0000}, {0x394c2000}, {0x394c4000}, {0x394c6000}, + {0x394c8000}, {0x394ca000}, {0x394cc000}, {0x394ce000}, + {0x394d0000}, {0x394d2000}, {0x394d4000}, {0x394d6000}, + {0x394d8000}, {0x394da000}, {0x394dc000}, {0x394de000}, + {0x394e0000}, {0x394e2000}, {0x394e4000}, {0x394e6000}, + {0x394e8000}, {0x394ea000}, {0x394ec000}, {0x394ee000}, + {0x394f0000}, {0x394f2000}, {0x394f4000}, {0x394f6000}, + {0x394f8000}, {0x394fa000}, {0x394fc000}, {0x394fe000}, + {0x39500000}, {0x39502000}, {0x39504000}, {0x39506000}, + {0x39508000}, {0x3950a000}, {0x3950c000}, {0x3950e000}, + {0x39510000}, {0x39512000}, {0x39514000}, {0x39516000}, + {0x39518000}, {0x3951a000}, {0x3951c000}, {0x3951e000}, + {0x39520000}, {0x39522000}, {0x39524000}, {0x39526000}, + {0x39528000}, {0x3952a000}, {0x3952c000}, {0x3952e000}, + {0x39530000}, {0x39532000}, {0x39534000}, {0x39536000}, + {0x39538000}, {0x3953a000}, {0x3953c000}, {0x3953e000}, + {0x39540000}, {0x39542000}, {0x39544000}, {0x39546000}, + {0x39548000}, {0x3954a000}, {0x3954c000}, {0x3954e000}, + {0x39550000}, {0x39552000}, {0x39554000}, {0x39556000}, + {0x39558000}, {0x3955a000}, {0x3955c000}, {0x3955e000}, + {0x39560000}, {0x39562000}, {0x39564000}, {0x39566000}, + {0x39568000}, {0x3956a000}, {0x3956c000}, {0x3956e000}, + {0x39570000}, {0x39572000}, {0x39574000}, {0x39576000}, + {0x39578000}, {0x3957a000}, {0x3957c000}, {0x3957e000}, + {0x39580000}, {0x39582000}, {0x39584000}, {0x39586000}, + {0x39588000}, {0x3958a000}, {0x3958c000}, {0x3958e000}, + {0x39590000}, {0x39592000}, {0x39594000}, {0x39596000}, + {0x39598000}, {0x3959a000}, {0x3959c000}, {0x3959e000}, + {0x395a0000}, {0x395a2000}, {0x395a4000}, {0x395a6000}, + {0x395a8000}, {0x395aa000}, {0x395ac000}, {0x395ae000}, + {0x395b0000}, {0x395b2000}, {0x395b4000}, {0x395b6000}, + {0x395b8000}, {0x395ba000}, {0x395bc000}, {0x395be000}, + {0x395c0000}, {0x395c2000}, {0x395c4000}, {0x395c6000}, + {0x395c8000}, {0x395ca000}, {0x395cc000}, {0x395ce000}, + {0x395d0000}, {0x395d2000}, {0x395d4000}, {0x395d6000}, + {0x395d8000}, {0x395da000}, {0x395dc000}, {0x395de000}, + {0x395e0000}, {0x395e2000}, {0x395e4000}, {0x395e6000}, + {0x395e8000}, {0x395ea000}, {0x395ec000}, {0x395ee000}, + {0x395f0000}, {0x395f2000}, {0x395f4000}, {0x395f6000}, + {0x395f8000}, {0x395fa000}, {0x395fc000}, {0x395fe000}, + {0x39600000}, {0x39602000}, {0x39604000}, {0x39606000}, + {0x39608000}, {0x3960a000}, {0x3960c000}, {0x3960e000}, + {0x39610000}, {0x39612000}, {0x39614000}, {0x39616000}, + {0x39618000}, {0x3961a000}, {0x3961c000}, {0x3961e000}, + {0x39620000}, {0x39622000}, {0x39624000}, {0x39626000}, + {0x39628000}, {0x3962a000}, {0x3962c000}, {0x3962e000}, + {0x39630000}, {0x39632000}, {0x39634000}, {0x39636000}, + {0x39638000}, {0x3963a000}, {0x3963c000}, {0x3963e000}, + {0x39640000}, {0x39642000}, {0x39644000}, {0x39646000}, + {0x39648000}, {0x3964a000}, {0x3964c000}, {0x3964e000}, + {0x39650000}, {0x39652000}, {0x39654000}, {0x39656000}, + {0x39658000}, {0x3965a000}, {0x3965c000}, {0x3965e000}, + {0x39660000}, {0x39662000}, {0x39664000}, {0x39666000}, + {0x39668000}, {0x3966a000}, {0x3966c000}, {0x3966e000}, + {0x39670000}, {0x39672000}, {0x39674000}, {0x39676000}, + {0x39678000}, {0x3967a000}, {0x3967c000}, {0x3967e000}, + {0x39680000}, {0x39682000}, {0x39684000}, {0x39686000}, + {0x39688000}, {0x3968a000}, {0x3968c000}, {0x3968e000}, + {0x39690000}, {0x39692000}, {0x39694000}, {0x39696000}, + {0x39698000}, {0x3969a000}, {0x3969c000}, {0x3969e000}, + {0x396a0000}, {0x396a2000}, {0x396a4000}, {0x396a6000}, + {0x396a8000}, {0x396aa000}, {0x396ac000}, {0x396ae000}, + {0x396b0000}, {0x396b2000}, {0x396b4000}, {0x396b6000}, + {0x396b8000}, {0x396ba000}, {0x396bc000}, {0x396be000}, + {0x396c0000}, {0x396c2000}, {0x396c4000}, {0x396c6000}, + {0x396c8000}, {0x396ca000}, {0x396cc000}, {0x396ce000}, + {0x396d0000}, {0x396d2000}, {0x396d4000}, {0x396d6000}, + {0x396d8000}, {0x396da000}, {0x396dc000}, {0x396de000}, + {0x396e0000}, {0x396e2000}, {0x396e4000}, {0x396e6000}, + {0x396e8000}, {0x396ea000}, {0x396ec000}, {0x396ee000}, + {0x396f0000}, {0x396f2000}, {0x396f4000}, {0x396f6000}, + {0x396f8000}, {0x396fa000}, {0x396fc000}, {0x396fe000}, + {0x39700000}, {0x39702000}, {0x39704000}, {0x39706000}, + {0x39708000}, {0x3970a000}, {0x3970c000}, {0x3970e000}, + {0x39710000}, {0x39712000}, {0x39714000}, {0x39716000}, + {0x39718000}, {0x3971a000}, {0x3971c000}, {0x3971e000}, + {0x39720000}, {0x39722000}, {0x39724000}, {0x39726000}, + {0x39728000}, {0x3972a000}, {0x3972c000}, {0x3972e000}, + {0x39730000}, {0x39732000}, {0x39734000}, {0x39736000}, + {0x39738000}, {0x3973a000}, {0x3973c000}, {0x3973e000}, + {0x39740000}, {0x39742000}, {0x39744000}, {0x39746000}, + {0x39748000}, {0x3974a000}, {0x3974c000}, {0x3974e000}, + {0x39750000}, {0x39752000}, {0x39754000}, {0x39756000}, + {0x39758000}, {0x3975a000}, {0x3975c000}, {0x3975e000}, + {0x39760000}, {0x39762000}, {0x39764000}, {0x39766000}, + {0x39768000}, {0x3976a000}, {0x3976c000}, {0x3976e000}, + {0x39770000}, {0x39772000}, {0x39774000}, {0x39776000}, + {0x39778000}, {0x3977a000}, {0x3977c000}, {0x3977e000}, + {0x39780000}, {0x39782000}, {0x39784000}, {0x39786000}, + {0x39788000}, {0x3978a000}, {0x3978c000}, {0x3978e000}, + {0x39790000}, {0x39792000}, {0x39794000}, {0x39796000}, + {0x39798000}, {0x3979a000}, {0x3979c000}, {0x3979e000}, + {0x397a0000}, {0x397a2000}, {0x397a4000}, {0x397a6000}, + {0x397a8000}, {0x397aa000}, {0x397ac000}, {0x397ae000}, + {0x397b0000}, {0x397b2000}, {0x397b4000}, {0x397b6000}, + {0x397b8000}, {0x397ba000}, {0x397bc000}, {0x397be000}, + {0x397c0000}, {0x397c2000}, {0x397c4000}, {0x397c6000}, + {0x397c8000}, {0x397ca000}, {0x397cc000}, {0x397ce000}, + {0x397d0000}, {0x397d2000}, {0x397d4000}, {0x397d6000}, + {0x397d8000}, {0x397da000}, {0x397dc000}, {0x397de000}, + {0x397e0000}, {0x397e2000}, {0x397e4000}, {0x397e6000}, + {0x397e8000}, {0x397ea000}, {0x397ec000}, {0x397ee000}, + {0x397f0000}, {0x397f2000}, {0x397f4000}, {0x397f6000}, + {0x397f8000}, {0x397fa000}, {0x397fc000}, {0x397fe000}, + {0x39800000}, {0x39802000}, {0x39804000}, {0x39806000}, + {0x39808000}, {0x3980a000}, {0x3980c000}, {0x3980e000}, + {0x39810000}, {0x39812000}, {0x39814000}, {0x39816000}, + {0x39818000}, {0x3981a000}, {0x3981c000}, {0x3981e000}, + {0x39820000}, {0x39822000}, {0x39824000}, {0x39826000}, + {0x39828000}, {0x3982a000}, {0x3982c000}, {0x3982e000}, + {0x39830000}, {0x39832000}, {0x39834000}, {0x39836000}, + {0x39838000}, {0x3983a000}, {0x3983c000}, {0x3983e000}, + {0x39840000}, {0x39842000}, {0x39844000}, {0x39846000}, + {0x39848000}, {0x3984a000}, {0x3984c000}, {0x3984e000}, + {0x39850000}, {0x39852000}, {0x39854000}, {0x39856000}, + {0x39858000}, {0x3985a000}, {0x3985c000}, {0x3985e000}, + {0x39860000}, {0x39862000}, {0x39864000}, {0x39866000}, + {0x39868000}, {0x3986a000}, {0x3986c000}, {0x3986e000}, + {0x39870000}, {0x39872000}, {0x39874000}, {0x39876000}, + {0x39878000}, {0x3987a000}, {0x3987c000}, {0x3987e000}, + {0x39880000}, {0x39882000}, {0x39884000}, {0x39886000}, + {0x39888000}, {0x3988a000}, {0x3988c000}, {0x3988e000}, + {0x39890000}, {0x39892000}, {0x39894000}, {0x39896000}, + {0x39898000}, {0x3989a000}, {0x3989c000}, {0x3989e000}, + {0x398a0000}, {0x398a2000}, {0x398a4000}, {0x398a6000}, + {0x398a8000}, {0x398aa000}, {0x398ac000}, {0x398ae000}, + {0x398b0000}, {0x398b2000}, {0x398b4000}, {0x398b6000}, + {0x398b8000}, {0x398ba000}, {0x398bc000}, {0x398be000}, + {0x398c0000}, {0x398c2000}, {0x398c4000}, {0x398c6000}, + {0x398c8000}, {0x398ca000}, {0x398cc000}, {0x398ce000}, + {0x398d0000}, {0x398d2000}, {0x398d4000}, {0x398d6000}, + {0x398d8000}, {0x398da000}, {0x398dc000}, {0x398de000}, + {0x398e0000}, {0x398e2000}, {0x398e4000}, {0x398e6000}, + {0x398e8000}, {0x398ea000}, {0x398ec000}, {0x398ee000}, + {0x398f0000}, {0x398f2000}, {0x398f4000}, {0x398f6000}, + {0x398f8000}, {0x398fa000}, {0x398fc000}, {0x398fe000}, + {0x39900000}, {0x39902000}, {0x39904000}, {0x39906000}, + {0x39908000}, {0x3990a000}, {0x3990c000}, {0x3990e000}, + {0x39910000}, {0x39912000}, {0x39914000}, {0x39916000}, + {0x39918000}, {0x3991a000}, {0x3991c000}, {0x3991e000}, + {0x39920000}, {0x39922000}, {0x39924000}, {0x39926000}, + {0x39928000}, {0x3992a000}, {0x3992c000}, {0x3992e000}, + {0x39930000}, {0x39932000}, {0x39934000}, {0x39936000}, + {0x39938000}, {0x3993a000}, {0x3993c000}, {0x3993e000}, + {0x39940000}, {0x39942000}, {0x39944000}, {0x39946000}, + {0x39948000}, {0x3994a000}, {0x3994c000}, {0x3994e000}, + {0x39950000}, {0x39952000}, {0x39954000}, {0x39956000}, + {0x39958000}, {0x3995a000}, {0x3995c000}, {0x3995e000}, + {0x39960000}, {0x39962000}, {0x39964000}, {0x39966000}, + {0x39968000}, {0x3996a000}, {0x3996c000}, {0x3996e000}, + {0x39970000}, {0x39972000}, {0x39974000}, {0x39976000}, + {0x39978000}, {0x3997a000}, {0x3997c000}, {0x3997e000}, + {0x39980000}, {0x39982000}, {0x39984000}, {0x39986000}, + {0x39988000}, {0x3998a000}, {0x3998c000}, {0x3998e000}, + {0x39990000}, {0x39992000}, {0x39994000}, {0x39996000}, + {0x39998000}, {0x3999a000}, {0x3999c000}, {0x3999e000}, + {0x399a0000}, {0x399a2000}, {0x399a4000}, {0x399a6000}, + {0x399a8000}, {0x399aa000}, {0x399ac000}, {0x399ae000}, + {0x399b0000}, {0x399b2000}, {0x399b4000}, {0x399b6000}, + {0x399b8000}, {0x399ba000}, {0x399bc000}, {0x399be000}, + {0x399c0000}, {0x399c2000}, {0x399c4000}, {0x399c6000}, + {0x399c8000}, {0x399ca000}, {0x399cc000}, {0x399ce000}, + {0x399d0000}, {0x399d2000}, {0x399d4000}, {0x399d6000}, + {0x399d8000}, {0x399da000}, {0x399dc000}, {0x399de000}, + {0x399e0000}, {0x399e2000}, {0x399e4000}, {0x399e6000}, + {0x399e8000}, {0x399ea000}, {0x399ec000}, {0x399ee000}, + {0x399f0000}, {0x399f2000}, {0x399f4000}, {0x399f6000}, + {0x399f8000}, {0x399fa000}, {0x399fc000}, {0x399fe000}, + {0x39a00000}, {0x39a02000}, {0x39a04000}, {0x39a06000}, + {0x39a08000}, {0x39a0a000}, {0x39a0c000}, {0x39a0e000}, + {0x39a10000}, {0x39a12000}, {0x39a14000}, {0x39a16000}, + {0x39a18000}, {0x39a1a000}, {0x39a1c000}, {0x39a1e000}, + {0x39a20000}, {0x39a22000}, {0x39a24000}, {0x39a26000}, + {0x39a28000}, {0x39a2a000}, {0x39a2c000}, {0x39a2e000}, + {0x39a30000}, {0x39a32000}, {0x39a34000}, {0x39a36000}, + {0x39a38000}, {0x39a3a000}, {0x39a3c000}, {0x39a3e000}, + {0x39a40000}, {0x39a42000}, {0x39a44000}, {0x39a46000}, + {0x39a48000}, {0x39a4a000}, {0x39a4c000}, {0x39a4e000}, + {0x39a50000}, {0x39a52000}, {0x39a54000}, {0x39a56000}, + {0x39a58000}, {0x39a5a000}, {0x39a5c000}, {0x39a5e000}, + {0x39a60000}, {0x39a62000}, {0x39a64000}, {0x39a66000}, + {0x39a68000}, {0x39a6a000}, {0x39a6c000}, {0x39a6e000}, + {0x39a70000}, {0x39a72000}, {0x39a74000}, {0x39a76000}, + {0x39a78000}, {0x39a7a000}, {0x39a7c000}, {0x39a7e000}, + {0x39a80000}, {0x39a82000}, {0x39a84000}, {0x39a86000}, + {0x39a88000}, {0x39a8a000}, {0x39a8c000}, {0x39a8e000}, + {0x39a90000}, {0x39a92000}, {0x39a94000}, {0x39a96000}, + {0x39a98000}, {0x39a9a000}, {0x39a9c000}, {0x39a9e000}, + {0x39aa0000}, {0x39aa2000}, {0x39aa4000}, {0x39aa6000}, + {0x39aa8000}, {0x39aaa000}, {0x39aac000}, {0x39aae000}, + {0x39ab0000}, {0x39ab2000}, {0x39ab4000}, {0x39ab6000}, + {0x39ab8000}, {0x39aba000}, {0x39abc000}, {0x39abe000}, + {0x39ac0000}, {0x39ac2000}, {0x39ac4000}, {0x39ac6000}, + {0x39ac8000}, {0x39aca000}, {0x39acc000}, {0x39ace000}, + {0x39ad0000}, {0x39ad2000}, {0x39ad4000}, {0x39ad6000}, + {0x39ad8000}, {0x39ada000}, {0x39adc000}, {0x39ade000}, + {0x39ae0000}, {0x39ae2000}, {0x39ae4000}, {0x39ae6000}, + {0x39ae8000}, {0x39aea000}, {0x39aec000}, {0x39aee000}, + {0x39af0000}, {0x39af2000}, {0x39af4000}, {0x39af6000}, + {0x39af8000}, {0x39afa000}, {0x39afc000}, {0x39afe000}, + {0x39b00000}, {0x39b02000}, {0x39b04000}, {0x39b06000}, + {0x39b08000}, {0x39b0a000}, {0x39b0c000}, {0x39b0e000}, + {0x39b10000}, {0x39b12000}, {0x39b14000}, {0x39b16000}, + {0x39b18000}, {0x39b1a000}, {0x39b1c000}, {0x39b1e000}, + {0x39b20000}, {0x39b22000}, {0x39b24000}, {0x39b26000}, + {0x39b28000}, {0x39b2a000}, {0x39b2c000}, {0x39b2e000}, + {0x39b30000}, {0x39b32000}, {0x39b34000}, {0x39b36000}, + {0x39b38000}, {0x39b3a000}, {0x39b3c000}, {0x39b3e000}, + {0x39b40000}, {0x39b42000}, {0x39b44000}, {0x39b46000}, + {0x39b48000}, {0x39b4a000}, {0x39b4c000}, {0x39b4e000}, + {0x39b50000}, {0x39b52000}, {0x39b54000}, {0x39b56000}, + {0x39b58000}, {0x39b5a000}, {0x39b5c000}, {0x39b5e000}, + {0x39b60000}, {0x39b62000}, {0x39b64000}, {0x39b66000}, + {0x39b68000}, {0x39b6a000}, {0x39b6c000}, {0x39b6e000}, + {0x39b70000}, {0x39b72000}, {0x39b74000}, {0x39b76000}, + {0x39b78000}, {0x39b7a000}, {0x39b7c000}, {0x39b7e000}, + {0x39b80000}, {0x39b82000}, {0x39b84000}, {0x39b86000}, + {0x39b88000}, {0x39b8a000}, {0x39b8c000}, {0x39b8e000}, + {0x39b90000}, {0x39b92000}, {0x39b94000}, {0x39b96000}, + {0x39b98000}, {0x39b9a000}, {0x39b9c000}, {0x39b9e000}, + {0x39ba0000}, {0x39ba2000}, {0x39ba4000}, {0x39ba6000}, + {0x39ba8000}, {0x39baa000}, {0x39bac000}, {0x39bae000}, + {0x39bb0000}, {0x39bb2000}, {0x39bb4000}, {0x39bb6000}, + {0x39bb8000}, {0x39bba000}, {0x39bbc000}, {0x39bbe000}, + {0x39bc0000}, {0x39bc2000}, {0x39bc4000}, {0x39bc6000}, + {0x39bc8000}, {0x39bca000}, {0x39bcc000}, {0x39bce000}, + {0x39bd0000}, {0x39bd2000}, {0x39bd4000}, {0x39bd6000}, + {0x39bd8000}, {0x39bda000}, {0x39bdc000}, {0x39bde000}, + {0x39be0000}, {0x39be2000}, {0x39be4000}, {0x39be6000}, + {0x39be8000}, {0x39bea000}, {0x39bec000}, {0x39bee000}, + {0x39bf0000}, {0x39bf2000}, {0x39bf4000}, {0x39bf6000}, + {0x39bf8000}, {0x39bfa000}, {0x39bfc000}, {0x39bfe000}, + {0x39c00000}, {0x39c02000}, {0x39c04000}, {0x39c06000}, + {0x39c08000}, {0x39c0a000}, {0x39c0c000}, {0x39c0e000}, + {0x39c10000}, {0x39c12000}, {0x39c14000}, {0x39c16000}, + {0x39c18000}, {0x39c1a000}, {0x39c1c000}, {0x39c1e000}, + {0x39c20000}, {0x39c22000}, {0x39c24000}, {0x39c26000}, + {0x39c28000}, {0x39c2a000}, {0x39c2c000}, {0x39c2e000}, + {0x39c30000}, {0x39c32000}, {0x39c34000}, {0x39c36000}, + {0x39c38000}, {0x39c3a000}, {0x39c3c000}, {0x39c3e000}, + {0x39c40000}, {0x39c42000}, {0x39c44000}, {0x39c46000}, + {0x39c48000}, {0x39c4a000}, {0x39c4c000}, {0x39c4e000}, + {0x39c50000}, {0x39c52000}, {0x39c54000}, {0x39c56000}, + {0x39c58000}, {0x39c5a000}, {0x39c5c000}, {0x39c5e000}, + {0x39c60000}, {0x39c62000}, {0x39c64000}, {0x39c66000}, + {0x39c68000}, {0x39c6a000}, {0x39c6c000}, {0x39c6e000}, + {0x39c70000}, {0x39c72000}, {0x39c74000}, {0x39c76000}, + {0x39c78000}, {0x39c7a000}, {0x39c7c000}, {0x39c7e000}, + {0x39c80000}, {0x39c82000}, {0x39c84000}, {0x39c86000}, + {0x39c88000}, {0x39c8a000}, {0x39c8c000}, {0x39c8e000}, + {0x39c90000}, {0x39c92000}, {0x39c94000}, {0x39c96000}, + {0x39c98000}, {0x39c9a000}, {0x39c9c000}, {0x39c9e000}, + {0x39ca0000}, {0x39ca2000}, {0x39ca4000}, {0x39ca6000}, + {0x39ca8000}, {0x39caa000}, {0x39cac000}, {0x39cae000}, + {0x39cb0000}, {0x39cb2000}, {0x39cb4000}, {0x39cb6000}, + {0x39cb8000}, {0x39cba000}, {0x39cbc000}, {0x39cbe000}, + {0x39cc0000}, {0x39cc2000}, {0x39cc4000}, {0x39cc6000}, + {0x39cc8000}, {0x39cca000}, {0x39ccc000}, {0x39cce000}, + {0x39cd0000}, {0x39cd2000}, {0x39cd4000}, {0x39cd6000}, + {0x39cd8000}, {0x39cda000}, {0x39cdc000}, {0x39cde000}, + {0x39ce0000}, {0x39ce2000}, {0x39ce4000}, {0x39ce6000}, + {0x39ce8000}, {0x39cea000}, {0x39cec000}, {0x39cee000}, + {0x39cf0000}, {0x39cf2000}, {0x39cf4000}, {0x39cf6000}, + {0x39cf8000}, {0x39cfa000}, {0x39cfc000}, {0x39cfe000}, + {0x39d00000}, {0x39d02000}, {0x39d04000}, {0x39d06000}, + {0x39d08000}, {0x39d0a000}, {0x39d0c000}, {0x39d0e000}, + {0x39d10000}, {0x39d12000}, {0x39d14000}, {0x39d16000}, + {0x39d18000}, {0x39d1a000}, {0x39d1c000}, {0x39d1e000}, + {0x39d20000}, {0x39d22000}, {0x39d24000}, {0x39d26000}, + {0x39d28000}, {0x39d2a000}, {0x39d2c000}, {0x39d2e000}, + {0x39d30000}, {0x39d32000}, {0x39d34000}, {0x39d36000}, + {0x39d38000}, {0x39d3a000}, {0x39d3c000}, {0x39d3e000}, + {0x39d40000}, {0x39d42000}, {0x39d44000}, {0x39d46000}, + {0x39d48000}, {0x39d4a000}, {0x39d4c000}, {0x39d4e000}, + {0x39d50000}, {0x39d52000}, {0x39d54000}, {0x39d56000}, + {0x39d58000}, {0x39d5a000}, {0x39d5c000}, {0x39d5e000}, + {0x39d60000}, {0x39d62000}, {0x39d64000}, {0x39d66000}, + {0x39d68000}, {0x39d6a000}, {0x39d6c000}, {0x39d6e000}, + {0x39d70000}, {0x39d72000}, {0x39d74000}, {0x39d76000}, + {0x39d78000}, {0x39d7a000}, {0x39d7c000}, {0x39d7e000}, + {0x39d80000}, {0x39d82000}, {0x39d84000}, {0x39d86000}, + {0x39d88000}, {0x39d8a000}, {0x39d8c000}, {0x39d8e000}, + {0x39d90000}, {0x39d92000}, {0x39d94000}, {0x39d96000}, + {0x39d98000}, {0x39d9a000}, {0x39d9c000}, {0x39d9e000}, + {0x39da0000}, {0x39da2000}, {0x39da4000}, {0x39da6000}, + {0x39da8000}, {0x39daa000}, {0x39dac000}, {0x39dae000}, + {0x39db0000}, {0x39db2000}, {0x39db4000}, {0x39db6000}, + {0x39db8000}, {0x39dba000}, {0x39dbc000}, {0x39dbe000}, + {0x39dc0000}, {0x39dc2000}, {0x39dc4000}, {0x39dc6000}, + {0x39dc8000}, {0x39dca000}, {0x39dcc000}, {0x39dce000}, + {0x39dd0000}, {0x39dd2000}, {0x39dd4000}, {0x39dd6000}, + {0x39dd8000}, {0x39dda000}, {0x39ddc000}, {0x39dde000}, + {0x39de0000}, {0x39de2000}, {0x39de4000}, {0x39de6000}, + {0x39de8000}, {0x39dea000}, {0x39dec000}, {0x39dee000}, + {0x39df0000}, {0x39df2000}, {0x39df4000}, {0x39df6000}, + {0x39df8000}, {0x39dfa000}, {0x39dfc000}, {0x39dfe000}, + {0x39e00000}, {0x39e02000}, {0x39e04000}, {0x39e06000}, + {0x39e08000}, {0x39e0a000}, {0x39e0c000}, {0x39e0e000}, + {0x39e10000}, {0x39e12000}, {0x39e14000}, {0x39e16000}, + {0x39e18000}, {0x39e1a000}, {0x39e1c000}, {0x39e1e000}, + {0x39e20000}, {0x39e22000}, {0x39e24000}, {0x39e26000}, + {0x39e28000}, {0x39e2a000}, {0x39e2c000}, {0x39e2e000}, + {0x39e30000}, {0x39e32000}, {0x39e34000}, {0x39e36000}, + {0x39e38000}, {0x39e3a000}, {0x39e3c000}, {0x39e3e000}, + {0x39e40000}, {0x39e42000}, {0x39e44000}, {0x39e46000}, + {0x39e48000}, {0x39e4a000}, {0x39e4c000}, {0x39e4e000}, + {0x39e50000}, {0x39e52000}, {0x39e54000}, {0x39e56000}, + {0x39e58000}, {0x39e5a000}, {0x39e5c000}, {0x39e5e000}, + {0x39e60000}, {0x39e62000}, {0x39e64000}, {0x39e66000}, + {0x39e68000}, {0x39e6a000}, {0x39e6c000}, {0x39e6e000}, + {0x39e70000}, {0x39e72000}, {0x39e74000}, {0x39e76000}, + {0x39e78000}, {0x39e7a000}, {0x39e7c000}, {0x39e7e000}, + {0x39e80000}, {0x39e82000}, {0x39e84000}, {0x39e86000}, + {0x39e88000}, {0x39e8a000}, {0x39e8c000}, {0x39e8e000}, + {0x39e90000}, {0x39e92000}, {0x39e94000}, {0x39e96000}, + {0x39e98000}, {0x39e9a000}, {0x39e9c000}, {0x39e9e000}, + {0x39ea0000}, {0x39ea2000}, {0x39ea4000}, {0x39ea6000}, + {0x39ea8000}, {0x39eaa000}, {0x39eac000}, {0x39eae000}, + {0x39eb0000}, {0x39eb2000}, {0x39eb4000}, {0x39eb6000}, + {0x39eb8000}, {0x39eba000}, {0x39ebc000}, {0x39ebe000}, + {0x39ec0000}, {0x39ec2000}, {0x39ec4000}, {0x39ec6000}, + {0x39ec8000}, {0x39eca000}, {0x39ecc000}, {0x39ece000}, + {0x39ed0000}, {0x39ed2000}, {0x39ed4000}, {0x39ed6000}, + {0x39ed8000}, {0x39eda000}, {0x39edc000}, {0x39ede000}, + {0x39ee0000}, {0x39ee2000}, {0x39ee4000}, {0x39ee6000}, + {0x39ee8000}, {0x39eea000}, {0x39eec000}, {0x39eee000}, + {0x39ef0000}, {0x39ef2000}, {0x39ef4000}, {0x39ef6000}, + {0x39ef8000}, {0x39efa000}, {0x39efc000}, {0x39efe000}, + {0x39f00000}, {0x39f02000}, {0x39f04000}, {0x39f06000}, + {0x39f08000}, {0x39f0a000}, {0x39f0c000}, {0x39f0e000}, + {0x39f10000}, {0x39f12000}, {0x39f14000}, {0x39f16000}, + {0x39f18000}, {0x39f1a000}, {0x39f1c000}, {0x39f1e000}, + {0x39f20000}, {0x39f22000}, {0x39f24000}, {0x39f26000}, + {0x39f28000}, {0x39f2a000}, {0x39f2c000}, {0x39f2e000}, + {0x39f30000}, {0x39f32000}, {0x39f34000}, {0x39f36000}, + {0x39f38000}, {0x39f3a000}, {0x39f3c000}, {0x39f3e000}, + {0x39f40000}, {0x39f42000}, {0x39f44000}, {0x39f46000}, + {0x39f48000}, {0x39f4a000}, {0x39f4c000}, {0x39f4e000}, + {0x39f50000}, {0x39f52000}, {0x39f54000}, {0x39f56000}, + {0x39f58000}, {0x39f5a000}, {0x39f5c000}, {0x39f5e000}, + {0x39f60000}, {0x39f62000}, {0x39f64000}, {0x39f66000}, + {0x39f68000}, {0x39f6a000}, {0x39f6c000}, {0x39f6e000}, + {0x39f70000}, {0x39f72000}, {0x39f74000}, {0x39f76000}, + {0x39f78000}, {0x39f7a000}, {0x39f7c000}, {0x39f7e000}, + {0x39f80000}, {0x39f82000}, {0x39f84000}, {0x39f86000}, + {0x39f88000}, {0x39f8a000}, {0x39f8c000}, {0x39f8e000}, + {0x39f90000}, {0x39f92000}, {0x39f94000}, {0x39f96000}, + {0x39f98000}, {0x39f9a000}, {0x39f9c000}, {0x39f9e000}, + {0x39fa0000}, {0x39fa2000}, {0x39fa4000}, {0x39fa6000}, + {0x39fa8000}, {0x39faa000}, {0x39fac000}, {0x39fae000}, + {0x39fb0000}, {0x39fb2000}, {0x39fb4000}, {0x39fb6000}, + {0x39fb8000}, {0x39fba000}, {0x39fbc000}, {0x39fbe000}, + {0x39fc0000}, {0x39fc2000}, {0x39fc4000}, {0x39fc6000}, + {0x39fc8000}, {0x39fca000}, {0x39fcc000}, {0x39fce000}, + {0x39fd0000}, {0x39fd2000}, {0x39fd4000}, {0x39fd6000}, + {0x39fd8000}, {0x39fda000}, {0x39fdc000}, {0x39fde000}, + {0x39fe0000}, {0x39fe2000}, {0x39fe4000}, {0x39fe6000}, + {0x39fe8000}, {0x39fea000}, {0x39fec000}, {0x39fee000}, + {0x39ff0000}, {0x39ff2000}, {0x39ff4000}, {0x39ff6000}, + {0x39ff8000}, {0x39ffa000}, {0x39ffc000}, {0x39ffe000}, + {0x3a000000}, {0x3a002000}, {0x3a004000}, {0x3a006000}, + {0x3a008000}, {0x3a00a000}, {0x3a00c000}, {0x3a00e000}, + {0x3a010000}, {0x3a012000}, {0x3a014000}, {0x3a016000}, + {0x3a018000}, {0x3a01a000}, {0x3a01c000}, {0x3a01e000}, + {0x3a020000}, {0x3a022000}, {0x3a024000}, {0x3a026000}, + {0x3a028000}, {0x3a02a000}, {0x3a02c000}, {0x3a02e000}, + {0x3a030000}, {0x3a032000}, {0x3a034000}, {0x3a036000}, + {0x3a038000}, {0x3a03a000}, {0x3a03c000}, {0x3a03e000}, + {0x3a040000}, {0x3a042000}, {0x3a044000}, {0x3a046000}, + {0x3a048000}, {0x3a04a000}, {0x3a04c000}, {0x3a04e000}, + {0x3a050000}, {0x3a052000}, {0x3a054000}, {0x3a056000}, + {0x3a058000}, {0x3a05a000}, {0x3a05c000}, {0x3a05e000}, + {0x3a060000}, {0x3a062000}, {0x3a064000}, {0x3a066000}, + {0x3a068000}, {0x3a06a000}, {0x3a06c000}, {0x3a06e000}, + {0x3a070000}, {0x3a072000}, {0x3a074000}, {0x3a076000}, + {0x3a078000}, {0x3a07a000}, {0x3a07c000}, {0x3a07e000}, + {0x3a080000}, {0x3a082000}, {0x3a084000}, {0x3a086000}, + {0x3a088000}, {0x3a08a000}, {0x3a08c000}, {0x3a08e000}, + {0x3a090000}, {0x3a092000}, {0x3a094000}, {0x3a096000}, + {0x3a098000}, {0x3a09a000}, {0x3a09c000}, {0x3a09e000}, + {0x3a0a0000}, {0x3a0a2000}, {0x3a0a4000}, {0x3a0a6000}, + {0x3a0a8000}, {0x3a0aa000}, {0x3a0ac000}, {0x3a0ae000}, + {0x3a0b0000}, {0x3a0b2000}, {0x3a0b4000}, {0x3a0b6000}, + {0x3a0b8000}, {0x3a0ba000}, {0x3a0bc000}, {0x3a0be000}, + {0x3a0c0000}, {0x3a0c2000}, {0x3a0c4000}, {0x3a0c6000}, + {0x3a0c8000}, {0x3a0ca000}, {0x3a0cc000}, {0x3a0ce000}, + {0x3a0d0000}, {0x3a0d2000}, {0x3a0d4000}, {0x3a0d6000}, + {0x3a0d8000}, {0x3a0da000}, {0x3a0dc000}, {0x3a0de000}, + {0x3a0e0000}, {0x3a0e2000}, {0x3a0e4000}, {0x3a0e6000}, + {0x3a0e8000}, {0x3a0ea000}, {0x3a0ec000}, {0x3a0ee000}, + {0x3a0f0000}, {0x3a0f2000}, {0x3a0f4000}, {0x3a0f6000}, + {0x3a0f8000}, {0x3a0fa000}, {0x3a0fc000}, {0x3a0fe000}, + {0x3a100000}, {0x3a102000}, {0x3a104000}, {0x3a106000}, + {0x3a108000}, {0x3a10a000}, {0x3a10c000}, {0x3a10e000}, + {0x3a110000}, {0x3a112000}, {0x3a114000}, {0x3a116000}, + {0x3a118000}, {0x3a11a000}, {0x3a11c000}, {0x3a11e000}, + {0x3a120000}, {0x3a122000}, {0x3a124000}, {0x3a126000}, + {0x3a128000}, {0x3a12a000}, {0x3a12c000}, {0x3a12e000}, + {0x3a130000}, {0x3a132000}, {0x3a134000}, {0x3a136000}, + {0x3a138000}, {0x3a13a000}, {0x3a13c000}, {0x3a13e000}, + {0x3a140000}, {0x3a142000}, {0x3a144000}, {0x3a146000}, + {0x3a148000}, {0x3a14a000}, {0x3a14c000}, {0x3a14e000}, + {0x3a150000}, {0x3a152000}, {0x3a154000}, {0x3a156000}, + {0x3a158000}, {0x3a15a000}, {0x3a15c000}, {0x3a15e000}, + {0x3a160000}, {0x3a162000}, {0x3a164000}, {0x3a166000}, + {0x3a168000}, {0x3a16a000}, {0x3a16c000}, {0x3a16e000}, + {0x3a170000}, {0x3a172000}, {0x3a174000}, {0x3a176000}, + {0x3a178000}, {0x3a17a000}, {0x3a17c000}, {0x3a17e000}, + {0x3a180000}, {0x3a182000}, {0x3a184000}, {0x3a186000}, + {0x3a188000}, {0x3a18a000}, {0x3a18c000}, {0x3a18e000}, + {0x3a190000}, {0x3a192000}, {0x3a194000}, {0x3a196000}, + {0x3a198000}, {0x3a19a000}, {0x3a19c000}, {0x3a19e000}, + {0x3a1a0000}, {0x3a1a2000}, {0x3a1a4000}, {0x3a1a6000}, + {0x3a1a8000}, {0x3a1aa000}, {0x3a1ac000}, {0x3a1ae000}, + {0x3a1b0000}, {0x3a1b2000}, {0x3a1b4000}, {0x3a1b6000}, + {0x3a1b8000}, {0x3a1ba000}, {0x3a1bc000}, {0x3a1be000}, + {0x3a1c0000}, {0x3a1c2000}, {0x3a1c4000}, {0x3a1c6000}, + {0x3a1c8000}, {0x3a1ca000}, {0x3a1cc000}, {0x3a1ce000}, + {0x3a1d0000}, {0x3a1d2000}, {0x3a1d4000}, {0x3a1d6000}, + {0x3a1d8000}, {0x3a1da000}, {0x3a1dc000}, {0x3a1de000}, + {0x3a1e0000}, {0x3a1e2000}, {0x3a1e4000}, {0x3a1e6000}, + {0x3a1e8000}, {0x3a1ea000}, {0x3a1ec000}, {0x3a1ee000}, + {0x3a1f0000}, {0x3a1f2000}, {0x3a1f4000}, {0x3a1f6000}, + {0x3a1f8000}, {0x3a1fa000}, {0x3a1fc000}, {0x3a1fe000}, + {0x3a200000}, {0x3a202000}, {0x3a204000}, {0x3a206000}, + {0x3a208000}, {0x3a20a000}, {0x3a20c000}, {0x3a20e000}, + {0x3a210000}, {0x3a212000}, {0x3a214000}, {0x3a216000}, + {0x3a218000}, {0x3a21a000}, {0x3a21c000}, {0x3a21e000}, + {0x3a220000}, {0x3a222000}, {0x3a224000}, {0x3a226000}, + {0x3a228000}, {0x3a22a000}, {0x3a22c000}, {0x3a22e000}, + {0x3a230000}, {0x3a232000}, {0x3a234000}, {0x3a236000}, + {0x3a238000}, {0x3a23a000}, {0x3a23c000}, {0x3a23e000}, + {0x3a240000}, {0x3a242000}, {0x3a244000}, {0x3a246000}, + {0x3a248000}, {0x3a24a000}, {0x3a24c000}, {0x3a24e000}, + {0x3a250000}, {0x3a252000}, {0x3a254000}, {0x3a256000}, + {0x3a258000}, {0x3a25a000}, {0x3a25c000}, {0x3a25e000}, + {0x3a260000}, {0x3a262000}, {0x3a264000}, {0x3a266000}, + {0x3a268000}, {0x3a26a000}, {0x3a26c000}, {0x3a26e000}, + {0x3a270000}, {0x3a272000}, {0x3a274000}, {0x3a276000}, + {0x3a278000}, {0x3a27a000}, {0x3a27c000}, {0x3a27e000}, + {0x3a280000}, {0x3a282000}, {0x3a284000}, {0x3a286000}, + {0x3a288000}, {0x3a28a000}, {0x3a28c000}, {0x3a28e000}, + {0x3a290000}, {0x3a292000}, {0x3a294000}, {0x3a296000}, + {0x3a298000}, {0x3a29a000}, {0x3a29c000}, {0x3a29e000}, + {0x3a2a0000}, {0x3a2a2000}, {0x3a2a4000}, {0x3a2a6000}, + {0x3a2a8000}, {0x3a2aa000}, {0x3a2ac000}, {0x3a2ae000}, + {0x3a2b0000}, {0x3a2b2000}, {0x3a2b4000}, {0x3a2b6000}, + {0x3a2b8000}, {0x3a2ba000}, {0x3a2bc000}, {0x3a2be000}, + {0x3a2c0000}, {0x3a2c2000}, {0x3a2c4000}, {0x3a2c6000}, + {0x3a2c8000}, {0x3a2ca000}, {0x3a2cc000}, {0x3a2ce000}, + {0x3a2d0000}, {0x3a2d2000}, {0x3a2d4000}, {0x3a2d6000}, + {0x3a2d8000}, {0x3a2da000}, {0x3a2dc000}, {0x3a2de000}, + {0x3a2e0000}, {0x3a2e2000}, {0x3a2e4000}, {0x3a2e6000}, + {0x3a2e8000}, {0x3a2ea000}, {0x3a2ec000}, {0x3a2ee000}, + {0x3a2f0000}, {0x3a2f2000}, {0x3a2f4000}, {0x3a2f6000}, + {0x3a2f8000}, {0x3a2fa000}, {0x3a2fc000}, {0x3a2fe000}, + {0x3a300000}, {0x3a302000}, {0x3a304000}, {0x3a306000}, + {0x3a308000}, {0x3a30a000}, {0x3a30c000}, {0x3a30e000}, + {0x3a310000}, {0x3a312000}, {0x3a314000}, {0x3a316000}, + {0x3a318000}, {0x3a31a000}, {0x3a31c000}, {0x3a31e000}, + {0x3a320000}, {0x3a322000}, {0x3a324000}, {0x3a326000}, + {0x3a328000}, {0x3a32a000}, {0x3a32c000}, {0x3a32e000}, + {0x3a330000}, {0x3a332000}, {0x3a334000}, {0x3a336000}, + {0x3a338000}, {0x3a33a000}, {0x3a33c000}, {0x3a33e000}, + {0x3a340000}, {0x3a342000}, {0x3a344000}, {0x3a346000}, + {0x3a348000}, {0x3a34a000}, {0x3a34c000}, {0x3a34e000}, + {0x3a350000}, {0x3a352000}, {0x3a354000}, {0x3a356000}, + {0x3a358000}, {0x3a35a000}, {0x3a35c000}, {0x3a35e000}, + {0x3a360000}, {0x3a362000}, {0x3a364000}, {0x3a366000}, + {0x3a368000}, {0x3a36a000}, {0x3a36c000}, {0x3a36e000}, + {0x3a370000}, {0x3a372000}, {0x3a374000}, {0x3a376000}, + {0x3a378000}, {0x3a37a000}, {0x3a37c000}, {0x3a37e000}, + {0x3a380000}, {0x3a382000}, {0x3a384000}, {0x3a386000}, + {0x3a388000}, {0x3a38a000}, {0x3a38c000}, {0x3a38e000}, + {0x3a390000}, {0x3a392000}, {0x3a394000}, {0x3a396000}, + {0x3a398000}, {0x3a39a000}, {0x3a39c000}, {0x3a39e000}, + {0x3a3a0000}, {0x3a3a2000}, {0x3a3a4000}, {0x3a3a6000}, + {0x3a3a8000}, {0x3a3aa000}, {0x3a3ac000}, {0x3a3ae000}, + {0x3a3b0000}, {0x3a3b2000}, {0x3a3b4000}, {0x3a3b6000}, + {0x3a3b8000}, {0x3a3ba000}, {0x3a3bc000}, {0x3a3be000}, + {0x3a3c0000}, {0x3a3c2000}, {0x3a3c4000}, {0x3a3c6000}, + {0x3a3c8000}, {0x3a3ca000}, {0x3a3cc000}, {0x3a3ce000}, + {0x3a3d0000}, {0x3a3d2000}, {0x3a3d4000}, {0x3a3d6000}, + {0x3a3d8000}, {0x3a3da000}, {0x3a3dc000}, {0x3a3de000}, + {0x3a3e0000}, {0x3a3e2000}, {0x3a3e4000}, {0x3a3e6000}, + {0x3a3e8000}, {0x3a3ea000}, {0x3a3ec000}, {0x3a3ee000}, + {0x3a3f0000}, {0x3a3f2000}, {0x3a3f4000}, {0x3a3f6000}, + {0x3a3f8000}, {0x3a3fa000}, {0x3a3fc000}, {0x3a3fe000}, + {0x3a400000}, {0x3a402000}, {0x3a404000}, {0x3a406000}, + {0x3a408000}, {0x3a40a000}, {0x3a40c000}, {0x3a40e000}, + {0x3a410000}, {0x3a412000}, {0x3a414000}, {0x3a416000}, + {0x3a418000}, {0x3a41a000}, {0x3a41c000}, {0x3a41e000}, + {0x3a420000}, {0x3a422000}, {0x3a424000}, {0x3a426000}, + {0x3a428000}, {0x3a42a000}, {0x3a42c000}, {0x3a42e000}, + {0x3a430000}, {0x3a432000}, {0x3a434000}, {0x3a436000}, + {0x3a438000}, {0x3a43a000}, {0x3a43c000}, {0x3a43e000}, + {0x3a440000}, {0x3a442000}, {0x3a444000}, {0x3a446000}, + {0x3a448000}, {0x3a44a000}, {0x3a44c000}, {0x3a44e000}, + {0x3a450000}, {0x3a452000}, {0x3a454000}, {0x3a456000}, + {0x3a458000}, {0x3a45a000}, {0x3a45c000}, {0x3a45e000}, + {0x3a460000}, {0x3a462000}, {0x3a464000}, {0x3a466000}, + {0x3a468000}, {0x3a46a000}, {0x3a46c000}, {0x3a46e000}, + {0x3a470000}, {0x3a472000}, {0x3a474000}, {0x3a476000}, + {0x3a478000}, {0x3a47a000}, {0x3a47c000}, {0x3a47e000}, + {0x3a480000}, {0x3a482000}, {0x3a484000}, {0x3a486000}, + {0x3a488000}, {0x3a48a000}, {0x3a48c000}, {0x3a48e000}, + {0x3a490000}, {0x3a492000}, {0x3a494000}, {0x3a496000}, + {0x3a498000}, {0x3a49a000}, {0x3a49c000}, {0x3a49e000}, + {0x3a4a0000}, {0x3a4a2000}, {0x3a4a4000}, {0x3a4a6000}, + {0x3a4a8000}, {0x3a4aa000}, {0x3a4ac000}, {0x3a4ae000}, + {0x3a4b0000}, {0x3a4b2000}, {0x3a4b4000}, {0x3a4b6000}, + {0x3a4b8000}, {0x3a4ba000}, {0x3a4bc000}, {0x3a4be000}, + {0x3a4c0000}, {0x3a4c2000}, {0x3a4c4000}, {0x3a4c6000}, + {0x3a4c8000}, {0x3a4ca000}, {0x3a4cc000}, {0x3a4ce000}, + {0x3a4d0000}, {0x3a4d2000}, {0x3a4d4000}, {0x3a4d6000}, + {0x3a4d8000}, {0x3a4da000}, {0x3a4dc000}, {0x3a4de000}, + {0x3a4e0000}, {0x3a4e2000}, {0x3a4e4000}, {0x3a4e6000}, + {0x3a4e8000}, {0x3a4ea000}, {0x3a4ec000}, {0x3a4ee000}, + {0x3a4f0000}, {0x3a4f2000}, {0x3a4f4000}, {0x3a4f6000}, + {0x3a4f8000}, {0x3a4fa000}, {0x3a4fc000}, {0x3a4fe000}, + {0x3a500000}, {0x3a502000}, {0x3a504000}, {0x3a506000}, + {0x3a508000}, {0x3a50a000}, {0x3a50c000}, {0x3a50e000}, + {0x3a510000}, {0x3a512000}, {0x3a514000}, {0x3a516000}, + {0x3a518000}, {0x3a51a000}, {0x3a51c000}, {0x3a51e000}, + {0x3a520000}, {0x3a522000}, {0x3a524000}, {0x3a526000}, + {0x3a528000}, {0x3a52a000}, {0x3a52c000}, {0x3a52e000}, + {0x3a530000}, {0x3a532000}, {0x3a534000}, {0x3a536000}, + {0x3a538000}, {0x3a53a000}, {0x3a53c000}, {0x3a53e000}, + {0x3a540000}, {0x3a542000}, {0x3a544000}, {0x3a546000}, + {0x3a548000}, {0x3a54a000}, {0x3a54c000}, {0x3a54e000}, + {0x3a550000}, {0x3a552000}, {0x3a554000}, {0x3a556000}, + {0x3a558000}, {0x3a55a000}, {0x3a55c000}, {0x3a55e000}, + {0x3a560000}, {0x3a562000}, {0x3a564000}, {0x3a566000}, + {0x3a568000}, {0x3a56a000}, {0x3a56c000}, {0x3a56e000}, + {0x3a570000}, {0x3a572000}, {0x3a574000}, {0x3a576000}, + {0x3a578000}, {0x3a57a000}, {0x3a57c000}, {0x3a57e000}, + {0x3a580000}, {0x3a582000}, {0x3a584000}, {0x3a586000}, + {0x3a588000}, {0x3a58a000}, {0x3a58c000}, {0x3a58e000}, + {0x3a590000}, {0x3a592000}, {0x3a594000}, {0x3a596000}, + {0x3a598000}, {0x3a59a000}, {0x3a59c000}, {0x3a59e000}, + {0x3a5a0000}, {0x3a5a2000}, {0x3a5a4000}, {0x3a5a6000}, + {0x3a5a8000}, {0x3a5aa000}, {0x3a5ac000}, {0x3a5ae000}, + {0x3a5b0000}, {0x3a5b2000}, {0x3a5b4000}, {0x3a5b6000}, + {0x3a5b8000}, {0x3a5ba000}, {0x3a5bc000}, {0x3a5be000}, + {0x3a5c0000}, {0x3a5c2000}, {0x3a5c4000}, {0x3a5c6000}, + {0x3a5c8000}, {0x3a5ca000}, {0x3a5cc000}, {0x3a5ce000}, + {0x3a5d0000}, {0x3a5d2000}, {0x3a5d4000}, {0x3a5d6000}, + {0x3a5d8000}, {0x3a5da000}, {0x3a5dc000}, {0x3a5de000}, + {0x3a5e0000}, {0x3a5e2000}, {0x3a5e4000}, {0x3a5e6000}, + {0x3a5e8000}, {0x3a5ea000}, {0x3a5ec000}, {0x3a5ee000}, + {0x3a5f0000}, {0x3a5f2000}, {0x3a5f4000}, {0x3a5f6000}, + {0x3a5f8000}, {0x3a5fa000}, {0x3a5fc000}, {0x3a5fe000}, + {0x3a600000}, {0x3a602000}, {0x3a604000}, {0x3a606000}, + {0x3a608000}, {0x3a60a000}, {0x3a60c000}, {0x3a60e000}, + {0x3a610000}, {0x3a612000}, {0x3a614000}, {0x3a616000}, + {0x3a618000}, {0x3a61a000}, {0x3a61c000}, {0x3a61e000}, + {0x3a620000}, {0x3a622000}, {0x3a624000}, {0x3a626000}, + {0x3a628000}, {0x3a62a000}, {0x3a62c000}, {0x3a62e000}, + {0x3a630000}, {0x3a632000}, {0x3a634000}, {0x3a636000}, + {0x3a638000}, {0x3a63a000}, {0x3a63c000}, {0x3a63e000}, + {0x3a640000}, {0x3a642000}, {0x3a644000}, {0x3a646000}, + {0x3a648000}, {0x3a64a000}, {0x3a64c000}, {0x3a64e000}, + {0x3a650000}, {0x3a652000}, {0x3a654000}, {0x3a656000}, + {0x3a658000}, {0x3a65a000}, {0x3a65c000}, {0x3a65e000}, + {0x3a660000}, {0x3a662000}, {0x3a664000}, {0x3a666000}, + {0x3a668000}, {0x3a66a000}, {0x3a66c000}, {0x3a66e000}, + {0x3a670000}, {0x3a672000}, {0x3a674000}, {0x3a676000}, + {0x3a678000}, {0x3a67a000}, {0x3a67c000}, {0x3a67e000}, + {0x3a680000}, {0x3a682000}, {0x3a684000}, {0x3a686000}, + {0x3a688000}, {0x3a68a000}, {0x3a68c000}, {0x3a68e000}, + {0x3a690000}, {0x3a692000}, {0x3a694000}, {0x3a696000}, + {0x3a698000}, {0x3a69a000}, {0x3a69c000}, {0x3a69e000}, + {0x3a6a0000}, {0x3a6a2000}, {0x3a6a4000}, {0x3a6a6000}, + {0x3a6a8000}, {0x3a6aa000}, {0x3a6ac000}, {0x3a6ae000}, + {0x3a6b0000}, {0x3a6b2000}, {0x3a6b4000}, {0x3a6b6000}, + {0x3a6b8000}, {0x3a6ba000}, {0x3a6bc000}, {0x3a6be000}, + {0x3a6c0000}, {0x3a6c2000}, {0x3a6c4000}, {0x3a6c6000}, + {0x3a6c8000}, {0x3a6ca000}, {0x3a6cc000}, {0x3a6ce000}, + {0x3a6d0000}, {0x3a6d2000}, {0x3a6d4000}, {0x3a6d6000}, + {0x3a6d8000}, {0x3a6da000}, {0x3a6dc000}, {0x3a6de000}, + {0x3a6e0000}, {0x3a6e2000}, {0x3a6e4000}, {0x3a6e6000}, + {0x3a6e8000}, {0x3a6ea000}, {0x3a6ec000}, {0x3a6ee000}, + {0x3a6f0000}, {0x3a6f2000}, {0x3a6f4000}, {0x3a6f6000}, + {0x3a6f8000}, {0x3a6fa000}, {0x3a6fc000}, {0x3a6fe000}, + {0x3a700000}, {0x3a702000}, {0x3a704000}, {0x3a706000}, + {0x3a708000}, {0x3a70a000}, {0x3a70c000}, {0x3a70e000}, + {0x3a710000}, {0x3a712000}, {0x3a714000}, {0x3a716000}, + {0x3a718000}, {0x3a71a000}, {0x3a71c000}, {0x3a71e000}, + {0x3a720000}, {0x3a722000}, {0x3a724000}, {0x3a726000}, + {0x3a728000}, {0x3a72a000}, {0x3a72c000}, {0x3a72e000}, + {0x3a730000}, {0x3a732000}, {0x3a734000}, {0x3a736000}, + {0x3a738000}, {0x3a73a000}, {0x3a73c000}, {0x3a73e000}, + {0x3a740000}, {0x3a742000}, {0x3a744000}, {0x3a746000}, + {0x3a748000}, {0x3a74a000}, {0x3a74c000}, {0x3a74e000}, + {0x3a750000}, {0x3a752000}, {0x3a754000}, {0x3a756000}, + {0x3a758000}, {0x3a75a000}, {0x3a75c000}, {0x3a75e000}, + {0x3a760000}, {0x3a762000}, {0x3a764000}, {0x3a766000}, + {0x3a768000}, {0x3a76a000}, {0x3a76c000}, {0x3a76e000}, + {0x3a770000}, {0x3a772000}, {0x3a774000}, {0x3a776000}, + {0x3a778000}, {0x3a77a000}, {0x3a77c000}, {0x3a77e000}, + {0x3a780000}, {0x3a782000}, {0x3a784000}, {0x3a786000}, + {0x3a788000}, {0x3a78a000}, {0x3a78c000}, {0x3a78e000}, + {0x3a790000}, {0x3a792000}, {0x3a794000}, {0x3a796000}, + {0x3a798000}, {0x3a79a000}, {0x3a79c000}, {0x3a79e000}, + {0x3a7a0000}, {0x3a7a2000}, {0x3a7a4000}, {0x3a7a6000}, + {0x3a7a8000}, {0x3a7aa000}, {0x3a7ac000}, {0x3a7ae000}, + {0x3a7b0000}, {0x3a7b2000}, {0x3a7b4000}, {0x3a7b6000}, + {0x3a7b8000}, {0x3a7ba000}, {0x3a7bc000}, {0x3a7be000}, + {0x3a7c0000}, {0x3a7c2000}, {0x3a7c4000}, {0x3a7c6000}, + {0x3a7c8000}, {0x3a7ca000}, {0x3a7cc000}, {0x3a7ce000}, + {0x3a7d0000}, {0x3a7d2000}, {0x3a7d4000}, {0x3a7d6000}, + {0x3a7d8000}, {0x3a7da000}, {0x3a7dc000}, {0x3a7de000}, + {0x3a7e0000}, {0x3a7e2000}, {0x3a7e4000}, {0x3a7e6000}, + {0x3a7e8000}, {0x3a7ea000}, {0x3a7ec000}, {0x3a7ee000}, + {0x3a7f0000}, {0x3a7f2000}, {0x3a7f4000}, {0x3a7f6000}, + {0x3a7f8000}, {0x3a7fa000}, {0x3a7fc000}, {0x3a7fe000}, + {0x3a800000}, {0x3a802000}, {0x3a804000}, {0x3a806000}, + {0x3a808000}, {0x3a80a000}, {0x3a80c000}, {0x3a80e000}, + {0x3a810000}, {0x3a812000}, {0x3a814000}, {0x3a816000}, + {0x3a818000}, {0x3a81a000}, {0x3a81c000}, {0x3a81e000}, + {0x3a820000}, {0x3a822000}, {0x3a824000}, {0x3a826000}, + {0x3a828000}, {0x3a82a000}, {0x3a82c000}, {0x3a82e000}, + {0x3a830000}, {0x3a832000}, {0x3a834000}, {0x3a836000}, + {0x3a838000}, {0x3a83a000}, {0x3a83c000}, {0x3a83e000}, + {0x3a840000}, {0x3a842000}, {0x3a844000}, {0x3a846000}, + {0x3a848000}, {0x3a84a000}, {0x3a84c000}, {0x3a84e000}, + {0x3a850000}, {0x3a852000}, {0x3a854000}, {0x3a856000}, + {0x3a858000}, {0x3a85a000}, {0x3a85c000}, {0x3a85e000}, + {0x3a860000}, {0x3a862000}, {0x3a864000}, {0x3a866000}, + {0x3a868000}, {0x3a86a000}, {0x3a86c000}, {0x3a86e000}, + {0x3a870000}, {0x3a872000}, {0x3a874000}, {0x3a876000}, + {0x3a878000}, {0x3a87a000}, {0x3a87c000}, {0x3a87e000}, + {0x3a880000}, {0x3a882000}, {0x3a884000}, {0x3a886000}, + {0x3a888000}, {0x3a88a000}, {0x3a88c000}, {0x3a88e000}, + {0x3a890000}, {0x3a892000}, {0x3a894000}, {0x3a896000}, + {0x3a898000}, {0x3a89a000}, {0x3a89c000}, {0x3a89e000}, + {0x3a8a0000}, {0x3a8a2000}, {0x3a8a4000}, {0x3a8a6000}, + {0x3a8a8000}, {0x3a8aa000}, {0x3a8ac000}, {0x3a8ae000}, + {0x3a8b0000}, {0x3a8b2000}, {0x3a8b4000}, {0x3a8b6000}, + {0x3a8b8000}, {0x3a8ba000}, {0x3a8bc000}, {0x3a8be000}, + {0x3a8c0000}, {0x3a8c2000}, {0x3a8c4000}, {0x3a8c6000}, + {0x3a8c8000}, {0x3a8ca000}, {0x3a8cc000}, {0x3a8ce000}, + {0x3a8d0000}, {0x3a8d2000}, {0x3a8d4000}, {0x3a8d6000}, + {0x3a8d8000}, {0x3a8da000}, {0x3a8dc000}, {0x3a8de000}, + {0x3a8e0000}, {0x3a8e2000}, {0x3a8e4000}, {0x3a8e6000}, + {0x3a8e8000}, {0x3a8ea000}, {0x3a8ec000}, {0x3a8ee000}, + {0x3a8f0000}, {0x3a8f2000}, {0x3a8f4000}, {0x3a8f6000}, + {0x3a8f8000}, {0x3a8fa000}, {0x3a8fc000}, {0x3a8fe000}, + {0x3a900000}, {0x3a902000}, {0x3a904000}, {0x3a906000}, + {0x3a908000}, {0x3a90a000}, {0x3a90c000}, {0x3a90e000}, + {0x3a910000}, {0x3a912000}, {0x3a914000}, {0x3a916000}, + {0x3a918000}, {0x3a91a000}, {0x3a91c000}, {0x3a91e000}, + {0x3a920000}, {0x3a922000}, {0x3a924000}, {0x3a926000}, + {0x3a928000}, {0x3a92a000}, {0x3a92c000}, {0x3a92e000}, + {0x3a930000}, {0x3a932000}, {0x3a934000}, {0x3a936000}, + {0x3a938000}, {0x3a93a000}, {0x3a93c000}, {0x3a93e000}, + {0x3a940000}, {0x3a942000}, {0x3a944000}, {0x3a946000}, + {0x3a948000}, {0x3a94a000}, {0x3a94c000}, {0x3a94e000}, + {0x3a950000}, {0x3a952000}, {0x3a954000}, {0x3a956000}, + {0x3a958000}, {0x3a95a000}, {0x3a95c000}, {0x3a95e000}, + {0x3a960000}, {0x3a962000}, {0x3a964000}, {0x3a966000}, + {0x3a968000}, {0x3a96a000}, {0x3a96c000}, {0x3a96e000}, + {0x3a970000}, {0x3a972000}, {0x3a974000}, {0x3a976000}, + {0x3a978000}, {0x3a97a000}, {0x3a97c000}, {0x3a97e000}, + {0x3a980000}, {0x3a982000}, {0x3a984000}, {0x3a986000}, + {0x3a988000}, {0x3a98a000}, {0x3a98c000}, {0x3a98e000}, + {0x3a990000}, {0x3a992000}, {0x3a994000}, {0x3a996000}, + {0x3a998000}, {0x3a99a000}, {0x3a99c000}, {0x3a99e000}, + {0x3a9a0000}, {0x3a9a2000}, {0x3a9a4000}, {0x3a9a6000}, + {0x3a9a8000}, {0x3a9aa000}, {0x3a9ac000}, {0x3a9ae000}, + {0x3a9b0000}, {0x3a9b2000}, {0x3a9b4000}, {0x3a9b6000}, + {0x3a9b8000}, {0x3a9ba000}, {0x3a9bc000}, {0x3a9be000}, + {0x3a9c0000}, {0x3a9c2000}, {0x3a9c4000}, {0x3a9c6000}, + {0x3a9c8000}, {0x3a9ca000}, {0x3a9cc000}, {0x3a9ce000}, + {0x3a9d0000}, {0x3a9d2000}, {0x3a9d4000}, {0x3a9d6000}, + {0x3a9d8000}, {0x3a9da000}, {0x3a9dc000}, {0x3a9de000}, + {0x3a9e0000}, {0x3a9e2000}, {0x3a9e4000}, {0x3a9e6000}, + {0x3a9e8000}, {0x3a9ea000}, {0x3a9ec000}, {0x3a9ee000}, + {0x3a9f0000}, {0x3a9f2000}, {0x3a9f4000}, {0x3a9f6000}, + {0x3a9f8000}, {0x3a9fa000}, {0x3a9fc000}, {0x3a9fe000}, + {0x3aa00000}, {0x3aa02000}, {0x3aa04000}, {0x3aa06000}, + {0x3aa08000}, {0x3aa0a000}, {0x3aa0c000}, {0x3aa0e000}, + {0x3aa10000}, {0x3aa12000}, {0x3aa14000}, {0x3aa16000}, + {0x3aa18000}, {0x3aa1a000}, {0x3aa1c000}, {0x3aa1e000}, + {0x3aa20000}, {0x3aa22000}, {0x3aa24000}, {0x3aa26000}, + {0x3aa28000}, {0x3aa2a000}, {0x3aa2c000}, {0x3aa2e000}, + {0x3aa30000}, {0x3aa32000}, {0x3aa34000}, {0x3aa36000}, + {0x3aa38000}, {0x3aa3a000}, {0x3aa3c000}, {0x3aa3e000}, + {0x3aa40000}, {0x3aa42000}, {0x3aa44000}, {0x3aa46000}, + {0x3aa48000}, {0x3aa4a000}, {0x3aa4c000}, {0x3aa4e000}, + {0x3aa50000}, {0x3aa52000}, {0x3aa54000}, {0x3aa56000}, + {0x3aa58000}, {0x3aa5a000}, {0x3aa5c000}, {0x3aa5e000}, + {0x3aa60000}, {0x3aa62000}, {0x3aa64000}, {0x3aa66000}, + {0x3aa68000}, {0x3aa6a000}, {0x3aa6c000}, {0x3aa6e000}, + {0x3aa70000}, {0x3aa72000}, {0x3aa74000}, {0x3aa76000}, + {0x3aa78000}, {0x3aa7a000}, {0x3aa7c000}, {0x3aa7e000}, + {0x3aa80000}, {0x3aa82000}, {0x3aa84000}, {0x3aa86000}, + {0x3aa88000}, {0x3aa8a000}, {0x3aa8c000}, {0x3aa8e000}, + {0x3aa90000}, {0x3aa92000}, {0x3aa94000}, {0x3aa96000}, + {0x3aa98000}, {0x3aa9a000}, {0x3aa9c000}, {0x3aa9e000}, + {0x3aaa0000}, {0x3aaa2000}, {0x3aaa4000}, {0x3aaa6000}, + {0x3aaa8000}, {0x3aaaa000}, {0x3aaac000}, {0x3aaae000}, + {0x3aab0000}, {0x3aab2000}, {0x3aab4000}, {0x3aab6000}, + {0x3aab8000}, {0x3aaba000}, {0x3aabc000}, {0x3aabe000}, + {0x3aac0000}, {0x3aac2000}, {0x3aac4000}, {0x3aac6000}, + {0x3aac8000}, {0x3aaca000}, {0x3aacc000}, {0x3aace000}, + {0x3aad0000}, {0x3aad2000}, {0x3aad4000}, {0x3aad6000}, + {0x3aad8000}, {0x3aada000}, {0x3aadc000}, {0x3aade000}, + {0x3aae0000}, {0x3aae2000}, {0x3aae4000}, {0x3aae6000}, + {0x3aae8000}, {0x3aaea000}, {0x3aaec000}, {0x3aaee000}, + {0x3aaf0000}, {0x3aaf2000}, {0x3aaf4000}, {0x3aaf6000}, + {0x3aaf8000}, {0x3aafa000}, {0x3aafc000}, {0x3aafe000}, + {0x3ab00000}, {0x3ab02000}, {0x3ab04000}, {0x3ab06000}, + {0x3ab08000}, {0x3ab0a000}, {0x3ab0c000}, {0x3ab0e000}, + {0x3ab10000}, {0x3ab12000}, {0x3ab14000}, {0x3ab16000}, + {0x3ab18000}, {0x3ab1a000}, {0x3ab1c000}, {0x3ab1e000}, + {0x3ab20000}, {0x3ab22000}, {0x3ab24000}, {0x3ab26000}, + {0x3ab28000}, {0x3ab2a000}, {0x3ab2c000}, {0x3ab2e000}, + {0x3ab30000}, {0x3ab32000}, {0x3ab34000}, {0x3ab36000}, + {0x3ab38000}, {0x3ab3a000}, {0x3ab3c000}, {0x3ab3e000}, + {0x3ab40000}, {0x3ab42000}, {0x3ab44000}, {0x3ab46000}, + {0x3ab48000}, {0x3ab4a000}, {0x3ab4c000}, {0x3ab4e000}, + {0x3ab50000}, {0x3ab52000}, {0x3ab54000}, {0x3ab56000}, + {0x3ab58000}, {0x3ab5a000}, {0x3ab5c000}, {0x3ab5e000}, + {0x3ab60000}, {0x3ab62000}, {0x3ab64000}, {0x3ab66000}, + {0x3ab68000}, {0x3ab6a000}, {0x3ab6c000}, {0x3ab6e000}, + {0x3ab70000}, {0x3ab72000}, {0x3ab74000}, {0x3ab76000}, + {0x3ab78000}, {0x3ab7a000}, {0x3ab7c000}, {0x3ab7e000}, + {0x3ab80000}, {0x3ab82000}, {0x3ab84000}, {0x3ab86000}, + {0x3ab88000}, {0x3ab8a000}, {0x3ab8c000}, {0x3ab8e000}, + {0x3ab90000}, {0x3ab92000}, {0x3ab94000}, {0x3ab96000}, + {0x3ab98000}, {0x3ab9a000}, {0x3ab9c000}, {0x3ab9e000}, + {0x3aba0000}, {0x3aba2000}, {0x3aba4000}, {0x3aba6000}, + {0x3aba8000}, {0x3abaa000}, {0x3abac000}, {0x3abae000}, + {0x3abb0000}, {0x3abb2000}, {0x3abb4000}, {0x3abb6000}, + {0x3abb8000}, {0x3abba000}, {0x3abbc000}, {0x3abbe000}, + {0x3abc0000}, {0x3abc2000}, {0x3abc4000}, {0x3abc6000}, + {0x3abc8000}, {0x3abca000}, {0x3abcc000}, {0x3abce000}, + {0x3abd0000}, {0x3abd2000}, {0x3abd4000}, {0x3abd6000}, + {0x3abd8000}, {0x3abda000}, {0x3abdc000}, {0x3abde000}, + {0x3abe0000}, {0x3abe2000}, {0x3abe4000}, {0x3abe6000}, + {0x3abe8000}, {0x3abea000}, {0x3abec000}, {0x3abee000}, + {0x3abf0000}, {0x3abf2000}, {0x3abf4000}, {0x3abf6000}, + {0x3abf8000}, {0x3abfa000}, {0x3abfc000}, {0x3abfe000}, + {0x3ac00000}, {0x3ac02000}, {0x3ac04000}, {0x3ac06000}, + {0x3ac08000}, {0x3ac0a000}, {0x3ac0c000}, {0x3ac0e000}, + {0x3ac10000}, {0x3ac12000}, {0x3ac14000}, {0x3ac16000}, + {0x3ac18000}, {0x3ac1a000}, {0x3ac1c000}, {0x3ac1e000}, + {0x3ac20000}, {0x3ac22000}, {0x3ac24000}, {0x3ac26000}, + {0x3ac28000}, {0x3ac2a000}, {0x3ac2c000}, {0x3ac2e000}, + {0x3ac30000}, {0x3ac32000}, {0x3ac34000}, {0x3ac36000}, + {0x3ac38000}, {0x3ac3a000}, {0x3ac3c000}, {0x3ac3e000}, + {0x3ac40000}, {0x3ac42000}, {0x3ac44000}, {0x3ac46000}, + {0x3ac48000}, {0x3ac4a000}, {0x3ac4c000}, {0x3ac4e000}, + {0x3ac50000}, {0x3ac52000}, {0x3ac54000}, {0x3ac56000}, + {0x3ac58000}, {0x3ac5a000}, {0x3ac5c000}, {0x3ac5e000}, + {0x3ac60000}, {0x3ac62000}, {0x3ac64000}, {0x3ac66000}, + {0x3ac68000}, {0x3ac6a000}, {0x3ac6c000}, {0x3ac6e000}, + {0x3ac70000}, {0x3ac72000}, {0x3ac74000}, {0x3ac76000}, + {0x3ac78000}, {0x3ac7a000}, {0x3ac7c000}, {0x3ac7e000}, + {0x3ac80000}, {0x3ac82000}, {0x3ac84000}, {0x3ac86000}, + {0x3ac88000}, {0x3ac8a000}, {0x3ac8c000}, {0x3ac8e000}, + {0x3ac90000}, {0x3ac92000}, {0x3ac94000}, {0x3ac96000}, + {0x3ac98000}, {0x3ac9a000}, {0x3ac9c000}, {0x3ac9e000}, + {0x3aca0000}, {0x3aca2000}, {0x3aca4000}, {0x3aca6000}, + {0x3aca8000}, {0x3acaa000}, {0x3acac000}, {0x3acae000}, + {0x3acb0000}, {0x3acb2000}, {0x3acb4000}, {0x3acb6000}, + {0x3acb8000}, {0x3acba000}, {0x3acbc000}, {0x3acbe000}, + {0x3acc0000}, {0x3acc2000}, {0x3acc4000}, {0x3acc6000}, + {0x3acc8000}, {0x3acca000}, {0x3accc000}, {0x3acce000}, + {0x3acd0000}, {0x3acd2000}, {0x3acd4000}, {0x3acd6000}, + {0x3acd8000}, {0x3acda000}, {0x3acdc000}, {0x3acde000}, + {0x3ace0000}, {0x3ace2000}, {0x3ace4000}, {0x3ace6000}, + {0x3ace8000}, {0x3acea000}, {0x3acec000}, {0x3acee000}, + {0x3acf0000}, {0x3acf2000}, {0x3acf4000}, {0x3acf6000}, + {0x3acf8000}, {0x3acfa000}, {0x3acfc000}, {0x3acfe000}, + {0x3ad00000}, {0x3ad02000}, {0x3ad04000}, {0x3ad06000}, + {0x3ad08000}, {0x3ad0a000}, {0x3ad0c000}, {0x3ad0e000}, + {0x3ad10000}, {0x3ad12000}, {0x3ad14000}, {0x3ad16000}, + {0x3ad18000}, {0x3ad1a000}, {0x3ad1c000}, {0x3ad1e000}, + {0x3ad20000}, {0x3ad22000}, {0x3ad24000}, {0x3ad26000}, + {0x3ad28000}, {0x3ad2a000}, {0x3ad2c000}, {0x3ad2e000}, + {0x3ad30000}, {0x3ad32000}, {0x3ad34000}, {0x3ad36000}, + {0x3ad38000}, {0x3ad3a000}, {0x3ad3c000}, {0x3ad3e000}, + {0x3ad40000}, {0x3ad42000}, {0x3ad44000}, {0x3ad46000}, + {0x3ad48000}, {0x3ad4a000}, {0x3ad4c000}, {0x3ad4e000}, + {0x3ad50000}, {0x3ad52000}, {0x3ad54000}, {0x3ad56000}, + {0x3ad58000}, {0x3ad5a000}, {0x3ad5c000}, {0x3ad5e000}, + {0x3ad60000}, {0x3ad62000}, {0x3ad64000}, {0x3ad66000}, + {0x3ad68000}, {0x3ad6a000}, {0x3ad6c000}, {0x3ad6e000}, + {0x3ad70000}, {0x3ad72000}, {0x3ad74000}, {0x3ad76000}, + {0x3ad78000}, {0x3ad7a000}, {0x3ad7c000}, {0x3ad7e000}, + {0x3ad80000}, {0x3ad82000}, {0x3ad84000}, {0x3ad86000}, + {0x3ad88000}, {0x3ad8a000}, {0x3ad8c000}, {0x3ad8e000}, + {0x3ad90000}, {0x3ad92000}, {0x3ad94000}, {0x3ad96000}, + {0x3ad98000}, {0x3ad9a000}, {0x3ad9c000}, {0x3ad9e000}, + {0x3ada0000}, {0x3ada2000}, {0x3ada4000}, {0x3ada6000}, + {0x3ada8000}, {0x3adaa000}, {0x3adac000}, {0x3adae000}, + {0x3adb0000}, {0x3adb2000}, {0x3adb4000}, {0x3adb6000}, + {0x3adb8000}, {0x3adba000}, {0x3adbc000}, {0x3adbe000}, + {0x3adc0000}, {0x3adc2000}, {0x3adc4000}, {0x3adc6000}, + {0x3adc8000}, {0x3adca000}, {0x3adcc000}, {0x3adce000}, + {0x3add0000}, {0x3add2000}, {0x3add4000}, {0x3add6000}, + {0x3add8000}, {0x3adda000}, {0x3addc000}, {0x3adde000}, + {0x3ade0000}, {0x3ade2000}, {0x3ade4000}, {0x3ade6000}, + {0x3ade8000}, {0x3adea000}, {0x3adec000}, {0x3adee000}, + {0x3adf0000}, {0x3adf2000}, {0x3adf4000}, {0x3adf6000}, + {0x3adf8000}, {0x3adfa000}, {0x3adfc000}, {0x3adfe000}, + {0x3ae00000}, {0x3ae02000}, {0x3ae04000}, {0x3ae06000}, + {0x3ae08000}, {0x3ae0a000}, {0x3ae0c000}, {0x3ae0e000}, + {0x3ae10000}, {0x3ae12000}, {0x3ae14000}, {0x3ae16000}, + {0x3ae18000}, {0x3ae1a000}, {0x3ae1c000}, {0x3ae1e000}, + {0x3ae20000}, {0x3ae22000}, {0x3ae24000}, {0x3ae26000}, + {0x3ae28000}, {0x3ae2a000}, {0x3ae2c000}, {0x3ae2e000}, + {0x3ae30000}, {0x3ae32000}, {0x3ae34000}, {0x3ae36000}, + {0x3ae38000}, {0x3ae3a000}, {0x3ae3c000}, {0x3ae3e000}, + {0x3ae40000}, {0x3ae42000}, {0x3ae44000}, {0x3ae46000}, + {0x3ae48000}, {0x3ae4a000}, {0x3ae4c000}, {0x3ae4e000}, + {0x3ae50000}, {0x3ae52000}, {0x3ae54000}, {0x3ae56000}, + {0x3ae58000}, {0x3ae5a000}, {0x3ae5c000}, {0x3ae5e000}, + {0x3ae60000}, {0x3ae62000}, {0x3ae64000}, {0x3ae66000}, + {0x3ae68000}, {0x3ae6a000}, {0x3ae6c000}, {0x3ae6e000}, + {0x3ae70000}, {0x3ae72000}, {0x3ae74000}, {0x3ae76000}, + {0x3ae78000}, {0x3ae7a000}, {0x3ae7c000}, {0x3ae7e000}, + {0x3ae80000}, {0x3ae82000}, {0x3ae84000}, {0x3ae86000}, + {0x3ae88000}, {0x3ae8a000}, {0x3ae8c000}, {0x3ae8e000}, + {0x3ae90000}, {0x3ae92000}, {0x3ae94000}, {0x3ae96000}, + {0x3ae98000}, {0x3ae9a000}, {0x3ae9c000}, {0x3ae9e000}, + {0x3aea0000}, {0x3aea2000}, {0x3aea4000}, {0x3aea6000}, + {0x3aea8000}, {0x3aeaa000}, {0x3aeac000}, {0x3aeae000}, + {0x3aeb0000}, {0x3aeb2000}, {0x3aeb4000}, {0x3aeb6000}, + {0x3aeb8000}, {0x3aeba000}, {0x3aebc000}, {0x3aebe000}, + {0x3aec0000}, {0x3aec2000}, {0x3aec4000}, {0x3aec6000}, + {0x3aec8000}, {0x3aeca000}, {0x3aecc000}, {0x3aece000}, + {0x3aed0000}, {0x3aed2000}, {0x3aed4000}, {0x3aed6000}, + {0x3aed8000}, {0x3aeda000}, {0x3aedc000}, {0x3aede000}, + {0x3aee0000}, {0x3aee2000}, {0x3aee4000}, {0x3aee6000}, + {0x3aee8000}, {0x3aeea000}, {0x3aeec000}, {0x3aeee000}, + {0x3aef0000}, {0x3aef2000}, {0x3aef4000}, {0x3aef6000}, + {0x3aef8000}, {0x3aefa000}, {0x3aefc000}, {0x3aefe000}, + {0x3af00000}, {0x3af02000}, {0x3af04000}, {0x3af06000}, + {0x3af08000}, {0x3af0a000}, {0x3af0c000}, {0x3af0e000}, + {0x3af10000}, {0x3af12000}, {0x3af14000}, {0x3af16000}, + {0x3af18000}, {0x3af1a000}, {0x3af1c000}, {0x3af1e000}, + {0x3af20000}, {0x3af22000}, {0x3af24000}, {0x3af26000}, + {0x3af28000}, {0x3af2a000}, {0x3af2c000}, {0x3af2e000}, + {0x3af30000}, {0x3af32000}, {0x3af34000}, {0x3af36000}, + {0x3af38000}, {0x3af3a000}, {0x3af3c000}, {0x3af3e000}, + {0x3af40000}, {0x3af42000}, {0x3af44000}, {0x3af46000}, + {0x3af48000}, {0x3af4a000}, {0x3af4c000}, {0x3af4e000}, + {0x3af50000}, {0x3af52000}, {0x3af54000}, {0x3af56000}, + {0x3af58000}, {0x3af5a000}, {0x3af5c000}, {0x3af5e000}, + {0x3af60000}, {0x3af62000}, {0x3af64000}, {0x3af66000}, + {0x3af68000}, {0x3af6a000}, {0x3af6c000}, {0x3af6e000}, + {0x3af70000}, {0x3af72000}, {0x3af74000}, {0x3af76000}, + {0x3af78000}, {0x3af7a000}, {0x3af7c000}, {0x3af7e000}, + {0x3af80000}, {0x3af82000}, {0x3af84000}, {0x3af86000}, + {0x3af88000}, {0x3af8a000}, {0x3af8c000}, {0x3af8e000}, + {0x3af90000}, {0x3af92000}, {0x3af94000}, {0x3af96000}, + {0x3af98000}, {0x3af9a000}, {0x3af9c000}, {0x3af9e000}, + {0x3afa0000}, {0x3afa2000}, {0x3afa4000}, {0x3afa6000}, + {0x3afa8000}, {0x3afaa000}, {0x3afac000}, {0x3afae000}, + {0x3afb0000}, {0x3afb2000}, {0x3afb4000}, {0x3afb6000}, + {0x3afb8000}, {0x3afba000}, {0x3afbc000}, {0x3afbe000}, + {0x3afc0000}, {0x3afc2000}, {0x3afc4000}, {0x3afc6000}, + {0x3afc8000}, {0x3afca000}, {0x3afcc000}, {0x3afce000}, + {0x3afd0000}, {0x3afd2000}, {0x3afd4000}, {0x3afd6000}, + {0x3afd8000}, {0x3afda000}, {0x3afdc000}, {0x3afde000}, + {0x3afe0000}, {0x3afe2000}, {0x3afe4000}, {0x3afe6000}, + {0x3afe8000}, {0x3afea000}, {0x3afec000}, {0x3afee000}, + {0x3aff0000}, {0x3aff2000}, {0x3aff4000}, {0x3aff6000}, + {0x3aff8000}, {0x3affa000}, {0x3affc000}, {0x3affe000}, + {0x3b000000}, {0x3b002000}, {0x3b004000}, {0x3b006000}, + {0x3b008000}, {0x3b00a000}, {0x3b00c000}, {0x3b00e000}, + {0x3b010000}, {0x3b012000}, {0x3b014000}, {0x3b016000}, + {0x3b018000}, {0x3b01a000}, {0x3b01c000}, {0x3b01e000}, + {0x3b020000}, {0x3b022000}, {0x3b024000}, {0x3b026000}, + {0x3b028000}, {0x3b02a000}, {0x3b02c000}, {0x3b02e000}, + {0x3b030000}, {0x3b032000}, {0x3b034000}, {0x3b036000}, + {0x3b038000}, {0x3b03a000}, {0x3b03c000}, {0x3b03e000}, + {0x3b040000}, {0x3b042000}, {0x3b044000}, {0x3b046000}, + {0x3b048000}, {0x3b04a000}, {0x3b04c000}, {0x3b04e000}, + {0x3b050000}, {0x3b052000}, {0x3b054000}, {0x3b056000}, + {0x3b058000}, {0x3b05a000}, {0x3b05c000}, {0x3b05e000}, + {0x3b060000}, {0x3b062000}, {0x3b064000}, {0x3b066000}, + {0x3b068000}, {0x3b06a000}, {0x3b06c000}, {0x3b06e000}, + {0x3b070000}, {0x3b072000}, {0x3b074000}, {0x3b076000}, + {0x3b078000}, {0x3b07a000}, {0x3b07c000}, {0x3b07e000}, + {0x3b080000}, {0x3b082000}, {0x3b084000}, {0x3b086000}, + {0x3b088000}, {0x3b08a000}, {0x3b08c000}, {0x3b08e000}, + {0x3b090000}, {0x3b092000}, {0x3b094000}, {0x3b096000}, + {0x3b098000}, {0x3b09a000}, {0x3b09c000}, {0x3b09e000}, + {0x3b0a0000}, {0x3b0a2000}, {0x3b0a4000}, {0x3b0a6000}, + {0x3b0a8000}, {0x3b0aa000}, {0x3b0ac000}, {0x3b0ae000}, + {0x3b0b0000}, {0x3b0b2000}, {0x3b0b4000}, {0x3b0b6000}, + {0x3b0b8000}, {0x3b0ba000}, {0x3b0bc000}, {0x3b0be000}, + {0x3b0c0000}, {0x3b0c2000}, {0x3b0c4000}, {0x3b0c6000}, + {0x3b0c8000}, {0x3b0ca000}, {0x3b0cc000}, {0x3b0ce000}, + {0x3b0d0000}, {0x3b0d2000}, {0x3b0d4000}, {0x3b0d6000}, + {0x3b0d8000}, {0x3b0da000}, {0x3b0dc000}, {0x3b0de000}, + {0x3b0e0000}, {0x3b0e2000}, {0x3b0e4000}, {0x3b0e6000}, + {0x3b0e8000}, {0x3b0ea000}, {0x3b0ec000}, {0x3b0ee000}, + {0x3b0f0000}, {0x3b0f2000}, {0x3b0f4000}, {0x3b0f6000}, + {0x3b0f8000}, {0x3b0fa000}, {0x3b0fc000}, {0x3b0fe000}, + {0x3b100000}, {0x3b102000}, {0x3b104000}, {0x3b106000}, + {0x3b108000}, {0x3b10a000}, {0x3b10c000}, {0x3b10e000}, + {0x3b110000}, {0x3b112000}, {0x3b114000}, {0x3b116000}, + {0x3b118000}, {0x3b11a000}, {0x3b11c000}, {0x3b11e000}, + {0x3b120000}, {0x3b122000}, {0x3b124000}, {0x3b126000}, + {0x3b128000}, {0x3b12a000}, {0x3b12c000}, {0x3b12e000}, + {0x3b130000}, {0x3b132000}, {0x3b134000}, {0x3b136000}, + {0x3b138000}, {0x3b13a000}, {0x3b13c000}, {0x3b13e000}, + {0x3b140000}, {0x3b142000}, {0x3b144000}, {0x3b146000}, + {0x3b148000}, {0x3b14a000}, {0x3b14c000}, {0x3b14e000}, + {0x3b150000}, {0x3b152000}, {0x3b154000}, {0x3b156000}, + {0x3b158000}, {0x3b15a000}, {0x3b15c000}, {0x3b15e000}, + {0x3b160000}, {0x3b162000}, {0x3b164000}, {0x3b166000}, + {0x3b168000}, {0x3b16a000}, {0x3b16c000}, {0x3b16e000}, + {0x3b170000}, {0x3b172000}, {0x3b174000}, {0x3b176000}, + {0x3b178000}, {0x3b17a000}, {0x3b17c000}, {0x3b17e000}, + {0x3b180000}, {0x3b182000}, {0x3b184000}, {0x3b186000}, + {0x3b188000}, {0x3b18a000}, {0x3b18c000}, {0x3b18e000}, + {0x3b190000}, {0x3b192000}, {0x3b194000}, {0x3b196000}, + {0x3b198000}, {0x3b19a000}, {0x3b19c000}, {0x3b19e000}, + {0x3b1a0000}, {0x3b1a2000}, {0x3b1a4000}, {0x3b1a6000}, + {0x3b1a8000}, {0x3b1aa000}, {0x3b1ac000}, {0x3b1ae000}, + {0x3b1b0000}, {0x3b1b2000}, {0x3b1b4000}, {0x3b1b6000}, + {0x3b1b8000}, {0x3b1ba000}, {0x3b1bc000}, {0x3b1be000}, + {0x3b1c0000}, {0x3b1c2000}, {0x3b1c4000}, {0x3b1c6000}, + {0x3b1c8000}, {0x3b1ca000}, {0x3b1cc000}, {0x3b1ce000}, + {0x3b1d0000}, {0x3b1d2000}, {0x3b1d4000}, {0x3b1d6000}, + {0x3b1d8000}, {0x3b1da000}, {0x3b1dc000}, {0x3b1de000}, + {0x3b1e0000}, {0x3b1e2000}, {0x3b1e4000}, {0x3b1e6000}, + {0x3b1e8000}, {0x3b1ea000}, {0x3b1ec000}, {0x3b1ee000}, + {0x3b1f0000}, {0x3b1f2000}, {0x3b1f4000}, {0x3b1f6000}, + {0x3b1f8000}, {0x3b1fa000}, {0x3b1fc000}, {0x3b1fe000}, + {0x3b200000}, {0x3b202000}, {0x3b204000}, {0x3b206000}, + {0x3b208000}, {0x3b20a000}, {0x3b20c000}, {0x3b20e000}, + {0x3b210000}, {0x3b212000}, {0x3b214000}, {0x3b216000}, + {0x3b218000}, {0x3b21a000}, {0x3b21c000}, {0x3b21e000}, + {0x3b220000}, {0x3b222000}, {0x3b224000}, {0x3b226000}, + {0x3b228000}, {0x3b22a000}, {0x3b22c000}, {0x3b22e000}, + {0x3b230000}, {0x3b232000}, {0x3b234000}, {0x3b236000}, + {0x3b238000}, {0x3b23a000}, {0x3b23c000}, {0x3b23e000}, + {0x3b240000}, {0x3b242000}, {0x3b244000}, {0x3b246000}, + {0x3b248000}, {0x3b24a000}, {0x3b24c000}, {0x3b24e000}, + {0x3b250000}, {0x3b252000}, {0x3b254000}, {0x3b256000}, + {0x3b258000}, {0x3b25a000}, {0x3b25c000}, {0x3b25e000}, + {0x3b260000}, {0x3b262000}, {0x3b264000}, {0x3b266000}, + {0x3b268000}, {0x3b26a000}, {0x3b26c000}, {0x3b26e000}, + {0x3b270000}, {0x3b272000}, {0x3b274000}, {0x3b276000}, + {0x3b278000}, {0x3b27a000}, {0x3b27c000}, {0x3b27e000}, + {0x3b280000}, {0x3b282000}, {0x3b284000}, {0x3b286000}, + {0x3b288000}, {0x3b28a000}, {0x3b28c000}, {0x3b28e000}, + {0x3b290000}, {0x3b292000}, {0x3b294000}, {0x3b296000}, + {0x3b298000}, {0x3b29a000}, {0x3b29c000}, {0x3b29e000}, + {0x3b2a0000}, {0x3b2a2000}, {0x3b2a4000}, {0x3b2a6000}, + {0x3b2a8000}, {0x3b2aa000}, {0x3b2ac000}, {0x3b2ae000}, + {0x3b2b0000}, {0x3b2b2000}, {0x3b2b4000}, {0x3b2b6000}, + {0x3b2b8000}, {0x3b2ba000}, {0x3b2bc000}, {0x3b2be000}, + {0x3b2c0000}, {0x3b2c2000}, {0x3b2c4000}, {0x3b2c6000}, + {0x3b2c8000}, {0x3b2ca000}, {0x3b2cc000}, {0x3b2ce000}, + {0x3b2d0000}, {0x3b2d2000}, {0x3b2d4000}, {0x3b2d6000}, + {0x3b2d8000}, {0x3b2da000}, {0x3b2dc000}, {0x3b2de000}, + {0x3b2e0000}, {0x3b2e2000}, {0x3b2e4000}, {0x3b2e6000}, + {0x3b2e8000}, {0x3b2ea000}, {0x3b2ec000}, {0x3b2ee000}, + {0x3b2f0000}, {0x3b2f2000}, {0x3b2f4000}, {0x3b2f6000}, + {0x3b2f8000}, {0x3b2fa000}, {0x3b2fc000}, {0x3b2fe000}, + {0x3b300000}, {0x3b302000}, {0x3b304000}, {0x3b306000}, + {0x3b308000}, {0x3b30a000}, {0x3b30c000}, {0x3b30e000}, + {0x3b310000}, {0x3b312000}, {0x3b314000}, {0x3b316000}, + {0x3b318000}, {0x3b31a000}, {0x3b31c000}, {0x3b31e000}, + {0x3b320000}, {0x3b322000}, {0x3b324000}, {0x3b326000}, + {0x3b328000}, {0x3b32a000}, {0x3b32c000}, {0x3b32e000}, + {0x3b330000}, {0x3b332000}, {0x3b334000}, {0x3b336000}, + {0x3b338000}, {0x3b33a000}, {0x3b33c000}, {0x3b33e000}, + {0x3b340000}, {0x3b342000}, {0x3b344000}, {0x3b346000}, + {0x3b348000}, {0x3b34a000}, {0x3b34c000}, {0x3b34e000}, + {0x3b350000}, {0x3b352000}, {0x3b354000}, {0x3b356000}, + {0x3b358000}, {0x3b35a000}, {0x3b35c000}, {0x3b35e000}, + {0x3b360000}, {0x3b362000}, {0x3b364000}, {0x3b366000}, + {0x3b368000}, {0x3b36a000}, {0x3b36c000}, {0x3b36e000}, + {0x3b370000}, {0x3b372000}, {0x3b374000}, {0x3b376000}, + {0x3b378000}, {0x3b37a000}, {0x3b37c000}, {0x3b37e000}, + {0x3b380000}, {0x3b382000}, {0x3b384000}, {0x3b386000}, + {0x3b388000}, {0x3b38a000}, {0x3b38c000}, {0x3b38e000}, + {0x3b390000}, {0x3b392000}, {0x3b394000}, {0x3b396000}, + {0x3b398000}, {0x3b39a000}, {0x3b39c000}, {0x3b39e000}, + {0x3b3a0000}, {0x3b3a2000}, {0x3b3a4000}, {0x3b3a6000}, + {0x3b3a8000}, {0x3b3aa000}, {0x3b3ac000}, {0x3b3ae000}, + {0x3b3b0000}, {0x3b3b2000}, {0x3b3b4000}, {0x3b3b6000}, + {0x3b3b8000}, {0x3b3ba000}, {0x3b3bc000}, {0x3b3be000}, + {0x3b3c0000}, {0x3b3c2000}, {0x3b3c4000}, {0x3b3c6000}, + {0x3b3c8000}, {0x3b3ca000}, {0x3b3cc000}, {0x3b3ce000}, + {0x3b3d0000}, {0x3b3d2000}, {0x3b3d4000}, {0x3b3d6000}, + {0x3b3d8000}, {0x3b3da000}, {0x3b3dc000}, {0x3b3de000}, + {0x3b3e0000}, {0x3b3e2000}, {0x3b3e4000}, {0x3b3e6000}, + {0x3b3e8000}, {0x3b3ea000}, {0x3b3ec000}, {0x3b3ee000}, + {0x3b3f0000}, {0x3b3f2000}, {0x3b3f4000}, {0x3b3f6000}, + {0x3b3f8000}, {0x3b3fa000}, {0x3b3fc000}, {0x3b3fe000}, + {0x3b400000}, {0x3b402000}, {0x3b404000}, {0x3b406000}, + {0x3b408000}, {0x3b40a000}, {0x3b40c000}, {0x3b40e000}, + {0x3b410000}, {0x3b412000}, {0x3b414000}, {0x3b416000}, + {0x3b418000}, {0x3b41a000}, {0x3b41c000}, {0x3b41e000}, + {0x3b420000}, {0x3b422000}, {0x3b424000}, {0x3b426000}, + {0x3b428000}, {0x3b42a000}, {0x3b42c000}, {0x3b42e000}, + {0x3b430000}, {0x3b432000}, {0x3b434000}, {0x3b436000}, + {0x3b438000}, {0x3b43a000}, {0x3b43c000}, {0x3b43e000}, + {0x3b440000}, {0x3b442000}, {0x3b444000}, {0x3b446000}, + {0x3b448000}, {0x3b44a000}, {0x3b44c000}, {0x3b44e000}, + {0x3b450000}, {0x3b452000}, {0x3b454000}, {0x3b456000}, + {0x3b458000}, {0x3b45a000}, {0x3b45c000}, {0x3b45e000}, + {0x3b460000}, {0x3b462000}, {0x3b464000}, {0x3b466000}, + {0x3b468000}, {0x3b46a000}, {0x3b46c000}, {0x3b46e000}, + {0x3b470000}, {0x3b472000}, {0x3b474000}, {0x3b476000}, + {0x3b478000}, {0x3b47a000}, {0x3b47c000}, {0x3b47e000}, + {0x3b480000}, {0x3b482000}, {0x3b484000}, {0x3b486000}, + {0x3b488000}, {0x3b48a000}, {0x3b48c000}, {0x3b48e000}, + {0x3b490000}, {0x3b492000}, {0x3b494000}, {0x3b496000}, + {0x3b498000}, {0x3b49a000}, {0x3b49c000}, {0x3b49e000}, + {0x3b4a0000}, {0x3b4a2000}, {0x3b4a4000}, {0x3b4a6000}, + {0x3b4a8000}, {0x3b4aa000}, {0x3b4ac000}, {0x3b4ae000}, + {0x3b4b0000}, {0x3b4b2000}, {0x3b4b4000}, {0x3b4b6000}, + {0x3b4b8000}, {0x3b4ba000}, {0x3b4bc000}, {0x3b4be000}, + {0x3b4c0000}, {0x3b4c2000}, {0x3b4c4000}, {0x3b4c6000}, + {0x3b4c8000}, {0x3b4ca000}, {0x3b4cc000}, {0x3b4ce000}, + {0x3b4d0000}, {0x3b4d2000}, {0x3b4d4000}, {0x3b4d6000}, + {0x3b4d8000}, {0x3b4da000}, {0x3b4dc000}, {0x3b4de000}, + {0x3b4e0000}, {0x3b4e2000}, {0x3b4e4000}, {0x3b4e6000}, + {0x3b4e8000}, {0x3b4ea000}, {0x3b4ec000}, {0x3b4ee000}, + {0x3b4f0000}, {0x3b4f2000}, {0x3b4f4000}, {0x3b4f6000}, + {0x3b4f8000}, {0x3b4fa000}, {0x3b4fc000}, {0x3b4fe000}, + {0x3b500000}, {0x3b502000}, {0x3b504000}, {0x3b506000}, + {0x3b508000}, {0x3b50a000}, {0x3b50c000}, {0x3b50e000}, + {0x3b510000}, {0x3b512000}, {0x3b514000}, {0x3b516000}, + {0x3b518000}, {0x3b51a000}, {0x3b51c000}, {0x3b51e000}, + {0x3b520000}, {0x3b522000}, {0x3b524000}, {0x3b526000}, + {0x3b528000}, {0x3b52a000}, {0x3b52c000}, {0x3b52e000}, + {0x3b530000}, {0x3b532000}, {0x3b534000}, {0x3b536000}, + {0x3b538000}, {0x3b53a000}, {0x3b53c000}, {0x3b53e000}, + {0x3b540000}, {0x3b542000}, {0x3b544000}, {0x3b546000}, + {0x3b548000}, {0x3b54a000}, {0x3b54c000}, {0x3b54e000}, + {0x3b550000}, {0x3b552000}, {0x3b554000}, {0x3b556000}, + {0x3b558000}, {0x3b55a000}, {0x3b55c000}, {0x3b55e000}, + {0x3b560000}, {0x3b562000}, {0x3b564000}, {0x3b566000}, + {0x3b568000}, {0x3b56a000}, {0x3b56c000}, {0x3b56e000}, + {0x3b570000}, {0x3b572000}, {0x3b574000}, {0x3b576000}, + {0x3b578000}, {0x3b57a000}, {0x3b57c000}, {0x3b57e000}, + {0x3b580000}, {0x3b582000}, {0x3b584000}, {0x3b586000}, + {0x3b588000}, {0x3b58a000}, {0x3b58c000}, {0x3b58e000}, + {0x3b590000}, {0x3b592000}, {0x3b594000}, {0x3b596000}, + {0x3b598000}, {0x3b59a000}, {0x3b59c000}, {0x3b59e000}, + {0x3b5a0000}, {0x3b5a2000}, {0x3b5a4000}, {0x3b5a6000}, + {0x3b5a8000}, {0x3b5aa000}, {0x3b5ac000}, {0x3b5ae000}, + {0x3b5b0000}, {0x3b5b2000}, {0x3b5b4000}, {0x3b5b6000}, + {0x3b5b8000}, {0x3b5ba000}, {0x3b5bc000}, {0x3b5be000}, + {0x3b5c0000}, {0x3b5c2000}, {0x3b5c4000}, {0x3b5c6000}, + {0x3b5c8000}, {0x3b5ca000}, {0x3b5cc000}, {0x3b5ce000}, + {0x3b5d0000}, {0x3b5d2000}, {0x3b5d4000}, {0x3b5d6000}, + {0x3b5d8000}, {0x3b5da000}, {0x3b5dc000}, {0x3b5de000}, + {0x3b5e0000}, {0x3b5e2000}, {0x3b5e4000}, {0x3b5e6000}, + {0x3b5e8000}, {0x3b5ea000}, {0x3b5ec000}, {0x3b5ee000}, + {0x3b5f0000}, {0x3b5f2000}, {0x3b5f4000}, {0x3b5f6000}, + {0x3b5f8000}, {0x3b5fa000}, {0x3b5fc000}, {0x3b5fe000}, + {0x3b600000}, {0x3b602000}, {0x3b604000}, {0x3b606000}, + {0x3b608000}, {0x3b60a000}, {0x3b60c000}, {0x3b60e000}, + {0x3b610000}, {0x3b612000}, {0x3b614000}, {0x3b616000}, + {0x3b618000}, {0x3b61a000}, {0x3b61c000}, {0x3b61e000}, + {0x3b620000}, {0x3b622000}, {0x3b624000}, {0x3b626000}, + {0x3b628000}, {0x3b62a000}, {0x3b62c000}, {0x3b62e000}, + {0x3b630000}, {0x3b632000}, {0x3b634000}, {0x3b636000}, + {0x3b638000}, {0x3b63a000}, {0x3b63c000}, {0x3b63e000}, + {0x3b640000}, {0x3b642000}, {0x3b644000}, {0x3b646000}, + {0x3b648000}, {0x3b64a000}, {0x3b64c000}, {0x3b64e000}, + {0x3b650000}, {0x3b652000}, {0x3b654000}, {0x3b656000}, + {0x3b658000}, {0x3b65a000}, {0x3b65c000}, {0x3b65e000}, + {0x3b660000}, {0x3b662000}, {0x3b664000}, {0x3b666000}, + {0x3b668000}, {0x3b66a000}, {0x3b66c000}, {0x3b66e000}, + {0x3b670000}, {0x3b672000}, {0x3b674000}, {0x3b676000}, + {0x3b678000}, {0x3b67a000}, {0x3b67c000}, {0x3b67e000}, + {0x3b680000}, {0x3b682000}, {0x3b684000}, {0x3b686000}, + {0x3b688000}, {0x3b68a000}, {0x3b68c000}, {0x3b68e000}, + {0x3b690000}, {0x3b692000}, {0x3b694000}, {0x3b696000}, + {0x3b698000}, {0x3b69a000}, {0x3b69c000}, {0x3b69e000}, + {0x3b6a0000}, {0x3b6a2000}, {0x3b6a4000}, {0x3b6a6000}, + {0x3b6a8000}, {0x3b6aa000}, {0x3b6ac000}, {0x3b6ae000}, + {0x3b6b0000}, {0x3b6b2000}, {0x3b6b4000}, {0x3b6b6000}, + {0x3b6b8000}, {0x3b6ba000}, {0x3b6bc000}, {0x3b6be000}, + {0x3b6c0000}, {0x3b6c2000}, {0x3b6c4000}, {0x3b6c6000}, + {0x3b6c8000}, {0x3b6ca000}, {0x3b6cc000}, {0x3b6ce000}, + {0x3b6d0000}, {0x3b6d2000}, {0x3b6d4000}, {0x3b6d6000}, + {0x3b6d8000}, {0x3b6da000}, {0x3b6dc000}, {0x3b6de000}, + {0x3b6e0000}, {0x3b6e2000}, {0x3b6e4000}, {0x3b6e6000}, + {0x3b6e8000}, {0x3b6ea000}, {0x3b6ec000}, {0x3b6ee000}, + {0x3b6f0000}, {0x3b6f2000}, {0x3b6f4000}, {0x3b6f6000}, + {0x3b6f8000}, {0x3b6fa000}, {0x3b6fc000}, {0x3b6fe000}, + {0x3b700000}, {0x3b702000}, {0x3b704000}, {0x3b706000}, + {0x3b708000}, {0x3b70a000}, {0x3b70c000}, {0x3b70e000}, + {0x3b710000}, {0x3b712000}, {0x3b714000}, {0x3b716000}, + {0x3b718000}, {0x3b71a000}, {0x3b71c000}, {0x3b71e000}, + {0x3b720000}, {0x3b722000}, {0x3b724000}, {0x3b726000}, + {0x3b728000}, {0x3b72a000}, {0x3b72c000}, {0x3b72e000}, + {0x3b730000}, {0x3b732000}, {0x3b734000}, {0x3b736000}, + {0x3b738000}, {0x3b73a000}, {0x3b73c000}, {0x3b73e000}, + {0x3b740000}, {0x3b742000}, {0x3b744000}, {0x3b746000}, + {0x3b748000}, {0x3b74a000}, {0x3b74c000}, {0x3b74e000}, + {0x3b750000}, {0x3b752000}, {0x3b754000}, {0x3b756000}, + {0x3b758000}, {0x3b75a000}, {0x3b75c000}, {0x3b75e000}, + {0x3b760000}, {0x3b762000}, {0x3b764000}, {0x3b766000}, + {0x3b768000}, {0x3b76a000}, {0x3b76c000}, {0x3b76e000}, + {0x3b770000}, {0x3b772000}, {0x3b774000}, {0x3b776000}, + {0x3b778000}, {0x3b77a000}, {0x3b77c000}, {0x3b77e000}, + {0x3b780000}, {0x3b782000}, {0x3b784000}, {0x3b786000}, + {0x3b788000}, {0x3b78a000}, {0x3b78c000}, {0x3b78e000}, + {0x3b790000}, {0x3b792000}, {0x3b794000}, {0x3b796000}, + {0x3b798000}, {0x3b79a000}, {0x3b79c000}, {0x3b79e000}, + {0x3b7a0000}, {0x3b7a2000}, {0x3b7a4000}, {0x3b7a6000}, + {0x3b7a8000}, {0x3b7aa000}, {0x3b7ac000}, {0x3b7ae000}, + {0x3b7b0000}, {0x3b7b2000}, {0x3b7b4000}, {0x3b7b6000}, + {0x3b7b8000}, {0x3b7ba000}, {0x3b7bc000}, {0x3b7be000}, + {0x3b7c0000}, {0x3b7c2000}, {0x3b7c4000}, {0x3b7c6000}, + {0x3b7c8000}, {0x3b7ca000}, {0x3b7cc000}, {0x3b7ce000}, + {0x3b7d0000}, {0x3b7d2000}, {0x3b7d4000}, {0x3b7d6000}, + {0x3b7d8000}, {0x3b7da000}, {0x3b7dc000}, {0x3b7de000}, + {0x3b7e0000}, {0x3b7e2000}, {0x3b7e4000}, {0x3b7e6000}, + {0x3b7e8000}, {0x3b7ea000}, {0x3b7ec000}, {0x3b7ee000}, + {0x3b7f0000}, {0x3b7f2000}, {0x3b7f4000}, {0x3b7f6000}, + {0x3b7f8000}, {0x3b7fa000}, {0x3b7fc000}, {0x3b7fe000}, + {0x3b800000}, {0x3b802000}, {0x3b804000}, {0x3b806000}, + {0x3b808000}, {0x3b80a000}, {0x3b80c000}, {0x3b80e000}, + {0x3b810000}, {0x3b812000}, {0x3b814000}, {0x3b816000}, + {0x3b818000}, {0x3b81a000}, {0x3b81c000}, {0x3b81e000}, + {0x3b820000}, {0x3b822000}, {0x3b824000}, {0x3b826000}, + {0x3b828000}, {0x3b82a000}, {0x3b82c000}, {0x3b82e000}, + {0x3b830000}, {0x3b832000}, {0x3b834000}, {0x3b836000}, + {0x3b838000}, {0x3b83a000}, {0x3b83c000}, {0x3b83e000}, + {0x3b840000}, {0x3b842000}, {0x3b844000}, {0x3b846000}, + {0x3b848000}, {0x3b84a000}, {0x3b84c000}, {0x3b84e000}, + {0x3b850000}, {0x3b852000}, {0x3b854000}, {0x3b856000}, + {0x3b858000}, {0x3b85a000}, {0x3b85c000}, {0x3b85e000}, + {0x3b860000}, {0x3b862000}, {0x3b864000}, {0x3b866000}, + {0x3b868000}, {0x3b86a000}, {0x3b86c000}, {0x3b86e000}, + {0x3b870000}, {0x3b872000}, {0x3b874000}, {0x3b876000}, + {0x3b878000}, {0x3b87a000}, {0x3b87c000}, {0x3b87e000}, + {0x3b880000}, {0x3b882000}, {0x3b884000}, {0x3b886000}, + {0x3b888000}, {0x3b88a000}, {0x3b88c000}, {0x3b88e000}, + {0x3b890000}, {0x3b892000}, {0x3b894000}, {0x3b896000}, + {0x3b898000}, {0x3b89a000}, {0x3b89c000}, {0x3b89e000}, + {0x3b8a0000}, {0x3b8a2000}, {0x3b8a4000}, {0x3b8a6000}, + {0x3b8a8000}, {0x3b8aa000}, {0x3b8ac000}, {0x3b8ae000}, + {0x3b8b0000}, {0x3b8b2000}, {0x3b8b4000}, {0x3b8b6000}, + {0x3b8b8000}, {0x3b8ba000}, {0x3b8bc000}, {0x3b8be000}, + {0x3b8c0000}, {0x3b8c2000}, {0x3b8c4000}, {0x3b8c6000}, + {0x3b8c8000}, {0x3b8ca000}, {0x3b8cc000}, {0x3b8ce000}, + {0x3b8d0000}, {0x3b8d2000}, {0x3b8d4000}, {0x3b8d6000}, + {0x3b8d8000}, {0x3b8da000}, {0x3b8dc000}, {0x3b8de000}, + {0x3b8e0000}, {0x3b8e2000}, {0x3b8e4000}, {0x3b8e6000}, + {0x3b8e8000}, {0x3b8ea000}, {0x3b8ec000}, {0x3b8ee000}, + {0x3b8f0000}, {0x3b8f2000}, {0x3b8f4000}, {0x3b8f6000}, + {0x3b8f8000}, {0x3b8fa000}, {0x3b8fc000}, {0x3b8fe000}, + {0x3b900000}, {0x3b902000}, {0x3b904000}, {0x3b906000}, + {0x3b908000}, {0x3b90a000}, {0x3b90c000}, {0x3b90e000}, + {0x3b910000}, {0x3b912000}, {0x3b914000}, {0x3b916000}, + {0x3b918000}, {0x3b91a000}, {0x3b91c000}, {0x3b91e000}, + {0x3b920000}, {0x3b922000}, {0x3b924000}, {0x3b926000}, + {0x3b928000}, {0x3b92a000}, {0x3b92c000}, {0x3b92e000}, + {0x3b930000}, {0x3b932000}, {0x3b934000}, {0x3b936000}, + {0x3b938000}, {0x3b93a000}, {0x3b93c000}, {0x3b93e000}, + {0x3b940000}, {0x3b942000}, {0x3b944000}, {0x3b946000}, + {0x3b948000}, {0x3b94a000}, {0x3b94c000}, {0x3b94e000}, + {0x3b950000}, {0x3b952000}, {0x3b954000}, {0x3b956000}, + {0x3b958000}, {0x3b95a000}, {0x3b95c000}, {0x3b95e000}, + {0x3b960000}, {0x3b962000}, {0x3b964000}, {0x3b966000}, + {0x3b968000}, {0x3b96a000}, {0x3b96c000}, {0x3b96e000}, + {0x3b970000}, {0x3b972000}, {0x3b974000}, {0x3b976000}, + {0x3b978000}, {0x3b97a000}, {0x3b97c000}, {0x3b97e000}, + {0x3b980000}, {0x3b982000}, {0x3b984000}, {0x3b986000}, + {0x3b988000}, {0x3b98a000}, {0x3b98c000}, {0x3b98e000}, + {0x3b990000}, {0x3b992000}, {0x3b994000}, {0x3b996000}, + {0x3b998000}, {0x3b99a000}, {0x3b99c000}, {0x3b99e000}, + {0x3b9a0000}, {0x3b9a2000}, {0x3b9a4000}, {0x3b9a6000}, + {0x3b9a8000}, {0x3b9aa000}, {0x3b9ac000}, {0x3b9ae000}, + {0x3b9b0000}, {0x3b9b2000}, {0x3b9b4000}, {0x3b9b6000}, + {0x3b9b8000}, {0x3b9ba000}, {0x3b9bc000}, {0x3b9be000}, + {0x3b9c0000}, {0x3b9c2000}, {0x3b9c4000}, {0x3b9c6000}, + {0x3b9c8000}, {0x3b9ca000}, {0x3b9cc000}, {0x3b9ce000}, + {0x3b9d0000}, {0x3b9d2000}, {0x3b9d4000}, {0x3b9d6000}, + {0x3b9d8000}, {0x3b9da000}, {0x3b9dc000}, {0x3b9de000}, + {0x3b9e0000}, {0x3b9e2000}, {0x3b9e4000}, {0x3b9e6000}, + {0x3b9e8000}, {0x3b9ea000}, {0x3b9ec000}, {0x3b9ee000}, + {0x3b9f0000}, {0x3b9f2000}, {0x3b9f4000}, {0x3b9f6000}, + {0x3b9f8000}, {0x3b9fa000}, {0x3b9fc000}, {0x3b9fe000}, + {0x3ba00000}, {0x3ba02000}, {0x3ba04000}, {0x3ba06000}, + {0x3ba08000}, {0x3ba0a000}, {0x3ba0c000}, {0x3ba0e000}, + {0x3ba10000}, {0x3ba12000}, {0x3ba14000}, {0x3ba16000}, + {0x3ba18000}, {0x3ba1a000}, {0x3ba1c000}, {0x3ba1e000}, + {0x3ba20000}, {0x3ba22000}, {0x3ba24000}, {0x3ba26000}, + {0x3ba28000}, {0x3ba2a000}, {0x3ba2c000}, {0x3ba2e000}, + {0x3ba30000}, {0x3ba32000}, {0x3ba34000}, {0x3ba36000}, + {0x3ba38000}, {0x3ba3a000}, {0x3ba3c000}, {0x3ba3e000}, + {0x3ba40000}, {0x3ba42000}, {0x3ba44000}, {0x3ba46000}, + {0x3ba48000}, {0x3ba4a000}, {0x3ba4c000}, {0x3ba4e000}, + {0x3ba50000}, {0x3ba52000}, {0x3ba54000}, {0x3ba56000}, + {0x3ba58000}, {0x3ba5a000}, {0x3ba5c000}, {0x3ba5e000}, + {0x3ba60000}, {0x3ba62000}, {0x3ba64000}, {0x3ba66000}, + {0x3ba68000}, {0x3ba6a000}, {0x3ba6c000}, {0x3ba6e000}, + {0x3ba70000}, {0x3ba72000}, {0x3ba74000}, {0x3ba76000}, + {0x3ba78000}, {0x3ba7a000}, {0x3ba7c000}, {0x3ba7e000}, + {0x3ba80000}, {0x3ba82000}, {0x3ba84000}, {0x3ba86000}, + {0x3ba88000}, {0x3ba8a000}, {0x3ba8c000}, {0x3ba8e000}, + {0x3ba90000}, {0x3ba92000}, {0x3ba94000}, {0x3ba96000}, + {0x3ba98000}, {0x3ba9a000}, {0x3ba9c000}, {0x3ba9e000}, + {0x3baa0000}, {0x3baa2000}, {0x3baa4000}, {0x3baa6000}, + {0x3baa8000}, {0x3baaa000}, {0x3baac000}, {0x3baae000}, + {0x3bab0000}, {0x3bab2000}, {0x3bab4000}, {0x3bab6000}, + {0x3bab8000}, {0x3baba000}, {0x3babc000}, {0x3babe000}, + {0x3bac0000}, {0x3bac2000}, {0x3bac4000}, {0x3bac6000}, + {0x3bac8000}, {0x3baca000}, {0x3bacc000}, {0x3bace000}, + {0x3bad0000}, {0x3bad2000}, {0x3bad4000}, {0x3bad6000}, + {0x3bad8000}, {0x3bada000}, {0x3badc000}, {0x3bade000}, + {0x3bae0000}, {0x3bae2000}, {0x3bae4000}, {0x3bae6000}, + {0x3bae8000}, {0x3baea000}, {0x3baec000}, {0x3baee000}, + {0x3baf0000}, {0x3baf2000}, {0x3baf4000}, {0x3baf6000}, + {0x3baf8000}, {0x3bafa000}, {0x3bafc000}, {0x3bafe000}, + {0x3bb00000}, {0x3bb02000}, {0x3bb04000}, {0x3bb06000}, + {0x3bb08000}, {0x3bb0a000}, {0x3bb0c000}, {0x3bb0e000}, + {0x3bb10000}, {0x3bb12000}, {0x3bb14000}, {0x3bb16000}, + {0x3bb18000}, {0x3bb1a000}, {0x3bb1c000}, {0x3bb1e000}, + {0x3bb20000}, {0x3bb22000}, {0x3bb24000}, {0x3bb26000}, + {0x3bb28000}, {0x3bb2a000}, {0x3bb2c000}, {0x3bb2e000}, + {0x3bb30000}, {0x3bb32000}, {0x3bb34000}, {0x3bb36000}, + {0x3bb38000}, {0x3bb3a000}, {0x3bb3c000}, {0x3bb3e000}, + {0x3bb40000}, {0x3bb42000}, {0x3bb44000}, {0x3bb46000}, + {0x3bb48000}, {0x3bb4a000}, {0x3bb4c000}, {0x3bb4e000}, + {0x3bb50000}, {0x3bb52000}, {0x3bb54000}, {0x3bb56000}, + {0x3bb58000}, {0x3bb5a000}, {0x3bb5c000}, {0x3bb5e000}, + {0x3bb60000}, {0x3bb62000}, {0x3bb64000}, {0x3bb66000}, + {0x3bb68000}, {0x3bb6a000}, {0x3bb6c000}, {0x3bb6e000}, + {0x3bb70000}, {0x3bb72000}, {0x3bb74000}, {0x3bb76000}, + {0x3bb78000}, {0x3bb7a000}, {0x3bb7c000}, {0x3bb7e000}, + {0x3bb80000}, {0x3bb82000}, {0x3bb84000}, {0x3bb86000}, + {0x3bb88000}, {0x3bb8a000}, {0x3bb8c000}, {0x3bb8e000}, + {0x3bb90000}, {0x3bb92000}, {0x3bb94000}, {0x3bb96000}, + {0x3bb98000}, {0x3bb9a000}, {0x3bb9c000}, {0x3bb9e000}, + {0x3bba0000}, {0x3bba2000}, {0x3bba4000}, {0x3bba6000}, + {0x3bba8000}, {0x3bbaa000}, {0x3bbac000}, {0x3bbae000}, + {0x3bbb0000}, {0x3bbb2000}, {0x3bbb4000}, {0x3bbb6000}, + {0x3bbb8000}, {0x3bbba000}, {0x3bbbc000}, {0x3bbbe000}, + {0x3bbc0000}, {0x3bbc2000}, {0x3bbc4000}, {0x3bbc6000}, + {0x3bbc8000}, {0x3bbca000}, {0x3bbcc000}, {0x3bbce000}, + {0x3bbd0000}, {0x3bbd2000}, {0x3bbd4000}, {0x3bbd6000}, + {0x3bbd8000}, {0x3bbda000}, {0x3bbdc000}, {0x3bbde000}, + {0x3bbe0000}, {0x3bbe2000}, {0x3bbe4000}, {0x3bbe6000}, + {0x3bbe8000}, {0x3bbea000}, {0x3bbec000}, {0x3bbee000}, + {0x3bbf0000}, {0x3bbf2000}, {0x3bbf4000}, {0x3bbf6000}, + {0x3bbf8000}, {0x3bbfa000}, {0x3bbfc000}, {0x3bbfe000}, + {0x3bc00000}, {0x3bc02000}, {0x3bc04000}, {0x3bc06000}, + {0x3bc08000}, {0x3bc0a000}, {0x3bc0c000}, {0x3bc0e000}, + {0x3bc10000}, {0x3bc12000}, {0x3bc14000}, {0x3bc16000}, + {0x3bc18000}, {0x3bc1a000}, {0x3bc1c000}, {0x3bc1e000}, + {0x3bc20000}, {0x3bc22000}, {0x3bc24000}, {0x3bc26000}, + {0x3bc28000}, {0x3bc2a000}, {0x3bc2c000}, {0x3bc2e000}, + {0x3bc30000}, {0x3bc32000}, {0x3bc34000}, {0x3bc36000}, + {0x3bc38000}, {0x3bc3a000}, {0x3bc3c000}, {0x3bc3e000}, + {0x3bc40000}, {0x3bc42000}, {0x3bc44000}, {0x3bc46000}, + {0x3bc48000}, {0x3bc4a000}, {0x3bc4c000}, {0x3bc4e000}, + {0x3bc50000}, {0x3bc52000}, {0x3bc54000}, {0x3bc56000}, + {0x3bc58000}, {0x3bc5a000}, {0x3bc5c000}, {0x3bc5e000}, + {0x3bc60000}, {0x3bc62000}, {0x3bc64000}, {0x3bc66000}, + {0x3bc68000}, {0x3bc6a000}, {0x3bc6c000}, {0x3bc6e000}, + {0x3bc70000}, {0x3bc72000}, {0x3bc74000}, {0x3bc76000}, + {0x3bc78000}, {0x3bc7a000}, {0x3bc7c000}, {0x3bc7e000}, + {0x3bc80000}, {0x3bc82000}, {0x3bc84000}, {0x3bc86000}, + {0x3bc88000}, {0x3bc8a000}, {0x3bc8c000}, {0x3bc8e000}, + {0x3bc90000}, {0x3bc92000}, {0x3bc94000}, {0x3bc96000}, + {0x3bc98000}, {0x3bc9a000}, {0x3bc9c000}, {0x3bc9e000}, + {0x3bca0000}, {0x3bca2000}, {0x3bca4000}, {0x3bca6000}, + {0x3bca8000}, {0x3bcaa000}, {0x3bcac000}, {0x3bcae000}, + {0x3bcb0000}, {0x3bcb2000}, {0x3bcb4000}, {0x3bcb6000}, + {0x3bcb8000}, {0x3bcba000}, {0x3bcbc000}, {0x3bcbe000}, + {0x3bcc0000}, {0x3bcc2000}, {0x3bcc4000}, {0x3bcc6000}, + {0x3bcc8000}, {0x3bcca000}, {0x3bccc000}, {0x3bcce000}, + {0x3bcd0000}, {0x3bcd2000}, {0x3bcd4000}, {0x3bcd6000}, + {0x3bcd8000}, {0x3bcda000}, {0x3bcdc000}, {0x3bcde000}, + {0x3bce0000}, {0x3bce2000}, {0x3bce4000}, {0x3bce6000}, + {0x3bce8000}, {0x3bcea000}, {0x3bcec000}, {0x3bcee000}, + {0x3bcf0000}, {0x3bcf2000}, {0x3bcf4000}, {0x3bcf6000}, + {0x3bcf8000}, {0x3bcfa000}, {0x3bcfc000}, {0x3bcfe000}, + {0x3bd00000}, {0x3bd02000}, {0x3bd04000}, {0x3bd06000}, + {0x3bd08000}, {0x3bd0a000}, {0x3bd0c000}, {0x3bd0e000}, + {0x3bd10000}, {0x3bd12000}, {0x3bd14000}, {0x3bd16000}, + {0x3bd18000}, {0x3bd1a000}, {0x3bd1c000}, {0x3bd1e000}, + {0x3bd20000}, {0x3bd22000}, {0x3bd24000}, {0x3bd26000}, + {0x3bd28000}, {0x3bd2a000}, {0x3bd2c000}, {0x3bd2e000}, + {0x3bd30000}, {0x3bd32000}, {0x3bd34000}, {0x3bd36000}, + {0x3bd38000}, {0x3bd3a000}, {0x3bd3c000}, {0x3bd3e000}, + {0x3bd40000}, {0x3bd42000}, {0x3bd44000}, {0x3bd46000}, + {0x3bd48000}, {0x3bd4a000}, {0x3bd4c000}, {0x3bd4e000}, + {0x3bd50000}, {0x3bd52000}, {0x3bd54000}, {0x3bd56000}, + {0x3bd58000}, {0x3bd5a000}, {0x3bd5c000}, {0x3bd5e000}, + {0x3bd60000}, {0x3bd62000}, {0x3bd64000}, {0x3bd66000}, + {0x3bd68000}, {0x3bd6a000}, {0x3bd6c000}, {0x3bd6e000}, + {0x3bd70000}, {0x3bd72000}, {0x3bd74000}, {0x3bd76000}, + {0x3bd78000}, {0x3bd7a000}, {0x3bd7c000}, {0x3bd7e000}, + {0x3bd80000}, {0x3bd82000}, {0x3bd84000}, {0x3bd86000}, + {0x3bd88000}, {0x3bd8a000}, {0x3bd8c000}, {0x3bd8e000}, + {0x3bd90000}, {0x3bd92000}, {0x3bd94000}, {0x3bd96000}, + {0x3bd98000}, {0x3bd9a000}, {0x3bd9c000}, {0x3bd9e000}, + {0x3bda0000}, {0x3bda2000}, {0x3bda4000}, {0x3bda6000}, + {0x3bda8000}, {0x3bdaa000}, {0x3bdac000}, {0x3bdae000}, + {0x3bdb0000}, {0x3bdb2000}, {0x3bdb4000}, {0x3bdb6000}, + {0x3bdb8000}, {0x3bdba000}, {0x3bdbc000}, {0x3bdbe000}, + {0x3bdc0000}, {0x3bdc2000}, {0x3bdc4000}, {0x3bdc6000}, + {0x3bdc8000}, {0x3bdca000}, {0x3bdcc000}, {0x3bdce000}, + {0x3bdd0000}, {0x3bdd2000}, {0x3bdd4000}, {0x3bdd6000}, + {0x3bdd8000}, {0x3bdda000}, {0x3bddc000}, {0x3bdde000}, + {0x3bde0000}, {0x3bde2000}, {0x3bde4000}, {0x3bde6000}, + {0x3bde8000}, {0x3bdea000}, {0x3bdec000}, {0x3bdee000}, + {0x3bdf0000}, {0x3bdf2000}, {0x3bdf4000}, {0x3bdf6000}, + {0x3bdf8000}, {0x3bdfa000}, {0x3bdfc000}, {0x3bdfe000}, + {0x3be00000}, {0x3be02000}, {0x3be04000}, {0x3be06000}, + {0x3be08000}, {0x3be0a000}, {0x3be0c000}, {0x3be0e000}, + {0x3be10000}, {0x3be12000}, {0x3be14000}, {0x3be16000}, + {0x3be18000}, {0x3be1a000}, {0x3be1c000}, {0x3be1e000}, + {0x3be20000}, {0x3be22000}, {0x3be24000}, {0x3be26000}, + {0x3be28000}, {0x3be2a000}, {0x3be2c000}, {0x3be2e000}, + {0x3be30000}, {0x3be32000}, {0x3be34000}, {0x3be36000}, + {0x3be38000}, {0x3be3a000}, {0x3be3c000}, {0x3be3e000}, + {0x3be40000}, {0x3be42000}, {0x3be44000}, {0x3be46000}, + {0x3be48000}, {0x3be4a000}, {0x3be4c000}, {0x3be4e000}, + {0x3be50000}, {0x3be52000}, {0x3be54000}, {0x3be56000}, + {0x3be58000}, {0x3be5a000}, {0x3be5c000}, {0x3be5e000}, + {0x3be60000}, {0x3be62000}, {0x3be64000}, {0x3be66000}, + {0x3be68000}, {0x3be6a000}, {0x3be6c000}, {0x3be6e000}, + {0x3be70000}, {0x3be72000}, {0x3be74000}, {0x3be76000}, + {0x3be78000}, {0x3be7a000}, {0x3be7c000}, {0x3be7e000}, + {0x3be80000}, {0x3be82000}, {0x3be84000}, {0x3be86000}, + {0x3be88000}, {0x3be8a000}, {0x3be8c000}, {0x3be8e000}, + {0x3be90000}, {0x3be92000}, {0x3be94000}, {0x3be96000}, + {0x3be98000}, {0x3be9a000}, {0x3be9c000}, {0x3be9e000}, + {0x3bea0000}, {0x3bea2000}, {0x3bea4000}, {0x3bea6000}, + {0x3bea8000}, {0x3beaa000}, {0x3beac000}, {0x3beae000}, + {0x3beb0000}, {0x3beb2000}, {0x3beb4000}, {0x3beb6000}, + {0x3beb8000}, {0x3beba000}, {0x3bebc000}, {0x3bebe000}, + {0x3bec0000}, {0x3bec2000}, {0x3bec4000}, {0x3bec6000}, + {0x3bec8000}, {0x3beca000}, {0x3becc000}, {0x3bece000}, + {0x3bed0000}, {0x3bed2000}, {0x3bed4000}, {0x3bed6000}, + {0x3bed8000}, {0x3beda000}, {0x3bedc000}, {0x3bede000}, + {0x3bee0000}, {0x3bee2000}, {0x3bee4000}, {0x3bee6000}, + {0x3bee8000}, {0x3beea000}, {0x3beec000}, {0x3beee000}, + {0x3bef0000}, {0x3bef2000}, {0x3bef4000}, {0x3bef6000}, + {0x3bef8000}, {0x3befa000}, {0x3befc000}, {0x3befe000}, + {0x3bf00000}, {0x3bf02000}, {0x3bf04000}, {0x3bf06000}, + {0x3bf08000}, {0x3bf0a000}, {0x3bf0c000}, {0x3bf0e000}, + {0x3bf10000}, {0x3bf12000}, {0x3bf14000}, {0x3bf16000}, + {0x3bf18000}, {0x3bf1a000}, {0x3bf1c000}, {0x3bf1e000}, + {0x3bf20000}, {0x3bf22000}, {0x3bf24000}, {0x3bf26000}, + {0x3bf28000}, {0x3bf2a000}, {0x3bf2c000}, {0x3bf2e000}, + {0x3bf30000}, {0x3bf32000}, {0x3bf34000}, {0x3bf36000}, + {0x3bf38000}, {0x3bf3a000}, {0x3bf3c000}, {0x3bf3e000}, + {0x3bf40000}, {0x3bf42000}, {0x3bf44000}, {0x3bf46000}, + {0x3bf48000}, {0x3bf4a000}, {0x3bf4c000}, {0x3bf4e000}, + {0x3bf50000}, {0x3bf52000}, {0x3bf54000}, {0x3bf56000}, + {0x3bf58000}, {0x3bf5a000}, {0x3bf5c000}, {0x3bf5e000}, + {0x3bf60000}, {0x3bf62000}, {0x3bf64000}, {0x3bf66000}, + {0x3bf68000}, {0x3bf6a000}, {0x3bf6c000}, {0x3bf6e000}, + {0x3bf70000}, {0x3bf72000}, {0x3bf74000}, {0x3bf76000}, + {0x3bf78000}, {0x3bf7a000}, {0x3bf7c000}, {0x3bf7e000}, + {0x3bf80000}, {0x3bf82000}, {0x3bf84000}, {0x3bf86000}, + {0x3bf88000}, {0x3bf8a000}, {0x3bf8c000}, {0x3bf8e000}, + {0x3bf90000}, {0x3bf92000}, {0x3bf94000}, {0x3bf96000}, + {0x3bf98000}, {0x3bf9a000}, {0x3bf9c000}, {0x3bf9e000}, + {0x3bfa0000}, {0x3bfa2000}, {0x3bfa4000}, {0x3bfa6000}, + {0x3bfa8000}, {0x3bfaa000}, {0x3bfac000}, {0x3bfae000}, + {0x3bfb0000}, {0x3bfb2000}, {0x3bfb4000}, {0x3bfb6000}, + {0x3bfb8000}, {0x3bfba000}, {0x3bfbc000}, {0x3bfbe000}, + {0x3bfc0000}, {0x3bfc2000}, {0x3bfc4000}, {0x3bfc6000}, + {0x3bfc8000}, {0x3bfca000}, {0x3bfcc000}, {0x3bfce000}, + {0x3bfd0000}, {0x3bfd2000}, {0x3bfd4000}, {0x3bfd6000}, + {0x3bfd8000}, {0x3bfda000}, {0x3bfdc000}, {0x3bfde000}, + {0x3bfe0000}, {0x3bfe2000}, {0x3bfe4000}, {0x3bfe6000}, + {0x3bfe8000}, {0x3bfea000}, {0x3bfec000}, {0x3bfee000}, + {0x3bff0000}, {0x3bff2000}, {0x3bff4000}, {0x3bff6000}, + {0x3bff8000}, {0x3bffa000}, {0x3bffc000}, {0x3bffe000}, + {0x3c000000}, {0x3c002000}, {0x3c004000}, {0x3c006000}, + {0x3c008000}, {0x3c00a000}, {0x3c00c000}, {0x3c00e000}, + {0x3c010000}, {0x3c012000}, {0x3c014000}, {0x3c016000}, + {0x3c018000}, {0x3c01a000}, {0x3c01c000}, {0x3c01e000}, + {0x3c020000}, {0x3c022000}, {0x3c024000}, {0x3c026000}, + {0x3c028000}, {0x3c02a000}, {0x3c02c000}, {0x3c02e000}, + {0x3c030000}, {0x3c032000}, {0x3c034000}, {0x3c036000}, + {0x3c038000}, {0x3c03a000}, {0x3c03c000}, {0x3c03e000}, + {0x3c040000}, {0x3c042000}, {0x3c044000}, {0x3c046000}, + {0x3c048000}, {0x3c04a000}, {0x3c04c000}, {0x3c04e000}, + {0x3c050000}, {0x3c052000}, {0x3c054000}, {0x3c056000}, + {0x3c058000}, {0x3c05a000}, {0x3c05c000}, {0x3c05e000}, + {0x3c060000}, {0x3c062000}, {0x3c064000}, {0x3c066000}, + {0x3c068000}, {0x3c06a000}, {0x3c06c000}, {0x3c06e000}, + {0x3c070000}, {0x3c072000}, {0x3c074000}, {0x3c076000}, + {0x3c078000}, {0x3c07a000}, {0x3c07c000}, {0x3c07e000}, + {0x3c080000}, {0x3c082000}, {0x3c084000}, {0x3c086000}, + {0x3c088000}, {0x3c08a000}, {0x3c08c000}, {0x3c08e000}, + {0x3c090000}, {0x3c092000}, {0x3c094000}, {0x3c096000}, + {0x3c098000}, {0x3c09a000}, {0x3c09c000}, {0x3c09e000}, + {0x3c0a0000}, {0x3c0a2000}, {0x3c0a4000}, {0x3c0a6000}, + {0x3c0a8000}, {0x3c0aa000}, {0x3c0ac000}, {0x3c0ae000}, + {0x3c0b0000}, {0x3c0b2000}, {0x3c0b4000}, {0x3c0b6000}, + {0x3c0b8000}, {0x3c0ba000}, {0x3c0bc000}, {0x3c0be000}, + {0x3c0c0000}, {0x3c0c2000}, {0x3c0c4000}, {0x3c0c6000}, + {0x3c0c8000}, {0x3c0ca000}, {0x3c0cc000}, {0x3c0ce000}, + {0x3c0d0000}, {0x3c0d2000}, {0x3c0d4000}, {0x3c0d6000}, + {0x3c0d8000}, {0x3c0da000}, {0x3c0dc000}, {0x3c0de000}, + {0x3c0e0000}, {0x3c0e2000}, {0x3c0e4000}, {0x3c0e6000}, + {0x3c0e8000}, {0x3c0ea000}, {0x3c0ec000}, {0x3c0ee000}, + {0x3c0f0000}, {0x3c0f2000}, {0x3c0f4000}, {0x3c0f6000}, + {0x3c0f8000}, {0x3c0fa000}, {0x3c0fc000}, {0x3c0fe000}, + {0x3c100000}, {0x3c102000}, {0x3c104000}, {0x3c106000}, + {0x3c108000}, {0x3c10a000}, {0x3c10c000}, {0x3c10e000}, + {0x3c110000}, {0x3c112000}, {0x3c114000}, {0x3c116000}, + {0x3c118000}, {0x3c11a000}, {0x3c11c000}, {0x3c11e000}, + {0x3c120000}, {0x3c122000}, {0x3c124000}, {0x3c126000}, + {0x3c128000}, {0x3c12a000}, {0x3c12c000}, {0x3c12e000}, + {0x3c130000}, {0x3c132000}, {0x3c134000}, {0x3c136000}, + {0x3c138000}, {0x3c13a000}, {0x3c13c000}, {0x3c13e000}, + {0x3c140000}, {0x3c142000}, {0x3c144000}, {0x3c146000}, + {0x3c148000}, {0x3c14a000}, {0x3c14c000}, {0x3c14e000}, + {0x3c150000}, {0x3c152000}, {0x3c154000}, {0x3c156000}, + {0x3c158000}, {0x3c15a000}, {0x3c15c000}, {0x3c15e000}, + {0x3c160000}, {0x3c162000}, {0x3c164000}, {0x3c166000}, + {0x3c168000}, {0x3c16a000}, {0x3c16c000}, {0x3c16e000}, + {0x3c170000}, {0x3c172000}, {0x3c174000}, {0x3c176000}, + {0x3c178000}, {0x3c17a000}, {0x3c17c000}, {0x3c17e000}, + {0x3c180000}, {0x3c182000}, {0x3c184000}, {0x3c186000}, + {0x3c188000}, {0x3c18a000}, {0x3c18c000}, {0x3c18e000}, + {0x3c190000}, {0x3c192000}, {0x3c194000}, {0x3c196000}, + {0x3c198000}, {0x3c19a000}, {0x3c19c000}, {0x3c19e000}, + {0x3c1a0000}, {0x3c1a2000}, {0x3c1a4000}, {0x3c1a6000}, + {0x3c1a8000}, {0x3c1aa000}, {0x3c1ac000}, {0x3c1ae000}, + {0x3c1b0000}, {0x3c1b2000}, {0x3c1b4000}, {0x3c1b6000}, + {0x3c1b8000}, {0x3c1ba000}, {0x3c1bc000}, {0x3c1be000}, + {0x3c1c0000}, {0x3c1c2000}, {0x3c1c4000}, {0x3c1c6000}, + {0x3c1c8000}, {0x3c1ca000}, {0x3c1cc000}, {0x3c1ce000}, + {0x3c1d0000}, {0x3c1d2000}, {0x3c1d4000}, {0x3c1d6000}, + {0x3c1d8000}, {0x3c1da000}, {0x3c1dc000}, {0x3c1de000}, + {0x3c1e0000}, {0x3c1e2000}, {0x3c1e4000}, {0x3c1e6000}, + {0x3c1e8000}, {0x3c1ea000}, {0x3c1ec000}, {0x3c1ee000}, + {0x3c1f0000}, {0x3c1f2000}, {0x3c1f4000}, {0x3c1f6000}, + {0x3c1f8000}, {0x3c1fa000}, {0x3c1fc000}, {0x3c1fe000}, + {0x3c200000}, {0x3c202000}, {0x3c204000}, {0x3c206000}, + {0x3c208000}, {0x3c20a000}, {0x3c20c000}, {0x3c20e000}, + {0x3c210000}, {0x3c212000}, {0x3c214000}, {0x3c216000}, + {0x3c218000}, {0x3c21a000}, {0x3c21c000}, {0x3c21e000}, + {0x3c220000}, {0x3c222000}, {0x3c224000}, {0x3c226000}, + {0x3c228000}, {0x3c22a000}, {0x3c22c000}, {0x3c22e000}, + {0x3c230000}, {0x3c232000}, {0x3c234000}, {0x3c236000}, + {0x3c238000}, {0x3c23a000}, {0x3c23c000}, {0x3c23e000}, + {0x3c240000}, {0x3c242000}, {0x3c244000}, {0x3c246000}, + {0x3c248000}, {0x3c24a000}, {0x3c24c000}, {0x3c24e000}, + {0x3c250000}, {0x3c252000}, {0x3c254000}, {0x3c256000}, + {0x3c258000}, {0x3c25a000}, {0x3c25c000}, {0x3c25e000}, + {0x3c260000}, {0x3c262000}, {0x3c264000}, {0x3c266000}, + {0x3c268000}, {0x3c26a000}, {0x3c26c000}, {0x3c26e000}, + {0x3c270000}, {0x3c272000}, {0x3c274000}, {0x3c276000}, + {0x3c278000}, {0x3c27a000}, {0x3c27c000}, {0x3c27e000}, + {0x3c280000}, {0x3c282000}, {0x3c284000}, {0x3c286000}, + {0x3c288000}, {0x3c28a000}, {0x3c28c000}, {0x3c28e000}, + {0x3c290000}, {0x3c292000}, {0x3c294000}, {0x3c296000}, + {0x3c298000}, {0x3c29a000}, {0x3c29c000}, {0x3c29e000}, + {0x3c2a0000}, {0x3c2a2000}, {0x3c2a4000}, {0x3c2a6000}, + {0x3c2a8000}, {0x3c2aa000}, {0x3c2ac000}, {0x3c2ae000}, + {0x3c2b0000}, {0x3c2b2000}, {0x3c2b4000}, {0x3c2b6000}, + {0x3c2b8000}, {0x3c2ba000}, {0x3c2bc000}, {0x3c2be000}, + {0x3c2c0000}, {0x3c2c2000}, {0x3c2c4000}, {0x3c2c6000}, + {0x3c2c8000}, {0x3c2ca000}, {0x3c2cc000}, {0x3c2ce000}, + {0x3c2d0000}, {0x3c2d2000}, {0x3c2d4000}, {0x3c2d6000}, + {0x3c2d8000}, {0x3c2da000}, {0x3c2dc000}, {0x3c2de000}, + {0x3c2e0000}, {0x3c2e2000}, {0x3c2e4000}, {0x3c2e6000}, + {0x3c2e8000}, {0x3c2ea000}, {0x3c2ec000}, {0x3c2ee000}, + {0x3c2f0000}, {0x3c2f2000}, {0x3c2f4000}, {0x3c2f6000}, + {0x3c2f8000}, {0x3c2fa000}, {0x3c2fc000}, {0x3c2fe000}, + {0x3c300000}, {0x3c302000}, {0x3c304000}, {0x3c306000}, + {0x3c308000}, {0x3c30a000}, {0x3c30c000}, {0x3c30e000}, + {0x3c310000}, {0x3c312000}, {0x3c314000}, {0x3c316000}, + {0x3c318000}, {0x3c31a000}, {0x3c31c000}, {0x3c31e000}, + {0x3c320000}, {0x3c322000}, {0x3c324000}, {0x3c326000}, + {0x3c328000}, {0x3c32a000}, {0x3c32c000}, {0x3c32e000}, + {0x3c330000}, {0x3c332000}, {0x3c334000}, {0x3c336000}, + {0x3c338000}, {0x3c33a000}, {0x3c33c000}, {0x3c33e000}, + {0x3c340000}, {0x3c342000}, {0x3c344000}, {0x3c346000}, + {0x3c348000}, {0x3c34a000}, {0x3c34c000}, {0x3c34e000}, + {0x3c350000}, {0x3c352000}, {0x3c354000}, {0x3c356000}, + {0x3c358000}, {0x3c35a000}, {0x3c35c000}, {0x3c35e000}, + {0x3c360000}, {0x3c362000}, {0x3c364000}, {0x3c366000}, + {0x3c368000}, {0x3c36a000}, {0x3c36c000}, {0x3c36e000}, + {0x3c370000}, {0x3c372000}, {0x3c374000}, {0x3c376000}, + {0x3c378000}, {0x3c37a000}, {0x3c37c000}, {0x3c37e000}, + {0x3c380000}, {0x3c382000}, {0x3c384000}, {0x3c386000}, + {0x3c388000}, {0x3c38a000}, {0x3c38c000}, {0x3c38e000}, + {0x3c390000}, {0x3c392000}, {0x3c394000}, {0x3c396000}, + {0x3c398000}, {0x3c39a000}, {0x3c39c000}, {0x3c39e000}, + {0x3c3a0000}, {0x3c3a2000}, {0x3c3a4000}, {0x3c3a6000}, + {0x3c3a8000}, {0x3c3aa000}, {0x3c3ac000}, {0x3c3ae000}, + {0x3c3b0000}, {0x3c3b2000}, {0x3c3b4000}, {0x3c3b6000}, + {0x3c3b8000}, {0x3c3ba000}, {0x3c3bc000}, {0x3c3be000}, + {0x3c3c0000}, {0x3c3c2000}, {0x3c3c4000}, {0x3c3c6000}, + {0x3c3c8000}, {0x3c3ca000}, {0x3c3cc000}, {0x3c3ce000}, + {0x3c3d0000}, {0x3c3d2000}, {0x3c3d4000}, {0x3c3d6000}, + {0x3c3d8000}, {0x3c3da000}, {0x3c3dc000}, {0x3c3de000}, + {0x3c3e0000}, {0x3c3e2000}, {0x3c3e4000}, {0x3c3e6000}, + {0x3c3e8000}, {0x3c3ea000}, {0x3c3ec000}, {0x3c3ee000}, + {0x3c3f0000}, {0x3c3f2000}, {0x3c3f4000}, {0x3c3f6000}, + {0x3c3f8000}, {0x3c3fa000}, {0x3c3fc000}, {0x3c3fe000}, + {0x3c400000}, {0x3c402000}, {0x3c404000}, {0x3c406000}, + {0x3c408000}, {0x3c40a000}, {0x3c40c000}, {0x3c40e000}, + {0x3c410000}, {0x3c412000}, {0x3c414000}, {0x3c416000}, + {0x3c418000}, {0x3c41a000}, {0x3c41c000}, {0x3c41e000}, + {0x3c420000}, {0x3c422000}, {0x3c424000}, {0x3c426000}, + {0x3c428000}, {0x3c42a000}, {0x3c42c000}, {0x3c42e000}, + {0x3c430000}, {0x3c432000}, {0x3c434000}, {0x3c436000}, + {0x3c438000}, {0x3c43a000}, {0x3c43c000}, {0x3c43e000}, + {0x3c440000}, {0x3c442000}, {0x3c444000}, {0x3c446000}, + {0x3c448000}, {0x3c44a000}, {0x3c44c000}, {0x3c44e000}, + {0x3c450000}, {0x3c452000}, {0x3c454000}, {0x3c456000}, + {0x3c458000}, {0x3c45a000}, {0x3c45c000}, {0x3c45e000}, + {0x3c460000}, {0x3c462000}, {0x3c464000}, {0x3c466000}, + {0x3c468000}, {0x3c46a000}, {0x3c46c000}, {0x3c46e000}, + {0x3c470000}, {0x3c472000}, {0x3c474000}, {0x3c476000}, + {0x3c478000}, {0x3c47a000}, {0x3c47c000}, {0x3c47e000}, + {0x3c480000}, {0x3c482000}, {0x3c484000}, {0x3c486000}, + {0x3c488000}, {0x3c48a000}, {0x3c48c000}, {0x3c48e000}, + {0x3c490000}, {0x3c492000}, {0x3c494000}, {0x3c496000}, + {0x3c498000}, {0x3c49a000}, {0x3c49c000}, {0x3c49e000}, + {0x3c4a0000}, {0x3c4a2000}, {0x3c4a4000}, {0x3c4a6000}, + {0x3c4a8000}, {0x3c4aa000}, {0x3c4ac000}, {0x3c4ae000}, + {0x3c4b0000}, {0x3c4b2000}, {0x3c4b4000}, {0x3c4b6000}, + {0x3c4b8000}, {0x3c4ba000}, {0x3c4bc000}, {0x3c4be000}, + {0x3c4c0000}, {0x3c4c2000}, {0x3c4c4000}, {0x3c4c6000}, + {0x3c4c8000}, {0x3c4ca000}, {0x3c4cc000}, {0x3c4ce000}, + {0x3c4d0000}, {0x3c4d2000}, {0x3c4d4000}, {0x3c4d6000}, + {0x3c4d8000}, {0x3c4da000}, {0x3c4dc000}, {0x3c4de000}, + {0x3c4e0000}, {0x3c4e2000}, {0x3c4e4000}, {0x3c4e6000}, + {0x3c4e8000}, {0x3c4ea000}, {0x3c4ec000}, {0x3c4ee000}, + {0x3c4f0000}, {0x3c4f2000}, {0x3c4f4000}, {0x3c4f6000}, + {0x3c4f8000}, {0x3c4fa000}, {0x3c4fc000}, {0x3c4fe000}, + {0x3c500000}, {0x3c502000}, {0x3c504000}, {0x3c506000}, + {0x3c508000}, {0x3c50a000}, {0x3c50c000}, {0x3c50e000}, + {0x3c510000}, {0x3c512000}, {0x3c514000}, {0x3c516000}, + {0x3c518000}, {0x3c51a000}, {0x3c51c000}, {0x3c51e000}, + {0x3c520000}, {0x3c522000}, {0x3c524000}, {0x3c526000}, + {0x3c528000}, {0x3c52a000}, {0x3c52c000}, {0x3c52e000}, + {0x3c530000}, {0x3c532000}, {0x3c534000}, {0x3c536000}, + {0x3c538000}, {0x3c53a000}, {0x3c53c000}, {0x3c53e000}, + {0x3c540000}, {0x3c542000}, {0x3c544000}, {0x3c546000}, + {0x3c548000}, {0x3c54a000}, {0x3c54c000}, {0x3c54e000}, + {0x3c550000}, {0x3c552000}, {0x3c554000}, {0x3c556000}, + {0x3c558000}, {0x3c55a000}, {0x3c55c000}, {0x3c55e000}, + {0x3c560000}, {0x3c562000}, {0x3c564000}, {0x3c566000}, + {0x3c568000}, {0x3c56a000}, {0x3c56c000}, {0x3c56e000}, + {0x3c570000}, {0x3c572000}, {0x3c574000}, {0x3c576000}, + {0x3c578000}, {0x3c57a000}, {0x3c57c000}, {0x3c57e000}, + {0x3c580000}, {0x3c582000}, {0x3c584000}, {0x3c586000}, + {0x3c588000}, {0x3c58a000}, {0x3c58c000}, {0x3c58e000}, + {0x3c590000}, {0x3c592000}, {0x3c594000}, {0x3c596000}, + {0x3c598000}, {0x3c59a000}, {0x3c59c000}, {0x3c59e000}, + {0x3c5a0000}, {0x3c5a2000}, {0x3c5a4000}, {0x3c5a6000}, + {0x3c5a8000}, {0x3c5aa000}, {0x3c5ac000}, {0x3c5ae000}, + {0x3c5b0000}, {0x3c5b2000}, {0x3c5b4000}, {0x3c5b6000}, + {0x3c5b8000}, {0x3c5ba000}, {0x3c5bc000}, {0x3c5be000}, + {0x3c5c0000}, {0x3c5c2000}, {0x3c5c4000}, {0x3c5c6000}, + {0x3c5c8000}, {0x3c5ca000}, {0x3c5cc000}, {0x3c5ce000}, + {0x3c5d0000}, {0x3c5d2000}, {0x3c5d4000}, {0x3c5d6000}, + {0x3c5d8000}, {0x3c5da000}, {0x3c5dc000}, {0x3c5de000}, + {0x3c5e0000}, {0x3c5e2000}, {0x3c5e4000}, {0x3c5e6000}, + {0x3c5e8000}, {0x3c5ea000}, {0x3c5ec000}, {0x3c5ee000}, + {0x3c5f0000}, {0x3c5f2000}, {0x3c5f4000}, {0x3c5f6000}, + {0x3c5f8000}, {0x3c5fa000}, {0x3c5fc000}, {0x3c5fe000}, + {0x3c600000}, {0x3c602000}, {0x3c604000}, {0x3c606000}, + {0x3c608000}, {0x3c60a000}, {0x3c60c000}, {0x3c60e000}, + {0x3c610000}, {0x3c612000}, {0x3c614000}, {0x3c616000}, + {0x3c618000}, {0x3c61a000}, {0x3c61c000}, {0x3c61e000}, + {0x3c620000}, {0x3c622000}, {0x3c624000}, {0x3c626000}, + {0x3c628000}, {0x3c62a000}, {0x3c62c000}, {0x3c62e000}, + {0x3c630000}, {0x3c632000}, {0x3c634000}, {0x3c636000}, + {0x3c638000}, {0x3c63a000}, {0x3c63c000}, {0x3c63e000}, + {0x3c640000}, {0x3c642000}, {0x3c644000}, {0x3c646000}, + {0x3c648000}, {0x3c64a000}, {0x3c64c000}, {0x3c64e000}, + {0x3c650000}, {0x3c652000}, {0x3c654000}, {0x3c656000}, + {0x3c658000}, {0x3c65a000}, {0x3c65c000}, {0x3c65e000}, + {0x3c660000}, {0x3c662000}, {0x3c664000}, {0x3c666000}, + {0x3c668000}, {0x3c66a000}, {0x3c66c000}, {0x3c66e000}, + {0x3c670000}, {0x3c672000}, {0x3c674000}, {0x3c676000}, + {0x3c678000}, {0x3c67a000}, {0x3c67c000}, {0x3c67e000}, + {0x3c680000}, {0x3c682000}, {0x3c684000}, {0x3c686000}, + {0x3c688000}, {0x3c68a000}, {0x3c68c000}, {0x3c68e000}, + {0x3c690000}, {0x3c692000}, {0x3c694000}, {0x3c696000}, + {0x3c698000}, {0x3c69a000}, {0x3c69c000}, {0x3c69e000}, + {0x3c6a0000}, {0x3c6a2000}, {0x3c6a4000}, {0x3c6a6000}, + {0x3c6a8000}, {0x3c6aa000}, {0x3c6ac000}, {0x3c6ae000}, + {0x3c6b0000}, {0x3c6b2000}, {0x3c6b4000}, {0x3c6b6000}, + {0x3c6b8000}, {0x3c6ba000}, {0x3c6bc000}, {0x3c6be000}, + {0x3c6c0000}, {0x3c6c2000}, {0x3c6c4000}, {0x3c6c6000}, + {0x3c6c8000}, {0x3c6ca000}, {0x3c6cc000}, {0x3c6ce000}, + {0x3c6d0000}, {0x3c6d2000}, {0x3c6d4000}, {0x3c6d6000}, + {0x3c6d8000}, {0x3c6da000}, {0x3c6dc000}, {0x3c6de000}, + {0x3c6e0000}, {0x3c6e2000}, {0x3c6e4000}, {0x3c6e6000}, + {0x3c6e8000}, {0x3c6ea000}, {0x3c6ec000}, {0x3c6ee000}, + {0x3c6f0000}, {0x3c6f2000}, {0x3c6f4000}, {0x3c6f6000}, + {0x3c6f8000}, {0x3c6fa000}, {0x3c6fc000}, {0x3c6fe000}, + {0x3c700000}, {0x3c702000}, {0x3c704000}, {0x3c706000}, + {0x3c708000}, {0x3c70a000}, {0x3c70c000}, {0x3c70e000}, + {0x3c710000}, {0x3c712000}, {0x3c714000}, {0x3c716000}, + {0x3c718000}, {0x3c71a000}, {0x3c71c000}, {0x3c71e000}, + {0x3c720000}, {0x3c722000}, {0x3c724000}, {0x3c726000}, + {0x3c728000}, {0x3c72a000}, {0x3c72c000}, {0x3c72e000}, + {0x3c730000}, {0x3c732000}, {0x3c734000}, {0x3c736000}, + {0x3c738000}, {0x3c73a000}, {0x3c73c000}, {0x3c73e000}, + {0x3c740000}, {0x3c742000}, {0x3c744000}, {0x3c746000}, + {0x3c748000}, {0x3c74a000}, {0x3c74c000}, {0x3c74e000}, + {0x3c750000}, {0x3c752000}, {0x3c754000}, {0x3c756000}, + {0x3c758000}, {0x3c75a000}, {0x3c75c000}, {0x3c75e000}, + {0x3c760000}, {0x3c762000}, {0x3c764000}, {0x3c766000}, + {0x3c768000}, {0x3c76a000}, {0x3c76c000}, {0x3c76e000}, + {0x3c770000}, {0x3c772000}, {0x3c774000}, {0x3c776000}, + {0x3c778000}, {0x3c77a000}, {0x3c77c000}, {0x3c77e000}, + {0x3c780000}, {0x3c782000}, {0x3c784000}, {0x3c786000}, + {0x3c788000}, {0x3c78a000}, {0x3c78c000}, {0x3c78e000}, + {0x3c790000}, {0x3c792000}, {0x3c794000}, {0x3c796000}, + {0x3c798000}, {0x3c79a000}, {0x3c79c000}, {0x3c79e000}, + {0x3c7a0000}, {0x3c7a2000}, {0x3c7a4000}, {0x3c7a6000}, + {0x3c7a8000}, {0x3c7aa000}, {0x3c7ac000}, {0x3c7ae000}, + {0x3c7b0000}, {0x3c7b2000}, {0x3c7b4000}, {0x3c7b6000}, + {0x3c7b8000}, {0x3c7ba000}, {0x3c7bc000}, {0x3c7be000}, + {0x3c7c0000}, {0x3c7c2000}, {0x3c7c4000}, {0x3c7c6000}, + {0x3c7c8000}, {0x3c7ca000}, {0x3c7cc000}, {0x3c7ce000}, + {0x3c7d0000}, {0x3c7d2000}, {0x3c7d4000}, {0x3c7d6000}, + {0x3c7d8000}, {0x3c7da000}, {0x3c7dc000}, {0x3c7de000}, + {0x3c7e0000}, {0x3c7e2000}, {0x3c7e4000}, {0x3c7e6000}, + {0x3c7e8000}, {0x3c7ea000}, {0x3c7ec000}, {0x3c7ee000}, + {0x3c7f0000}, {0x3c7f2000}, {0x3c7f4000}, {0x3c7f6000}, + {0x3c7f8000}, {0x3c7fa000}, {0x3c7fc000}, {0x3c7fe000}, + {0x3c800000}, {0x3c802000}, {0x3c804000}, {0x3c806000}, + {0x3c808000}, {0x3c80a000}, {0x3c80c000}, {0x3c80e000}, + {0x3c810000}, {0x3c812000}, {0x3c814000}, {0x3c816000}, + {0x3c818000}, {0x3c81a000}, {0x3c81c000}, {0x3c81e000}, + {0x3c820000}, {0x3c822000}, {0x3c824000}, {0x3c826000}, + {0x3c828000}, {0x3c82a000}, {0x3c82c000}, {0x3c82e000}, + {0x3c830000}, {0x3c832000}, {0x3c834000}, {0x3c836000}, + {0x3c838000}, {0x3c83a000}, {0x3c83c000}, {0x3c83e000}, + {0x3c840000}, {0x3c842000}, {0x3c844000}, {0x3c846000}, + {0x3c848000}, {0x3c84a000}, {0x3c84c000}, {0x3c84e000}, + {0x3c850000}, {0x3c852000}, {0x3c854000}, {0x3c856000}, + {0x3c858000}, {0x3c85a000}, {0x3c85c000}, {0x3c85e000}, + {0x3c860000}, {0x3c862000}, {0x3c864000}, {0x3c866000}, + {0x3c868000}, {0x3c86a000}, {0x3c86c000}, {0x3c86e000}, + {0x3c870000}, {0x3c872000}, {0x3c874000}, {0x3c876000}, + {0x3c878000}, {0x3c87a000}, {0x3c87c000}, {0x3c87e000}, + {0x3c880000}, {0x3c882000}, {0x3c884000}, {0x3c886000}, + {0x3c888000}, {0x3c88a000}, {0x3c88c000}, {0x3c88e000}, + {0x3c890000}, {0x3c892000}, {0x3c894000}, {0x3c896000}, + {0x3c898000}, {0x3c89a000}, {0x3c89c000}, {0x3c89e000}, + {0x3c8a0000}, {0x3c8a2000}, {0x3c8a4000}, {0x3c8a6000}, + {0x3c8a8000}, {0x3c8aa000}, {0x3c8ac000}, {0x3c8ae000}, + {0x3c8b0000}, {0x3c8b2000}, {0x3c8b4000}, {0x3c8b6000}, + {0x3c8b8000}, {0x3c8ba000}, {0x3c8bc000}, {0x3c8be000}, + {0x3c8c0000}, {0x3c8c2000}, {0x3c8c4000}, {0x3c8c6000}, + {0x3c8c8000}, {0x3c8ca000}, {0x3c8cc000}, {0x3c8ce000}, + {0x3c8d0000}, {0x3c8d2000}, {0x3c8d4000}, {0x3c8d6000}, + {0x3c8d8000}, {0x3c8da000}, {0x3c8dc000}, {0x3c8de000}, + {0x3c8e0000}, {0x3c8e2000}, {0x3c8e4000}, {0x3c8e6000}, + {0x3c8e8000}, {0x3c8ea000}, {0x3c8ec000}, {0x3c8ee000}, + {0x3c8f0000}, {0x3c8f2000}, {0x3c8f4000}, {0x3c8f6000}, + {0x3c8f8000}, {0x3c8fa000}, {0x3c8fc000}, {0x3c8fe000}, + {0x3c900000}, {0x3c902000}, {0x3c904000}, {0x3c906000}, + {0x3c908000}, {0x3c90a000}, {0x3c90c000}, {0x3c90e000}, + {0x3c910000}, {0x3c912000}, {0x3c914000}, {0x3c916000}, + {0x3c918000}, {0x3c91a000}, {0x3c91c000}, {0x3c91e000}, + {0x3c920000}, {0x3c922000}, {0x3c924000}, {0x3c926000}, + {0x3c928000}, {0x3c92a000}, {0x3c92c000}, {0x3c92e000}, + {0x3c930000}, {0x3c932000}, {0x3c934000}, {0x3c936000}, + {0x3c938000}, {0x3c93a000}, {0x3c93c000}, {0x3c93e000}, + {0x3c940000}, {0x3c942000}, {0x3c944000}, {0x3c946000}, + {0x3c948000}, {0x3c94a000}, {0x3c94c000}, {0x3c94e000}, + {0x3c950000}, {0x3c952000}, {0x3c954000}, {0x3c956000}, + {0x3c958000}, {0x3c95a000}, {0x3c95c000}, {0x3c95e000}, + {0x3c960000}, {0x3c962000}, {0x3c964000}, {0x3c966000}, + {0x3c968000}, {0x3c96a000}, {0x3c96c000}, {0x3c96e000}, + {0x3c970000}, {0x3c972000}, {0x3c974000}, {0x3c976000}, + {0x3c978000}, {0x3c97a000}, {0x3c97c000}, {0x3c97e000}, + {0x3c980000}, {0x3c982000}, {0x3c984000}, {0x3c986000}, + {0x3c988000}, {0x3c98a000}, {0x3c98c000}, {0x3c98e000}, + {0x3c990000}, {0x3c992000}, {0x3c994000}, {0x3c996000}, + {0x3c998000}, {0x3c99a000}, {0x3c99c000}, {0x3c99e000}, + {0x3c9a0000}, {0x3c9a2000}, {0x3c9a4000}, {0x3c9a6000}, + {0x3c9a8000}, {0x3c9aa000}, {0x3c9ac000}, {0x3c9ae000}, + {0x3c9b0000}, {0x3c9b2000}, {0x3c9b4000}, {0x3c9b6000}, + {0x3c9b8000}, {0x3c9ba000}, {0x3c9bc000}, {0x3c9be000}, + {0x3c9c0000}, {0x3c9c2000}, {0x3c9c4000}, {0x3c9c6000}, + {0x3c9c8000}, {0x3c9ca000}, {0x3c9cc000}, {0x3c9ce000}, + {0x3c9d0000}, {0x3c9d2000}, {0x3c9d4000}, {0x3c9d6000}, + {0x3c9d8000}, {0x3c9da000}, {0x3c9dc000}, {0x3c9de000}, + {0x3c9e0000}, {0x3c9e2000}, {0x3c9e4000}, {0x3c9e6000}, + {0x3c9e8000}, {0x3c9ea000}, {0x3c9ec000}, {0x3c9ee000}, + {0x3c9f0000}, {0x3c9f2000}, {0x3c9f4000}, {0x3c9f6000}, + {0x3c9f8000}, {0x3c9fa000}, {0x3c9fc000}, {0x3c9fe000}, + {0x3ca00000}, {0x3ca02000}, {0x3ca04000}, {0x3ca06000}, + {0x3ca08000}, {0x3ca0a000}, {0x3ca0c000}, {0x3ca0e000}, + {0x3ca10000}, {0x3ca12000}, {0x3ca14000}, {0x3ca16000}, + {0x3ca18000}, {0x3ca1a000}, {0x3ca1c000}, {0x3ca1e000}, + {0x3ca20000}, {0x3ca22000}, {0x3ca24000}, {0x3ca26000}, + {0x3ca28000}, {0x3ca2a000}, {0x3ca2c000}, {0x3ca2e000}, + {0x3ca30000}, {0x3ca32000}, {0x3ca34000}, {0x3ca36000}, + {0x3ca38000}, {0x3ca3a000}, {0x3ca3c000}, {0x3ca3e000}, + {0x3ca40000}, {0x3ca42000}, {0x3ca44000}, {0x3ca46000}, + {0x3ca48000}, {0x3ca4a000}, {0x3ca4c000}, {0x3ca4e000}, + {0x3ca50000}, {0x3ca52000}, {0x3ca54000}, {0x3ca56000}, + {0x3ca58000}, {0x3ca5a000}, {0x3ca5c000}, {0x3ca5e000}, + {0x3ca60000}, {0x3ca62000}, {0x3ca64000}, {0x3ca66000}, + {0x3ca68000}, {0x3ca6a000}, {0x3ca6c000}, {0x3ca6e000}, + {0x3ca70000}, {0x3ca72000}, {0x3ca74000}, {0x3ca76000}, + {0x3ca78000}, {0x3ca7a000}, {0x3ca7c000}, {0x3ca7e000}, + {0x3ca80000}, {0x3ca82000}, {0x3ca84000}, {0x3ca86000}, + {0x3ca88000}, {0x3ca8a000}, {0x3ca8c000}, {0x3ca8e000}, + {0x3ca90000}, {0x3ca92000}, {0x3ca94000}, {0x3ca96000}, + {0x3ca98000}, {0x3ca9a000}, {0x3ca9c000}, {0x3ca9e000}, + {0x3caa0000}, {0x3caa2000}, {0x3caa4000}, {0x3caa6000}, + {0x3caa8000}, {0x3caaa000}, {0x3caac000}, {0x3caae000}, + {0x3cab0000}, {0x3cab2000}, {0x3cab4000}, {0x3cab6000}, + {0x3cab8000}, {0x3caba000}, {0x3cabc000}, {0x3cabe000}, + {0x3cac0000}, {0x3cac2000}, {0x3cac4000}, {0x3cac6000}, + {0x3cac8000}, {0x3caca000}, {0x3cacc000}, {0x3cace000}, + {0x3cad0000}, {0x3cad2000}, {0x3cad4000}, {0x3cad6000}, + {0x3cad8000}, {0x3cada000}, {0x3cadc000}, {0x3cade000}, + {0x3cae0000}, {0x3cae2000}, {0x3cae4000}, {0x3cae6000}, + {0x3cae8000}, {0x3caea000}, {0x3caec000}, {0x3caee000}, + {0x3caf0000}, {0x3caf2000}, {0x3caf4000}, {0x3caf6000}, + {0x3caf8000}, {0x3cafa000}, {0x3cafc000}, {0x3cafe000}, + {0x3cb00000}, {0x3cb02000}, {0x3cb04000}, {0x3cb06000}, + {0x3cb08000}, {0x3cb0a000}, {0x3cb0c000}, {0x3cb0e000}, + {0x3cb10000}, {0x3cb12000}, {0x3cb14000}, {0x3cb16000}, + {0x3cb18000}, {0x3cb1a000}, {0x3cb1c000}, {0x3cb1e000}, + {0x3cb20000}, {0x3cb22000}, {0x3cb24000}, {0x3cb26000}, + {0x3cb28000}, {0x3cb2a000}, {0x3cb2c000}, {0x3cb2e000}, + {0x3cb30000}, {0x3cb32000}, {0x3cb34000}, {0x3cb36000}, + {0x3cb38000}, {0x3cb3a000}, {0x3cb3c000}, {0x3cb3e000}, + {0x3cb40000}, {0x3cb42000}, {0x3cb44000}, {0x3cb46000}, + {0x3cb48000}, {0x3cb4a000}, {0x3cb4c000}, {0x3cb4e000}, + {0x3cb50000}, {0x3cb52000}, {0x3cb54000}, {0x3cb56000}, + {0x3cb58000}, {0x3cb5a000}, {0x3cb5c000}, {0x3cb5e000}, + {0x3cb60000}, {0x3cb62000}, {0x3cb64000}, {0x3cb66000}, + {0x3cb68000}, {0x3cb6a000}, {0x3cb6c000}, {0x3cb6e000}, + {0x3cb70000}, {0x3cb72000}, {0x3cb74000}, {0x3cb76000}, + {0x3cb78000}, {0x3cb7a000}, {0x3cb7c000}, {0x3cb7e000}, + {0x3cb80000}, {0x3cb82000}, {0x3cb84000}, {0x3cb86000}, + {0x3cb88000}, {0x3cb8a000}, {0x3cb8c000}, {0x3cb8e000}, + {0x3cb90000}, {0x3cb92000}, {0x3cb94000}, {0x3cb96000}, + {0x3cb98000}, {0x3cb9a000}, {0x3cb9c000}, {0x3cb9e000}, + {0x3cba0000}, {0x3cba2000}, {0x3cba4000}, {0x3cba6000}, + {0x3cba8000}, {0x3cbaa000}, {0x3cbac000}, {0x3cbae000}, + {0x3cbb0000}, {0x3cbb2000}, {0x3cbb4000}, {0x3cbb6000}, + {0x3cbb8000}, {0x3cbba000}, {0x3cbbc000}, {0x3cbbe000}, + {0x3cbc0000}, {0x3cbc2000}, {0x3cbc4000}, {0x3cbc6000}, + {0x3cbc8000}, {0x3cbca000}, {0x3cbcc000}, {0x3cbce000}, + {0x3cbd0000}, {0x3cbd2000}, {0x3cbd4000}, {0x3cbd6000}, + {0x3cbd8000}, {0x3cbda000}, {0x3cbdc000}, {0x3cbde000}, + {0x3cbe0000}, {0x3cbe2000}, {0x3cbe4000}, {0x3cbe6000}, + {0x3cbe8000}, {0x3cbea000}, {0x3cbec000}, {0x3cbee000}, + {0x3cbf0000}, {0x3cbf2000}, {0x3cbf4000}, {0x3cbf6000}, + {0x3cbf8000}, {0x3cbfa000}, {0x3cbfc000}, {0x3cbfe000}, + {0x3cc00000}, {0x3cc02000}, {0x3cc04000}, {0x3cc06000}, + {0x3cc08000}, {0x3cc0a000}, {0x3cc0c000}, {0x3cc0e000}, + {0x3cc10000}, {0x3cc12000}, {0x3cc14000}, {0x3cc16000}, + {0x3cc18000}, {0x3cc1a000}, {0x3cc1c000}, {0x3cc1e000}, + {0x3cc20000}, {0x3cc22000}, {0x3cc24000}, {0x3cc26000}, + {0x3cc28000}, {0x3cc2a000}, {0x3cc2c000}, {0x3cc2e000}, + {0x3cc30000}, {0x3cc32000}, {0x3cc34000}, {0x3cc36000}, + {0x3cc38000}, {0x3cc3a000}, {0x3cc3c000}, {0x3cc3e000}, + {0x3cc40000}, {0x3cc42000}, {0x3cc44000}, {0x3cc46000}, + {0x3cc48000}, {0x3cc4a000}, {0x3cc4c000}, {0x3cc4e000}, + {0x3cc50000}, {0x3cc52000}, {0x3cc54000}, {0x3cc56000}, + {0x3cc58000}, {0x3cc5a000}, {0x3cc5c000}, {0x3cc5e000}, + {0x3cc60000}, {0x3cc62000}, {0x3cc64000}, {0x3cc66000}, + {0x3cc68000}, {0x3cc6a000}, {0x3cc6c000}, {0x3cc6e000}, + {0x3cc70000}, {0x3cc72000}, {0x3cc74000}, {0x3cc76000}, + {0x3cc78000}, {0x3cc7a000}, {0x3cc7c000}, {0x3cc7e000}, + {0x3cc80000}, {0x3cc82000}, {0x3cc84000}, {0x3cc86000}, + {0x3cc88000}, {0x3cc8a000}, {0x3cc8c000}, {0x3cc8e000}, + {0x3cc90000}, {0x3cc92000}, {0x3cc94000}, {0x3cc96000}, + {0x3cc98000}, {0x3cc9a000}, {0x3cc9c000}, {0x3cc9e000}, + {0x3cca0000}, {0x3cca2000}, {0x3cca4000}, {0x3cca6000}, + {0x3cca8000}, {0x3ccaa000}, {0x3ccac000}, {0x3ccae000}, + {0x3ccb0000}, {0x3ccb2000}, {0x3ccb4000}, {0x3ccb6000}, + {0x3ccb8000}, {0x3ccba000}, {0x3ccbc000}, {0x3ccbe000}, + {0x3ccc0000}, {0x3ccc2000}, {0x3ccc4000}, {0x3ccc6000}, + {0x3ccc8000}, {0x3ccca000}, {0x3cccc000}, {0x3ccce000}, + {0x3ccd0000}, {0x3ccd2000}, {0x3ccd4000}, {0x3ccd6000}, + {0x3ccd8000}, {0x3ccda000}, {0x3ccdc000}, {0x3ccde000}, + {0x3cce0000}, {0x3cce2000}, {0x3cce4000}, {0x3cce6000}, + {0x3cce8000}, {0x3ccea000}, {0x3ccec000}, {0x3ccee000}, + {0x3ccf0000}, {0x3ccf2000}, {0x3ccf4000}, {0x3ccf6000}, + {0x3ccf8000}, {0x3ccfa000}, {0x3ccfc000}, {0x3ccfe000}, + {0x3cd00000}, {0x3cd02000}, {0x3cd04000}, {0x3cd06000}, + {0x3cd08000}, {0x3cd0a000}, {0x3cd0c000}, {0x3cd0e000}, + {0x3cd10000}, {0x3cd12000}, {0x3cd14000}, {0x3cd16000}, + {0x3cd18000}, {0x3cd1a000}, {0x3cd1c000}, {0x3cd1e000}, + {0x3cd20000}, {0x3cd22000}, {0x3cd24000}, {0x3cd26000}, + {0x3cd28000}, {0x3cd2a000}, {0x3cd2c000}, {0x3cd2e000}, + {0x3cd30000}, {0x3cd32000}, {0x3cd34000}, {0x3cd36000}, + {0x3cd38000}, {0x3cd3a000}, {0x3cd3c000}, {0x3cd3e000}, + {0x3cd40000}, {0x3cd42000}, {0x3cd44000}, {0x3cd46000}, + {0x3cd48000}, {0x3cd4a000}, {0x3cd4c000}, {0x3cd4e000}, + {0x3cd50000}, {0x3cd52000}, {0x3cd54000}, {0x3cd56000}, + {0x3cd58000}, {0x3cd5a000}, {0x3cd5c000}, {0x3cd5e000}, + {0x3cd60000}, {0x3cd62000}, {0x3cd64000}, {0x3cd66000}, + {0x3cd68000}, {0x3cd6a000}, {0x3cd6c000}, {0x3cd6e000}, + {0x3cd70000}, {0x3cd72000}, {0x3cd74000}, {0x3cd76000}, + {0x3cd78000}, {0x3cd7a000}, {0x3cd7c000}, {0x3cd7e000}, + {0x3cd80000}, {0x3cd82000}, {0x3cd84000}, {0x3cd86000}, + {0x3cd88000}, {0x3cd8a000}, {0x3cd8c000}, {0x3cd8e000}, + {0x3cd90000}, {0x3cd92000}, {0x3cd94000}, {0x3cd96000}, + {0x3cd98000}, {0x3cd9a000}, {0x3cd9c000}, {0x3cd9e000}, + {0x3cda0000}, {0x3cda2000}, {0x3cda4000}, {0x3cda6000}, + {0x3cda8000}, {0x3cdaa000}, {0x3cdac000}, {0x3cdae000}, + {0x3cdb0000}, {0x3cdb2000}, {0x3cdb4000}, {0x3cdb6000}, + {0x3cdb8000}, {0x3cdba000}, {0x3cdbc000}, {0x3cdbe000}, + {0x3cdc0000}, {0x3cdc2000}, {0x3cdc4000}, {0x3cdc6000}, + {0x3cdc8000}, {0x3cdca000}, {0x3cdcc000}, {0x3cdce000}, + {0x3cdd0000}, {0x3cdd2000}, {0x3cdd4000}, {0x3cdd6000}, + {0x3cdd8000}, {0x3cdda000}, {0x3cddc000}, {0x3cdde000}, + {0x3cde0000}, {0x3cde2000}, {0x3cde4000}, {0x3cde6000}, + {0x3cde8000}, {0x3cdea000}, {0x3cdec000}, {0x3cdee000}, + {0x3cdf0000}, {0x3cdf2000}, {0x3cdf4000}, {0x3cdf6000}, + {0x3cdf8000}, {0x3cdfa000}, {0x3cdfc000}, {0x3cdfe000}, + {0x3ce00000}, {0x3ce02000}, {0x3ce04000}, {0x3ce06000}, + {0x3ce08000}, {0x3ce0a000}, {0x3ce0c000}, {0x3ce0e000}, + {0x3ce10000}, {0x3ce12000}, {0x3ce14000}, {0x3ce16000}, + {0x3ce18000}, {0x3ce1a000}, {0x3ce1c000}, {0x3ce1e000}, + {0x3ce20000}, {0x3ce22000}, {0x3ce24000}, {0x3ce26000}, + {0x3ce28000}, {0x3ce2a000}, {0x3ce2c000}, {0x3ce2e000}, + {0x3ce30000}, {0x3ce32000}, {0x3ce34000}, {0x3ce36000}, + {0x3ce38000}, {0x3ce3a000}, {0x3ce3c000}, {0x3ce3e000}, + {0x3ce40000}, {0x3ce42000}, {0x3ce44000}, {0x3ce46000}, + {0x3ce48000}, {0x3ce4a000}, {0x3ce4c000}, {0x3ce4e000}, + {0x3ce50000}, {0x3ce52000}, {0x3ce54000}, {0x3ce56000}, + {0x3ce58000}, {0x3ce5a000}, {0x3ce5c000}, {0x3ce5e000}, + {0x3ce60000}, {0x3ce62000}, {0x3ce64000}, {0x3ce66000}, + {0x3ce68000}, {0x3ce6a000}, {0x3ce6c000}, {0x3ce6e000}, + {0x3ce70000}, {0x3ce72000}, {0x3ce74000}, {0x3ce76000}, + {0x3ce78000}, {0x3ce7a000}, {0x3ce7c000}, {0x3ce7e000}, + {0x3ce80000}, {0x3ce82000}, {0x3ce84000}, {0x3ce86000}, + {0x3ce88000}, {0x3ce8a000}, {0x3ce8c000}, {0x3ce8e000}, + {0x3ce90000}, {0x3ce92000}, {0x3ce94000}, {0x3ce96000}, + {0x3ce98000}, {0x3ce9a000}, {0x3ce9c000}, {0x3ce9e000}, + {0x3cea0000}, {0x3cea2000}, {0x3cea4000}, {0x3cea6000}, + {0x3cea8000}, {0x3ceaa000}, {0x3ceac000}, {0x3ceae000}, + {0x3ceb0000}, {0x3ceb2000}, {0x3ceb4000}, {0x3ceb6000}, + {0x3ceb8000}, {0x3ceba000}, {0x3cebc000}, {0x3cebe000}, + {0x3cec0000}, {0x3cec2000}, {0x3cec4000}, {0x3cec6000}, + {0x3cec8000}, {0x3ceca000}, {0x3cecc000}, {0x3cece000}, + {0x3ced0000}, {0x3ced2000}, {0x3ced4000}, {0x3ced6000}, + {0x3ced8000}, {0x3ceda000}, {0x3cedc000}, {0x3cede000}, + {0x3cee0000}, {0x3cee2000}, {0x3cee4000}, {0x3cee6000}, + {0x3cee8000}, {0x3ceea000}, {0x3ceec000}, {0x3ceee000}, + {0x3cef0000}, {0x3cef2000}, {0x3cef4000}, {0x3cef6000}, + {0x3cef8000}, {0x3cefa000}, {0x3cefc000}, {0x3cefe000}, + {0x3cf00000}, {0x3cf02000}, {0x3cf04000}, {0x3cf06000}, + {0x3cf08000}, {0x3cf0a000}, {0x3cf0c000}, {0x3cf0e000}, + {0x3cf10000}, {0x3cf12000}, {0x3cf14000}, {0x3cf16000}, + {0x3cf18000}, {0x3cf1a000}, {0x3cf1c000}, {0x3cf1e000}, + {0x3cf20000}, {0x3cf22000}, {0x3cf24000}, {0x3cf26000}, + {0x3cf28000}, {0x3cf2a000}, {0x3cf2c000}, {0x3cf2e000}, + {0x3cf30000}, {0x3cf32000}, {0x3cf34000}, {0x3cf36000}, + {0x3cf38000}, {0x3cf3a000}, {0x3cf3c000}, {0x3cf3e000}, + {0x3cf40000}, {0x3cf42000}, {0x3cf44000}, {0x3cf46000}, + {0x3cf48000}, {0x3cf4a000}, {0x3cf4c000}, {0x3cf4e000}, + {0x3cf50000}, {0x3cf52000}, {0x3cf54000}, {0x3cf56000}, + {0x3cf58000}, {0x3cf5a000}, {0x3cf5c000}, {0x3cf5e000}, + {0x3cf60000}, {0x3cf62000}, {0x3cf64000}, {0x3cf66000}, + {0x3cf68000}, {0x3cf6a000}, {0x3cf6c000}, {0x3cf6e000}, + {0x3cf70000}, {0x3cf72000}, {0x3cf74000}, {0x3cf76000}, + {0x3cf78000}, {0x3cf7a000}, {0x3cf7c000}, {0x3cf7e000}, + {0x3cf80000}, {0x3cf82000}, {0x3cf84000}, {0x3cf86000}, + {0x3cf88000}, {0x3cf8a000}, {0x3cf8c000}, {0x3cf8e000}, + {0x3cf90000}, {0x3cf92000}, {0x3cf94000}, {0x3cf96000}, + {0x3cf98000}, {0x3cf9a000}, {0x3cf9c000}, {0x3cf9e000}, + {0x3cfa0000}, {0x3cfa2000}, {0x3cfa4000}, {0x3cfa6000}, + {0x3cfa8000}, {0x3cfaa000}, {0x3cfac000}, {0x3cfae000}, + {0x3cfb0000}, {0x3cfb2000}, {0x3cfb4000}, {0x3cfb6000}, + {0x3cfb8000}, {0x3cfba000}, {0x3cfbc000}, {0x3cfbe000}, + {0x3cfc0000}, {0x3cfc2000}, {0x3cfc4000}, {0x3cfc6000}, + {0x3cfc8000}, {0x3cfca000}, {0x3cfcc000}, {0x3cfce000}, + {0x3cfd0000}, {0x3cfd2000}, {0x3cfd4000}, {0x3cfd6000}, + {0x3cfd8000}, {0x3cfda000}, {0x3cfdc000}, {0x3cfde000}, + {0x3cfe0000}, {0x3cfe2000}, {0x3cfe4000}, {0x3cfe6000}, + {0x3cfe8000}, {0x3cfea000}, {0x3cfec000}, {0x3cfee000}, + {0x3cff0000}, {0x3cff2000}, {0x3cff4000}, {0x3cff6000}, + {0x3cff8000}, {0x3cffa000}, {0x3cffc000}, {0x3cffe000}, + {0x3d000000}, {0x3d002000}, {0x3d004000}, {0x3d006000}, + {0x3d008000}, {0x3d00a000}, {0x3d00c000}, {0x3d00e000}, + {0x3d010000}, {0x3d012000}, {0x3d014000}, {0x3d016000}, + {0x3d018000}, {0x3d01a000}, {0x3d01c000}, {0x3d01e000}, + {0x3d020000}, {0x3d022000}, {0x3d024000}, {0x3d026000}, + {0x3d028000}, {0x3d02a000}, {0x3d02c000}, {0x3d02e000}, + {0x3d030000}, {0x3d032000}, {0x3d034000}, {0x3d036000}, + {0x3d038000}, {0x3d03a000}, {0x3d03c000}, {0x3d03e000}, + {0x3d040000}, {0x3d042000}, {0x3d044000}, {0x3d046000}, + {0x3d048000}, {0x3d04a000}, {0x3d04c000}, {0x3d04e000}, + {0x3d050000}, {0x3d052000}, {0x3d054000}, {0x3d056000}, + {0x3d058000}, {0x3d05a000}, {0x3d05c000}, {0x3d05e000}, + {0x3d060000}, {0x3d062000}, {0x3d064000}, {0x3d066000}, + {0x3d068000}, {0x3d06a000}, {0x3d06c000}, {0x3d06e000}, + {0x3d070000}, {0x3d072000}, {0x3d074000}, {0x3d076000}, + {0x3d078000}, {0x3d07a000}, {0x3d07c000}, {0x3d07e000}, + {0x3d080000}, {0x3d082000}, {0x3d084000}, {0x3d086000}, + {0x3d088000}, {0x3d08a000}, {0x3d08c000}, {0x3d08e000}, + {0x3d090000}, {0x3d092000}, {0x3d094000}, {0x3d096000}, + {0x3d098000}, {0x3d09a000}, {0x3d09c000}, {0x3d09e000}, + {0x3d0a0000}, {0x3d0a2000}, {0x3d0a4000}, {0x3d0a6000}, + {0x3d0a8000}, {0x3d0aa000}, {0x3d0ac000}, {0x3d0ae000}, + {0x3d0b0000}, {0x3d0b2000}, {0x3d0b4000}, {0x3d0b6000}, + {0x3d0b8000}, {0x3d0ba000}, {0x3d0bc000}, {0x3d0be000}, + {0x3d0c0000}, {0x3d0c2000}, {0x3d0c4000}, {0x3d0c6000}, + {0x3d0c8000}, {0x3d0ca000}, {0x3d0cc000}, {0x3d0ce000}, + {0x3d0d0000}, {0x3d0d2000}, {0x3d0d4000}, {0x3d0d6000}, + {0x3d0d8000}, {0x3d0da000}, {0x3d0dc000}, {0x3d0de000}, + {0x3d0e0000}, {0x3d0e2000}, {0x3d0e4000}, {0x3d0e6000}, + {0x3d0e8000}, {0x3d0ea000}, {0x3d0ec000}, {0x3d0ee000}, + {0x3d0f0000}, {0x3d0f2000}, {0x3d0f4000}, {0x3d0f6000}, + {0x3d0f8000}, {0x3d0fa000}, {0x3d0fc000}, {0x3d0fe000}, + {0x3d100000}, {0x3d102000}, {0x3d104000}, {0x3d106000}, + {0x3d108000}, {0x3d10a000}, {0x3d10c000}, {0x3d10e000}, + {0x3d110000}, {0x3d112000}, {0x3d114000}, {0x3d116000}, + {0x3d118000}, {0x3d11a000}, {0x3d11c000}, {0x3d11e000}, + {0x3d120000}, {0x3d122000}, {0x3d124000}, {0x3d126000}, + {0x3d128000}, {0x3d12a000}, {0x3d12c000}, {0x3d12e000}, + {0x3d130000}, {0x3d132000}, {0x3d134000}, {0x3d136000}, + {0x3d138000}, {0x3d13a000}, {0x3d13c000}, {0x3d13e000}, + {0x3d140000}, {0x3d142000}, {0x3d144000}, {0x3d146000}, + {0x3d148000}, {0x3d14a000}, {0x3d14c000}, {0x3d14e000}, + {0x3d150000}, {0x3d152000}, {0x3d154000}, {0x3d156000}, + {0x3d158000}, {0x3d15a000}, {0x3d15c000}, {0x3d15e000}, + {0x3d160000}, {0x3d162000}, {0x3d164000}, {0x3d166000}, + {0x3d168000}, {0x3d16a000}, {0x3d16c000}, {0x3d16e000}, + {0x3d170000}, {0x3d172000}, {0x3d174000}, {0x3d176000}, + {0x3d178000}, {0x3d17a000}, {0x3d17c000}, {0x3d17e000}, + {0x3d180000}, {0x3d182000}, {0x3d184000}, {0x3d186000}, + {0x3d188000}, {0x3d18a000}, {0x3d18c000}, {0x3d18e000}, + {0x3d190000}, {0x3d192000}, {0x3d194000}, {0x3d196000}, + {0x3d198000}, {0x3d19a000}, {0x3d19c000}, {0x3d19e000}, + {0x3d1a0000}, {0x3d1a2000}, {0x3d1a4000}, {0x3d1a6000}, + {0x3d1a8000}, {0x3d1aa000}, {0x3d1ac000}, {0x3d1ae000}, + {0x3d1b0000}, {0x3d1b2000}, {0x3d1b4000}, {0x3d1b6000}, + {0x3d1b8000}, {0x3d1ba000}, {0x3d1bc000}, {0x3d1be000}, + {0x3d1c0000}, {0x3d1c2000}, {0x3d1c4000}, {0x3d1c6000}, + {0x3d1c8000}, {0x3d1ca000}, {0x3d1cc000}, {0x3d1ce000}, + {0x3d1d0000}, {0x3d1d2000}, {0x3d1d4000}, {0x3d1d6000}, + {0x3d1d8000}, {0x3d1da000}, {0x3d1dc000}, {0x3d1de000}, + {0x3d1e0000}, {0x3d1e2000}, {0x3d1e4000}, {0x3d1e6000}, + {0x3d1e8000}, {0x3d1ea000}, {0x3d1ec000}, {0x3d1ee000}, + {0x3d1f0000}, {0x3d1f2000}, {0x3d1f4000}, {0x3d1f6000}, + {0x3d1f8000}, {0x3d1fa000}, {0x3d1fc000}, {0x3d1fe000}, + {0x3d200000}, {0x3d202000}, {0x3d204000}, {0x3d206000}, + {0x3d208000}, {0x3d20a000}, {0x3d20c000}, {0x3d20e000}, + {0x3d210000}, {0x3d212000}, {0x3d214000}, {0x3d216000}, + {0x3d218000}, {0x3d21a000}, {0x3d21c000}, {0x3d21e000}, + {0x3d220000}, {0x3d222000}, {0x3d224000}, {0x3d226000}, + {0x3d228000}, {0x3d22a000}, {0x3d22c000}, {0x3d22e000}, + {0x3d230000}, {0x3d232000}, {0x3d234000}, {0x3d236000}, + {0x3d238000}, {0x3d23a000}, {0x3d23c000}, {0x3d23e000}, + {0x3d240000}, {0x3d242000}, {0x3d244000}, {0x3d246000}, + {0x3d248000}, {0x3d24a000}, {0x3d24c000}, {0x3d24e000}, + {0x3d250000}, {0x3d252000}, {0x3d254000}, {0x3d256000}, + {0x3d258000}, {0x3d25a000}, {0x3d25c000}, {0x3d25e000}, + {0x3d260000}, {0x3d262000}, {0x3d264000}, {0x3d266000}, + {0x3d268000}, {0x3d26a000}, {0x3d26c000}, {0x3d26e000}, + {0x3d270000}, {0x3d272000}, {0x3d274000}, {0x3d276000}, + {0x3d278000}, {0x3d27a000}, {0x3d27c000}, {0x3d27e000}, + {0x3d280000}, {0x3d282000}, {0x3d284000}, {0x3d286000}, + {0x3d288000}, {0x3d28a000}, {0x3d28c000}, {0x3d28e000}, + {0x3d290000}, {0x3d292000}, {0x3d294000}, {0x3d296000}, + {0x3d298000}, {0x3d29a000}, {0x3d29c000}, {0x3d29e000}, + {0x3d2a0000}, {0x3d2a2000}, {0x3d2a4000}, {0x3d2a6000}, + {0x3d2a8000}, {0x3d2aa000}, {0x3d2ac000}, {0x3d2ae000}, + {0x3d2b0000}, {0x3d2b2000}, {0x3d2b4000}, {0x3d2b6000}, + {0x3d2b8000}, {0x3d2ba000}, {0x3d2bc000}, {0x3d2be000}, + {0x3d2c0000}, {0x3d2c2000}, {0x3d2c4000}, {0x3d2c6000}, + {0x3d2c8000}, {0x3d2ca000}, {0x3d2cc000}, {0x3d2ce000}, + {0x3d2d0000}, {0x3d2d2000}, {0x3d2d4000}, {0x3d2d6000}, + {0x3d2d8000}, {0x3d2da000}, {0x3d2dc000}, {0x3d2de000}, + {0x3d2e0000}, {0x3d2e2000}, {0x3d2e4000}, {0x3d2e6000}, + {0x3d2e8000}, {0x3d2ea000}, {0x3d2ec000}, {0x3d2ee000}, + {0x3d2f0000}, {0x3d2f2000}, {0x3d2f4000}, {0x3d2f6000}, + {0x3d2f8000}, {0x3d2fa000}, {0x3d2fc000}, {0x3d2fe000}, + {0x3d300000}, {0x3d302000}, {0x3d304000}, {0x3d306000}, + {0x3d308000}, {0x3d30a000}, {0x3d30c000}, {0x3d30e000}, + {0x3d310000}, {0x3d312000}, {0x3d314000}, {0x3d316000}, + {0x3d318000}, {0x3d31a000}, {0x3d31c000}, {0x3d31e000}, + {0x3d320000}, {0x3d322000}, {0x3d324000}, {0x3d326000}, + {0x3d328000}, {0x3d32a000}, {0x3d32c000}, {0x3d32e000}, + {0x3d330000}, {0x3d332000}, {0x3d334000}, {0x3d336000}, + {0x3d338000}, {0x3d33a000}, {0x3d33c000}, {0x3d33e000}, + {0x3d340000}, {0x3d342000}, {0x3d344000}, {0x3d346000}, + {0x3d348000}, {0x3d34a000}, {0x3d34c000}, {0x3d34e000}, + {0x3d350000}, {0x3d352000}, {0x3d354000}, {0x3d356000}, + {0x3d358000}, {0x3d35a000}, {0x3d35c000}, {0x3d35e000}, + {0x3d360000}, {0x3d362000}, {0x3d364000}, {0x3d366000}, + {0x3d368000}, {0x3d36a000}, {0x3d36c000}, {0x3d36e000}, + {0x3d370000}, {0x3d372000}, {0x3d374000}, {0x3d376000}, + {0x3d378000}, {0x3d37a000}, {0x3d37c000}, {0x3d37e000}, + {0x3d380000}, {0x3d382000}, {0x3d384000}, {0x3d386000}, + {0x3d388000}, {0x3d38a000}, {0x3d38c000}, {0x3d38e000}, + {0x3d390000}, {0x3d392000}, {0x3d394000}, {0x3d396000}, + {0x3d398000}, {0x3d39a000}, {0x3d39c000}, {0x3d39e000}, + {0x3d3a0000}, {0x3d3a2000}, {0x3d3a4000}, {0x3d3a6000}, + {0x3d3a8000}, {0x3d3aa000}, {0x3d3ac000}, {0x3d3ae000}, + {0x3d3b0000}, {0x3d3b2000}, {0x3d3b4000}, {0x3d3b6000}, + {0x3d3b8000}, {0x3d3ba000}, {0x3d3bc000}, {0x3d3be000}, + {0x3d3c0000}, {0x3d3c2000}, {0x3d3c4000}, {0x3d3c6000}, + {0x3d3c8000}, {0x3d3ca000}, {0x3d3cc000}, {0x3d3ce000}, + {0x3d3d0000}, {0x3d3d2000}, {0x3d3d4000}, {0x3d3d6000}, + {0x3d3d8000}, {0x3d3da000}, {0x3d3dc000}, {0x3d3de000}, + {0x3d3e0000}, {0x3d3e2000}, {0x3d3e4000}, {0x3d3e6000}, + {0x3d3e8000}, {0x3d3ea000}, {0x3d3ec000}, {0x3d3ee000}, + {0x3d3f0000}, {0x3d3f2000}, {0x3d3f4000}, {0x3d3f6000}, + {0x3d3f8000}, {0x3d3fa000}, {0x3d3fc000}, {0x3d3fe000}, + {0x3d400000}, {0x3d402000}, {0x3d404000}, {0x3d406000}, + {0x3d408000}, {0x3d40a000}, {0x3d40c000}, {0x3d40e000}, + {0x3d410000}, {0x3d412000}, {0x3d414000}, {0x3d416000}, + {0x3d418000}, {0x3d41a000}, {0x3d41c000}, {0x3d41e000}, + {0x3d420000}, {0x3d422000}, {0x3d424000}, {0x3d426000}, + {0x3d428000}, {0x3d42a000}, {0x3d42c000}, {0x3d42e000}, + {0x3d430000}, {0x3d432000}, {0x3d434000}, {0x3d436000}, + {0x3d438000}, {0x3d43a000}, {0x3d43c000}, {0x3d43e000}, + {0x3d440000}, {0x3d442000}, {0x3d444000}, {0x3d446000}, + {0x3d448000}, {0x3d44a000}, {0x3d44c000}, {0x3d44e000}, + {0x3d450000}, {0x3d452000}, {0x3d454000}, {0x3d456000}, + {0x3d458000}, {0x3d45a000}, {0x3d45c000}, {0x3d45e000}, + {0x3d460000}, {0x3d462000}, {0x3d464000}, {0x3d466000}, + {0x3d468000}, {0x3d46a000}, {0x3d46c000}, {0x3d46e000}, + {0x3d470000}, {0x3d472000}, {0x3d474000}, {0x3d476000}, + {0x3d478000}, {0x3d47a000}, {0x3d47c000}, {0x3d47e000}, + {0x3d480000}, {0x3d482000}, {0x3d484000}, {0x3d486000}, + {0x3d488000}, {0x3d48a000}, {0x3d48c000}, {0x3d48e000}, + {0x3d490000}, {0x3d492000}, {0x3d494000}, {0x3d496000}, + {0x3d498000}, {0x3d49a000}, {0x3d49c000}, {0x3d49e000}, + {0x3d4a0000}, {0x3d4a2000}, {0x3d4a4000}, {0x3d4a6000}, + {0x3d4a8000}, {0x3d4aa000}, {0x3d4ac000}, {0x3d4ae000}, + {0x3d4b0000}, {0x3d4b2000}, {0x3d4b4000}, {0x3d4b6000}, + {0x3d4b8000}, {0x3d4ba000}, {0x3d4bc000}, {0x3d4be000}, + {0x3d4c0000}, {0x3d4c2000}, {0x3d4c4000}, {0x3d4c6000}, + {0x3d4c8000}, {0x3d4ca000}, {0x3d4cc000}, {0x3d4ce000}, + {0x3d4d0000}, {0x3d4d2000}, {0x3d4d4000}, {0x3d4d6000}, + {0x3d4d8000}, {0x3d4da000}, {0x3d4dc000}, {0x3d4de000}, + {0x3d4e0000}, {0x3d4e2000}, {0x3d4e4000}, {0x3d4e6000}, + {0x3d4e8000}, {0x3d4ea000}, {0x3d4ec000}, {0x3d4ee000}, + {0x3d4f0000}, {0x3d4f2000}, {0x3d4f4000}, {0x3d4f6000}, + {0x3d4f8000}, {0x3d4fa000}, {0x3d4fc000}, {0x3d4fe000}, + {0x3d500000}, {0x3d502000}, {0x3d504000}, {0x3d506000}, + {0x3d508000}, {0x3d50a000}, {0x3d50c000}, {0x3d50e000}, + {0x3d510000}, {0x3d512000}, {0x3d514000}, {0x3d516000}, + {0x3d518000}, {0x3d51a000}, {0x3d51c000}, {0x3d51e000}, + {0x3d520000}, {0x3d522000}, {0x3d524000}, {0x3d526000}, + {0x3d528000}, {0x3d52a000}, {0x3d52c000}, {0x3d52e000}, + {0x3d530000}, {0x3d532000}, {0x3d534000}, {0x3d536000}, + {0x3d538000}, {0x3d53a000}, {0x3d53c000}, {0x3d53e000}, + {0x3d540000}, {0x3d542000}, {0x3d544000}, {0x3d546000}, + {0x3d548000}, {0x3d54a000}, {0x3d54c000}, {0x3d54e000}, + {0x3d550000}, {0x3d552000}, {0x3d554000}, {0x3d556000}, + {0x3d558000}, {0x3d55a000}, {0x3d55c000}, {0x3d55e000}, + {0x3d560000}, {0x3d562000}, {0x3d564000}, {0x3d566000}, + {0x3d568000}, {0x3d56a000}, {0x3d56c000}, {0x3d56e000}, + {0x3d570000}, {0x3d572000}, {0x3d574000}, {0x3d576000}, + {0x3d578000}, {0x3d57a000}, {0x3d57c000}, {0x3d57e000}, + {0x3d580000}, {0x3d582000}, {0x3d584000}, {0x3d586000}, + {0x3d588000}, {0x3d58a000}, {0x3d58c000}, {0x3d58e000}, + {0x3d590000}, {0x3d592000}, {0x3d594000}, {0x3d596000}, + {0x3d598000}, {0x3d59a000}, {0x3d59c000}, {0x3d59e000}, + {0x3d5a0000}, {0x3d5a2000}, {0x3d5a4000}, {0x3d5a6000}, + {0x3d5a8000}, {0x3d5aa000}, {0x3d5ac000}, {0x3d5ae000}, + {0x3d5b0000}, {0x3d5b2000}, {0x3d5b4000}, {0x3d5b6000}, + {0x3d5b8000}, {0x3d5ba000}, {0x3d5bc000}, {0x3d5be000}, + {0x3d5c0000}, {0x3d5c2000}, {0x3d5c4000}, {0x3d5c6000}, + {0x3d5c8000}, {0x3d5ca000}, {0x3d5cc000}, {0x3d5ce000}, + {0x3d5d0000}, {0x3d5d2000}, {0x3d5d4000}, {0x3d5d6000}, + {0x3d5d8000}, {0x3d5da000}, {0x3d5dc000}, {0x3d5de000}, + {0x3d5e0000}, {0x3d5e2000}, {0x3d5e4000}, {0x3d5e6000}, + {0x3d5e8000}, {0x3d5ea000}, {0x3d5ec000}, {0x3d5ee000}, + {0x3d5f0000}, {0x3d5f2000}, {0x3d5f4000}, {0x3d5f6000}, + {0x3d5f8000}, {0x3d5fa000}, {0x3d5fc000}, {0x3d5fe000}, + {0x3d600000}, {0x3d602000}, {0x3d604000}, {0x3d606000}, + {0x3d608000}, {0x3d60a000}, {0x3d60c000}, {0x3d60e000}, + {0x3d610000}, {0x3d612000}, {0x3d614000}, {0x3d616000}, + {0x3d618000}, {0x3d61a000}, {0x3d61c000}, {0x3d61e000}, + {0x3d620000}, {0x3d622000}, {0x3d624000}, {0x3d626000}, + {0x3d628000}, {0x3d62a000}, {0x3d62c000}, {0x3d62e000}, + {0x3d630000}, {0x3d632000}, {0x3d634000}, {0x3d636000}, + {0x3d638000}, {0x3d63a000}, {0x3d63c000}, {0x3d63e000}, + {0x3d640000}, {0x3d642000}, {0x3d644000}, {0x3d646000}, + {0x3d648000}, {0x3d64a000}, {0x3d64c000}, {0x3d64e000}, + {0x3d650000}, {0x3d652000}, {0x3d654000}, {0x3d656000}, + {0x3d658000}, {0x3d65a000}, {0x3d65c000}, {0x3d65e000}, + {0x3d660000}, {0x3d662000}, {0x3d664000}, {0x3d666000}, + {0x3d668000}, {0x3d66a000}, {0x3d66c000}, {0x3d66e000}, + {0x3d670000}, {0x3d672000}, {0x3d674000}, {0x3d676000}, + {0x3d678000}, {0x3d67a000}, {0x3d67c000}, {0x3d67e000}, + {0x3d680000}, {0x3d682000}, {0x3d684000}, {0x3d686000}, + {0x3d688000}, {0x3d68a000}, {0x3d68c000}, {0x3d68e000}, + {0x3d690000}, {0x3d692000}, {0x3d694000}, {0x3d696000}, + {0x3d698000}, {0x3d69a000}, {0x3d69c000}, {0x3d69e000}, + {0x3d6a0000}, {0x3d6a2000}, {0x3d6a4000}, {0x3d6a6000}, + {0x3d6a8000}, {0x3d6aa000}, {0x3d6ac000}, {0x3d6ae000}, + {0x3d6b0000}, {0x3d6b2000}, {0x3d6b4000}, {0x3d6b6000}, + {0x3d6b8000}, {0x3d6ba000}, {0x3d6bc000}, {0x3d6be000}, + {0x3d6c0000}, {0x3d6c2000}, {0x3d6c4000}, {0x3d6c6000}, + {0x3d6c8000}, {0x3d6ca000}, {0x3d6cc000}, {0x3d6ce000}, + {0x3d6d0000}, {0x3d6d2000}, {0x3d6d4000}, {0x3d6d6000}, + {0x3d6d8000}, {0x3d6da000}, {0x3d6dc000}, {0x3d6de000}, + {0x3d6e0000}, {0x3d6e2000}, {0x3d6e4000}, {0x3d6e6000}, + {0x3d6e8000}, {0x3d6ea000}, {0x3d6ec000}, {0x3d6ee000}, + {0x3d6f0000}, {0x3d6f2000}, {0x3d6f4000}, {0x3d6f6000}, + {0x3d6f8000}, {0x3d6fa000}, {0x3d6fc000}, {0x3d6fe000}, + {0x3d700000}, {0x3d702000}, {0x3d704000}, {0x3d706000}, + {0x3d708000}, {0x3d70a000}, {0x3d70c000}, {0x3d70e000}, + {0x3d710000}, {0x3d712000}, {0x3d714000}, {0x3d716000}, + {0x3d718000}, {0x3d71a000}, {0x3d71c000}, {0x3d71e000}, + {0x3d720000}, {0x3d722000}, {0x3d724000}, {0x3d726000}, + {0x3d728000}, {0x3d72a000}, {0x3d72c000}, {0x3d72e000}, + {0x3d730000}, {0x3d732000}, {0x3d734000}, {0x3d736000}, + {0x3d738000}, {0x3d73a000}, {0x3d73c000}, {0x3d73e000}, + {0x3d740000}, {0x3d742000}, {0x3d744000}, {0x3d746000}, + {0x3d748000}, {0x3d74a000}, {0x3d74c000}, {0x3d74e000}, + {0x3d750000}, {0x3d752000}, {0x3d754000}, {0x3d756000}, + {0x3d758000}, {0x3d75a000}, {0x3d75c000}, {0x3d75e000}, + {0x3d760000}, {0x3d762000}, {0x3d764000}, {0x3d766000}, + {0x3d768000}, {0x3d76a000}, {0x3d76c000}, {0x3d76e000}, + {0x3d770000}, {0x3d772000}, {0x3d774000}, {0x3d776000}, + {0x3d778000}, {0x3d77a000}, {0x3d77c000}, {0x3d77e000}, + {0x3d780000}, {0x3d782000}, {0x3d784000}, {0x3d786000}, + {0x3d788000}, {0x3d78a000}, {0x3d78c000}, {0x3d78e000}, + {0x3d790000}, {0x3d792000}, {0x3d794000}, {0x3d796000}, + {0x3d798000}, {0x3d79a000}, {0x3d79c000}, {0x3d79e000}, + {0x3d7a0000}, {0x3d7a2000}, {0x3d7a4000}, {0x3d7a6000}, + {0x3d7a8000}, {0x3d7aa000}, {0x3d7ac000}, {0x3d7ae000}, + {0x3d7b0000}, {0x3d7b2000}, {0x3d7b4000}, {0x3d7b6000}, + {0x3d7b8000}, {0x3d7ba000}, {0x3d7bc000}, {0x3d7be000}, + {0x3d7c0000}, {0x3d7c2000}, {0x3d7c4000}, {0x3d7c6000}, + {0x3d7c8000}, {0x3d7ca000}, {0x3d7cc000}, {0x3d7ce000}, + {0x3d7d0000}, {0x3d7d2000}, {0x3d7d4000}, {0x3d7d6000}, + {0x3d7d8000}, {0x3d7da000}, {0x3d7dc000}, {0x3d7de000}, + {0x3d7e0000}, {0x3d7e2000}, {0x3d7e4000}, {0x3d7e6000}, + {0x3d7e8000}, {0x3d7ea000}, {0x3d7ec000}, {0x3d7ee000}, + {0x3d7f0000}, {0x3d7f2000}, {0x3d7f4000}, {0x3d7f6000}, + {0x3d7f8000}, {0x3d7fa000}, {0x3d7fc000}, {0x3d7fe000}, + {0x3d800000}, {0x3d802000}, {0x3d804000}, {0x3d806000}, + {0x3d808000}, {0x3d80a000}, {0x3d80c000}, {0x3d80e000}, + {0x3d810000}, {0x3d812000}, {0x3d814000}, {0x3d816000}, + {0x3d818000}, {0x3d81a000}, {0x3d81c000}, {0x3d81e000}, + {0x3d820000}, {0x3d822000}, {0x3d824000}, {0x3d826000}, + {0x3d828000}, {0x3d82a000}, {0x3d82c000}, {0x3d82e000}, + {0x3d830000}, {0x3d832000}, {0x3d834000}, {0x3d836000}, + {0x3d838000}, {0x3d83a000}, {0x3d83c000}, {0x3d83e000}, + {0x3d840000}, {0x3d842000}, {0x3d844000}, {0x3d846000}, + {0x3d848000}, {0x3d84a000}, {0x3d84c000}, {0x3d84e000}, + {0x3d850000}, {0x3d852000}, {0x3d854000}, {0x3d856000}, + {0x3d858000}, {0x3d85a000}, {0x3d85c000}, {0x3d85e000}, + {0x3d860000}, {0x3d862000}, {0x3d864000}, {0x3d866000}, + {0x3d868000}, {0x3d86a000}, {0x3d86c000}, {0x3d86e000}, + {0x3d870000}, {0x3d872000}, {0x3d874000}, {0x3d876000}, + {0x3d878000}, {0x3d87a000}, {0x3d87c000}, {0x3d87e000}, + {0x3d880000}, {0x3d882000}, {0x3d884000}, {0x3d886000}, + {0x3d888000}, {0x3d88a000}, {0x3d88c000}, {0x3d88e000}, + {0x3d890000}, {0x3d892000}, {0x3d894000}, {0x3d896000}, + {0x3d898000}, {0x3d89a000}, {0x3d89c000}, {0x3d89e000}, + {0x3d8a0000}, {0x3d8a2000}, {0x3d8a4000}, {0x3d8a6000}, + {0x3d8a8000}, {0x3d8aa000}, {0x3d8ac000}, {0x3d8ae000}, + {0x3d8b0000}, {0x3d8b2000}, {0x3d8b4000}, {0x3d8b6000}, + {0x3d8b8000}, {0x3d8ba000}, {0x3d8bc000}, {0x3d8be000}, + {0x3d8c0000}, {0x3d8c2000}, {0x3d8c4000}, {0x3d8c6000}, + {0x3d8c8000}, {0x3d8ca000}, {0x3d8cc000}, {0x3d8ce000}, + {0x3d8d0000}, {0x3d8d2000}, {0x3d8d4000}, {0x3d8d6000}, + {0x3d8d8000}, {0x3d8da000}, {0x3d8dc000}, {0x3d8de000}, + {0x3d8e0000}, {0x3d8e2000}, {0x3d8e4000}, {0x3d8e6000}, + {0x3d8e8000}, {0x3d8ea000}, {0x3d8ec000}, {0x3d8ee000}, + {0x3d8f0000}, {0x3d8f2000}, {0x3d8f4000}, {0x3d8f6000}, + {0x3d8f8000}, {0x3d8fa000}, {0x3d8fc000}, {0x3d8fe000}, + {0x3d900000}, {0x3d902000}, {0x3d904000}, {0x3d906000}, + {0x3d908000}, {0x3d90a000}, {0x3d90c000}, {0x3d90e000}, + {0x3d910000}, {0x3d912000}, {0x3d914000}, {0x3d916000}, + {0x3d918000}, {0x3d91a000}, {0x3d91c000}, {0x3d91e000}, + {0x3d920000}, {0x3d922000}, {0x3d924000}, {0x3d926000}, + {0x3d928000}, {0x3d92a000}, {0x3d92c000}, {0x3d92e000}, + {0x3d930000}, {0x3d932000}, {0x3d934000}, {0x3d936000}, + {0x3d938000}, {0x3d93a000}, {0x3d93c000}, {0x3d93e000}, + {0x3d940000}, {0x3d942000}, {0x3d944000}, {0x3d946000}, + {0x3d948000}, {0x3d94a000}, {0x3d94c000}, {0x3d94e000}, + {0x3d950000}, {0x3d952000}, {0x3d954000}, {0x3d956000}, + {0x3d958000}, {0x3d95a000}, {0x3d95c000}, {0x3d95e000}, + {0x3d960000}, {0x3d962000}, {0x3d964000}, {0x3d966000}, + {0x3d968000}, {0x3d96a000}, {0x3d96c000}, {0x3d96e000}, + {0x3d970000}, {0x3d972000}, {0x3d974000}, {0x3d976000}, + {0x3d978000}, {0x3d97a000}, {0x3d97c000}, {0x3d97e000}, + {0x3d980000}, {0x3d982000}, {0x3d984000}, {0x3d986000}, + {0x3d988000}, {0x3d98a000}, {0x3d98c000}, {0x3d98e000}, + {0x3d990000}, {0x3d992000}, {0x3d994000}, {0x3d996000}, + {0x3d998000}, {0x3d99a000}, {0x3d99c000}, {0x3d99e000}, + {0x3d9a0000}, {0x3d9a2000}, {0x3d9a4000}, {0x3d9a6000}, + {0x3d9a8000}, {0x3d9aa000}, {0x3d9ac000}, {0x3d9ae000}, + {0x3d9b0000}, {0x3d9b2000}, {0x3d9b4000}, {0x3d9b6000}, + {0x3d9b8000}, {0x3d9ba000}, {0x3d9bc000}, {0x3d9be000}, + {0x3d9c0000}, {0x3d9c2000}, {0x3d9c4000}, {0x3d9c6000}, + {0x3d9c8000}, {0x3d9ca000}, {0x3d9cc000}, {0x3d9ce000}, + {0x3d9d0000}, {0x3d9d2000}, {0x3d9d4000}, {0x3d9d6000}, + {0x3d9d8000}, {0x3d9da000}, {0x3d9dc000}, {0x3d9de000}, + {0x3d9e0000}, {0x3d9e2000}, {0x3d9e4000}, {0x3d9e6000}, + {0x3d9e8000}, {0x3d9ea000}, {0x3d9ec000}, {0x3d9ee000}, + {0x3d9f0000}, {0x3d9f2000}, {0x3d9f4000}, {0x3d9f6000}, + {0x3d9f8000}, {0x3d9fa000}, {0x3d9fc000}, {0x3d9fe000}, + {0x3da00000}, {0x3da02000}, {0x3da04000}, {0x3da06000}, + {0x3da08000}, {0x3da0a000}, {0x3da0c000}, {0x3da0e000}, + {0x3da10000}, {0x3da12000}, {0x3da14000}, {0x3da16000}, + {0x3da18000}, {0x3da1a000}, {0x3da1c000}, {0x3da1e000}, + {0x3da20000}, {0x3da22000}, {0x3da24000}, {0x3da26000}, + {0x3da28000}, {0x3da2a000}, {0x3da2c000}, {0x3da2e000}, + {0x3da30000}, {0x3da32000}, {0x3da34000}, {0x3da36000}, + {0x3da38000}, {0x3da3a000}, {0x3da3c000}, {0x3da3e000}, + {0x3da40000}, {0x3da42000}, {0x3da44000}, {0x3da46000}, + {0x3da48000}, {0x3da4a000}, {0x3da4c000}, {0x3da4e000}, + {0x3da50000}, {0x3da52000}, {0x3da54000}, {0x3da56000}, + {0x3da58000}, {0x3da5a000}, {0x3da5c000}, {0x3da5e000}, + {0x3da60000}, {0x3da62000}, {0x3da64000}, {0x3da66000}, + {0x3da68000}, {0x3da6a000}, {0x3da6c000}, {0x3da6e000}, + {0x3da70000}, {0x3da72000}, {0x3da74000}, {0x3da76000}, + {0x3da78000}, {0x3da7a000}, {0x3da7c000}, {0x3da7e000}, + {0x3da80000}, {0x3da82000}, {0x3da84000}, {0x3da86000}, + {0x3da88000}, {0x3da8a000}, {0x3da8c000}, {0x3da8e000}, + {0x3da90000}, {0x3da92000}, {0x3da94000}, {0x3da96000}, + {0x3da98000}, {0x3da9a000}, {0x3da9c000}, {0x3da9e000}, + {0x3daa0000}, {0x3daa2000}, {0x3daa4000}, {0x3daa6000}, + {0x3daa8000}, {0x3daaa000}, {0x3daac000}, {0x3daae000}, + {0x3dab0000}, {0x3dab2000}, {0x3dab4000}, {0x3dab6000}, + {0x3dab8000}, {0x3daba000}, {0x3dabc000}, {0x3dabe000}, + {0x3dac0000}, {0x3dac2000}, {0x3dac4000}, {0x3dac6000}, + {0x3dac8000}, {0x3daca000}, {0x3dacc000}, {0x3dace000}, + {0x3dad0000}, {0x3dad2000}, {0x3dad4000}, {0x3dad6000}, + {0x3dad8000}, {0x3dada000}, {0x3dadc000}, {0x3dade000}, + {0x3dae0000}, {0x3dae2000}, {0x3dae4000}, {0x3dae6000}, + {0x3dae8000}, {0x3daea000}, {0x3daec000}, {0x3daee000}, + {0x3daf0000}, {0x3daf2000}, {0x3daf4000}, {0x3daf6000}, + {0x3daf8000}, {0x3dafa000}, {0x3dafc000}, {0x3dafe000}, + {0x3db00000}, {0x3db02000}, {0x3db04000}, {0x3db06000}, + {0x3db08000}, {0x3db0a000}, {0x3db0c000}, {0x3db0e000}, + {0x3db10000}, {0x3db12000}, {0x3db14000}, {0x3db16000}, + {0x3db18000}, {0x3db1a000}, {0x3db1c000}, {0x3db1e000}, + {0x3db20000}, {0x3db22000}, {0x3db24000}, {0x3db26000}, + {0x3db28000}, {0x3db2a000}, {0x3db2c000}, {0x3db2e000}, + {0x3db30000}, {0x3db32000}, {0x3db34000}, {0x3db36000}, + {0x3db38000}, {0x3db3a000}, {0x3db3c000}, {0x3db3e000}, + {0x3db40000}, {0x3db42000}, {0x3db44000}, {0x3db46000}, + {0x3db48000}, {0x3db4a000}, {0x3db4c000}, {0x3db4e000}, + {0x3db50000}, {0x3db52000}, {0x3db54000}, {0x3db56000}, + {0x3db58000}, {0x3db5a000}, {0x3db5c000}, {0x3db5e000}, + {0x3db60000}, {0x3db62000}, {0x3db64000}, {0x3db66000}, + {0x3db68000}, {0x3db6a000}, {0x3db6c000}, {0x3db6e000}, + {0x3db70000}, {0x3db72000}, {0x3db74000}, {0x3db76000}, + {0x3db78000}, {0x3db7a000}, {0x3db7c000}, {0x3db7e000}, + {0x3db80000}, {0x3db82000}, {0x3db84000}, {0x3db86000}, + {0x3db88000}, {0x3db8a000}, {0x3db8c000}, {0x3db8e000}, + {0x3db90000}, {0x3db92000}, {0x3db94000}, {0x3db96000}, + {0x3db98000}, {0x3db9a000}, {0x3db9c000}, {0x3db9e000}, + {0x3dba0000}, {0x3dba2000}, {0x3dba4000}, {0x3dba6000}, + {0x3dba8000}, {0x3dbaa000}, {0x3dbac000}, {0x3dbae000}, + {0x3dbb0000}, {0x3dbb2000}, {0x3dbb4000}, {0x3dbb6000}, + {0x3dbb8000}, {0x3dbba000}, {0x3dbbc000}, {0x3dbbe000}, + {0x3dbc0000}, {0x3dbc2000}, {0x3dbc4000}, {0x3dbc6000}, + {0x3dbc8000}, {0x3dbca000}, {0x3dbcc000}, {0x3dbce000}, + {0x3dbd0000}, {0x3dbd2000}, {0x3dbd4000}, {0x3dbd6000}, + {0x3dbd8000}, {0x3dbda000}, {0x3dbdc000}, {0x3dbde000}, + {0x3dbe0000}, {0x3dbe2000}, {0x3dbe4000}, {0x3dbe6000}, + {0x3dbe8000}, {0x3dbea000}, {0x3dbec000}, {0x3dbee000}, + {0x3dbf0000}, {0x3dbf2000}, {0x3dbf4000}, {0x3dbf6000}, + {0x3dbf8000}, {0x3dbfa000}, {0x3dbfc000}, {0x3dbfe000}, + {0x3dc00000}, {0x3dc02000}, {0x3dc04000}, {0x3dc06000}, + {0x3dc08000}, {0x3dc0a000}, {0x3dc0c000}, {0x3dc0e000}, + {0x3dc10000}, {0x3dc12000}, {0x3dc14000}, {0x3dc16000}, + {0x3dc18000}, {0x3dc1a000}, {0x3dc1c000}, {0x3dc1e000}, + {0x3dc20000}, {0x3dc22000}, {0x3dc24000}, {0x3dc26000}, + {0x3dc28000}, {0x3dc2a000}, {0x3dc2c000}, {0x3dc2e000}, + {0x3dc30000}, {0x3dc32000}, {0x3dc34000}, {0x3dc36000}, + {0x3dc38000}, {0x3dc3a000}, {0x3dc3c000}, {0x3dc3e000}, + {0x3dc40000}, {0x3dc42000}, {0x3dc44000}, {0x3dc46000}, + {0x3dc48000}, {0x3dc4a000}, {0x3dc4c000}, {0x3dc4e000}, + {0x3dc50000}, {0x3dc52000}, {0x3dc54000}, {0x3dc56000}, + {0x3dc58000}, {0x3dc5a000}, {0x3dc5c000}, {0x3dc5e000}, + {0x3dc60000}, {0x3dc62000}, {0x3dc64000}, {0x3dc66000}, + {0x3dc68000}, {0x3dc6a000}, {0x3dc6c000}, {0x3dc6e000}, + {0x3dc70000}, {0x3dc72000}, {0x3dc74000}, {0x3dc76000}, + {0x3dc78000}, {0x3dc7a000}, {0x3dc7c000}, {0x3dc7e000}, + {0x3dc80000}, {0x3dc82000}, {0x3dc84000}, {0x3dc86000}, + {0x3dc88000}, {0x3dc8a000}, {0x3dc8c000}, {0x3dc8e000}, + {0x3dc90000}, {0x3dc92000}, {0x3dc94000}, {0x3dc96000}, + {0x3dc98000}, {0x3dc9a000}, {0x3dc9c000}, {0x3dc9e000}, + {0x3dca0000}, {0x3dca2000}, {0x3dca4000}, {0x3dca6000}, + {0x3dca8000}, {0x3dcaa000}, {0x3dcac000}, {0x3dcae000}, + {0x3dcb0000}, {0x3dcb2000}, {0x3dcb4000}, {0x3dcb6000}, + {0x3dcb8000}, {0x3dcba000}, {0x3dcbc000}, {0x3dcbe000}, + {0x3dcc0000}, {0x3dcc2000}, {0x3dcc4000}, {0x3dcc6000}, + {0x3dcc8000}, {0x3dcca000}, {0x3dccc000}, {0x3dcce000}, + {0x3dcd0000}, {0x3dcd2000}, {0x3dcd4000}, {0x3dcd6000}, + {0x3dcd8000}, {0x3dcda000}, {0x3dcdc000}, {0x3dcde000}, + {0x3dce0000}, {0x3dce2000}, {0x3dce4000}, {0x3dce6000}, + {0x3dce8000}, {0x3dcea000}, {0x3dcec000}, {0x3dcee000}, + {0x3dcf0000}, {0x3dcf2000}, {0x3dcf4000}, {0x3dcf6000}, + {0x3dcf8000}, {0x3dcfa000}, {0x3dcfc000}, {0x3dcfe000}, + {0x3dd00000}, {0x3dd02000}, {0x3dd04000}, {0x3dd06000}, + {0x3dd08000}, {0x3dd0a000}, {0x3dd0c000}, {0x3dd0e000}, + {0x3dd10000}, {0x3dd12000}, {0x3dd14000}, {0x3dd16000}, + {0x3dd18000}, {0x3dd1a000}, {0x3dd1c000}, {0x3dd1e000}, + {0x3dd20000}, {0x3dd22000}, {0x3dd24000}, {0x3dd26000}, + {0x3dd28000}, {0x3dd2a000}, {0x3dd2c000}, {0x3dd2e000}, + {0x3dd30000}, {0x3dd32000}, {0x3dd34000}, {0x3dd36000}, + {0x3dd38000}, {0x3dd3a000}, {0x3dd3c000}, {0x3dd3e000}, + {0x3dd40000}, {0x3dd42000}, {0x3dd44000}, {0x3dd46000}, + {0x3dd48000}, {0x3dd4a000}, {0x3dd4c000}, {0x3dd4e000}, + {0x3dd50000}, {0x3dd52000}, {0x3dd54000}, {0x3dd56000}, + {0x3dd58000}, {0x3dd5a000}, {0x3dd5c000}, {0x3dd5e000}, + {0x3dd60000}, {0x3dd62000}, {0x3dd64000}, {0x3dd66000}, + {0x3dd68000}, {0x3dd6a000}, {0x3dd6c000}, {0x3dd6e000}, + {0x3dd70000}, {0x3dd72000}, {0x3dd74000}, {0x3dd76000}, + {0x3dd78000}, {0x3dd7a000}, {0x3dd7c000}, {0x3dd7e000}, + {0x3dd80000}, {0x3dd82000}, {0x3dd84000}, {0x3dd86000}, + {0x3dd88000}, {0x3dd8a000}, {0x3dd8c000}, {0x3dd8e000}, + {0x3dd90000}, {0x3dd92000}, {0x3dd94000}, {0x3dd96000}, + {0x3dd98000}, {0x3dd9a000}, {0x3dd9c000}, {0x3dd9e000}, + {0x3dda0000}, {0x3dda2000}, {0x3dda4000}, {0x3dda6000}, + {0x3dda8000}, {0x3ddaa000}, {0x3ddac000}, {0x3ddae000}, + {0x3ddb0000}, {0x3ddb2000}, {0x3ddb4000}, {0x3ddb6000}, + {0x3ddb8000}, {0x3ddba000}, {0x3ddbc000}, {0x3ddbe000}, + {0x3ddc0000}, {0x3ddc2000}, {0x3ddc4000}, {0x3ddc6000}, + {0x3ddc8000}, {0x3ddca000}, {0x3ddcc000}, {0x3ddce000}, + {0x3ddd0000}, {0x3ddd2000}, {0x3ddd4000}, {0x3ddd6000}, + {0x3ddd8000}, {0x3ddda000}, {0x3dddc000}, {0x3ddde000}, + {0x3dde0000}, {0x3dde2000}, {0x3dde4000}, {0x3dde6000}, + {0x3dde8000}, {0x3ddea000}, {0x3ddec000}, {0x3ddee000}, + {0x3ddf0000}, {0x3ddf2000}, {0x3ddf4000}, {0x3ddf6000}, + {0x3ddf8000}, {0x3ddfa000}, {0x3ddfc000}, {0x3ddfe000}, + {0x3de00000}, {0x3de02000}, {0x3de04000}, {0x3de06000}, + {0x3de08000}, {0x3de0a000}, {0x3de0c000}, {0x3de0e000}, + {0x3de10000}, {0x3de12000}, {0x3de14000}, {0x3de16000}, + {0x3de18000}, {0x3de1a000}, {0x3de1c000}, {0x3de1e000}, + {0x3de20000}, {0x3de22000}, {0x3de24000}, {0x3de26000}, + {0x3de28000}, {0x3de2a000}, {0x3de2c000}, {0x3de2e000}, + {0x3de30000}, {0x3de32000}, {0x3de34000}, {0x3de36000}, + {0x3de38000}, {0x3de3a000}, {0x3de3c000}, {0x3de3e000}, + {0x3de40000}, {0x3de42000}, {0x3de44000}, {0x3de46000}, + {0x3de48000}, {0x3de4a000}, {0x3de4c000}, {0x3de4e000}, + {0x3de50000}, {0x3de52000}, {0x3de54000}, {0x3de56000}, + {0x3de58000}, {0x3de5a000}, {0x3de5c000}, {0x3de5e000}, + {0x3de60000}, {0x3de62000}, {0x3de64000}, {0x3de66000}, + {0x3de68000}, {0x3de6a000}, {0x3de6c000}, {0x3de6e000}, + {0x3de70000}, {0x3de72000}, {0x3de74000}, {0x3de76000}, + {0x3de78000}, {0x3de7a000}, {0x3de7c000}, {0x3de7e000}, + {0x3de80000}, {0x3de82000}, {0x3de84000}, {0x3de86000}, + {0x3de88000}, {0x3de8a000}, {0x3de8c000}, {0x3de8e000}, + {0x3de90000}, {0x3de92000}, {0x3de94000}, {0x3de96000}, + {0x3de98000}, {0x3de9a000}, {0x3de9c000}, {0x3de9e000}, + {0x3dea0000}, {0x3dea2000}, {0x3dea4000}, {0x3dea6000}, + {0x3dea8000}, {0x3deaa000}, {0x3deac000}, {0x3deae000}, + {0x3deb0000}, {0x3deb2000}, {0x3deb4000}, {0x3deb6000}, + {0x3deb8000}, {0x3deba000}, {0x3debc000}, {0x3debe000}, + {0x3dec0000}, {0x3dec2000}, {0x3dec4000}, {0x3dec6000}, + {0x3dec8000}, {0x3deca000}, {0x3decc000}, {0x3dece000}, + {0x3ded0000}, {0x3ded2000}, {0x3ded4000}, {0x3ded6000}, + {0x3ded8000}, {0x3deda000}, {0x3dedc000}, {0x3dede000}, + {0x3dee0000}, {0x3dee2000}, {0x3dee4000}, {0x3dee6000}, + {0x3dee8000}, {0x3deea000}, {0x3deec000}, {0x3deee000}, + {0x3def0000}, {0x3def2000}, {0x3def4000}, {0x3def6000}, + {0x3def8000}, {0x3defa000}, {0x3defc000}, {0x3defe000}, + {0x3df00000}, {0x3df02000}, {0x3df04000}, {0x3df06000}, + {0x3df08000}, {0x3df0a000}, {0x3df0c000}, {0x3df0e000}, + {0x3df10000}, {0x3df12000}, {0x3df14000}, {0x3df16000}, + {0x3df18000}, {0x3df1a000}, {0x3df1c000}, {0x3df1e000}, + {0x3df20000}, {0x3df22000}, {0x3df24000}, {0x3df26000}, + {0x3df28000}, {0x3df2a000}, {0x3df2c000}, {0x3df2e000}, + {0x3df30000}, {0x3df32000}, {0x3df34000}, {0x3df36000}, + {0x3df38000}, {0x3df3a000}, {0x3df3c000}, {0x3df3e000}, + {0x3df40000}, {0x3df42000}, {0x3df44000}, {0x3df46000}, + {0x3df48000}, {0x3df4a000}, {0x3df4c000}, {0x3df4e000}, + {0x3df50000}, {0x3df52000}, {0x3df54000}, {0x3df56000}, + {0x3df58000}, {0x3df5a000}, {0x3df5c000}, {0x3df5e000}, + {0x3df60000}, {0x3df62000}, {0x3df64000}, {0x3df66000}, + {0x3df68000}, {0x3df6a000}, {0x3df6c000}, {0x3df6e000}, + {0x3df70000}, {0x3df72000}, {0x3df74000}, {0x3df76000}, + {0x3df78000}, {0x3df7a000}, {0x3df7c000}, {0x3df7e000}, + {0x3df80000}, {0x3df82000}, {0x3df84000}, {0x3df86000}, + {0x3df88000}, {0x3df8a000}, {0x3df8c000}, {0x3df8e000}, + {0x3df90000}, {0x3df92000}, {0x3df94000}, {0x3df96000}, + {0x3df98000}, {0x3df9a000}, {0x3df9c000}, {0x3df9e000}, + {0x3dfa0000}, {0x3dfa2000}, {0x3dfa4000}, {0x3dfa6000}, + {0x3dfa8000}, {0x3dfaa000}, {0x3dfac000}, {0x3dfae000}, + {0x3dfb0000}, {0x3dfb2000}, {0x3dfb4000}, {0x3dfb6000}, + {0x3dfb8000}, {0x3dfba000}, {0x3dfbc000}, {0x3dfbe000}, + {0x3dfc0000}, {0x3dfc2000}, {0x3dfc4000}, {0x3dfc6000}, + {0x3dfc8000}, {0x3dfca000}, {0x3dfcc000}, {0x3dfce000}, + {0x3dfd0000}, {0x3dfd2000}, {0x3dfd4000}, {0x3dfd6000}, + {0x3dfd8000}, {0x3dfda000}, {0x3dfdc000}, {0x3dfde000}, + {0x3dfe0000}, {0x3dfe2000}, {0x3dfe4000}, {0x3dfe6000}, + {0x3dfe8000}, {0x3dfea000}, {0x3dfec000}, {0x3dfee000}, + {0x3dff0000}, {0x3dff2000}, {0x3dff4000}, {0x3dff6000}, + {0x3dff8000}, {0x3dffa000}, {0x3dffc000}, {0x3dffe000}, + {0x3e000000}, {0x3e002000}, {0x3e004000}, {0x3e006000}, + {0x3e008000}, {0x3e00a000}, {0x3e00c000}, {0x3e00e000}, + {0x3e010000}, {0x3e012000}, {0x3e014000}, {0x3e016000}, + {0x3e018000}, {0x3e01a000}, {0x3e01c000}, {0x3e01e000}, + {0x3e020000}, {0x3e022000}, {0x3e024000}, {0x3e026000}, + {0x3e028000}, {0x3e02a000}, {0x3e02c000}, {0x3e02e000}, + {0x3e030000}, {0x3e032000}, {0x3e034000}, {0x3e036000}, + {0x3e038000}, {0x3e03a000}, {0x3e03c000}, {0x3e03e000}, + {0x3e040000}, {0x3e042000}, {0x3e044000}, {0x3e046000}, + {0x3e048000}, {0x3e04a000}, {0x3e04c000}, {0x3e04e000}, + {0x3e050000}, {0x3e052000}, {0x3e054000}, {0x3e056000}, + {0x3e058000}, {0x3e05a000}, {0x3e05c000}, {0x3e05e000}, + {0x3e060000}, {0x3e062000}, {0x3e064000}, {0x3e066000}, + {0x3e068000}, {0x3e06a000}, {0x3e06c000}, {0x3e06e000}, + {0x3e070000}, {0x3e072000}, {0x3e074000}, {0x3e076000}, + {0x3e078000}, {0x3e07a000}, {0x3e07c000}, {0x3e07e000}, + {0x3e080000}, {0x3e082000}, {0x3e084000}, {0x3e086000}, + {0x3e088000}, {0x3e08a000}, {0x3e08c000}, {0x3e08e000}, + {0x3e090000}, {0x3e092000}, {0x3e094000}, {0x3e096000}, + {0x3e098000}, {0x3e09a000}, {0x3e09c000}, {0x3e09e000}, + {0x3e0a0000}, {0x3e0a2000}, {0x3e0a4000}, {0x3e0a6000}, + {0x3e0a8000}, {0x3e0aa000}, {0x3e0ac000}, {0x3e0ae000}, + {0x3e0b0000}, {0x3e0b2000}, {0x3e0b4000}, {0x3e0b6000}, + {0x3e0b8000}, {0x3e0ba000}, {0x3e0bc000}, {0x3e0be000}, + {0x3e0c0000}, {0x3e0c2000}, {0x3e0c4000}, {0x3e0c6000}, + {0x3e0c8000}, {0x3e0ca000}, {0x3e0cc000}, {0x3e0ce000}, + {0x3e0d0000}, {0x3e0d2000}, {0x3e0d4000}, {0x3e0d6000}, + {0x3e0d8000}, {0x3e0da000}, {0x3e0dc000}, {0x3e0de000}, + {0x3e0e0000}, {0x3e0e2000}, {0x3e0e4000}, {0x3e0e6000}, + {0x3e0e8000}, {0x3e0ea000}, {0x3e0ec000}, {0x3e0ee000}, + {0x3e0f0000}, {0x3e0f2000}, {0x3e0f4000}, {0x3e0f6000}, + {0x3e0f8000}, {0x3e0fa000}, {0x3e0fc000}, {0x3e0fe000}, + {0x3e100000}, {0x3e102000}, {0x3e104000}, {0x3e106000}, + {0x3e108000}, {0x3e10a000}, {0x3e10c000}, {0x3e10e000}, + {0x3e110000}, {0x3e112000}, {0x3e114000}, {0x3e116000}, + {0x3e118000}, {0x3e11a000}, {0x3e11c000}, {0x3e11e000}, + {0x3e120000}, {0x3e122000}, {0x3e124000}, {0x3e126000}, + {0x3e128000}, {0x3e12a000}, {0x3e12c000}, {0x3e12e000}, + {0x3e130000}, {0x3e132000}, {0x3e134000}, {0x3e136000}, + {0x3e138000}, {0x3e13a000}, {0x3e13c000}, {0x3e13e000}, + {0x3e140000}, {0x3e142000}, {0x3e144000}, {0x3e146000}, + {0x3e148000}, {0x3e14a000}, {0x3e14c000}, {0x3e14e000}, + {0x3e150000}, {0x3e152000}, {0x3e154000}, {0x3e156000}, + {0x3e158000}, {0x3e15a000}, {0x3e15c000}, {0x3e15e000}, + {0x3e160000}, {0x3e162000}, {0x3e164000}, {0x3e166000}, + {0x3e168000}, {0x3e16a000}, {0x3e16c000}, {0x3e16e000}, + {0x3e170000}, {0x3e172000}, {0x3e174000}, {0x3e176000}, + {0x3e178000}, {0x3e17a000}, {0x3e17c000}, {0x3e17e000}, + {0x3e180000}, {0x3e182000}, {0x3e184000}, {0x3e186000}, + {0x3e188000}, {0x3e18a000}, {0x3e18c000}, {0x3e18e000}, + {0x3e190000}, {0x3e192000}, {0x3e194000}, {0x3e196000}, + {0x3e198000}, {0x3e19a000}, {0x3e19c000}, {0x3e19e000}, + {0x3e1a0000}, {0x3e1a2000}, {0x3e1a4000}, {0x3e1a6000}, + {0x3e1a8000}, {0x3e1aa000}, {0x3e1ac000}, {0x3e1ae000}, + {0x3e1b0000}, {0x3e1b2000}, {0x3e1b4000}, {0x3e1b6000}, + {0x3e1b8000}, {0x3e1ba000}, {0x3e1bc000}, {0x3e1be000}, + {0x3e1c0000}, {0x3e1c2000}, {0x3e1c4000}, {0x3e1c6000}, + {0x3e1c8000}, {0x3e1ca000}, {0x3e1cc000}, {0x3e1ce000}, + {0x3e1d0000}, {0x3e1d2000}, {0x3e1d4000}, {0x3e1d6000}, + {0x3e1d8000}, {0x3e1da000}, {0x3e1dc000}, {0x3e1de000}, + {0x3e1e0000}, {0x3e1e2000}, {0x3e1e4000}, {0x3e1e6000}, + {0x3e1e8000}, {0x3e1ea000}, {0x3e1ec000}, {0x3e1ee000}, + {0x3e1f0000}, {0x3e1f2000}, {0x3e1f4000}, {0x3e1f6000}, + {0x3e1f8000}, {0x3e1fa000}, {0x3e1fc000}, {0x3e1fe000}, + {0x3e200000}, {0x3e202000}, {0x3e204000}, {0x3e206000}, + {0x3e208000}, {0x3e20a000}, {0x3e20c000}, {0x3e20e000}, + {0x3e210000}, {0x3e212000}, {0x3e214000}, {0x3e216000}, + {0x3e218000}, {0x3e21a000}, {0x3e21c000}, {0x3e21e000}, + {0x3e220000}, {0x3e222000}, {0x3e224000}, {0x3e226000}, + {0x3e228000}, {0x3e22a000}, {0x3e22c000}, {0x3e22e000}, + {0x3e230000}, {0x3e232000}, {0x3e234000}, {0x3e236000}, + {0x3e238000}, {0x3e23a000}, {0x3e23c000}, {0x3e23e000}, + {0x3e240000}, {0x3e242000}, {0x3e244000}, {0x3e246000}, + {0x3e248000}, {0x3e24a000}, {0x3e24c000}, {0x3e24e000}, + {0x3e250000}, {0x3e252000}, {0x3e254000}, {0x3e256000}, + {0x3e258000}, {0x3e25a000}, {0x3e25c000}, {0x3e25e000}, + {0x3e260000}, {0x3e262000}, {0x3e264000}, {0x3e266000}, + {0x3e268000}, {0x3e26a000}, {0x3e26c000}, {0x3e26e000}, + {0x3e270000}, {0x3e272000}, {0x3e274000}, {0x3e276000}, + {0x3e278000}, {0x3e27a000}, {0x3e27c000}, {0x3e27e000}, + {0x3e280000}, {0x3e282000}, {0x3e284000}, {0x3e286000}, + {0x3e288000}, {0x3e28a000}, {0x3e28c000}, {0x3e28e000}, + {0x3e290000}, {0x3e292000}, {0x3e294000}, {0x3e296000}, + {0x3e298000}, {0x3e29a000}, {0x3e29c000}, {0x3e29e000}, + {0x3e2a0000}, {0x3e2a2000}, {0x3e2a4000}, {0x3e2a6000}, + {0x3e2a8000}, {0x3e2aa000}, {0x3e2ac000}, {0x3e2ae000}, + {0x3e2b0000}, {0x3e2b2000}, {0x3e2b4000}, {0x3e2b6000}, + {0x3e2b8000}, {0x3e2ba000}, {0x3e2bc000}, {0x3e2be000}, + {0x3e2c0000}, {0x3e2c2000}, {0x3e2c4000}, {0x3e2c6000}, + {0x3e2c8000}, {0x3e2ca000}, {0x3e2cc000}, {0x3e2ce000}, + {0x3e2d0000}, {0x3e2d2000}, {0x3e2d4000}, {0x3e2d6000}, + {0x3e2d8000}, {0x3e2da000}, {0x3e2dc000}, {0x3e2de000}, + {0x3e2e0000}, {0x3e2e2000}, {0x3e2e4000}, {0x3e2e6000}, + {0x3e2e8000}, {0x3e2ea000}, {0x3e2ec000}, {0x3e2ee000}, + {0x3e2f0000}, {0x3e2f2000}, {0x3e2f4000}, {0x3e2f6000}, + {0x3e2f8000}, {0x3e2fa000}, {0x3e2fc000}, {0x3e2fe000}, + {0x3e300000}, {0x3e302000}, {0x3e304000}, {0x3e306000}, + {0x3e308000}, {0x3e30a000}, {0x3e30c000}, {0x3e30e000}, + {0x3e310000}, {0x3e312000}, {0x3e314000}, {0x3e316000}, + {0x3e318000}, {0x3e31a000}, {0x3e31c000}, {0x3e31e000}, + {0x3e320000}, {0x3e322000}, {0x3e324000}, {0x3e326000}, + {0x3e328000}, {0x3e32a000}, {0x3e32c000}, {0x3e32e000}, + {0x3e330000}, {0x3e332000}, {0x3e334000}, {0x3e336000}, + {0x3e338000}, {0x3e33a000}, {0x3e33c000}, {0x3e33e000}, + {0x3e340000}, {0x3e342000}, {0x3e344000}, {0x3e346000}, + {0x3e348000}, {0x3e34a000}, {0x3e34c000}, {0x3e34e000}, + {0x3e350000}, {0x3e352000}, {0x3e354000}, {0x3e356000}, + {0x3e358000}, {0x3e35a000}, {0x3e35c000}, {0x3e35e000}, + {0x3e360000}, {0x3e362000}, {0x3e364000}, {0x3e366000}, + {0x3e368000}, {0x3e36a000}, {0x3e36c000}, {0x3e36e000}, + {0x3e370000}, {0x3e372000}, {0x3e374000}, {0x3e376000}, + {0x3e378000}, {0x3e37a000}, {0x3e37c000}, {0x3e37e000}, + {0x3e380000}, {0x3e382000}, {0x3e384000}, {0x3e386000}, + {0x3e388000}, {0x3e38a000}, {0x3e38c000}, {0x3e38e000}, + {0x3e390000}, {0x3e392000}, {0x3e394000}, {0x3e396000}, + {0x3e398000}, {0x3e39a000}, {0x3e39c000}, {0x3e39e000}, + {0x3e3a0000}, {0x3e3a2000}, {0x3e3a4000}, {0x3e3a6000}, + {0x3e3a8000}, {0x3e3aa000}, {0x3e3ac000}, {0x3e3ae000}, + {0x3e3b0000}, {0x3e3b2000}, {0x3e3b4000}, {0x3e3b6000}, + {0x3e3b8000}, {0x3e3ba000}, {0x3e3bc000}, {0x3e3be000}, + {0x3e3c0000}, {0x3e3c2000}, {0x3e3c4000}, {0x3e3c6000}, + {0x3e3c8000}, {0x3e3ca000}, {0x3e3cc000}, {0x3e3ce000}, + {0x3e3d0000}, {0x3e3d2000}, {0x3e3d4000}, {0x3e3d6000}, + {0x3e3d8000}, {0x3e3da000}, {0x3e3dc000}, {0x3e3de000}, + {0x3e3e0000}, {0x3e3e2000}, {0x3e3e4000}, {0x3e3e6000}, + {0x3e3e8000}, {0x3e3ea000}, {0x3e3ec000}, {0x3e3ee000}, + {0x3e3f0000}, {0x3e3f2000}, {0x3e3f4000}, {0x3e3f6000}, + {0x3e3f8000}, {0x3e3fa000}, {0x3e3fc000}, {0x3e3fe000}, + {0x3e400000}, {0x3e402000}, {0x3e404000}, {0x3e406000}, + {0x3e408000}, {0x3e40a000}, {0x3e40c000}, {0x3e40e000}, + {0x3e410000}, {0x3e412000}, {0x3e414000}, {0x3e416000}, + {0x3e418000}, {0x3e41a000}, {0x3e41c000}, {0x3e41e000}, + {0x3e420000}, {0x3e422000}, {0x3e424000}, {0x3e426000}, + {0x3e428000}, {0x3e42a000}, {0x3e42c000}, {0x3e42e000}, + {0x3e430000}, {0x3e432000}, {0x3e434000}, {0x3e436000}, + {0x3e438000}, {0x3e43a000}, {0x3e43c000}, {0x3e43e000}, + {0x3e440000}, {0x3e442000}, {0x3e444000}, {0x3e446000}, + {0x3e448000}, {0x3e44a000}, {0x3e44c000}, {0x3e44e000}, + {0x3e450000}, {0x3e452000}, {0x3e454000}, {0x3e456000}, + {0x3e458000}, {0x3e45a000}, {0x3e45c000}, {0x3e45e000}, + {0x3e460000}, {0x3e462000}, {0x3e464000}, {0x3e466000}, + {0x3e468000}, {0x3e46a000}, {0x3e46c000}, {0x3e46e000}, + {0x3e470000}, {0x3e472000}, {0x3e474000}, {0x3e476000}, + {0x3e478000}, {0x3e47a000}, {0x3e47c000}, {0x3e47e000}, + {0x3e480000}, {0x3e482000}, {0x3e484000}, {0x3e486000}, + {0x3e488000}, {0x3e48a000}, {0x3e48c000}, {0x3e48e000}, + {0x3e490000}, {0x3e492000}, {0x3e494000}, {0x3e496000}, + {0x3e498000}, {0x3e49a000}, {0x3e49c000}, {0x3e49e000}, + {0x3e4a0000}, {0x3e4a2000}, {0x3e4a4000}, {0x3e4a6000}, + {0x3e4a8000}, {0x3e4aa000}, {0x3e4ac000}, {0x3e4ae000}, + {0x3e4b0000}, {0x3e4b2000}, {0x3e4b4000}, {0x3e4b6000}, + {0x3e4b8000}, {0x3e4ba000}, {0x3e4bc000}, {0x3e4be000}, + {0x3e4c0000}, {0x3e4c2000}, {0x3e4c4000}, {0x3e4c6000}, + {0x3e4c8000}, {0x3e4ca000}, {0x3e4cc000}, {0x3e4ce000}, + {0x3e4d0000}, {0x3e4d2000}, {0x3e4d4000}, {0x3e4d6000}, + {0x3e4d8000}, {0x3e4da000}, {0x3e4dc000}, {0x3e4de000}, + {0x3e4e0000}, {0x3e4e2000}, {0x3e4e4000}, {0x3e4e6000}, + {0x3e4e8000}, {0x3e4ea000}, {0x3e4ec000}, {0x3e4ee000}, + {0x3e4f0000}, {0x3e4f2000}, {0x3e4f4000}, {0x3e4f6000}, + {0x3e4f8000}, {0x3e4fa000}, {0x3e4fc000}, {0x3e4fe000}, + {0x3e500000}, {0x3e502000}, {0x3e504000}, {0x3e506000}, + {0x3e508000}, {0x3e50a000}, {0x3e50c000}, {0x3e50e000}, + {0x3e510000}, {0x3e512000}, {0x3e514000}, {0x3e516000}, + {0x3e518000}, {0x3e51a000}, {0x3e51c000}, {0x3e51e000}, + {0x3e520000}, {0x3e522000}, {0x3e524000}, {0x3e526000}, + {0x3e528000}, {0x3e52a000}, {0x3e52c000}, {0x3e52e000}, + {0x3e530000}, {0x3e532000}, {0x3e534000}, {0x3e536000}, + {0x3e538000}, {0x3e53a000}, {0x3e53c000}, {0x3e53e000}, + {0x3e540000}, {0x3e542000}, {0x3e544000}, {0x3e546000}, + {0x3e548000}, {0x3e54a000}, {0x3e54c000}, {0x3e54e000}, + {0x3e550000}, {0x3e552000}, {0x3e554000}, {0x3e556000}, + {0x3e558000}, {0x3e55a000}, {0x3e55c000}, {0x3e55e000}, + {0x3e560000}, {0x3e562000}, {0x3e564000}, {0x3e566000}, + {0x3e568000}, {0x3e56a000}, {0x3e56c000}, {0x3e56e000}, + {0x3e570000}, {0x3e572000}, {0x3e574000}, {0x3e576000}, + {0x3e578000}, {0x3e57a000}, {0x3e57c000}, {0x3e57e000}, + {0x3e580000}, {0x3e582000}, {0x3e584000}, {0x3e586000}, + {0x3e588000}, {0x3e58a000}, {0x3e58c000}, {0x3e58e000}, + {0x3e590000}, {0x3e592000}, {0x3e594000}, {0x3e596000}, + {0x3e598000}, {0x3e59a000}, {0x3e59c000}, {0x3e59e000}, + {0x3e5a0000}, {0x3e5a2000}, {0x3e5a4000}, {0x3e5a6000}, + {0x3e5a8000}, {0x3e5aa000}, {0x3e5ac000}, {0x3e5ae000}, + {0x3e5b0000}, {0x3e5b2000}, {0x3e5b4000}, {0x3e5b6000}, + {0x3e5b8000}, {0x3e5ba000}, {0x3e5bc000}, {0x3e5be000}, + {0x3e5c0000}, {0x3e5c2000}, {0x3e5c4000}, {0x3e5c6000}, + {0x3e5c8000}, {0x3e5ca000}, {0x3e5cc000}, {0x3e5ce000}, + {0x3e5d0000}, {0x3e5d2000}, {0x3e5d4000}, {0x3e5d6000}, + {0x3e5d8000}, {0x3e5da000}, {0x3e5dc000}, {0x3e5de000}, + {0x3e5e0000}, {0x3e5e2000}, {0x3e5e4000}, {0x3e5e6000}, + {0x3e5e8000}, {0x3e5ea000}, {0x3e5ec000}, {0x3e5ee000}, + {0x3e5f0000}, {0x3e5f2000}, {0x3e5f4000}, {0x3e5f6000}, + {0x3e5f8000}, {0x3e5fa000}, {0x3e5fc000}, {0x3e5fe000}, + {0x3e600000}, {0x3e602000}, {0x3e604000}, {0x3e606000}, + {0x3e608000}, {0x3e60a000}, {0x3e60c000}, {0x3e60e000}, + {0x3e610000}, {0x3e612000}, {0x3e614000}, {0x3e616000}, + {0x3e618000}, {0x3e61a000}, {0x3e61c000}, {0x3e61e000}, + {0x3e620000}, {0x3e622000}, {0x3e624000}, {0x3e626000}, + {0x3e628000}, {0x3e62a000}, {0x3e62c000}, {0x3e62e000}, + {0x3e630000}, {0x3e632000}, {0x3e634000}, {0x3e636000}, + {0x3e638000}, {0x3e63a000}, {0x3e63c000}, {0x3e63e000}, + {0x3e640000}, {0x3e642000}, {0x3e644000}, {0x3e646000}, + {0x3e648000}, {0x3e64a000}, {0x3e64c000}, {0x3e64e000}, + {0x3e650000}, {0x3e652000}, {0x3e654000}, {0x3e656000}, + {0x3e658000}, {0x3e65a000}, {0x3e65c000}, {0x3e65e000}, + {0x3e660000}, {0x3e662000}, {0x3e664000}, {0x3e666000}, + {0x3e668000}, {0x3e66a000}, {0x3e66c000}, {0x3e66e000}, + {0x3e670000}, {0x3e672000}, {0x3e674000}, {0x3e676000}, + {0x3e678000}, {0x3e67a000}, {0x3e67c000}, {0x3e67e000}, + {0x3e680000}, {0x3e682000}, {0x3e684000}, {0x3e686000}, + {0x3e688000}, {0x3e68a000}, {0x3e68c000}, {0x3e68e000}, + {0x3e690000}, {0x3e692000}, {0x3e694000}, {0x3e696000}, + {0x3e698000}, {0x3e69a000}, {0x3e69c000}, {0x3e69e000}, + {0x3e6a0000}, {0x3e6a2000}, {0x3e6a4000}, {0x3e6a6000}, + {0x3e6a8000}, {0x3e6aa000}, {0x3e6ac000}, {0x3e6ae000}, + {0x3e6b0000}, {0x3e6b2000}, {0x3e6b4000}, {0x3e6b6000}, + {0x3e6b8000}, {0x3e6ba000}, {0x3e6bc000}, {0x3e6be000}, + {0x3e6c0000}, {0x3e6c2000}, {0x3e6c4000}, {0x3e6c6000}, + {0x3e6c8000}, {0x3e6ca000}, {0x3e6cc000}, {0x3e6ce000}, + {0x3e6d0000}, {0x3e6d2000}, {0x3e6d4000}, {0x3e6d6000}, + {0x3e6d8000}, {0x3e6da000}, {0x3e6dc000}, {0x3e6de000}, + {0x3e6e0000}, {0x3e6e2000}, {0x3e6e4000}, {0x3e6e6000}, + {0x3e6e8000}, {0x3e6ea000}, {0x3e6ec000}, {0x3e6ee000}, + {0x3e6f0000}, {0x3e6f2000}, {0x3e6f4000}, {0x3e6f6000}, + {0x3e6f8000}, {0x3e6fa000}, {0x3e6fc000}, {0x3e6fe000}, + {0x3e700000}, {0x3e702000}, {0x3e704000}, {0x3e706000}, + {0x3e708000}, {0x3e70a000}, {0x3e70c000}, {0x3e70e000}, + {0x3e710000}, {0x3e712000}, {0x3e714000}, {0x3e716000}, + {0x3e718000}, {0x3e71a000}, {0x3e71c000}, {0x3e71e000}, + {0x3e720000}, {0x3e722000}, {0x3e724000}, {0x3e726000}, + {0x3e728000}, {0x3e72a000}, {0x3e72c000}, {0x3e72e000}, + {0x3e730000}, {0x3e732000}, {0x3e734000}, {0x3e736000}, + {0x3e738000}, {0x3e73a000}, {0x3e73c000}, {0x3e73e000}, + {0x3e740000}, {0x3e742000}, {0x3e744000}, {0x3e746000}, + {0x3e748000}, {0x3e74a000}, {0x3e74c000}, {0x3e74e000}, + {0x3e750000}, {0x3e752000}, {0x3e754000}, {0x3e756000}, + {0x3e758000}, {0x3e75a000}, {0x3e75c000}, {0x3e75e000}, + {0x3e760000}, {0x3e762000}, {0x3e764000}, {0x3e766000}, + {0x3e768000}, {0x3e76a000}, {0x3e76c000}, {0x3e76e000}, + {0x3e770000}, {0x3e772000}, {0x3e774000}, {0x3e776000}, + {0x3e778000}, {0x3e77a000}, {0x3e77c000}, {0x3e77e000}, + {0x3e780000}, {0x3e782000}, {0x3e784000}, {0x3e786000}, + {0x3e788000}, {0x3e78a000}, {0x3e78c000}, {0x3e78e000}, + {0x3e790000}, {0x3e792000}, {0x3e794000}, {0x3e796000}, + {0x3e798000}, {0x3e79a000}, {0x3e79c000}, {0x3e79e000}, + {0x3e7a0000}, {0x3e7a2000}, {0x3e7a4000}, {0x3e7a6000}, + {0x3e7a8000}, {0x3e7aa000}, {0x3e7ac000}, {0x3e7ae000}, + {0x3e7b0000}, {0x3e7b2000}, {0x3e7b4000}, {0x3e7b6000}, + {0x3e7b8000}, {0x3e7ba000}, {0x3e7bc000}, {0x3e7be000}, + {0x3e7c0000}, {0x3e7c2000}, {0x3e7c4000}, {0x3e7c6000}, + {0x3e7c8000}, {0x3e7ca000}, {0x3e7cc000}, {0x3e7ce000}, + {0x3e7d0000}, {0x3e7d2000}, {0x3e7d4000}, {0x3e7d6000}, + {0x3e7d8000}, {0x3e7da000}, {0x3e7dc000}, {0x3e7de000}, + {0x3e7e0000}, {0x3e7e2000}, {0x3e7e4000}, {0x3e7e6000}, + {0x3e7e8000}, {0x3e7ea000}, {0x3e7ec000}, {0x3e7ee000}, + {0x3e7f0000}, {0x3e7f2000}, {0x3e7f4000}, {0x3e7f6000}, + {0x3e7f8000}, {0x3e7fa000}, {0x3e7fc000}, {0x3e7fe000}, + {0x3e800000}, {0x3e802000}, {0x3e804000}, {0x3e806000}, + {0x3e808000}, {0x3e80a000}, {0x3e80c000}, {0x3e80e000}, + {0x3e810000}, {0x3e812000}, {0x3e814000}, {0x3e816000}, + {0x3e818000}, {0x3e81a000}, {0x3e81c000}, {0x3e81e000}, + {0x3e820000}, {0x3e822000}, {0x3e824000}, {0x3e826000}, + {0x3e828000}, {0x3e82a000}, {0x3e82c000}, {0x3e82e000}, + {0x3e830000}, {0x3e832000}, {0x3e834000}, {0x3e836000}, + {0x3e838000}, {0x3e83a000}, {0x3e83c000}, {0x3e83e000}, + {0x3e840000}, {0x3e842000}, {0x3e844000}, {0x3e846000}, + {0x3e848000}, {0x3e84a000}, {0x3e84c000}, {0x3e84e000}, + {0x3e850000}, {0x3e852000}, {0x3e854000}, {0x3e856000}, + {0x3e858000}, {0x3e85a000}, {0x3e85c000}, {0x3e85e000}, + {0x3e860000}, {0x3e862000}, {0x3e864000}, {0x3e866000}, + {0x3e868000}, {0x3e86a000}, {0x3e86c000}, {0x3e86e000}, + {0x3e870000}, {0x3e872000}, {0x3e874000}, {0x3e876000}, + {0x3e878000}, {0x3e87a000}, {0x3e87c000}, {0x3e87e000}, + {0x3e880000}, {0x3e882000}, {0x3e884000}, {0x3e886000}, + {0x3e888000}, {0x3e88a000}, {0x3e88c000}, {0x3e88e000}, + {0x3e890000}, {0x3e892000}, {0x3e894000}, {0x3e896000}, + {0x3e898000}, {0x3e89a000}, {0x3e89c000}, {0x3e89e000}, + {0x3e8a0000}, {0x3e8a2000}, {0x3e8a4000}, {0x3e8a6000}, + {0x3e8a8000}, {0x3e8aa000}, {0x3e8ac000}, {0x3e8ae000}, + {0x3e8b0000}, {0x3e8b2000}, {0x3e8b4000}, {0x3e8b6000}, + {0x3e8b8000}, {0x3e8ba000}, {0x3e8bc000}, {0x3e8be000}, + {0x3e8c0000}, {0x3e8c2000}, {0x3e8c4000}, {0x3e8c6000}, + {0x3e8c8000}, {0x3e8ca000}, {0x3e8cc000}, {0x3e8ce000}, + {0x3e8d0000}, {0x3e8d2000}, {0x3e8d4000}, {0x3e8d6000}, + {0x3e8d8000}, {0x3e8da000}, {0x3e8dc000}, {0x3e8de000}, + {0x3e8e0000}, {0x3e8e2000}, {0x3e8e4000}, {0x3e8e6000}, + {0x3e8e8000}, {0x3e8ea000}, {0x3e8ec000}, {0x3e8ee000}, + {0x3e8f0000}, {0x3e8f2000}, {0x3e8f4000}, {0x3e8f6000}, + {0x3e8f8000}, {0x3e8fa000}, {0x3e8fc000}, {0x3e8fe000}, + {0x3e900000}, {0x3e902000}, {0x3e904000}, {0x3e906000}, + {0x3e908000}, {0x3e90a000}, {0x3e90c000}, {0x3e90e000}, + {0x3e910000}, {0x3e912000}, {0x3e914000}, {0x3e916000}, + {0x3e918000}, {0x3e91a000}, {0x3e91c000}, {0x3e91e000}, + {0x3e920000}, {0x3e922000}, {0x3e924000}, {0x3e926000}, + {0x3e928000}, {0x3e92a000}, {0x3e92c000}, {0x3e92e000}, + {0x3e930000}, {0x3e932000}, {0x3e934000}, {0x3e936000}, + {0x3e938000}, {0x3e93a000}, {0x3e93c000}, {0x3e93e000}, + {0x3e940000}, {0x3e942000}, {0x3e944000}, {0x3e946000}, + {0x3e948000}, {0x3e94a000}, {0x3e94c000}, {0x3e94e000}, + {0x3e950000}, {0x3e952000}, {0x3e954000}, {0x3e956000}, + {0x3e958000}, {0x3e95a000}, {0x3e95c000}, {0x3e95e000}, + {0x3e960000}, {0x3e962000}, {0x3e964000}, {0x3e966000}, + {0x3e968000}, {0x3e96a000}, {0x3e96c000}, {0x3e96e000}, + {0x3e970000}, {0x3e972000}, {0x3e974000}, {0x3e976000}, + {0x3e978000}, {0x3e97a000}, {0x3e97c000}, {0x3e97e000}, + {0x3e980000}, {0x3e982000}, {0x3e984000}, {0x3e986000}, + {0x3e988000}, {0x3e98a000}, {0x3e98c000}, {0x3e98e000}, + {0x3e990000}, {0x3e992000}, {0x3e994000}, {0x3e996000}, + {0x3e998000}, {0x3e99a000}, {0x3e99c000}, {0x3e99e000}, + {0x3e9a0000}, {0x3e9a2000}, {0x3e9a4000}, {0x3e9a6000}, + {0x3e9a8000}, {0x3e9aa000}, {0x3e9ac000}, {0x3e9ae000}, + {0x3e9b0000}, {0x3e9b2000}, {0x3e9b4000}, {0x3e9b6000}, + {0x3e9b8000}, {0x3e9ba000}, {0x3e9bc000}, {0x3e9be000}, + {0x3e9c0000}, {0x3e9c2000}, {0x3e9c4000}, {0x3e9c6000}, + {0x3e9c8000}, {0x3e9ca000}, {0x3e9cc000}, {0x3e9ce000}, + {0x3e9d0000}, {0x3e9d2000}, {0x3e9d4000}, {0x3e9d6000}, + {0x3e9d8000}, {0x3e9da000}, {0x3e9dc000}, {0x3e9de000}, + {0x3e9e0000}, {0x3e9e2000}, {0x3e9e4000}, {0x3e9e6000}, + {0x3e9e8000}, {0x3e9ea000}, {0x3e9ec000}, {0x3e9ee000}, + {0x3e9f0000}, {0x3e9f2000}, {0x3e9f4000}, {0x3e9f6000}, + {0x3e9f8000}, {0x3e9fa000}, {0x3e9fc000}, {0x3e9fe000}, + {0x3ea00000}, {0x3ea02000}, {0x3ea04000}, {0x3ea06000}, + {0x3ea08000}, {0x3ea0a000}, {0x3ea0c000}, {0x3ea0e000}, + {0x3ea10000}, {0x3ea12000}, {0x3ea14000}, {0x3ea16000}, + {0x3ea18000}, {0x3ea1a000}, {0x3ea1c000}, {0x3ea1e000}, + {0x3ea20000}, {0x3ea22000}, {0x3ea24000}, {0x3ea26000}, + {0x3ea28000}, {0x3ea2a000}, {0x3ea2c000}, {0x3ea2e000}, + {0x3ea30000}, {0x3ea32000}, {0x3ea34000}, {0x3ea36000}, + {0x3ea38000}, {0x3ea3a000}, {0x3ea3c000}, {0x3ea3e000}, + {0x3ea40000}, {0x3ea42000}, {0x3ea44000}, {0x3ea46000}, + {0x3ea48000}, {0x3ea4a000}, {0x3ea4c000}, {0x3ea4e000}, + {0x3ea50000}, {0x3ea52000}, {0x3ea54000}, {0x3ea56000}, + {0x3ea58000}, {0x3ea5a000}, {0x3ea5c000}, {0x3ea5e000}, + {0x3ea60000}, {0x3ea62000}, {0x3ea64000}, {0x3ea66000}, + {0x3ea68000}, {0x3ea6a000}, {0x3ea6c000}, {0x3ea6e000}, + {0x3ea70000}, {0x3ea72000}, {0x3ea74000}, {0x3ea76000}, + {0x3ea78000}, {0x3ea7a000}, {0x3ea7c000}, {0x3ea7e000}, + {0x3ea80000}, {0x3ea82000}, {0x3ea84000}, {0x3ea86000}, + {0x3ea88000}, {0x3ea8a000}, {0x3ea8c000}, {0x3ea8e000}, + {0x3ea90000}, {0x3ea92000}, {0x3ea94000}, {0x3ea96000}, + {0x3ea98000}, {0x3ea9a000}, {0x3ea9c000}, {0x3ea9e000}, + {0x3eaa0000}, {0x3eaa2000}, {0x3eaa4000}, {0x3eaa6000}, + {0x3eaa8000}, {0x3eaaa000}, {0x3eaac000}, {0x3eaae000}, + {0x3eab0000}, {0x3eab2000}, {0x3eab4000}, {0x3eab6000}, + {0x3eab8000}, {0x3eaba000}, {0x3eabc000}, {0x3eabe000}, + {0x3eac0000}, {0x3eac2000}, {0x3eac4000}, {0x3eac6000}, + {0x3eac8000}, {0x3eaca000}, {0x3eacc000}, {0x3eace000}, + {0x3ead0000}, {0x3ead2000}, {0x3ead4000}, {0x3ead6000}, + {0x3ead8000}, {0x3eada000}, {0x3eadc000}, {0x3eade000}, + {0x3eae0000}, {0x3eae2000}, {0x3eae4000}, {0x3eae6000}, + {0x3eae8000}, {0x3eaea000}, {0x3eaec000}, {0x3eaee000}, + {0x3eaf0000}, {0x3eaf2000}, {0x3eaf4000}, {0x3eaf6000}, + {0x3eaf8000}, {0x3eafa000}, {0x3eafc000}, {0x3eafe000}, + {0x3eb00000}, {0x3eb02000}, {0x3eb04000}, {0x3eb06000}, + {0x3eb08000}, {0x3eb0a000}, {0x3eb0c000}, {0x3eb0e000}, + {0x3eb10000}, {0x3eb12000}, {0x3eb14000}, {0x3eb16000}, + {0x3eb18000}, {0x3eb1a000}, {0x3eb1c000}, {0x3eb1e000}, + {0x3eb20000}, {0x3eb22000}, {0x3eb24000}, {0x3eb26000}, + {0x3eb28000}, {0x3eb2a000}, {0x3eb2c000}, {0x3eb2e000}, + {0x3eb30000}, {0x3eb32000}, {0x3eb34000}, {0x3eb36000}, + {0x3eb38000}, {0x3eb3a000}, {0x3eb3c000}, {0x3eb3e000}, + {0x3eb40000}, {0x3eb42000}, {0x3eb44000}, {0x3eb46000}, + {0x3eb48000}, {0x3eb4a000}, {0x3eb4c000}, {0x3eb4e000}, + {0x3eb50000}, {0x3eb52000}, {0x3eb54000}, {0x3eb56000}, + {0x3eb58000}, {0x3eb5a000}, {0x3eb5c000}, {0x3eb5e000}, + {0x3eb60000}, {0x3eb62000}, {0x3eb64000}, {0x3eb66000}, + {0x3eb68000}, {0x3eb6a000}, {0x3eb6c000}, {0x3eb6e000}, + {0x3eb70000}, {0x3eb72000}, {0x3eb74000}, {0x3eb76000}, + {0x3eb78000}, {0x3eb7a000}, {0x3eb7c000}, {0x3eb7e000}, + {0x3eb80000}, {0x3eb82000}, {0x3eb84000}, {0x3eb86000}, + {0x3eb88000}, {0x3eb8a000}, {0x3eb8c000}, {0x3eb8e000}, + {0x3eb90000}, {0x3eb92000}, {0x3eb94000}, {0x3eb96000}, + {0x3eb98000}, {0x3eb9a000}, {0x3eb9c000}, {0x3eb9e000}, + {0x3eba0000}, {0x3eba2000}, {0x3eba4000}, {0x3eba6000}, + {0x3eba8000}, {0x3ebaa000}, {0x3ebac000}, {0x3ebae000}, + {0x3ebb0000}, {0x3ebb2000}, {0x3ebb4000}, {0x3ebb6000}, + {0x3ebb8000}, {0x3ebba000}, {0x3ebbc000}, {0x3ebbe000}, + {0x3ebc0000}, {0x3ebc2000}, {0x3ebc4000}, {0x3ebc6000}, + {0x3ebc8000}, {0x3ebca000}, {0x3ebcc000}, {0x3ebce000}, + {0x3ebd0000}, {0x3ebd2000}, {0x3ebd4000}, {0x3ebd6000}, + {0x3ebd8000}, {0x3ebda000}, {0x3ebdc000}, {0x3ebde000}, + {0x3ebe0000}, {0x3ebe2000}, {0x3ebe4000}, {0x3ebe6000}, + {0x3ebe8000}, {0x3ebea000}, {0x3ebec000}, {0x3ebee000}, + {0x3ebf0000}, {0x3ebf2000}, {0x3ebf4000}, {0x3ebf6000}, + {0x3ebf8000}, {0x3ebfa000}, {0x3ebfc000}, {0x3ebfe000}, + {0x3ec00000}, {0x3ec02000}, {0x3ec04000}, {0x3ec06000}, + {0x3ec08000}, {0x3ec0a000}, {0x3ec0c000}, {0x3ec0e000}, + {0x3ec10000}, {0x3ec12000}, {0x3ec14000}, {0x3ec16000}, + {0x3ec18000}, {0x3ec1a000}, {0x3ec1c000}, {0x3ec1e000}, + {0x3ec20000}, {0x3ec22000}, {0x3ec24000}, {0x3ec26000}, + {0x3ec28000}, {0x3ec2a000}, {0x3ec2c000}, {0x3ec2e000}, + {0x3ec30000}, {0x3ec32000}, {0x3ec34000}, {0x3ec36000}, + {0x3ec38000}, {0x3ec3a000}, {0x3ec3c000}, {0x3ec3e000}, + {0x3ec40000}, {0x3ec42000}, {0x3ec44000}, {0x3ec46000}, + {0x3ec48000}, {0x3ec4a000}, {0x3ec4c000}, {0x3ec4e000}, + {0x3ec50000}, {0x3ec52000}, {0x3ec54000}, {0x3ec56000}, + {0x3ec58000}, {0x3ec5a000}, {0x3ec5c000}, {0x3ec5e000}, + {0x3ec60000}, {0x3ec62000}, {0x3ec64000}, {0x3ec66000}, + {0x3ec68000}, {0x3ec6a000}, {0x3ec6c000}, {0x3ec6e000}, + {0x3ec70000}, {0x3ec72000}, {0x3ec74000}, {0x3ec76000}, + {0x3ec78000}, {0x3ec7a000}, {0x3ec7c000}, {0x3ec7e000}, + {0x3ec80000}, {0x3ec82000}, {0x3ec84000}, {0x3ec86000}, + {0x3ec88000}, {0x3ec8a000}, {0x3ec8c000}, {0x3ec8e000}, + {0x3ec90000}, {0x3ec92000}, {0x3ec94000}, {0x3ec96000}, + {0x3ec98000}, {0x3ec9a000}, {0x3ec9c000}, {0x3ec9e000}, + {0x3eca0000}, {0x3eca2000}, {0x3eca4000}, {0x3eca6000}, + {0x3eca8000}, {0x3ecaa000}, {0x3ecac000}, {0x3ecae000}, + {0x3ecb0000}, {0x3ecb2000}, {0x3ecb4000}, {0x3ecb6000}, + {0x3ecb8000}, {0x3ecba000}, {0x3ecbc000}, {0x3ecbe000}, + {0x3ecc0000}, {0x3ecc2000}, {0x3ecc4000}, {0x3ecc6000}, + {0x3ecc8000}, {0x3ecca000}, {0x3eccc000}, {0x3ecce000}, + {0x3ecd0000}, {0x3ecd2000}, {0x3ecd4000}, {0x3ecd6000}, + {0x3ecd8000}, {0x3ecda000}, {0x3ecdc000}, {0x3ecde000}, + {0x3ece0000}, {0x3ece2000}, {0x3ece4000}, {0x3ece6000}, + {0x3ece8000}, {0x3ecea000}, {0x3ecec000}, {0x3ecee000}, + {0x3ecf0000}, {0x3ecf2000}, {0x3ecf4000}, {0x3ecf6000}, + {0x3ecf8000}, {0x3ecfa000}, {0x3ecfc000}, {0x3ecfe000}, + {0x3ed00000}, {0x3ed02000}, {0x3ed04000}, {0x3ed06000}, + {0x3ed08000}, {0x3ed0a000}, {0x3ed0c000}, {0x3ed0e000}, + {0x3ed10000}, {0x3ed12000}, {0x3ed14000}, {0x3ed16000}, + {0x3ed18000}, {0x3ed1a000}, {0x3ed1c000}, {0x3ed1e000}, + {0x3ed20000}, {0x3ed22000}, {0x3ed24000}, {0x3ed26000}, + {0x3ed28000}, {0x3ed2a000}, {0x3ed2c000}, {0x3ed2e000}, + {0x3ed30000}, {0x3ed32000}, {0x3ed34000}, {0x3ed36000}, + {0x3ed38000}, {0x3ed3a000}, {0x3ed3c000}, {0x3ed3e000}, + {0x3ed40000}, {0x3ed42000}, {0x3ed44000}, {0x3ed46000}, + {0x3ed48000}, {0x3ed4a000}, {0x3ed4c000}, {0x3ed4e000}, + {0x3ed50000}, {0x3ed52000}, {0x3ed54000}, {0x3ed56000}, + {0x3ed58000}, {0x3ed5a000}, {0x3ed5c000}, {0x3ed5e000}, + {0x3ed60000}, {0x3ed62000}, {0x3ed64000}, {0x3ed66000}, + {0x3ed68000}, {0x3ed6a000}, {0x3ed6c000}, {0x3ed6e000}, + {0x3ed70000}, {0x3ed72000}, {0x3ed74000}, {0x3ed76000}, + {0x3ed78000}, {0x3ed7a000}, {0x3ed7c000}, {0x3ed7e000}, + {0x3ed80000}, {0x3ed82000}, {0x3ed84000}, {0x3ed86000}, + {0x3ed88000}, {0x3ed8a000}, {0x3ed8c000}, {0x3ed8e000}, + {0x3ed90000}, {0x3ed92000}, {0x3ed94000}, {0x3ed96000}, + {0x3ed98000}, {0x3ed9a000}, {0x3ed9c000}, {0x3ed9e000}, + {0x3eda0000}, {0x3eda2000}, {0x3eda4000}, {0x3eda6000}, + {0x3eda8000}, {0x3edaa000}, {0x3edac000}, {0x3edae000}, + {0x3edb0000}, {0x3edb2000}, {0x3edb4000}, {0x3edb6000}, + {0x3edb8000}, {0x3edba000}, {0x3edbc000}, {0x3edbe000}, + {0x3edc0000}, {0x3edc2000}, {0x3edc4000}, {0x3edc6000}, + {0x3edc8000}, {0x3edca000}, {0x3edcc000}, {0x3edce000}, + {0x3edd0000}, {0x3edd2000}, {0x3edd4000}, {0x3edd6000}, + {0x3edd8000}, {0x3edda000}, {0x3eddc000}, {0x3edde000}, + {0x3ede0000}, {0x3ede2000}, {0x3ede4000}, {0x3ede6000}, + {0x3ede8000}, {0x3edea000}, {0x3edec000}, {0x3edee000}, + {0x3edf0000}, {0x3edf2000}, {0x3edf4000}, {0x3edf6000}, + {0x3edf8000}, {0x3edfa000}, {0x3edfc000}, {0x3edfe000}, + {0x3ee00000}, {0x3ee02000}, {0x3ee04000}, {0x3ee06000}, + {0x3ee08000}, {0x3ee0a000}, {0x3ee0c000}, {0x3ee0e000}, + {0x3ee10000}, {0x3ee12000}, {0x3ee14000}, {0x3ee16000}, + {0x3ee18000}, {0x3ee1a000}, {0x3ee1c000}, {0x3ee1e000}, + {0x3ee20000}, {0x3ee22000}, {0x3ee24000}, {0x3ee26000}, + {0x3ee28000}, {0x3ee2a000}, {0x3ee2c000}, {0x3ee2e000}, + {0x3ee30000}, {0x3ee32000}, {0x3ee34000}, {0x3ee36000}, + {0x3ee38000}, {0x3ee3a000}, {0x3ee3c000}, {0x3ee3e000}, + {0x3ee40000}, {0x3ee42000}, {0x3ee44000}, {0x3ee46000}, + {0x3ee48000}, {0x3ee4a000}, {0x3ee4c000}, {0x3ee4e000}, + {0x3ee50000}, {0x3ee52000}, {0x3ee54000}, {0x3ee56000}, + {0x3ee58000}, {0x3ee5a000}, {0x3ee5c000}, {0x3ee5e000}, + {0x3ee60000}, {0x3ee62000}, {0x3ee64000}, {0x3ee66000}, + {0x3ee68000}, {0x3ee6a000}, {0x3ee6c000}, {0x3ee6e000}, + {0x3ee70000}, {0x3ee72000}, {0x3ee74000}, {0x3ee76000}, + {0x3ee78000}, {0x3ee7a000}, {0x3ee7c000}, {0x3ee7e000}, + {0x3ee80000}, {0x3ee82000}, {0x3ee84000}, {0x3ee86000}, + {0x3ee88000}, {0x3ee8a000}, {0x3ee8c000}, {0x3ee8e000}, + {0x3ee90000}, {0x3ee92000}, {0x3ee94000}, {0x3ee96000}, + {0x3ee98000}, {0x3ee9a000}, {0x3ee9c000}, {0x3ee9e000}, + {0x3eea0000}, {0x3eea2000}, {0x3eea4000}, {0x3eea6000}, + {0x3eea8000}, {0x3eeaa000}, {0x3eeac000}, {0x3eeae000}, + {0x3eeb0000}, {0x3eeb2000}, {0x3eeb4000}, {0x3eeb6000}, + {0x3eeb8000}, {0x3eeba000}, {0x3eebc000}, {0x3eebe000}, + {0x3eec0000}, {0x3eec2000}, {0x3eec4000}, {0x3eec6000}, + {0x3eec8000}, {0x3eeca000}, {0x3eecc000}, {0x3eece000}, + {0x3eed0000}, {0x3eed2000}, {0x3eed4000}, {0x3eed6000}, + {0x3eed8000}, {0x3eeda000}, {0x3eedc000}, {0x3eede000}, + {0x3eee0000}, {0x3eee2000}, {0x3eee4000}, {0x3eee6000}, + {0x3eee8000}, {0x3eeea000}, {0x3eeec000}, {0x3eeee000}, + {0x3eef0000}, {0x3eef2000}, {0x3eef4000}, {0x3eef6000}, + {0x3eef8000}, {0x3eefa000}, {0x3eefc000}, {0x3eefe000}, + {0x3ef00000}, {0x3ef02000}, {0x3ef04000}, {0x3ef06000}, + {0x3ef08000}, {0x3ef0a000}, {0x3ef0c000}, {0x3ef0e000}, + {0x3ef10000}, {0x3ef12000}, {0x3ef14000}, {0x3ef16000}, + {0x3ef18000}, {0x3ef1a000}, {0x3ef1c000}, {0x3ef1e000}, + {0x3ef20000}, {0x3ef22000}, {0x3ef24000}, {0x3ef26000}, + {0x3ef28000}, {0x3ef2a000}, {0x3ef2c000}, {0x3ef2e000}, + {0x3ef30000}, {0x3ef32000}, {0x3ef34000}, {0x3ef36000}, + {0x3ef38000}, {0x3ef3a000}, {0x3ef3c000}, {0x3ef3e000}, + {0x3ef40000}, {0x3ef42000}, {0x3ef44000}, {0x3ef46000}, + {0x3ef48000}, {0x3ef4a000}, {0x3ef4c000}, {0x3ef4e000}, + {0x3ef50000}, {0x3ef52000}, {0x3ef54000}, {0x3ef56000}, + {0x3ef58000}, {0x3ef5a000}, {0x3ef5c000}, {0x3ef5e000}, + {0x3ef60000}, {0x3ef62000}, {0x3ef64000}, {0x3ef66000}, + {0x3ef68000}, {0x3ef6a000}, {0x3ef6c000}, {0x3ef6e000}, + {0x3ef70000}, {0x3ef72000}, {0x3ef74000}, {0x3ef76000}, + {0x3ef78000}, {0x3ef7a000}, {0x3ef7c000}, {0x3ef7e000}, + {0x3ef80000}, {0x3ef82000}, {0x3ef84000}, {0x3ef86000}, + {0x3ef88000}, {0x3ef8a000}, {0x3ef8c000}, {0x3ef8e000}, + {0x3ef90000}, {0x3ef92000}, {0x3ef94000}, {0x3ef96000}, + {0x3ef98000}, {0x3ef9a000}, {0x3ef9c000}, {0x3ef9e000}, + {0x3efa0000}, {0x3efa2000}, {0x3efa4000}, {0x3efa6000}, + {0x3efa8000}, {0x3efaa000}, {0x3efac000}, {0x3efae000}, + {0x3efb0000}, {0x3efb2000}, {0x3efb4000}, {0x3efb6000}, + {0x3efb8000}, {0x3efba000}, {0x3efbc000}, {0x3efbe000}, + {0x3efc0000}, {0x3efc2000}, {0x3efc4000}, {0x3efc6000}, + {0x3efc8000}, {0x3efca000}, {0x3efcc000}, {0x3efce000}, + {0x3efd0000}, {0x3efd2000}, {0x3efd4000}, {0x3efd6000}, + {0x3efd8000}, {0x3efda000}, {0x3efdc000}, {0x3efde000}, + {0x3efe0000}, {0x3efe2000}, {0x3efe4000}, {0x3efe6000}, + {0x3efe8000}, {0x3efea000}, {0x3efec000}, {0x3efee000}, + {0x3eff0000}, {0x3eff2000}, {0x3eff4000}, {0x3eff6000}, + {0x3eff8000}, {0x3effa000}, {0x3effc000}, {0x3effe000}, + {0x3f000000}, {0x3f002000}, {0x3f004000}, {0x3f006000}, + {0x3f008000}, {0x3f00a000}, {0x3f00c000}, {0x3f00e000}, + {0x3f010000}, {0x3f012000}, {0x3f014000}, {0x3f016000}, + {0x3f018000}, {0x3f01a000}, {0x3f01c000}, {0x3f01e000}, + {0x3f020000}, {0x3f022000}, {0x3f024000}, {0x3f026000}, + {0x3f028000}, {0x3f02a000}, {0x3f02c000}, {0x3f02e000}, + {0x3f030000}, {0x3f032000}, {0x3f034000}, {0x3f036000}, + {0x3f038000}, {0x3f03a000}, {0x3f03c000}, {0x3f03e000}, + {0x3f040000}, {0x3f042000}, {0x3f044000}, {0x3f046000}, + {0x3f048000}, {0x3f04a000}, {0x3f04c000}, {0x3f04e000}, + {0x3f050000}, {0x3f052000}, {0x3f054000}, {0x3f056000}, + {0x3f058000}, {0x3f05a000}, {0x3f05c000}, {0x3f05e000}, + {0x3f060000}, {0x3f062000}, {0x3f064000}, {0x3f066000}, + {0x3f068000}, {0x3f06a000}, {0x3f06c000}, {0x3f06e000}, + {0x3f070000}, {0x3f072000}, {0x3f074000}, {0x3f076000}, + {0x3f078000}, {0x3f07a000}, {0x3f07c000}, {0x3f07e000}, + {0x3f080000}, {0x3f082000}, {0x3f084000}, {0x3f086000}, + {0x3f088000}, {0x3f08a000}, {0x3f08c000}, {0x3f08e000}, + {0x3f090000}, {0x3f092000}, {0x3f094000}, {0x3f096000}, + {0x3f098000}, {0x3f09a000}, {0x3f09c000}, {0x3f09e000}, + {0x3f0a0000}, {0x3f0a2000}, {0x3f0a4000}, {0x3f0a6000}, + {0x3f0a8000}, {0x3f0aa000}, {0x3f0ac000}, {0x3f0ae000}, + {0x3f0b0000}, {0x3f0b2000}, {0x3f0b4000}, {0x3f0b6000}, + {0x3f0b8000}, {0x3f0ba000}, {0x3f0bc000}, {0x3f0be000}, + {0x3f0c0000}, {0x3f0c2000}, {0x3f0c4000}, {0x3f0c6000}, + {0x3f0c8000}, {0x3f0ca000}, {0x3f0cc000}, {0x3f0ce000}, + {0x3f0d0000}, {0x3f0d2000}, {0x3f0d4000}, {0x3f0d6000}, + {0x3f0d8000}, {0x3f0da000}, {0x3f0dc000}, {0x3f0de000}, + {0x3f0e0000}, {0x3f0e2000}, {0x3f0e4000}, {0x3f0e6000}, + {0x3f0e8000}, {0x3f0ea000}, {0x3f0ec000}, {0x3f0ee000}, + {0x3f0f0000}, {0x3f0f2000}, {0x3f0f4000}, {0x3f0f6000}, + {0x3f0f8000}, {0x3f0fa000}, {0x3f0fc000}, {0x3f0fe000}, + {0x3f100000}, {0x3f102000}, {0x3f104000}, {0x3f106000}, + {0x3f108000}, {0x3f10a000}, {0x3f10c000}, {0x3f10e000}, + {0x3f110000}, {0x3f112000}, {0x3f114000}, {0x3f116000}, + {0x3f118000}, {0x3f11a000}, {0x3f11c000}, {0x3f11e000}, + {0x3f120000}, {0x3f122000}, {0x3f124000}, {0x3f126000}, + {0x3f128000}, {0x3f12a000}, {0x3f12c000}, {0x3f12e000}, + {0x3f130000}, {0x3f132000}, {0x3f134000}, {0x3f136000}, + {0x3f138000}, {0x3f13a000}, {0x3f13c000}, {0x3f13e000}, + {0x3f140000}, {0x3f142000}, {0x3f144000}, {0x3f146000}, + {0x3f148000}, {0x3f14a000}, {0x3f14c000}, {0x3f14e000}, + {0x3f150000}, {0x3f152000}, {0x3f154000}, {0x3f156000}, + {0x3f158000}, {0x3f15a000}, {0x3f15c000}, {0x3f15e000}, + {0x3f160000}, {0x3f162000}, {0x3f164000}, {0x3f166000}, + {0x3f168000}, {0x3f16a000}, {0x3f16c000}, {0x3f16e000}, + {0x3f170000}, {0x3f172000}, {0x3f174000}, {0x3f176000}, + {0x3f178000}, {0x3f17a000}, {0x3f17c000}, {0x3f17e000}, + {0x3f180000}, {0x3f182000}, {0x3f184000}, {0x3f186000}, + {0x3f188000}, {0x3f18a000}, {0x3f18c000}, {0x3f18e000}, + {0x3f190000}, {0x3f192000}, {0x3f194000}, {0x3f196000}, + {0x3f198000}, {0x3f19a000}, {0x3f19c000}, {0x3f19e000}, + {0x3f1a0000}, {0x3f1a2000}, {0x3f1a4000}, {0x3f1a6000}, + {0x3f1a8000}, {0x3f1aa000}, {0x3f1ac000}, {0x3f1ae000}, + {0x3f1b0000}, {0x3f1b2000}, {0x3f1b4000}, {0x3f1b6000}, + {0x3f1b8000}, {0x3f1ba000}, {0x3f1bc000}, {0x3f1be000}, + {0x3f1c0000}, {0x3f1c2000}, {0x3f1c4000}, {0x3f1c6000}, + {0x3f1c8000}, {0x3f1ca000}, {0x3f1cc000}, {0x3f1ce000}, + {0x3f1d0000}, {0x3f1d2000}, {0x3f1d4000}, {0x3f1d6000}, + {0x3f1d8000}, {0x3f1da000}, {0x3f1dc000}, {0x3f1de000}, + {0x3f1e0000}, {0x3f1e2000}, {0x3f1e4000}, {0x3f1e6000}, + {0x3f1e8000}, {0x3f1ea000}, {0x3f1ec000}, {0x3f1ee000}, + {0x3f1f0000}, {0x3f1f2000}, {0x3f1f4000}, {0x3f1f6000}, + {0x3f1f8000}, {0x3f1fa000}, {0x3f1fc000}, {0x3f1fe000}, + {0x3f200000}, {0x3f202000}, {0x3f204000}, {0x3f206000}, + {0x3f208000}, {0x3f20a000}, {0x3f20c000}, {0x3f20e000}, + {0x3f210000}, {0x3f212000}, {0x3f214000}, {0x3f216000}, + {0x3f218000}, {0x3f21a000}, {0x3f21c000}, {0x3f21e000}, + {0x3f220000}, {0x3f222000}, {0x3f224000}, {0x3f226000}, + {0x3f228000}, {0x3f22a000}, {0x3f22c000}, {0x3f22e000}, + {0x3f230000}, {0x3f232000}, {0x3f234000}, {0x3f236000}, + {0x3f238000}, {0x3f23a000}, {0x3f23c000}, {0x3f23e000}, + {0x3f240000}, {0x3f242000}, {0x3f244000}, {0x3f246000}, + {0x3f248000}, {0x3f24a000}, {0x3f24c000}, {0x3f24e000}, + {0x3f250000}, {0x3f252000}, {0x3f254000}, {0x3f256000}, + {0x3f258000}, {0x3f25a000}, {0x3f25c000}, {0x3f25e000}, + {0x3f260000}, {0x3f262000}, {0x3f264000}, {0x3f266000}, + {0x3f268000}, {0x3f26a000}, {0x3f26c000}, {0x3f26e000}, + {0x3f270000}, {0x3f272000}, {0x3f274000}, {0x3f276000}, + {0x3f278000}, {0x3f27a000}, {0x3f27c000}, {0x3f27e000}, + {0x3f280000}, {0x3f282000}, {0x3f284000}, {0x3f286000}, + {0x3f288000}, {0x3f28a000}, {0x3f28c000}, {0x3f28e000}, + {0x3f290000}, {0x3f292000}, {0x3f294000}, {0x3f296000}, + {0x3f298000}, {0x3f29a000}, {0x3f29c000}, {0x3f29e000}, + {0x3f2a0000}, {0x3f2a2000}, {0x3f2a4000}, {0x3f2a6000}, + {0x3f2a8000}, {0x3f2aa000}, {0x3f2ac000}, {0x3f2ae000}, + {0x3f2b0000}, {0x3f2b2000}, {0x3f2b4000}, {0x3f2b6000}, + {0x3f2b8000}, {0x3f2ba000}, {0x3f2bc000}, {0x3f2be000}, + {0x3f2c0000}, {0x3f2c2000}, {0x3f2c4000}, {0x3f2c6000}, + {0x3f2c8000}, {0x3f2ca000}, {0x3f2cc000}, {0x3f2ce000}, + {0x3f2d0000}, {0x3f2d2000}, {0x3f2d4000}, {0x3f2d6000}, + {0x3f2d8000}, {0x3f2da000}, {0x3f2dc000}, {0x3f2de000}, + {0x3f2e0000}, {0x3f2e2000}, {0x3f2e4000}, {0x3f2e6000}, + {0x3f2e8000}, {0x3f2ea000}, {0x3f2ec000}, {0x3f2ee000}, + {0x3f2f0000}, {0x3f2f2000}, {0x3f2f4000}, {0x3f2f6000}, + {0x3f2f8000}, {0x3f2fa000}, {0x3f2fc000}, {0x3f2fe000}, + {0x3f300000}, {0x3f302000}, {0x3f304000}, {0x3f306000}, + {0x3f308000}, {0x3f30a000}, {0x3f30c000}, {0x3f30e000}, + {0x3f310000}, {0x3f312000}, {0x3f314000}, {0x3f316000}, + {0x3f318000}, {0x3f31a000}, {0x3f31c000}, {0x3f31e000}, + {0x3f320000}, {0x3f322000}, {0x3f324000}, {0x3f326000}, + {0x3f328000}, {0x3f32a000}, {0x3f32c000}, {0x3f32e000}, + {0x3f330000}, {0x3f332000}, {0x3f334000}, {0x3f336000}, + {0x3f338000}, {0x3f33a000}, {0x3f33c000}, {0x3f33e000}, + {0x3f340000}, {0x3f342000}, {0x3f344000}, {0x3f346000}, + {0x3f348000}, {0x3f34a000}, {0x3f34c000}, {0x3f34e000}, + {0x3f350000}, {0x3f352000}, {0x3f354000}, {0x3f356000}, + {0x3f358000}, {0x3f35a000}, {0x3f35c000}, {0x3f35e000}, + {0x3f360000}, {0x3f362000}, {0x3f364000}, {0x3f366000}, + {0x3f368000}, {0x3f36a000}, {0x3f36c000}, {0x3f36e000}, + {0x3f370000}, {0x3f372000}, {0x3f374000}, {0x3f376000}, + {0x3f378000}, {0x3f37a000}, {0x3f37c000}, {0x3f37e000}, + {0x3f380000}, {0x3f382000}, {0x3f384000}, {0x3f386000}, + {0x3f388000}, {0x3f38a000}, {0x3f38c000}, {0x3f38e000}, + {0x3f390000}, {0x3f392000}, {0x3f394000}, {0x3f396000}, + {0x3f398000}, {0x3f39a000}, {0x3f39c000}, {0x3f39e000}, + {0x3f3a0000}, {0x3f3a2000}, {0x3f3a4000}, {0x3f3a6000}, + {0x3f3a8000}, {0x3f3aa000}, {0x3f3ac000}, {0x3f3ae000}, + {0x3f3b0000}, {0x3f3b2000}, {0x3f3b4000}, {0x3f3b6000}, + {0x3f3b8000}, {0x3f3ba000}, {0x3f3bc000}, {0x3f3be000}, + {0x3f3c0000}, {0x3f3c2000}, {0x3f3c4000}, {0x3f3c6000}, + {0x3f3c8000}, {0x3f3ca000}, {0x3f3cc000}, {0x3f3ce000}, + {0x3f3d0000}, {0x3f3d2000}, {0x3f3d4000}, {0x3f3d6000}, + {0x3f3d8000}, {0x3f3da000}, {0x3f3dc000}, {0x3f3de000}, + {0x3f3e0000}, {0x3f3e2000}, {0x3f3e4000}, {0x3f3e6000}, + {0x3f3e8000}, {0x3f3ea000}, {0x3f3ec000}, {0x3f3ee000}, + {0x3f3f0000}, {0x3f3f2000}, {0x3f3f4000}, {0x3f3f6000}, + {0x3f3f8000}, {0x3f3fa000}, {0x3f3fc000}, {0x3f3fe000}, + {0x3f400000}, {0x3f402000}, {0x3f404000}, {0x3f406000}, + {0x3f408000}, {0x3f40a000}, {0x3f40c000}, {0x3f40e000}, + {0x3f410000}, {0x3f412000}, {0x3f414000}, {0x3f416000}, + {0x3f418000}, {0x3f41a000}, {0x3f41c000}, {0x3f41e000}, + {0x3f420000}, {0x3f422000}, {0x3f424000}, {0x3f426000}, + {0x3f428000}, {0x3f42a000}, {0x3f42c000}, {0x3f42e000}, + {0x3f430000}, {0x3f432000}, {0x3f434000}, {0x3f436000}, + {0x3f438000}, {0x3f43a000}, {0x3f43c000}, {0x3f43e000}, + {0x3f440000}, {0x3f442000}, {0x3f444000}, {0x3f446000}, + {0x3f448000}, {0x3f44a000}, {0x3f44c000}, {0x3f44e000}, + {0x3f450000}, {0x3f452000}, {0x3f454000}, {0x3f456000}, + {0x3f458000}, {0x3f45a000}, {0x3f45c000}, {0x3f45e000}, + {0x3f460000}, {0x3f462000}, {0x3f464000}, {0x3f466000}, + {0x3f468000}, {0x3f46a000}, {0x3f46c000}, {0x3f46e000}, + {0x3f470000}, {0x3f472000}, {0x3f474000}, {0x3f476000}, + {0x3f478000}, {0x3f47a000}, {0x3f47c000}, {0x3f47e000}, + {0x3f480000}, {0x3f482000}, {0x3f484000}, {0x3f486000}, + {0x3f488000}, {0x3f48a000}, {0x3f48c000}, {0x3f48e000}, + {0x3f490000}, {0x3f492000}, {0x3f494000}, {0x3f496000}, + {0x3f498000}, {0x3f49a000}, {0x3f49c000}, {0x3f49e000}, + {0x3f4a0000}, {0x3f4a2000}, {0x3f4a4000}, {0x3f4a6000}, + {0x3f4a8000}, {0x3f4aa000}, {0x3f4ac000}, {0x3f4ae000}, + {0x3f4b0000}, {0x3f4b2000}, {0x3f4b4000}, {0x3f4b6000}, + {0x3f4b8000}, {0x3f4ba000}, {0x3f4bc000}, {0x3f4be000}, + {0x3f4c0000}, {0x3f4c2000}, {0x3f4c4000}, {0x3f4c6000}, + {0x3f4c8000}, {0x3f4ca000}, {0x3f4cc000}, {0x3f4ce000}, + {0x3f4d0000}, {0x3f4d2000}, {0x3f4d4000}, {0x3f4d6000}, + {0x3f4d8000}, {0x3f4da000}, {0x3f4dc000}, {0x3f4de000}, + {0x3f4e0000}, {0x3f4e2000}, {0x3f4e4000}, {0x3f4e6000}, + {0x3f4e8000}, {0x3f4ea000}, {0x3f4ec000}, {0x3f4ee000}, + {0x3f4f0000}, {0x3f4f2000}, {0x3f4f4000}, {0x3f4f6000}, + {0x3f4f8000}, {0x3f4fa000}, {0x3f4fc000}, {0x3f4fe000}, + {0x3f500000}, {0x3f502000}, {0x3f504000}, {0x3f506000}, + {0x3f508000}, {0x3f50a000}, {0x3f50c000}, {0x3f50e000}, + {0x3f510000}, {0x3f512000}, {0x3f514000}, {0x3f516000}, + {0x3f518000}, {0x3f51a000}, {0x3f51c000}, {0x3f51e000}, + {0x3f520000}, {0x3f522000}, {0x3f524000}, {0x3f526000}, + {0x3f528000}, {0x3f52a000}, {0x3f52c000}, {0x3f52e000}, + {0x3f530000}, {0x3f532000}, {0x3f534000}, {0x3f536000}, + {0x3f538000}, {0x3f53a000}, {0x3f53c000}, {0x3f53e000}, + {0x3f540000}, {0x3f542000}, {0x3f544000}, {0x3f546000}, + {0x3f548000}, {0x3f54a000}, {0x3f54c000}, {0x3f54e000}, + {0x3f550000}, {0x3f552000}, {0x3f554000}, {0x3f556000}, + {0x3f558000}, {0x3f55a000}, {0x3f55c000}, {0x3f55e000}, + {0x3f560000}, {0x3f562000}, {0x3f564000}, {0x3f566000}, + {0x3f568000}, {0x3f56a000}, {0x3f56c000}, {0x3f56e000}, + {0x3f570000}, {0x3f572000}, {0x3f574000}, {0x3f576000}, + {0x3f578000}, {0x3f57a000}, {0x3f57c000}, {0x3f57e000}, + {0x3f580000}, {0x3f582000}, {0x3f584000}, {0x3f586000}, + {0x3f588000}, {0x3f58a000}, {0x3f58c000}, {0x3f58e000}, + {0x3f590000}, {0x3f592000}, {0x3f594000}, {0x3f596000}, + {0x3f598000}, {0x3f59a000}, {0x3f59c000}, {0x3f59e000}, + {0x3f5a0000}, {0x3f5a2000}, {0x3f5a4000}, {0x3f5a6000}, + {0x3f5a8000}, {0x3f5aa000}, {0x3f5ac000}, {0x3f5ae000}, + {0x3f5b0000}, {0x3f5b2000}, {0x3f5b4000}, {0x3f5b6000}, + {0x3f5b8000}, {0x3f5ba000}, {0x3f5bc000}, {0x3f5be000}, + {0x3f5c0000}, {0x3f5c2000}, {0x3f5c4000}, {0x3f5c6000}, + {0x3f5c8000}, {0x3f5ca000}, {0x3f5cc000}, {0x3f5ce000}, + {0x3f5d0000}, {0x3f5d2000}, {0x3f5d4000}, {0x3f5d6000}, + {0x3f5d8000}, {0x3f5da000}, {0x3f5dc000}, {0x3f5de000}, + {0x3f5e0000}, {0x3f5e2000}, {0x3f5e4000}, {0x3f5e6000}, + {0x3f5e8000}, {0x3f5ea000}, {0x3f5ec000}, {0x3f5ee000}, + {0x3f5f0000}, {0x3f5f2000}, {0x3f5f4000}, {0x3f5f6000}, + {0x3f5f8000}, {0x3f5fa000}, {0x3f5fc000}, {0x3f5fe000}, + {0x3f600000}, {0x3f602000}, {0x3f604000}, {0x3f606000}, + {0x3f608000}, {0x3f60a000}, {0x3f60c000}, {0x3f60e000}, + {0x3f610000}, {0x3f612000}, {0x3f614000}, {0x3f616000}, + {0x3f618000}, {0x3f61a000}, {0x3f61c000}, {0x3f61e000}, + {0x3f620000}, {0x3f622000}, {0x3f624000}, {0x3f626000}, + {0x3f628000}, {0x3f62a000}, {0x3f62c000}, {0x3f62e000}, + {0x3f630000}, {0x3f632000}, {0x3f634000}, {0x3f636000}, + {0x3f638000}, {0x3f63a000}, {0x3f63c000}, {0x3f63e000}, + {0x3f640000}, {0x3f642000}, {0x3f644000}, {0x3f646000}, + {0x3f648000}, {0x3f64a000}, {0x3f64c000}, {0x3f64e000}, + {0x3f650000}, {0x3f652000}, {0x3f654000}, {0x3f656000}, + {0x3f658000}, {0x3f65a000}, {0x3f65c000}, {0x3f65e000}, + {0x3f660000}, {0x3f662000}, {0x3f664000}, {0x3f666000}, + {0x3f668000}, {0x3f66a000}, {0x3f66c000}, {0x3f66e000}, + {0x3f670000}, {0x3f672000}, {0x3f674000}, {0x3f676000}, + {0x3f678000}, {0x3f67a000}, {0x3f67c000}, {0x3f67e000}, + {0x3f680000}, {0x3f682000}, {0x3f684000}, {0x3f686000}, + {0x3f688000}, {0x3f68a000}, {0x3f68c000}, {0x3f68e000}, + {0x3f690000}, {0x3f692000}, {0x3f694000}, {0x3f696000}, + {0x3f698000}, {0x3f69a000}, {0x3f69c000}, {0x3f69e000}, + {0x3f6a0000}, {0x3f6a2000}, {0x3f6a4000}, {0x3f6a6000}, + {0x3f6a8000}, {0x3f6aa000}, {0x3f6ac000}, {0x3f6ae000}, + {0x3f6b0000}, {0x3f6b2000}, {0x3f6b4000}, {0x3f6b6000}, + {0x3f6b8000}, {0x3f6ba000}, {0x3f6bc000}, {0x3f6be000}, + {0x3f6c0000}, {0x3f6c2000}, {0x3f6c4000}, {0x3f6c6000}, + {0x3f6c8000}, {0x3f6ca000}, {0x3f6cc000}, {0x3f6ce000}, + {0x3f6d0000}, {0x3f6d2000}, {0x3f6d4000}, {0x3f6d6000}, + {0x3f6d8000}, {0x3f6da000}, {0x3f6dc000}, {0x3f6de000}, + {0x3f6e0000}, {0x3f6e2000}, {0x3f6e4000}, {0x3f6e6000}, + {0x3f6e8000}, {0x3f6ea000}, {0x3f6ec000}, {0x3f6ee000}, + {0x3f6f0000}, {0x3f6f2000}, {0x3f6f4000}, {0x3f6f6000}, + {0x3f6f8000}, {0x3f6fa000}, {0x3f6fc000}, {0x3f6fe000}, + {0x3f700000}, {0x3f702000}, {0x3f704000}, {0x3f706000}, + {0x3f708000}, {0x3f70a000}, {0x3f70c000}, {0x3f70e000}, + {0x3f710000}, {0x3f712000}, {0x3f714000}, {0x3f716000}, + {0x3f718000}, {0x3f71a000}, {0x3f71c000}, {0x3f71e000}, + {0x3f720000}, {0x3f722000}, {0x3f724000}, {0x3f726000}, + {0x3f728000}, {0x3f72a000}, {0x3f72c000}, {0x3f72e000}, + {0x3f730000}, {0x3f732000}, {0x3f734000}, {0x3f736000}, + {0x3f738000}, {0x3f73a000}, {0x3f73c000}, {0x3f73e000}, + {0x3f740000}, {0x3f742000}, {0x3f744000}, {0x3f746000}, + {0x3f748000}, {0x3f74a000}, {0x3f74c000}, {0x3f74e000}, + {0x3f750000}, {0x3f752000}, {0x3f754000}, {0x3f756000}, + {0x3f758000}, {0x3f75a000}, {0x3f75c000}, {0x3f75e000}, + {0x3f760000}, {0x3f762000}, {0x3f764000}, {0x3f766000}, + {0x3f768000}, {0x3f76a000}, {0x3f76c000}, {0x3f76e000}, + {0x3f770000}, {0x3f772000}, {0x3f774000}, {0x3f776000}, + {0x3f778000}, {0x3f77a000}, {0x3f77c000}, {0x3f77e000}, + {0x3f780000}, {0x3f782000}, {0x3f784000}, {0x3f786000}, + {0x3f788000}, {0x3f78a000}, {0x3f78c000}, {0x3f78e000}, + {0x3f790000}, {0x3f792000}, {0x3f794000}, {0x3f796000}, + {0x3f798000}, {0x3f79a000}, {0x3f79c000}, {0x3f79e000}, + {0x3f7a0000}, {0x3f7a2000}, {0x3f7a4000}, {0x3f7a6000}, + {0x3f7a8000}, {0x3f7aa000}, {0x3f7ac000}, {0x3f7ae000}, + {0x3f7b0000}, {0x3f7b2000}, {0x3f7b4000}, {0x3f7b6000}, + {0x3f7b8000}, {0x3f7ba000}, {0x3f7bc000}, {0x3f7be000}, + {0x3f7c0000}, {0x3f7c2000}, {0x3f7c4000}, {0x3f7c6000}, + {0x3f7c8000}, {0x3f7ca000}, {0x3f7cc000}, {0x3f7ce000}, + {0x3f7d0000}, {0x3f7d2000}, {0x3f7d4000}, {0x3f7d6000}, + {0x3f7d8000}, {0x3f7da000}, {0x3f7dc000}, {0x3f7de000}, + {0x3f7e0000}, {0x3f7e2000}, {0x3f7e4000}, {0x3f7e6000}, + {0x3f7e8000}, {0x3f7ea000}, {0x3f7ec000}, {0x3f7ee000}, + {0x3f7f0000}, {0x3f7f2000}, {0x3f7f4000}, {0x3f7f6000}, + {0x3f7f8000}, {0x3f7fa000}, {0x3f7fc000}, {0x3f7fe000}, + {0x3f800000}, {0x3f802000}, {0x3f804000}, {0x3f806000}, + {0x3f808000}, {0x3f80a000}, {0x3f80c000}, {0x3f80e000}, + {0x3f810000}, {0x3f812000}, {0x3f814000}, {0x3f816000}, + {0x3f818000}, {0x3f81a000}, {0x3f81c000}, {0x3f81e000}, + {0x3f820000}, {0x3f822000}, {0x3f824000}, {0x3f826000}, + {0x3f828000}, {0x3f82a000}, {0x3f82c000}, {0x3f82e000}, + {0x3f830000}, {0x3f832000}, {0x3f834000}, {0x3f836000}, + {0x3f838000}, {0x3f83a000}, {0x3f83c000}, {0x3f83e000}, + {0x3f840000}, {0x3f842000}, {0x3f844000}, {0x3f846000}, + {0x3f848000}, {0x3f84a000}, {0x3f84c000}, {0x3f84e000}, + {0x3f850000}, {0x3f852000}, {0x3f854000}, {0x3f856000}, + {0x3f858000}, {0x3f85a000}, {0x3f85c000}, {0x3f85e000}, + {0x3f860000}, {0x3f862000}, {0x3f864000}, {0x3f866000}, + {0x3f868000}, {0x3f86a000}, {0x3f86c000}, {0x3f86e000}, + {0x3f870000}, {0x3f872000}, {0x3f874000}, {0x3f876000}, + {0x3f878000}, {0x3f87a000}, {0x3f87c000}, {0x3f87e000}, + {0x3f880000}, {0x3f882000}, {0x3f884000}, {0x3f886000}, + {0x3f888000}, {0x3f88a000}, {0x3f88c000}, {0x3f88e000}, + {0x3f890000}, {0x3f892000}, {0x3f894000}, {0x3f896000}, + {0x3f898000}, {0x3f89a000}, {0x3f89c000}, {0x3f89e000}, + {0x3f8a0000}, {0x3f8a2000}, {0x3f8a4000}, {0x3f8a6000}, + {0x3f8a8000}, {0x3f8aa000}, {0x3f8ac000}, {0x3f8ae000}, + {0x3f8b0000}, {0x3f8b2000}, {0x3f8b4000}, {0x3f8b6000}, + {0x3f8b8000}, {0x3f8ba000}, {0x3f8bc000}, {0x3f8be000}, + {0x3f8c0000}, {0x3f8c2000}, {0x3f8c4000}, {0x3f8c6000}, + {0x3f8c8000}, {0x3f8ca000}, {0x3f8cc000}, {0x3f8ce000}, + {0x3f8d0000}, {0x3f8d2000}, {0x3f8d4000}, {0x3f8d6000}, + {0x3f8d8000}, {0x3f8da000}, {0x3f8dc000}, {0x3f8de000}, + {0x3f8e0000}, {0x3f8e2000}, {0x3f8e4000}, {0x3f8e6000}, + {0x3f8e8000}, {0x3f8ea000}, {0x3f8ec000}, {0x3f8ee000}, + {0x3f8f0000}, {0x3f8f2000}, {0x3f8f4000}, {0x3f8f6000}, + {0x3f8f8000}, {0x3f8fa000}, {0x3f8fc000}, {0x3f8fe000}, + {0x3f900000}, {0x3f902000}, {0x3f904000}, {0x3f906000}, + {0x3f908000}, {0x3f90a000}, {0x3f90c000}, {0x3f90e000}, + {0x3f910000}, {0x3f912000}, {0x3f914000}, {0x3f916000}, + {0x3f918000}, {0x3f91a000}, {0x3f91c000}, {0x3f91e000}, + {0x3f920000}, {0x3f922000}, {0x3f924000}, {0x3f926000}, + {0x3f928000}, {0x3f92a000}, {0x3f92c000}, {0x3f92e000}, + {0x3f930000}, {0x3f932000}, {0x3f934000}, {0x3f936000}, + {0x3f938000}, {0x3f93a000}, {0x3f93c000}, {0x3f93e000}, + {0x3f940000}, {0x3f942000}, {0x3f944000}, {0x3f946000}, + {0x3f948000}, {0x3f94a000}, {0x3f94c000}, {0x3f94e000}, + {0x3f950000}, {0x3f952000}, {0x3f954000}, {0x3f956000}, + {0x3f958000}, {0x3f95a000}, {0x3f95c000}, {0x3f95e000}, + {0x3f960000}, {0x3f962000}, {0x3f964000}, {0x3f966000}, + {0x3f968000}, {0x3f96a000}, {0x3f96c000}, {0x3f96e000}, + {0x3f970000}, {0x3f972000}, {0x3f974000}, {0x3f976000}, + {0x3f978000}, {0x3f97a000}, {0x3f97c000}, {0x3f97e000}, + {0x3f980000}, {0x3f982000}, {0x3f984000}, {0x3f986000}, + {0x3f988000}, {0x3f98a000}, {0x3f98c000}, {0x3f98e000}, + {0x3f990000}, {0x3f992000}, {0x3f994000}, {0x3f996000}, + {0x3f998000}, {0x3f99a000}, {0x3f99c000}, {0x3f99e000}, + {0x3f9a0000}, {0x3f9a2000}, {0x3f9a4000}, {0x3f9a6000}, + {0x3f9a8000}, {0x3f9aa000}, {0x3f9ac000}, {0x3f9ae000}, + {0x3f9b0000}, {0x3f9b2000}, {0x3f9b4000}, {0x3f9b6000}, + {0x3f9b8000}, {0x3f9ba000}, {0x3f9bc000}, {0x3f9be000}, + {0x3f9c0000}, {0x3f9c2000}, {0x3f9c4000}, {0x3f9c6000}, + {0x3f9c8000}, {0x3f9ca000}, {0x3f9cc000}, {0x3f9ce000}, + {0x3f9d0000}, {0x3f9d2000}, {0x3f9d4000}, {0x3f9d6000}, + {0x3f9d8000}, {0x3f9da000}, {0x3f9dc000}, {0x3f9de000}, + {0x3f9e0000}, {0x3f9e2000}, {0x3f9e4000}, {0x3f9e6000}, + {0x3f9e8000}, {0x3f9ea000}, {0x3f9ec000}, {0x3f9ee000}, + {0x3f9f0000}, {0x3f9f2000}, {0x3f9f4000}, {0x3f9f6000}, + {0x3f9f8000}, {0x3f9fa000}, {0x3f9fc000}, {0x3f9fe000}, + {0x3fa00000}, {0x3fa02000}, {0x3fa04000}, {0x3fa06000}, + {0x3fa08000}, {0x3fa0a000}, {0x3fa0c000}, {0x3fa0e000}, + {0x3fa10000}, {0x3fa12000}, {0x3fa14000}, {0x3fa16000}, + {0x3fa18000}, {0x3fa1a000}, {0x3fa1c000}, {0x3fa1e000}, + {0x3fa20000}, {0x3fa22000}, {0x3fa24000}, {0x3fa26000}, + {0x3fa28000}, {0x3fa2a000}, {0x3fa2c000}, {0x3fa2e000}, + {0x3fa30000}, {0x3fa32000}, {0x3fa34000}, {0x3fa36000}, + {0x3fa38000}, {0x3fa3a000}, {0x3fa3c000}, {0x3fa3e000}, + {0x3fa40000}, {0x3fa42000}, {0x3fa44000}, {0x3fa46000}, + {0x3fa48000}, {0x3fa4a000}, {0x3fa4c000}, {0x3fa4e000}, + {0x3fa50000}, {0x3fa52000}, {0x3fa54000}, {0x3fa56000}, + {0x3fa58000}, {0x3fa5a000}, {0x3fa5c000}, {0x3fa5e000}, + {0x3fa60000}, {0x3fa62000}, {0x3fa64000}, {0x3fa66000}, + {0x3fa68000}, {0x3fa6a000}, {0x3fa6c000}, {0x3fa6e000}, + {0x3fa70000}, {0x3fa72000}, {0x3fa74000}, {0x3fa76000}, + {0x3fa78000}, {0x3fa7a000}, {0x3fa7c000}, {0x3fa7e000}, + {0x3fa80000}, {0x3fa82000}, {0x3fa84000}, {0x3fa86000}, + {0x3fa88000}, {0x3fa8a000}, {0x3fa8c000}, {0x3fa8e000}, + {0x3fa90000}, {0x3fa92000}, {0x3fa94000}, {0x3fa96000}, + {0x3fa98000}, {0x3fa9a000}, {0x3fa9c000}, {0x3fa9e000}, + {0x3faa0000}, {0x3faa2000}, {0x3faa4000}, {0x3faa6000}, + {0x3faa8000}, {0x3faaa000}, {0x3faac000}, {0x3faae000}, + {0x3fab0000}, {0x3fab2000}, {0x3fab4000}, {0x3fab6000}, + {0x3fab8000}, {0x3faba000}, {0x3fabc000}, {0x3fabe000}, + {0x3fac0000}, {0x3fac2000}, {0x3fac4000}, {0x3fac6000}, + {0x3fac8000}, {0x3faca000}, {0x3facc000}, {0x3face000}, + {0x3fad0000}, {0x3fad2000}, {0x3fad4000}, {0x3fad6000}, + {0x3fad8000}, {0x3fada000}, {0x3fadc000}, {0x3fade000}, + {0x3fae0000}, {0x3fae2000}, {0x3fae4000}, {0x3fae6000}, + {0x3fae8000}, {0x3faea000}, {0x3faec000}, {0x3faee000}, + {0x3faf0000}, {0x3faf2000}, {0x3faf4000}, {0x3faf6000}, + {0x3faf8000}, {0x3fafa000}, {0x3fafc000}, {0x3fafe000}, + {0x3fb00000}, {0x3fb02000}, {0x3fb04000}, {0x3fb06000}, + {0x3fb08000}, {0x3fb0a000}, {0x3fb0c000}, {0x3fb0e000}, + {0x3fb10000}, {0x3fb12000}, {0x3fb14000}, {0x3fb16000}, + {0x3fb18000}, {0x3fb1a000}, {0x3fb1c000}, {0x3fb1e000}, + {0x3fb20000}, {0x3fb22000}, {0x3fb24000}, {0x3fb26000}, + {0x3fb28000}, {0x3fb2a000}, {0x3fb2c000}, {0x3fb2e000}, + {0x3fb30000}, {0x3fb32000}, {0x3fb34000}, {0x3fb36000}, + {0x3fb38000}, {0x3fb3a000}, {0x3fb3c000}, {0x3fb3e000}, + {0x3fb40000}, {0x3fb42000}, {0x3fb44000}, {0x3fb46000}, + {0x3fb48000}, {0x3fb4a000}, {0x3fb4c000}, {0x3fb4e000}, + {0x3fb50000}, {0x3fb52000}, {0x3fb54000}, {0x3fb56000}, + {0x3fb58000}, {0x3fb5a000}, {0x3fb5c000}, {0x3fb5e000}, + {0x3fb60000}, {0x3fb62000}, {0x3fb64000}, {0x3fb66000}, + {0x3fb68000}, {0x3fb6a000}, {0x3fb6c000}, {0x3fb6e000}, + {0x3fb70000}, {0x3fb72000}, {0x3fb74000}, {0x3fb76000}, + {0x3fb78000}, {0x3fb7a000}, {0x3fb7c000}, {0x3fb7e000}, + {0x3fb80000}, {0x3fb82000}, {0x3fb84000}, {0x3fb86000}, + {0x3fb88000}, {0x3fb8a000}, {0x3fb8c000}, {0x3fb8e000}, + {0x3fb90000}, {0x3fb92000}, {0x3fb94000}, {0x3fb96000}, + {0x3fb98000}, {0x3fb9a000}, {0x3fb9c000}, {0x3fb9e000}, + {0x3fba0000}, {0x3fba2000}, {0x3fba4000}, {0x3fba6000}, + {0x3fba8000}, {0x3fbaa000}, {0x3fbac000}, {0x3fbae000}, + {0x3fbb0000}, {0x3fbb2000}, {0x3fbb4000}, {0x3fbb6000}, + {0x3fbb8000}, {0x3fbba000}, {0x3fbbc000}, {0x3fbbe000}, + {0x3fbc0000}, {0x3fbc2000}, {0x3fbc4000}, {0x3fbc6000}, + {0x3fbc8000}, {0x3fbca000}, {0x3fbcc000}, {0x3fbce000}, + {0x3fbd0000}, {0x3fbd2000}, {0x3fbd4000}, {0x3fbd6000}, + {0x3fbd8000}, {0x3fbda000}, {0x3fbdc000}, {0x3fbde000}, + {0x3fbe0000}, {0x3fbe2000}, {0x3fbe4000}, {0x3fbe6000}, + {0x3fbe8000}, {0x3fbea000}, {0x3fbec000}, {0x3fbee000}, + {0x3fbf0000}, {0x3fbf2000}, {0x3fbf4000}, {0x3fbf6000}, + {0x3fbf8000}, {0x3fbfa000}, {0x3fbfc000}, {0x3fbfe000}, + {0x3fc00000}, {0x3fc02000}, {0x3fc04000}, {0x3fc06000}, + {0x3fc08000}, {0x3fc0a000}, {0x3fc0c000}, {0x3fc0e000}, + {0x3fc10000}, {0x3fc12000}, {0x3fc14000}, {0x3fc16000}, + {0x3fc18000}, {0x3fc1a000}, {0x3fc1c000}, {0x3fc1e000}, + {0x3fc20000}, {0x3fc22000}, {0x3fc24000}, {0x3fc26000}, + {0x3fc28000}, {0x3fc2a000}, {0x3fc2c000}, {0x3fc2e000}, + {0x3fc30000}, {0x3fc32000}, {0x3fc34000}, {0x3fc36000}, + {0x3fc38000}, {0x3fc3a000}, {0x3fc3c000}, {0x3fc3e000}, + {0x3fc40000}, {0x3fc42000}, {0x3fc44000}, {0x3fc46000}, + {0x3fc48000}, {0x3fc4a000}, {0x3fc4c000}, {0x3fc4e000}, + {0x3fc50000}, {0x3fc52000}, {0x3fc54000}, {0x3fc56000}, + {0x3fc58000}, {0x3fc5a000}, {0x3fc5c000}, {0x3fc5e000}, + {0x3fc60000}, {0x3fc62000}, {0x3fc64000}, {0x3fc66000}, + {0x3fc68000}, {0x3fc6a000}, {0x3fc6c000}, {0x3fc6e000}, + {0x3fc70000}, {0x3fc72000}, {0x3fc74000}, {0x3fc76000}, + {0x3fc78000}, {0x3fc7a000}, {0x3fc7c000}, {0x3fc7e000}, + {0x3fc80000}, {0x3fc82000}, {0x3fc84000}, {0x3fc86000}, + {0x3fc88000}, {0x3fc8a000}, {0x3fc8c000}, {0x3fc8e000}, + {0x3fc90000}, {0x3fc92000}, {0x3fc94000}, {0x3fc96000}, + {0x3fc98000}, {0x3fc9a000}, {0x3fc9c000}, {0x3fc9e000}, + {0x3fca0000}, {0x3fca2000}, {0x3fca4000}, {0x3fca6000}, + {0x3fca8000}, {0x3fcaa000}, {0x3fcac000}, {0x3fcae000}, + {0x3fcb0000}, {0x3fcb2000}, {0x3fcb4000}, {0x3fcb6000}, + {0x3fcb8000}, {0x3fcba000}, {0x3fcbc000}, {0x3fcbe000}, + {0x3fcc0000}, {0x3fcc2000}, {0x3fcc4000}, {0x3fcc6000}, + {0x3fcc8000}, {0x3fcca000}, {0x3fccc000}, {0x3fcce000}, + {0x3fcd0000}, {0x3fcd2000}, {0x3fcd4000}, {0x3fcd6000}, + {0x3fcd8000}, {0x3fcda000}, {0x3fcdc000}, {0x3fcde000}, + {0x3fce0000}, {0x3fce2000}, {0x3fce4000}, {0x3fce6000}, + {0x3fce8000}, {0x3fcea000}, {0x3fcec000}, {0x3fcee000}, + {0x3fcf0000}, {0x3fcf2000}, {0x3fcf4000}, {0x3fcf6000}, + {0x3fcf8000}, {0x3fcfa000}, {0x3fcfc000}, {0x3fcfe000}, + {0x3fd00000}, {0x3fd02000}, {0x3fd04000}, {0x3fd06000}, + {0x3fd08000}, {0x3fd0a000}, {0x3fd0c000}, {0x3fd0e000}, + {0x3fd10000}, {0x3fd12000}, {0x3fd14000}, {0x3fd16000}, + {0x3fd18000}, {0x3fd1a000}, {0x3fd1c000}, {0x3fd1e000}, + {0x3fd20000}, {0x3fd22000}, {0x3fd24000}, {0x3fd26000}, + {0x3fd28000}, {0x3fd2a000}, {0x3fd2c000}, {0x3fd2e000}, + {0x3fd30000}, {0x3fd32000}, {0x3fd34000}, {0x3fd36000}, + {0x3fd38000}, {0x3fd3a000}, {0x3fd3c000}, {0x3fd3e000}, + {0x3fd40000}, {0x3fd42000}, {0x3fd44000}, {0x3fd46000}, + {0x3fd48000}, {0x3fd4a000}, {0x3fd4c000}, {0x3fd4e000}, + {0x3fd50000}, {0x3fd52000}, {0x3fd54000}, {0x3fd56000}, + {0x3fd58000}, {0x3fd5a000}, {0x3fd5c000}, {0x3fd5e000}, + {0x3fd60000}, {0x3fd62000}, {0x3fd64000}, {0x3fd66000}, + {0x3fd68000}, {0x3fd6a000}, {0x3fd6c000}, {0x3fd6e000}, + {0x3fd70000}, {0x3fd72000}, {0x3fd74000}, {0x3fd76000}, + {0x3fd78000}, {0x3fd7a000}, {0x3fd7c000}, {0x3fd7e000}, + {0x3fd80000}, {0x3fd82000}, {0x3fd84000}, {0x3fd86000}, + {0x3fd88000}, {0x3fd8a000}, {0x3fd8c000}, {0x3fd8e000}, + {0x3fd90000}, {0x3fd92000}, {0x3fd94000}, {0x3fd96000}, + {0x3fd98000}, {0x3fd9a000}, {0x3fd9c000}, {0x3fd9e000}, + {0x3fda0000}, {0x3fda2000}, {0x3fda4000}, {0x3fda6000}, + {0x3fda8000}, {0x3fdaa000}, {0x3fdac000}, {0x3fdae000}, + {0x3fdb0000}, {0x3fdb2000}, {0x3fdb4000}, {0x3fdb6000}, + {0x3fdb8000}, {0x3fdba000}, {0x3fdbc000}, {0x3fdbe000}, + {0x3fdc0000}, {0x3fdc2000}, {0x3fdc4000}, {0x3fdc6000}, + {0x3fdc8000}, {0x3fdca000}, {0x3fdcc000}, {0x3fdce000}, + {0x3fdd0000}, {0x3fdd2000}, {0x3fdd4000}, {0x3fdd6000}, + {0x3fdd8000}, {0x3fdda000}, {0x3fddc000}, {0x3fdde000}, + {0x3fde0000}, {0x3fde2000}, {0x3fde4000}, {0x3fde6000}, + {0x3fde8000}, {0x3fdea000}, {0x3fdec000}, {0x3fdee000}, + {0x3fdf0000}, {0x3fdf2000}, {0x3fdf4000}, {0x3fdf6000}, + {0x3fdf8000}, {0x3fdfa000}, {0x3fdfc000}, {0x3fdfe000}, + {0x3fe00000}, {0x3fe02000}, {0x3fe04000}, {0x3fe06000}, + {0x3fe08000}, {0x3fe0a000}, {0x3fe0c000}, {0x3fe0e000}, + {0x3fe10000}, {0x3fe12000}, {0x3fe14000}, {0x3fe16000}, + {0x3fe18000}, {0x3fe1a000}, {0x3fe1c000}, {0x3fe1e000}, + {0x3fe20000}, {0x3fe22000}, {0x3fe24000}, {0x3fe26000}, + {0x3fe28000}, {0x3fe2a000}, {0x3fe2c000}, {0x3fe2e000}, + {0x3fe30000}, {0x3fe32000}, {0x3fe34000}, {0x3fe36000}, + {0x3fe38000}, {0x3fe3a000}, {0x3fe3c000}, {0x3fe3e000}, + {0x3fe40000}, {0x3fe42000}, {0x3fe44000}, {0x3fe46000}, + {0x3fe48000}, {0x3fe4a000}, {0x3fe4c000}, {0x3fe4e000}, + {0x3fe50000}, {0x3fe52000}, {0x3fe54000}, {0x3fe56000}, + {0x3fe58000}, {0x3fe5a000}, {0x3fe5c000}, {0x3fe5e000}, + {0x3fe60000}, {0x3fe62000}, {0x3fe64000}, {0x3fe66000}, + {0x3fe68000}, {0x3fe6a000}, {0x3fe6c000}, {0x3fe6e000}, + {0x3fe70000}, {0x3fe72000}, {0x3fe74000}, {0x3fe76000}, + {0x3fe78000}, {0x3fe7a000}, {0x3fe7c000}, {0x3fe7e000}, + {0x3fe80000}, {0x3fe82000}, {0x3fe84000}, {0x3fe86000}, + {0x3fe88000}, {0x3fe8a000}, {0x3fe8c000}, {0x3fe8e000}, + {0x3fe90000}, {0x3fe92000}, {0x3fe94000}, {0x3fe96000}, + {0x3fe98000}, {0x3fe9a000}, {0x3fe9c000}, {0x3fe9e000}, + {0x3fea0000}, {0x3fea2000}, {0x3fea4000}, {0x3fea6000}, + {0x3fea8000}, {0x3feaa000}, {0x3feac000}, {0x3feae000}, + {0x3feb0000}, {0x3feb2000}, {0x3feb4000}, {0x3feb6000}, + {0x3feb8000}, {0x3feba000}, {0x3febc000}, {0x3febe000}, + {0x3fec0000}, {0x3fec2000}, {0x3fec4000}, {0x3fec6000}, + {0x3fec8000}, {0x3feca000}, {0x3fecc000}, {0x3fece000}, + {0x3fed0000}, {0x3fed2000}, {0x3fed4000}, {0x3fed6000}, + {0x3fed8000}, {0x3feda000}, {0x3fedc000}, {0x3fede000}, + {0x3fee0000}, {0x3fee2000}, {0x3fee4000}, {0x3fee6000}, + {0x3fee8000}, {0x3feea000}, {0x3feec000}, {0x3feee000}, + {0x3fef0000}, {0x3fef2000}, {0x3fef4000}, {0x3fef6000}, + {0x3fef8000}, {0x3fefa000}, {0x3fefc000}, {0x3fefe000}, + {0x3ff00000}, {0x3ff02000}, {0x3ff04000}, {0x3ff06000}, + {0x3ff08000}, {0x3ff0a000}, {0x3ff0c000}, {0x3ff0e000}, + {0x3ff10000}, {0x3ff12000}, {0x3ff14000}, {0x3ff16000}, + {0x3ff18000}, {0x3ff1a000}, {0x3ff1c000}, {0x3ff1e000}, + {0x3ff20000}, {0x3ff22000}, {0x3ff24000}, {0x3ff26000}, + {0x3ff28000}, {0x3ff2a000}, {0x3ff2c000}, {0x3ff2e000}, + {0x3ff30000}, {0x3ff32000}, {0x3ff34000}, {0x3ff36000}, + {0x3ff38000}, {0x3ff3a000}, {0x3ff3c000}, {0x3ff3e000}, + {0x3ff40000}, {0x3ff42000}, {0x3ff44000}, {0x3ff46000}, + {0x3ff48000}, {0x3ff4a000}, {0x3ff4c000}, {0x3ff4e000}, + {0x3ff50000}, {0x3ff52000}, {0x3ff54000}, {0x3ff56000}, + {0x3ff58000}, {0x3ff5a000}, {0x3ff5c000}, {0x3ff5e000}, + {0x3ff60000}, {0x3ff62000}, {0x3ff64000}, {0x3ff66000}, + {0x3ff68000}, {0x3ff6a000}, {0x3ff6c000}, {0x3ff6e000}, + {0x3ff70000}, {0x3ff72000}, {0x3ff74000}, {0x3ff76000}, + {0x3ff78000}, {0x3ff7a000}, {0x3ff7c000}, {0x3ff7e000}, + {0x3ff80000}, {0x3ff82000}, {0x3ff84000}, {0x3ff86000}, + {0x3ff88000}, {0x3ff8a000}, {0x3ff8c000}, {0x3ff8e000}, + {0x3ff90000}, {0x3ff92000}, {0x3ff94000}, {0x3ff96000}, + {0x3ff98000}, {0x3ff9a000}, {0x3ff9c000}, {0x3ff9e000}, + {0x3ffa0000}, {0x3ffa2000}, {0x3ffa4000}, {0x3ffa6000}, + {0x3ffa8000}, {0x3ffaa000}, {0x3ffac000}, {0x3ffae000}, + {0x3ffb0000}, {0x3ffb2000}, {0x3ffb4000}, {0x3ffb6000}, + {0x3ffb8000}, {0x3ffba000}, {0x3ffbc000}, {0x3ffbe000}, + {0x3ffc0000}, {0x3ffc2000}, {0x3ffc4000}, {0x3ffc6000}, + {0x3ffc8000}, {0x3ffca000}, {0x3ffcc000}, {0x3ffce000}, + {0x3ffd0000}, {0x3ffd2000}, {0x3ffd4000}, {0x3ffd6000}, + {0x3ffd8000}, {0x3ffda000}, {0x3ffdc000}, {0x3ffde000}, + {0x3ffe0000}, {0x3ffe2000}, {0x3ffe4000}, {0x3ffe6000}, + {0x3ffe8000}, {0x3ffea000}, {0x3ffec000}, {0x3ffee000}, + {0x3fff0000}, {0x3fff2000}, {0x3fff4000}, {0x3fff6000}, + {0x3fff8000}, {0x3fffa000}, {0x3fffc000}, {0x3fffe000}, + {0x40000000}, {0x40002000}, {0x40004000}, {0x40006000}, + {0x40008000}, {0x4000a000}, {0x4000c000}, {0x4000e000}, + {0x40010000}, {0x40012000}, {0x40014000}, {0x40016000}, + {0x40018000}, {0x4001a000}, {0x4001c000}, {0x4001e000}, + {0x40020000}, {0x40022000}, {0x40024000}, {0x40026000}, + {0x40028000}, {0x4002a000}, {0x4002c000}, {0x4002e000}, + {0x40030000}, {0x40032000}, {0x40034000}, {0x40036000}, + {0x40038000}, {0x4003a000}, {0x4003c000}, {0x4003e000}, + {0x40040000}, {0x40042000}, {0x40044000}, {0x40046000}, + {0x40048000}, {0x4004a000}, {0x4004c000}, {0x4004e000}, + {0x40050000}, {0x40052000}, {0x40054000}, {0x40056000}, + {0x40058000}, {0x4005a000}, {0x4005c000}, {0x4005e000}, + {0x40060000}, {0x40062000}, {0x40064000}, {0x40066000}, + {0x40068000}, {0x4006a000}, {0x4006c000}, {0x4006e000}, + {0x40070000}, {0x40072000}, {0x40074000}, {0x40076000}, + {0x40078000}, {0x4007a000}, {0x4007c000}, {0x4007e000}, + {0x40080000}, {0x40082000}, {0x40084000}, {0x40086000}, + {0x40088000}, {0x4008a000}, {0x4008c000}, {0x4008e000}, + {0x40090000}, {0x40092000}, {0x40094000}, {0x40096000}, + {0x40098000}, {0x4009a000}, {0x4009c000}, {0x4009e000}, + {0x400a0000}, {0x400a2000}, {0x400a4000}, {0x400a6000}, + {0x400a8000}, {0x400aa000}, {0x400ac000}, {0x400ae000}, + {0x400b0000}, {0x400b2000}, {0x400b4000}, {0x400b6000}, + {0x400b8000}, {0x400ba000}, {0x400bc000}, {0x400be000}, + {0x400c0000}, {0x400c2000}, {0x400c4000}, {0x400c6000}, + {0x400c8000}, {0x400ca000}, {0x400cc000}, {0x400ce000}, + {0x400d0000}, {0x400d2000}, {0x400d4000}, {0x400d6000}, + {0x400d8000}, {0x400da000}, {0x400dc000}, {0x400de000}, + {0x400e0000}, {0x400e2000}, {0x400e4000}, {0x400e6000}, + {0x400e8000}, {0x400ea000}, {0x400ec000}, {0x400ee000}, + {0x400f0000}, {0x400f2000}, {0x400f4000}, {0x400f6000}, + {0x400f8000}, {0x400fa000}, {0x400fc000}, {0x400fe000}, + {0x40100000}, {0x40102000}, {0x40104000}, {0x40106000}, + {0x40108000}, {0x4010a000}, {0x4010c000}, {0x4010e000}, + {0x40110000}, {0x40112000}, {0x40114000}, {0x40116000}, + {0x40118000}, {0x4011a000}, {0x4011c000}, {0x4011e000}, + {0x40120000}, {0x40122000}, {0x40124000}, {0x40126000}, + {0x40128000}, {0x4012a000}, {0x4012c000}, {0x4012e000}, + {0x40130000}, {0x40132000}, {0x40134000}, {0x40136000}, + {0x40138000}, {0x4013a000}, {0x4013c000}, {0x4013e000}, + {0x40140000}, {0x40142000}, {0x40144000}, {0x40146000}, + {0x40148000}, {0x4014a000}, {0x4014c000}, {0x4014e000}, + {0x40150000}, {0x40152000}, {0x40154000}, {0x40156000}, + {0x40158000}, {0x4015a000}, {0x4015c000}, {0x4015e000}, + {0x40160000}, {0x40162000}, {0x40164000}, {0x40166000}, + {0x40168000}, {0x4016a000}, {0x4016c000}, {0x4016e000}, + {0x40170000}, {0x40172000}, {0x40174000}, {0x40176000}, + {0x40178000}, {0x4017a000}, {0x4017c000}, {0x4017e000}, + {0x40180000}, {0x40182000}, {0x40184000}, {0x40186000}, + {0x40188000}, {0x4018a000}, {0x4018c000}, {0x4018e000}, + {0x40190000}, {0x40192000}, {0x40194000}, {0x40196000}, + {0x40198000}, {0x4019a000}, {0x4019c000}, {0x4019e000}, + {0x401a0000}, {0x401a2000}, {0x401a4000}, {0x401a6000}, + {0x401a8000}, {0x401aa000}, {0x401ac000}, {0x401ae000}, + {0x401b0000}, {0x401b2000}, {0x401b4000}, {0x401b6000}, + {0x401b8000}, {0x401ba000}, {0x401bc000}, {0x401be000}, + {0x401c0000}, {0x401c2000}, {0x401c4000}, {0x401c6000}, + {0x401c8000}, {0x401ca000}, {0x401cc000}, {0x401ce000}, + {0x401d0000}, {0x401d2000}, {0x401d4000}, {0x401d6000}, + {0x401d8000}, {0x401da000}, {0x401dc000}, {0x401de000}, + {0x401e0000}, {0x401e2000}, {0x401e4000}, {0x401e6000}, + {0x401e8000}, {0x401ea000}, {0x401ec000}, {0x401ee000}, + {0x401f0000}, {0x401f2000}, {0x401f4000}, {0x401f6000}, + {0x401f8000}, {0x401fa000}, {0x401fc000}, {0x401fe000}, + {0x40200000}, {0x40202000}, {0x40204000}, {0x40206000}, + {0x40208000}, {0x4020a000}, {0x4020c000}, {0x4020e000}, + {0x40210000}, {0x40212000}, {0x40214000}, {0x40216000}, + {0x40218000}, {0x4021a000}, {0x4021c000}, {0x4021e000}, + {0x40220000}, {0x40222000}, {0x40224000}, {0x40226000}, + {0x40228000}, {0x4022a000}, {0x4022c000}, {0x4022e000}, + {0x40230000}, {0x40232000}, {0x40234000}, {0x40236000}, + {0x40238000}, {0x4023a000}, {0x4023c000}, {0x4023e000}, + {0x40240000}, {0x40242000}, {0x40244000}, {0x40246000}, + {0x40248000}, {0x4024a000}, {0x4024c000}, {0x4024e000}, + {0x40250000}, {0x40252000}, {0x40254000}, {0x40256000}, + {0x40258000}, {0x4025a000}, {0x4025c000}, {0x4025e000}, + {0x40260000}, {0x40262000}, {0x40264000}, {0x40266000}, + {0x40268000}, {0x4026a000}, {0x4026c000}, {0x4026e000}, + {0x40270000}, {0x40272000}, {0x40274000}, {0x40276000}, + {0x40278000}, {0x4027a000}, {0x4027c000}, {0x4027e000}, + {0x40280000}, {0x40282000}, {0x40284000}, {0x40286000}, + {0x40288000}, {0x4028a000}, {0x4028c000}, {0x4028e000}, + {0x40290000}, {0x40292000}, {0x40294000}, {0x40296000}, + {0x40298000}, {0x4029a000}, {0x4029c000}, {0x4029e000}, + {0x402a0000}, {0x402a2000}, {0x402a4000}, {0x402a6000}, + {0x402a8000}, {0x402aa000}, {0x402ac000}, {0x402ae000}, + {0x402b0000}, {0x402b2000}, {0x402b4000}, {0x402b6000}, + {0x402b8000}, {0x402ba000}, {0x402bc000}, {0x402be000}, + {0x402c0000}, {0x402c2000}, {0x402c4000}, {0x402c6000}, + {0x402c8000}, {0x402ca000}, {0x402cc000}, {0x402ce000}, + {0x402d0000}, {0x402d2000}, {0x402d4000}, {0x402d6000}, + {0x402d8000}, {0x402da000}, {0x402dc000}, {0x402de000}, + {0x402e0000}, {0x402e2000}, {0x402e4000}, {0x402e6000}, + {0x402e8000}, {0x402ea000}, {0x402ec000}, {0x402ee000}, + {0x402f0000}, {0x402f2000}, {0x402f4000}, {0x402f6000}, + {0x402f8000}, {0x402fa000}, {0x402fc000}, {0x402fe000}, + {0x40300000}, {0x40302000}, {0x40304000}, {0x40306000}, + {0x40308000}, {0x4030a000}, {0x4030c000}, {0x4030e000}, + {0x40310000}, {0x40312000}, {0x40314000}, {0x40316000}, + {0x40318000}, {0x4031a000}, {0x4031c000}, {0x4031e000}, + {0x40320000}, {0x40322000}, {0x40324000}, {0x40326000}, + {0x40328000}, {0x4032a000}, {0x4032c000}, {0x4032e000}, + {0x40330000}, {0x40332000}, {0x40334000}, {0x40336000}, + {0x40338000}, {0x4033a000}, {0x4033c000}, {0x4033e000}, + {0x40340000}, {0x40342000}, {0x40344000}, {0x40346000}, + {0x40348000}, {0x4034a000}, {0x4034c000}, {0x4034e000}, + {0x40350000}, {0x40352000}, {0x40354000}, {0x40356000}, + {0x40358000}, {0x4035a000}, {0x4035c000}, {0x4035e000}, + {0x40360000}, {0x40362000}, {0x40364000}, {0x40366000}, + {0x40368000}, {0x4036a000}, {0x4036c000}, {0x4036e000}, + {0x40370000}, {0x40372000}, {0x40374000}, {0x40376000}, + {0x40378000}, {0x4037a000}, {0x4037c000}, {0x4037e000}, + {0x40380000}, {0x40382000}, {0x40384000}, {0x40386000}, + {0x40388000}, {0x4038a000}, {0x4038c000}, {0x4038e000}, + {0x40390000}, {0x40392000}, {0x40394000}, {0x40396000}, + {0x40398000}, {0x4039a000}, {0x4039c000}, {0x4039e000}, + {0x403a0000}, {0x403a2000}, {0x403a4000}, {0x403a6000}, + {0x403a8000}, {0x403aa000}, {0x403ac000}, {0x403ae000}, + {0x403b0000}, {0x403b2000}, {0x403b4000}, {0x403b6000}, + {0x403b8000}, {0x403ba000}, {0x403bc000}, {0x403be000}, + {0x403c0000}, {0x403c2000}, {0x403c4000}, {0x403c6000}, + {0x403c8000}, {0x403ca000}, {0x403cc000}, {0x403ce000}, + {0x403d0000}, {0x403d2000}, {0x403d4000}, {0x403d6000}, + {0x403d8000}, {0x403da000}, {0x403dc000}, {0x403de000}, + {0x403e0000}, {0x403e2000}, {0x403e4000}, {0x403e6000}, + {0x403e8000}, {0x403ea000}, {0x403ec000}, {0x403ee000}, + {0x403f0000}, {0x403f2000}, {0x403f4000}, {0x403f6000}, + {0x403f8000}, {0x403fa000}, {0x403fc000}, {0x403fe000}, + {0x40400000}, {0x40402000}, {0x40404000}, {0x40406000}, + {0x40408000}, {0x4040a000}, {0x4040c000}, {0x4040e000}, + {0x40410000}, {0x40412000}, {0x40414000}, {0x40416000}, + {0x40418000}, {0x4041a000}, {0x4041c000}, {0x4041e000}, + {0x40420000}, {0x40422000}, {0x40424000}, {0x40426000}, + {0x40428000}, {0x4042a000}, {0x4042c000}, {0x4042e000}, + {0x40430000}, {0x40432000}, {0x40434000}, {0x40436000}, + {0x40438000}, {0x4043a000}, {0x4043c000}, {0x4043e000}, + {0x40440000}, {0x40442000}, {0x40444000}, {0x40446000}, + {0x40448000}, {0x4044a000}, {0x4044c000}, {0x4044e000}, + {0x40450000}, {0x40452000}, {0x40454000}, {0x40456000}, + {0x40458000}, {0x4045a000}, {0x4045c000}, {0x4045e000}, + {0x40460000}, {0x40462000}, {0x40464000}, {0x40466000}, + {0x40468000}, {0x4046a000}, {0x4046c000}, {0x4046e000}, + {0x40470000}, {0x40472000}, {0x40474000}, {0x40476000}, + {0x40478000}, {0x4047a000}, {0x4047c000}, {0x4047e000}, + {0x40480000}, {0x40482000}, {0x40484000}, {0x40486000}, + {0x40488000}, {0x4048a000}, {0x4048c000}, {0x4048e000}, + {0x40490000}, {0x40492000}, {0x40494000}, {0x40496000}, + {0x40498000}, {0x4049a000}, {0x4049c000}, {0x4049e000}, + {0x404a0000}, {0x404a2000}, {0x404a4000}, {0x404a6000}, + {0x404a8000}, {0x404aa000}, {0x404ac000}, {0x404ae000}, + {0x404b0000}, {0x404b2000}, {0x404b4000}, {0x404b6000}, + {0x404b8000}, {0x404ba000}, {0x404bc000}, {0x404be000}, + {0x404c0000}, {0x404c2000}, {0x404c4000}, {0x404c6000}, + {0x404c8000}, {0x404ca000}, {0x404cc000}, {0x404ce000}, + {0x404d0000}, {0x404d2000}, {0x404d4000}, {0x404d6000}, + {0x404d8000}, {0x404da000}, {0x404dc000}, {0x404de000}, + {0x404e0000}, {0x404e2000}, {0x404e4000}, {0x404e6000}, + {0x404e8000}, {0x404ea000}, {0x404ec000}, {0x404ee000}, + {0x404f0000}, {0x404f2000}, {0x404f4000}, {0x404f6000}, + {0x404f8000}, {0x404fa000}, {0x404fc000}, {0x404fe000}, + {0x40500000}, {0x40502000}, {0x40504000}, {0x40506000}, + {0x40508000}, {0x4050a000}, {0x4050c000}, {0x4050e000}, + {0x40510000}, {0x40512000}, {0x40514000}, {0x40516000}, + {0x40518000}, {0x4051a000}, {0x4051c000}, {0x4051e000}, + {0x40520000}, {0x40522000}, {0x40524000}, {0x40526000}, + {0x40528000}, {0x4052a000}, {0x4052c000}, {0x4052e000}, + {0x40530000}, {0x40532000}, {0x40534000}, {0x40536000}, + {0x40538000}, {0x4053a000}, {0x4053c000}, {0x4053e000}, + {0x40540000}, {0x40542000}, {0x40544000}, {0x40546000}, + {0x40548000}, {0x4054a000}, {0x4054c000}, {0x4054e000}, + {0x40550000}, {0x40552000}, {0x40554000}, {0x40556000}, + {0x40558000}, {0x4055a000}, {0x4055c000}, {0x4055e000}, + {0x40560000}, {0x40562000}, {0x40564000}, {0x40566000}, + {0x40568000}, {0x4056a000}, {0x4056c000}, {0x4056e000}, + {0x40570000}, {0x40572000}, {0x40574000}, {0x40576000}, + {0x40578000}, {0x4057a000}, {0x4057c000}, {0x4057e000}, + {0x40580000}, {0x40582000}, {0x40584000}, {0x40586000}, + {0x40588000}, {0x4058a000}, {0x4058c000}, {0x4058e000}, + {0x40590000}, {0x40592000}, {0x40594000}, {0x40596000}, + {0x40598000}, {0x4059a000}, {0x4059c000}, {0x4059e000}, + {0x405a0000}, {0x405a2000}, {0x405a4000}, {0x405a6000}, + {0x405a8000}, {0x405aa000}, {0x405ac000}, {0x405ae000}, + {0x405b0000}, {0x405b2000}, {0x405b4000}, {0x405b6000}, + {0x405b8000}, {0x405ba000}, {0x405bc000}, {0x405be000}, + {0x405c0000}, {0x405c2000}, {0x405c4000}, {0x405c6000}, + {0x405c8000}, {0x405ca000}, {0x405cc000}, {0x405ce000}, + {0x405d0000}, {0x405d2000}, {0x405d4000}, {0x405d6000}, + {0x405d8000}, {0x405da000}, {0x405dc000}, {0x405de000}, + {0x405e0000}, {0x405e2000}, {0x405e4000}, {0x405e6000}, + {0x405e8000}, {0x405ea000}, {0x405ec000}, {0x405ee000}, + {0x405f0000}, {0x405f2000}, {0x405f4000}, {0x405f6000}, + {0x405f8000}, {0x405fa000}, {0x405fc000}, {0x405fe000}, + {0x40600000}, {0x40602000}, {0x40604000}, {0x40606000}, + {0x40608000}, {0x4060a000}, {0x4060c000}, {0x4060e000}, + {0x40610000}, {0x40612000}, {0x40614000}, {0x40616000}, + {0x40618000}, {0x4061a000}, {0x4061c000}, {0x4061e000}, + {0x40620000}, {0x40622000}, {0x40624000}, {0x40626000}, + {0x40628000}, {0x4062a000}, {0x4062c000}, {0x4062e000}, + {0x40630000}, {0x40632000}, {0x40634000}, {0x40636000}, + {0x40638000}, {0x4063a000}, {0x4063c000}, {0x4063e000}, + {0x40640000}, {0x40642000}, {0x40644000}, {0x40646000}, + {0x40648000}, {0x4064a000}, {0x4064c000}, {0x4064e000}, + {0x40650000}, {0x40652000}, {0x40654000}, {0x40656000}, + {0x40658000}, {0x4065a000}, {0x4065c000}, {0x4065e000}, + {0x40660000}, {0x40662000}, {0x40664000}, {0x40666000}, + {0x40668000}, {0x4066a000}, {0x4066c000}, {0x4066e000}, + {0x40670000}, {0x40672000}, {0x40674000}, {0x40676000}, + {0x40678000}, {0x4067a000}, {0x4067c000}, {0x4067e000}, + {0x40680000}, {0x40682000}, {0x40684000}, {0x40686000}, + {0x40688000}, {0x4068a000}, {0x4068c000}, {0x4068e000}, + {0x40690000}, {0x40692000}, {0x40694000}, {0x40696000}, + {0x40698000}, {0x4069a000}, {0x4069c000}, {0x4069e000}, + {0x406a0000}, {0x406a2000}, {0x406a4000}, {0x406a6000}, + {0x406a8000}, {0x406aa000}, {0x406ac000}, {0x406ae000}, + {0x406b0000}, {0x406b2000}, {0x406b4000}, {0x406b6000}, + {0x406b8000}, {0x406ba000}, {0x406bc000}, {0x406be000}, + {0x406c0000}, {0x406c2000}, {0x406c4000}, {0x406c6000}, + {0x406c8000}, {0x406ca000}, {0x406cc000}, {0x406ce000}, + {0x406d0000}, {0x406d2000}, {0x406d4000}, {0x406d6000}, + {0x406d8000}, {0x406da000}, {0x406dc000}, {0x406de000}, + {0x406e0000}, {0x406e2000}, {0x406e4000}, {0x406e6000}, + {0x406e8000}, {0x406ea000}, {0x406ec000}, {0x406ee000}, + {0x406f0000}, {0x406f2000}, {0x406f4000}, {0x406f6000}, + {0x406f8000}, {0x406fa000}, {0x406fc000}, {0x406fe000}, + {0x40700000}, {0x40702000}, {0x40704000}, {0x40706000}, + {0x40708000}, {0x4070a000}, {0x4070c000}, {0x4070e000}, + {0x40710000}, {0x40712000}, {0x40714000}, {0x40716000}, + {0x40718000}, {0x4071a000}, {0x4071c000}, {0x4071e000}, + {0x40720000}, {0x40722000}, {0x40724000}, {0x40726000}, + {0x40728000}, {0x4072a000}, {0x4072c000}, {0x4072e000}, + {0x40730000}, {0x40732000}, {0x40734000}, {0x40736000}, + {0x40738000}, {0x4073a000}, {0x4073c000}, {0x4073e000}, + {0x40740000}, {0x40742000}, {0x40744000}, {0x40746000}, + {0x40748000}, {0x4074a000}, {0x4074c000}, {0x4074e000}, + {0x40750000}, {0x40752000}, {0x40754000}, {0x40756000}, + {0x40758000}, {0x4075a000}, {0x4075c000}, {0x4075e000}, + {0x40760000}, {0x40762000}, {0x40764000}, {0x40766000}, + {0x40768000}, {0x4076a000}, {0x4076c000}, {0x4076e000}, + {0x40770000}, {0x40772000}, {0x40774000}, {0x40776000}, + {0x40778000}, {0x4077a000}, {0x4077c000}, {0x4077e000}, + {0x40780000}, {0x40782000}, {0x40784000}, {0x40786000}, + {0x40788000}, {0x4078a000}, {0x4078c000}, {0x4078e000}, + {0x40790000}, {0x40792000}, {0x40794000}, {0x40796000}, + {0x40798000}, {0x4079a000}, {0x4079c000}, {0x4079e000}, + {0x407a0000}, {0x407a2000}, {0x407a4000}, {0x407a6000}, + {0x407a8000}, {0x407aa000}, {0x407ac000}, {0x407ae000}, + {0x407b0000}, {0x407b2000}, {0x407b4000}, {0x407b6000}, + {0x407b8000}, {0x407ba000}, {0x407bc000}, {0x407be000}, + {0x407c0000}, {0x407c2000}, {0x407c4000}, {0x407c6000}, + {0x407c8000}, {0x407ca000}, {0x407cc000}, {0x407ce000}, + {0x407d0000}, {0x407d2000}, {0x407d4000}, {0x407d6000}, + {0x407d8000}, {0x407da000}, {0x407dc000}, {0x407de000}, + {0x407e0000}, {0x407e2000}, {0x407e4000}, {0x407e6000}, + {0x407e8000}, {0x407ea000}, {0x407ec000}, {0x407ee000}, + {0x407f0000}, {0x407f2000}, {0x407f4000}, {0x407f6000}, + {0x407f8000}, {0x407fa000}, {0x407fc000}, {0x407fe000}, + {0x40800000}, {0x40802000}, {0x40804000}, {0x40806000}, + {0x40808000}, {0x4080a000}, {0x4080c000}, {0x4080e000}, + {0x40810000}, {0x40812000}, {0x40814000}, {0x40816000}, + {0x40818000}, {0x4081a000}, {0x4081c000}, {0x4081e000}, + {0x40820000}, {0x40822000}, {0x40824000}, {0x40826000}, + {0x40828000}, {0x4082a000}, {0x4082c000}, {0x4082e000}, + {0x40830000}, {0x40832000}, {0x40834000}, {0x40836000}, + {0x40838000}, {0x4083a000}, {0x4083c000}, {0x4083e000}, + {0x40840000}, {0x40842000}, {0x40844000}, {0x40846000}, + {0x40848000}, {0x4084a000}, {0x4084c000}, {0x4084e000}, + {0x40850000}, {0x40852000}, {0x40854000}, {0x40856000}, + {0x40858000}, {0x4085a000}, {0x4085c000}, {0x4085e000}, + {0x40860000}, {0x40862000}, {0x40864000}, {0x40866000}, + {0x40868000}, {0x4086a000}, {0x4086c000}, {0x4086e000}, + {0x40870000}, {0x40872000}, {0x40874000}, {0x40876000}, + {0x40878000}, {0x4087a000}, {0x4087c000}, {0x4087e000}, + {0x40880000}, {0x40882000}, {0x40884000}, {0x40886000}, + {0x40888000}, {0x4088a000}, {0x4088c000}, {0x4088e000}, + {0x40890000}, {0x40892000}, {0x40894000}, {0x40896000}, + {0x40898000}, {0x4089a000}, {0x4089c000}, {0x4089e000}, + {0x408a0000}, {0x408a2000}, {0x408a4000}, {0x408a6000}, + {0x408a8000}, {0x408aa000}, {0x408ac000}, {0x408ae000}, + {0x408b0000}, {0x408b2000}, {0x408b4000}, {0x408b6000}, + {0x408b8000}, {0x408ba000}, {0x408bc000}, {0x408be000}, + {0x408c0000}, {0x408c2000}, {0x408c4000}, {0x408c6000}, + {0x408c8000}, {0x408ca000}, {0x408cc000}, {0x408ce000}, + {0x408d0000}, {0x408d2000}, {0x408d4000}, {0x408d6000}, + {0x408d8000}, {0x408da000}, {0x408dc000}, {0x408de000}, + {0x408e0000}, {0x408e2000}, {0x408e4000}, {0x408e6000}, + {0x408e8000}, {0x408ea000}, {0x408ec000}, {0x408ee000}, + {0x408f0000}, {0x408f2000}, {0x408f4000}, {0x408f6000}, + {0x408f8000}, {0x408fa000}, {0x408fc000}, {0x408fe000}, + {0x40900000}, {0x40902000}, {0x40904000}, {0x40906000}, + {0x40908000}, {0x4090a000}, {0x4090c000}, {0x4090e000}, + {0x40910000}, {0x40912000}, {0x40914000}, {0x40916000}, + {0x40918000}, {0x4091a000}, {0x4091c000}, {0x4091e000}, + {0x40920000}, {0x40922000}, {0x40924000}, {0x40926000}, + {0x40928000}, {0x4092a000}, {0x4092c000}, {0x4092e000}, + {0x40930000}, {0x40932000}, {0x40934000}, {0x40936000}, + {0x40938000}, {0x4093a000}, {0x4093c000}, {0x4093e000}, + {0x40940000}, {0x40942000}, {0x40944000}, {0x40946000}, + {0x40948000}, {0x4094a000}, {0x4094c000}, {0x4094e000}, + {0x40950000}, {0x40952000}, {0x40954000}, {0x40956000}, + {0x40958000}, {0x4095a000}, {0x4095c000}, {0x4095e000}, + {0x40960000}, {0x40962000}, {0x40964000}, {0x40966000}, + {0x40968000}, {0x4096a000}, {0x4096c000}, {0x4096e000}, + {0x40970000}, {0x40972000}, {0x40974000}, {0x40976000}, + {0x40978000}, {0x4097a000}, {0x4097c000}, {0x4097e000}, + {0x40980000}, {0x40982000}, {0x40984000}, {0x40986000}, + {0x40988000}, {0x4098a000}, {0x4098c000}, {0x4098e000}, + {0x40990000}, {0x40992000}, {0x40994000}, {0x40996000}, + {0x40998000}, {0x4099a000}, {0x4099c000}, {0x4099e000}, + {0x409a0000}, {0x409a2000}, {0x409a4000}, {0x409a6000}, + {0x409a8000}, {0x409aa000}, {0x409ac000}, {0x409ae000}, + {0x409b0000}, {0x409b2000}, {0x409b4000}, {0x409b6000}, + {0x409b8000}, {0x409ba000}, {0x409bc000}, {0x409be000}, + {0x409c0000}, {0x409c2000}, {0x409c4000}, {0x409c6000}, + {0x409c8000}, {0x409ca000}, {0x409cc000}, {0x409ce000}, + {0x409d0000}, {0x409d2000}, {0x409d4000}, {0x409d6000}, + {0x409d8000}, {0x409da000}, {0x409dc000}, {0x409de000}, + {0x409e0000}, {0x409e2000}, {0x409e4000}, {0x409e6000}, + {0x409e8000}, {0x409ea000}, {0x409ec000}, {0x409ee000}, + {0x409f0000}, {0x409f2000}, {0x409f4000}, {0x409f6000}, + {0x409f8000}, {0x409fa000}, {0x409fc000}, {0x409fe000}, + {0x40a00000}, {0x40a02000}, {0x40a04000}, {0x40a06000}, + {0x40a08000}, {0x40a0a000}, {0x40a0c000}, {0x40a0e000}, + {0x40a10000}, {0x40a12000}, {0x40a14000}, {0x40a16000}, + {0x40a18000}, {0x40a1a000}, {0x40a1c000}, {0x40a1e000}, + {0x40a20000}, {0x40a22000}, {0x40a24000}, {0x40a26000}, + {0x40a28000}, {0x40a2a000}, {0x40a2c000}, {0x40a2e000}, + {0x40a30000}, {0x40a32000}, {0x40a34000}, {0x40a36000}, + {0x40a38000}, {0x40a3a000}, {0x40a3c000}, {0x40a3e000}, + {0x40a40000}, {0x40a42000}, {0x40a44000}, {0x40a46000}, + {0x40a48000}, {0x40a4a000}, {0x40a4c000}, {0x40a4e000}, + {0x40a50000}, {0x40a52000}, {0x40a54000}, {0x40a56000}, + {0x40a58000}, {0x40a5a000}, {0x40a5c000}, {0x40a5e000}, + {0x40a60000}, {0x40a62000}, {0x40a64000}, {0x40a66000}, + {0x40a68000}, {0x40a6a000}, {0x40a6c000}, {0x40a6e000}, + {0x40a70000}, {0x40a72000}, {0x40a74000}, {0x40a76000}, + {0x40a78000}, {0x40a7a000}, {0x40a7c000}, {0x40a7e000}, + {0x40a80000}, {0x40a82000}, {0x40a84000}, {0x40a86000}, + {0x40a88000}, {0x40a8a000}, {0x40a8c000}, {0x40a8e000}, + {0x40a90000}, {0x40a92000}, {0x40a94000}, {0x40a96000}, + {0x40a98000}, {0x40a9a000}, {0x40a9c000}, {0x40a9e000}, + {0x40aa0000}, {0x40aa2000}, {0x40aa4000}, {0x40aa6000}, + {0x40aa8000}, {0x40aaa000}, {0x40aac000}, {0x40aae000}, + {0x40ab0000}, {0x40ab2000}, {0x40ab4000}, {0x40ab6000}, + {0x40ab8000}, {0x40aba000}, {0x40abc000}, {0x40abe000}, + {0x40ac0000}, {0x40ac2000}, {0x40ac4000}, {0x40ac6000}, + {0x40ac8000}, {0x40aca000}, {0x40acc000}, {0x40ace000}, + {0x40ad0000}, {0x40ad2000}, {0x40ad4000}, {0x40ad6000}, + {0x40ad8000}, {0x40ada000}, {0x40adc000}, {0x40ade000}, + {0x40ae0000}, {0x40ae2000}, {0x40ae4000}, {0x40ae6000}, + {0x40ae8000}, {0x40aea000}, {0x40aec000}, {0x40aee000}, + {0x40af0000}, {0x40af2000}, {0x40af4000}, {0x40af6000}, + {0x40af8000}, {0x40afa000}, {0x40afc000}, {0x40afe000}, + {0x40b00000}, {0x40b02000}, {0x40b04000}, {0x40b06000}, + {0x40b08000}, {0x40b0a000}, {0x40b0c000}, {0x40b0e000}, + {0x40b10000}, {0x40b12000}, {0x40b14000}, {0x40b16000}, + {0x40b18000}, {0x40b1a000}, {0x40b1c000}, {0x40b1e000}, + {0x40b20000}, {0x40b22000}, {0x40b24000}, {0x40b26000}, + {0x40b28000}, {0x40b2a000}, {0x40b2c000}, {0x40b2e000}, + {0x40b30000}, {0x40b32000}, {0x40b34000}, {0x40b36000}, + {0x40b38000}, {0x40b3a000}, {0x40b3c000}, {0x40b3e000}, + {0x40b40000}, {0x40b42000}, {0x40b44000}, {0x40b46000}, + {0x40b48000}, {0x40b4a000}, {0x40b4c000}, {0x40b4e000}, + {0x40b50000}, {0x40b52000}, {0x40b54000}, {0x40b56000}, + {0x40b58000}, {0x40b5a000}, {0x40b5c000}, {0x40b5e000}, + {0x40b60000}, {0x40b62000}, {0x40b64000}, {0x40b66000}, + {0x40b68000}, {0x40b6a000}, {0x40b6c000}, {0x40b6e000}, + {0x40b70000}, {0x40b72000}, {0x40b74000}, {0x40b76000}, + {0x40b78000}, {0x40b7a000}, {0x40b7c000}, {0x40b7e000}, + {0x40b80000}, {0x40b82000}, {0x40b84000}, {0x40b86000}, + {0x40b88000}, {0x40b8a000}, {0x40b8c000}, {0x40b8e000}, + {0x40b90000}, {0x40b92000}, {0x40b94000}, {0x40b96000}, + {0x40b98000}, {0x40b9a000}, {0x40b9c000}, {0x40b9e000}, + {0x40ba0000}, {0x40ba2000}, {0x40ba4000}, {0x40ba6000}, + {0x40ba8000}, {0x40baa000}, {0x40bac000}, {0x40bae000}, + {0x40bb0000}, {0x40bb2000}, {0x40bb4000}, {0x40bb6000}, + {0x40bb8000}, {0x40bba000}, {0x40bbc000}, {0x40bbe000}, + {0x40bc0000}, {0x40bc2000}, {0x40bc4000}, {0x40bc6000}, + {0x40bc8000}, {0x40bca000}, {0x40bcc000}, {0x40bce000}, + {0x40bd0000}, {0x40bd2000}, {0x40bd4000}, {0x40bd6000}, + {0x40bd8000}, {0x40bda000}, {0x40bdc000}, {0x40bde000}, + {0x40be0000}, {0x40be2000}, {0x40be4000}, {0x40be6000}, + {0x40be8000}, {0x40bea000}, {0x40bec000}, {0x40bee000}, + {0x40bf0000}, {0x40bf2000}, {0x40bf4000}, {0x40bf6000}, + {0x40bf8000}, {0x40bfa000}, {0x40bfc000}, {0x40bfe000}, + {0x40c00000}, {0x40c02000}, {0x40c04000}, {0x40c06000}, + {0x40c08000}, {0x40c0a000}, {0x40c0c000}, {0x40c0e000}, + {0x40c10000}, {0x40c12000}, {0x40c14000}, {0x40c16000}, + {0x40c18000}, {0x40c1a000}, {0x40c1c000}, {0x40c1e000}, + {0x40c20000}, {0x40c22000}, {0x40c24000}, {0x40c26000}, + {0x40c28000}, {0x40c2a000}, {0x40c2c000}, {0x40c2e000}, + {0x40c30000}, {0x40c32000}, {0x40c34000}, {0x40c36000}, + {0x40c38000}, {0x40c3a000}, {0x40c3c000}, {0x40c3e000}, + {0x40c40000}, {0x40c42000}, {0x40c44000}, {0x40c46000}, + {0x40c48000}, {0x40c4a000}, {0x40c4c000}, {0x40c4e000}, + {0x40c50000}, {0x40c52000}, {0x40c54000}, {0x40c56000}, + {0x40c58000}, {0x40c5a000}, {0x40c5c000}, {0x40c5e000}, + {0x40c60000}, {0x40c62000}, {0x40c64000}, {0x40c66000}, + {0x40c68000}, {0x40c6a000}, {0x40c6c000}, {0x40c6e000}, + {0x40c70000}, {0x40c72000}, {0x40c74000}, {0x40c76000}, + {0x40c78000}, {0x40c7a000}, {0x40c7c000}, {0x40c7e000}, + {0x40c80000}, {0x40c82000}, {0x40c84000}, {0x40c86000}, + {0x40c88000}, {0x40c8a000}, {0x40c8c000}, {0x40c8e000}, + {0x40c90000}, {0x40c92000}, {0x40c94000}, {0x40c96000}, + {0x40c98000}, {0x40c9a000}, {0x40c9c000}, {0x40c9e000}, + {0x40ca0000}, {0x40ca2000}, {0x40ca4000}, {0x40ca6000}, + {0x40ca8000}, {0x40caa000}, {0x40cac000}, {0x40cae000}, + {0x40cb0000}, {0x40cb2000}, {0x40cb4000}, {0x40cb6000}, + {0x40cb8000}, {0x40cba000}, {0x40cbc000}, {0x40cbe000}, + {0x40cc0000}, {0x40cc2000}, {0x40cc4000}, {0x40cc6000}, + {0x40cc8000}, {0x40cca000}, {0x40ccc000}, {0x40cce000}, + {0x40cd0000}, {0x40cd2000}, {0x40cd4000}, {0x40cd6000}, + {0x40cd8000}, {0x40cda000}, {0x40cdc000}, {0x40cde000}, + {0x40ce0000}, {0x40ce2000}, {0x40ce4000}, {0x40ce6000}, + {0x40ce8000}, {0x40cea000}, {0x40cec000}, {0x40cee000}, + {0x40cf0000}, {0x40cf2000}, {0x40cf4000}, {0x40cf6000}, + {0x40cf8000}, {0x40cfa000}, {0x40cfc000}, {0x40cfe000}, + {0x40d00000}, {0x40d02000}, {0x40d04000}, {0x40d06000}, + {0x40d08000}, {0x40d0a000}, {0x40d0c000}, {0x40d0e000}, + {0x40d10000}, {0x40d12000}, {0x40d14000}, {0x40d16000}, + {0x40d18000}, {0x40d1a000}, {0x40d1c000}, {0x40d1e000}, + {0x40d20000}, {0x40d22000}, {0x40d24000}, {0x40d26000}, + {0x40d28000}, {0x40d2a000}, {0x40d2c000}, {0x40d2e000}, + {0x40d30000}, {0x40d32000}, {0x40d34000}, {0x40d36000}, + {0x40d38000}, {0x40d3a000}, {0x40d3c000}, {0x40d3e000}, + {0x40d40000}, {0x40d42000}, {0x40d44000}, {0x40d46000}, + {0x40d48000}, {0x40d4a000}, {0x40d4c000}, {0x40d4e000}, + {0x40d50000}, {0x40d52000}, {0x40d54000}, {0x40d56000}, + {0x40d58000}, {0x40d5a000}, {0x40d5c000}, {0x40d5e000}, + {0x40d60000}, {0x40d62000}, {0x40d64000}, {0x40d66000}, + {0x40d68000}, {0x40d6a000}, {0x40d6c000}, {0x40d6e000}, + {0x40d70000}, {0x40d72000}, {0x40d74000}, {0x40d76000}, + {0x40d78000}, {0x40d7a000}, {0x40d7c000}, {0x40d7e000}, + {0x40d80000}, {0x40d82000}, {0x40d84000}, {0x40d86000}, + {0x40d88000}, {0x40d8a000}, {0x40d8c000}, {0x40d8e000}, + {0x40d90000}, {0x40d92000}, {0x40d94000}, {0x40d96000}, + {0x40d98000}, {0x40d9a000}, {0x40d9c000}, {0x40d9e000}, + {0x40da0000}, {0x40da2000}, {0x40da4000}, {0x40da6000}, + {0x40da8000}, {0x40daa000}, {0x40dac000}, {0x40dae000}, + {0x40db0000}, {0x40db2000}, {0x40db4000}, {0x40db6000}, + {0x40db8000}, {0x40dba000}, {0x40dbc000}, {0x40dbe000}, + {0x40dc0000}, {0x40dc2000}, {0x40dc4000}, {0x40dc6000}, + {0x40dc8000}, {0x40dca000}, {0x40dcc000}, {0x40dce000}, + {0x40dd0000}, {0x40dd2000}, {0x40dd4000}, {0x40dd6000}, + {0x40dd8000}, {0x40dda000}, {0x40ddc000}, {0x40dde000}, + {0x40de0000}, {0x40de2000}, {0x40de4000}, {0x40de6000}, + {0x40de8000}, {0x40dea000}, {0x40dec000}, {0x40dee000}, + {0x40df0000}, {0x40df2000}, {0x40df4000}, {0x40df6000}, + {0x40df8000}, {0x40dfa000}, {0x40dfc000}, {0x40dfe000}, + {0x40e00000}, {0x40e02000}, {0x40e04000}, {0x40e06000}, + {0x40e08000}, {0x40e0a000}, {0x40e0c000}, {0x40e0e000}, + {0x40e10000}, {0x40e12000}, {0x40e14000}, {0x40e16000}, + {0x40e18000}, {0x40e1a000}, {0x40e1c000}, {0x40e1e000}, + {0x40e20000}, {0x40e22000}, {0x40e24000}, {0x40e26000}, + {0x40e28000}, {0x40e2a000}, {0x40e2c000}, {0x40e2e000}, + {0x40e30000}, {0x40e32000}, {0x40e34000}, {0x40e36000}, + {0x40e38000}, {0x40e3a000}, {0x40e3c000}, {0x40e3e000}, + {0x40e40000}, {0x40e42000}, {0x40e44000}, {0x40e46000}, + {0x40e48000}, {0x40e4a000}, {0x40e4c000}, {0x40e4e000}, + {0x40e50000}, {0x40e52000}, {0x40e54000}, {0x40e56000}, + {0x40e58000}, {0x40e5a000}, {0x40e5c000}, {0x40e5e000}, + {0x40e60000}, {0x40e62000}, {0x40e64000}, {0x40e66000}, + {0x40e68000}, {0x40e6a000}, {0x40e6c000}, {0x40e6e000}, + {0x40e70000}, {0x40e72000}, {0x40e74000}, {0x40e76000}, + {0x40e78000}, {0x40e7a000}, {0x40e7c000}, {0x40e7e000}, + {0x40e80000}, {0x40e82000}, {0x40e84000}, {0x40e86000}, + {0x40e88000}, {0x40e8a000}, {0x40e8c000}, {0x40e8e000}, + {0x40e90000}, {0x40e92000}, {0x40e94000}, {0x40e96000}, + {0x40e98000}, {0x40e9a000}, {0x40e9c000}, {0x40e9e000}, + {0x40ea0000}, {0x40ea2000}, {0x40ea4000}, {0x40ea6000}, + {0x40ea8000}, {0x40eaa000}, {0x40eac000}, {0x40eae000}, + {0x40eb0000}, {0x40eb2000}, {0x40eb4000}, {0x40eb6000}, + {0x40eb8000}, {0x40eba000}, {0x40ebc000}, {0x40ebe000}, + {0x40ec0000}, {0x40ec2000}, {0x40ec4000}, {0x40ec6000}, + {0x40ec8000}, {0x40eca000}, {0x40ecc000}, {0x40ece000}, + {0x40ed0000}, {0x40ed2000}, {0x40ed4000}, {0x40ed6000}, + {0x40ed8000}, {0x40eda000}, {0x40edc000}, {0x40ede000}, + {0x40ee0000}, {0x40ee2000}, {0x40ee4000}, {0x40ee6000}, + {0x40ee8000}, {0x40eea000}, {0x40eec000}, {0x40eee000}, + {0x40ef0000}, {0x40ef2000}, {0x40ef4000}, {0x40ef6000}, + {0x40ef8000}, {0x40efa000}, {0x40efc000}, {0x40efe000}, + {0x40f00000}, {0x40f02000}, {0x40f04000}, {0x40f06000}, + {0x40f08000}, {0x40f0a000}, {0x40f0c000}, {0x40f0e000}, + {0x40f10000}, {0x40f12000}, {0x40f14000}, {0x40f16000}, + {0x40f18000}, {0x40f1a000}, {0x40f1c000}, {0x40f1e000}, + {0x40f20000}, {0x40f22000}, {0x40f24000}, {0x40f26000}, + {0x40f28000}, {0x40f2a000}, {0x40f2c000}, {0x40f2e000}, + {0x40f30000}, {0x40f32000}, {0x40f34000}, {0x40f36000}, + {0x40f38000}, {0x40f3a000}, {0x40f3c000}, {0x40f3e000}, + {0x40f40000}, {0x40f42000}, {0x40f44000}, {0x40f46000}, + {0x40f48000}, {0x40f4a000}, {0x40f4c000}, {0x40f4e000}, + {0x40f50000}, {0x40f52000}, {0x40f54000}, {0x40f56000}, + {0x40f58000}, {0x40f5a000}, {0x40f5c000}, {0x40f5e000}, + {0x40f60000}, {0x40f62000}, {0x40f64000}, {0x40f66000}, + {0x40f68000}, {0x40f6a000}, {0x40f6c000}, {0x40f6e000}, + {0x40f70000}, {0x40f72000}, {0x40f74000}, {0x40f76000}, + {0x40f78000}, {0x40f7a000}, {0x40f7c000}, {0x40f7e000}, + {0x40f80000}, {0x40f82000}, {0x40f84000}, {0x40f86000}, + {0x40f88000}, {0x40f8a000}, {0x40f8c000}, {0x40f8e000}, + {0x40f90000}, {0x40f92000}, {0x40f94000}, {0x40f96000}, + {0x40f98000}, {0x40f9a000}, {0x40f9c000}, {0x40f9e000}, + {0x40fa0000}, {0x40fa2000}, {0x40fa4000}, {0x40fa6000}, + {0x40fa8000}, {0x40faa000}, {0x40fac000}, {0x40fae000}, + {0x40fb0000}, {0x40fb2000}, {0x40fb4000}, {0x40fb6000}, + {0x40fb8000}, {0x40fba000}, {0x40fbc000}, {0x40fbe000}, + {0x40fc0000}, {0x40fc2000}, {0x40fc4000}, {0x40fc6000}, + {0x40fc8000}, {0x40fca000}, {0x40fcc000}, {0x40fce000}, + {0x40fd0000}, {0x40fd2000}, {0x40fd4000}, {0x40fd6000}, + {0x40fd8000}, {0x40fda000}, {0x40fdc000}, {0x40fde000}, + {0x40fe0000}, {0x40fe2000}, {0x40fe4000}, {0x40fe6000}, + {0x40fe8000}, {0x40fea000}, {0x40fec000}, {0x40fee000}, + {0x40ff0000}, {0x40ff2000}, {0x40ff4000}, {0x40ff6000}, + {0x40ff8000}, {0x40ffa000}, {0x40ffc000}, {0x40ffe000}, + {0x41000000}, {0x41002000}, {0x41004000}, {0x41006000}, + {0x41008000}, {0x4100a000}, {0x4100c000}, {0x4100e000}, + {0x41010000}, {0x41012000}, {0x41014000}, {0x41016000}, + {0x41018000}, {0x4101a000}, {0x4101c000}, {0x4101e000}, + {0x41020000}, {0x41022000}, {0x41024000}, {0x41026000}, + {0x41028000}, {0x4102a000}, {0x4102c000}, {0x4102e000}, + {0x41030000}, {0x41032000}, {0x41034000}, {0x41036000}, + {0x41038000}, {0x4103a000}, {0x4103c000}, {0x4103e000}, + {0x41040000}, {0x41042000}, {0x41044000}, {0x41046000}, + {0x41048000}, {0x4104a000}, {0x4104c000}, {0x4104e000}, + {0x41050000}, {0x41052000}, {0x41054000}, {0x41056000}, + {0x41058000}, {0x4105a000}, {0x4105c000}, {0x4105e000}, + {0x41060000}, {0x41062000}, {0x41064000}, {0x41066000}, + {0x41068000}, {0x4106a000}, {0x4106c000}, {0x4106e000}, + {0x41070000}, {0x41072000}, {0x41074000}, {0x41076000}, + {0x41078000}, {0x4107a000}, {0x4107c000}, {0x4107e000}, + {0x41080000}, {0x41082000}, {0x41084000}, {0x41086000}, + {0x41088000}, {0x4108a000}, {0x4108c000}, {0x4108e000}, + {0x41090000}, {0x41092000}, {0x41094000}, {0x41096000}, + {0x41098000}, {0x4109a000}, {0x4109c000}, {0x4109e000}, + {0x410a0000}, {0x410a2000}, {0x410a4000}, {0x410a6000}, + {0x410a8000}, {0x410aa000}, {0x410ac000}, {0x410ae000}, + {0x410b0000}, {0x410b2000}, {0x410b4000}, {0x410b6000}, + {0x410b8000}, {0x410ba000}, {0x410bc000}, {0x410be000}, + {0x410c0000}, {0x410c2000}, {0x410c4000}, {0x410c6000}, + {0x410c8000}, {0x410ca000}, {0x410cc000}, {0x410ce000}, + {0x410d0000}, {0x410d2000}, {0x410d4000}, {0x410d6000}, + {0x410d8000}, {0x410da000}, {0x410dc000}, {0x410de000}, + {0x410e0000}, {0x410e2000}, {0x410e4000}, {0x410e6000}, + {0x410e8000}, {0x410ea000}, {0x410ec000}, {0x410ee000}, + {0x410f0000}, {0x410f2000}, {0x410f4000}, {0x410f6000}, + {0x410f8000}, {0x410fa000}, {0x410fc000}, {0x410fe000}, + {0x41100000}, {0x41102000}, {0x41104000}, {0x41106000}, + {0x41108000}, {0x4110a000}, {0x4110c000}, {0x4110e000}, + {0x41110000}, {0x41112000}, {0x41114000}, {0x41116000}, + {0x41118000}, {0x4111a000}, {0x4111c000}, {0x4111e000}, + {0x41120000}, {0x41122000}, {0x41124000}, {0x41126000}, + {0x41128000}, {0x4112a000}, {0x4112c000}, {0x4112e000}, + {0x41130000}, {0x41132000}, {0x41134000}, {0x41136000}, + {0x41138000}, {0x4113a000}, {0x4113c000}, {0x4113e000}, + {0x41140000}, {0x41142000}, {0x41144000}, {0x41146000}, + {0x41148000}, {0x4114a000}, {0x4114c000}, {0x4114e000}, + {0x41150000}, {0x41152000}, {0x41154000}, {0x41156000}, + {0x41158000}, {0x4115a000}, {0x4115c000}, {0x4115e000}, + {0x41160000}, {0x41162000}, {0x41164000}, {0x41166000}, + {0x41168000}, {0x4116a000}, {0x4116c000}, {0x4116e000}, + {0x41170000}, {0x41172000}, {0x41174000}, {0x41176000}, + {0x41178000}, {0x4117a000}, {0x4117c000}, {0x4117e000}, + {0x41180000}, {0x41182000}, {0x41184000}, {0x41186000}, + {0x41188000}, {0x4118a000}, {0x4118c000}, {0x4118e000}, + {0x41190000}, {0x41192000}, {0x41194000}, {0x41196000}, + {0x41198000}, {0x4119a000}, {0x4119c000}, {0x4119e000}, + {0x411a0000}, {0x411a2000}, {0x411a4000}, {0x411a6000}, + {0x411a8000}, {0x411aa000}, {0x411ac000}, {0x411ae000}, + {0x411b0000}, {0x411b2000}, {0x411b4000}, {0x411b6000}, + {0x411b8000}, {0x411ba000}, {0x411bc000}, {0x411be000}, + {0x411c0000}, {0x411c2000}, {0x411c4000}, {0x411c6000}, + {0x411c8000}, {0x411ca000}, {0x411cc000}, {0x411ce000}, + {0x411d0000}, {0x411d2000}, {0x411d4000}, {0x411d6000}, + {0x411d8000}, {0x411da000}, {0x411dc000}, {0x411de000}, + {0x411e0000}, {0x411e2000}, {0x411e4000}, {0x411e6000}, + {0x411e8000}, {0x411ea000}, {0x411ec000}, {0x411ee000}, + {0x411f0000}, {0x411f2000}, {0x411f4000}, {0x411f6000}, + {0x411f8000}, {0x411fa000}, {0x411fc000}, {0x411fe000}, + {0x41200000}, {0x41202000}, {0x41204000}, {0x41206000}, + {0x41208000}, {0x4120a000}, {0x4120c000}, {0x4120e000}, + {0x41210000}, {0x41212000}, {0x41214000}, {0x41216000}, + {0x41218000}, {0x4121a000}, {0x4121c000}, {0x4121e000}, + {0x41220000}, {0x41222000}, {0x41224000}, {0x41226000}, + {0x41228000}, {0x4122a000}, {0x4122c000}, {0x4122e000}, + {0x41230000}, {0x41232000}, {0x41234000}, {0x41236000}, + {0x41238000}, {0x4123a000}, {0x4123c000}, {0x4123e000}, + {0x41240000}, {0x41242000}, {0x41244000}, {0x41246000}, + {0x41248000}, {0x4124a000}, {0x4124c000}, {0x4124e000}, + {0x41250000}, {0x41252000}, {0x41254000}, {0x41256000}, + {0x41258000}, {0x4125a000}, {0x4125c000}, {0x4125e000}, + {0x41260000}, {0x41262000}, {0x41264000}, {0x41266000}, + {0x41268000}, {0x4126a000}, {0x4126c000}, {0x4126e000}, + {0x41270000}, {0x41272000}, {0x41274000}, {0x41276000}, + {0x41278000}, {0x4127a000}, {0x4127c000}, {0x4127e000}, + {0x41280000}, {0x41282000}, {0x41284000}, {0x41286000}, + {0x41288000}, {0x4128a000}, {0x4128c000}, {0x4128e000}, + {0x41290000}, {0x41292000}, {0x41294000}, {0x41296000}, + {0x41298000}, {0x4129a000}, {0x4129c000}, {0x4129e000}, + {0x412a0000}, {0x412a2000}, {0x412a4000}, {0x412a6000}, + {0x412a8000}, {0x412aa000}, {0x412ac000}, {0x412ae000}, + {0x412b0000}, {0x412b2000}, {0x412b4000}, {0x412b6000}, + {0x412b8000}, {0x412ba000}, {0x412bc000}, {0x412be000}, + {0x412c0000}, {0x412c2000}, {0x412c4000}, {0x412c6000}, + {0x412c8000}, {0x412ca000}, {0x412cc000}, {0x412ce000}, + {0x412d0000}, {0x412d2000}, {0x412d4000}, {0x412d6000}, + {0x412d8000}, {0x412da000}, {0x412dc000}, {0x412de000}, + {0x412e0000}, {0x412e2000}, {0x412e4000}, {0x412e6000}, + {0x412e8000}, {0x412ea000}, {0x412ec000}, {0x412ee000}, + {0x412f0000}, {0x412f2000}, {0x412f4000}, {0x412f6000}, + {0x412f8000}, {0x412fa000}, {0x412fc000}, {0x412fe000}, + {0x41300000}, {0x41302000}, {0x41304000}, {0x41306000}, + {0x41308000}, {0x4130a000}, {0x4130c000}, {0x4130e000}, + {0x41310000}, {0x41312000}, {0x41314000}, {0x41316000}, + {0x41318000}, {0x4131a000}, {0x4131c000}, {0x4131e000}, + {0x41320000}, {0x41322000}, {0x41324000}, {0x41326000}, + {0x41328000}, {0x4132a000}, {0x4132c000}, {0x4132e000}, + {0x41330000}, {0x41332000}, {0x41334000}, {0x41336000}, + {0x41338000}, {0x4133a000}, {0x4133c000}, {0x4133e000}, + {0x41340000}, {0x41342000}, {0x41344000}, {0x41346000}, + {0x41348000}, {0x4134a000}, {0x4134c000}, {0x4134e000}, + {0x41350000}, {0x41352000}, {0x41354000}, {0x41356000}, + {0x41358000}, {0x4135a000}, {0x4135c000}, {0x4135e000}, + {0x41360000}, {0x41362000}, {0x41364000}, {0x41366000}, + {0x41368000}, {0x4136a000}, {0x4136c000}, {0x4136e000}, + {0x41370000}, {0x41372000}, {0x41374000}, {0x41376000}, + {0x41378000}, {0x4137a000}, {0x4137c000}, {0x4137e000}, + {0x41380000}, {0x41382000}, {0x41384000}, {0x41386000}, + {0x41388000}, {0x4138a000}, {0x4138c000}, {0x4138e000}, + {0x41390000}, {0x41392000}, {0x41394000}, {0x41396000}, + {0x41398000}, {0x4139a000}, {0x4139c000}, {0x4139e000}, + {0x413a0000}, {0x413a2000}, {0x413a4000}, {0x413a6000}, + {0x413a8000}, {0x413aa000}, {0x413ac000}, {0x413ae000}, + {0x413b0000}, {0x413b2000}, {0x413b4000}, {0x413b6000}, + {0x413b8000}, {0x413ba000}, {0x413bc000}, {0x413be000}, + {0x413c0000}, {0x413c2000}, {0x413c4000}, {0x413c6000}, + {0x413c8000}, {0x413ca000}, {0x413cc000}, {0x413ce000}, + {0x413d0000}, {0x413d2000}, {0x413d4000}, {0x413d6000}, + {0x413d8000}, {0x413da000}, {0x413dc000}, {0x413de000}, + {0x413e0000}, {0x413e2000}, {0x413e4000}, {0x413e6000}, + {0x413e8000}, {0x413ea000}, {0x413ec000}, {0x413ee000}, + {0x413f0000}, {0x413f2000}, {0x413f4000}, {0x413f6000}, + {0x413f8000}, {0x413fa000}, {0x413fc000}, {0x413fe000}, + {0x41400000}, {0x41402000}, {0x41404000}, {0x41406000}, + {0x41408000}, {0x4140a000}, {0x4140c000}, {0x4140e000}, + {0x41410000}, {0x41412000}, {0x41414000}, {0x41416000}, + {0x41418000}, {0x4141a000}, {0x4141c000}, {0x4141e000}, + {0x41420000}, {0x41422000}, {0x41424000}, {0x41426000}, + {0x41428000}, {0x4142a000}, {0x4142c000}, {0x4142e000}, + {0x41430000}, {0x41432000}, {0x41434000}, {0x41436000}, + {0x41438000}, {0x4143a000}, {0x4143c000}, {0x4143e000}, + {0x41440000}, {0x41442000}, {0x41444000}, {0x41446000}, + {0x41448000}, {0x4144a000}, {0x4144c000}, {0x4144e000}, + {0x41450000}, {0x41452000}, {0x41454000}, {0x41456000}, + {0x41458000}, {0x4145a000}, {0x4145c000}, {0x4145e000}, + {0x41460000}, {0x41462000}, {0x41464000}, {0x41466000}, + {0x41468000}, {0x4146a000}, {0x4146c000}, {0x4146e000}, + {0x41470000}, {0x41472000}, {0x41474000}, {0x41476000}, + {0x41478000}, {0x4147a000}, {0x4147c000}, {0x4147e000}, + {0x41480000}, {0x41482000}, {0x41484000}, {0x41486000}, + {0x41488000}, {0x4148a000}, {0x4148c000}, {0x4148e000}, + {0x41490000}, {0x41492000}, {0x41494000}, {0x41496000}, + {0x41498000}, {0x4149a000}, {0x4149c000}, {0x4149e000}, + {0x414a0000}, {0x414a2000}, {0x414a4000}, {0x414a6000}, + {0x414a8000}, {0x414aa000}, {0x414ac000}, {0x414ae000}, + {0x414b0000}, {0x414b2000}, {0x414b4000}, {0x414b6000}, + {0x414b8000}, {0x414ba000}, {0x414bc000}, {0x414be000}, + {0x414c0000}, {0x414c2000}, {0x414c4000}, {0x414c6000}, + {0x414c8000}, {0x414ca000}, {0x414cc000}, {0x414ce000}, + {0x414d0000}, {0x414d2000}, {0x414d4000}, {0x414d6000}, + {0x414d8000}, {0x414da000}, {0x414dc000}, {0x414de000}, + {0x414e0000}, {0x414e2000}, {0x414e4000}, {0x414e6000}, + {0x414e8000}, {0x414ea000}, {0x414ec000}, {0x414ee000}, + {0x414f0000}, {0x414f2000}, {0x414f4000}, {0x414f6000}, + {0x414f8000}, {0x414fa000}, {0x414fc000}, {0x414fe000}, + {0x41500000}, {0x41502000}, {0x41504000}, {0x41506000}, + {0x41508000}, {0x4150a000}, {0x4150c000}, {0x4150e000}, + {0x41510000}, {0x41512000}, {0x41514000}, {0x41516000}, + {0x41518000}, {0x4151a000}, {0x4151c000}, {0x4151e000}, + {0x41520000}, {0x41522000}, {0x41524000}, {0x41526000}, + {0x41528000}, {0x4152a000}, {0x4152c000}, {0x4152e000}, + {0x41530000}, {0x41532000}, {0x41534000}, {0x41536000}, + {0x41538000}, {0x4153a000}, {0x4153c000}, {0x4153e000}, + {0x41540000}, {0x41542000}, {0x41544000}, {0x41546000}, + {0x41548000}, {0x4154a000}, {0x4154c000}, {0x4154e000}, + {0x41550000}, {0x41552000}, {0x41554000}, {0x41556000}, + {0x41558000}, {0x4155a000}, {0x4155c000}, {0x4155e000}, + {0x41560000}, {0x41562000}, {0x41564000}, {0x41566000}, + {0x41568000}, {0x4156a000}, {0x4156c000}, {0x4156e000}, + {0x41570000}, {0x41572000}, {0x41574000}, {0x41576000}, + {0x41578000}, {0x4157a000}, {0x4157c000}, {0x4157e000}, + {0x41580000}, {0x41582000}, {0x41584000}, {0x41586000}, + {0x41588000}, {0x4158a000}, {0x4158c000}, {0x4158e000}, + {0x41590000}, {0x41592000}, {0x41594000}, {0x41596000}, + {0x41598000}, {0x4159a000}, {0x4159c000}, {0x4159e000}, + {0x415a0000}, {0x415a2000}, {0x415a4000}, {0x415a6000}, + {0x415a8000}, {0x415aa000}, {0x415ac000}, {0x415ae000}, + {0x415b0000}, {0x415b2000}, {0x415b4000}, {0x415b6000}, + {0x415b8000}, {0x415ba000}, {0x415bc000}, {0x415be000}, + {0x415c0000}, {0x415c2000}, {0x415c4000}, {0x415c6000}, + {0x415c8000}, {0x415ca000}, {0x415cc000}, {0x415ce000}, + {0x415d0000}, {0x415d2000}, {0x415d4000}, {0x415d6000}, + {0x415d8000}, {0x415da000}, {0x415dc000}, {0x415de000}, + {0x415e0000}, {0x415e2000}, {0x415e4000}, {0x415e6000}, + {0x415e8000}, {0x415ea000}, {0x415ec000}, {0x415ee000}, + {0x415f0000}, {0x415f2000}, {0x415f4000}, {0x415f6000}, + {0x415f8000}, {0x415fa000}, {0x415fc000}, {0x415fe000}, + {0x41600000}, {0x41602000}, {0x41604000}, {0x41606000}, + {0x41608000}, {0x4160a000}, {0x4160c000}, {0x4160e000}, + {0x41610000}, {0x41612000}, {0x41614000}, {0x41616000}, + {0x41618000}, {0x4161a000}, {0x4161c000}, {0x4161e000}, + {0x41620000}, {0x41622000}, {0x41624000}, {0x41626000}, + {0x41628000}, {0x4162a000}, {0x4162c000}, {0x4162e000}, + {0x41630000}, {0x41632000}, {0x41634000}, {0x41636000}, + {0x41638000}, {0x4163a000}, {0x4163c000}, {0x4163e000}, + {0x41640000}, {0x41642000}, {0x41644000}, {0x41646000}, + {0x41648000}, {0x4164a000}, {0x4164c000}, {0x4164e000}, + {0x41650000}, {0x41652000}, {0x41654000}, {0x41656000}, + {0x41658000}, {0x4165a000}, {0x4165c000}, {0x4165e000}, + {0x41660000}, {0x41662000}, {0x41664000}, {0x41666000}, + {0x41668000}, {0x4166a000}, {0x4166c000}, {0x4166e000}, + {0x41670000}, {0x41672000}, {0x41674000}, {0x41676000}, + {0x41678000}, {0x4167a000}, {0x4167c000}, {0x4167e000}, + {0x41680000}, {0x41682000}, {0x41684000}, {0x41686000}, + {0x41688000}, {0x4168a000}, {0x4168c000}, {0x4168e000}, + {0x41690000}, {0x41692000}, {0x41694000}, {0x41696000}, + {0x41698000}, {0x4169a000}, {0x4169c000}, {0x4169e000}, + {0x416a0000}, {0x416a2000}, {0x416a4000}, {0x416a6000}, + {0x416a8000}, {0x416aa000}, {0x416ac000}, {0x416ae000}, + {0x416b0000}, {0x416b2000}, {0x416b4000}, {0x416b6000}, + {0x416b8000}, {0x416ba000}, {0x416bc000}, {0x416be000}, + {0x416c0000}, {0x416c2000}, {0x416c4000}, {0x416c6000}, + {0x416c8000}, {0x416ca000}, {0x416cc000}, {0x416ce000}, + {0x416d0000}, {0x416d2000}, {0x416d4000}, {0x416d6000}, + {0x416d8000}, {0x416da000}, {0x416dc000}, {0x416de000}, + {0x416e0000}, {0x416e2000}, {0x416e4000}, {0x416e6000}, + {0x416e8000}, {0x416ea000}, {0x416ec000}, {0x416ee000}, + {0x416f0000}, {0x416f2000}, {0x416f4000}, {0x416f6000}, + {0x416f8000}, {0x416fa000}, {0x416fc000}, {0x416fe000}, + {0x41700000}, {0x41702000}, {0x41704000}, {0x41706000}, + {0x41708000}, {0x4170a000}, {0x4170c000}, {0x4170e000}, + {0x41710000}, {0x41712000}, {0x41714000}, {0x41716000}, + {0x41718000}, {0x4171a000}, {0x4171c000}, {0x4171e000}, + {0x41720000}, {0x41722000}, {0x41724000}, {0x41726000}, + {0x41728000}, {0x4172a000}, {0x4172c000}, {0x4172e000}, + {0x41730000}, {0x41732000}, {0x41734000}, {0x41736000}, + {0x41738000}, {0x4173a000}, {0x4173c000}, {0x4173e000}, + {0x41740000}, {0x41742000}, {0x41744000}, {0x41746000}, + {0x41748000}, {0x4174a000}, {0x4174c000}, {0x4174e000}, + {0x41750000}, {0x41752000}, {0x41754000}, {0x41756000}, + {0x41758000}, {0x4175a000}, {0x4175c000}, {0x4175e000}, + {0x41760000}, {0x41762000}, {0x41764000}, {0x41766000}, + {0x41768000}, {0x4176a000}, {0x4176c000}, {0x4176e000}, + {0x41770000}, {0x41772000}, {0x41774000}, {0x41776000}, + {0x41778000}, {0x4177a000}, {0x4177c000}, {0x4177e000}, + {0x41780000}, {0x41782000}, {0x41784000}, {0x41786000}, + {0x41788000}, {0x4178a000}, {0x4178c000}, {0x4178e000}, + {0x41790000}, {0x41792000}, {0x41794000}, {0x41796000}, + {0x41798000}, {0x4179a000}, {0x4179c000}, {0x4179e000}, + {0x417a0000}, {0x417a2000}, {0x417a4000}, {0x417a6000}, + {0x417a8000}, {0x417aa000}, {0x417ac000}, {0x417ae000}, + {0x417b0000}, {0x417b2000}, {0x417b4000}, {0x417b6000}, + {0x417b8000}, {0x417ba000}, {0x417bc000}, {0x417be000}, + {0x417c0000}, {0x417c2000}, {0x417c4000}, {0x417c6000}, + {0x417c8000}, {0x417ca000}, {0x417cc000}, {0x417ce000}, + {0x417d0000}, {0x417d2000}, {0x417d4000}, {0x417d6000}, + {0x417d8000}, {0x417da000}, {0x417dc000}, {0x417de000}, + {0x417e0000}, {0x417e2000}, {0x417e4000}, {0x417e6000}, + {0x417e8000}, {0x417ea000}, {0x417ec000}, {0x417ee000}, + {0x417f0000}, {0x417f2000}, {0x417f4000}, {0x417f6000}, + {0x417f8000}, {0x417fa000}, {0x417fc000}, {0x417fe000}, + {0x41800000}, {0x41802000}, {0x41804000}, {0x41806000}, + {0x41808000}, {0x4180a000}, {0x4180c000}, {0x4180e000}, + {0x41810000}, {0x41812000}, {0x41814000}, {0x41816000}, + {0x41818000}, {0x4181a000}, {0x4181c000}, {0x4181e000}, + {0x41820000}, {0x41822000}, {0x41824000}, {0x41826000}, + {0x41828000}, {0x4182a000}, {0x4182c000}, {0x4182e000}, + {0x41830000}, {0x41832000}, {0x41834000}, {0x41836000}, + {0x41838000}, {0x4183a000}, {0x4183c000}, {0x4183e000}, + {0x41840000}, {0x41842000}, {0x41844000}, {0x41846000}, + {0x41848000}, {0x4184a000}, {0x4184c000}, {0x4184e000}, + {0x41850000}, {0x41852000}, {0x41854000}, {0x41856000}, + {0x41858000}, {0x4185a000}, {0x4185c000}, {0x4185e000}, + {0x41860000}, {0x41862000}, {0x41864000}, {0x41866000}, + {0x41868000}, {0x4186a000}, {0x4186c000}, {0x4186e000}, + {0x41870000}, {0x41872000}, {0x41874000}, {0x41876000}, + {0x41878000}, {0x4187a000}, {0x4187c000}, {0x4187e000}, + {0x41880000}, {0x41882000}, {0x41884000}, {0x41886000}, + {0x41888000}, {0x4188a000}, {0x4188c000}, {0x4188e000}, + {0x41890000}, {0x41892000}, {0x41894000}, {0x41896000}, + {0x41898000}, {0x4189a000}, {0x4189c000}, {0x4189e000}, + {0x418a0000}, {0x418a2000}, {0x418a4000}, {0x418a6000}, + {0x418a8000}, {0x418aa000}, {0x418ac000}, {0x418ae000}, + {0x418b0000}, {0x418b2000}, {0x418b4000}, {0x418b6000}, + {0x418b8000}, {0x418ba000}, {0x418bc000}, {0x418be000}, + {0x418c0000}, {0x418c2000}, {0x418c4000}, {0x418c6000}, + {0x418c8000}, {0x418ca000}, {0x418cc000}, {0x418ce000}, + {0x418d0000}, {0x418d2000}, {0x418d4000}, {0x418d6000}, + {0x418d8000}, {0x418da000}, {0x418dc000}, {0x418de000}, + {0x418e0000}, {0x418e2000}, {0x418e4000}, {0x418e6000}, + {0x418e8000}, {0x418ea000}, {0x418ec000}, {0x418ee000}, + {0x418f0000}, {0x418f2000}, {0x418f4000}, {0x418f6000}, + {0x418f8000}, {0x418fa000}, {0x418fc000}, {0x418fe000}, + {0x41900000}, {0x41902000}, {0x41904000}, {0x41906000}, + {0x41908000}, {0x4190a000}, {0x4190c000}, {0x4190e000}, + {0x41910000}, {0x41912000}, {0x41914000}, {0x41916000}, + {0x41918000}, {0x4191a000}, {0x4191c000}, {0x4191e000}, + {0x41920000}, {0x41922000}, {0x41924000}, {0x41926000}, + {0x41928000}, {0x4192a000}, {0x4192c000}, {0x4192e000}, + {0x41930000}, {0x41932000}, {0x41934000}, {0x41936000}, + {0x41938000}, {0x4193a000}, {0x4193c000}, {0x4193e000}, + {0x41940000}, {0x41942000}, {0x41944000}, {0x41946000}, + {0x41948000}, {0x4194a000}, {0x4194c000}, {0x4194e000}, + {0x41950000}, {0x41952000}, {0x41954000}, {0x41956000}, + {0x41958000}, {0x4195a000}, {0x4195c000}, {0x4195e000}, + {0x41960000}, {0x41962000}, {0x41964000}, {0x41966000}, + {0x41968000}, {0x4196a000}, {0x4196c000}, {0x4196e000}, + {0x41970000}, {0x41972000}, {0x41974000}, {0x41976000}, + {0x41978000}, {0x4197a000}, {0x4197c000}, {0x4197e000}, + {0x41980000}, {0x41982000}, {0x41984000}, {0x41986000}, + {0x41988000}, {0x4198a000}, {0x4198c000}, {0x4198e000}, + {0x41990000}, {0x41992000}, {0x41994000}, {0x41996000}, + {0x41998000}, {0x4199a000}, {0x4199c000}, {0x4199e000}, + {0x419a0000}, {0x419a2000}, {0x419a4000}, {0x419a6000}, + {0x419a8000}, {0x419aa000}, {0x419ac000}, {0x419ae000}, + {0x419b0000}, {0x419b2000}, {0x419b4000}, {0x419b6000}, + {0x419b8000}, {0x419ba000}, {0x419bc000}, {0x419be000}, + {0x419c0000}, {0x419c2000}, {0x419c4000}, {0x419c6000}, + {0x419c8000}, {0x419ca000}, {0x419cc000}, {0x419ce000}, + {0x419d0000}, {0x419d2000}, {0x419d4000}, {0x419d6000}, + {0x419d8000}, {0x419da000}, {0x419dc000}, {0x419de000}, + {0x419e0000}, {0x419e2000}, {0x419e4000}, {0x419e6000}, + {0x419e8000}, {0x419ea000}, {0x419ec000}, {0x419ee000}, + {0x419f0000}, {0x419f2000}, {0x419f4000}, {0x419f6000}, + {0x419f8000}, {0x419fa000}, {0x419fc000}, {0x419fe000}, + {0x41a00000}, {0x41a02000}, {0x41a04000}, {0x41a06000}, + {0x41a08000}, {0x41a0a000}, {0x41a0c000}, {0x41a0e000}, + {0x41a10000}, {0x41a12000}, {0x41a14000}, {0x41a16000}, + {0x41a18000}, {0x41a1a000}, {0x41a1c000}, {0x41a1e000}, + {0x41a20000}, {0x41a22000}, {0x41a24000}, {0x41a26000}, + {0x41a28000}, {0x41a2a000}, {0x41a2c000}, {0x41a2e000}, + {0x41a30000}, {0x41a32000}, {0x41a34000}, {0x41a36000}, + {0x41a38000}, {0x41a3a000}, {0x41a3c000}, {0x41a3e000}, + {0x41a40000}, {0x41a42000}, {0x41a44000}, {0x41a46000}, + {0x41a48000}, {0x41a4a000}, {0x41a4c000}, {0x41a4e000}, + {0x41a50000}, {0x41a52000}, {0x41a54000}, {0x41a56000}, + {0x41a58000}, {0x41a5a000}, {0x41a5c000}, {0x41a5e000}, + {0x41a60000}, {0x41a62000}, {0x41a64000}, {0x41a66000}, + {0x41a68000}, {0x41a6a000}, {0x41a6c000}, {0x41a6e000}, + {0x41a70000}, {0x41a72000}, {0x41a74000}, {0x41a76000}, + {0x41a78000}, {0x41a7a000}, {0x41a7c000}, {0x41a7e000}, + {0x41a80000}, {0x41a82000}, {0x41a84000}, {0x41a86000}, + {0x41a88000}, {0x41a8a000}, {0x41a8c000}, {0x41a8e000}, + {0x41a90000}, {0x41a92000}, {0x41a94000}, {0x41a96000}, + {0x41a98000}, {0x41a9a000}, {0x41a9c000}, {0x41a9e000}, + {0x41aa0000}, {0x41aa2000}, {0x41aa4000}, {0x41aa6000}, + {0x41aa8000}, {0x41aaa000}, {0x41aac000}, {0x41aae000}, + {0x41ab0000}, {0x41ab2000}, {0x41ab4000}, {0x41ab6000}, + {0x41ab8000}, {0x41aba000}, {0x41abc000}, {0x41abe000}, + {0x41ac0000}, {0x41ac2000}, {0x41ac4000}, {0x41ac6000}, + {0x41ac8000}, {0x41aca000}, {0x41acc000}, {0x41ace000}, + {0x41ad0000}, {0x41ad2000}, {0x41ad4000}, {0x41ad6000}, + {0x41ad8000}, {0x41ada000}, {0x41adc000}, {0x41ade000}, + {0x41ae0000}, {0x41ae2000}, {0x41ae4000}, {0x41ae6000}, + {0x41ae8000}, {0x41aea000}, {0x41aec000}, {0x41aee000}, + {0x41af0000}, {0x41af2000}, {0x41af4000}, {0x41af6000}, + {0x41af8000}, {0x41afa000}, {0x41afc000}, {0x41afe000}, + {0x41b00000}, {0x41b02000}, {0x41b04000}, {0x41b06000}, + {0x41b08000}, {0x41b0a000}, {0x41b0c000}, {0x41b0e000}, + {0x41b10000}, {0x41b12000}, {0x41b14000}, {0x41b16000}, + {0x41b18000}, {0x41b1a000}, {0x41b1c000}, {0x41b1e000}, + {0x41b20000}, {0x41b22000}, {0x41b24000}, {0x41b26000}, + {0x41b28000}, {0x41b2a000}, {0x41b2c000}, {0x41b2e000}, + {0x41b30000}, {0x41b32000}, {0x41b34000}, {0x41b36000}, + {0x41b38000}, {0x41b3a000}, {0x41b3c000}, {0x41b3e000}, + {0x41b40000}, {0x41b42000}, {0x41b44000}, {0x41b46000}, + {0x41b48000}, {0x41b4a000}, {0x41b4c000}, {0x41b4e000}, + {0x41b50000}, {0x41b52000}, {0x41b54000}, {0x41b56000}, + {0x41b58000}, {0x41b5a000}, {0x41b5c000}, {0x41b5e000}, + {0x41b60000}, {0x41b62000}, {0x41b64000}, {0x41b66000}, + {0x41b68000}, {0x41b6a000}, {0x41b6c000}, {0x41b6e000}, + {0x41b70000}, {0x41b72000}, {0x41b74000}, {0x41b76000}, + {0x41b78000}, {0x41b7a000}, {0x41b7c000}, {0x41b7e000}, + {0x41b80000}, {0x41b82000}, {0x41b84000}, {0x41b86000}, + {0x41b88000}, {0x41b8a000}, {0x41b8c000}, {0x41b8e000}, + {0x41b90000}, {0x41b92000}, {0x41b94000}, {0x41b96000}, + {0x41b98000}, {0x41b9a000}, {0x41b9c000}, {0x41b9e000}, + {0x41ba0000}, {0x41ba2000}, {0x41ba4000}, {0x41ba6000}, + {0x41ba8000}, {0x41baa000}, {0x41bac000}, {0x41bae000}, + {0x41bb0000}, {0x41bb2000}, {0x41bb4000}, {0x41bb6000}, + {0x41bb8000}, {0x41bba000}, {0x41bbc000}, {0x41bbe000}, + {0x41bc0000}, {0x41bc2000}, {0x41bc4000}, {0x41bc6000}, + {0x41bc8000}, {0x41bca000}, {0x41bcc000}, {0x41bce000}, + {0x41bd0000}, {0x41bd2000}, {0x41bd4000}, {0x41bd6000}, + {0x41bd8000}, {0x41bda000}, {0x41bdc000}, {0x41bde000}, + {0x41be0000}, {0x41be2000}, {0x41be4000}, {0x41be6000}, + {0x41be8000}, {0x41bea000}, {0x41bec000}, {0x41bee000}, + {0x41bf0000}, {0x41bf2000}, {0x41bf4000}, {0x41bf6000}, + {0x41bf8000}, {0x41bfa000}, {0x41bfc000}, {0x41bfe000}, + {0x41c00000}, {0x41c02000}, {0x41c04000}, {0x41c06000}, + {0x41c08000}, {0x41c0a000}, {0x41c0c000}, {0x41c0e000}, + {0x41c10000}, {0x41c12000}, {0x41c14000}, {0x41c16000}, + {0x41c18000}, {0x41c1a000}, {0x41c1c000}, {0x41c1e000}, + {0x41c20000}, {0x41c22000}, {0x41c24000}, {0x41c26000}, + {0x41c28000}, {0x41c2a000}, {0x41c2c000}, {0x41c2e000}, + {0x41c30000}, {0x41c32000}, {0x41c34000}, {0x41c36000}, + {0x41c38000}, {0x41c3a000}, {0x41c3c000}, {0x41c3e000}, + {0x41c40000}, {0x41c42000}, {0x41c44000}, {0x41c46000}, + {0x41c48000}, {0x41c4a000}, {0x41c4c000}, {0x41c4e000}, + {0x41c50000}, {0x41c52000}, {0x41c54000}, {0x41c56000}, + {0x41c58000}, {0x41c5a000}, {0x41c5c000}, {0x41c5e000}, + {0x41c60000}, {0x41c62000}, {0x41c64000}, {0x41c66000}, + {0x41c68000}, {0x41c6a000}, {0x41c6c000}, {0x41c6e000}, + {0x41c70000}, {0x41c72000}, {0x41c74000}, {0x41c76000}, + {0x41c78000}, {0x41c7a000}, {0x41c7c000}, {0x41c7e000}, + {0x41c80000}, {0x41c82000}, {0x41c84000}, {0x41c86000}, + {0x41c88000}, {0x41c8a000}, {0x41c8c000}, {0x41c8e000}, + {0x41c90000}, {0x41c92000}, {0x41c94000}, {0x41c96000}, + {0x41c98000}, {0x41c9a000}, {0x41c9c000}, {0x41c9e000}, + {0x41ca0000}, {0x41ca2000}, {0x41ca4000}, {0x41ca6000}, + {0x41ca8000}, {0x41caa000}, {0x41cac000}, {0x41cae000}, + {0x41cb0000}, {0x41cb2000}, {0x41cb4000}, {0x41cb6000}, + {0x41cb8000}, {0x41cba000}, {0x41cbc000}, {0x41cbe000}, + {0x41cc0000}, {0x41cc2000}, {0x41cc4000}, {0x41cc6000}, + {0x41cc8000}, {0x41cca000}, {0x41ccc000}, {0x41cce000}, + {0x41cd0000}, {0x41cd2000}, {0x41cd4000}, {0x41cd6000}, + {0x41cd8000}, {0x41cda000}, {0x41cdc000}, {0x41cde000}, + {0x41ce0000}, {0x41ce2000}, {0x41ce4000}, {0x41ce6000}, + {0x41ce8000}, {0x41cea000}, {0x41cec000}, {0x41cee000}, + {0x41cf0000}, {0x41cf2000}, {0x41cf4000}, {0x41cf6000}, + {0x41cf8000}, {0x41cfa000}, {0x41cfc000}, {0x41cfe000}, + {0x41d00000}, {0x41d02000}, {0x41d04000}, {0x41d06000}, + {0x41d08000}, {0x41d0a000}, {0x41d0c000}, {0x41d0e000}, + {0x41d10000}, {0x41d12000}, {0x41d14000}, {0x41d16000}, + {0x41d18000}, {0x41d1a000}, {0x41d1c000}, {0x41d1e000}, + {0x41d20000}, {0x41d22000}, {0x41d24000}, {0x41d26000}, + {0x41d28000}, {0x41d2a000}, {0x41d2c000}, {0x41d2e000}, + {0x41d30000}, {0x41d32000}, {0x41d34000}, {0x41d36000}, + {0x41d38000}, {0x41d3a000}, {0x41d3c000}, {0x41d3e000}, + {0x41d40000}, {0x41d42000}, {0x41d44000}, {0x41d46000}, + {0x41d48000}, {0x41d4a000}, {0x41d4c000}, {0x41d4e000}, + {0x41d50000}, {0x41d52000}, {0x41d54000}, {0x41d56000}, + {0x41d58000}, {0x41d5a000}, {0x41d5c000}, {0x41d5e000}, + {0x41d60000}, {0x41d62000}, {0x41d64000}, {0x41d66000}, + {0x41d68000}, {0x41d6a000}, {0x41d6c000}, {0x41d6e000}, + {0x41d70000}, {0x41d72000}, {0x41d74000}, {0x41d76000}, + {0x41d78000}, {0x41d7a000}, {0x41d7c000}, {0x41d7e000}, + {0x41d80000}, {0x41d82000}, {0x41d84000}, {0x41d86000}, + {0x41d88000}, {0x41d8a000}, {0x41d8c000}, {0x41d8e000}, + {0x41d90000}, {0x41d92000}, {0x41d94000}, {0x41d96000}, + {0x41d98000}, {0x41d9a000}, {0x41d9c000}, {0x41d9e000}, + {0x41da0000}, {0x41da2000}, {0x41da4000}, {0x41da6000}, + {0x41da8000}, {0x41daa000}, {0x41dac000}, {0x41dae000}, + {0x41db0000}, {0x41db2000}, {0x41db4000}, {0x41db6000}, + {0x41db8000}, {0x41dba000}, {0x41dbc000}, {0x41dbe000}, + {0x41dc0000}, {0x41dc2000}, {0x41dc4000}, {0x41dc6000}, + {0x41dc8000}, {0x41dca000}, {0x41dcc000}, {0x41dce000}, + {0x41dd0000}, {0x41dd2000}, {0x41dd4000}, {0x41dd6000}, + {0x41dd8000}, {0x41dda000}, {0x41ddc000}, {0x41dde000}, + {0x41de0000}, {0x41de2000}, {0x41de4000}, {0x41de6000}, + {0x41de8000}, {0x41dea000}, {0x41dec000}, {0x41dee000}, + {0x41df0000}, {0x41df2000}, {0x41df4000}, {0x41df6000}, + {0x41df8000}, {0x41dfa000}, {0x41dfc000}, {0x41dfe000}, + {0x41e00000}, {0x41e02000}, {0x41e04000}, {0x41e06000}, + {0x41e08000}, {0x41e0a000}, {0x41e0c000}, {0x41e0e000}, + {0x41e10000}, {0x41e12000}, {0x41e14000}, {0x41e16000}, + {0x41e18000}, {0x41e1a000}, {0x41e1c000}, {0x41e1e000}, + {0x41e20000}, {0x41e22000}, {0x41e24000}, {0x41e26000}, + {0x41e28000}, {0x41e2a000}, {0x41e2c000}, {0x41e2e000}, + {0x41e30000}, {0x41e32000}, {0x41e34000}, {0x41e36000}, + {0x41e38000}, {0x41e3a000}, {0x41e3c000}, {0x41e3e000}, + {0x41e40000}, {0x41e42000}, {0x41e44000}, {0x41e46000}, + {0x41e48000}, {0x41e4a000}, {0x41e4c000}, {0x41e4e000}, + {0x41e50000}, {0x41e52000}, {0x41e54000}, {0x41e56000}, + {0x41e58000}, {0x41e5a000}, {0x41e5c000}, {0x41e5e000}, + {0x41e60000}, {0x41e62000}, {0x41e64000}, {0x41e66000}, + {0x41e68000}, {0x41e6a000}, {0x41e6c000}, {0x41e6e000}, + {0x41e70000}, {0x41e72000}, {0x41e74000}, {0x41e76000}, + {0x41e78000}, {0x41e7a000}, {0x41e7c000}, {0x41e7e000}, + {0x41e80000}, {0x41e82000}, {0x41e84000}, {0x41e86000}, + {0x41e88000}, {0x41e8a000}, {0x41e8c000}, {0x41e8e000}, + {0x41e90000}, {0x41e92000}, {0x41e94000}, {0x41e96000}, + {0x41e98000}, {0x41e9a000}, {0x41e9c000}, {0x41e9e000}, + {0x41ea0000}, {0x41ea2000}, {0x41ea4000}, {0x41ea6000}, + {0x41ea8000}, {0x41eaa000}, {0x41eac000}, {0x41eae000}, + {0x41eb0000}, {0x41eb2000}, {0x41eb4000}, {0x41eb6000}, + {0x41eb8000}, {0x41eba000}, {0x41ebc000}, {0x41ebe000}, + {0x41ec0000}, {0x41ec2000}, {0x41ec4000}, {0x41ec6000}, + {0x41ec8000}, {0x41eca000}, {0x41ecc000}, {0x41ece000}, + {0x41ed0000}, {0x41ed2000}, {0x41ed4000}, {0x41ed6000}, + {0x41ed8000}, {0x41eda000}, {0x41edc000}, {0x41ede000}, + {0x41ee0000}, {0x41ee2000}, {0x41ee4000}, {0x41ee6000}, + {0x41ee8000}, {0x41eea000}, {0x41eec000}, {0x41eee000}, + {0x41ef0000}, {0x41ef2000}, {0x41ef4000}, {0x41ef6000}, + {0x41ef8000}, {0x41efa000}, {0x41efc000}, {0x41efe000}, + {0x41f00000}, {0x41f02000}, {0x41f04000}, {0x41f06000}, + {0x41f08000}, {0x41f0a000}, {0x41f0c000}, {0x41f0e000}, + {0x41f10000}, {0x41f12000}, {0x41f14000}, {0x41f16000}, + {0x41f18000}, {0x41f1a000}, {0x41f1c000}, {0x41f1e000}, + {0x41f20000}, {0x41f22000}, {0x41f24000}, {0x41f26000}, + {0x41f28000}, {0x41f2a000}, {0x41f2c000}, {0x41f2e000}, + {0x41f30000}, {0x41f32000}, {0x41f34000}, {0x41f36000}, + {0x41f38000}, {0x41f3a000}, {0x41f3c000}, {0x41f3e000}, + {0x41f40000}, {0x41f42000}, {0x41f44000}, {0x41f46000}, + {0x41f48000}, {0x41f4a000}, {0x41f4c000}, {0x41f4e000}, + {0x41f50000}, {0x41f52000}, {0x41f54000}, {0x41f56000}, + {0x41f58000}, {0x41f5a000}, {0x41f5c000}, {0x41f5e000}, + {0x41f60000}, {0x41f62000}, {0x41f64000}, {0x41f66000}, + {0x41f68000}, {0x41f6a000}, {0x41f6c000}, {0x41f6e000}, + {0x41f70000}, {0x41f72000}, {0x41f74000}, {0x41f76000}, + {0x41f78000}, {0x41f7a000}, {0x41f7c000}, {0x41f7e000}, + {0x41f80000}, {0x41f82000}, {0x41f84000}, {0x41f86000}, + {0x41f88000}, {0x41f8a000}, {0x41f8c000}, {0x41f8e000}, + {0x41f90000}, {0x41f92000}, {0x41f94000}, {0x41f96000}, + {0x41f98000}, {0x41f9a000}, {0x41f9c000}, {0x41f9e000}, + {0x41fa0000}, {0x41fa2000}, {0x41fa4000}, {0x41fa6000}, + {0x41fa8000}, {0x41faa000}, {0x41fac000}, {0x41fae000}, + {0x41fb0000}, {0x41fb2000}, {0x41fb4000}, {0x41fb6000}, + {0x41fb8000}, {0x41fba000}, {0x41fbc000}, {0x41fbe000}, + {0x41fc0000}, {0x41fc2000}, {0x41fc4000}, {0x41fc6000}, + {0x41fc8000}, {0x41fca000}, {0x41fcc000}, {0x41fce000}, + {0x41fd0000}, {0x41fd2000}, {0x41fd4000}, {0x41fd6000}, + {0x41fd8000}, {0x41fda000}, {0x41fdc000}, {0x41fde000}, + {0x41fe0000}, {0x41fe2000}, {0x41fe4000}, {0x41fe6000}, + {0x41fe8000}, {0x41fea000}, {0x41fec000}, {0x41fee000}, + {0x41ff0000}, {0x41ff2000}, {0x41ff4000}, {0x41ff6000}, + {0x41ff8000}, {0x41ffa000}, {0x41ffc000}, {0x41ffe000}, + {0x42000000}, {0x42002000}, {0x42004000}, {0x42006000}, + {0x42008000}, {0x4200a000}, {0x4200c000}, {0x4200e000}, + {0x42010000}, {0x42012000}, {0x42014000}, {0x42016000}, + {0x42018000}, {0x4201a000}, {0x4201c000}, {0x4201e000}, + {0x42020000}, {0x42022000}, {0x42024000}, {0x42026000}, + {0x42028000}, {0x4202a000}, {0x4202c000}, {0x4202e000}, + {0x42030000}, {0x42032000}, {0x42034000}, {0x42036000}, + {0x42038000}, {0x4203a000}, {0x4203c000}, {0x4203e000}, + {0x42040000}, {0x42042000}, {0x42044000}, {0x42046000}, + {0x42048000}, {0x4204a000}, {0x4204c000}, {0x4204e000}, + {0x42050000}, {0x42052000}, {0x42054000}, {0x42056000}, + {0x42058000}, {0x4205a000}, {0x4205c000}, {0x4205e000}, + {0x42060000}, {0x42062000}, {0x42064000}, {0x42066000}, + {0x42068000}, {0x4206a000}, {0x4206c000}, {0x4206e000}, + {0x42070000}, {0x42072000}, {0x42074000}, {0x42076000}, + {0x42078000}, {0x4207a000}, {0x4207c000}, {0x4207e000}, + {0x42080000}, {0x42082000}, {0x42084000}, {0x42086000}, + {0x42088000}, {0x4208a000}, {0x4208c000}, {0x4208e000}, + {0x42090000}, {0x42092000}, {0x42094000}, {0x42096000}, + {0x42098000}, {0x4209a000}, {0x4209c000}, {0x4209e000}, + {0x420a0000}, {0x420a2000}, {0x420a4000}, {0x420a6000}, + {0x420a8000}, {0x420aa000}, {0x420ac000}, {0x420ae000}, + {0x420b0000}, {0x420b2000}, {0x420b4000}, {0x420b6000}, + {0x420b8000}, {0x420ba000}, {0x420bc000}, {0x420be000}, + {0x420c0000}, {0x420c2000}, {0x420c4000}, {0x420c6000}, + {0x420c8000}, {0x420ca000}, {0x420cc000}, {0x420ce000}, + {0x420d0000}, {0x420d2000}, {0x420d4000}, {0x420d6000}, + {0x420d8000}, {0x420da000}, {0x420dc000}, {0x420de000}, + {0x420e0000}, {0x420e2000}, {0x420e4000}, {0x420e6000}, + {0x420e8000}, {0x420ea000}, {0x420ec000}, {0x420ee000}, + {0x420f0000}, {0x420f2000}, {0x420f4000}, {0x420f6000}, + {0x420f8000}, {0x420fa000}, {0x420fc000}, {0x420fe000}, + {0x42100000}, {0x42102000}, {0x42104000}, {0x42106000}, + {0x42108000}, {0x4210a000}, {0x4210c000}, {0x4210e000}, + {0x42110000}, {0x42112000}, {0x42114000}, {0x42116000}, + {0x42118000}, {0x4211a000}, {0x4211c000}, {0x4211e000}, + {0x42120000}, {0x42122000}, {0x42124000}, {0x42126000}, + {0x42128000}, {0x4212a000}, {0x4212c000}, {0x4212e000}, + {0x42130000}, {0x42132000}, {0x42134000}, {0x42136000}, + {0x42138000}, {0x4213a000}, {0x4213c000}, {0x4213e000}, + {0x42140000}, {0x42142000}, {0x42144000}, {0x42146000}, + {0x42148000}, {0x4214a000}, {0x4214c000}, {0x4214e000}, + {0x42150000}, {0x42152000}, {0x42154000}, {0x42156000}, + {0x42158000}, {0x4215a000}, {0x4215c000}, {0x4215e000}, + {0x42160000}, {0x42162000}, {0x42164000}, {0x42166000}, + {0x42168000}, {0x4216a000}, {0x4216c000}, {0x4216e000}, + {0x42170000}, {0x42172000}, {0x42174000}, {0x42176000}, + {0x42178000}, {0x4217a000}, {0x4217c000}, {0x4217e000}, + {0x42180000}, {0x42182000}, {0x42184000}, {0x42186000}, + {0x42188000}, {0x4218a000}, {0x4218c000}, {0x4218e000}, + {0x42190000}, {0x42192000}, {0x42194000}, {0x42196000}, + {0x42198000}, {0x4219a000}, {0x4219c000}, {0x4219e000}, + {0x421a0000}, {0x421a2000}, {0x421a4000}, {0x421a6000}, + {0x421a8000}, {0x421aa000}, {0x421ac000}, {0x421ae000}, + {0x421b0000}, {0x421b2000}, {0x421b4000}, {0x421b6000}, + {0x421b8000}, {0x421ba000}, {0x421bc000}, {0x421be000}, + {0x421c0000}, {0x421c2000}, {0x421c4000}, {0x421c6000}, + {0x421c8000}, {0x421ca000}, {0x421cc000}, {0x421ce000}, + {0x421d0000}, {0x421d2000}, {0x421d4000}, {0x421d6000}, + {0x421d8000}, {0x421da000}, {0x421dc000}, {0x421de000}, + {0x421e0000}, {0x421e2000}, {0x421e4000}, {0x421e6000}, + {0x421e8000}, {0x421ea000}, {0x421ec000}, {0x421ee000}, + {0x421f0000}, {0x421f2000}, {0x421f4000}, {0x421f6000}, + {0x421f8000}, {0x421fa000}, {0x421fc000}, {0x421fe000}, + {0x42200000}, {0x42202000}, {0x42204000}, {0x42206000}, + {0x42208000}, {0x4220a000}, {0x4220c000}, {0x4220e000}, + {0x42210000}, {0x42212000}, {0x42214000}, {0x42216000}, + {0x42218000}, {0x4221a000}, {0x4221c000}, {0x4221e000}, + {0x42220000}, {0x42222000}, {0x42224000}, {0x42226000}, + {0x42228000}, {0x4222a000}, {0x4222c000}, {0x4222e000}, + {0x42230000}, {0x42232000}, {0x42234000}, {0x42236000}, + {0x42238000}, {0x4223a000}, {0x4223c000}, {0x4223e000}, + {0x42240000}, {0x42242000}, {0x42244000}, {0x42246000}, + {0x42248000}, {0x4224a000}, {0x4224c000}, {0x4224e000}, + {0x42250000}, {0x42252000}, {0x42254000}, {0x42256000}, + {0x42258000}, {0x4225a000}, {0x4225c000}, {0x4225e000}, + {0x42260000}, {0x42262000}, {0x42264000}, {0x42266000}, + {0x42268000}, {0x4226a000}, {0x4226c000}, {0x4226e000}, + {0x42270000}, {0x42272000}, {0x42274000}, {0x42276000}, + {0x42278000}, {0x4227a000}, {0x4227c000}, {0x4227e000}, + {0x42280000}, {0x42282000}, {0x42284000}, {0x42286000}, + {0x42288000}, {0x4228a000}, {0x4228c000}, {0x4228e000}, + {0x42290000}, {0x42292000}, {0x42294000}, {0x42296000}, + {0x42298000}, {0x4229a000}, {0x4229c000}, {0x4229e000}, + {0x422a0000}, {0x422a2000}, {0x422a4000}, {0x422a6000}, + {0x422a8000}, {0x422aa000}, {0x422ac000}, {0x422ae000}, + {0x422b0000}, {0x422b2000}, {0x422b4000}, {0x422b6000}, + {0x422b8000}, {0x422ba000}, {0x422bc000}, {0x422be000}, + {0x422c0000}, {0x422c2000}, {0x422c4000}, {0x422c6000}, + {0x422c8000}, {0x422ca000}, {0x422cc000}, {0x422ce000}, + {0x422d0000}, {0x422d2000}, {0x422d4000}, {0x422d6000}, + {0x422d8000}, {0x422da000}, {0x422dc000}, {0x422de000}, + {0x422e0000}, {0x422e2000}, {0x422e4000}, {0x422e6000}, + {0x422e8000}, {0x422ea000}, {0x422ec000}, {0x422ee000}, + {0x422f0000}, {0x422f2000}, {0x422f4000}, {0x422f6000}, + {0x422f8000}, {0x422fa000}, {0x422fc000}, {0x422fe000}, + {0x42300000}, {0x42302000}, {0x42304000}, {0x42306000}, + {0x42308000}, {0x4230a000}, {0x4230c000}, {0x4230e000}, + {0x42310000}, {0x42312000}, {0x42314000}, {0x42316000}, + {0x42318000}, {0x4231a000}, {0x4231c000}, {0x4231e000}, + {0x42320000}, {0x42322000}, {0x42324000}, {0x42326000}, + {0x42328000}, {0x4232a000}, {0x4232c000}, {0x4232e000}, + {0x42330000}, {0x42332000}, {0x42334000}, {0x42336000}, + {0x42338000}, {0x4233a000}, {0x4233c000}, {0x4233e000}, + {0x42340000}, {0x42342000}, {0x42344000}, {0x42346000}, + {0x42348000}, {0x4234a000}, {0x4234c000}, {0x4234e000}, + {0x42350000}, {0x42352000}, {0x42354000}, {0x42356000}, + {0x42358000}, {0x4235a000}, {0x4235c000}, {0x4235e000}, + {0x42360000}, {0x42362000}, {0x42364000}, {0x42366000}, + {0x42368000}, {0x4236a000}, {0x4236c000}, {0x4236e000}, + {0x42370000}, {0x42372000}, {0x42374000}, {0x42376000}, + {0x42378000}, {0x4237a000}, {0x4237c000}, {0x4237e000}, + {0x42380000}, {0x42382000}, {0x42384000}, {0x42386000}, + {0x42388000}, {0x4238a000}, {0x4238c000}, {0x4238e000}, + {0x42390000}, {0x42392000}, {0x42394000}, {0x42396000}, + {0x42398000}, {0x4239a000}, {0x4239c000}, {0x4239e000}, + {0x423a0000}, {0x423a2000}, {0x423a4000}, {0x423a6000}, + {0x423a8000}, {0x423aa000}, {0x423ac000}, {0x423ae000}, + {0x423b0000}, {0x423b2000}, {0x423b4000}, {0x423b6000}, + {0x423b8000}, {0x423ba000}, {0x423bc000}, {0x423be000}, + {0x423c0000}, {0x423c2000}, {0x423c4000}, {0x423c6000}, + {0x423c8000}, {0x423ca000}, {0x423cc000}, {0x423ce000}, + {0x423d0000}, {0x423d2000}, {0x423d4000}, {0x423d6000}, + {0x423d8000}, {0x423da000}, {0x423dc000}, {0x423de000}, + {0x423e0000}, {0x423e2000}, {0x423e4000}, {0x423e6000}, + {0x423e8000}, {0x423ea000}, {0x423ec000}, {0x423ee000}, + {0x423f0000}, {0x423f2000}, {0x423f4000}, {0x423f6000}, + {0x423f8000}, {0x423fa000}, {0x423fc000}, {0x423fe000}, + {0x42400000}, {0x42402000}, {0x42404000}, {0x42406000}, + {0x42408000}, {0x4240a000}, {0x4240c000}, {0x4240e000}, + {0x42410000}, {0x42412000}, {0x42414000}, {0x42416000}, + {0x42418000}, {0x4241a000}, {0x4241c000}, {0x4241e000}, + {0x42420000}, {0x42422000}, {0x42424000}, {0x42426000}, + {0x42428000}, {0x4242a000}, {0x4242c000}, {0x4242e000}, + {0x42430000}, {0x42432000}, {0x42434000}, {0x42436000}, + {0x42438000}, {0x4243a000}, {0x4243c000}, {0x4243e000}, + {0x42440000}, {0x42442000}, {0x42444000}, {0x42446000}, + {0x42448000}, {0x4244a000}, {0x4244c000}, {0x4244e000}, + {0x42450000}, {0x42452000}, {0x42454000}, {0x42456000}, + {0x42458000}, {0x4245a000}, {0x4245c000}, {0x4245e000}, + {0x42460000}, {0x42462000}, {0x42464000}, {0x42466000}, + {0x42468000}, {0x4246a000}, {0x4246c000}, {0x4246e000}, + {0x42470000}, {0x42472000}, {0x42474000}, {0x42476000}, + {0x42478000}, {0x4247a000}, {0x4247c000}, {0x4247e000}, + {0x42480000}, {0x42482000}, {0x42484000}, {0x42486000}, + {0x42488000}, {0x4248a000}, {0x4248c000}, {0x4248e000}, + {0x42490000}, {0x42492000}, {0x42494000}, {0x42496000}, + {0x42498000}, {0x4249a000}, {0x4249c000}, {0x4249e000}, + {0x424a0000}, {0x424a2000}, {0x424a4000}, {0x424a6000}, + {0x424a8000}, {0x424aa000}, {0x424ac000}, {0x424ae000}, + {0x424b0000}, {0x424b2000}, {0x424b4000}, {0x424b6000}, + {0x424b8000}, {0x424ba000}, {0x424bc000}, {0x424be000}, + {0x424c0000}, {0x424c2000}, {0x424c4000}, {0x424c6000}, + {0x424c8000}, {0x424ca000}, {0x424cc000}, {0x424ce000}, + {0x424d0000}, {0x424d2000}, {0x424d4000}, {0x424d6000}, + {0x424d8000}, {0x424da000}, {0x424dc000}, {0x424de000}, + {0x424e0000}, {0x424e2000}, {0x424e4000}, {0x424e6000}, + {0x424e8000}, {0x424ea000}, {0x424ec000}, {0x424ee000}, + {0x424f0000}, {0x424f2000}, {0x424f4000}, {0x424f6000}, + {0x424f8000}, {0x424fa000}, {0x424fc000}, {0x424fe000}, + {0x42500000}, {0x42502000}, {0x42504000}, {0x42506000}, + {0x42508000}, {0x4250a000}, {0x4250c000}, {0x4250e000}, + {0x42510000}, {0x42512000}, {0x42514000}, {0x42516000}, + {0x42518000}, {0x4251a000}, {0x4251c000}, {0x4251e000}, + {0x42520000}, {0x42522000}, {0x42524000}, {0x42526000}, + {0x42528000}, {0x4252a000}, {0x4252c000}, {0x4252e000}, + {0x42530000}, {0x42532000}, {0x42534000}, {0x42536000}, + {0x42538000}, {0x4253a000}, {0x4253c000}, {0x4253e000}, + {0x42540000}, {0x42542000}, {0x42544000}, {0x42546000}, + {0x42548000}, {0x4254a000}, {0x4254c000}, {0x4254e000}, + {0x42550000}, {0x42552000}, {0x42554000}, {0x42556000}, + {0x42558000}, {0x4255a000}, {0x4255c000}, {0x4255e000}, + {0x42560000}, {0x42562000}, {0x42564000}, {0x42566000}, + {0x42568000}, {0x4256a000}, {0x4256c000}, {0x4256e000}, + {0x42570000}, {0x42572000}, {0x42574000}, {0x42576000}, + {0x42578000}, {0x4257a000}, {0x4257c000}, {0x4257e000}, + {0x42580000}, {0x42582000}, {0x42584000}, {0x42586000}, + {0x42588000}, {0x4258a000}, {0x4258c000}, {0x4258e000}, + {0x42590000}, {0x42592000}, {0x42594000}, {0x42596000}, + {0x42598000}, {0x4259a000}, {0x4259c000}, {0x4259e000}, + {0x425a0000}, {0x425a2000}, {0x425a4000}, {0x425a6000}, + {0x425a8000}, {0x425aa000}, {0x425ac000}, {0x425ae000}, + {0x425b0000}, {0x425b2000}, {0x425b4000}, {0x425b6000}, + {0x425b8000}, {0x425ba000}, {0x425bc000}, {0x425be000}, + {0x425c0000}, {0x425c2000}, {0x425c4000}, {0x425c6000}, + {0x425c8000}, {0x425ca000}, {0x425cc000}, {0x425ce000}, + {0x425d0000}, {0x425d2000}, {0x425d4000}, {0x425d6000}, + {0x425d8000}, {0x425da000}, {0x425dc000}, {0x425de000}, + {0x425e0000}, {0x425e2000}, {0x425e4000}, {0x425e6000}, + {0x425e8000}, {0x425ea000}, {0x425ec000}, {0x425ee000}, + {0x425f0000}, {0x425f2000}, {0x425f4000}, {0x425f6000}, + {0x425f8000}, {0x425fa000}, {0x425fc000}, {0x425fe000}, + {0x42600000}, {0x42602000}, {0x42604000}, {0x42606000}, + {0x42608000}, {0x4260a000}, {0x4260c000}, {0x4260e000}, + {0x42610000}, {0x42612000}, {0x42614000}, {0x42616000}, + {0x42618000}, {0x4261a000}, {0x4261c000}, {0x4261e000}, + {0x42620000}, {0x42622000}, {0x42624000}, {0x42626000}, + {0x42628000}, {0x4262a000}, {0x4262c000}, {0x4262e000}, + {0x42630000}, {0x42632000}, {0x42634000}, {0x42636000}, + {0x42638000}, {0x4263a000}, {0x4263c000}, {0x4263e000}, + {0x42640000}, {0x42642000}, {0x42644000}, {0x42646000}, + {0x42648000}, {0x4264a000}, {0x4264c000}, {0x4264e000}, + {0x42650000}, {0x42652000}, {0x42654000}, {0x42656000}, + {0x42658000}, {0x4265a000}, {0x4265c000}, {0x4265e000}, + {0x42660000}, {0x42662000}, {0x42664000}, {0x42666000}, + {0x42668000}, {0x4266a000}, {0x4266c000}, {0x4266e000}, + {0x42670000}, {0x42672000}, {0x42674000}, {0x42676000}, + {0x42678000}, {0x4267a000}, {0x4267c000}, {0x4267e000}, + {0x42680000}, {0x42682000}, {0x42684000}, {0x42686000}, + {0x42688000}, {0x4268a000}, {0x4268c000}, {0x4268e000}, + {0x42690000}, {0x42692000}, {0x42694000}, {0x42696000}, + {0x42698000}, {0x4269a000}, {0x4269c000}, {0x4269e000}, + {0x426a0000}, {0x426a2000}, {0x426a4000}, {0x426a6000}, + {0x426a8000}, {0x426aa000}, {0x426ac000}, {0x426ae000}, + {0x426b0000}, {0x426b2000}, {0x426b4000}, {0x426b6000}, + {0x426b8000}, {0x426ba000}, {0x426bc000}, {0x426be000}, + {0x426c0000}, {0x426c2000}, {0x426c4000}, {0x426c6000}, + {0x426c8000}, {0x426ca000}, {0x426cc000}, {0x426ce000}, + {0x426d0000}, {0x426d2000}, {0x426d4000}, {0x426d6000}, + {0x426d8000}, {0x426da000}, {0x426dc000}, {0x426de000}, + {0x426e0000}, {0x426e2000}, {0x426e4000}, {0x426e6000}, + {0x426e8000}, {0x426ea000}, {0x426ec000}, {0x426ee000}, + {0x426f0000}, {0x426f2000}, {0x426f4000}, {0x426f6000}, + {0x426f8000}, {0x426fa000}, {0x426fc000}, {0x426fe000}, + {0x42700000}, {0x42702000}, {0x42704000}, {0x42706000}, + {0x42708000}, {0x4270a000}, {0x4270c000}, {0x4270e000}, + {0x42710000}, {0x42712000}, {0x42714000}, {0x42716000}, + {0x42718000}, {0x4271a000}, {0x4271c000}, {0x4271e000}, + {0x42720000}, {0x42722000}, {0x42724000}, {0x42726000}, + {0x42728000}, {0x4272a000}, {0x4272c000}, {0x4272e000}, + {0x42730000}, {0x42732000}, {0x42734000}, {0x42736000}, + {0x42738000}, {0x4273a000}, {0x4273c000}, {0x4273e000}, + {0x42740000}, {0x42742000}, {0x42744000}, {0x42746000}, + {0x42748000}, {0x4274a000}, {0x4274c000}, {0x4274e000}, + {0x42750000}, {0x42752000}, {0x42754000}, {0x42756000}, + {0x42758000}, {0x4275a000}, {0x4275c000}, {0x4275e000}, + {0x42760000}, {0x42762000}, {0x42764000}, {0x42766000}, + {0x42768000}, {0x4276a000}, {0x4276c000}, {0x4276e000}, + {0x42770000}, {0x42772000}, {0x42774000}, {0x42776000}, + {0x42778000}, {0x4277a000}, {0x4277c000}, {0x4277e000}, + {0x42780000}, {0x42782000}, {0x42784000}, {0x42786000}, + {0x42788000}, {0x4278a000}, {0x4278c000}, {0x4278e000}, + {0x42790000}, {0x42792000}, {0x42794000}, {0x42796000}, + {0x42798000}, {0x4279a000}, {0x4279c000}, {0x4279e000}, + {0x427a0000}, {0x427a2000}, {0x427a4000}, {0x427a6000}, + {0x427a8000}, {0x427aa000}, {0x427ac000}, {0x427ae000}, + {0x427b0000}, {0x427b2000}, {0x427b4000}, {0x427b6000}, + {0x427b8000}, {0x427ba000}, {0x427bc000}, {0x427be000}, + {0x427c0000}, {0x427c2000}, {0x427c4000}, {0x427c6000}, + {0x427c8000}, {0x427ca000}, {0x427cc000}, {0x427ce000}, + {0x427d0000}, {0x427d2000}, {0x427d4000}, {0x427d6000}, + {0x427d8000}, {0x427da000}, {0x427dc000}, {0x427de000}, + {0x427e0000}, {0x427e2000}, {0x427e4000}, {0x427e6000}, + {0x427e8000}, {0x427ea000}, {0x427ec000}, {0x427ee000}, + {0x427f0000}, {0x427f2000}, {0x427f4000}, {0x427f6000}, + {0x427f8000}, {0x427fa000}, {0x427fc000}, {0x427fe000}, + {0x42800000}, {0x42802000}, {0x42804000}, {0x42806000}, + {0x42808000}, {0x4280a000}, {0x4280c000}, {0x4280e000}, + {0x42810000}, {0x42812000}, {0x42814000}, {0x42816000}, + {0x42818000}, {0x4281a000}, {0x4281c000}, {0x4281e000}, + {0x42820000}, {0x42822000}, {0x42824000}, {0x42826000}, + {0x42828000}, {0x4282a000}, {0x4282c000}, {0x4282e000}, + {0x42830000}, {0x42832000}, {0x42834000}, {0x42836000}, + {0x42838000}, {0x4283a000}, {0x4283c000}, {0x4283e000}, + {0x42840000}, {0x42842000}, {0x42844000}, {0x42846000}, + {0x42848000}, {0x4284a000}, {0x4284c000}, {0x4284e000}, + {0x42850000}, {0x42852000}, {0x42854000}, {0x42856000}, + {0x42858000}, {0x4285a000}, {0x4285c000}, {0x4285e000}, + {0x42860000}, {0x42862000}, {0x42864000}, {0x42866000}, + {0x42868000}, {0x4286a000}, {0x4286c000}, {0x4286e000}, + {0x42870000}, {0x42872000}, {0x42874000}, {0x42876000}, + {0x42878000}, {0x4287a000}, {0x4287c000}, {0x4287e000}, + {0x42880000}, {0x42882000}, {0x42884000}, {0x42886000}, + {0x42888000}, {0x4288a000}, {0x4288c000}, {0x4288e000}, + {0x42890000}, {0x42892000}, {0x42894000}, {0x42896000}, + {0x42898000}, {0x4289a000}, {0x4289c000}, {0x4289e000}, + {0x428a0000}, {0x428a2000}, {0x428a4000}, {0x428a6000}, + {0x428a8000}, {0x428aa000}, {0x428ac000}, {0x428ae000}, + {0x428b0000}, {0x428b2000}, {0x428b4000}, {0x428b6000}, + {0x428b8000}, {0x428ba000}, {0x428bc000}, {0x428be000}, + {0x428c0000}, {0x428c2000}, {0x428c4000}, {0x428c6000}, + {0x428c8000}, {0x428ca000}, {0x428cc000}, {0x428ce000}, + {0x428d0000}, {0x428d2000}, {0x428d4000}, {0x428d6000}, + {0x428d8000}, {0x428da000}, {0x428dc000}, {0x428de000}, + {0x428e0000}, {0x428e2000}, {0x428e4000}, {0x428e6000}, + {0x428e8000}, {0x428ea000}, {0x428ec000}, {0x428ee000}, + {0x428f0000}, {0x428f2000}, {0x428f4000}, {0x428f6000}, + {0x428f8000}, {0x428fa000}, {0x428fc000}, {0x428fe000}, + {0x42900000}, {0x42902000}, {0x42904000}, {0x42906000}, + {0x42908000}, {0x4290a000}, {0x4290c000}, {0x4290e000}, + {0x42910000}, {0x42912000}, {0x42914000}, {0x42916000}, + {0x42918000}, {0x4291a000}, {0x4291c000}, {0x4291e000}, + {0x42920000}, {0x42922000}, {0x42924000}, {0x42926000}, + {0x42928000}, {0x4292a000}, {0x4292c000}, {0x4292e000}, + {0x42930000}, {0x42932000}, {0x42934000}, {0x42936000}, + {0x42938000}, {0x4293a000}, {0x4293c000}, {0x4293e000}, + {0x42940000}, {0x42942000}, {0x42944000}, {0x42946000}, + {0x42948000}, {0x4294a000}, {0x4294c000}, {0x4294e000}, + {0x42950000}, {0x42952000}, {0x42954000}, {0x42956000}, + {0x42958000}, {0x4295a000}, {0x4295c000}, {0x4295e000}, + {0x42960000}, {0x42962000}, {0x42964000}, {0x42966000}, + {0x42968000}, {0x4296a000}, {0x4296c000}, {0x4296e000}, + {0x42970000}, {0x42972000}, {0x42974000}, {0x42976000}, + {0x42978000}, {0x4297a000}, {0x4297c000}, {0x4297e000}, + {0x42980000}, {0x42982000}, {0x42984000}, {0x42986000}, + {0x42988000}, {0x4298a000}, {0x4298c000}, {0x4298e000}, + {0x42990000}, {0x42992000}, {0x42994000}, {0x42996000}, + {0x42998000}, {0x4299a000}, {0x4299c000}, {0x4299e000}, + {0x429a0000}, {0x429a2000}, {0x429a4000}, {0x429a6000}, + {0x429a8000}, {0x429aa000}, {0x429ac000}, {0x429ae000}, + {0x429b0000}, {0x429b2000}, {0x429b4000}, {0x429b6000}, + {0x429b8000}, {0x429ba000}, {0x429bc000}, {0x429be000}, + {0x429c0000}, {0x429c2000}, {0x429c4000}, {0x429c6000}, + {0x429c8000}, {0x429ca000}, {0x429cc000}, {0x429ce000}, + {0x429d0000}, {0x429d2000}, {0x429d4000}, {0x429d6000}, + {0x429d8000}, {0x429da000}, {0x429dc000}, {0x429de000}, + {0x429e0000}, {0x429e2000}, {0x429e4000}, {0x429e6000}, + {0x429e8000}, {0x429ea000}, {0x429ec000}, {0x429ee000}, + {0x429f0000}, {0x429f2000}, {0x429f4000}, {0x429f6000}, + {0x429f8000}, {0x429fa000}, {0x429fc000}, {0x429fe000}, + {0x42a00000}, {0x42a02000}, {0x42a04000}, {0x42a06000}, + {0x42a08000}, {0x42a0a000}, {0x42a0c000}, {0x42a0e000}, + {0x42a10000}, {0x42a12000}, {0x42a14000}, {0x42a16000}, + {0x42a18000}, {0x42a1a000}, {0x42a1c000}, {0x42a1e000}, + {0x42a20000}, {0x42a22000}, {0x42a24000}, {0x42a26000}, + {0x42a28000}, {0x42a2a000}, {0x42a2c000}, {0x42a2e000}, + {0x42a30000}, {0x42a32000}, {0x42a34000}, {0x42a36000}, + {0x42a38000}, {0x42a3a000}, {0x42a3c000}, {0x42a3e000}, + {0x42a40000}, {0x42a42000}, {0x42a44000}, {0x42a46000}, + {0x42a48000}, {0x42a4a000}, {0x42a4c000}, {0x42a4e000}, + {0x42a50000}, {0x42a52000}, {0x42a54000}, {0x42a56000}, + {0x42a58000}, {0x42a5a000}, {0x42a5c000}, {0x42a5e000}, + {0x42a60000}, {0x42a62000}, {0x42a64000}, {0x42a66000}, + {0x42a68000}, {0x42a6a000}, {0x42a6c000}, {0x42a6e000}, + {0x42a70000}, {0x42a72000}, {0x42a74000}, {0x42a76000}, + {0x42a78000}, {0x42a7a000}, {0x42a7c000}, {0x42a7e000}, + {0x42a80000}, {0x42a82000}, {0x42a84000}, {0x42a86000}, + {0x42a88000}, {0x42a8a000}, {0x42a8c000}, {0x42a8e000}, + {0x42a90000}, {0x42a92000}, {0x42a94000}, {0x42a96000}, + {0x42a98000}, {0x42a9a000}, {0x42a9c000}, {0x42a9e000}, + {0x42aa0000}, {0x42aa2000}, {0x42aa4000}, {0x42aa6000}, + {0x42aa8000}, {0x42aaa000}, {0x42aac000}, {0x42aae000}, + {0x42ab0000}, {0x42ab2000}, {0x42ab4000}, {0x42ab6000}, + {0x42ab8000}, {0x42aba000}, {0x42abc000}, {0x42abe000}, + {0x42ac0000}, {0x42ac2000}, {0x42ac4000}, {0x42ac6000}, + {0x42ac8000}, {0x42aca000}, {0x42acc000}, {0x42ace000}, + {0x42ad0000}, {0x42ad2000}, {0x42ad4000}, {0x42ad6000}, + {0x42ad8000}, {0x42ada000}, {0x42adc000}, {0x42ade000}, + {0x42ae0000}, {0x42ae2000}, {0x42ae4000}, {0x42ae6000}, + {0x42ae8000}, {0x42aea000}, {0x42aec000}, {0x42aee000}, + {0x42af0000}, {0x42af2000}, {0x42af4000}, {0x42af6000}, + {0x42af8000}, {0x42afa000}, {0x42afc000}, {0x42afe000}, + {0x42b00000}, {0x42b02000}, {0x42b04000}, {0x42b06000}, + {0x42b08000}, {0x42b0a000}, {0x42b0c000}, {0x42b0e000}, + {0x42b10000}, {0x42b12000}, {0x42b14000}, {0x42b16000}, + {0x42b18000}, {0x42b1a000}, {0x42b1c000}, {0x42b1e000}, + {0x42b20000}, {0x42b22000}, {0x42b24000}, {0x42b26000}, + {0x42b28000}, {0x42b2a000}, {0x42b2c000}, {0x42b2e000}, + {0x42b30000}, {0x42b32000}, {0x42b34000}, {0x42b36000}, + {0x42b38000}, {0x42b3a000}, {0x42b3c000}, {0x42b3e000}, + {0x42b40000}, {0x42b42000}, {0x42b44000}, {0x42b46000}, + {0x42b48000}, {0x42b4a000}, {0x42b4c000}, {0x42b4e000}, + {0x42b50000}, {0x42b52000}, {0x42b54000}, {0x42b56000}, + {0x42b58000}, {0x42b5a000}, {0x42b5c000}, {0x42b5e000}, + {0x42b60000}, {0x42b62000}, {0x42b64000}, {0x42b66000}, + {0x42b68000}, {0x42b6a000}, {0x42b6c000}, {0x42b6e000}, + {0x42b70000}, {0x42b72000}, {0x42b74000}, {0x42b76000}, + {0x42b78000}, {0x42b7a000}, {0x42b7c000}, {0x42b7e000}, + {0x42b80000}, {0x42b82000}, {0x42b84000}, {0x42b86000}, + {0x42b88000}, {0x42b8a000}, {0x42b8c000}, {0x42b8e000}, + {0x42b90000}, {0x42b92000}, {0x42b94000}, {0x42b96000}, + {0x42b98000}, {0x42b9a000}, {0x42b9c000}, {0x42b9e000}, + {0x42ba0000}, {0x42ba2000}, {0x42ba4000}, {0x42ba6000}, + {0x42ba8000}, {0x42baa000}, {0x42bac000}, {0x42bae000}, + {0x42bb0000}, {0x42bb2000}, {0x42bb4000}, {0x42bb6000}, + {0x42bb8000}, {0x42bba000}, {0x42bbc000}, {0x42bbe000}, + {0x42bc0000}, {0x42bc2000}, {0x42bc4000}, {0x42bc6000}, + {0x42bc8000}, {0x42bca000}, {0x42bcc000}, {0x42bce000}, + {0x42bd0000}, {0x42bd2000}, {0x42bd4000}, {0x42bd6000}, + {0x42bd8000}, {0x42bda000}, {0x42bdc000}, {0x42bde000}, + {0x42be0000}, {0x42be2000}, {0x42be4000}, {0x42be6000}, + {0x42be8000}, {0x42bea000}, {0x42bec000}, {0x42bee000}, + {0x42bf0000}, {0x42bf2000}, {0x42bf4000}, {0x42bf6000}, + {0x42bf8000}, {0x42bfa000}, {0x42bfc000}, {0x42bfe000}, + {0x42c00000}, {0x42c02000}, {0x42c04000}, {0x42c06000}, + {0x42c08000}, {0x42c0a000}, {0x42c0c000}, {0x42c0e000}, + {0x42c10000}, {0x42c12000}, {0x42c14000}, {0x42c16000}, + {0x42c18000}, {0x42c1a000}, {0x42c1c000}, {0x42c1e000}, + {0x42c20000}, {0x42c22000}, {0x42c24000}, {0x42c26000}, + {0x42c28000}, {0x42c2a000}, {0x42c2c000}, {0x42c2e000}, + {0x42c30000}, {0x42c32000}, {0x42c34000}, {0x42c36000}, + {0x42c38000}, {0x42c3a000}, {0x42c3c000}, {0x42c3e000}, + {0x42c40000}, {0x42c42000}, {0x42c44000}, {0x42c46000}, + {0x42c48000}, {0x42c4a000}, {0x42c4c000}, {0x42c4e000}, + {0x42c50000}, {0x42c52000}, {0x42c54000}, {0x42c56000}, + {0x42c58000}, {0x42c5a000}, {0x42c5c000}, {0x42c5e000}, + {0x42c60000}, {0x42c62000}, {0x42c64000}, {0x42c66000}, + {0x42c68000}, {0x42c6a000}, {0x42c6c000}, {0x42c6e000}, + {0x42c70000}, {0x42c72000}, {0x42c74000}, {0x42c76000}, + {0x42c78000}, {0x42c7a000}, {0x42c7c000}, {0x42c7e000}, + {0x42c80000}, {0x42c82000}, {0x42c84000}, {0x42c86000}, + {0x42c88000}, {0x42c8a000}, {0x42c8c000}, {0x42c8e000}, + {0x42c90000}, {0x42c92000}, {0x42c94000}, {0x42c96000}, + {0x42c98000}, {0x42c9a000}, {0x42c9c000}, {0x42c9e000}, + {0x42ca0000}, {0x42ca2000}, {0x42ca4000}, {0x42ca6000}, + {0x42ca8000}, {0x42caa000}, {0x42cac000}, {0x42cae000}, + {0x42cb0000}, {0x42cb2000}, {0x42cb4000}, {0x42cb6000}, + {0x42cb8000}, {0x42cba000}, {0x42cbc000}, {0x42cbe000}, + {0x42cc0000}, {0x42cc2000}, {0x42cc4000}, {0x42cc6000}, + {0x42cc8000}, {0x42cca000}, {0x42ccc000}, {0x42cce000}, + {0x42cd0000}, {0x42cd2000}, {0x42cd4000}, {0x42cd6000}, + {0x42cd8000}, {0x42cda000}, {0x42cdc000}, {0x42cde000}, + {0x42ce0000}, {0x42ce2000}, {0x42ce4000}, {0x42ce6000}, + {0x42ce8000}, {0x42cea000}, {0x42cec000}, {0x42cee000}, + {0x42cf0000}, {0x42cf2000}, {0x42cf4000}, {0x42cf6000}, + {0x42cf8000}, {0x42cfa000}, {0x42cfc000}, {0x42cfe000}, + {0x42d00000}, {0x42d02000}, {0x42d04000}, {0x42d06000}, + {0x42d08000}, {0x42d0a000}, {0x42d0c000}, {0x42d0e000}, + {0x42d10000}, {0x42d12000}, {0x42d14000}, {0x42d16000}, + {0x42d18000}, {0x42d1a000}, {0x42d1c000}, {0x42d1e000}, + {0x42d20000}, {0x42d22000}, {0x42d24000}, {0x42d26000}, + {0x42d28000}, {0x42d2a000}, {0x42d2c000}, {0x42d2e000}, + {0x42d30000}, {0x42d32000}, {0x42d34000}, {0x42d36000}, + {0x42d38000}, {0x42d3a000}, {0x42d3c000}, {0x42d3e000}, + {0x42d40000}, {0x42d42000}, {0x42d44000}, {0x42d46000}, + {0x42d48000}, {0x42d4a000}, {0x42d4c000}, {0x42d4e000}, + {0x42d50000}, {0x42d52000}, {0x42d54000}, {0x42d56000}, + {0x42d58000}, {0x42d5a000}, {0x42d5c000}, {0x42d5e000}, + {0x42d60000}, {0x42d62000}, {0x42d64000}, {0x42d66000}, + {0x42d68000}, {0x42d6a000}, {0x42d6c000}, {0x42d6e000}, + {0x42d70000}, {0x42d72000}, {0x42d74000}, {0x42d76000}, + {0x42d78000}, {0x42d7a000}, {0x42d7c000}, {0x42d7e000}, + {0x42d80000}, {0x42d82000}, {0x42d84000}, {0x42d86000}, + {0x42d88000}, {0x42d8a000}, {0x42d8c000}, {0x42d8e000}, + {0x42d90000}, {0x42d92000}, {0x42d94000}, {0x42d96000}, + {0x42d98000}, {0x42d9a000}, {0x42d9c000}, {0x42d9e000}, + {0x42da0000}, {0x42da2000}, {0x42da4000}, {0x42da6000}, + {0x42da8000}, {0x42daa000}, {0x42dac000}, {0x42dae000}, + {0x42db0000}, {0x42db2000}, {0x42db4000}, {0x42db6000}, + {0x42db8000}, {0x42dba000}, {0x42dbc000}, {0x42dbe000}, + {0x42dc0000}, {0x42dc2000}, {0x42dc4000}, {0x42dc6000}, + {0x42dc8000}, {0x42dca000}, {0x42dcc000}, {0x42dce000}, + {0x42dd0000}, {0x42dd2000}, {0x42dd4000}, {0x42dd6000}, + {0x42dd8000}, {0x42dda000}, {0x42ddc000}, {0x42dde000}, + {0x42de0000}, {0x42de2000}, {0x42de4000}, {0x42de6000}, + {0x42de8000}, {0x42dea000}, {0x42dec000}, {0x42dee000}, + {0x42df0000}, {0x42df2000}, {0x42df4000}, {0x42df6000}, + {0x42df8000}, {0x42dfa000}, {0x42dfc000}, {0x42dfe000}, + {0x42e00000}, {0x42e02000}, {0x42e04000}, {0x42e06000}, + {0x42e08000}, {0x42e0a000}, {0x42e0c000}, {0x42e0e000}, + {0x42e10000}, {0x42e12000}, {0x42e14000}, {0x42e16000}, + {0x42e18000}, {0x42e1a000}, {0x42e1c000}, {0x42e1e000}, + {0x42e20000}, {0x42e22000}, {0x42e24000}, {0x42e26000}, + {0x42e28000}, {0x42e2a000}, {0x42e2c000}, {0x42e2e000}, + {0x42e30000}, {0x42e32000}, {0x42e34000}, {0x42e36000}, + {0x42e38000}, {0x42e3a000}, {0x42e3c000}, {0x42e3e000}, + {0x42e40000}, {0x42e42000}, {0x42e44000}, {0x42e46000}, + {0x42e48000}, {0x42e4a000}, {0x42e4c000}, {0x42e4e000}, + {0x42e50000}, {0x42e52000}, {0x42e54000}, {0x42e56000}, + {0x42e58000}, {0x42e5a000}, {0x42e5c000}, {0x42e5e000}, + {0x42e60000}, {0x42e62000}, {0x42e64000}, {0x42e66000}, + {0x42e68000}, {0x42e6a000}, {0x42e6c000}, {0x42e6e000}, + {0x42e70000}, {0x42e72000}, {0x42e74000}, {0x42e76000}, + {0x42e78000}, {0x42e7a000}, {0x42e7c000}, {0x42e7e000}, + {0x42e80000}, {0x42e82000}, {0x42e84000}, {0x42e86000}, + {0x42e88000}, {0x42e8a000}, {0x42e8c000}, {0x42e8e000}, + {0x42e90000}, {0x42e92000}, {0x42e94000}, {0x42e96000}, + {0x42e98000}, {0x42e9a000}, {0x42e9c000}, {0x42e9e000}, + {0x42ea0000}, {0x42ea2000}, {0x42ea4000}, {0x42ea6000}, + {0x42ea8000}, {0x42eaa000}, {0x42eac000}, {0x42eae000}, + {0x42eb0000}, {0x42eb2000}, {0x42eb4000}, {0x42eb6000}, + {0x42eb8000}, {0x42eba000}, {0x42ebc000}, {0x42ebe000}, + {0x42ec0000}, {0x42ec2000}, {0x42ec4000}, {0x42ec6000}, + {0x42ec8000}, {0x42eca000}, {0x42ecc000}, {0x42ece000}, + {0x42ed0000}, {0x42ed2000}, {0x42ed4000}, {0x42ed6000}, + {0x42ed8000}, {0x42eda000}, {0x42edc000}, {0x42ede000}, + {0x42ee0000}, {0x42ee2000}, {0x42ee4000}, {0x42ee6000}, + {0x42ee8000}, {0x42eea000}, {0x42eec000}, {0x42eee000}, + {0x42ef0000}, {0x42ef2000}, {0x42ef4000}, {0x42ef6000}, + {0x42ef8000}, {0x42efa000}, {0x42efc000}, {0x42efe000}, + {0x42f00000}, {0x42f02000}, {0x42f04000}, {0x42f06000}, + {0x42f08000}, {0x42f0a000}, {0x42f0c000}, {0x42f0e000}, + {0x42f10000}, {0x42f12000}, {0x42f14000}, {0x42f16000}, + {0x42f18000}, {0x42f1a000}, {0x42f1c000}, {0x42f1e000}, + {0x42f20000}, {0x42f22000}, {0x42f24000}, {0x42f26000}, + {0x42f28000}, {0x42f2a000}, {0x42f2c000}, {0x42f2e000}, + {0x42f30000}, {0x42f32000}, {0x42f34000}, {0x42f36000}, + {0x42f38000}, {0x42f3a000}, {0x42f3c000}, {0x42f3e000}, + {0x42f40000}, {0x42f42000}, {0x42f44000}, {0x42f46000}, + {0x42f48000}, {0x42f4a000}, {0x42f4c000}, {0x42f4e000}, + {0x42f50000}, {0x42f52000}, {0x42f54000}, {0x42f56000}, + {0x42f58000}, {0x42f5a000}, {0x42f5c000}, {0x42f5e000}, + {0x42f60000}, {0x42f62000}, {0x42f64000}, {0x42f66000}, + {0x42f68000}, {0x42f6a000}, {0x42f6c000}, {0x42f6e000}, + {0x42f70000}, {0x42f72000}, {0x42f74000}, {0x42f76000}, + {0x42f78000}, {0x42f7a000}, {0x42f7c000}, {0x42f7e000}, + {0x42f80000}, {0x42f82000}, {0x42f84000}, {0x42f86000}, + {0x42f88000}, {0x42f8a000}, {0x42f8c000}, {0x42f8e000}, + {0x42f90000}, {0x42f92000}, {0x42f94000}, {0x42f96000}, + {0x42f98000}, {0x42f9a000}, {0x42f9c000}, {0x42f9e000}, + {0x42fa0000}, {0x42fa2000}, {0x42fa4000}, {0x42fa6000}, + {0x42fa8000}, {0x42faa000}, {0x42fac000}, {0x42fae000}, + {0x42fb0000}, {0x42fb2000}, {0x42fb4000}, {0x42fb6000}, + {0x42fb8000}, {0x42fba000}, {0x42fbc000}, {0x42fbe000}, + {0x42fc0000}, {0x42fc2000}, {0x42fc4000}, {0x42fc6000}, + {0x42fc8000}, {0x42fca000}, {0x42fcc000}, {0x42fce000}, + {0x42fd0000}, {0x42fd2000}, {0x42fd4000}, {0x42fd6000}, + {0x42fd8000}, {0x42fda000}, {0x42fdc000}, {0x42fde000}, + {0x42fe0000}, {0x42fe2000}, {0x42fe4000}, {0x42fe6000}, + {0x42fe8000}, {0x42fea000}, {0x42fec000}, {0x42fee000}, + {0x42ff0000}, {0x42ff2000}, {0x42ff4000}, {0x42ff6000}, + {0x42ff8000}, {0x42ffa000}, {0x42ffc000}, {0x42ffe000}, + {0x43000000}, {0x43002000}, {0x43004000}, {0x43006000}, + {0x43008000}, {0x4300a000}, {0x4300c000}, {0x4300e000}, + {0x43010000}, {0x43012000}, {0x43014000}, {0x43016000}, + {0x43018000}, {0x4301a000}, {0x4301c000}, {0x4301e000}, + {0x43020000}, {0x43022000}, {0x43024000}, {0x43026000}, + {0x43028000}, {0x4302a000}, {0x4302c000}, {0x4302e000}, + {0x43030000}, {0x43032000}, {0x43034000}, {0x43036000}, + {0x43038000}, {0x4303a000}, {0x4303c000}, {0x4303e000}, + {0x43040000}, {0x43042000}, {0x43044000}, {0x43046000}, + {0x43048000}, {0x4304a000}, {0x4304c000}, {0x4304e000}, + {0x43050000}, {0x43052000}, {0x43054000}, {0x43056000}, + {0x43058000}, {0x4305a000}, {0x4305c000}, {0x4305e000}, + {0x43060000}, {0x43062000}, {0x43064000}, {0x43066000}, + {0x43068000}, {0x4306a000}, {0x4306c000}, {0x4306e000}, + {0x43070000}, {0x43072000}, {0x43074000}, {0x43076000}, + {0x43078000}, {0x4307a000}, {0x4307c000}, {0x4307e000}, + {0x43080000}, {0x43082000}, {0x43084000}, {0x43086000}, + {0x43088000}, {0x4308a000}, {0x4308c000}, {0x4308e000}, + {0x43090000}, {0x43092000}, {0x43094000}, {0x43096000}, + {0x43098000}, {0x4309a000}, {0x4309c000}, {0x4309e000}, + {0x430a0000}, {0x430a2000}, {0x430a4000}, {0x430a6000}, + {0x430a8000}, {0x430aa000}, {0x430ac000}, {0x430ae000}, + {0x430b0000}, {0x430b2000}, {0x430b4000}, {0x430b6000}, + {0x430b8000}, {0x430ba000}, {0x430bc000}, {0x430be000}, + {0x430c0000}, {0x430c2000}, {0x430c4000}, {0x430c6000}, + {0x430c8000}, {0x430ca000}, {0x430cc000}, {0x430ce000}, + {0x430d0000}, {0x430d2000}, {0x430d4000}, {0x430d6000}, + {0x430d8000}, {0x430da000}, {0x430dc000}, {0x430de000}, + {0x430e0000}, {0x430e2000}, {0x430e4000}, {0x430e6000}, + {0x430e8000}, {0x430ea000}, {0x430ec000}, {0x430ee000}, + {0x430f0000}, {0x430f2000}, {0x430f4000}, {0x430f6000}, + {0x430f8000}, {0x430fa000}, {0x430fc000}, {0x430fe000}, + {0x43100000}, {0x43102000}, {0x43104000}, {0x43106000}, + {0x43108000}, {0x4310a000}, {0x4310c000}, {0x4310e000}, + {0x43110000}, {0x43112000}, {0x43114000}, {0x43116000}, + {0x43118000}, {0x4311a000}, {0x4311c000}, {0x4311e000}, + {0x43120000}, {0x43122000}, {0x43124000}, {0x43126000}, + {0x43128000}, {0x4312a000}, {0x4312c000}, {0x4312e000}, + {0x43130000}, {0x43132000}, {0x43134000}, {0x43136000}, + {0x43138000}, {0x4313a000}, {0x4313c000}, {0x4313e000}, + {0x43140000}, {0x43142000}, {0x43144000}, {0x43146000}, + {0x43148000}, {0x4314a000}, {0x4314c000}, {0x4314e000}, + {0x43150000}, {0x43152000}, {0x43154000}, {0x43156000}, + {0x43158000}, {0x4315a000}, {0x4315c000}, {0x4315e000}, + {0x43160000}, {0x43162000}, {0x43164000}, {0x43166000}, + {0x43168000}, {0x4316a000}, {0x4316c000}, {0x4316e000}, + {0x43170000}, {0x43172000}, {0x43174000}, {0x43176000}, + {0x43178000}, {0x4317a000}, {0x4317c000}, {0x4317e000}, + {0x43180000}, {0x43182000}, {0x43184000}, {0x43186000}, + {0x43188000}, {0x4318a000}, {0x4318c000}, {0x4318e000}, + {0x43190000}, {0x43192000}, {0x43194000}, {0x43196000}, + {0x43198000}, {0x4319a000}, {0x4319c000}, {0x4319e000}, + {0x431a0000}, {0x431a2000}, {0x431a4000}, {0x431a6000}, + {0x431a8000}, {0x431aa000}, {0x431ac000}, {0x431ae000}, + {0x431b0000}, {0x431b2000}, {0x431b4000}, {0x431b6000}, + {0x431b8000}, {0x431ba000}, {0x431bc000}, {0x431be000}, + {0x431c0000}, {0x431c2000}, {0x431c4000}, {0x431c6000}, + {0x431c8000}, {0x431ca000}, {0x431cc000}, {0x431ce000}, + {0x431d0000}, {0x431d2000}, {0x431d4000}, {0x431d6000}, + {0x431d8000}, {0x431da000}, {0x431dc000}, {0x431de000}, + {0x431e0000}, {0x431e2000}, {0x431e4000}, {0x431e6000}, + {0x431e8000}, {0x431ea000}, {0x431ec000}, {0x431ee000}, + {0x431f0000}, {0x431f2000}, {0x431f4000}, {0x431f6000}, + {0x431f8000}, {0x431fa000}, {0x431fc000}, {0x431fe000}, + {0x43200000}, {0x43202000}, {0x43204000}, {0x43206000}, + {0x43208000}, {0x4320a000}, {0x4320c000}, {0x4320e000}, + {0x43210000}, {0x43212000}, {0x43214000}, {0x43216000}, + {0x43218000}, {0x4321a000}, {0x4321c000}, {0x4321e000}, + {0x43220000}, {0x43222000}, {0x43224000}, {0x43226000}, + {0x43228000}, {0x4322a000}, {0x4322c000}, {0x4322e000}, + {0x43230000}, {0x43232000}, {0x43234000}, {0x43236000}, + {0x43238000}, {0x4323a000}, {0x4323c000}, {0x4323e000}, + {0x43240000}, {0x43242000}, {0x43244000}, {0x43246000}, + {0x43248000}, {0x4324a000}, {0x4324c000}, {0x4324e000}, + {0x43250000}, {0x43252000}, {0x43254000}, {0x43256000}, + {0x43258000}, {0x4325a000}, {0x4325c000}, {0x4325e000}, + {0x43260000}, {0x43262000}, {0x43264000}, {0x43266000}, + {0x43268000}, {0x4326a000}, {0x4326c000}, {0x4326e000}, + {0x43270000}, {0x43272000}, {0x43274000}, {0x43276000}, + {0x43278000}, {0x4327a000}, {0x4327c000}, {0x4327e000}, + {0x43280000}, {0x43282000}, {0x43284000}, {0x43286000}, + {0x43288000}, {0x4328a000}, {0x4328c000}, {0x4328e000}, + {0x43290000}, {0x43292000}, {0x43294000}, {0x43296000}, + {0x43298000}, {0x4329a000}, {0x4329c000}, {0x4329e000}, + {0x432a0000}, {0x432a2000}, {0x432a4000}, {0x432a6000}, + {0x432a8000}, {0x432aa000}, {0x432ac000}, {0x432ae000}, + {0x432b0000}, {0x432b2000}, {0x432b4000}, {0x432b6000}, + {0x432b8000}, {0x432ba000}, {0x432bc000}, {0x432be000}, + {0x432c0000}, {0x432c2000}, {0x432c4000}, {0x432c6000}, + {0x432c8000}, {0x432ca000}, {0x432cc000}, {0x432ce000}, + {0x432d0000}, {0x432d2000}, {0x432d4000}, {0x432d6000}, + {0x432d8000}, {0x432da000}, {0x432dc000}, {0x432de000}, + {0x432e0000}, {0x432e2000}, {0x432e4000}, {0x432e6000}, + {0x432e8000}, {0x432ea000}, {0x432ec000}, {0x432ee000}, + {0x432f0000}, {0x432f2000}, {0x432f4000}, {0x432f6000}, + {0x432f8000}, {0x432fa000}, {0x432fc000}, {0x432fe000}, + {0x43300000}, {0x43302000}, {0x43304000}, {0x43306000}, + {0x43308000}, {0x4330a000}, {0x4330c000}, {0x4330e000}, + {0x43310000}, {0x43312000}, {0x43314000}, {0x43316000}, + {0x43318000}, {0x4331a000}, {0x4331c000}, {0x4331e000}, + {0x43320000}, {0x43322000}, {0x43324000}, {0x43326000}, + {0x43328000}, {0x4332a000}, {0x4332c000}, {0x4332e000}, + {0x43330000}, {0x43332000}, {0x43334000}, {0x43336000}, + {0x43338000}, {0x4333a000}, {0x4333c000}, {0x4333e000}, + {0x43340000}, {0x43342000}, {0x43344000}, {0x43346000}, + {0x43348000}, {0x4334a000}, {0x4334c000}, {0x4334e000}, + {0x43350000}, {0x43352000}, {0x43354000}, {0x43356000}, + {0x43358000}, {0x4335a000}, {0x4335c000}, {0x4335e000}, + {0x43360000}, {0x43362000}, {0x43364000}, {0x43366000}, + {0x43368000}, {0x4336a000}, {0x4336c000}, {0x4336e000}, + {0x43370000}, {0x43372000}, {0x43374000}, {0x43376000}, + {0x43378000}, {0x4337a000}, {0x4337c000}, {0x4337e000}, + {0x43380000}, {0x43382000}, {0x43384000}, {0x43386000}, + {0x43388000}, {0x4338a000}, {0x4338c000}, {0x4338e000}, + {0x43390000}, {0x43392000}, {0x43394000}, {0x43396000}, + {0x43398000}, {0x4339a000}, {0x4339c000}, {0x4339e000}, + {0x433a0000}, {0x433a2000}, {0x433a4000}, {0x433a6000}, + {0x433a8000}, {0x433aa000}, {0x433ac000}, {0x433ae000}, + {0x433b0000}, {0x433b2000}, {0x433b4000}, {0x433b6000}, + {0x433b8000}, {0x433ba000}, {0x433bc000}, {0x433be000}, + {0x433c0000}, {0x433c2000}, {0x433c4000}, {0x433c6000}, + {0x433c8000}, {0x433ca000}, {0x433cc000}, {0x433ce000}, + {0x433d0000}, {0x433d2000}, {0x433d4000}, {0x433d6000}, + {0x433d8000}, {0x433da000}, {0x433dc000}, {0x433de000}, + {0x433e0000}, {0x433e2000}, {0x433e4000}, {0x433e6000}, + {0x433e8000}, {0x433ea000}, {0x433ec000}, {0x433ee000}, + {0x433f0000}, {0x433f2000}, {0x433f4000}, {0x433f6000}, + {0x433f8000}, {0x433fa000}, {0x433fc000}, {0x433fe000}, + {0x43400000}, {0x43402000}, {0x43404000}, {0x43406000}, + {0x43408000}, {0x4340a000}, {0x4340c000}, {0x4340e000}, + {0x43410000}, {0x43412000}, {0x43414000}, {0x43416000}, + {0x43418000}, {0x4341a000}, {0x4341c000}, {0x4341e000}, + {0x43420000}, {0x43422000}, {0x43424000}, {0x43426000}, + {0x43428000}, {0x4342a000}, {0x4342c000}, {0x4342e000}, + {0x43430000}, {0x43432000}, {0x43434000}, {0x43436000}, + {0x43438000}, {0x4343a000}, {0x4343c000}, {0x4343e000}, + {0x43440000}, {0x43442000}, {0x43444000}, {0x43446000}, + {0x43448000}, {0x4344a000}, {0x4344c000}, {0x4344e000}, + {0x43450000}, {0x43452000}, {0x43454000}, {0x43456000}, + {0x43458000}, {0x4345a000}, {0x4345c000}, {0x4345e000}, + {0x43460000}, {0x43462000}, {0x43464000}, {0x43466000}, + {0x43468000}, {0x4346a000}, {0x4346c000}, {0x4346e000}, + {0x43470000}, {0x43472000}, {0x43474000}, {0x43476000}, + {0x43478000}, {0x4347a000}, {0x4347c000}, {0x4347e000}, + {0x43480000}, {0x43482000}, {0x43484000}, {0x43486000}, + {0x43488000}, {0x4348a000}, {0x4348c000}, {0x4348e000}, + {0x43490000}, {0x43492000}, {0x43494000}, {0x43496000}, + {0x43498000}, {0x4349a000}, {0x4349c000}, {0x4349e000}, + {0x434a0000}, {0x434a2000}, {0x434a4000}, {0x434a6000}, + {0x434a8000}, {0x434aa000}, {0x434ac000}, {0x434ae000}, + {0x434b0000}, {0x434b2000}, {0x434b4000}, {0x434b6000}, + {0x434b8000}, {0x434ba000}, {0x434bc000}, {0x434be000}, + {0x434c0000}, {0x434c2000}, {0x434c4000}, {0x434c6000}, + {0x434c8000}, {0x434ca000}, {0x434cc000}, {0x434ce000}, + {0x434d0000}, {0x434d2000}, {0x434d4000}, {0x434d6000}, + {0x434d8000}, {0x434da000}, {0x434dc000}, {0x434de000}, + {0x434e0000}, {0x434e2000}, {0x434e4000}, {0x434e6000}, + {0x434e8000}, {0x434ea000}, {0x434ec000}, {0x434ee000}, + {0x434f0000}, {0x434f2000}, {0x434f4000}, {0x434f6000}, + {0x434f8000}, {0x434fa000}, {0x434fc000}, {0x434fe000}, + {0x43500000}, {0x43502000}, {0x43504000}, {0x43506000}, + {0x43508000}, {0x4350a000}, {0x4350c000}, {0x4350e000}, + {0x43510000}, {0x43512000}, {0x43514000}, {0x43516000}, + {0x43518000}, {0x4351a000}, {0x4351c000}, {0x4351e000}, + {0x43520000}, {0x43522000}, {0x43524000}, {0x43526000}, + {0x43528000}, {0x4352a000}, {0x4352c000}, {0x4352e000}, + {0x43530000}, {0x43532000}, {0x43534000}, {0x43536000}, + {0x43538000}, {0x4353a000}, {0x4353c000}, {0x4353e000}, + {0x43540000}, {0x43542000}, {0x43544000}, {0x43546000}, + {0x43548000}, {0x4354a000}, {0x4354c000}, {0x4354e000}, + {0x43550000}, {0x43552000}, {0x43554000}, {0x43556000}, + {0x43558000}, {0x4355a000}, {0x4355c000}, {0x4355e000}, + {0x43560000}, {0x43562000}, {0x43564000}, {0x43566000}, + {0x43568000}, {0x4356a000}, {0x4356c000}, {0x4356e000}, + {0x43570000}, {0x43572000}, {0x43574000}, {0x43576000}, + {0x43578000}, {0x4357a000}, {0x4357c000}, {0x4357e000}, + {0x43580000}, {0x43582000}, {0x43584000}, {0x43586000}, + {0x43588000}, {0x4358a000}, {0x4358c000}, {0x4358e000}, + {0x43590000}, {0x43592000}, {0x43594000}, {0x43596000}, + {0x43598000}, {0x4359a000}, {0x4359c000}, {0x4359e000}, + {0x435a0000}, {0x435a2000}, {0x435a4000}, {0x435a6000}, + {0x435a8000}, {0x435aa000}, {0x435ac000}, {0x435ae000}, + {0x435b0000}, {0x435b2000}, {0x435b4000}, {0x435b6000}, + {0x435b8000}, {0x435ba000}, {0x435bc000}, {0x435be000}, + {0x435c0000}, {0x435c2000}, {0x435c4000}, {0x435c6000}, + {0x435c8000}, {0x435ca000}, {0x435cc000}, {0x435ce000}, + {0x435d0000}, {0x435d2000}, {0x435d4000}, {0x435d6000}, + {0x435d8000}, {0x435da000}, {0x435dc000}, {0x435de000}, + {0x435e0000}, {0x435e2000}, {0x435e4000}, {0x435e6000}, + {0x435e8000}, {0x435ea000}, {0x435ec000}, {0x435ee000}, + {0x435f0000}, {0x435f2000}, {0x435f4000}, {0x435f6000}, + {0x435f8000}, {0x435fa000}, {0x435fc000}, {0x435fe000}, + {0x43600000}, {0x43602000}, {0x43604000}, {0x43606000}, + {0x43608000}, {0x4360a000}, {0x4360c000}, {0x4360e000}, + {0x43610000}, {0x43612000}, {0x43614000}, {0x43616000}, + {0x43618000}, {0x4361a000}, {0x4361c000}, {0x4361e000}, + {0x43620000}, {0x43622000}, {0x43624000}, {0x43626000}, + {0x43628000}, {0x4362a000}, {0x4362c000}, {0x4362e000}, + {0x43630000}, {0x43632000}, {0x43634000}, {0x43636000}, + {0x43638000}, {0x4363a000}, {0x4363c000}, {0x4363e000}, + {0x43640000}, {0x43642000}, {0x43644000}, {0x43646000}, + {0x43648000}, {0x4364a000}, {0x4364c000}, {0x4364e000}, + {0x43650000}, {0x43652000}, {0x43654000}, {0x43656000}, + {0x43658000}, {0x4365a000}, {0x4365c000}, {0x4365e000}, + {0x43660000}, {0x43662000}, {0x43664000}, {0x43666000}, + {0x43668000}, {0x4366a000}, {0x4366c000}, {0x4366e000}, + {0x43670000}, {0x43672000}, {0x43674000}, {0x43676000}, + {0x43678000}, {0x4367a000}, {0x4367c000}, {0x4367e000}, + {0x43680000}, {0x43682000}, {0x43684000}, {0x43686000}, + {0x43688000}, {0x4368a000}, {0x4368c000}, {0x4368e000}, + {0x43690000}, {0x43692000}, {0x43694000}, {0x43696000}, + {0x43698000}, {0x4369a000}, {0x4369c000}, {0x4369e000}, + {0x436a0000}, {0x436a2000}, {0x436a4000}, {0x436a6000}, + {0x436a8000}, {0x436aa000}, {0x436ac000}, {0x436ae000}, + {0x436b0000}, {0x436b2000}, {0x436b4000}, {0x436b6000}, + {0x436b8000}, {0x436ba000}, {0x436bc000}, {0x436be000}, + {0x436c0000}, {0x436c2000}, {0x436c4000}, {0x436c6000}, + {0x436c8000}, {0x436ca000}, {0x436cc000}, {0x436ce000}, + {0x436d0000}, {0x436d2000}, {0x436d4000}, {0x436d6000}, + {0x436d8000}, {0x436da000}, {0x436dc000}, {0x436de000}, + {0x436e0000}, {0x436e2000}, {0x436e4000}, {0x436e6000}, + {0x436e8000}, {0x436ea000}, {0x436ec000}, {0x436ee000}, + {0x436f0000}, {0x436f2000}, {0x436f4000}, {0x436f6000}, + {0x436f8000}, {0x436fa000}, {0x436fc000}, {0x436fe000}, + {0x43700000}, {0x43702000}, {0x43704000}, {0x43706000}, + {0x43708000}, {0x4370a000}, {0x4370c000}, {0x4370e000}, + {0x43710000}, {0x43712000}, {0x43714000}, {0x43716000}, + {0x43718000}, {0x4371a000}, {0x4371c000}, {0x4371e000}, + {0x43720000}, {0x43722000}, {0x43724000}, {0x43726000}, + {0x43728000}, {0x4372a000}, {0x4372c000}, {0x4372e000}, + {0x43730000}, {0x43732000}, {0x43734000}, {0x43736000}, + {0x43738000}, {0x4373a000}, {0x4373c000}, {0x4373e000}, + {0x43740000}, {0x43742000}, {0x43744000}, {0x43746000}, + {0x43748000}, {0x4374a000}, {0x4374c000}, {0x4374e000}, + {0x43750000}, {0x43752000}, {0x43754000}, {0x43756000}, + {0x43758000}, {0x4375a000}, {0x4375c000}, {0x4375e000}, + {0x43760000}, {0x43762000}, {0x43764000}, {0x43766000}, + {0x43768000}, {0x4376a000}, {0x4376c000}, {0x4376e000}, + {0x43770000}, {0x43772000}, {0x43774000}, {0x43776000}, + {0x43778000}, {0x4377a000}, {0x4377c000}, {0x4377e000}, + {0x43780000}, {0x43782000}, {0x43784000}, {0x43786000}, + {0x43788000}, {0x4378a000}, {0x4378c000}, {0x4378e000}, + {0x43790000}, {0x43792000}, {0x43794000}, {0x43796000}, + {0x43798000}, {0x4379a000}, {0x4379c000}, {0x4379e000}, + {0x437a0000}, {0x437a2000}, {0x437a4000}, {0x437a6000}, + {0x437a8000}, {0x437aa000}, {0x437ac000}, {0x437ae000}, + {0x437b0000}, {0x437b2000}, {0x437b4000}, {0x437b6000}, + {0x437b8000}, {0x437ba000}, {0x437bc000}, {0x437be000}, + {0x437c0000}, {0x437c2000}, {0x437c4000}, {0x437c6000}, + {0x437c8000}, {0x437ca000}, {0x437cc000}, {0x437ce000}, + {0x437d0000}, {0x437d2000}, {0x437d4000}, {0x437d6000}, + {0x437d8000}, {0x437da000}, {0x437dc000}, {0x437de000}, + {0x437e0000}, {0x437e2000}, {0x437e4000}, {0x437e6000}, + {0x437e8000}, {0x437ea000}, {0x437ec000}, {0x437ee000}, + {0x437f0000}, {0x437f2000}, {0x437f4000}, {0x437f6000}, + {0x437f8000}, {0x437fa000}, {0x437fc000}, {0x437fe000}, + {0x43800000}, {0x43802000}, {0x43804000}, {0x43806000}, + {0x43808000}, {0x4380a000}, {0x4380c000}, {0x4380e000}, + {0x43810000}, {0x43812000}, {0x43814000}, {0x43816000}, + {0x43818000}, {0x4381a000}, {0x4381c000}, {0x4381e000}, + {0x43820000}, {0x43822000}, {0x43824000}, {0x43826000}, + {0x43828000}, {0x4382a000}, {0x4382c000}, {0x4382e000}, + {0x43830000}, {0x43832000}, {0x43834000}, {0x43836000}, + {0x43838000}, {0x4383a000}, {0x4383c000}, {0x4383e000}, + {0x43840000}, {0x43842000}, {0x43844000}, {0x43846000}, + {0x43848000}, {0x4384a000}, {0x4384c000}, {0x4384e000}, + {0x43850000}, {0x43852000}, {0x43854000}, {0x43856000}, + {0x43858000}, {0x4385a000}, {0x4385c000}, {0x4385e000}, + {0x43860000}, {0x43862000}, {0x43864000}, {0x43866000}, + {0x43868000}, {0x4386a000}, {0x4386c000}, {0x4386e000}, + {0x43870000}, {0x43872000}, {0x43874000}, {0x43876000}, + {0x43878000}, {0x4387a000}, {0x4387c000}, {0x4387e000}, + {0x43880000}, {0x43882000}, {0x43884000}, {0x43886000}, + {0x43888000}, {0x4388a000}, {0x4388c000}, {0x4388e000}, + {0x43890000}, {0x43892000}, {0x43894000}, {0x43896000}, + {0x43898000}, {0x4389a000}, {0x4389c000}, {0x4389e000}, + {0x438a0000}, {0x438a2000}, {0x438a4000}, {0x438a6000}, + {0x438a8000}, {0x438aa000}, {0x438ac000}, {0x438ae000}, + {0x438b0000}, {0x438b2000}, {0x438b4000}, {0x438b6000}, + {0x438b8000}, {0x438ba000}, {0x438bc000}, {0x438be000}, + {0x438c0000}, {0x438c2000}, {0x438c4000}, {0x438c6000}, + {0x438c8000}, {0x438ca000}, {0x438cc000}, {0x438ce000}, + {0x438d0000}, {0x438d2000}, {0x438d4000}, {0x438d6000}, + {0x438d8000}, {0x438da000}, {0x438dc000}, {0x438de000}, + {0x438e0000}, {0x438e2000}, {0x438e4000}, {0x438e6000}, + {0x438e8000}, {0x438ea000}, {0x438ec000}, {0x438ee000}, + {0x438f0000}, {0x438f2000}, {0x438f4000}, {0x438f6000}, + {0x438f8000}, {0x438fa000}, {0x438fc000}, {0x438fe000}, + {0x43900000}, {0x43902000}, {0x43904000}, {0x43906000}, + {0x43908000}, {0x4390a000}, {0x4390c000}, {0x4390e000}, + {0x43910000}, {0x43912000}, {0x43914000}, {0x43916000}, + {0x43918000}, {0x4391a000}, {0x4391c000}, {0x4391e000}, + {0x43920000}, {0x43922000}, {0x43924000}, {0x43926000}, + {0x43928000}, {0x4392a000}, {0x4392c000}, {0x4392e000}, + {0x43930000}, {0x43932000}, {0x43934000}, {0x43936000}, + {0x43938000}, {0x4393a000}, {0x4393c000}, {0x4393e000}, + {0x43940000}, {0x43942000}, {0x43944000}, {0x43946000}, + {0x43948000}, {0x4394a000}, {0x4394c000}, {0x4394e000}, + {0x43950000}, {0x43952000}, {0x43954000}, {0x43956000}, + {0x43958000}, {0x4395a000}, {0x4395c000}, {0x4395e000}, + {0x43960000}, {0x43962000}, {0x43964000}, {0x43966000}, + {0x43968000}, {0x4396a000}, {0x4396c000}, {0x4396e000}, + {0x43970000}, {0x43972000}, {0x43974000}, {0x43976000}, + {0x43978000}, {0x4397a000}, {0x4397c000}, {0x4397e000}, + {0x43980000}, {0x43982000}, {0x43984000}, {0x43986000}, + {0x43988000}, {0x4398a000}, {0x4398c000}, {0x4398e000}, + {0x43990000}, {0x43992000}, {0x43994000}, {0x43996000}, + {0x43998000}, {0x4399a000}, {0x4399c000}, {0x4399e000}, + {0x439a0000}, {0x439a2000}, {0x439a4000}, {0x439a6000}, + {0x439a8000}, {0x439aa000}, {0x439ac000}, {0x439ae000}, + {0x439b0000}, {0x439b2000}, {0x439b4000}, {0x439b6000}, + {0x439b8000}, {0x439ba000}, {0x439bc000}, {0x439be000}, + {0x439c0000}, {0x439c2000}, {0x439c4000}, {0x439c6000}, + {0x439c8000}, {0x439ca000}, {0x439cc000}, {0x439ce000}, + {0x439d0000}, {0x439d2000}, {0x439d4000}, {0x439d6000}, + {0x439d8000}, {0x439da000}, {0x439dc000}, {0x439de000}, + {0x439e0000}, {0x439e2000}, {0x439e4000}, {0x439e6000}, + {0x439e8000}, {0x439ea000}, {0x439ec000}, {0x439ee000}, + {0x439f0000}, {0x439f2000}, {0x439f4000}, {0x439f6000}, + {0x439f8000}, {0x439fa000}, {0x439fc000}, {0x439fe000}, + {0x43a00000}, {0x43a02000}, {0x43a04000}, {0x43a06000}, + {0x43a08000}, {0x43a0a000}, {0x43a0c000}, {0x43a0e000}, + {0x43a10000}, {0x43a12000}, {0x43a14000}, {0x43a16000}, + {0x43a18000}, {0x43a1a000}, {0x43a1c000}, {0x43a1e000}, + {0x43a20000}, {0x43a22000}, {0x43a24000}, {0x43a26000}, + {0x43a28000}, {0x43a2a000}, {0x43a2c000}, {0x43a2e000}, + {0x43a30000}, {0x43a32000}, {0x43a34000}, {0x43a36000}, + {0x43a38000}, {0x43a3a000}, {0x43a3c000}, {0x43a3e000}, + {0x43a40000}, {0x43a42000}, {0x43a44000}, {0x43a46000}, + {0x43a48000}, {0x43a4a000}, {0x43a4c000}, {0x43a4e000}, + {0x43a50000}, {0x43a52000}, {0x43a54000}, {0x43a56000}, + {0x43a58000}, {0x43a5a000}, {0x43a5c000}, {0x43a5e000}, + {0x43a60000}, {0x43a62000}, {0x43a64000}, {0x43a66000}, + {0x43a68000}, {0x43a6a000}, {0x43a6c000}, {0x43a6e000}, + {0x43a70000}, {0x43a72000}, {0x43a74000}, {0x43a76000}, + {0x43a78000}, {0x43a7a000}, {0x43a7c000}, {0x43a7e000}, + {0x43a80000}, {0x43a82000}, {0x43a84000}, {0x43a86000}, + {0x43a88000}, {0x43a8a000}, {0x43a8c000}, {0x43a8e000}, + {0x43a90000}, {0x43a92000}, {0x43a94000}, {0x43a96000}, + {0x43a98000}, {0x43a9a000}, {0x43a9c000}, {0x43a9e000}, + {0x43aa0000}, {0x43aa2000}, {0x43aa4000}, {0x43aa6000}, + {0x43aa8000}, {0x43aaa000}, {0x43aac000}, {0x43aae000}, + {0x43ab0000}, {0x43ab2000}, {0x43ab4000}, {0x43ab6000}, + {0x43ab8000}, {0x43aba000}, {0x43abc000}, {0x43abe000}, + {0x43ac0000}, {0x43ac2000}, {0x43ac4000}, {0x43ac6000}, + {0x43ac8000}, {0x43aca000}, {0x43acc000}, {0x43ace000}, + {0x43ad0000}, {0x43ad2000}, {0x43ad4000}, {0x43ad6000}, + {0x43ad8000}, {0x43ada000}, {0x43adc000}, {0x43ade000}, + {0x43ae0000}, {0x43ae2000}, {0x43ae4000}, {0x43ae6000}, + {0x43ae8000}, {0x43aea000}, {0x43aec000}, {0x43aee000}, + {0x43af0000}, {0x43af2000}, {0x43af4000}, {0x43af6000}, + {0x43af8000}, {0x43afa000}, {0x43afc000}, {0x43afe000}, + {0x43b00000}, {0x43b02000}, {0x43b04000}, {0x43b06000}, + {0x43b08000}, {0x43b0a000}, {0x43b0c000}, {0x43b0e000}, + {0x43b10000}, {0x43b12000}, {0x43b14000}, {0x43b16000}, + {0x43b18000}, {0x43b1a000}, {0x43b1c000}, {0x43b1e000}, + {0x43b20000}, {0x43b22000}, {0x43b24000}, {0x43b26000}, + {0x43b28000}, {0x43b2a000}, {0x43b2c000}, {0x43b2e000}, + {0x43b30000}, {0x43b32000}, {0x43b34000}, {0x43b36000}, + {0x43b38000}, {0x43b3a000}, {0x43b3c000}, {0x43b3e000}, + {0x43b40000}, {0x43b42000}, {0x43b44000}, {0x43b46000}, + {0x43b48000}, {0x43b4a000}, {0x43b4c000}, {0x43b4e000}, + {0x43b50000}, {0x43b52000}, {0x43b54000}, {0x43b56000}, + {0x43b58000}, {0x43b5a000}, {0x43b5c000}, {0x43b5e000}, + {0x43b60000}, {0x43b62000}, {0x43b64000}, {0x43b66000}, + {0x43b68000}, {0x43b6a000}, {0x43b6c000}, {0x43b6e000}, + {0x43b70000}, {0x43b72000}, {0x43b74000}, {0x43b76000}, + {0x43b78000}, {0x43b7a000}, {0x43b7c000}, {0x43b7e000}, + {0x43b80000}, {0x43b82000}, {0x43b84000}, {0x43b86000}, + {0x43b88000}, {0x43b8a000}, {0x43b8c000}, {0x43b8e000}, + {0x43b90000}, {0x43b92000}, {0x43b94000}, {0x43b96000}, + {0x43b98000}, {0x43b9a000}, {0x43b9c000}, {0x43b9e000}, + {0x43ba0000}, {0x43ba2000}, {0x43ba4000}, {0x43ba6000}, + {0x43ba8000}, {0x43baa000}, {0x43bac000}, {0x43bae000}, + {0x43bb0000}, {0x43bb2000}, {0x43bb4000}, {0x43bb6000}, + {0x43bb8000}, {0x43bba000}, {0x43bbc000}, {0x43bbe000}, + {0x43bc0000}, {0x43bc2000}, {0x43bc4000}, {0x43bc6000}, + {0x43bc8000}, {0x43bca000}, {0x43bcc000}, {0x43bce000}, + {0x43bd0000}, {0x43bd2000}, {0x43bd4000}, {0x43bd6000}, + {0x43bd8000}, {0x43bda000}, {0x43bdc000}, {0x43bde000}, + {0x43be0000}, {0x43be2000}, {0x43be4000}, {0x43be6000}, + {0x43be8000}, {0x43bea000}, {0x43bec000}, {0x43bee000}, + {0x43bf0000}, {0x43bf2000}, {0x43bf4000}, {0x43bf6000}, + {0x43bf8000}, {0x43bfa000}, {0x43bfc000}, {0x43bfe000}, + {0x43c00000}, {0x43c02000}, {0x43c04000}, {0x43c06000}, + {0x43c08000}, {0x43c0a000}, {0x43c0c000}, {0x43c0e000}, + {0x43c10000}, {0x43c12000}, {0x43c14000}, {0x43c16000}, + {0x43c18000}, {0x43c1a000}, {0x43c1c000}, {0x43c1e000}, + {0x43c20000}, {0x43c22000}, {0x43c24000}, {0x43c26000}, + {0x43c28000}, {0x43c2a000}, {0x43c2c000}, {0x43c2e000}, + {0x43c30000}, {0x43c32000}, {0x43c34000}, {0x43c36000}, + {0x43c38000}, {0x43c3a000}, {0x43c3c000}, {0x43c3e000}, + {0x43c40000}, {0x43c42000}, {0x43c44000}, {0x43c46000}, + {0x43c48000}, {0x43c4a000}, {0x43c4c000}, {0x43c4e000}, + {0x43c50000}, {0x43c52000}, {0x43c54000}, {0x43c56000}, + {0x43c58000}, {0x43c5a000}, {0x43c5c000}, {0x43c5e000}, + {0x43c60000}, {0x43c62000}, {0x43c64000}, {0x43c66000}, + {0x43c68000}, {0x43c6a000}, {0x43c6c000}, {0x43c6e000}, + {0x43c70000}, {0x43c72000}, {0x43c74000}, {0x43c76000}, + {0x43c78000}, {0x43c7a000}, {0x43c7c000}, {0x43c7e000}, + {0x43c80000}, {0x43c82000}, {0x43c84000}, {0x43c86000}, + {0x43c88000}, {0x43c8a000}, {0x43c8c000}, {0x43c8e000}, + {0x43c90000}, {0x43c92000}, {0x43c94000}, {0x43c96000}, + {0x43c98000}, {0x43c9a000}, {0x43c9c000}, {0x43c9e000}, + {0x43ca0000}, {0x43ca2000}, {0x43ca4000}, {0x43ca6000}, + {0x43ca8000}, {0x43caa000}, {0x43cac000}, {0x43cae000}, + {0x43cb0000}, {0x43cb2000}, {0x43cb4000}, {0x43cb6000}, + {0x43cb8000}, {0x43cba000}, {0x43cbc000}, {0x43cbe000}, + {0x43cc0000}, {0x43cc2000}, {0x43cc4000}, {0x43cc6000}, + {0x43cc8000}, {0x43cca000}, {0x43ccc000}, {0x43cce000}, + {0x43cd0000}, {0x43cd2000}, {0x43cd4000}, {0x43cd6000}, + {0x43cd8000}, {0x43cda000}, {0x43cdc000}, {0x43cde000}, + {0x43ce0000}, {0x43ce2000}, {0x43ce4000}, {0x43ce6000}, + {0x43ce8000}, {0x43cea000}, {0x43cec000}, {0x43cee000}, + {0x43cf0000}, {0x43cf2000}, {0x43cf4000}, {0x43cf6000}, + {0x43cf8000}, {0x43cfa000}, {0x43cfc000}, {0x43cfe000}, + {0x43d00000}, {0x43d02000}, {0x43d04000}, {0x43d06000}, + {0x43d08000}, {0x43d0a000}, {0x43d0c000}, {0x43d0e000}, + {0x43d10000}, {0x43d12000}, {0x43d14000}, {0x43d16000}, + {0x43d18000}, {0x43d1a000}, {0x43d1c000}, {0x43d1e000}, + {0x43d20000}, {0x43d22000}, {0x43d24000}, {0x43d26000}, + {0x43d28000}, {0x43d2a000}, {0x43d2c000}, {0x43d2e000}, + {0x43d30000}, {0x43d32000}, {0x43d34000}, {0x43d36000}, + {0x43d38000}, {0x43d3a000}, {0x43d3c000}, {0x43d3e000}, + {0x43d40000}, {0x43d42000}, {0x43d44000}, {0x43d46000}, + {0x43d48000}, {0x43d4a000}, {0x43d4c000}, {0x43d4e000}, + {0x43d50000}, {0x43d52000}, {0x43d54000}, {0x43d56000}, + {0x43d58000}, {0x43d5a000}, {0x43d5c000}, {0x43d5e000}, + {0x43d60000}, {0x43d62000}, {0x43d64000}, {0x43d66000}, + {0x43d68000}, {0x43d6a000}, {0x43d6c000}, {0x43d6e000}, + {0x43d70000}, {0x43d72000}, {0x43d74000}, {0x43d76000}, + {0x43d78000}, {0x43d7a000}, {0x43d7c000}, {0x43d7e000}, + {0x43d80000}, {0x43d82000}, {0x43d84000}, {0x43d86000}, + {0x43d88000}, {0x43d8a000}, {0x43d8c000}, {0x43d8e000}, + {0x43d90000}, {0x43d92000}, {0x43d94000}, {0x43d96000}, + {0x43d98000}, {0x43d9a000}, {0x43d9c000}, {0x43d9e000}, + {0x43da0000}, {0x43da2000}, {0x43da4000}, {0x43da6000}, + {0x43da8000}, {0x43daa000}, {0x43dac000}, {0x43dae000}, + {0x43db0000}, {0x43db2000}, {0x43db4000}, {0x43db6000}, + {0x43db8000}, {0x43dba000}, {0x43dbc000}, {0x43dbe000}, + {0x43dc0000}, {0x43dc2000}, {0x43dc4000}, {0x43dc6000}, + {0x43dc8000}, {0x43dca000}, {0x43dcc000}, {0x43dce000}, + {0x43dd0000}, {0x43dd2000}, {0x43dd4000}, {0x43dd6000}, + {0x43dd8000}, {0x43dda000}, {0x43ddc000}, {0x43dde000}, + {0x43de0000}, {0x43de2000}, {0x43de4000}, {0x43de6000}, + {0x43de8000}, {0x43dea000}, {0x43dec000}, {0x43dee000}, + {0x43df0000}, {0x43df2000}, {0x43df4000}, {0x43df6000}, + {0x43df8000}, {0x43dfa000}, {0x43dfc000}, {0x43dfe000}, + {0x43e00000}, {0x43e02000}, {0x43e04000}, {0x43e06000}, + {0x43e08000}, {0x43e0a000}, {0x43e0c000}, {0x43e0e000}, + {0x43e10000}, {0x43e12000}, {0x43e14000}, {0x43e16000}, + {0x43e18000}, {0x43e1a000}, {0x43e1c000}, {0x43e1e000}, + {0x43e20000}, {0x43e22000}, {0x43e24000}, {0x43e26000}, + {0x43e28000}, {0x43e2a000}, {0x43e2c000}, {0x43e2e000}, + {0x43e30000}, {0x43e32000}, {0x43e34000}, {0x43e36000}, + {0x43e38000}, {0x43e3a000}, {0x43e3c000}, {0x43e3e000}, + {0x43e40000}, {0x43e42000}, {0x43e44000}, {0x43e46000}, + {0x43e48000}, {0x43e4a000}, {0x43e4c000}, {0x43e4e000}, + {0x43e50000}, {0x43e52000}, {0x43e54000}, {0x43e56000}, + {0x43e58000}, {0x43e5a000}, {0x43e5c000}, {0x43e5e000}, + {0x43e60000}, {0x43e62000}, {0x43e64000}, {0x43e66000}, + {0x43e68000}, {0x43e6a000}, {0x43e6c000}, {0x43e6e000}, + {0x43e70000}, {0x43e72000}, {0x43e74000}, {0x43e76000}, + {0x43e78000}, {0x43e7a000}, {0x43e7c000}, {0x43e7e000}, + {0x43e80000}, {0x43e82000}, {0x43e84000}, {0x43e86000}, + {0x43e88000}, {0x43e8a000}, {0x43e8c000}, {0x43e8e000}, + {0x43e90000}, {0x43e92000}, {0x43e94000}, {0x43e96000}, + {0x43e98000}, {0x43e9a000}, {0x43e9c000}, {0x43e9e000}, + {0x43ea0000}, {0x43ea2000}, {0x43ea4000}, {0x43ea6000}, + {0x43ea8000}, {0x43eaa000}, {0x43eac000}, {0x43eae000}, + {0x43eb0000}, {0x43eb2000}, {0x43eb4000}, {0x43eb6000}, + {0x43eb8000}, {0x43eba000}, {0x43ebc000}, {0x43ebe000}, + {0x43ec0000}, {0x43ec2000}, {0x43ec4000}, {0x43ec6000}, + {0x43ec8000}, {0x43eca000}, {0x43ecc000}, {0x43ece000}, + {0x43ed0000}, {0x43ed2000}, {0x43ed4000}, {0x43ed6000}, + {0x43ed8000}, {0x43eda000}, {0x43edc000}, {0x43ede000}, + {0x43ee0000}, {0x43ee2000}, {0x43ee4000}, {0x43ee6000}, + {0x43ee8000}, {0x43eea000}, {0x43eec000}, {0x43eee000}, + {0x43ef0000}, {0x43ef2000}, {0x43ef4000}, {0x43ef6000}, + {0x43ef8000}, {0x43efa000}, {0x43efc000}, {0x43efe000}, + {0x43f00000}, {0x43f02000}, {0x43f04000}, {0x43f06000}, + {0x43f08000}, {0x43f0a000}, {0x43f0c000}, {0x43f0e000}, + {0x43f10000}, {0x43f12000}, {0x43f14000}, {0x43f16000}, + {0x43f18000}, {0x43f1a000}, {0x43f1c000}, {0x43f1e000}, + {0x43f20000}, {0x43f22000}, {0x43f24000}, {0x43f26000}, + {0x43f28000}, {0x43f2a000}, {0x43f2c000}, {0x43f2e000}, + {0x43f30000}, {0x43f32000}, {0x43f34000}, {0x43f36000}, + {0x43f38000}, {0x43f3a000}, {0x43f3c000}, {0x43f3e000}, + {0x43f40000}, {0x43f42000}, {0x43f44000}, {0x43f46000}, + {0x43f48000}, {0x43f4a000}, {0x43f4c000}, {0x43f4e000}, + {0x43f50000}, {0x43f52000}, {0x43f54000}, {0x43f56000}, + {0x43f58000}, {0x43f5a000}, {0x43f5c000}, {0x43f5e000}, + {0x43f60000}, {0x43f62000}, {0x43f64000}, {0x43f66000}, + {0x43f68000}, {0x43f6a000}, {0x43f6c000}, {0x43f6e000}, + {0x43f70000}, {0x43f72000}, {0x43f74000}, {0x43f76000}, + {0x43f78000}, {0x43f7a000}, {0x43f7c000}, {0x43f7e000}, + {0x43f80000}, {0x43f82000}, {0x43f84000}, {0x43f86000}, + {0x43f88000}, {0x43f8a000}, {0x43f8c000}, {0x43f8e000}, + {0x43f90000}, {0x43f92000}, {0x43f94000}, {0x43f96000}, + {0x43f98000}, {0x43f9a000}, {0x43f9c000}, {0x43f9e000}, + {0x43fa0000}, {0x43fa2000}, {0x43fa4000}, {0x43fa6000}, + {0x43fa8000}, {0x43faa000}, {0x43fac000}, {0x43fae000}, + {0x43fb0000}, {0x43fb2000}, {0x43fb4000}, {0x43fb6000}, + {0x43fb8000}, {0x43fba000}, {0x43fbc000}, {0x43fbe000}, + {0x43fc0000}, {0x43fc2000}, {0x43fc4000}, {0x43fc6000}, + {0x43fc8000}, {0x43fca000}, {0x43fcc000}, {0x43fce000}, + {0x43fd0000}, {0x43fd2000}, {0x43fd4000}, {0x43fd6000}, + {0x43fd8000}, {0x43fda000}, {0x43fdc000}, {0x43fde000}, + {0x43fe0000}, {0x43fe2000}, {0x43fe4000}, {0x43fe6000}, + {0x43fe8000}, {0x43fea000}, {0x43fec000}, {0x43fee000}, + {0x43ff0000}, {0x43ff2000}, {0x43ff4000}, {0x43ff6000}, + {0x43ff8000}, {0x43ffa000}, {0x43ffc000}, {0x43ffe000}, + {0x44000000}, {0x44002000}, {0x44004000}, {0x44006000}, + {0x44008000}, {0x4400a000}, {0x4400c000}, {0x4400e000}, + {0x44010000}, {0x44012000}, {0x44014000}, {0x44016000}, + {0x44018000}, {0x4401a000}, {0x4401c000}, {0x4401e000}, + {0x44020000}, {0x44022000}, {0x44024000}, {0x44026000}, + {0x44028000}, {0x4402a000}, {0x4402c000}, {0x4402e000}, + {0x44030000}, {0x44032000}, {0x44034000}, {0x44036000}, + {0x44038000}, {0x4403a000}, {0x4403c000}, {0x4403e000}, + {0x44040000}, {0x44042000}, {0x44044000}, {0x44046000}, + {0x44048000}, {0x4404a000}, {0x4404c000}, {0x4404e000}, + {0x44050000}, {0x44052000}, {0x44054000}, {0x44056000}, + {0x44058000}, {0x4405a000}, {0x4405c000}, {0x4405e000}, + {0x44060000}, {0x44062000}, {0x44064000}, {0x44066000}, + {0x44068000}, {0x4406a000}, {0x4406c000}, {0x4406e000}, + {0x44070000}, {0x44072000}, {0x44074000}, {0x44076000}, + {0x44078000}, {0x4407a000}, {0x4407c000}, {0x4407e000}, + {0x44080000}, {0x44082000}, {0x44084000}, {0x44086000}, + {0x44088000}, {0x4408a000}, {0x4408c000}, {0x4408e000}, + {0x44090000}, {0x44092000}, {0x44094000}, {0x44096000}, + {0x44098000}, {0x4409a000}, {0x4409c000}, {0x4409e000}, + {0x440a0000}, {0x440a2000}, {0x440a4000}, {0x440a6000}, + {0x440a8000}, {0x440aa000}, {0x440ac000}, {0x440ae000}, + {0x440b0000}, {0x440b2000}, {0x440b4000}, {0x440b6000}, + {0x440b8000}, {0x440ba000}, {0x440bc000}, {0x440be000}, + {0x440c0000}, {0x440c2000}, {0x440c4000}, {0x440c6000}, + {0x440c8000}, {0x440ca000}, {0x440cc000}, {0x440ce000}, + {0x440d0000}, {0x440d2000}, {0x440d4000}, {0x440d6000}, + {0x440d8000}, {0x440da000}, {0x440dc000}, {0x440de000}, + {0x440e0000}, {0x440e2000}, {0x440e4000}, {0x440e6000}, + {0x440e8000}, {0x440ea000}, {0x440ec000}, {0x440ee000}, + {0x440f0000}, {0x440f2000}, {0x440f4000}, {0x440f6000}, + {0x440f8000}, {0x440fa000}, {0x440fc000}, {0x440fe000}, + {0x44100000}, {0x44102000}, {0x44104000}, {0x44106000}, + {0x44108000}, {0x4410a000}, {0x4410c000}, {0x4410e000}, + {0x44110000}, {0x44112000}, {0x44114000}, {0x44116000}, + {0x44118000}, {0x4411a000}, {0x4411c000}, {0x4411e000}, + {0x44120000}, {0x44122000}, {0x44124000}, {0x44126000}, + {0x44128000}, {0x4412a000}, {0x4412c000}, {0x4412e000}, + {0x44130000}, {0x44132000}, {0x44134000}, {0x44136000}, + {0x44138000}, {0x4413a000}, {0x4413c000}, {0x4413e000}, + {0x44140000}, {0x44142000}, {0x44144000}, {0x44146000}, + {0x44148000}, {0x4414a000}, {0x4414c000}, {0x4414e000}, + {0x44150000}, {0x44152000}, {0x44154000}, {0x44156000}, + {0x44158000}, {0x4415a000}, {0x4415c000}, {0x4415e000}, + {0x44160000}, {0x44162000}, {0x44164000}, {0x44166000}, + {0x44168000}, {0x4416a000}, {0x4416c000}, {0x4416e000}, + {0x44170000}, {0x44172000}, {0x44174000}, {0x44176000}, + {0x44178000}, {0x4417a000}, {0x4417c000}, {0x4417e000}, + {0x44180000}, {0x44182000}, {0x44184000}, {0x44186000}, + {0x44188000}, {0x4418a000}, {0x4418c000}, {0x4418e000}, + {0x44190000}, {0x44192000}, {0x44194000}, {0x44196000}, + {0x44198000}, {0x4419a000}, {0x4419c000}, {0x4419e000}, + {0x441a0000}, {0x441a2000}, {0x441a4000}, {0x441a6000}, + {0x441a8000}, {0x441aa000}, {0x441ac000}, {0x441ae000}, + {0x441b0000}, {0x441b2000}, {0x441b4000}, {0x441b6000}, + {0x441b8000}, {0x441ba000}, {0x441bc000}, {0x441be000}, + {0x441c0000}, {0x441c2000}, {0x441c4000}, {0x441c6000}, + {0x441c8000}, {0x441ca000}, {0x441cc000}, {0x441ce000}, + {0x441d0000}, {0x441d2000}, {0x441d4000}, {0x441d6000}, + {0x441d8000}, {0x441da000}, {0x441dc000}, {0x441de000}, + {0x441e0000}, {0x441e2000}, {0x441e4000}, {0x441e6000}, + {0x441e8000}, {0x441ea000}, {0x441ec000}, {0x441ee000}, + {0x441f0000}, {0x441f2000}, {0x441f4000}, {0x441f6000}, + {0x441f8000}, {0x441fa000}, {0x441fc000}, {0x441fe000}, + {0x44200000}, {0x44202000}, {0x44204000}, {0x44206000}, + {0x44208000}, {0x4420a000}, {0x4420c000}, {0x4420e000}, + {0x44210000}, {0x44212000}, {0x44214000}, {0x44216000}, + {0x44218000}, {0x4421a000}, {0x4421c000}, {0x4421e000}, + {0x44220000}, {0x44222000}, {0x44224000}, {0x44226000}, + {0x44228000}, {0x4422a000}, {0x4422c000}, {0x4422e000}, + {0x44230000}, {0x44232000}, {0x44234000}, {0x44236000}, + {0x44238000}, {0x4423a000}, {0x4423c000}, {0x4423e000}, + {0x44240000}, {0x44242000}, {0x44244000}, {0x44246000}, + {0x44248000}, {0x4424a000}, {0x4424c000}, {0x4424e000}, + {0x44250000}, {0x44252000}, {0x44254000}, {0x44256000}, + {0x44258000}, {0x4425a000}, {0x4425c000}, {0x4425e000}, + {0x44260000}, {0x44262000}, {0x44264000}, {0x44266000}, + {0x44268000}, {0x4426a000}, {0x4426c000}, {0x4426e000}, + {0x44270000}, {0x44272000}, {0x44274000}, {0x44276000}, + {0x44278000}, {0x4427a000}, {0x4427c000}, {0x4427e000}, + {0x44280000}, {0x44282000}, {0x44284000}, {0x44286000}, + {0x44288000}, {0x4428a000}, {0x4428c000}, {0x4428e000}, + {0x44290000}, {0x44292000}, {0x44294000}, {0x44296000}, + {0x44298000}, {0x4429a000}, {0x4429c000}, {0x4429e000}, + {0x442a0000}, {0x442a2000}, {0x442a4000}, {0x442a6000}, + {0x442a8000}, {0x442aa000}, {0x442ac000}, {0x442ae000}, + {0x442b0000}, {0x442b2000}, {0x442b4000}, {0x442b6000}, + {0x442b8000}, {0x442ba000}, {0x442bc000}, {0x442be000}, + {0x442c0000}, {0x442c2000}, {0x442c4000}, {0x442c6000}, + {0x442c8000}, {0x442ca000}, {0x442cc000}, {0x442ce000}, + {0x442d0000}, {0x442d2000}, {0x442d4000}, {0x442d6000}, + {0x442d8000}, {0x442da000}, {0x442dc000}, {0x442de000}, + {0x442e0000}, {0x442e2000}, {0x442e4000}, {0x442e6000}, + {0x442e8000}, {0x442ea000}, {0x442ec000}, {0x442ee000}, + {0x442f0000}, {0x442f2000}, {0x442f4000}, {0x442f6000}, + {0x442f8000}, {0x442fa000}, {0x442fc000}, {0x442fe000}, + {0x44300000}, {0x44302000}, {0x44304000}, {0x44306000}, + {0x44308000}, {0x4430a000}, {0x4430c000}, {0x4430e000}, + {0x44310000}, {0x44312000}, {0x44314000}, {0x44316000}, + {0x44318000}, {0x4431a000}, {0x4431c000}, {0x4431e000}, + {0x44320000}, {0x44322000}, {0x44324000}, {0x44326000}, + {0x44328000}, {0x4432a000}, {0x4432c000}, {0x4432e000}, + {0x44330000}, {0x44332000}, {0x44334000}, {0x44336000}, + {0x44338000}, {0x4433a000}, {0x4433c000}, {0x4433e000}, + {0x44340000}, {0x44342000}, {0x44344000}, {0x44346000}, + {0x44348000}, {0x4434a000}, {0x4434c000}, {0x4434e000}, + {0x44350000}, {0x44352000}, {0x44354000}, {0x44356000}, + {0x44358000}, {0x4435a000}, {0x4435c000}, {0x4435e000}, + {0x44360000}, {0x44362000}, {0x44364000}, {0x44366000}, + {0x44368000}, {0x4436a000}, {0x4436c000}, {0x4436e000}, + {0x44370000}, {0x44372000}, {0x44374000}, {0x44376000}, + {0x44378000}, {0x4437a000}, {0x4437c000}, {0x4437e000}, + {0x44380000}, {0x44382000}, {0x44384000}, {0x44386000}, + {0x44388000}, {0x4438a000}, {0x4438c000}, {0x4438e000}, + {0x44390000}, {0x44392000}, {0x44394000}, {0x44396000}, + {0x44398000}, {0x4439a000}, {0x4439c000}, {0x4439e000}, + {0x443a0000}, {0x443a2000}, {0x443a4000}, {0x443a6000}, + {0x443a8000}, {0x443aa000}, {0x443ac000}, {0x443ae000}, + {0x443b0000}, {0x443b2000}, {0x443b4000}, {0x443b6000}, + {0x443b8000}, {0x443ba000}, {0x443bc000}, {0x443be000}, + {0x443c0000}, {0x443c2000}, {0x443c4000}, {0x443c6000}, + {0x443c8000}, {0x443ca000}, {0x443cc000}, {0x443ce000}, + {0x443d0000}, {0x443d2000}, {0x443d4000}, {0x443d6000}, + {0x443d8000}, {0x443da000}, {0x443dc000}, {0x443de000}, + {0x443e0000}, {0x443e2000}, {0x443e4000}, {0x443e6000}, + {0x443e8000}, {0x443ea000}, {0x443ec000}, {0x443ee000}, + {0x443f0000}, {0x443f2000}, {0x443f4000}, {0x443f6000}, + {0x443f8000}, {0x443fa000}, {0x443fc000}, {0x443fe000}, + {0x44400000}, {0x44402000}, {0x44404000}, {0x44406000}, + {0x44408000}, {0x4440a000}, {0x4440c000}, {0x4440e000}, + {0x44410000}, {0x44412000}, {0x44414000}, {0x44416000}, + {0x44418000}, {0x4441a000}, {0x4441c000}, {0x4441e000}, + {0x44420000}, {0x44422000}, {0x44424000}, {0x44426000}, + {0x44428000}, {0x4442a000}, {0x4442c000}, {0x4442e000}, + {0x44430000}, {0x44432000}, {0x44434000}, {0x44436000}, + {0x44438000}, {0x4443a000}, {0x4443c000}, {0x4443e000}, + {0x44440000}, {0x44442000}, {0x44444000}, {0x44446000}, + {0x44448000}, {0x4444a000}, {0x4444c000}, {0x4444e000}, + {0x44450000}, {0x44452000}, {0x44454000}, {0x44456000}, + {0x44458000}, {0x4445a000}, {0x4445c000}, {0x4445e000}, + {0x44460000}, {0x44462000}, {0x44464000}, {0x44466000}, + {0x44468000}, {0x4446a000}, {0x4446c000}, {0x4446e000}, + {0x44470000}, {0x44472000}, {0x44474000}, {0x44476000}, + {0x44478000}, {0x4447a000}, {0x4447c000}, {0x4447e000}, + {0x44480000}, {0x44482000}, {0x44484000}, {0x44486000}, + {0x44488000}, {0x4448a000}, {0x4448c000}, {0x4448e000}, + {0x44490000}, {0x44492000}, {0x44494000}, {0x44496000}, + {0x44498000}, {0x4449a000}, {0x4449c000}, {0x4449e000}, + {0x444a0000}, {0x444a2000}, {0x444a4000}, {0x444a6000}, + {0x444a8000}, {0x444aa000}, {0x444ac000}, {0x444ae000}, + {0x444b0000}, {0x444b2000}, {0x444b4000}, {0x444b6000}, + {0x444b8000}, {0x444ba000}, {0x444bc000}, {0x444be000}, + {0x444c0000}, {0x444c2000}, {0x444c4000}, {0x444c6000}, + {0x444c8000}, {0x444ca000}, {0x444cc000}, {0x444ce000}, + {0x444d0000}, {0x444d2000}, {0x444d4000}, {0x444d6000}, + {0x444d8000}, {0x444da000}, {0x444dc000}, {0x444de000}, + {0x444e0000}, {0x444e2000}, {0x444e4000}, {0x444e6000}, + {0x444e8000}, {0x444ea000}, {0x444ec000}, {0x444ee000}, + {0x444f0000}, {0x444f2000}, {0x444f4000}, {0x444f6000}, + {0x444f8000}, {0x444fa000}, {0x444fc000}, {0x444fe000}, + {0x44500000}, {0x44502000}, {0x44504000}, {0x44506000}, + {0x44508000}, {0x4450a000}, {0x4450c000}, {0x4450e000}, + {0x44510000}, {0x44512000}, {0x44514000}, {0x44516000}, + {0x44518000}, {0x4451a000}, {0x4451c000}, {0x4451e000}, + {0x44520000}, {0x44522000}, {0x44524000}, {0x44526000}, + {0x44528000}, {0x4452a000}, {0x4452c000}, {0x4452e000}, + {0x44530000}, {0x44532000}, {0x44534000}, {0x44536000}, + {0x44538000}, {0x4453a000}, {0x4453c000}, {0x4453e000}, + {0x44540000}, {0x44542000}, {0x44544000}, {0x44546000}, + {0x44548000}, {0x4454a000}, {0x4454c000}, {0x4454e000}, + {0x44550000}, {0x44552000}, {0x44554000}, {0x44556000}, + {0x44558000}, {0x4455a000}, {0x4455c000}, {0x4455e000}, + {0x44560000}, {0x44562000}, {0x44564000}, {0x44566000}, + {0x44568000}, {0x4456a000}, {0x4456c000}, {0x4456e000}, + {0x44570000}, {0x44572000}, {0x44574000}, {0x44576000}, + {0x44578000}, {0x4457a000}, {0x4457c000}, {0x4457e000}, + {0x44580000}, {0x44582000}, {0x44584000}, {0x44586000}, + {0x44588000}, {0x4458a000}, {0x4458c000}, {0x4458e000}, + {0x44590000}, {0x44592000}, {0x44594000}, {0x44596000}, + {0x44598000}, {0x4459a000}, {0x4459c000}, {0x4459e000}, + {0x445a0000}, {0x445a2000}, {0x445a4000}, {0x445a6000}, + {0x445a8000}, {0x445aa000}, {0x445ac000}, {0x445ae000}, + {0x445b0000}, {0x445b2000}, {0x445b4000}, {0x445b6000}, + {0x445b8000}, {0x445ba000}, {0x445bc000}, {0x445be000}, + {0x445c0000}, {0x445c2000}, {0x445c4000}, {0x445c6000}, + {0x445c8000}, {0x445ca000}, {0x445cc000}, {0x445ce000}, + {0x445d0000}, {0x445d2000}, {0x445d4000}, {0x445d6000}, + {0x445d8000}, {0x445da000}, {0x445dc000}, {0x445de000}, + {0x445e0000}, {0x445e2000}, {0x445e4000}, {0x445e6000}, + {0x445e8000}, {0x445ea000}, {0x445ec000}, {0x445ee000}, + {0x445f0000}, {0x445f2000}, {0x445f4000}, {0x445f6000}, + {0x445f8000}, {0x445fa000}, {0x445fc000}, {0x445fe000}, + {0x44600000}, {0x44602000}, {0x44604000}, {0x44606000}, + {0x44608000}, {0x4460a000}, {0x4460c000}, {0x4460e000}, + {0x44610000}, {0x44612000}, {0x44614000}, {0x44616000}, + {0x44618000}, {0x4461a000}, {0x4461c000}, {0x4461e000}, + {0x44620000}, {0x44622000}, {0x44624000}, {0x44626000}, + {0x44628000}, {0x4462a000}, {0x4462c000}, {0x4462e000}, + {0x44630000}, {0x44632000}, {0x44634000}, {0x44636000}, + {0x44638000}, {0x4463a000}, {0x4463c000}, {0x4463e000}, + {0x44640000}, {0x44642000}, {0x44644000}, {0x44646000}, + {0x44648000}, {0x4464a000}, {0x4464c000}, {0x4464e000}, + {0x44650000}, {0x44652000}, {0x44654000}, {0x44656000}, + {0x44658000}, {0x4465a000}, {0x4465c000}, {0x4465e000}, + {0x44660000}, {0x44662000}, {0x44664000}, {0x44666000}, + {0x44668000}, {0x4466a000}, {0x4466c000}, {0x4466e000}, + {0x44670000}, {0x44672000}, {0x44674000}, {0x44676000}, + {0x44678000}, {0x4467a000}, {0x4467c000}, {0x4467e000}, + {0x44680000}, {0x44682000}, {0x44684000}, {0x44686000}, + {0x44688000}, {0x4468a000}, {0x4468c000}, {0x4468e000}, + {0x44690000}, {0x44692000}, {0x44694000}, {0x44696000}, + {0x44698000}, {0x4469a000}, {0x4469c000}, {0x4469e000}, + {0x446a0000}, {0x446a2000}, {0x446a4000}, {0x446a6000}, + {0x446a8000}, {0x446aa000}, {0x446ac000}, {0x446ae000}, + {0x446b0000}, {0x446b2000}, {0x446b4000}, {0x446b6000}, + {0x446b8000}, {0x446ba000}, {0x446bc000}, {0x446be000}, + {0x446c0000}, {0x446c2000}, {0x446c4000}, {0x446c6000}, + {0x446c8000}, {0x446ca000}, {0x446cc000}, {0x446ce000}, + {0x446d0000}, {0x446d2000}, {0x446d4000}, {0x446d6000}, + {0x446d8000}, {0x446da000}, {0x446dc000}, {0x446de000}, + {0x446e0000}, {0x446e2000}, {0x446e4000}, {0x446e6000}, + {0x446e8000}, {0x446ea000}, {0x446ec000}, {0x446ee000}, + {0x446f0000}, {0x446f2000}, {0x446f4000}, {0x446f6000}, + {0x446f8000}, {0x446fa000}, {0x446fc000}, {0x446fe000}, + {0x44700000}, {0x44702000}, {0x44704000}, {0x44706000}, + {0x44708000}, {0x4470a000}, {0x4470c000}, {0x4470e000}, + {0x44710000}, {0x44712000}, {0x44714000}, {0x44716000}, + {0x44718000}, {0x4471a000}, {0x4471c000}, {0x4471e000}, + {0x44720000}, {0x44722000}, {0x44724000}, {0x44726000}, + {0x44728000}, {0x4472a000}, {0x4472c000}, {0x4472e000}, + {0x44730000}, {0x44732000}, {0x44734000}, {0x44736000}, + {0x44738000}, {0x4473a000}, {0x4473c000}, {0x4473e000}, + {0x44740000}, {0x44742000}, {0x44744000}, {0x44746000}, + {0x44748000}, {0x4474a000}, {0x4474c000}, {0x4474e000}, + {0x44750000}, {0x44752000}, {0x44754000}, {0x44756000}, + {0x44758000}, {0x4475a000}, {0x4475c000}, {0x4475e000}, + {0x44760000}, {0x44762000}, {0x44764000}, {0x44766000}, + {0x44768000}, {0x4476a000}, {0x4476c000}, {0x4476e000}, + {0x44770000}, {0x44772000}, {0x44774000}, {0x44776000}, + {0x44778000}, {0x4477a000}, {0x4477c000}, {0x4477e000}, + {0x44780000}, {0x44782000}, {0x44784000}, {0x44786000}, + {0x44788000}, {0x4478a000}, {0x4478c000}, {0x4478e000}, + {0x44790000}, {0x44792000}, {0x44794000}, {0x44796000}, + {0x44798000}, {0x4479a000}, {0x4479c000}, {0x4479e000}, + {0x447a0000}, {0x447a2000}, {0x447a4000}, {0x447a6000}, + {0x447a8000}, {0x447aa000}, {0x447ac000}, {0x447ae000}, + {0x447b0000}, {0x447b2000}, {0x447b4000}, {0x447b6000}, + {0x447b8000}, {0x447ba000}, {0x447bc000}, {0x447be000}, + {0x447c0000}, {0x447c2000}, {0x447c4000}, {0x447c6000}, + {0x447c8000}, {0x447ca000}, {0x447cc000}, {0x447ce000}, + {0x447d0000}, {0x447d2000}, {0x447d4000}, {0x447d6000}, + {0x447d8000}, {0x447da000}, {0x447dc000}, {0x447de000}, + {0x447e0000}, {0x447e2000}, {0x447e4000}, {0x447e6000}, + {0x447e8000}, {0x447ea000}, {0x447ec000}, {0x447ee000}, + {0x447f0000}, {0x447f2000}, {0x447f4000}, {0x447f6000}, + {0x447f8000}, {0x447fa000}, {0x447fc000}, {0x447fe000}, + {0x44800000}, {0x44802000}, {0x44804000}, {0x44806000}, + {0x44808000}, {0x4480a000}, {0x4480c000}, {0x4480e000}, + {0x44810000}, {0x44812000}, {0x44814000}, {0x44816000}, + {0x44818000}, {0x4481a000}, {0x4481c000}, {0x4481e000}, + {0x44820000}, {0x44822000}, {0x44824000}, {0x44826000}, + {0x44828000}, {0x4482a000}, {0x4482c000}, {0x4482e000}, + {0x44830000}, {0x44832000}, {0x44834000}, {0x44836000}, + {0x44838000}, {0x4483a000}, {0x4483c000}, {0x4483e000}, + {0x44840000}, {0x44842000}, {0x44844000}, {0x44846000}, + {0x44848000}, {0x4484a000}, {0x4484c000}, {0x4484e000}, + {0x44850000}, {0x44852000}, {0x44854000}, {0x44856000}, + {0x44858000}, {0x4485a000}, {0x4485c000}, {0x4485e000}, + {0x44860000}, {0x44862000}, {0x44864000}, {0x44866000}, + {0x44868000}, {0x4486a000}, {0x4486c000}, {0x4486e000}, + {0x44870000}, {0x44872000}, {0x44874000}, {0x44876000}, + {0x44878000}, {0x4487a000}, {0x4487c000}, {0x4487e000}, + {0x44880000}, {0x44882000}, {0x44884000}, {0x44886000}, + {0x44888000}, {0x4488a000}, {0x4488c000}, {0x4488e000}, + {0x44890000}, {0x44892000}, {0x44894000}, {0x44896000}, + {0x44898000}, {0x4489a000}, {0x4489c000}, {0x4489e000}, + {0x448a0000}, {0x448a2000}, {0x448a4000}, {0x448a6000}, + {0x448a8000}, {0x448aa000}, {0x448ac000}, {0x448ae000}, + {0x448b0000}, {0x448b2000}, {0x448b4000}, {0x448b6000}, + {0x448b8000}, {0x448ba000}, {0x448bc000}, {0x448be000}, + {0x448c0000}, {0x448c2000}, {0x448c4000}, {0x448c6000}, + {0x448c8000}, {0x448ca000}, {0x448cc000}, {0x448ce000}, + {0x448d0000}, {0x448d2000}, {0x448d4000}, {0x448d6000}, + {0x448d8000}, {0x448da000}, {0x448dc000}, {0x448de000}, + {0x448e0000}, {0x448e2000}, {0x448e4000}, {0x448e6000}, + {0x448e8000}, {0x448ea000}, {0x448ec000}, {0x448ee000}, + {0x448f0000}, {0x448f2000}, {0x448f4000}, {0x448f6000}, + {0x448f8000}, {0x448fa000}, {0x448fc000}, {0x448fe000}, + {0x44900000}, {0x44902000}, {0x44904000}, {0x44906000}, + {0x44908000}, {0x4490a000}, {0x4490c000}, {0x4490e000}, + {0x44910000}, {0x44912000}, {0x44914000}, {0x44916000}, + {0x44918000}, {0x4491a000}, {0x4491c000}, {0x4491e000}, + {0x44920000}, {0x44922000}, {0x44924000}, {0x44926000}, + {0x44928000}, {0x4492a000}, {0x4492c000}, {0x4492e000}, + {0x44930000}, {0x44932000}, {0x44934000}, {0x44936000}, + {0x44938000}, {0x4493a000}, {0x4493c000}, {0x4493e000}, + {0x44940000}, {0x44942000}, {0x44944000}, {0x44946000}, + {0x44948000}, {0x4494a000}, {0x4494c000}, {0x4494e000}, + {0x44950000}, {0x44952000}, {0x44954000}, {0x44956000}, + {0x44958000}, {0x4495a000}, {0x4495c000}, {0x4495e000}, + {0x44960000}, {0x44962000}, {0x44964000}, {0x44966000}, + {0x44968000}, {0x4496a000}, {0x4496c000}, {0x4496e000}, + {0x44970000}, {0x44972000}, {0x44974000}, {0x44976000}, + {0x44978000}, {0x4497a000}, {0x4497c000}, {0x4497e000}, + {0x44980000}, {0x44982000}, {0x44984000}, {0x44986000}, + {0x44988000}, {0x4498a000}, {0x4498c000}, {0x4498e000}, + {0x44990000}, {0x44992000}, {0x44994000}, {0x44996000}, + {0x44998000}, {0x4499a000}, {0x4499c000}, {0x4499e000}, + {0x449a0000}, {0x449a2000}, {0x449a4000}, {0x449a6000}, + {0x449a8000}, {0x449aa000}, {0x449ac000}, {0x449ae000}, + {0x449b0000}, {0x449b2000}, {0x449b4000}, {0x449b6000}, + {0x449b8000}, {0x449ba000}, {0x449bc000}, {0x449be000}, + {0x449c0000}, {0x449c2000}, {0x449c4000}, {0x449c6000}, + {0x449c8000}, {0x449ca000}, {0x449cc000}, {0x449ce000}, + {0x449d0000}, {0x449d2000}, {0x449d4000}, {0x449d6000}, + {0x449d8000}, {0x449da000}, {0x449dc000}, {0x449de000}, + {0x449e0000}, {0x449e2000}, {0x449e4000}, {0x449e6000}, + {0x449e8000}, {0x449ea000}, {0x449ec000}, {0x449ee000}, + {0x449f0000}, {0x449f2000}, {0x449f4000}, {0x449f6000}, + {0x449f8000}, {0x449fa000}, {0x449fc000}, {0x449fe000}, + {0x44a00000}, {0x44a02000}, {0x44a04000}, {0x44a06000}, + {0x44a08000}, {0x44a0a000}, {0x44a0c000}, {0x44a0e000}, + {0x44a10000}, {0x44a12000}, {0x44a14000}, {0x44a16000}, + {0x44a18000}, {0x44a1a000}, {0x44a1c000}, {0x44a1e000}, + {0x44a20000}, {0x44a22000}, {0x44a24000}, {0x44a26000}, + {0x44a28000}, {0x44a2a000}, {0x44a2c000}, {0x44a2e000}, + {0x44a30000}, {0x44a32000}, {0x44a34000}, {0x44a36000}, + {0x44a38000}, {0x44a3a000}, {0x44a3c000}, {0x44a3e000}, + {0x44a40000}, {0x44a42000}, {0x44a44000}, {0x44a46000}, + {0x44a48000}, {0x44a4a000}, {0x44a4c000}, {0x44a4e000}, + {0x44a50000}, {0x44a52000}, {0x44a54000}, {0x44a56000}, + {0x44a58000}, {0x44a5a000}, {0x44a5c000}, {0x44a5e000}, + {0x44a60000}, {0x44a62000}, {0x44a64000}, {0x44a66000}, + {0x44a68000}, {0x44a6a000}, {0x44a6c000}, {0x44a6e000}, + {0x44a70000}, {0x44a72000}, {0x44a74000}, {0x44a76000}, + {0x44a78000}, {0x44a7a000}, {0x44a7c000}, {0x44a7e000}, + {0x44a80000}, {0x44a82000}, {0x44a84000}, {0x44a86000}, + {0x44a88000}, {0x44a8a000}, {0x44a8c000}, {0x44a8e000}, + {0x44a90000}, {0x44a92000}, {0x44a94000}, {0x44a96000}, + {0x44a98000}, {0x44a9a000}, {0x44a9c000}, {0x44a9e000}, + {0x44aa0000}, {0x44aa2000}, {0x44aa4000}, {0x44aa6000}, + {0x44aa8000}, {0x44aaa000}, {0x44aac000}, {0x44aae000}, + {0x44ab0000}, {0x44ab2000}, {0x44ab4000}, {0x44ab6000}, + {0x44ab8000}, {0x44aba000}, {0x44abc000}, {0x44abe000}, + {0x44ac0000}, {0x44ac2000}, {0x44ac4000}, {0x44ac6000}, + {0x44ac8000}, {0x44aca000}, {0x44acc000}, {0x44ace000}, + {0x44ad0000}, {0x44ad2000}, {0x44ad4000}, {0x44ad6000}, + {0x44ad8000}, {0x44ada000}, {0x44adc000}, {0x44ade000}, + {0x44ae0000}, {0x44ae2000}, {0x44ae4000}, {0x44ae6000}, + {0x44ae8000}, {0x44aea000}, {0x44aec000}, {0x44aee000}, + {0x44af0000}, {0x44af2000}, {0x44af4000}, {0x44af6000}, + {0x44af8000}, {0x44afa000}, {0x44afc000}, {0x44afe000}, + {0x44b00000}, {0x44b02000}, {0x44b04000}, {0x44b06000}, + {0x44b08000}, {0x44b0a000}, {0x44b0c000}, {0x44b0e000}, + {0x44b10000}, {0x44b12000}, {0x44b14000}, {0x44b16000}, + {0x44b18000}, {0x44b1a000}, {0x44b1c000}, {0x44b1e000}, + {0x44b20000}, {0x44b22000}, {0x44b24000}, {0x44b26000}, + {0x44b28000}, {0x44b2a000}, {0x44b2c000}, {0x44b2e000}, + {0x44b30000}, {0x44b32000}, {0x44b34000}, {0x44b36000}, + {0x44b38000}, {0x44b3a000}, {0x44b3c000}, {0x44b3e000}, + {0x44b40000}, {0x44b42000}, {0x44b44000}, {0x44b46000}, + {0x44b48000}, {0x44b4a000}, {0x44b4c000}, {0x44b4e000}, + {0x44b50000}, {0x44b52000}, {0x44b54000}, {0x44b56000}, + {0x44b58000}, {0x44b5a000}, {0x44b5c000}, {0x44b5e000}, + {0x44b60000}, {0x44b62000}, {0x44b64000}, {0x44b66000}, + {0x44b68000}, {0x44b6a000}, {0x44b6c000}, {0x44b6e000}, + {0x44b70000}, {0x44b72000}, {0x44b74000}, {0x44b76000}, + {0x44b78000}, {0x44b7a000}, {0x44b7c000}, {0x44b7e000}, + {0x44b80000}, {0x44b82000}, {0x44b84000}, {0x44b86000}, + {0x44b88000}, {0x44b8a000}, {0x44b8c000}, {0x44b8e000}, + {0x44b90000}, {0x44b92000}, {0x44b94000}, {0x44b96000}, + {0x44b98000}, {0x44b9a000}, {0x44b9c000}, {0x44b9e000}, + {0x44ba0000}, {0x44ba2000}, {0x44ba4000}, {0x44ba6000}, + {0x44ba8000}, {0x44baa000}, {0x44bac000}, {0x44bae000}, + {0x44bb0000}, {0x44bb2000}, {0x44bb4000}, {0x44bb6000}, + {0x44bb8000}, {0x44bba000}, {0x44bbc000}, {0x44bbe000}, + {0x44bc0000}, {0x44bc2000}, {0x44bc4000}, {0x44bc6000}, + {0x44bc8000}, {0x44bca000}, {0x44bcc000}, {0x44bce000}, + {0x44bd0000}, {0x44bd2000}, {0x44bd4000}, {0x44bd6000}, + {0x44bd8000}, {0x44bda000}, {0x44bdc000}, {0x44bde000}, + {0x44be0000}, {0x44be2000}, {0x44be4000}, {0x44be6000}, + {0x44be8000}, {0x44bea000}, {0x44bec000}, {0x44bee000}, + {0x44bf0000}, {0x44bf2000}, {0x44bf4000}, {0x44bf6000}, + {0x44bf8000}, {0x44bfa000}, {0x44bfc000}, {0x44bfe000}, + {0x44c00000}, {0x44c02000}, {0x44c04000}, {0x44c06000}, + {0x44c08000}, {0x44c0a000}, {0x44c0c000}, {0x44c0e000}, + {0x44c10000}, {0x44c12000}, {0x44c14000}, {0x44c16000}, + {0x44c18000}, {0x44c1a000}, {0x44c1c000}, {0x44c1e000}, + {0x44c20000}, {0x44c22000}, {0x44c24000}, {0x44c26000}, + {0x44c28000}, {0x44c2a000}, {0x44c2c000}, {0x44c2e000}, + {0x44c30000}, {0x44c32000}, {0x44c34000}, {0x44c36000}, + {0x44c38000}, {0x44c3a000}, {0x44c3c000}, {0x44c3e000}, + {0x44c40000}, {0x44c42000}, {0x44c44000}, {0x44c46000}, + {0x44c48000}, {0x44c4a000}, {0x44c4c000}, {0x44c4e000}, + {0x44c50000}, {0x44c52000}, {0x44c54000}, {0x44c56000}, + {0x44c58000}, {0x44c5a000}, {0x44c5c000}, {0x44c5e000}, + {0x44c60000}, {0x44c62000}, {0x44c64000}, {0x44c66000}, + {0x44c68000}, {0x44c6a000}, {0x44c6c000}, {0x44c6e000}, + {0x44c70000}, {0x44c72000}, {0x44c74000}, {0x44c76000}, + {0x44c78000}, {0x44c7a000}, {0x44c7c000}, {0x44c7e000}, + {0x44c80000}, {0x44c82000}, {0x44c84000}, {0x44c86000}, + {0x44c88000}, {0x44c8a000}, {0x44c8c000}, {0x44c8e000}, + {0x44c90000}, {0x44c92000}, {0x44c94000}, {0x44c96000}, + {0x44c98000}, {0x44c9a000}, {0x44c9c000}, {0x44c9e000}, + {0x44ca0000}, {0x44ca2000}, {0x44ca4000}, {0x44ca6000}, + {0x44ca8000}, {0x44caa000}, {0x44cac000}, {0x44cae000}, + {0x44cb0000}, {0x44cb2000}, {0x44cb4000}, {0x44cb6000}, + {0x44cb8000}, {0x44cba000}, {0x44cbc000}, {0x44cbe000}, + {0x44cc0000}, {0x44cc2000}, {0x44cc4000}, {0x44cc6000}, + {0x44cc8000}, {0x44cca000}, {0x44ccc000}, {0x44cce000}, + {0x44cd0000}, {0x44cd2000}, {0x44cd4000}, {0x44cd6000}, + {0x44cd8000}, {0x44cda000}, {0x44cdc000}, {0x44cde000}, + {0x44ce0000}, {0x44ce2000}, {0x44ce4000}, {0x44ce6000}, + {0x44ce8000}, {0x44cea000}, {0x44cec000}, {0x44cee000}, + {0x44cf0000}, {0x44cf2000}, {0x44cf4000}, {0x44cf6000}, + {0x44cf8000}, {0x44cfa000}, {0x44cfc000}, {0x44cfe000}, + {0x44d00000}, {0x44d02000}, {0x44d04000}, {0x44d06000}, + {0x44d08000}, {0x44d0a000}, {0x44d0c000}, {0x44d0e000}, + {0x44d10000}, {0x44d12000}, {0x44d14000}, {0x44d16000}, + {0x44d18000}, {0x44d1a000}, {0x44d1c000}, {0x44d1e000}, + {0x44d20000}, {0x44d22000}, {0x44d24000}, {0x44d26000}, + {0x44d28000}, {0x44d2a000}, {0x44d2c000}, {0x44d2e000}, + {0x44d30000}, {0x44d32000}, {0x44d34000}, {0x44d36000}, + {0x44d38000}, {0x44d3a000}, {0x44d3c000}, {0x44d3e000}, + {0x44d40000}, {0x44d42000}, {0x44d44000}, {0x44d46000}, + {0x44d48000}, {0x44d4a000}, {0x44d4c000}, {0x44d4e000}, + {0x44d50000}, {0x44d52000}, {0x44d54000}, {0x44d56000}, + {0x44d58000}, {0x44d5a000}, {0x44d5c000}, {0x44d5e000}, + {0x44d60000}, {0x44d62000}, {0x44d64000}, {0x44d66000}, + {0x44d68000}, {0x44d6a000}, {0x44d6c000}, {0x44d6e000}, + {0x44d70000}, {0x44d72000}, {0x44d74000}, {0x44d76000}, + {0x44d78000}, {0x44d7a000}, {0x44d7c000}, {0x44d7e000}, + {0x44d80000}, {0x44d82000}, {0x44d84000}, {0x44d86000}, + {0x44d88000}, {0x44d8a000}, {0x44d8c000}, {0x44d8e000}, + {0x44d90000}, {0x44d92000}, {0x44d94000}, {0x44d96000}, + {0x44d98000}, {0x44d9a000}, {0x44d9c000}, {0x44d9e000}, + {0x44da0000}, {0x44da2000}, {0x44da4000}, {0x44da6000}, + {0x44da8000}, {0x44daa000}, {0x44dac000}, {0x44dae000}, + {0x44db0000}, {0x44db2000}, {0x44db4000}, {0x44db6000}, + {0x44db8000}, {0x44dba000}, {0x44dbc000}, {0x44dbe000}, + {0x44dc0000}, {0x44dc2000}, {0x44dc4000}, {0x44dc6000}, + {0x44dc8000}, {0x44dca000}, {0x44dcc000}, {0x44dce000}, + {0x44dd0000}, {0x44dd2000}, {0x44dd4000}, {0x44dd6000}, + {0x44dd8000}, {0x44dda000}, {0x44ddc000}, {0x44dde000}, + {0x44de0000}, {0x44de2000}, {0x44de4000}, {0x44de6000}, + {0x44de8000}, {0x44dea000}, {0x44dec000}, {0x44dee000}, + {0x44df0000}, {0x44df2000}, {0x44df4000}, {0x44df6000}, + {0x44df8000}, {0x44dfa000}, {0x44dfc000}, {0x44dfe000}, + {0x44e00000}, {0x44e02000}, {0x44e04000}, {0x44e06000}, + {0x44e08000}, {0x44e0a000}, {0x44e0c000}, {0x44e0e000}, + {0x44e10000}, {0x44e12000}, {0x44e14000}, {0x44e16000}, + {0x44e18000}, {0x44e1a000}, {0x44e1c000}, {0x44e1e000}, + {0x44e20000}, {0x44e22000}, {0x44e24000}, {0x44e26000}, + {0x44e28000}, {0x44e2a000}, {0x44e2c000}, {0x44e2e000}, + {0x44e30000}, {0x44e32000}, {0x44e34000}, {0x44e36000}, + {0x44e38000}, {0x44e3a000}, {0x44e3c000}, {0x44e3e000}, + {0x44e40000}, {0x44e42000}, {0x44e44000}, {0x44e46000}, + {0x44e48000}, {0x44e4a000}, {0x44e4c000}, {0x44e4e000}, + {0x44e50000}, {0x44e52000}, {0x44e54000}, {0x44e56000}, + {0x44e58000}, {0x44e5a000}, {0x44e5c000}, {0x44e5e000}, + {0x44e60000}, {0x44e62000}, {0x44e64000}, {0x44e66000}, + {0x44e68000}, {0x44e6a000}, {0x44e6c000}, {0x44e6e000}, + {0x44e70000}, {0x44e72000}, {0x44e74000}, {0x44e76000}, + {0x44e78000}, {0x44e7a000}, {0x44e7c000}, {0x44e7e000}, + {0x44e80000}, {0x44e82000}, {0x44e84000}, {0x44e86000}, + {0x44e88000}, {0x44e8a000}, {0x44e8c000}, {0x44e8e000}, + {0x44e90000}, {0x44e92000}, {0x44e94000}, {0x44e96000}, + {0x44e98000}, {0x44e9a000}, {0x44e9c000}, {0x44e9e000}, + {0x44ea0000}, {0x44ea2000}, {0x44ea4000}, {0x44ea6000}, + {0x44ea8000}, {0x44eaa000}, {0x44eac000}, {0x44eae000}, + {0x44eb0000}, {0x44eb2000}, {0x44eb4000}, {0x44eb6000}, + {0x44eb8000}, {0x44eba000}, {0x44ebc000}, {0x44ebe000}, + {0x44ec0000}, {0x44ec2000}, {0x44ec4000}, {0x44ec6000}, + {0x44ec8000}, {0x44eca000}, {0x44ecc000}, {0x44ece000}, + {0x44ed0000}, {0x44ed2000}, {0x44ed4000}, {0x44ed6000}, + {0x44ed8000}, {0x44eda000}, {0x44edc000}, {0x44ede000}, + {0x44ee0000}, {0x44ee2000}, {0x44ee4000}, {0x44ee6000}, + {0x44ee8000}, {0x44eea000}, {0x44eec000}, {0x44eee000}, + {0x44ef0000}, {0x44ef2000}, {0x44ef4000}, {0x44ef6000}, + {0x44ef8000}, {0x44efa000}, {0x44efc000}, {0x44efe000}, + {0x44f00000}, {0x44f02000}, {0x44f04000}, {0x44f06000}, + {0x44f08000}, {0x44f0a000}, {0x44f0c000}, {0x44f0e000}, + {0x44f10000}, {0x44f12000}, {0x44f14000}, {0x44f16000}, + {0x44f18000}, {0x44f1a000}, {0x44f1c000}, {0x44f1e000}, + {0x44f20000}, {0x44f22000}, {0x44f24000}, {0x44f26000}, + {0x44f28000}, {0x44f2a000}, {0x44f2c000}, {0x44f2e000}, + {0x44f30000}, {0x44f32000}, {0x44f34000}, {0x44f36000}, + {0x44f38000}, {0x44f3a000}, {0x44f3c000}, {0x44f3e000}, + {0x44f40000}, {0x44f42000}, {0x44f44000}, {0x44f46000}, + {0x44f48000}, {0x44f4a000}, {0x44f4c000}, {0x44f4e000}, + {0x44f50000}, {0x44f52000}, {0x44f54000}, {0x44f56000}, + {0x44f58000}, {0x44f5a000}, {0x44f5c000}, {0x44f5e000}, + {0x44f60000}, {0x44f62000}, {0x44f64000}, {0x44f66000}, + {0x44f68000}, {0x44f6a000}, {0x44f6c000}, {0x44f6e000}, + {0x44f70000}, {0x44f72000}, {0x44f74000}, {0x44f76000}, + {0x44f78000}, {0x44f7a000}, {0x44f7c000}, {0x44f7e000}, + {0x44f80000}, {0x44f82000}, {0x44f84000}, {0x44f86000}, + {0x44f88000}, {0x44f8a000}, {0x44f8c000}, {0x44f8e000}, + {0x44f90000}, {0x44f92000}, {0x44f94000}, {0x44f96000}, + {0x44f98000}, {0x44f9a000}, {0x44f9c000}, {0x44f9e000}, + {0x44fa0000}, {0x44fa2000}, {0x44fa4000}, {0x44fa6000}, + {0x44fa8000}, {0x44faa000}, {0x44fac000}, {0x44fae000}, + {0x44fb0000}, {0x44fb2000}, {0x44fb4000}, {0x44fb6000}, + {0x44fb8000}, {0x44fba000}, {0x44fbc000}, {0x44fbe000}, + {0x44fc0000}, {0x44fc2000}, {0x44fc4000}, {0x44fc6000}, + {0x44fc8000}, {0x44fca000}, {0x44fcc000}, {0x44fce000}, + {0x44fd0000}, {0x44fd2000}, {0x44fd4000}, {0x44fd6000}, + {0x44fd8000}, {0x44fda000}, {0x44fdc000}, {0x44fde000}, + {0x44fe0000}, {0x44fe2000}, {0x44fe4000}, {0x44fe6000}, + {0x44fe8000}, {0x44fea000}, {0x44fec000}, {0x44fee000}, + {0x44ff0000}, {0x44ff2000}, {0x44ff4000}, {0x44ff6000}, + {0x44ff8000}, {0x44ffa000}, {0x44ffc000}, {0x44ffe000}, + {0x45000000}, {0x45002000}, {0x45004000}, {0x45006000}, + {0x45008000}, {0x4500a000}, {0x4500c000}, {0x4500e000}, + {0x45010000}, {0x45012000}, {0x45014000}, {0x45016000}, + {0x45018000}, {0x4501a000}, {0x4501c000}, {0x4501e000}, + {0x45020000}, {0x45022000}, {0x45024000}, {0x45026000}, + {0x45028000}, {0x4502a000}, {0x4502c000}, {0x4502e000}, + {0x45030000}, {0x45032000}, {0x45034000}, {0x45036000}, + {0x45038000}, {0x4503a000}, {0x4503c000}, {0x4503e000}, + {0x45040000}, {0x45042000}, {0x45044000}, {0x45046000}, + {0x45048000}, {0x4504a000}, {0x4504c000}, {0x4504e000}, + {0x45050000}, {0x45052000}, {0x45054000}, {0x45056000}, + {0x45058000}, {0x4505a000}, {0x4505c000}, {0x4505e000}, + {0x45060000}, {0x45062000}, {0x45064000}, {0x45066000}, + {0x45068000}, {0x4506a000}, {0x4506c000}, {0x4506e000}, + {0x45070000}, {0x45072000}, {0x45074000}, {0x45076000}, + {0x45078000}, {0x4507a000}, {0x4507c000}, {0x4507e000}, + {0x45080000}, {0x45082000}, {0x45084000}, {0x45086000}, + {0x45088000}, {0x4508a000}, {0x4508c000}, {0x4508e000}, + {0x45090000}, {0x45092000}, {0x45094000}, {0x45096000}, + {0x45098000}, {0x4509a000}, {0x4509c000}, {0x4509e000}, + {0x450a0000}, {0x450a2000}, {0x450a4000}, {0x450a6000}, + {0x450a8000}, {0x450aa000}, {0x450ac000}, {0x450ae000}, + {0x450b0000}, {0x450b2000}, {0x450b4000}, {0x450b6000}, + {0x450b8000}, {0x450ba000}, {0x450bc000}, {0x450be000}, + {0x450c0000}, {0x450c2000}, {0x450c4000}, {0x450c6000}, + {0x450c8000}, {0x450ca000}, {0x450cc000}, {0x450ce000}, + {0x450d0000}, {0x450d2000}, {0x450d4000}, {0x450d6000}, + {0x450d8000}, {0x450da000}, {0x450dc000}, {0x450de000}, + {0x450e0000}, {0x450e2000}, {0x450e4000}, {0x450e6000}, + {0x450e8000}, {0x450ea000}, {0x450ec000}, {0x450ee000}, + {0x450f0000}, {0x450f2000}, {0x450f4000}, {0x450f6000}, + {0x450f8000}, {0x450fa000}, {0x450fc000}, {0x450fe000}, + {0x45100000}, {0x45102000}, {0x45104000}, {0x45106000}, + {0x45108000}, {0x4510a000}, {0x4510c000}, {0x4510e000}, + {0x45110000}, {0x45112000}, {0x45114000}, {0x45116000}, + {0x45118000}, {0x4511a000}, {0x4511c000}, {0x4511e000}, + {0x45120000}, {0x45122000}, {0x45124000}, {0x45126000}, + {0x45128000}, {0x4512a000}, {0x4512c000}, {0x4512e000}, + {0x45130000}, {0x45132000}, {0x45134000}, {0x45136000}, + {0x45138000}, {0x4513a000}, {0x4513c000}, {0x4513e000}, + {0x45140000}, {0x45142000}, {0x45144000}, {0x45146000}, + {0x45148000}, {0x4514a000}, {0x4514c000}, {0x4514e000}, + {0x45150000}, {0x45152000}, {0x45154000}, {0x45156000}, + {0x45158000}, {0x4515a000}, {0x4515c000}, {0x4515e000}, + {0x45160000}, {0x45162000}, {0x45164000}, {0x45166000}, + {0x45168000}, {0x4516a000}, {0x4516c000}, {0x4516e000}, + {0x45170000}, {0x45172000}, {0x45174000}, {0x45176000}, + {0x45178000}, {0x4517a000}, {0x4517c000}, {0x4517e000}, + {0x45180000}, {0x45182000}, {0x45184000}, {0x45186000}, + {0x45188000}, {0x4518a000}, {0x4518c000}, {0x4518e000}, + {0x45190000}, {0x45192000}, {0x45194000}, {0x45196000}, + {0x45198000}, {0x4519a000}, {0x4519c000}, {0x4519e000}, + {0x451a0000}, {0x451a2000}, {0x451a4000}, {0x451a6000}, + {0x451a8000}, {0x451aa000}, {0x451ac000}, {0x451ae000}, + {0x451b0000}, {0x451b2000}, {0x451b4000}, {0x451b6000}, + {0x451b8000}, {0x451ba000}, {0x451bc000}, {0x451be000}, + {0x451c0000}, {0x451c2000}, {0x451c4000}, {0x451c6000}, + {0x451c8000}, {0x451ca000}, {0x451cc000}, {0x451ce000}, + {0x451d0000}, {0x451d2000}, {0x451d4000}, {0x451d6000}, + {0x451d8000}, {0x451da000}, {0x451dc000}, {0x451de000}, + {0x451e0000}, {0x451e2000}, {0x451e4000}, {0x451e6000}, + {0x451e8000}, {0x451ea000}, {0x451ec000}, {0x451ee000}, + {0x451f0000}, {0x451f2000}, {0x451f4000}, {0x451f6000}, + {0x451f8000}, {0x451fa000}, {0x451fc000}, {0x451fe000}, + {0x45200000}, {0x45202000}, {0x45204000}, {0x45206000}, + {0x45208000}, {0x4520a000}, {0x4520c000}, {0x4520e000}, + {0x45210000}, {0x45212000}, {0x45214000}, {0x45216000}, + {0x45218000}, {0x4521a000}, {0x4521c000}, {0x4521e000}, + {0x45220000}, {0x45222000}, {0x45224000}, {0x45226000}, + {0x45228000}, {0x4522a000}, {0x4522c000}, {0x4522e000}, + {0x45230000}, {0x45232000}, {0x45234000}, {0x45236000}, + {0x45238000}, {0x4523a000}, {0x4523c000}, {0x4523e000}, + {0x45240000}, {0x45242000}, {0x45244000}, {0x45246000}, + {0x45248000}, {0x4524a000}, {0x4524c000}, {0x4524e000}, + {0x45250000}, {0x45252000}, {0x45254000}, {0x45256000}, + {0x45258000}, {0x4525a000}, {0x4525c000}, {0x4525e000}, + {0x45260000}, {0x45262000}, {0x45264000}, {0x45266000}, + {0x45268000}, {0x4526a000}, {0x4526c000}, {0x4526e000}, + {0x45270000}, {0x45272000}, {0x45274000}, {0x45276000}, + {0x45278000}, {0x4527a000}, {0x4527c000}, {0x4527e000}, + {0x45280000}, {0x45282000}, {0x45284000}, {0x45286000}, + {0x45288000}, {0x4528a000}, {0x4528c000}, {0x4528e000}, + {0x45290000}, {0x45292000}, {0x45294000}, {0x45296000}, + {0x45298000}, {0x4529a000}, {0x4529c000}, {0x4529e000}, + {0x452a0000}, {0x452a2000}, {0x452a4000}, {0x452a6000}, + {0x452a8000}, {0x452aa000}, {0x452ac000}, {0x452ae000}, + {0x452b0000}, {0x452b2000}, {0x452b4000}, {0x452b6000}, + {0x452b8000}, {0x452ba000}, {0x452bc000}, {0x452be000}, + {0x452c0000}, {0x452c2000}, {0x452c4000}, {0x452c6000}, + {0x452c8000}, {0x452ca000}, {0x452cc000}, {0x452ce000}, + {0x452d0000}, {0x452d2000}, {0x452d4000}, {0x452d6000}, + {0x452d8000}, {0x452da000}, {0x452dc000}, {0x452de000}, + {0x452e0000}, {0x452e2000}, {0x452e4000}, {0x452e6000}, + {0x452e8000}, {0x452ea000}, {0x452ec000}, {0x452ee000}, + {0x452f0000}, {0x452f2000}, {0x452f4000}, {0x452f6000}, + {0x452f8000}, {0x452fa000}, {0x452fc000}, {0x452fe000}, + {0x45300000}, {0x45302000}, {0x45304000}, {0x45306000}, + {0x45308000}, {0x4530a000}, {0x4530c000}, {0x4530e000}, + {0x45310000}, {0x45312000}, {0x45314000}, {0x45316000}, + {0x45318000}, {0x4531a000}, {0x4531c000}, {0x4531e000}, + {0x45320000}, {0x45322000}, {0x45324000}, {0x45326000}, + {0x45328000}, {0x4532a000}, {0x4532c000}, {0x4532e000}, + {0x45330000}, {0x45332000}, {0x45334000}, {0x45336000}, + {0x45338000}, {0x4533a000}, {0x4533c000}, {0x4533e000}, + {0x45340000}, {0x45342000}, {0x45344000}, {0x45346000}, + {0x45348000}, {0x4534a000}, {0x4534c000}, {0x4534e000}, + {0x45350000}, {0x45352000}, {0x45354000}, {0x45356000}, + {0x45358000}, {0x4535a000}, {0x4535c000}, {0x4535e000}, + {0x45360000}, {0x45362000}, {0x45364000}, {0x45366000}, + {0x45368000}, {0x4536a000}, {0x4536c000}, {0x4536e000}, + {0x45370000}, {0x45372000}, {0x45374000}, {0x45376000}, + {0x45378000}, {0x4537a000}, {0x4537c000}, {0x4537e000}, + {0x45380000}, {0x45382000}, {0x45384000}, {0x45386000}, + {0x45388000}, {0x4538a000}, {0x4538c000}, {0x4538e000}, + {0x45390000}, {0x45392000}, {0x45394000}, {0x45396000}, + {0x45398000}, {0x4539a000}, {0x4539c000}, {0x4539e000}, + {0x453a0000}, {0x453a2000}, {0x453a4000}, {0x453a6000}, + {0x453a8000}, {0x453aa000}, {0x453ac000}, {0x453ae000}, + {0x453b0000}, {0x453b2000}, {0x453b4000}, {0x453b6000}, + {0x453b8000}, {0x453ba000}, {0x453bc000}, {0x453be000}, + {0x453c0000}, {0x453c2000}, {0x453c4000}, {0x453c6000}, + {0x453c8000}, {0x453ca000}, {0x453cc000}, {0x453ce000}, + {0x453d0000}, {0x453d2000}, {0x453d4000}, {0x453d6000}, + {0x453d8000}, {0x453da000}, {0x453dc000}, {0x453de000}, + {0x453e0000}, {0x453e2000}, {0x453e4000}, {0x453e6000}, + {0x453e8000}, {0x453ea000}, {0x453ec000}, {0x453ee000}, + {0x453f0000}, {0x453f2000}, {0x453f4000}, {0x453f6000}, + {0x453f8000}, {0x453fa000}, {0x453fc000}, {0x453fe000}, + {0x45400000}, {0x45402000}, {0x45404000}, {0x45406000}, + {0x45408000}, {0x4540a000}, {0x4540c000}, {0x4540e000}, + {0x45410000}, {0x45412000}, {0x45414000}, {0x45416000}, + {0x45418000}, {0x4541a000}, {0x4541c000}, {0x4541e000}, + {0x45420000}, {0x45422000}, {0x45424000}, {0x45426000}, + {0x45428000}, {0x4542a000}, {0x4542c000}, {0x4542e000}, + {0x45430000}, {0x45432000}, {0x45434000}, {0x45436000}, + {0x45438000}, {0x4543a000}, {0x4543c000}, {0x4543e000}, + {0x45440000}, {0x45442000}, {0x45444000}, {0x45446000}, + {0x45448000}, {0x4544a000}, {0x4544c000}, {0x4544e000}, + {0x45450000}, {0x45452000}, {0x45454000}, {0x45456000}, + {0x45458000}, {0x4545a000}, {0x4545c000}, {0x4545e000}, + {0x45460000}, {0x45462000}, {0x45464000}, {0x45466000}, + {0x45468000}, {0x4546a000}, {0x4546c000}, {0x4546e000}, + {0x45470000}, {0x45472000}, {0x45474000}, {0x45476000}, + {0x45478000}, {0x4547a000}, {0x4547c000}, {0x4547e000}, + {0x45480000}, {0x45482000}, {0x45484000}, {0x45486000}, + {0x45488000}, {0x4548a000}, {0x4548c000}, {0x4548e000}, + {0x45490000}, {0x45492000}, {0x45494000}, {0x45496000}, + {0x45498000}, {0x4549a000}, {0x4549c000}, {0x4549e000}, + {0x454a0000}, {0x454a2000}, {0x454a4000}, {0x454a6000}, + {0x454a8000}, {0x454aa000}, {0x454ac000}, {0x454ae000}, + {0x454b0000}, {0x454b2000}, {0x454b4000}, {0x454b6000}, + {0x454b8000}, {0x454ba000}, {0x454bc000}, {0x454be000}, + {0x454c0000}, {0x454c2000}, {0x454c4000}, {0x454c6000}, + {0x454c8000}, {0x454ca000}, {0x454cc000}, {0x454ce000}, + {0x454d0000}, {0x454d2000}, {0x454d4000}, {0x454d6000}, + {0x454d8000}, {0x454da000}, {0x454dc000}, {0x454de000}, + {0x454e0000}, {0x454e2000}, {0x454e4000}, {0x454e6000}, + {0x454e8000}, {0x454ea000}, {0x454ec000}, {0x454ee000}, + {0x454f0000}, {0x454f2000}, {0x454f4000}, {0x454f6000}, + {0x454f8000}, {0x454fa000}, {0x454fc000}, {0x454fe000}, + {0x45500000}, {0x45502000}, {0x45504000}, {0x45506000}, + {0x45508000}, {0x4550a000}, {0x4550c000}, {0x4550e000}, + {0x45510000}, {0x45512000}, {0x45514000}, {0x45516000}, + {0x45518000}, {0x4551a000}, {0x4551c000}, {0x4551e000}, + {0x45520000}, {0x45522000}, {0x45524000}, {0x45526000}, + {0x45528000}, {0x4552a000}, {0x4552c000}, {0x4552e000}, + {0x45530000}, {0x45532000}, {0x45534000}, {0x45536000}, + {0x45538000}, {0x4553a000}, {0x4553c000}, {0x4553e000}, + {0x45540000}, {0x45542000}, {0x45544000}, {0x45546000}, + {0x45548000}, {0x4554a000}, {0x4554c000}, {0x4554e000}, + {0x45550000}, {0x45552000}, {0x45554000}, {0x45556000}, + {0x45558000}, {0x4555a000}, {0x4555c000}, {0x4555e000}, + {0x45560000}, {0x45562000}, {0x45564000}, {0x45566000}, + {0x45568000}, {0x4556a000}, {0x4556c000}, {0x4556e000}, + {0x45570000}, {0x45572000}, {0x45574000}, {0x45576000}, + {0x45578000}, {0x4557a000}, {0x4557c000}, {0x4557e000}, + {0x45580000}, {0x45582000}, {0x45584000}, {0x45586000}, + {0x45588000}, {0x4558a000}, {0x4558c000}, {0x4558e000}, + {0x45590000}, {0x45592000}, {0x45594000}, {0x45596000}, + {0x45598000}, {0x4559a000}, {0x4559c000}, {0x4559e000}, + {0x455a0000}, {0x455a2000}, {0x455a4000}, {0x455a6000}, + {0x455a8000}, {0x455aa000}, {0x455ac000}, {0x455ae000}, + {0x455b0000}, {0x455b2000}, {0x455b4000}, {0x455b6000}, + {0x455b8000}, {0x455ba000}, {0x455bc000}, {0x455be000}, + {0x455c0000}, {0x455c2000}, {0x455c4000}, {0x455c6000}, + {0x455c8000}, {0x455ca000}, {0x455cc000}, {0x455ce000}, + {0x455d0000}, {0x455d2000}, {0x455d4000}, {0x455d6000}, + {0x455d8000}, {0x455da000}, {0x455dc000}, {0x455de000}, + {0x455e0000}, {0x455e2000}, {0x455e4000}, {0x455e6000}, + {0x455e8000}, {0x455ea000}, {0x455ec000}, {0x455ee000}, + {0x455f0000}, {0x455f2000}, {0x455f4000}, {0x455f6000}, + {0x455f8000}, {0x455fa000}, {0x455fc000}, {0x455fe000}, + {0x45600000}, {0x45602000}, {0x45604000}, {0x45606000}, + {0x45608000}, {0x4560a000}, {0x4560c000}, {0x4560e000}, + {0x45610000}, {0x45612000}, {0x45614000}, {0x45616000}, + {0x45618000}, {0x4561a000}, {0x4561c000}, {0x4561e000}, + {0x45620000}, {0x45622000}, {0x45624000}, {0x45626000}, + {0x45628000}, {0x4562a000}, {0x4562c000}, {0x4562e000}, + {0x45630000}, {0x45632000}, {0x45634000}, {0x45636000}, + {0x45638000}, {0x4563a000}, {0x4563c000}, {0x4563e000}, + {0x45640000}, {0x45642000}, {0x45644000}, {0x45646000}, + {0x45648000}, {0x4564a000}, {0x4564c000}, {0x4564e000}, + {0x45650000}, {0x45652000}, {0x45654000}, {0x45656000}, + {0x45658000}, {0x4565a000}, {0x4565c000}, {0x4565e000}, + {0x45660000}, {0x45662000}, {0x45664000}, {0x45666000}, + {0x45668000}, {0x4566a000}, {0x4566c000}, {0x4566e000}, + {0x45670000}, {0x45672000}, {0x45674000}, {0x45676000}, + {0x45678000}, {0x4567a000}, {0x4567c000}, {0x4567e000}, + {0x45680000}, {0x45682000}, {0x45684000}, {0x45686000}, + {0x45688000}, {0x4568a000}, {0x4568c000}, {0x4568e000}, + {0x45690000}, {0x45692000}, {0x45694000}, {0x45696000}, + {0x45698000}, {0x4569a000}, {0x4569c000}, {0x4569e000}, + {0x456a0000}, {0x456a2000}, {0x456a4000}, {0x456a6000}, + {0x456a8000}, {0x456aa000}, {0x456ac000}, {0x456ae000}, + {0x456b0000}, {0x456b2000}, {0x456b4000}, {0x456b6000}, + {0x456b8000}, {0x456ba000}, {0x456bc000}, {0x456be000}, + {0x456c0000}, {0x456c2000}, {0x456c4000}, {0x456c6000}, + {0x456c8000}, {0x456ca000}, {0x456cc000}, {0x456ce000}, + {0x456d0000}, {0x456d2000}, {0x456d4000}, {0x456d6000}, + {0x456d8000}, {0x456da000}, {0x456dc000}, {0x456de000}, + {0x456e0000}, {0x456e2000}, {0x456e4000}, {0x456e6000}, + {0x456e8000}, {0x456ea000}, {0x456ec000}, {0x456ee000}, + {0x456f0000}, {0x456f2000}, {0x456f4000}, {0x456f6000}, + {0x456f8000}, {0x456fa000}, {0x456fc000}, {0x456fe000}, + {0x45700000}, {0x45702000}, {0x45704000}, {0x45706000}, + {0x45708000}, {0x4570a000}, {0x4570c000}, {0x4570e000}, + {0x45710000}, {0x45712000}, {0x45714000}, {0x45716000}, + {0x45718000}, {0x4571a000}, {0x4571c000}, {0x4571e000}, + {0x45720000}, {0x45722000}, {0x45724000}, {0x45726000}, + {0x45728000}, {0x4572a000}, {0x4572c000}, {0x4572e000}, + {0x45730000}, {0x45732000}, {0x45734000}, {0x45736000}, + {0x45738000}, {0x4573a000}, {0x4573c000}, {0x4573e000}, + {0x45740000}, {0x45742000}, {0x45744000}, {0x45746000}, + {0x45748000}, {0x4574a000}, {0x4574c000}, {0x4574e000}, + {0x45750000}, {0x45752000}, {0x45754000}, {0x45756000}, + {0x45758000}, {0x4575a000}, {0x4575c000}, {0x4575e000}, + {0x45760000}, {0x45762000}, {0x45764000}, {0x45766000}, + {0x45768000}, {0x4576a000}, {0x4576c000}, {0x4576e000}, + {0x45770000}, {0x45772000}, {0x45774000}, {0x45776000}, + {0x45778000}, {0x4577a000}, {0x4577c000}, {0x4577e000}, + {0x45780000}, {0x45782000}, {0x45784000}, {0x45786000}, + {0x45788000}, {0x4578a000}, {0x4578c000}, {0x4578e000}, + {0x45790000}, {0x45792000}, {0x45794000}, {0x45796000}, + {0x45798000}, {0x4579a000}, {0x4579c000}, {0x4579e000}, + {0x457a0000}, {0x457a2000}, {0x457a4000}, {0x457a6000}, + {0x457a8000}, {0x457aa000}, {0x457ac000}, {0x457ae000}, + {0x457b0000}, {0x457b2000}, {0x457b4000}, {0x457b6000}, + {0x457b8000}, {0x457ba000}, {0x457bc000}, {0x457be000}, + {0x457c0000}, {0x457c2000}, {0x457c4000}, {0x457c6000}, + {0x457c8000}, {0x457ca000}, {0x457cc000}, {0x457ce000}, + {0x457d0000}, {0x457d2000}, {0x457d4000}, {0x457d6000}, + {0x457d8000}, {0x457da000}, {0x457dc000}, {0x457de000}, + {0x457e0000}, {0x457e2000}, {0x457e4000}, {0x457e6000}, + {0x457e8000}, {0x457ea000}, {0x457ec000}, {0x457ee000}, + {0x457f0000}, {0x457f2000}, {0x457f4000}, {0x457f6000}, + {0x457f8000}, {0x457fa000}, {0x457fc000}, {0x457fe000}, + {0x45800000}, {0x45802000}, {0x45804000}, {0x45806000}, + {0x45808000}, {0x4580a000}, {0x4580c000}, {0x4580e000}, + {0x45810000}, {0x45812000}, {0x45814000}, {0x45816000}, + {0x45818000}, {0x4581a000}, {0x4581c000}, {0x4581e000}, + {0x45820000}, {0x45822000}, {0x45824000}, {0x45826000}, + {0x45828000}, {0x4582a000}, {0x4582c000}, {0x4582e000}, + {0x45830000}, {0x45832000}, {0x45834000}, {0x45836000}, + {0x45838000}, {0x4583a000}, {0x4583c000}, {0x4583e000}, + {0x45840000}, {0x45842000}, {0x45844000}, {0x45846000}, + {0x45848000}, {0x4584a000}, {0x4584c000}, {0x4584e000}, + {0x45850000}, {0x45852000}, {0x45854000}, {0x45856000}, + {0x45858000}, {0x4585a000}, {0x4585c000}, {0x4585e000}, + {0x45860000}, {0x45862000}, {0x45864000}, {0x45866000}, + {0x45868000}, {0x4586a000}, {0x4586c000}, {0x4586e000}, + {0x45870000}, {0x45872000}, {0x45874000}, {0x45876000}, + {0x45878000}, {0x4587a000}, {0x4587c000}, {0x4587e000}, + {0x45880000}, {0x45882000}, {0x45884000}, {0x45886000}, + {0x45888000}, {0x4588a000}, {0x4588c000}, {0x4588e000}, + {0x45890000}, {0x45892000}, {0x45894000}, {0x45896000}, + {0x45898000}, {0x4589a000}, {0x4589c000}, {0x4589e000}, + {0x458a0000}, {0x458a2000}, {0x458a4000}, {0x458a6000}, + {0x458a8000}, {0x458aa000}, {0x458ac000}, {0x458ae000}, + {0x458b0000}, {0x458b2000}, {0x458b4000}, {0x458b6000}, + {0x458b8000}, {0x458ba000}, {0x458bc000}, {0x458be000}, + {0x458c0000}, {0x458c2000}, {0x458c4000}, {0x458c6000}, + {0x458c8000}, {0x458ca000}, {0x458cc000}, {0x458ce000}, + {0x458d0000}, {0x458d2000}, {0x458d4000}, {0x458d6000}, + {0x458d8000}, {0x458da000}, {0x458dc000}, {0x458de000}, + {0x458e0000}, {0x458e2000}, {0x458e4000}, {0x458e6000}, + {0x458e8000}, {0x458ea000}, {0x458ec000}, {0x458ee000}, + {0x458f0000}, {0x458f2000}, {0x458f4000}, {0x458f6000}, + {0x458f8000}, {0x458fa000}, {0x458fc000}, {0x458fe000}, + {0x45900000}, {0x45902000}, {0x45904000}, {0x45906000}, + {0x45908000}, {0x4590a000}, {0x4590c000}, {0x4590e000}, + {0x45910000}, {0x45912000}, {0x45914000}, {0x45916000}, + {0x45918000}, {0x4591a000}, {0x4591c000}, {0x4591e000}, + {0x45920000}, {0x45922000}, {0x45924000}, {0x45926000}, + {0x45928000}, {0x4592a000}, {0x4592c000}, {0x4592e000}, + {0x45930000}, {0x45932000}, {0x45934000}, {0x45936000}, + {0x45938000}, {0x4593a000}, {0x4593c000}, {0x4593e000}, + {0x45940000}, {0x45942000}, {0x45944000}, {0x45946000}, + {0x45948000}, {0x4594a000}, {0x4594c000}, {0x4594e000}, + {0x45950000}, {0x45952000}, {0x45954000}, {0x45956000}, + {0x45958000}, {0x4595a000}, {0x4595c000}, {0x4595e000}, + {0x45960000}, {0x45962000}, {0x45964000}, {0x45966000}, + {0x45968000}, {0x4596a000}, {0x4596c000}, {0x4596e000}, + {0x45970000}, {0x45972000}, {0x45974000}, {0x45976000}, + {0x45978000}, {0x4597a000}, {0x4597c000}, {0x4597e000}, + {0x45980000}, {0x45982000}, {0x45984000}, {0x45986000}, + {0x45988000}, {0x4598a000}, {0x4598c000}, {0x4598e000}, + {0x45990000}, {0x45992000}, {0x45994000}, {0x45996000}, + {0x45998000}, {0x4599a000}, {0x4599c000}, {0x4599e000}, + {0x459a0000}, {0x459a2000}, {0x459a4000}, {0x459a6000}, + {0x459a8000}, {0x459aa000}, {0x459ac000}, {0x459ae000}, + {0x459b0000}, {0x459b2000}, {0x459b4000}, {0x459b6000}, + {0x459b8000}, {0x459ba000}, {0x459bc000}, {0x459be000}, + {0x459c0000}, {0x459c2000}, {0x459c4000}, {0x459c6000}, + {0x459c8000}, {0x459ca000}, {0x459cc000}, {0x459ce000}, + {0x459d0000}, {0x459d2000}, {0x459d4000}, {0x459d6000}, + {0x459d8000}, {0x459da000}, {0x459dc000}, {0x459de000}, + {0x459e0000}, {0x459e2000}, {0x459e4000}, {0x459e6000}, + {0x459e8000}, {0x459ea000}, {0x459ec000}, {0x459ee000}, + {0x459f0000}, {0x459f2000}, {0x459f4000}, {0x459f6000}, + {0x459f8000}, {0x459fa000}, {0x459fc000}, {0x459fe000}, + {0x45a00000}, {0x45a02000}, {0x45a04000}, {0x45a06000}, + {0x45a08000}, {0x45a0a000}, {0x45a0c000}, {0x45a0e000}, + {0x45a10000}, {0x45a12000}, {0x45a14000}, {0x45a16000}, + {0x45a18000}, {0x45a1a000}, {0x45a1c000}, {0x45a1e000}, + {0x45a20000}, {0x45a22000}, {0x45a24000}, {0x45a26000}, + {0x45a28000}, {0x45a2a000}, {0x45a2c000}, {0x45a2e000}, + {0x45a30000}, {0x45a32000}, {0x45a34000}, {0x45a36000}, + {0x45a38000}, {0x45a3a000}, {0x45a3c000}, {0x45a3e000}, + {0x45a40000}, {0x45a42000}, {0x45a44000}, {0x45a46000}, + {0x45a48000}, {0x45a4a000}, {0x45a4c000}, {0x45a4e000}, + {0x45a50000}, {0x45a52000}, {0x45a54000}, {0x45a56000}, + {0x45a58000}, {0x45a5a000}, {0x45a5c000}, {0x45a5e000}, + {0x45a60000}, {0x45a62000}, {0x45a64000}, {0x45a66000}, + {0x45a68000}, {0x45a6a000}, {0x45a6c000}, {0x45a6e000}, + {0x45a70000}, {0x45a72000}, {0x45a74000}, {0x45a76000}, + {0x45a78000}, {0x45a7a000}, {0x45a7c000}, {0x45a7e000}, + {0x45a80000}, {0x45a82000}, {0x45a84000}, {0x45a86000}, + {0x45a88000}, {0x45a8a000}, {0x45a8c000}, {0x45a8e000}, + {0x45a90000}, {0x45a92000}, {0x45a94000}, {0x45a96000}, + {0x45a98000}, {0x45a9a000}, {0x45a9c000}, {0x45a9e000}, + {0x45aa0000}, {0x45aa2000}, {0x45aa4000}, {0x45aa6000}, + {0x45aa8000}, {0x45aaa000}, {0x45aac000}, {0x45aae000}, + {0x45ab0000}, {0x45ab2000}, {0x45ab4000}, {0x45ab6000}, + {0x45ab8000}, {0x45aba000}, {0x45abc000}, {0x45abe000}, + {0x45ac0000}, {0x45ac2000}, {0x45ac4000}, {0x45ac6000}, + {0x45ac8000}, {0x45aca000}, {0x45acc000}, {0x45ace000}, + {0x45ad0000}, {0x45ad2000}, {0x45ad4000}, {0x45ad6000}, + {0x45ad8000}, {0x45ada000}, {0x45adc000}, {0x45ade000}, + {0x45ae0000}, {0x45ae2000}, {0x45ae4000}, {0x45ae6000}, + {0x45ae8000}, {0x45aea000}, {0x45aec000}, {0x45aee000}, + {0x45af0000}, {0x45af2000}, {0x45af4000}, {0x45af6000}, + {0x45af8000}, {0x45afa000}, {0x45afc000}, {0x45afe000}, + {0x45b00000}, {0x45b02000}, {0x45b04000}, {0x45b06000}, + {0x45b08000}, {0x45b0a000}, {0x45b0c000}, {0x45b0e000}, + {0x45b10000}, {0x45b12000}, {0x45b14000}, {0x45b16000}, + {0x45b18000}, {0x45b1a000}, {0x45b1c000}, {0x45b1e000}, + {0x45b20000}, {0x45b22000}, {0x45b24000}, {0x45b26000}, + {0x45b28000}, {0x45b2a000}, {0x45b2c000}, {0x45b2e000}, + {0x45b30000}, {0x45b32000}, {0x45b34000}, {0x45b36000}, + {0x45b38000}, {0x45b3a000}, {0x45b3c000}, {0x45b3e000}, + {0x45b40000}, {0x45b42000}, {0x45b44000}, {0x45b46000}, + {0x45b48000}, {0x45b4a000}, {0x45b4c000}, {0x45b4e000}, + {0x45b50000}, {0x45b52000}, {0x45b54000}, {0x45b56000}, + {0x45b58000}, {0x45b5a000}, {0x45b5c000}, {0x45b5e000}, + {0x45b60000}, {0x45b62000}, {0x45b64000}, {0x45b66000}, + {0x45b68000}, {0x45b6a000}, {0x45b6c000}, {0x45b6e000}, + {0x45b70000}, {0x45b72000}, {0x45b74000}, {0x45b76000}, + {0x45b78000}, {0x45b7a000}, {0x45b7c000}, {0x45b7e000}, + {0x45b80000}, {0x45b82000}, {0x45b84000}, {0x45b86000}, + {0x45b88000}, {0x45b8a000}, {0x45b8c000}, {0x45b8e000}, + {0x45b90000}, {0x45b92000}, {0x45b94000}, {0x45b96000}, + {0x45b98000}, {0x45b9a000}, {0x45b9c000}, {0x45b9e000}, + {0x45ba0000}, {0x45ba2000}, {0x45ba4000}, {0x45ba6000}, + {0x45ba8000}, {0x45baa000}, {0x45bac000}, {0x45bae000}, + {0x45bb0000}, {0x45bb2000}, {0x45bb4000}, {0x45bb6000}, + {0x45bb8000}, {0x45bba000}, {0x45bbc000}, {0x45bbe000}, + {0x45bc0000}, {0x45bc2000}, {0x45bc4000}, {0x45bc6000}, + {0x45bc8000}, {0x45bca000}, {0x45bcc000}, {0x45bce000}, + {0x45bd0000}, {0x45bd2000}, {0x45bd4000}, {0x45bd6000}, + {0x45bd8000}, {0x45bda000}, {0x45bdc000}, {0x45bde000}, + {0x45be0000}, {0x45be2000}, {0x45be4000}, {0x45be6000}, + {0x45be8000}, {0x45bea000}, {0x45bec000}, {0x45bee000}, + {0x45bf0000}, {0x45bf2000}, {0x45bf4000}, {0x45bf6000}, + {0x45bf8000}, {0x45bfa000}, {0x45bfc000}, {0x45bfe000}, + {0x45c00000}, {0x45c02000}, {0x45c04000}, {0x45c06000}, + {0x45c08000}, {0x45c0a000}, {0x45c0c000}, {0x45c0e000}, + {0x45c10000}, {0x45c12000}, {0x45c14000}, {0x45c16000}, + {0x45c18000}, {0x45c1a000}, {0x45c1c000}, {0x45c1e000}, + {0x45c20000}, {0x45c22000}, {0x45c24000}, {0x45c26000}, + {0x45c28000}, {0x45c2a000}, {0x45c2c000}, {0x45c2e000}, + {0x45c30000}, {0x45c32000}, {0x45c34000}, {0x45c36000}, + {0x45c38000}, {0x45c3a000}, {0x45c3c000}, {0x45c3e000}, + {0x45c40000}, {0x45c42000}, {0x45c44000}, {0x45c46000}, + {0x45c48000}, {0x45c4a000}, {0x45c4c000}, {0x45c4e000}, + {0x45c50000}, {0x45c52000}, {0x45c54000}, {0x45c56000}, + {0x45c58000}, {0x45c5a000}, {0x45c5c000}, {0x45c5e000}, + {0x45c60000}, {0x45c62000}, {0x45c64000}, {0x45c66000}, + {0x45c68000}, {0x45c6a000}, {0x45c6c000}, {0x45c6e000}, + {0x45c70000}, {0x45c72000}, {0x45c74000}, {0x45c76000}, + {0x45c78000}, {0x45c7a000}, {0x45c7c000}, {0x45c7e000}, + {0x45c80000}, {0x45c82000}, {0x45c84000}, {0x45c86000}, + {0x45c88000}, {0x45c8a000}, {0x45c8c000}, {0x45c8e000}, + {0x45c90000}, {0x45c92000}, {0x45c94000}, {0x45c96000}, + {0x45c98000}, {0x45c9a000}, {0x45c9c000}, {0x45c9e000}, + {0x45ca0000}, {0x45ca2000}, {0x45ca4000}, {0x45ca6000}, + {0x45ca8000}, {0x45caa000}, {0x45cac000}, {0x45cae000}, + {0x45cb0000}, {0x45cb2000}, {0x45cb4000}, {0x45cb6000}, + {0x45cb8000}, {0x45cba000}, {0x45cbc000}, {0x45cbe000}, + {0x45cc0000}, {0x45cc2000}, {0x45cc4000}, {0x45cc6000}, + {0x45cc8000}, {0x45cca000}, {0x45ccc000}, {0x45cce000}, + {0x45cd0000}, {0x45cd2000}, {0x45cd4000}, {0x45cd6000}, + {0x45cd8000}, {0x45cda000}, {0x45cdc000}, {0x45cde000}, + {0x45ce0000}, {0x45ce2000}, {0x45ce4000}, {0x45ce6000}, + {0x45ce8000}, {0x45cea000}, {0x45cec000}, {0x45cee000}, + {0x45cf0000}, {0x45cf2000}, {0x45cf4000}, {0x45cf6000}, + {0x45cf8000}, {0x45cfa000}, {0x45cfc000}, {0x45cfe000}, + {0x45d00000}, {0x45d02000}, {0x45d04000}, {0x45d06000}, + {0x45d08000}, {0x45d0a000}, {0x45d0c000}, {0x45d0e000}, + {0x45d10000}, {0x45d12000}, {0x45d14000}, {0x45d16000}, + {0x45d18000}, {0x45d1a000}, {0x45d1c000}, {0x45d1e000}, + {0x45d20000}, {0x45d22000}, {0x45d24000}, {0x45d26000}, + {0x45d28000}, {0x45d2a000}, {0x45d2c000}, {0x45d2e000}, + {0x45d30000}, {0x45d32000}, {0x45d34000}, {0x45d36000}, + {0x45d38000}, {0x45d3a000}, {0x45d3c000}, {0x45d3e000}, + {0x45d40000}, {0x45d42000}, {0x45d44000}, {0x45d46000}, + {0x45d48000}, {0x45d4a000}, {0x45d4c000}, {0x45d4e000}, + {0x45d50000}, {0x45d52000}, {0x45d54000}, {0x45d56000}, + {0x45d58000}, {0x45d5a000}, {0x45d5c000}, {0x45d5e000}, + {0x45d60000}, {0x45d62000}, {0x45d64000}, {0x45d66000}, + {0x45d68000}, {0x45d6a000}, {0x45d6c000}, {0x45d6e000}, + {0x45d70000}, {0x45d72000}, {0x45d74000}, {0x45d76000}, + {0x45d78000}, {0x45d7a000}, {0x45d7c000}, {0x45d7e000}, + {0x45d80000}, {0x45d82000}, {0x45d84000}, {0x45d86000}, + {0x45d88000}, {0x45d8a000}, {0x45d8c000}, {0x45d8e000}, + {0x45d90000}, {0x45d92000}, {0x45d94000}, {0x45d96000}, + {0x45d98000}, {0x45d9a000}, {0x45d9c000}, {0x45d9e000}, + {0x45da0000}, {0x45da2000}, {0x45da4000}, {0x45da6000}, + {0x45da8000}, {0x45daa000}, {0x45dac000}, {0x45dae000}, + {0x45db0000}, {0x45db2000}, {0x45db4000}, {0x45db6000}, + {0x45db8000}, {0x45dba000}, {0x45dbc000}, {0x45dbe000}, + {0x45dc0000}, {0x45dc2000}, {0x45dc4000}, {0x45dc6000}, + {0x45dc8000}, {0x45dca000}, {0x45dcc000}, {0x45dce000}, + {0x45dd0000}, {0x45dd2000}, {0x45dd4000}, {0x45dd6000}, + {0x45dd8000}, {0x45dda000}, {0x45ddc000}, {0x45dde000}, + {0x45de0000}, {0x45de2000}, {0x45de4000}, {0x45de6000}, + {0x45de8000}, {0x45dea000}, {0x45dec000}, {0x45dee000}, + {0x45df0000}, {0x45df2000}, {0x45df4000}, {0x45df6000}, + {0x45df8000}, {0x45dfa000}, {0x45dfc000}, {0x45dfe000}, + {0x45e00000}, {0x45e02000}, {0x45e04000}, {0x45e06000}, + {0x45e08000}, {0x45e0a000}, {0x45e0c000}, {0x45e0e000}, + {0x45e10000}, {0x45e12000}, {0x45e14000}, {0x45e16000}, + {0x45e18000}, {0x45e1a000}, {0x45e1c000}, {0x45e1e000}, + {0x45e20000}, {0x45e22000}, {0x45e24000}, {0x45e26000}, + {0x45e28000}, {0x45e2a000}, {0x45e2c000}, {0x45e2e000}, + {0x45e30000}, {0x45e32000}, {0x45e34000}, {0x45e36000}, + {0x45e38000}, {0x45e3a000}, {0x45e3c000}, {0x45e3e000}, + {0x45e40000}, {0x45e42000}, {0x45e44000}, {0x45e46000}, + {0x45e48000}, {0x45e4a000}, {0x45e4c000}, {0x45e4e000}, + {0x45e50000}, {0x45e52000}, {0x45e54000}, {0x45e56000}, + {0x45e58000}, {0x45e5a000}, {0x45e5c000}, {0x45e5e000}, + {0x45e60000}, {0x45e62000}, {0x45e64000}, {0x45e66000}, + {0x45e68000}, {0x45e6a000}, {0x45e6c000}, {0x45e6e000}, + {0x45e70000}, {0x45e72000}, {0x45e74000}, {0x45e76000}, + {0x45e78000}, {0x45e7a000}, {0x45e7c000}, {0x45e7e000}, + {0x45e80000}, {0x45e82000}, {0x45e84000}, {0x45e86000}, + {0x45e88000}, {0x45e8a000}, {0x45e8c000}, {0x45e8e000}, + {0x45e90000}, {0x45e92000}, {0x45e94000}, {0x45e96000}, + {0x45e98000}, {0x45e9a000}, {0x45e9c000}, {0x45e9e000}, + {0x45ea0000}, {0x45ea2000}, {0x45ea4000}, {0x45ea6000}, + {0x45ea8000}, {0x45eaa000}, {0x45eac000}, {0x45eae000}, + {0x45eb0000}, {0x45eb2000}, {0x45eb4000}, {0x45eb6000}, + {0x45eb8000}, {0x45eba000}, {0x45ebc000}, {0x45ebe000}, + {0x45ec0000}, {0x45ec2000}, {0x45ec4000}, {0x45ec6000}, + {0x45ec8000}, {0x45eca000}, {0x45ecc000}, {0x45ece000}, + {0x45ed0000}, {0x45ed2000}, {0x45ed4000}, {0x45ed6000}, + {0x45ed8000}, {0x45eda000}, {0x45edc000}, {0x45ede000}, + {0x45ee0000}, {0x45ee2000}, {0x45ee4000}, {0x45ee6000}, + {0x45ee8000}, {0x45eea000}, {0x45eec000}, {0x45eee000}, + {0x45ef0000}, {0x45ef2000}, {0x45ef4000}, {0x45ef6000}, + {0x45ef8000}, {0x45efa000}, {0x45efc000}, {0x45efe000}, + {0x45f00000}, {0x45f02000}, {0x45f04000}, {0x45f06000}, + {0x45f08000}, {0x45f0a000}, {0x45f0c000}, {0x45f0e000}, + {0x45f10000}, {0x45f12000}, {0x45f14000}, {0x45f16000}, + {0x45f18000}, {0x45f1a000}, {0x45f1c000}, {0x45f1e000}, + {0x45f20000}, {0x45f22000}, {0x45f24000}, {0x45f26000}, + {0x45f28000}, {0x45f2a000}, {0x45f2c000}, {0x45f2e000}, + {0x45f30000}, {0x45f32000}, {0x45f34000}, {0x45f36000}, + {0x45f38000}, {0x45f3a000}, {0x45f3c000}, {0x45f3e000}, + {0x45f40000}, {0x45f42000}, {0x45f44000}, {0x45f46000}, + {0x45f48000}, {0x45f4a000}, {0x45f4c000}, {0x45f4e000}, + {0x45f50000}, {0x45f52000}, {0x45f54000}, {0x45f56000}, + {0x45f58000}, {0x45f5a000}, {0x45f5c000}, {0x45f5e000}, + {0x45f60000}, {0x45f62000}, {0x45f64000}, {0x45f66000}, + {0x45f68000}, {0x45f6a000}, {0x45f6c000}, {0x45f6e000}, + {0x45f70000}, {0x45f72000}, {0x45f74000}, {0x45f76000}, + {0x45f78000}, {0x45f7a000}, {0x45f7c000}, {0x45f7e000}, + {0x45f80000}, {0x45f82000}, {0x45f84000}, {0x45f86000}, + {0x45f88000}, {0x45f8a000}, {0x45f8c000}, {0x45f8e000}, + {0x45f90000}, {0x45f92000}, {0x45f94000}, {0x45f96000}, + {0x45f98000}, {0x45f9a000}, {0x45f9c000}, {0x45f9e000}, + {0x45fa0000}, {0x45fa2000}, {0x45fa4000}, {0x45fa6000}, + {0x45fa8000}, {0x45faa000}, {0x45fac000}, {0x45fae000}, + {0x45fb0000}, {0x45fb2000}, {0x45fb4000}, {0x45fb6000}, + {0x45fb8000}, {0x45fba000}, {0x45fbc000}, {0x45fbe000}, + {0x45fc0000}, {0x45fc2000}, {0x45fc4000}, {0x45fc6000}, + {0x45fc8000}, {0x45fca000}, {0x45fcc000}, {0x45fce000}, + {0x45fd0000}, {0x45fd2000}, {0x45fd4000}, {0x45fd6000}, + {0x45fd8000}, {0x45fda000}, {0x45fdc000}, {0x45fde000}, + {0x45fe0000}, {0x45fe2000}, {0x45fe4000}, {0x45fe6000}, + {0x45fe8000}, {0x45fea000}, {0x45fec000}, {0x45fee000}, + {0x45ff0000}, {0x45ff2000}, {0x45ff4000}, {0x45ff6000}, + {0x45ff8000}, {0x45ffa000}, {0x45ffc000}, {0x45ffe000}, + {0x46000000}, {0x46002000}, {0x46004000}, {0x46006000}, + {0x46008000}, {0x4600a000}, {0x4600c000}, {0x4600e000}, + {0x46010000}, {0x46012000}, {0x46014000}, {0x46016000}, + {0x46018000}, {0x4601a000}, {0x4601c000}, {0x4601e000}, + {0x46020000}, {0x46022000}, {0x46024000}, {0x46026000}, + {0x46028000}, {0x4602a000}, {0x4602c000}, {0x4602e000}, + {0x46030000}, {0x46032000}, {0x46034000}, {0x46036000}, + {0x46038000}, {0x4603a000}, {0x4603c000}, {0x4603e000}, + {0x46040000}, {0x46042000}, {0x46044000}, {0x46046000}, + {0x46048000}, {0x4604a000}, {0x4604c000}, {0x4604e000}, + {0x46050000}, {0x46052000}, {0x46054000}, {0x46056000}, + {0x46058000}, {0x4605a000}, {0x4605c000}, {0x4605e000}, + {0x46060000}, {0x46062000}, {0x46064000}, {0x46066000}, + {0x46068000}, {0x4606a000}, {0x4606c000}, {0x4606e000}, + {0x46070000}, {0x46072000}, {0x46074000}, {0x46076000}, + {0x46078000}, {0x4607a000}, {0x4607c000}, {0x4607e000}, + {0x46080000}, {0x46082000}, {0x46084000}, {0x46086000}, + {0x46088000}, {0x4608a000}, {0x4608c000}, {0x4608e000}, + {0x46090000}, {0x46092000}, {0x46094000}, {0x46096000}, + {0x46098000}, {0x4609a000}, {0x4609c000}, {0x4609e000}, + {0x460a0000}, {0x460a2000}, {0x460a4000}, {0x460a6000}, + {0x460a8000}, {0x460aa000}, {0x460ac000}, {0x460ae000}, + {0x460b0000}, {0x460b2000}, {0x460b4000}, {0x460b6000}, + {0x460b8000}, {0x460ba000}, {0x460bc000}, {0x460be000}, + {0x460c0000}, {0x460c2000}, {0x460c4000}, {0x460c6000}, + {0x460c8000}, {0x460ca000}, {0x460cc000}, {0x460ce000}, + {0x460d0000}, {0x460d2000}, {0x460d4000}, {0x460d6000}, + {0x460d8000}, {0x460da000}, {0x460dc000}, {0x460de000}, + {0x460e0000}, {0x460e2000}, {0x460e4000}, {0x460e6000}, + {0x460e8000}, {0x460ea000}, {0x460ec000}, {0x460ee000}, + {0x460f0000}, {0x460f2000}, {0x460f4000}, {0x460f6000}, + {0x460f8000}, {0x460fa000}, {0x460fc000}, {0x460fe000}, + {0x46100000}, {0x46102000}, {0x46104000}, {0x46106000}, + {0x46108000}, {0x4610a000}, {0x4610c000}, {0x4610e000}, + {0x46110000}, {0x46112000}, {0x46114000}, {0x46116000}, + {0x46118000}, {0x4611a000}, {0x4611c000}, {0x4611e000}, + {0x46120000}, {0x46122000}, {0x46124000}, {0x46126000}, + {0x46128000}, {0x4612a000}, {0x4612c000}, {0x4612e000}, + {0x46130000}, {0x46132000}, {0x46134000}, {0x46136000}, + {0x46138000}, {0x4613a000}, {0x4613c000}, {0x4613e000}, + {0x46140000}, {0x46142000}, {0x46144000}, {0x46146000}, + {0x46148000}, {0x4614a000}, {0x4614c000}, {0x4614e000}, + {0x46150000}, {0x46152000}, {0x46154000}, {0x46156000}, + {0x46158000}, {0x4615a000}, {0x4615c000}, {0x4615e000}, + {0x46160000}, {0x46162000}, {0x46164000}, {0x46166000}, + {0x46168000}, {0x4616a000}, {0x4616c000}, {0x4616e000}, + {0x46170000}, {0x46172000}, {0x46174000}, {0x46176000}, + {0x46178000}, {0x4617a000}, {0x4617c000}, {0x4617e000}, + {0x46180000}, {0x46182000}, {0x46184000}, {0x46186000}, + {0x46188000}, {0x4618a000}, {0x4618c000}, {0x4618e000}, + {0x46190000}, {0x46192000}, {0x46194000}, {0x46196000}, + {0x46198000}, {0x4619a000}, {0x4619c000}, {0x4619e000}, + {0x461a0000}, {0x461a2000}, {0x461a4000}, {0x461a6000}, + {0x461a8000}, {0x461aa000}, {0x461ac000}, {0x461ae000}, + {0x461b0000}, {0x461b2000}, {0x461b4000}, {0x461b6000}, + {0x461b8000}, {0x461ba000}, {0x461bc000}, {0x461be000}, + {0x461c0000}, {0x461c2000}, {0x461c4000}, {0x461c6000}, + {0x461c8000}, {0x461ca000}, {0x461cc000}, {0x461ce000}, + {0x461d0000}, {0x461d2000}, {0x461d4000}, {0x461d6000}, + {0x461d8000}, {0x461da000}, {0x461dc000}, {0x461de000}, + {0x461e0000}, {0x461e2000}, {0x461e4000}, {0x461e6000}, + {0x461e8000}, {0x461ea000}, {0x461ec000}, {0x461ee000}, + {0x461f0000}, {0x461f2000}, {0x461f4000}, {0x461f6000}, + {0x461f8000}, {0x461fa000}, {0x461fc000}, {0x461fe000}, + {0x46200000}, {0x46202000}, {0x46204000}, {0x46206000}, + {0x46208000}, {0x4620a000}, {0x4620c000}, {0x4620e000}, + {0x46210000}, {0x46212000}, {0x46214000}, {0x46216000}, + {0x46218000}, {0x4621a000}, {0x4621c000}, {0x4621e000}, + {0x46220000}, {0x46222000}, {0x46224000}, {0x46226000}, + {0x46228000}, {0x4622a000}, {0x4622c000}, {0x4622e000}, + {0x46230000}, {0x46232000}, {0x46234000}, {0x46236000}, + {0x46238000}, {0x4623a000}, {0x4623c000}, {0x4623e000}, + {0x46240000}, {0x46242000}, {0x46244000}, {0x46246000}, + {0x46248000}, {0x4624a000}, {0x4624c000}, {0x4624e000}, + {0x46250000}, {0x46252000}, {0x46254000}, {0x46256000}, + {0x46258000}, {0x4625a000}, {0x4625c000}, {0x4625e000}, + {0x46260000}, {0x46262000}, {0x46264000}, {0x46266000}, + {0x46268000}, {0x4626a000}, {0x4626c000}, {0x4626e000}, + {0x46270000}, {0x46272000}, {0x46274000}, {0x46276000}, + {0x46278000}, {0x4627a000}, {0x4627c000}, {0x4627e000}, + {0x46280000}, {0x46282000}, {0x46284000}, {0x46286000}, + {0x46288000}, {0x4628a000}, {0x4628c000}, {0x4628e000}, + {0x46290000}, {0x46292000}, {0x46294000}, {0x46296000}, + {0x46298000}, {0x4629a000}, {0x4629c000}, {0x4629e000}, + {0x462a0000}, {0x462a2000}, {0x462a4000}, {0x462a6000}, + {0x462a8000}, {0x462aa000}, {0x462ac000}, {0x462ae000}, + {0x462b0000}, {0x462b2000}, {0x462b4000}, {0x462b6000}, + {0x462b8000}, {0x462ba000}, {0x462bc000}, {0x462be000}, + {0x462c0000}, {0x462c2000}, {0x462c4000}, {0x462c6000}, + {0x462c8000}, {0x462ca000}, {0x462cc000}, {0x462ce000}, + {0x462d0000}, {0x462d2000}, {0x462d4000}, {0x462d6000}, + {0x462d8000}, {0x462da000}, {0x462dc000}, {0x462de000}, + {0x462e0000}, {0x462e2000}, {0x462e4000}, {0x462e6000}, + {0x462e8000}, {0x462ea000}, {0x462ec000}, {0x462ee000}, + {0x462f0000}, {0x462f2000}, {0x462f4000}, {0x462f6000}, + {0x462f8000}, {0x462fa000}, {0x462fc000}, {0x462fe000}, + {0x46300000}, {0x46302000}, {0x46304000}, {0x46306000}, + {0x46308000}, {0x4630a000}, {0x4630c000}, {0x4630e000}, + {0x46310000}, {0x46312000}, {0x46314000}, {0x46316000}, + {0x46318000}, {0x4631a000}, {0x4631c000}, {0x4631e000}, + {0x46320000}, {0x46322000}, {0x46324000}, {0x46326000}, + {0x46328000}, {0x4632a000}, {0x4632c000}, {0x4632e000}, + {0x46330000}, {0x46332000}, {0x46334000}, {0x46336000}, + {0x46338000}, {0x4633a000}, {0x4633c000}, {0x4633e000}, + {0x46340000}, {0x46342000}, {0x46344000}, {0x46346000}, + {0x46348000}, {0x4634a000}, {0x4634c000}, {0x4634e000}, + {0x46350000}, {0x46352000}, {0x46354000}, {0x46356000}, + {0x46358000}, {0x4635a000}, {0x4635c000}, {0x4635e000}, + {0x46360000}, {0x46362000}, {0x46364000}, {0x46366000}, + {0x46368000}, {0x4636a000}, {0x4636c000}, {0x4636e000}, + {0x46370000}, {0x46372000}, {0x46374000}, {0x46376000}, + {0x46378000}, {0x4637a000}, {0x4637c000}, {0x4637e000}, + {0x46380000}, {0x46382000}, {0x46384000}, {0x46386000}, + {0x46388000}, {0x4638a000}, {0x4638c000}, {0x4638e000}, + {0x46390000}, {0x46392000}, {0x46394000}, {0x46396000}, + {0x46398000}, {0x4639a000}, {0x4639c000}, {0x4639e000}, + {0x463a0000}, {0x463a2000}, {0x463a4000}, {0x463a6000}, + {0x463a8000}, {0x463aa000}, {0x463ac000}, {0x463ae000}, + {0x463b0000}, {0x463b2000}, {0x463b4000}, {0x463b6000}, + {0x463b8000}, {0x463ba000}, {0x463bc000}, {0x463be000}, + {0x463c0000}, {0x463c2000}, {0x463c4000}, {0x463c6000}, + {0x463c8000}, {0x463ca000}, {0x463cc000}, {0x463ce000}, + {0x463d0000}, {0x463d2000}, {0x463d4000}, {0x463d6000}, + {0x463d8000}, {0x463da000}, {0x463dc000}, {0x463de000}, + {0x463e0000}, {0x463e2000}, {0x463e4000}, {0x463e6000}, + {0x463e8000}, {0x463ea000}, {0x463ec000}, {0x463ee000}, + {0x463f0000}, {0x463f2000}, {0x463f4000}, {0x463f6000}, + {0x463f8000}, {0x463fa000}, {0x463fc000}, {0x463fe000}, + {0x46400000}, {0x46402000}, {0x46404000}, {0x46406000}, + {0x46408000}, {0x4640a000}, {0x4640c000}, {0x4640e000}, + {0x46410000}, {0x46412000}, {0x46414000}, {0x46416000}, + {0x46418000}, {0x4641a000}, {0x4641c000}, {0x4641e000}, + {0x46420000}, {0x46422000}, {0x46424000}, {0x46426000}, + {0x46428000}, {0x4642a000}, {0x4642c000}, {0x4642e000}, + {0x46430000}, {0x46432000}, {0x46434000}, {0x46436000}, + {0x46438000}, {0x4643a000}, {0x4643c000}, {0x4643e000}, + {0x46440000}, {0x46442000}, {0x46444000}, {0x46446000}, + {0x46448000}, {0x4644a000}, {0x4644c000}, {0x4644e000}, + {0x46450000}, {0x46452000}, {0x46454000}, {0x46456000}, + {0x46458000}, {0x4645a000}, {0x4645c000}, {0x4645e000}, + {0x46460000}, {0x46462000}, {0x46464000}, {0x46466000}, + {0x46468000}, {0x4646a000}, {0x4646c000}, {0x4646e000}, + {0x46470000}, {0x46472000}, {0x46474000}, {0x46476000}, + {0x46478000}, {0x4647a000}, {0x4647c000}, {0x4647e000}, + {0x46480000}, {0x46482000}, {0x46484000}, {0x46486000}, + {0x46488000}, {0x4648a000}, {0x4648c000}, {0x4648e000}, + {0x46490000}, {0x46492000}, {0x46494000}, {0x46496000}, + {0x46498000}, {0x4649a000}, {0x4649c000}, {0x4649e000}, + {0x464a0000}, {0x464a2000}, {0x464a4000}, {0x464a6000}, + {0x464a8000}, {0x464aa000}, {0x464ac000}, {0x464ae000}, + {0x464b0000}, {0x464b2000}, {0x464b4000}, {0x464b6000}, + {0x464b8000}, {0x464ba000}, {0x464bc000}, {0x464be000}, + {0x464c0000}, {0x464c2000}, {0x464c4000}, {0x464c6000}, + {0x464c8000}, {0x464ca000}, {0x464cc000}, {0x464ce000}, + {0x464d0000}, {0x464d2000}, {0x464d4000}, {0x464d6000}, + {0x464d8000}, {0x464da000}, {0x464dc000}, {0x464de000}, + {0x464e0000}, {0x464e2000}, {0x464e4000}, {0x464e6000}, + {0x464e8000}, {0x464ea000}, {0x464ec000}, {0x464ee000}, + {0x464f0000}, {0x464f2000}, {0x464f4000}, {0x464f6000}, + {0x464f8000}, {0x464fa000}, {0x464fc000}, {0x464fe000}, + {0x46500000}, {0x46502000}, {0x46504000}, {0x46506000}, + {0x46508000}, {0x4650a000}, {0x4650c000}, {0x4650e000}, + {0x46510000}, {0x46512000}, {0x46514000}, {0x46516000}, + {0x46518000}, {0x4651a000}, {0x4651c000}, {0x4651e000}, + {0x46520000}, {0x46522000}, {0x46524000}, {0x46526000}, + {0x46528000}, {0x4652a000}, {0x4652c000}, {0x4652e000}, + {0x46530000}, {0x46532000}, {0x46534000}, {0x46536000}, + {0x46538000}, {0x4653a000}, {0x4653c000}, {0x4653e000}, + {0x46540000}, {0x46542000}, {0x46544000}, {0x46546000}, + {0x46548000}, {0x4654a000}, {0x4654c000}, {0x4654e000}, + {0x46550000}, {0x46552000}, {0x46554000}, {0x46556000}, + {0x46558000}, {0x4655a000}, {0x4655c000}, {0x4655e000}, + {0x46560000}, {0x46562000}, {0x46564000}, {0x46566000}, + {0x46568000}, {0x4656a000}, {0x4656c000}, {0x4656e000}, + {0x46570000}, {0x46572000}, {0x46574000}, {0x46576000}, + {0x46578000}, {0x4657a000}, {0x4657c000}, {0x4657e000}, + {0x46580000}, {0x46582000}, {0x46584000}, {0x46586000}, + {0x46588000}, {0x4658a000}, {0x4658c000}, {0x4658e000}, + {0x46590000}, {0x46592000}, {0x46594000}, {0x46596000}, + {0x46598000}, {0x4659a000}, {0x4659c000}, {0x4659e000}, + {0x465a0000}, {0x465a2000}, {0x465a4000}, {0x465a6000}, + {0x465a8000}, {0x465aa000}, {0x465ac000}, {0x465ae000}, + {0x465b0000}, {0x465b2000}, {0x465b4000}, {0x465b6000}, + {0x465b8000}, {0x465ba000}, {0x465bc000}, {0x465be000}, + {0x465c0000}, {0x465c2000}, {0x465c4000}, {0x465c6000}, + {0x465c8000}, {0x465ca000}, {0x465cc000}, {0x465ce000}, + {0x465d0000}, {0x465d2000}, {0x465d4000}, {0x465d6000}, + {0x465d8000}, {0x465da000}, {0x465dc000}, {0x465de000}, + {0x465e0000}, {0x465e2000}, {0x465e4000}, {0x465e6000}, + {0x465e8000}, {0x465ea000}, {0x465ec000}, {0x465ee000}, + {0x465f0000}, {0x465f2000}, {0x465f4000}, {0x465f6000}, + {0x465f8000}, {0x465fa000}, {0x465fc000}, {0x465fe000}, + {0x46600000}, {0x46602000}, {0x46604000}, {0x46606000}, + {0x46608000}, {0x4660a000}, {0x4660c000}, {0x4660e000}, + {0x46610000}, {0x46612000}, {0x46614000}, {0x46616000}, + {0x46618000}, {0x4661a000}, {0x4661c000}, {0x4661e000}, + {0x46620000}, {0x46622000}, {0x46624000}, {0x46626000}, + {0x46628000}, {0x4662a000}, {0x4662c000}, {0x4662e000}, + {0x46630000}, {0x46632000}, {0x46634000}, {0x46636000}, + {0x46638000}, {0x4663a000}, {0x4663c000}, {0x4663e000}, + {0x46640000}, {0x46642000}, {0x46644000}, {0x46646000}, + {0x46648000}, {0x4664a000}, {0x4664c000}, {0x4664e000}, + {0x46650000}, {0x46652000}, {0x46654000}, {0x46656000}, + {0x46658000}, {0x4665a000}, {0x4665c000}, {0x4665e000}, + {0x46660000}, {0x46662000}, {0x46664000}, {0x46666000}, + {0x46668000}, {0x4666a000}, {0x4666c000}, {0x4666e000}, + {0x46670000}, {0x46672000}, {0x46674000}, {0x46676000}, + {0x46678000}, {0x4667a000}, {0x4667c000}, {0x4667e000}, + {0x46680000}, {0x46682000}, {0x46684000}, {0x46686000}, + {0x46688000}, {0x4668a000}, {0x4668c000}, {0x4668e000}, + {0x46690000}, {0x46692000}, {0x46694000}, {0x46696000}, + {0x46698000}, {0x4669a000}, {0x4669c000}, {0x4669e000}, + {0x466a0000}, {0x466a2000}, {0x466a4000}, {0x466a6000}, + {0x466a8000}, {0x466aa000}, {0x466ac000}, {0x466ae000}, + {0x466b0000}, {0x466b2000}, {0x466b4000}, {0x466b6000}, + {0x466b8000}, {0x466ba000}, {0x466bc000}, {0x466be000}, + {0x466c0000}, {0x466c2000}, {0x466c4000}, {0x466c6000}, + {0x466c8000}, {0x466ca000}, {0x466cc000}, {0x466ce000}, + {0x466d0000}, {0x466d2000}, {0x466d4000}, {0x466d6000}, + {0x466d8000}, {0x466da000}, {0x466dc000}, {0x466de000}, + {0x466e0000}, {0x466e2000}, {0x466e4000}, {0x466e6000}, + {0x466e8000}, {0x466ea000}, {0x466ec000}, {0x466ee000}, + {0x466f0000}, {0x466f2000}, {0x466f4000}, {0x466f6000}, + {0x466f8000}, {0x466fa000}, {0x466fc000}, {0x466fe000}, + {0x46700000}, {0x46702000}, {0x46704000}, {0x46706000}, + {0x46708000}, {0x4670a000}, {0x4670c000}, {0x4670e000}, + {0x46710000}, {0x46712000}, {0x46714000}, {0x46716000}, + {0x46718000}, {0x4671a000}, {0x4671c000}, {0x4671e000}, + {0x46720000}, {0x46722000}, {0x46724000}, {0x46726000}, + {0x46728000}, {0x4672a000}, {0x4672c000}, {0x4672e000}, + {0x46730000}, {0x46732000}, {0x46734000}, {0x46736000}, + {0x46738000}, {0x4673a000}, {0x4673c000}, {0x4673e000}, + {0x46740000}, {0x46742000}, {0x46744000}, {0x46746000}, + {0x46748000}, {0x4674a000}, {0x4674c000}, {0x4674e000}, + {0x46750000}, {0x46752000}, {0x46754000}, {0x46756000}, + {0x46758000}, {0x4675a000}, {0x4675c000}, {0x4675e000}, + {0x46760000}, {0x46762000}, {0x46764000}, {0x46766000}, + {0x46768000}, {0x4676a000}, {0x4676c000}, {0x4676e000}, + {0x46770000}, {0x46772000}, {0x46774000}, {0x46776000}, + {0x46778000}, {0x4677a000}, {0x4677c000}, {0x4677e000}, + {0x46780000}, {0x46782000}, {0x46784000}, {0x46786000}, + {0x46788000}, {0x4678a000}, {0x4678c000}, {0x4678e000}, + {0x46790000}, {0x46792000}, {0x46794000}, {0x46796000}, + {0x46798000}, {0x4679a000}, {0x4679c000}, {0x4679e000}, + {0x467a0000}, {0x467a2000}, {0x467a4000}, {0x467a6000}, + {0x467a8000}, {0x467aa000}, {0x467ac000}, {0x467ae000}, + {0x467b0000}, {0x467b2000}, {0x467b4000}, {0x467b6000}, + {0x467b8000}, {0x467ba000}, {0x467bc000}, {0x467be000}, + {0x467c0000}, {0x467c2000}, {0x467c4000}, {0x467c6000}, + {0x467c8000}, {0x467ca000}, {0x467cc000}, {0x467ce000}, + {0x467d0000}, {0x467d2000}, {0x467d4000}, {0x467d6000}, + {0x467d8000}, {0x467da000}, {0x467dc000}, {0x467de000}, + {0x467e0000}, {0x467e2000}, {0x467e4000}, {0x467e6000}, + {0x467e8000}, {0x467ea000}, {0x467ec000}, {0x467ee000}, + {0x467f0000}, {0x467f2000}, {0x467f4000}, {0x467f6000}, + {0x467f8000}, {0x467fa000}, {0x467fc000}, {0x467fe000}, + {0x46800000}, {0x46802000}, {0x46804000}, {0x46806000}, + {0x46808000}, {0x4680a000}, {0x4680c000}, {0x4680e000}, + {0x46810000}, {0x46812000}, {0x46814000}, {0x46816000}, + {0x46818000}, {0x4681a000}, {0x4681c000}, {0x4681e000}, + {0x46820000}, {0x46822000}, {0x46824000}, {0x46826000}, + {0x46828000}, {0x4682a000}, {0x4682c000}, {0x4682e000}, + {0x46830000}, {0x46832000}, {0x46834000}, {0x46836000}, + {0x46838000}, {0x4683a000}, {0x4683c000}, {0x4683e000}, + {0x46840000}, {0x46842000}, {0x46844000}, {0x46846000}, + {0x46848000}, {0x4684a000}, {0x4684c000}, {0x4684e000}, + {0x46850000}, {0x46852000}, {0x46854000}, {0x46856000}, + {0x46858000}, {0x4685a000}, {0x4685c000}, {0x4685e000}, + {0x46860000}, {0x46862000}, {0x46864000}, {0x46866000}, + {0x46868000}, {0x4686a000}, {0x4686c000}, {0x4686e000}, + {0x46870000}, {0x46872000}, {0x46874000}, {0x46876000}, + {0x46878000}, {0x4687a000}, {0x4687c000}, {0x4687e000}, + {0x46880000}, {0x46882000}, {0x46884000}, {0x46886000}, + {0x46888000}, {0x4688a000}, {0x4688c000}, {0x4688e000}, + {0x46890000}, {0x46892000}, {0x46894000}, {0x46896000}, + {0x46898000}, {0x4689a000}, {0x4689c000}, {0x4689e000}, + {0x468a0000}, {0x468a2000}, {0x468a4000}, {0x468a6000}, + {0x468a8000}, {0x468aa000}, {0x468ac000}, {0x468ae000}, + {0x468b0000}, {0x468b2000}, {0x468b4000}, {0x468b6000}, + {0x468b8000}, {0x468ba000}, {0x468bc000}, {0x468be000}, + {0x468c0000}, {0x468c2000}, {0x468c4000}, {0x468c6000}, + {0x468c8000}, {0x468ca000}, {0x468cc000}, {0x468ce000}, + {0x468d0000}, {0x468d2000}, {0x468d4000}, {0x468d6000}, + {0x468d8000}, {0x468da000}, {0x468dc000}, {0x468de000}, + {0x468e0000}, {0x468e2000}, {0x468e4000}, {0x468e6000}, + {0x468e8000}, {0x468ea000}, {0x468ec000}, {0x468ee000}, + {0x468f0000}, {0x468f2000}, {0x468f4000}, {0x468f6000}, + {0x468f8000}, {0x468fa000}, {0x468fc000}, {0x468fe000}, + {0x46900000}, {0x46902000}, {0x46904000}, {0x46906000}, + {0x46908000}, {0x4690a000}, {0x4690c000}, {0x4690e000}, + {0x46910000}, {0x46912000}, {0x46914000}, {0x46916000}, + {0x46918000}, {0x4691a000}, {0x4691c000}, {0x4691e000}, + {0x46920000}, {0x46922000}, {0x46924000}, {0x46926000}, + {0x46928000}, {0x4692a000}, {0x4692c000}, {0x4692e000}, + {0x46930000}, {0x46932000}, {0x46934000}, {0x46936000}, + {0x46938000}, {0x4693a000}, {0x4693c000}, {0x4693e000}, + {0x46940000}, {0x46942000}, {0x46944000}, {0x46946000}, + {0x46948000}, {0x4694a000}, {0x4694c000}, {0x4694e000}, + {0x46950000}, {0x46952000}, {0x46954000}, {0x46956000}, + {0x46958000}, {0x4695a000}, {0x4695c000}, {0x4695e000}, + {0x46960000}, {0x46962000}, {0x46964000}, {0x46966000}, + {0x46968000}, {0x4696a000}, {0x4696c000}, {0x4696e000}, + {0x46970000}, {0x46972000}, {0x46974000}, {0x46976000}, + {0x46978000}, {0x4697a000}, {0x4697c000}, {0x4697e000}, + {0x46980000}, {0x46982000}, {0x46984000}, {0x46986000}, + {0x46988000}, {0x4698a000}, {0x4698c000}, {0x4698e000}, + {0x46990000}, {0x46992000}, {0x46994000}, {0x46996000}, + {0x46998000}, {0x4699a000}, {0x4699c000}, {0x4699e000}, + {0x469a0000}, {0x469a2000}, {0x469a4000}, {0x469a6000}, + {0x469a8000}, {0x469aa000}, {0x469ac000}, {0x469ae000}, + {0x469b0000}, {0x469b2000}, {0x469b4000}, {0x469b6000}, + {0x469b8000}, {0x469ba000}, {0x469bc000}, {0x469be000}, + {0x469c0000}, {0x469c2000}, {0x469c4000}, {0x469c6000}, + {0x469c8000}, {0x469ca000}, {0x469cc000}, {0x469ce000}, + {0x469d0000}, {0x469d2000}, {0x469d4000}, {0x469d6000}, + {0x469d8000}, {0x469da000}, {0x469dc000}, {0x469de000}, + {0x469e0000}, {0x469e2000}, {0x469e4000}, {0x469e6000}, + {0x469e8000}, {0x469ea000}, {0x469ec000}, {0x469ee000}, + {0x469f0000}, {0x469f2000}, {0x469f4000}, {0x469f6000}, + {0x469f8000}, {0x469fa000}, {0x469fc000}, {0x469fe000}, + {0x46a00000}, {0x46a02000}, {0x46a04000}, {0x46a06000}, + {0x46a08000}, {0x46a0a000}, {0x46a0c000}, {0x46a0e000}, + {0x46a10000}, {0x46a12000}, {0x46a14000}, {0x46a16000}, + {0x46a18000}, {0x46a1a000}, {0x46a1c000}, {0x46a1e000}, + {0x46a20000}, {0x46a22000}, {0x46a24000}, {0x46a26000}, + {0x46a28000}, {0x46a2a000}, {0x46a2c000}, {0x46a2e000}, + {0x46a30000}, {0x46a32000}, {0x46a34000}, {0x46a36000}, + {0x46a38000}, {0x46a3a000}, {0x46a3c000}, {0x46a3e000}, + {0x46a40000}, {0x46a42000}, {0x46a44000}, {0x46a46000}, + {0x46a48000}, {0x46a4a000}, {0x46a4c000}, {0x46a4e000}, + {0x46a50000}, {0x46a52000}, {0x46a54000}, {0x46a56000}, + {0x46a58000}, {0x46a5a000}, {0x46a5c000}, {0x46a5e000}, + {0x46a60000}, {0x46a62000}, {0x46a64000}, {0x46a66000}, + {0x46a68000}, {0x46a6a000}, {0x46a6c000}, {0x46a6e000}, + {0x46a70000}, {0x46a72000}, {0x46a74000}, {0x46a76000}, + {0x46a78000}, {0x46a7a000}, {0x46a7c000}, {0x46a7e000}, + {0x46a80000}, {0x46a82000}, {0x46a84000}, {0x46a86000}, + {0x46a88000}, {0x46a8a000}, {0x46a8c000}, {0x46a8e000}, + {0x46a90000}, {0x46a92000}, {0x46a94000}, {0x46a96000}, + {0x46a98000}, {0x46a9a000}, {0x46a9c000}, {0x46a9e000}, + {0x46aa0000}, {0x46aa2000}, {0x46aa4000}, {0x46aa6000}, + {0x46aa8000}, {0x46aaa000}, {0x46aac000}, {0x46aae000}, + {0x46ab0000}, {0x46ab2000}, {0x46ab4000}, {0x46ab6000}, + {0x46ab8000}, {0x46aba000}, {0x46abc000}, {0x46abe000}, + {0x46ac0000}, {0x46ac2000}, {0x46ac4000}, {0x46ac6000}, + {0x46ac8000}, {0x46aca000}, {0x46acc000}, {0x46ace000}, + {0x46ad0000}, {0x46ad2000}, {0x46ad4000}, {0x46ad6000}, + {0x46ad8000}, {0x46ada000}, {0x46adc000}, {0x46ade000}, + {0x46ae0000}, {0x46ae2000}, {0x46ae4000}, {0x46ae6000}, + {0x46ae8000}, {0x46aea000}, {0x46aec000}, {0x46aee000}, + {0x46af0000}, {0x46af2000}, {0x46af4000}, {0x46af6000}, + {0x46af8000}, {0x46afa000}, {0x46afc000}, {0x46afe000}, + {0x46b00000}, {0x46b02000}, {0x46b04000}, {0x46b06000}, + {0x46b08000}, {0x46b0a000}, {0x46b0c000}, {0x46b0e000}, + {0x46b10000}, {0x46b12000}, {0x46b14000}, {0x46b16000}, + {0x46b18000}, {0x46b1a000}, {0x46b1c000}, {0x46b1e000}, + {0x46b20000}, {0x46b22000}, {0x46b24000}, {0x46b26000}, + {0x46b28000}, {0x46b2a000}, {0x46b2c000}, {0x46b2e000}, + {0x46b30000}, {0x46b32000}, {0x46b34000}, {0x46b36000}, + {0x46b38000}, {0x46b3a000}, {0x46b3c000}, {0x46b3e000}, + {0x46b40000}, {0x46b42000}, {0x46b44000}, {0x46b46000}, + {0x46b48000}, {0x46b4a000}, {0x46b4c000}, {0x46b4e000}, + {0x46b50000}, {0x46b52000}, {0x46b54000}, {0x46b56000}, + {0x46b58000}, {0x46b5a000}, {0x46b5c000}, {0x46b5e000}, + {0x46b60000}, {0x46b62000}, {0x46b64000}, {0x46b66000}, + {0x46b68000}, {0x46b6a000}, {0x46b6c000}, {0x46b6e000}, + {0x46b70000}, {0x46b72000}, {0x46b74000}, {0x46b76000}, + {0x46b78000}, {0x46b7a000}, {0x46b7c000}, {0x46b7e000}, + {0x46b80000}, {0x46b82000}, {0x46b84000}, {0x46b86000}, + {0x46b88000}, {0x46b8a000}, {0x46b8c000}, {0x46b8e000}, + {0x46b90000}, {0x46b92000}, {0x46b94000}, {0x46b96000}, + {0x46b98000}, {0x46b9a000}, {0x46b9c000}, {0x46b9e000}, + {0x46ba0000}, {0x46ba2000}, {0x46ba4000}, {0x46ba6000}, + {0x46ba8000}, {0x46baa000}, {0x46bac000}, {0x46bae000}, + {0x46bb0000}, {0x46bb2000}, {0x46bb4000}, {0x46bb6000}, + {0x46bb8000}, {0x46bba000}, {0x46bbc000}, {0x46bbe000}, + {0x46bc0000}, {0x46bc2000}, {0x46bc4000}, {0x46bc6000}, + {0x46bc8000}, {0x46bca000}, {0x46bcc000}, {0x46bce000}, + {0x46bd0000}, {0x46bd2000}, {0x46bd4000}, {0x46bd6000}, + {0x46bd8000}, {0x46bda000}, {0x46bdc000}, {0x46bde000}, + {0x46be0000}, {0x46be2000}, {0x46be4000}, {0x46be6000}, + {0x46be8000}, {0x46bea000}, {0x46bec000}, {0x46bee000}, + {0x46bf0000}, {0x46bf2000}, {0x46bf4000}, {0x46bf6000}, + {0x46bf8000}, {0x46bfa000}, {0x46bfc000}, {0x46bfe000}, + {0x46c00000}, {0x46c02000}, {0x46c04000}, {0x46c06000}, + {0x46c08000}, {0x46c0a000}, {0x46c0c000}, {0x46c0e000}, + {0x46c10000}, {0x46c12000}, {0x46c14000}, {0x46c16000}, + {0x46c18000}, {0x46c1a000}, {0x46c1c000}, {0x46c1e000}, + {0x46c20000}, {0x46c22000}, {0x46c24000}, {0x46c26000}, + {0x46c28000}, {0x46c2a000}, {0x46c2c000}, {0x46c2e000}, + {0x46c30000}, {0x46c32000}, {0x46c34000}, {0x46c36000}, + {0x46c38000}, {0x46c3a000}, {0x46c3c000}, {0x46c3e000}, + {0x46c40000}, {0x46c42000}, {0x46c44000}, {0x46c46000}, + {0x46c48000}, {0x46c4a000}, {0x46c4c000}, {0x46c4e000}, + {0x46c50000}, {0x46c52000}, {0x46c54000}, {0x46c56000}, + {0x46c58000}, {0x46c5a000}, {0x46c5c000}, {0x46c5e000}, + {0x46c60000}, {0x46c62000}, {0x46c64000}, {0x46c66000}, + {0x46c68000}, {0x46c6a000}, {0x46c6c000}, {0x46c6e000}, + {0x46c70000}, {0x46c72000}, {0x46c74000}, {0x46c76000}, + {0x46c78000}, {0x46c7a000}, {0x46c7c000}, {0x46c7e000}, + {0x46c80000}, {0x46c82000}, {0x46c84000}, {0x46c86000}, + {0x46c88000}, {0x46c8a000}, {0x46c8c000}, {0x46c8e000}, + {0x46c90000}, {0x46c92000}, {0x46c94000}, {0x46c96000}, + {0x46c98000}, {0x46c9a000}, {0x46c9c000}, {0x46c9e000}, + {0x46ca0000}, {0x46ca2000}, {0x46ca4000}, {0x46ca6000}, + {0x46ca8000}, {0x46caa000}, {0x46cac000}, {0x46cae000}, + {0x46cb0000}, {0x46cb2000}, {0x46cb4000}, {0x46cb6000}, + {0x46cb8000}, {0x46cba000}, {0x46cbc000}, {0x46cbe000}, + {0x46cc0000}, {0x46cc2000}, {0x46cc4000}, {0x46cc6000}, + {0x46cc8000}, {0x46cca000}, {0x46ccc000}, {0x46cce000}, + {0x46cd0000}, {0x46cd2000}, {0x46cd4000}, {0x46cd6000}, + {0x46cd8000}, {0x46cda000}, {0x46cdc000}, {0x46cde000}, + {0x46ce0000}, {0x46ce2000}, {0x46ce4000}, {0x46ce6000}, + {0x46ce8000}, {0x46cea000}, {0x46cec000}, {0x46cee000}, + {0x46cf0000}, {0x46cf2000}, {0x46cf4000}, {0x46cf6000}, + {0x46cf8000}, {0x46cfa000}, {0x46cfc000}, {0x46cfe000}, + {0x46d00000}, {0x46d02000}, {0x46d04000}, {0x46d06000}, + {0x46d08000}, {0x46d0a000}, {0x46d0c000}, {0x46d0e000}, + {0x46d10000}, {0x46d12000}, {0x46d14000}, {0x46d16000}, + {0x46d18000}, {0x46d1a000}, {0x46d1c000}, {0x46d1e000}, + {0x46d20000}, {0x46d22000}, {0x46d24000}, {0x46d26000}, + {0x46d28000}, {0x46d2a000}, {0x46d2c000}, {0x46d2e000}, + {0x46d30000}, {0x46d32000}, {0x46d34000}, {0x46d36000}, + {0x46d38000}, {0x46d3a000}, {0x46d3c000}, {0x46d3e000}, + {0x46d40000}, {0x46d42000}, {0x46d44000}, {0x46d46000}, + {0x46d48000}, {0x46d4a000}, {0x46d4c000}, {0x46d4e000}, + {0x46d50000}, {0x46d52000}, {0x46d54000}, {0x46d56000}, + {0x46d58000}, {0x46d5a000}, {0x46d5c000}, {0x46d5e000}, + {0x46d60000}, {0x46d62000}, {0x46d64000}, {0x46d66000}, + {0x46d68000}, {0x46d6a000}, {0x46d6c000}, {0x46d6e000}, + {0x46d70000}, {0x46d72000}, {0x46d74000}, {0x46d76000}, + {0x46d78000}, {0x46d7a000}, {0x46d7c000}, {0x46d7e000}, + {0x46d80000}, {0x46d82000}, {0x46d84000}, {0x46d86000}, + {0x46d88000}, {0x46d8a000}, {0x46d8c000}, {0x46d8e000}, + {0x46d90000}, {0x46d92000}, {0x46d94000}, {0x46d96000}, + {0x46d98000}, {0x46d9a000}, {0x46d9c000}, {0x46d9e000}, + {0x46da0000}, {0x46da2000}, {0x46da4000}, {0x46da6000}, + {0x46da8000}, {0x46daa000}, {0x46dac000}, {0x46dae000}, + {0x46db0000}, {0x46db2000}, {0x46db4000}, {0x46db6000}, + {0x46db8000}, {0x46dba000}, {0x46dbc000}, {0x46dbe000}, + {0x46dc0000}, {0x46dc2000}, {0x46dc4000}, {0x46dc6000}, + {0x46dc8000}, {0x46dca000}, {0x46dcc000}, {0x46dce000}, + {0x46dd0000}, {0x46dd2000}, {0x46dd4000}, {0x46dd6000}, + {0x46dd8000}, {0x46dda000}, {0x46ddc000}, {0x46dde000}, + {0x46de0000}, {0x46de2000}, {0x46de4000}, {0x46de6000}, + {0x46de8000}, {0x46dea000}, {0x46dec000}, {0x46dee000}, + {0x46df0000}, {0x46df2000}, {0x46df4000}, {0x46df6000}, + {0x46df8000}, {0x46dfa000}, {0x46dfc000}, {0x46dfe000}, + {0x46e00000}, {0x46e02000}, {0x46e04000}, {0x46e06000}, + {0x46e08000}, {0x46e0a000}, {0x46e0c000}, {0x46e0e000}, + {0x46e10000}, {0x46e12000}, {0x46e14000}, {0x46e16000}, + {0x46e18000}, {0x46e1a000}, {0x46e1c000}, {0x46e1e000}, + {0x46e20000}, {0x46e22000}, {0x46e24000}, {0x46e26000}, + {0x46e28000}, {0x46e2a000}, {0x46e2c000}, {0x46e2e000}, + {0x46e30000}, {0x46e32000}, {0x46e34000}, {0x46e36000}, + {0x46e38000}, {0x46e3a000}, {0x46e3c000}, {0x46e3e000}, + {0x46e40000}, {0x46e42000}, {0x46e44000}, {0x46e46000}, + {0x46e48000}, {0x46e4a000}, {0x46e4c000}, {0x46e4e000}, + {0x46e50000}, {0x46e52000}, {0x46e54000}, {0x46e56000}, + {0x46e58000}, {0x46e5a000}, {0x46e5c000}, {0x46e5e000}, + {0x46e60000}, {0x46e62000}, {0x46e64000}, {0x46e66000}, + {0x46e68000}, {0x46e6a000}, {0x46e6c000}, {0x46e6e000}, + {0x46e70000}, {0x46e72000}, {0x46e74000}, {0x46e76000}, + {0x46e78000}, {0x46e7a000}, {0x46e7c000}, {0x46e7e000}, + {0x46e80000}, {0x46e82000}, {0x46e84000}, {0x46e86000}, + {0x46e88000}, {0x46e8a000}, {0x46e8c000}, {0x46e8e000}, + {0x46e90000}, {0x46e92000}, {0x46e94000}, {0x46e96000}, + {0x46e98000}, {0x46e9a000}, {0x46e9c000}, {0x46e9e000}, + {0x46ea0000}, {0x46ea2000}, {0x46ea4000}, {0x46ea6000}, + {0x46ea8000}, {0x46eaa000}, {0x46eac000}, {0x46eae000}, + {0x46eb0000}, {0x46eb2000}, {0x46eb4000}, {0x46eb6000}, + {0x46eb8000}, {0x46eba000}, {0x46ebc000}, {0x46ebe000}, + {0x46ec0000}, {0x46ec2000}, {0x46ec4000}, {0x46ec6000}, + {0x46ec8000}, {0x46eca000}, {0x46ecc000}, {0x46ece000}, + {0x46ed0000}, {0x46ed2000}, {0x46ed4000}, {0x46ed6000}, + {0x46ed8000}, {0x46eda000}, {0x46edc000}, {0x46ede000}, + {0x46ee0000}, {0x46ee2000}, {0x46ee4000}, {0x46ee6000}, + {0x46ee8000}, {0x46eea000}, {0x46eec000}, {0x46eee000}, + {0x46ef0000}, {0x46ef2000}, {0x46ef4000}, {0x46ef6000}, + {0x46ef8000}, {0x46efa000}, {0x46efc000}, {0x46efe000}, + {0x46f00000}, {0x46f02000}, {0x46f04000}, {0x46f06000}, + {0x46f08000}, {0x46f0a000}, {0x46f0c000}, {0x46f0e000}, + {0x46f10000}, {0x46f12000}, {0x46f14000}, {0x46f16000}, + {0x46f18000}, {0x46f1a000}, {0x46f1c000}, {0x46f1e000}, + {0x46f20000}, {0x46f22000}, {0x46f24000}, {0x46f26000}, + {0x46f28000}, {0x46f2a000}, {0x46f2c000}, {0x46f2e000}, + {0x46f30000}, {0x46f32000}, {0x46f34000}, {0x46f36000}, + {0x46f38000}, {0x46f3a000}, {0x46f3c000}, {0x46f3e000}, + {0x46f40000}, {0x46f42000}, {0x46f44000}, {0x46f46000}, + {0x46f48000}, {0x46f4a000}, {0x46f4c000}, {0x46f4e000}, + {0x46f50000}, {0x46f52000}, {0x46f54000}, {0x46f56000}, + {0x46f58000}, {0x46f5a000}, {0x46f5c000}, {0x46f5e000}, + {0x46f60000}, {0x46f62000}, {0x46f64000}, {0x46f66000}, + {0x46f68000}, {0x46f6a000}, {0x46f6c000}, {0x46f6e000}, + {0x46f70000}, {0x46f72000}, {0x46f74000}, {0x46f76000}, + {0x46f78000}, {0x46f7a000}, {0x46f7c000}, {0x46f7e000}, + {0x46f80000}, {0x46f82000}, {0x46f84000}, {0x46f86000}, + {0x46f88000}, {0x46f8a000}, {0x46f8c000}, {0x46f8e000}, + {0x46f90000}, {0x46f92000}, {0x46f94000}, {0x46f96000}, + {0x46f98000}, {0x46f9a000}, {0x46f9c000}, {0x46f9e000}, + {0x46fa0000}, {0x46fa2000}, {0x46fa4000}, {0x46fa6000}, + {0x46fa8000}, {0x46faa000}, {0x46fac000}, {0x46fae000}, + {0x46fb0000}, {0x46fb2000}, {0x46fb4000}, {0x46fb6000}, + {0x46fb8000}, {0x46fba000}, {0x46fbc000}, {0x46fbe000}, + {0x46fc0000}, {0x46fc2000}, {0x46fc4000}, {0x46fc6000}, + {0x46fc8000}, {0x46fca000}, {0x46fcc000}, {0x46fce000}, + {0x46fd0000}, {0x46fd2000}, {0x46fd4000}, {0x46fd6000}, + {0x46fd8000}, {0x46fda000}, {0x46fdc000}, {0x46fde000}, + {0x46fe0000}, {0x46fe2000}, {0x46fe4000}, {0x46fe6000}, + {0x46fe8000}, {0x46fea000}, {0x46fec000}, {0x46fee000}, + {0x46ff0000}, {0x46ff2000}, {0x46ff4000}, {0x46ff6000}, + {0x46ff8000}, {0x46ffa000}, {0x46ffc000}, {0x46ffe000}, + {0x47000000}, {0x47002000}, {0x47004000}, {0x47006000}, + {0x47008000}, {0x4700a000}, {0x4700c000}, {0x4700e000}, + {0x47010000}, {0x47012000}, {0x47014000}, {0x47016000}, + {0x47018000}, {0x4701a000}, {0x4701c000}, {0x4701e000}, + {0x47020000}, {0x47022000}, {0x47024000}, {0x47026000}, + {0x47028000}, {0x4702a000}, {0x4702c000}, {0x4702e000}, + {0x47030000}, {0x47032000}, {0x47034000}, {0x47036000}, + {0x47038000}, {0x4703a000}, {0x4703c000}, {0x4703e000}, + {0x47040000}, {0x47042000}, {0x47044000}, {0x47046000}, + {0x47048000}, {0x4704a000}, {0x4704c000}, {0x4704e000}, + {0x47050000}, {0x47052000}, {0x47054000}, {0x47056000}, + {0x47058000}, {0x4705a000}, {0x4705c000}, {0x4705e000}, + {0x47060000}, {0x47062000}, {0x47064000}, {0x47066000}, + {0x47068000}, {0x4706a000}, {0x4706c000}, {0x4706e000}, + {0x47070000}, {0x47072000}, {0x47074000}, {0x47076000}, + {0x47078000}, {0x4707a000}, {0x4707c000}, {0x4707e000}, + {0x47080000}, {0x47082000}, {0x47084000}, {0x47086000}, + {0x47088000}, {0x4708a000}, {0x4708c000}, {0x4708e000}, + {0x47090000}, {0x47092000}, {0x47094000}, {0x47096000}, + {0x47098000}, {0x4709a000}, {0x4709c000}, {0x4709e000}, + {0x470a0000}, {0x470a2000}, {0x470a4000}, {0x470a6000}, + {0x470a8000}, {0x470aa000}, {0x470ac000}, {0x470ae000}, + {0x470b0000}, {0x470b2000}, {0x470b4000}, {0x470b6000}, + {0x470b8000}, {0x470ba000}, {0x470bc000}, {0x470be000}, + {0x470c0000}, {0x470c2000}, {0x470c4000}, {0x470c6000}, + {0x470c8000}, {0x470ca000}, {0x470cc000}, {0x470ce000}, + {0x470d0000}, {0x470d2000}, {0x470d4000}, {0x470d6000}, + {0x470d8000}, {0x470da000}, {0x470dc000}, {0x470de000}, + {0x470e0000}, {0x470e2000}, {0x470e4000}, {0x470e6000}, + {0x470e8000}, {0x470ea000}, {0x470ec000}, {0x470ee000}, + {0x470f0000}, {0x470f2000}, {0x470f4000}, {0x470f6000}, + {0x470f8000}, {0x470fa000}, {0x470fc000}, {0x470fe000}, + {0x47100000}, {0x47102000}, {0x47104000}, {0x47106000}, + {0x47108000}, {0x4710a000}, {0x4710c000}, {0x4710e000}, + {0x47110000}, {0x47112000}, {0x47114000}, {0x47116000}, + {0x47118000}, {0x4711a000}, {0x4711c000}, {0x4711e000}, + {0x47120000}, {0x47122000}, {0x47124000}, {0x47126000}, + {0x47128000}, {0x4712a000}, {0x4712c000}, {0x4712e000}, + {0x47130000}, {0x47132000}, {0x47134000}, {0x47136000}, + {0x47138000}, {0x4713a000}, {0x4713c000}, {0x4713e000}, + {0x47140000}, {0x47142000}, {0x47144000}, {0x47146000}, + {0x47148000}, {0x4714a000}, {0x4714c000}, {0x4714e000}, + {0x47150000}, {0x47152000}, {0x47154000}, {0x47156000}, + {0x47158000}, {0x4715a000}, {0x4715c000}, {0x4715e000}, + {0x47160000}, {0x47162000}, {0x47164000}, {0x47166000}, + {0x47168000}, {0x4716a000}, {0x4716c000}, {0x4716e000}, + {0x47170000}, {0x47172000}, {0x47174000}, {0x47176000}, + {0x47178000}, {0x4717a000}, {0x4717c000}, {0x4717e000}, + {0x47180000}, {0x47182000}, {0x47184000}, {0x47186000}, + {0x47188000}, {0x4718a000}, {0x4718c000}, {0x4718e000}, + {0x47190000}, {0x47192000}, {0x47194000}, {0x47196000}, + {0x47198000}, {0x4719a000}, {0x4719c000}, {0x4719e000}, + {0x471a0000}, {0x471a2000}, {0x471a4000}, {0x471a6000}, + {0x471a8000}, {0x471aa000}, {0x471ac000}, {0x471ae000}, + {0x471b0000}, {0x471b2000}, {0x471b4000}, {0x471b6000}, + {0x471b8000}, {0x471ba000}, {0x471bc000}, {0x471be000}, + {0x471c0000}, {0x471c2000}, {0x471c4000}, {0x471c6000}, + {0x471c8000}, {0x471ca000}, {0x471cc000}, {0x471ce000}, + {0x471d0000}, {0x471d2000}, {0x471d4000}, {0x471d6000}, + {0x471d8000}, {0x471da000}, {0x471dc000}, {0x471de000}, + {0x471e0000}, {0x471e2000}, {0x471e4000}, {0x471e6000}, + {0x471e8000}, {0x471ea000}, {0x471ec000}, {0x471ee000}, + {0x471f0000}, {0x471f2000}, {0x471f4000}, {0x471f6000}, + {0x471f8000}, {0x471fa000}, {0x471fc000}, {0x471fe000}, + {0x47200000}, {0x47202000}, {0x47204000}, {0x47206000}, + {0x47208000}, {0x4720a000}, {0x4720c000}, {0x4720e000}, + {0x47210000}, {0x47212000}, {0x47214000}, {0x47216000}, + {0x47218000}, {0x4721a000}, {0x4721c000}, {0x4721e000}, + {0x47220000}, {0x47222000}, {0x47224000}, {0x47226000}, + {0x47228000}, {0x4722a000}, {0x4722c000}, {0x4722e000}, + {0x47230000}, {0x47232000}, {0x47234000}, {0x47236000}, + {0x47238000}, {0x4723a000}, {0x4723c000}, {0x4723e000}, + {0x47240000}, {0x47242000}, {0x47244000}, {0x47246000}, + {0x47248000}, {0x4724a000}, {0x4724c000}, {0x4724e000}, + {0x47250000}, {0x47252000}, {0x47254000}, {0x47256000}, + {0x47258000}, {0x4725a000}, {0x4725c000}, {0x4725e000}, + {0x47260000}, {0x47262000}, {0x47264000}, {0x47266000}, + {0x47268000}, {0x4726a000}, {0x4726c000}, {0x4726e000}, + {0x47270000}, {0x47272000}, {0x47274000}, {0x47276000}, + {0x47278000}, {0x4727a000}, {0x4727c000}, {0x4727e000}, + {0x47280000}, {0x47282000}, {0x47284000}, {0x47286000}, + {0x47288000}, {0x4728a000}, {0x4728c000}, {0x4728e000}, + {0x47290000}, {0x47292000}, {0x47294000}, {0x47296000}, + {0x47298000}, {0x4729a000}, {0x4729c000}, {0x4729e000}, + {0x472a0000}, {0x472a2000}, {0x472a4000}, {0x472a6000}, + {0x472a8000}, {0x472aa000}, {0x472ac000}, {0x472ae000}, + {0x472b0000}, {0x472b2000}, {0x472b4000}, {0x472b6000}, + {0x472b8000}, {0x472ba000}, {0x472bc000}, {0x472be000}, + {0x472c0000}, {0x472c2000}, {0x472c4000}, {0x472c6000}, + {0x472c8000}, {0x472ca000}, {0x472cc000}, {0x472ce000}, + {0x472d0000}, {0x472d2000}, {0x472d4000}, {0x472d6000}, + {0x472d8000}, {0x472da000}, {0x472dc000}, {0x472de000}, + {0x472e0000}, {0x472e2000}, {0x472e4000}, {0x472e6000}, + {0x472e8000}, {0x472ea000}, {0x472ec000}, {0x472ee000}, + {0x472f0000}, {0x472f2000}, {0x472f4000}, {0x472f6000}, + {0x472f8000}, {0x472fa000}, {0x472fc000}, {0x472fe000}, + {0x47300000}, {0x47302000}, {0x47304000}, {0x47306000}, + {0x47308000}, {0x4730a000}, {0x4730c000}, {0x4730e000}, + {0x47310000}, {0x47312000}, {0x47314000}, {0x47316000}, + {0x47318000}, {0x4731a000}, {0x4731c000}, {0x4731e000}, + {0x47320000}, {0x47322000}, {0x47324000}, {0x47326000}, + {0x47328000}, {0x4732a000}, {0x4732c000}, {0x4732e000}, + {0x47330000}, {0x47332000}, {0x47334000}, {0x47336000}, + {0x47338000}, {0x4733a000}, {0x4733c000}, {0x4733e000}, + {0x47340000}, {0x47342000}, {0x47344000}, {0x47346000}, + {0x47348000}, {0x4734a000}, {0x4734c000}, {0x4734e000}, + {0x47350000}, {0x47352000}, {0x47354000}, {0x47356000}, + {0x47358000}, {0x4735a000}, {0x4735c000}, {0x4735e000}, + {0x47360000}, {0x47362000}, {0x47364000}, {0x47366000}, + {0x47368000}, {0x4736a000}, {0x4736c000}, {0x4736e000}, + {0x47370000}, {0x47372000}, {0x47374000}, {0x47376000}, + {0x47378000}, {0x4737a000}, {0x4737c000}, {0x4737e000}, + {0x47380000}, {0x47382000}, {0x47384000}, {0x47386000}, + {0x47388000}, {0x4738a000}, {0x4738c000}, {0x4738e000}, + {0x47390000}, {0x47392000}, {0x47394000}, {0x47396000}, + {0x47398000}, {0x4739a000}, {0x4739c000}, {0x4739e000}, + {0x473a0000}, {0x473a2000}, {0x473a4000}, {0x473a6000}, + {0x473a8000}, {0x473aa000}, {0x473ac000}, {0x473ae000}, + {0x473b0000}, {0x473b2000}, {0x473b4000}, {0x473b6000}, + {0x473b8000}, {0x473ba000}, {0x473bc000}, {0x473be000}, + {0x473c0000}, {0x473c2000}, {0x473c4000}, {0x473c6000}, + {0x473c8000}, {0x473ca000}, {0x473cc000}, {0x473ce000}, + {0x473d0000}, {0x473d2000}, {0x473d4000}, {0x473d6000}, + {0x473d8000}, {0x473da000}, {0x473dc000}, {0x473de000}, + {0x473e0000}, {0x473e2000}, {0x473e4000}, {0x473e6000}, + {0x473e8000}, {0x473ea000}, {0x473ec000}, {0x473ee000}, + {0x473f0000}, {0x473f2000}, {0x473f4000}, {0x473f6000}, + {0x473f8000}, {0x473fa000}, {0x473fc000}, {0x473fe000}, + {0x47400000}, {0x47402000}, {0x47404000}, {0x47406000}, + {0x47408000}, {0x4740a000}, {0x4740c000}, {0x4740e000}, + {0x47410000}, {0x47412000}, {0x47414000}, {0x47416000}, + {0x47418000}, {0x4741a000}, {0x4741c000}, {0x4741e000}, + {0x47420000}, {0x47422000}, {0x47424000}, {0x47426000}, + {0x47428000}, {0x4742a000}, {0x4742c000}, {0x4742e000}, + {0x47430000}, {0x47432000}, {0x47434000}, {0x47436000}, + {0x47438000}, {0x4743a000}, {0x4743c000}, {0x4743e000}, + {0x47440000}, {0x47442000}, {0x47444000}, {0x47446000}, + {0x47448000}, {0x4744a000}, {0x4744c000}, {0x4744e000}, + {0x47450000}, {0x47452000}, {0x47454000}, {0x47456000}, + {0x47458000}, {0x4745a000}, {0x4745c000}, {0x4745e000}, + {0x47460000}, {0x47462000}, {0x47464000}, {0x47466000}, + {0x47468000}, {0x4746a000}, {0x4746c000}, {0x4746e000}, + {0x47470000}, {0x47472000}, {0x47474000}, {0x47476000}, + {0x47478000}, {0x4747a000}, {0x4747c000}, {0x4747e000}, + {0x47480000}, {0x47482000}, {0x47484000}, {0x47486000}, + {0x47488000}, {0x4748a000}, {0x4748c000}, {0x4748e000}, + {0x47490000}, {0x47492000}, {0x47494000}, {0x47496000}, + {0x47498000}, {0x4749a000}, {0x4749c000}, {0x4749e000}, + {0x474a0000}, {0x474a2000}, {0x474a4000}, {0x474a6000}, + {0x474a8000}, {0x474aa000}, {0x474ac000}, {0x474ae000}, + {0x474b0000}, {0x474b2000}, {0x474b4000}, {0x474b6000}, + {0x474b8000}, {0x474ba000}, {0x474bc000}, {0x474be000}, + {0x474c0000}, {0x474c2000}, {0x474c4000}, {0x474c6000}, + {0x474c8000}, {0x474ca000}, {0x474cc000}, {0x474ce000}, + {0x474d0000}, {0x474d2000}, {0x474d4000}, {0x474d6000}, + {0x474d8000}, {0x474da000}, {0x474dc000}, {0x474de000}, + {0x474e0000}, {0x474e2000}, {0x474e4000}, {0x474e6000}, + {0x474e8000}, {0x474ea000}, {0x474ec000}, {0x474ee000}, + {0x474f0000}, {0x474f2000}, {0x474f4000}, {0x474f6000}, + {0x474f8000}, {0x474fa000}, {0x474fc000}, {0x474fe000}, + {0x47500000}, {0x47502000}, {0x47504000}, {0x47506000}, + {0x47508000}, {0x4750a000}, {0x4750c000}, {0x4750e000}, + {0x47510000}, {0x47512000}, {0x47514000}, {0x47516000}, + {0x47518000}, {0x4751a000}, {0x4751c000}, {0x4751e000}, + {0x47520000}, {0x47522000}, {0x47524000}, {0x47526000}, + {0x47528000}, {0x4752a000}, {0x4752c000}, {0x4752e000}, + {0x47530000}, {0x47532000}, {0x47534000}, {0x47536000}, + {0x47538000}, {0x4753a000}, {0x4753c000}, {0x4753e000}, + {0x47540000}, {0x47542000}, {0x47544000}, {0x47546000}, + {0x47548000}, {0x4754a000}, {0x4754c000}, {0x4754e000}, + {0x47550000}, {0x47552000}, {0x47554000}, {0x47556000}, + {0x47558000}, {0x4755a000}, {0x4755c000}, {0x4755e000}, + {0x47560000}, {0x47562000}, {0x47564000}, {0x47566000}, + {0x47568000}, {0x4756a000}, {0x4756c000}, {0x4756e000}, + {0x47570000}, {0x47572000}, {0x47574000}, {0x47576000}, + {0x47578000}, {0x4757a000}, {0x4757c000}, {0x4757e000}, + {0x47580000}, {0x47582000}, {0x47584000}, {0x47586000}, + {0x47588000}, {0x4758a000}, {0x4758c000}, {0x4758e000}, + {0x47590000}, {0x47592000}, {0x47594000}, {0x47596000}, + {0x47598000}, {0x4759a000}, {0x4759c000}, {0x4759e000}, + {0x475a0000}, {0x475a2000}, {0x475a4000}, {0x475a6000}, + {0x475a8000}, {0x475aa000}, {0x475ac000}, {0x475ae000}, + {0x475b0000}, {0x475b2000}, {0x475b4000}, {0x475b6000}, + {0x475b8000}, {0x475ba000}, {0x475bc000}, {0x475be000}, + {0x475c0000}, {0x475c2000}, {0x475c4000}, {0x475c6000}, + {0x475c8000}, {0x475ca000}, {0x475cc000}, {0x475ce000}, + {0x475d0000}, {0x475d2000}, {0x475d4000}, {0x475d6000}, + {0x475d8000}, {0x475da000}, {0x475dc000}, {0x475de000}, + {0x475e0000}, {0x475e2000}, {0x475e4000}, {0x475e6000}, + {0x475e8000}, {0x475ea000}, {0x475ec000}, {0x475ee000}, + {0x475f0000}, {0x475f2000}, {0x475f4000}, {0x475f6000}, + {0x475f8000}, {0x475fa000}, {0x475fc000}, {0x475fe000}, + {0x47600000}, {0x47602000}, {0x47604000}, {0x47606000}, + {0x47608000}, {0x4760a000}, {0x4760c000}, {0x4760e000}, + {0x47610000}, {0x47612000}, {0x47614000}, {0x47616000}, + {0x47618000}, {0x4761a000}, {0x4761c000}, {0x4761e000}, + {0x47620000}, {0x47622000}, {0x47624000}, {0x47626000}, + {0x47628000}, {0x4762a000}, {0x4762c000}, {0x4762e000}, + {0x47630000}, {0x47632000}, {0x47634000}, {0x47636000}, + {0x47638000}, {0x4763a000}, {0x4763c000}, {0x4763e000}, + {0x47640000}, {0x47642000}, {0x47644000}, {0x47646000}, + {0x47648000}, {0x4764a000}, {0x4764c000}, {0x4764e000}, + {0x47650000}, {0x47652000}, {0x47654000}, {0x47656000}, + {0x47658000}, {0x4765a000}, {0x4765c000}, {0x4765e000}, + {0x47660000}, {0x47662000}, {0x47664000}, {0x47666000}, + {0x47668000}, {0x4766a000}, {0x4766c000}, {0x4766e000}, + {0x47670000}, {0x47672000}, {0x47674000}, {0x47676000}, + {0x47678000}, {0x4767a000}, {0x4767c000}, {0x4767e000}, + {0x47680000}, {0x47682000}, {0x47684000}, {0x47686000}, + {0x47688000}, {0x4768a000}, {0x4768c000}, {0x4768e000}, + {0x47690000}, {0x47692000}, {0x47694000}, {0x47696000}, + {0x47698000}, {0x4769a000}, {0x4769c000}, {0x4769e000}, + {0x476a0000}, {0x476a2000}, {0x476a4000}, {0x476a6000}, + {0x476a8000}, {0x476aa000}, {0x476ac000}, {0x476ae000}, + {0x476b0000}, {0x476b2000}, {0x476b4000}, {0x476b6000}, + {0x476b8000}, {0x476ba000}, {0x476bc000}, {0x476be000}, + {0x476c0000}, {0x476c2000}, {0x476c4000}, {0x476c6000}, + {0x476c8000}, {0x476ca000}, {0x476cc000}, {0x476ce000}, + {0x476d0000}, {0x476d2000}, {0x476d4000}, {0x476d6000}, + {0x476d8000}, {0x476da000}, {0x476dc000}, {0x476de000}, + {0x476e0000}, {0x476e2000}, {0x476e4000}, {0x476e6000}, + {0x476e8000}, {0x476ea000}, {0x476ec000}, {0x476ee000}, + {0x476f0000}, {0x476f2000}, {0x476f4000}, {0x476f6000}, + {0x476f8000}, {0x476fa000}, {0x476fc000}, {0x476fe000}, + {0x47700000}, {0x47702000}, {0x47704000}, {0x47706000}, + {0x47708000}, {0x4770a000}, {0x4770c000}, {0x4770e000}, + {0x47710000}, {0x47712000}, {0x47714000}, {0x47716000}, + {0x47718000}, {0x4771a000}, {0x4771c000}, {0x4771e000}, + {0x47720000}, {0x47722000}, {0x47724000}, {0x47726000}, + {0x47728000}, {0x4772a000}, {0x4772c000}, {0x4772e000}, + {0x47730000}, {0x47732000}, {0x47734000}, {0x47736000}, + {0x47738000}, {0x4773a000}, {0x4773c000}, {0x4773e000}, + {0x47740000}, {0x47742000}, {0x47744000}, {0x47746000}, + {0x47748000}, {0x4774a000}, {0x4774c000}, {0x4774e000}, + {0x47750000}, {0x47752000}, {0x47754000}, {0x47756000}, + {0x47758000}, {0x4775a000}, {0x4775c000}, {0x4775e000}, + {0x47760000}, {0x47762000}, {0x47764000}, {0x47766000}, + {0x47768000}, {0x4776a000}, {0x4776c000}, {0x4776e000}, + {0x47770000}, {0x47772000}, {0x47774000}, {0x47776000}, + {0x47778000}, {0x4777a000}, {0x4777c000}, {0x4777e000}, + {0x47780000}, {0x47782000}, {0x47784000}, {0x47786000}, + {0x47788000}, {0x4778a000}, {0x4778c000}, {0x4778e000}, + {0x47790000}, {0x47792000}, {0x47794000}, {0x47796000}, + {0x47798000}, {0x4779a000}, {0x4779c000}, {0x4779e000}, + {0x477a0000}, {0x477a2000}, {0x477a4000}, {0x477a6000}, + {0x477a8000}, {0x477aa000}, {0x477ac000}, {0x477ae000}, + {0x477b0000}, {0x477b2000}, {0x477b4000}, {0x477b6000}, + {0x477b8000}, {0x477ba000}, {0x477bc000}, {0x477be000}, + {0x477c0000}, {0x477c2000}, {0x477c4000}, {0x477c6000}, + {0x477c8000}, {0x477ca000}, {0x477cc000}, {0x477ce000}, + {0x477d0000}, {0x477d2000}, {0x477d4000}, {0x477d6000}, + {0x477d8000}, {0x477da000}, {0x477dc000}, {0x477de000}, + {0x477e0000}, {0x477e2000}, {0x477e4000}, {0x477e6000}, + {0x477e8000}, {0x477ea000}, {0x477ec000}, {0x477ee000}, + {0x477f0000}, {0x477f2000}, {0x477f4000}, {0x477f6000}, + {0x477f8000}, {0x477fa000}, {0x477fc000}, {0x477fe000}, + {0x7f800000}, {0x7f802000}, {0x7f804000}, {0x7f806000}, + {0x7f808000}, {0x7f80a000}, {0x7f80c000}, {0x7f80e000}, + {0x7f810000}, {0x7f812000}, {0x7f814000}, {0x7f816000}, + {0x7f818000}, {0x7f81a000}, {0x7f81c000}, {0x7f81e000}, + {0x7f820000}, {0x7f822000}, {0x7f824000}, {0x7f826000}, + {0x7f828000}, {0x7f82a000}, {0x7f82c000}, {0x7f82e000}, + {0x7f830000}, {0x7f832000}, {0x7f834000}, {0x7f836000}, + {0x7f838000}, {0x7f83a000}, {0x7f83c000}, {0x7f83e000}, + {0x7f840000}, {0x7f842000}, {0x7f844000}, {0x7f846000}, + {0x7f848000}, {0x7f84a000}, {0x7f84c000}, {0x7f84e000}, + {0x7f850000}, {0x7f852000}, {0x7f854000}, {0x7f856000}, + {0x7f858000}, {0x7f85a000}, {0x7f85c000}, {0x7f85e000}, + {0x7f860000}, {0x7f862000}, {0x7f864000}, {0x7f866000}, + {0x7f868000}, {0x7f86a000}, {0x7f86c000}, {0x7f86e000}, + {0x7f870000}, {0x7f872000}, {0x7f874000}, {0x7f876000}, + {0x7f878000}, {0x7f87a000}, {0x7f87c000}, {0x7f87e000}, + {0x7f880000}, {0x7f882000}, {0x7f884000}, {0x7f886000}, + {0x7f888000}, {0x7f88a000}, {0x7f88c000}, {0x7f88e000}, + {0x7f890000}, {0x7f892000}, {0x7f894000}, {0x7f896000}, + {0x7f898000}, {0x7f89a000}, {0x7f89c000}, {0x7f89e000}, + {0x7f8a0000}, {0x7f8a2000}, {0x7f8a4000}, {0x7f8a6000}, + {0x7f8a8000}, {0x7f8aa000}, {0x7f8ac000}, {0x7f8ae000}, + {0x7f8b0000}, {0x7f8b2000}, {0x7f8b4000}, {0x7f8b6000}, + {0x7f8b8000}, {0x7f8ba000}, {0x7f8bc000}, {0x7f8be000}, + {0x7f8c0000}, {0x7f8c2000}, {0x7f8c4000}, {0x7f8c6000}, + {0x7f8c8000}, {0x7f8ca000}, {0x7f8cc000}, {0x7f8ce000}, + {0x7f8d0000}, {0x7f8d2000}, {0x7f8d4000}, {0x7f8d6000}, + {0x7f8d8000}, {0x7f8da000}, {0x7f8dc000}, {0x7f8de000}, + {0x7f8e0000}, {0x7f8e2000}, {0x7f8e4000}, {0x7f8e6000}, + {0x7f8e8000}, {0x7f8ea000}, {0x7f8ec000}, {0x7f8ee000}, + {0x7f8f0000}, {0x7f8f2000}, {0x7f8f4000}, {0x7f8f6000}, + {0x7f8f8000}, {0x7f8fa000}, {0x7f8fc000}, {0x7f8fe000}, + {0x7f900000}, {0x7f902000}, {0x7f904000}, {0x7f906000}, + {0x7f908000}, {0x7f90a000}, {0x7f90c000}, {0x7f90e000}, + {0x7f910000}, {0x7f912000}, {0x7f914000}, {0x7f916000}, + {0x7f918000}, {0x7f91a000}, {0x7f91c000}, {0x7f91e000}, + {0x7f920000}, {0x7f922000}, {0x7f924000}, {0x7f926000}, + {0x7f928000}, {0x7f92a000}, {0x7f92c000}, {0x7f92e000}, + {0x7f930000}, {0x7f932000}, {0x7f934000}, {0x7f936000}, + {0x7f938000}, {0x7f93a000}, {0x7f93c000}, {0x7f93e000}, + {0x7f940000}, {0x7f942000}, {0x7f944000}, {0x7f946000}, + {0x7f948000}, {0x7f94a000}, {0x7f94c000}, {0x7f94e000}, + {0x7f950000}, {0x7f952000}, {0x7f954000}, {0x7f956000}, + {0x7f958000}, {0x7f95a000}, {0x7f95c000}, {0x7f95e000}, + {0x7f960000}, {0x7f962000}, {0x7f964000}, {0x7f966000}, + {0x7f968000}, {0x7f96a000}, {0x7f96c000}, {0x7f96e000}, + {0x7f970000}, {0x7f972000}, {0x7f974000}, {0x7f976000}, + {0x7f978000}, {0x7f97a000}, {0x7f97c000}, {0x7f97e000}, + {0x7f980000}, {0x7f982000}, {0x7f984000}, {0x7f986000}, + {0x7f988000}, {0x7f98a000}, {0x7f98c000}, {0x7f98e000}, + {0x7f990000}, {0x7f992000}, {0x7f994000}, {0x7f996000}, + {0x7f998000}, {0x7f99a000}, {0x7f99c000}, {0x7f99e000}, + {0x7f9a0000}, {0x7f9a2000}, {0x7f9a4000}, {0x7f9a6000}, + {0x7f9a8000}, {0x7f9aa000}, {0x7f9ac000}, {0x7f9ae000}, + {0x7f9b0000}, {0x7f9b2000}, {0x7f9b4000}, {0x7f9b6000}, + {0x7f9b8000}, {0x7f9ba000}, {0x7f9bc000}, {0x7f9be000}, + {0x7f9c0000}, {0x7f9c2000}, {0x7f9c4000}, {0x7f9c6000}, + {0x7f9c8000}, {0x7f9ca000}, {0x7f9cc000}, {0x7f9ce000}, + {0x7f9d0000}, {0x7f9d2000}, {0x7f9d4000}, {0x7f9d6000}, + {0x7f9d8000}, {0x7f9da000}, {0x7f9dc000}, {0x7f9de000}, + {0x7f9e0000}, {0x7f9e2000}, {0x7f9e4000}, {0x7f9e6000}, + {0x7f9e8000}, {0x7f9ea000}, {0x7f9ec000}, {0x7f9ee000}, + {0x7f9f0000}, {0x7f9f2000}, {0x7f9f4000}, {0x7f9f6000}, + {0x7f9f8000}, {0x7f9fa000}, {0x7f9fc000}, {0x7f9fe000}, + {0x7fa00000}, {0x7fa02000}, {0x7fa04000}, {0x7fa06000}, + {0x7fa08000}, {0x7fa0a000}, {0x7fa0c000}, {0x7fa0e000}, + {0x7fa10000}, {0x7fa12000}, {0x7fa14000}, {0x7fa16000}, + {0x7fa18000}, {0x7fa1a000}, {0x7fa1c000}, {0x7fa1e000}, + {0x7fa20000}, {0x7fa22000}, {0x7fa24000}, {0x7fa26000}, + {0x7fa28000}, {0x7fa2a000}, {0x7fa2c000}, {0x7fa2e000}, + {0x7fa30000}, {0x7fa32000}, {0x7fa34000}, {0x7fa36000}, + {0x7fa38000}, {0x7fa3a000}, {0x7fa3c000}, {0x7fa3e000}, + {0x7fa40000}, {0x7fa42000}, {0x7fa44000}, {0x7fa46000}, + {0x7fa48000}, {0x7fa4a000}, {0x7fa4c000}, {0x7fa4e000}, + {0x7fa50000}, {0x7fa52000}, {0x7fa54000}, {0x7fa56000}, + {0x7fa58000}, {0x7fa5a000}, {0x7fa5c000}, {0x7fa5e000}, + {0x7fa60000}, {0x7fa62000}, {0x7fa64000}, {0x7fa66000}, + {0x7fa68000}, {0x7fa6a000}, {0x7fa6c000}, {0x7fa6e000}, + {0x7fa70000}, {0x7fa72000}, {0x7fa74000}, {0x7fa76000}, + {0x7fa78000}, {0x7fa7a000}, {0x7fa7c000}, {0x7fa7e000}, + {0x7fa80000}, {0x7fa82000}, {0x7fa84000}, {0x7fa86000}, + {0x7fa88000}, {0x7fa8a000}, {0x7fa8c000}, {0x7fa8e000}, + {0x7fa90000}, {0x7fa92000}, {0x7fa94000}, {0x7fa96000}, + {0x7fa98000}, {0x7fa9a000}, {0x7fa9c000}, {0x7fa9e000}, + {0x7faa0000}, {0x7faa2000}, {0x7faa4000}, {0x7faa6000}, + {0x7faa8000}, {0x7faaa000}, {0x7faac000}, {0x7faae000}, + {0x7fab0000}, {0x7fab2000}, {0x7fab4000}, {0x7fab6000}, + {0x7fab8000}, {0x7faba000}, {0x7fabc000}, {0x7fabe000}, + {0x7fac0000}, {0x7fac2000}, {0x7fac4000}, {0x7fac6000}, + {0x7fac8000}, {0x7faca000}, {0x7facc000}, {0x7face000}, + {0x7fad0000}, {0x7fad2000}, {0x7fad4000}, {0x7fad6000}, + {0x7fad8000}, {0x7fada000}, {0x7fadc000}, {0x7fade000}, + {0x7fae0000}, {0x7fae2000}, {0x7fae4000}, {0x7fae6000}, + {0x7fae8000}, {0x7faea000}, {0x7faec000}, {0x7faee000}, + {0x7faf0000}, {0x7faf2000}, {0x7faf4000}, {0x7faf6000}, + {0x7faf8000}, {0x7fafa000}, {0x7fafc000}, {0x7fafe000}, + {0x7fb00000}, {0x7fb02000}, {0x7fb04000}, {0x7fb06000}, + {0x7fb08000}, {0x7fb0a000}, {0x7fb0c000}, {0x7fb0e000}, + {0x7fb10000}, {0x7fb12000}, {0x7fb14000}, {0x7fb16000}, + {0x7fb18000}, {0x7fb1a000}, {0x7fb1c000}, {0x7fb1e000}, + {0x7fb20000}, {0x7fb22000}, {0x7fb24000}, {0x7fb26000}, + {0x7fb28000}, {0x7fb2a000}, {0x7fb2c000}, {0x7fb2e000}, + {0x7fb30000}, {0x7fb32000}, {0x7fb34000}, {0x7fb36000}, + {0x7fb38000}, {0x7fb3a000}, {0x7fb3c000}, {0x7fb3e000}, + {0x7fb40000}, {0x7fb42000}, {0x7fb44000}, {0x7fb46000}, + {0x7fb48000}, {0x7fb4a000}, {0x7fb4c000}, {0x7fb4e000}, + {0x7fb50000}, {0x7fb52000}, {0x7fb54000}, {0x7fb56000}, + {0x7fb58000}, {0x7fb5a000}, {0x7fb5c000}, {0x7fb5e000}, + {0x7fb60000}, {0x7fb62000}, {0x7fb64000}, {0x7fb66000}, + {0x7fb68000}, {0x7fb6a000}, {0x7fb6c000}, {0x7fb6e000}, + {0x7fb70000}, {0x7fb72000}, {0x7fb74000}, {0x7fb76000}, + {0x7fb78000}, {0x7fb7a000}, {0x7fb7c000}, {0x7fb7e000}, + {0x7fb80000}, {0x7fb82000}, {0x7fb84000}, {0x7fb86000}, + {0x7fb88000}, {0x7fb8a000}, {0x7fb8c000}, {0x7fb8e000}, + {0x7fb90000}, {0x7fb92000}, {0x7fb94000}, {0x7fb96000}, + {0x7fb98000}, {0x7fb9a000}, {0x7fb9c000}, {0x7fb9e000}, + {0x7fba0000}, {0x7fba2000}, {0x7fba4000}, {0x7fba6000}, + {0x7fba8000}, {0x7fbaa000}, {0x7fbac000}, {0x7fbae000}, + {0x7fbb0000}, {0x7fbb2000}, {0x7fbb4000}, {0x7fbb6000}, + {0x7fbb8000}, {0x7fbba000}, {0x7fbbc000}, {0x7fbbe000}, + {0x7fbc0000}, {0x7fbc2000}, {0x7fbc4000}, {0x7fbc6000}, + {0x7fbc8000}, {0x7fbca000}, {0x7fbcc000}, {0x7fbce000}, + {0x7fbd0000}, {0x7fbd2000}, {0x7fbd4000}, {0x7fbd6000}, + {0x7fbd8000}, {0x7fbda000}, {0x7fbdc000}, {0x7fbde000}, + {0x7fbe0000}, {0x7fbe2000}, {0x7fbe4000}, {0x7fbe6000}, + {0x7fbe8000}, {0x7fbea000}, {0x7fbec000}, {0x7fbee000}, + {0x7fbf0000}, {0x7fbf2000}, {0x7fbf4000}, {0x7fbf6000}, + {0x7fbf8000}, {0x7fbfa000}, {0x7fbfc000}, {0x7fbfe000}, + {0x7fc00000}, {0x7fc02000}, {0x7fc04000}, {0x7fc06000}, + {0x7fc08000}, {0x7fc0a000}, {0x7fc0c000}, {0x7fc0e000}, + {0x7fc10000}, {0x7fc12000}, {0x7fc14000}, {0x7fc16000}, + {0x7fc18000}, {0x7fc1a000}, {0x7fc1c000}, {0x7fc1e000}, + {0x7fc20000}, {0x7fc22000}, {0x7fc24000}, {0x7fc26000}, + {0x7fc28000}, {0x7fc2a000}, {0x7fc2c000}, {0x7fc2e000}, + {0x7fc30000}, {0x7fc32000}, {0x7fc34000}, {0x7fc36000}, + {0x7fc38000}, {0x7fc3a000}, {0x7fc3c000}, {0x7fc3e000}, + {0x7fc40000}, {0x7fc42000}, {0x7fc44000}, {0x7fc46000}, + {0x7fc48000}, {0x7fc4a000}, {0x7fc4c000}, {0x7fc4e000}, + {0x7fc50000}, {0x7fc52000}, {0x7fc54000}, {0x7fc56000}, + {0x7fc58000}, {0x7fc5a000}, {0x7fc5c000}, {0x7fc5e000}, + {0x7fc60000}, {0x7fc62000}, {0x7fc64000}, {0x7fc66000}, + {0x7fc68000}, {0x7fc6a000}, {0x7fc6c000}, {0x7fc6e000}, + {0x7fc70000}, {0x7fc72000}, {0x7fc74000}, {0x7fc76000}, + {0x7fc78000}, {0x7fc7a000}, {0x7fc7c000}, {0x7fc7e000}, + {0x7fc80000}, {0x7fc82000}, {0x7fc84000}, {0x7fc86000}, + {0x7fc88000}, {0x7fc8a000}, {0x7fc8c000}, {0x7fc8e000}, + {0x7fc90000}, {0x7fc92000}, {0x7fc94000}, {0x7fc96000}, + {0x7fc98000}, {0x7fc9a000}, {0x7fc9c000}, {0x7fc9e000}, + {0x7fca0000}, {0x7fca2000}, {0x7fca4000}, {0x7fca6000}, + {0x7fca8000}, {0x7fcaa000}, {0x7fcac000}, {0x7fcae000}, + {0x7fcb0000}, {0x7fcb2000}, {0x7fcb4000}, {0x7fcb6000}, + {0x7fcb8000}, {0x7fcba000}, {0x7fcbc000}, {0x7fcbe000}, + {0x7fcc0000}, {0x7fcc2000}, {0x7fcc4000}, {0x7fcc6000}, + {0x7fcc8000}, {0x7fcca000}, {0x7fccc000}, {0x7fcce000}, + {0x7fcd0000}, {0x7fcd2000}, {0x7fcd4000}, {0x7fcd6000}, + {0x7fcd8000}, {0x7fcda000}, {0x7fcdc000}, {0x7fcde000}, + {0x7fce0000}, {0x7fce2000}, {0x7fce4000}, {0x7fce6000}, + {0x7fce8000}, {0x7fcea000}, {0x7fcec000}, {0x7fcee000}, + {0x7fcf0000}, {0x7fcf2000}, {0x7fcf4000}, {0x7fcf6000}, + {0x7fcf8000}, {0x7fcfa000}, {0x7fcfc000}, {0x7fcfe000}, + {0x7fd00000}, {0x7fd02000}, {0x7fd04000}, {0x7fd06000}, + {0x7fd08000}, {0x7fd0a000}, {0x7fd0c000}, {0x7fd0e000}, + {0x7fd10000}, {0x7fd12000}, {0x7fd14000}, {0x7fd16000}, + {0x7fd18000}, {0x7fd1a000}, {0x7fd1c000}, {0x7fd1e000}, + {0x7fd20000}, {0x7fd22000}, {0x7fd24000}, {0x7fd26000}, + {0x7fd28000}, {0x7fd2a000}, {0x7fd2c000}, {0x7fd2e000}, + {0x7fd30000}, {0x7fd32000}, {0x7fd34000}, {0x7fd36000}, + {0x7fd38000}, {0x7fd3a000}, {0x7fd3c000}, {0x7fd3e000}, + {0x7fd40000}, {0x7fd42000}, {0x7fd44000}, {0x7fd46000}, + {0x7fd48000}, {0x7fd4a000}, {0x7fd4c000}, {0x7fd4e000}, + {0x7fd50000}, {0x7fd52000}, {0x7fd54000}, {0x7fd56000}, + {0x7fd58000}, {0x7fd5a000}, {0x7fd5c000}, {0x7fd5e000}, + {0x7fd60000}, {0x7fd62000}, {0x7fd64000}, {0x7fd66000}, + {0x7fd68000}, {0x7fd6a000}, {0x7fd6c000}, {0x7fd6e000}, + {0x7fd70000}, {0x7fd72000}, {0x7fd74000}, {0x7fd76000}, + {0x7fd78000}, {0x7fd7a000}, {0x7fd7c000}, {0x7fd7e000}, + {0x7fd80000}, {0x7fd82000}, {0x7fd84000}, {0x7fd86000}, + {0x7fd88000}, {0x7fd8a000}, {0x7fd8c000}, {0x7fd8e000}, + {0x7fd90000}, {0x7fd92000}, {0x7fd94000}, {0x7fd96000}, + {0x7fd98000}, {0x7fd9a000}, {0x7fd9c000}, {0x7fd9e000}, + {0x7fda0000}, {0x7fda2000}, {0x7fda4000}, {0x7fda6000}, + {0x7fda8000}, {0x7fdaa000}, {0x7fdac000}, {0x7fdae000}, + {0x7fdb0000}, {0x7fdb2000}, {0x7fdb4000}, {0x7fdb6000}, + {0x7fdb8000}, {0x7fdba000}, {0x7fdbc000}, {0x7fdbe000}, + {0x7fdc0000}, {0x7fdc2000}, {0x7fdc4000}, {0x7fdc6000}, + {0x7fdc8000}, {0x7fdca000}, {0x7fdcc000}, {0x7fdce000}, + {0x7fdd0000}, {0x7fdd2000}, {0x7fdd4000}, {0x7fdd6000}, + {0x7fdd8000}, {0x7fdda000}, {0x7fddc000}, {0x7fdde000}, + {0x7fde0000}, {0x7fde2000}, {0x7fde4000}, {0x7fde6000}, + {0x7fde8000}, {0x7fdea000}, {0x7fdec000}, {0x7fdee000}, + {0x7fdf0000}, {0x7fdf2000}, {0x7fdf4000}, {0x7fdf6000}, + {0x7fdf8000}, {0x7fdfa000}, {0x7fdfc000}, {0x7fdfe000}, + {0x7fe00000}, {0x7fe02000}, {0x7fe04000}, {0x7fe06000}, + {0x7fe08000}, {0x7fe0a000}, {0x7fe0c000}, {0x7fe0e000}, + {0x7fe10000}, {0x7fe12000}, {0x7fe14000}, {0x7fe16000}, + {0x7fe18000}, {0x7fe1a000}, {0x7fe1c000}, {0x7fe1e000}, + {0x7fe20000}, {0x7fe22000}, {0x7fe24000}, {0x7fe26000}, + {0x7fe28000}, {0x7fe2a000}, {0x7fe2c000}, {0x7fe2e000}, + {0x7fe30000}, {0x7fe32000}, {0x7fe34000}, {0x7fe36000}, + {0x7fe38000}, {0x7fe3a000}, {0x7fe3c000}, {0x7fe3e000}, + {0x7fe40000}, {0x7fe42000}, {0x7fe44000}, {0x7fe46000}, + {0x7fe48000}, {0x7fe4a000}, {0x7fe4c000}, {0x7fe4e000}, + {0x7fe50000}, {0x7fe52000}, {0x7fe54000}, {0x7fe56000}, + {0x7fe58000}, {0x7fe5a000}, {0x7fe5c000}, {0x7fe5e000}, + {0x7fe60000}, {0x7fe62000}, {0x7fe64000}, {0x7fe66000}, + {0x7fe68000}, {0x7fe6a000}, {0x7fe6c000}, {0x7fe6e000}, + {0x7fe70000}, {0x7fe72000}, {0x7fe74000}, {0x7fe76000}, + {0x7fe78000}, {0x7fe7a000}, {0x7fe7c000}, {0x7fe7e000}, + {0x7fe80000}, {0x7fe82000}, {0x7fe84000}, {0x7fe86000}, + {0x7fe88000}, {0x7fe8a000}, {0x7fe8c000}, {0x7fe8e000}, + {0x7fe90000}, {0x7fe92000}, {0x7fe94000}, {0x7fe96000}, + {0x7fe98000}, {0x7fe9a000}, {0x7fe9c000}, {0x7fe9e000}, + {0x7fea0000}, {0x7fea2000}, {0x7fea4000}, {0x7fea6000}, + {0x7fea8000}, {0x7feaa000}, {0x7feac000}, {0x7feae000}, + {0x7feb0000}, {0x7feb2000}, {0x7feb4000}, {0x7feb6000}, + {0x7feb8000}, {0x7feba000}, {0x7febc000}, {0x7febe000}, + {0x7fec0000}, {0x7fec2000}, {0x7fec4000}, {0x7fec6000}, + {0x7fec8000}, {0x7feca000}, {0x7fecc000}, {0x7fece000}, + {0x7fed0000}, {0x7fed2000}, {0x7fed4000}, {0x7fed6000}, + {0x7fed8000}, {0x7feda000}, {0x7fedc000}, {0x7fede000}, + {0x7fee0000}, {0x7fee2000}, {0x7fee4000}, {0x7fee6000}, + {0x7fee8000}, {0x7feea000}, {0x7feec000}, {0x7feee000}, + {0x7fef0000}, {0x7fef2000}, {0x7fef4000}, {0x7fef6000}, + {0x7fef8000}, {0x7fefa000}, {0x7fefc000}, {0x7fefe000}, + {0x7ff00000}, {0x7ff02000}, {0x7ff04000}, {0x7ff06000}, + {0x7ff08000}, {0x7ff0a000}, {0x7ff0c000}, {0x7ff0e000}, + {0x7ff10000}, {0x7ff12000}, {0x7ff14000}, {0x7ff16000}, + {0x7ff18000}, {0x7ff1a000}, {0x7ff1c000}, {0x7ff1e000}, + {0x7ff20000}, {0x7ff22000}, {0x7ff24000}, {0x7ff26000}, + {0x7ff28000}, {0x7ff2a000}, {0x7ff2c000}, {0x7ff2e000}, + {0x7ff30000}, {0x7ff32000}, {0x7ff34000}, {0x7ff36000}, + {0x7ff38000}, {0x7ff3a000}, {0x7ff3c000}, {0x7ff3e000}, + {0x7ff40000}, {0x7ff42000}, {0x7ff44000}, {0x7ff46000}, + {0x7ff48000}, {0x7ff4a000}, {0x7ff4c000}, {0x7ff4e000}, + {0x7ff50000}, {0x7ff52000}, {0x7ff54000}, {0x7ff56000}, + {0x7ff58000}, {0x7ff5a000}, {0x7ff5c000}, {0x7ff5e000}, + {0x7ff60000}, {0x7ff62000}, {0x7ff64000}, {0x7ff66000}, + {0x7ff68000}, {0x7ff6a000}, {0x7ff6c000}, {0x7ff6e000}, + {0x7ff70000}, {0x7ff72000}, {0x7ff74000}, {0x7ff76000}, + {0x7ff78000}, {0x7ff7a000}, {0x7ff7c000}, {0x7ff7e000}, + {0x7ff80000}, {0x7ff82000}, {0x7ff84000}, {0x7ff86000}, + {0x7ff88000}, {0x7ff8a000}, {0x7ff8c000}, {0x7ff8e000}, + {0x7ff90000}, {0x7ff92000}, {0x7ff94000}, {0x7ff96000}, + {0x7ff98000}, {0x7ff9a000}, {0x7ff9c000}, {0x7ff9e000}, + {0x7ffa0000}, {0x7ffa2000}, {0x7ffa4000}, {0x7ffa6000}, + {0x7ffa8000}, {0x7ffaa000}, {0x7ffac000}, {0x7ffae000}, + {0x7ffb0000}, {0x7ffb2000}, {0x7ffb4000}, {0x7ffb6000}, + {0x7ffb8000}, {0x7ffba000}, {0x7ffbc000}, {0x7ffbe000}, + {0x7ffc0000}, {0x7ffc2000}, {0x7ffc4000}, {0x7ffc6000}, + {0x7ffc8000}, {0x7ffca000}, {0x7ffcc000}, {0x7ffce000}, + {0x7ffd0000}, {0x7ffd2000}, {0x7ffd4000}, {0x7ffd6000}, + {0x7ffd8000}, {0x7ffda000}, {0x7ffdc000}, {0x7ffde000}, + {0x7ffe0000}, {0x7ffe2000}, {0x7ffe4000}, {0x7ffe6000}, + {0x7ffe8000}, {0x7ffea000}, {0x7ffec000}, {0x7ffee000}, + {0x7fff0000}, {0x7fff2000}, {0x7fff4000}, {0x7fff6000}, + {0x7fff8000}, {0x7fffa000}, {0x7fffc000}, {0x7fffe000}, + {0x80000000}, {0xb3800000}, {0xb4000000}, {0xb4400000}, + {0xb4800000}, {0xb4a00000}, {0xb4c00000}, {0xb4e00000}, + {0xb5000000}, {0xb5100000}, {0xb5200000}, {0xb5300000}, + {0xb5400000}, {0xb5500000}, {0xb5600000}, {0xb5700000}, + {0xb5800000}, {0xb5880000}, {0xb5900000}, {0xb5980000}, + {0xb5a00000}, {0xb5a80000}, {0xb5b00000}, {0xb5b80000}, + {0xb5c00000}, {0xb5c80000}, {0xb5d00000}, {0xb5d80000}, + {0xb5e00000}, {0xb5e80000}, {0xb5f00000}, {0xb5f80000}, + {0xb6000000}, {0xb6040000}, {0xb6080000}, {0xb60c0000}, + {0xb6100000}, {0xb6140000}, {0xb6180000}, {0xb61c0000}, + {0xb6200000}, {0xb6240000}, {0xb6280000}, {0xb62c0000}, + {0xb6300000}, {0xb6340000}, {0xb6380000}, {0xb63c0000}, + {0xb6400000}, {0xb6440000}, {0xb6480000}, {0xb64c0000}, + {0xb6500000}, {0xb6540000}, {0xb6580000}, {0xb65c0000}, + {0xb6600000}, {0xb6640000}, {0xb6680000}, {0xb66c0000}, + {0xb6700000}, {0xb6740000}, {0xb6780000}, {0xb67c0000}, + {0xb6800000}, {0xb6820000}, {0xb6840000}, {0xb6860000}, + {0xb6880000}, {0xb68a0000}, {0xb68c0000}, {0xb68e0000}, + {0xb6900000}, {0xb6920000}, {0xb6940000}, {0xb6960000}, + {0xb6980000}, {0xb69a0000}, {0xb69c0000}, {0xb69e0000}, + {0xb6a00000}, {0xb6a20000}, {0xb6a40000}, {0xb6a60000}, + {0xb6a80000}, {0xb6aa0000}, {0xb6ac0000}, {0xb6ae0000}, + {0xb6b00000}, {0xb6b20000}, {0xb6b40000}, {0xb6b60000}, + {0xb6b80000}, {0xb6ba0000}, {0xb6bc0000}, {0xb6be0000}, + {0xb6c00000}, {0xb6c20000}, {0xb6c40000}, {0xb6c60000}, + {0xb6c80000}, {0xb6ca0000}, {0xb6cc0000}, {0xb6ce0000}, + {0xb6d00000}, {0xb6d20000}, {0xb6d40000}, {0xb6d60000}, + {0xb6d80000}, {0xb6da0000}, {0xb6dc0000}, {0xb6de0000}, + {0xb6e00000}, {0xb6e20000}, {0xb6e40000}, {0xb6e60000}, + {0xb6e80000}, {0xb6ea0000}, {0xb6ec0000}, {0xb6ee0000}, + {0xb6f00000}, {0xb6f20000}, {0xb6f40000}, {0xb6f60000}, + {0xb6f80000}, {0xb6fa0000}, {0xb6fc0000}, {0xb6fe0000}, + {0xb7000000}, {0xb7010000}, {0xb7020000}, {0xb7030000}, + {0xb7040000}, {0xb7050000}, {0xb7060000}, {0xb7070000}, + {0xb7080000}, {0xb7090000}, {0xb70a0000}, {0xb70b0000}, + {0xb70c0000}, {0xb70d0000}, {0xb70e0000}, {0xb70f0000}, + {0xb7100000}, {0xb7110000}, {0xb7120000}, {0xb7130000}, + {0xb7140000}, {0xb7150000}, {0xb7160000}, {0xb7170000}, + {0xb7180000}, {0xb7190000}, {0xb71a0000}, {0xb71b0000}, + {0xb71c0000}, {0xb71d0000}, {0xb71e0000}, {0xb71f0000}, + {0xb7200000}, {0xb7210000}, {0xb7220000}, {0xb7230000}, + {0xb7240000}, {0xb7250000}, {0xb7260000}, {0xb7270000}, + {0xb7280000}, {0xb7290000}, {0xb72a0000}, {0xb72b0000}, + {0xb72c0000}, {0xb72d0000}, {0xb72e0000}, {0xb72f0000}, + {0xb7300000}, {0xb7310000}, {0xb7320000}, {0xb7330000}, + {0xb7340000}, {0xb7350000}, {0xb7360000}, {0xb7370000}, + {0xb7380000}, {0xb7390000}, {0xb73a0000}, {0xb73b0000}, + {0xb73c0000}, {0xb73d0000}, {0xb73e0000}, {0xb73f0000}, + {0xb7400000}, {0xb7410000}, {0xb7420000}, {0xb7430000}, + {0xb7440000}, {0xb7450000}, {0xb7460000}, {0xb7470000}, + {0xb7480000}, {0xb7490000}, {0xb74a0000}, {0xb74b0000}, + {0xb74c0000}, {0xb74d0000}, {0xb74e0000}, {0xb74f0000}, + {0xb7500000}, {0xb7510000}, {0xb7520000}, {0xb7530000}, + {0xb7540000}, {0xb7550000}, {0xb7560000}, {0xb7570000}, + {0xb7580000}, {0xb7590000}, {0xb75a0000}, {0xb75b0000}, + {0xb75c0000}, {0xb75d0000}, {0xb75e0000}, {0xb75f0000}, + {0xb7600000}, {0xb7610000}, {0xb7620000}, {0xb7630000}, + {0xb7640000}, {0xb7650000}, {0xb7660000}, {0xb7670000}, + {0xb7680000}, {0xb7690000}, {0xb76a0000}, {0xb76b0000}, + {0xb76c0000}, {0xb76d0000}, {0xb76e0000}, {0xb76f0000}, + {0xb7700000}, {0xb7710000}, {0xb7720000}, {0xb7730000}, + {0xb7740000}, {0xb7750000}, {0xb7760000}, {0xb7770000}, + {0xb7780000}, {0xb7790000}, {0xb77a0000}, {0xb77b0000}, + {0xb77c0000}, {0xb77d0000}, {0xb77e0000}, {0xb77f0000}, + {0xb7800000}, {0xb7808000}, {0xb7810000}, {0xb7818000}, + {0xb7820000}, {0xb7828000}, {0xb7830000}, {0xb7838000}, + {0xb7840000}, {0xb7848000}, {0xb7850000}, {0xb7858000}, + {0xb7860000}, {0xb7868000}, {0xb7870000}, {0xb7878000}, + {0xb7880000}, {0xb7888000}, {0xb7890000}, {0xb7898000}, + {0xb78a0000}, {0xb78a8000}, {0xb78b0000}, {0xb78b8000}, + {0xb78c0000}, {0xb78c8000}, {0xb78d0000}, {0xb78d8000}, + {0xb78e0000}, {0xb78e8000}, {0xb78f0000}, {0xb78f8000}, + {0xb7900000}, {0xb7908000}, {0xb7910000}, {0xb7918000}, + {0xb7920000}, {0xb7928000}, {0xb7930000}, {0xb7938000}, + {0xb7940000}, {0xb7948000}, {0xb7950000}, {0xb7958000}, + {0xb7960000}, {0xb7968000}, {0xb7970000}, {0xb7978000}, + {0xb7980000}, {0xb7988000}, {0xb7990000}, {0xb7998000}, + {0xb79a0000}, {0xb79a8000}, {0xb79b0000}, {0xb79b8000}, + {0xb79c0000}, {0xb79c8000}, {0xb79d0000}, {0xb79d8000}, + {0xb79e0000}, {0xb79e8000}, {0xb79f0000}, {0xb79f8000}, + {0xb7a00000}, {0xb7a08000}, {0xb7a10000}, {0xb7a18000}, + {0xb7a20000}, {0xb7a28000}, {0xb7a30000}, {0xb7a38000}, + {0xb7a40000}, {0xb7a48000}, {0xb7a50000}, {0xb7a58000}, + {0xb7a60000}, {0xb7a68000}, {0xb7a70000}, {0xb7a78000}, + {0xb7a80000}, {0xb7a88000}, {0xb7a90000}, {0xb7a98000}, + {0xb7aa0000}, {0xb7aa8000}, {0xb7ab0000}, {0xb7ab8000}, + {0xb7ac0000}, {0xb7ac8000}, {0xb7ad0000}, {0xb7ad8000}, + {0xb7ae0000}, {0xb7ae8000}, {0xb7af0000}, {0xb7af8000}, + {0xb7b00000}, {0xb7b08000}, {0xb7b10000}, {0xb7b18000}, + {0xb7b20000}, {0xb7b28000}, {0xb7b30000}, {0xb7b38000}, + {0xb7b40000}, {0xb7b48000}, {0xb7b50000}, {0xb7b58000}, + {0xb7b60000}, {0xb7b68000}, {0xb7b70000}, {0xb7b78000}, + {0xb7b80000}, {0xb7b88000}, {0xb7b90000}, {0xb7b98000}, + {0xb7ba0000}, {0xb7ba8000}, {0xb7bb0000}, {0xb7bb8000}, + {0xb7bc0000}, {0xb7bc8000}, {0xb7bd0000}, {0xb7bd8000}, + {0xb7be0000}, {0xb7be8000}, {0xb7bf0000}, {0xb7bf8000}, + {0xb7c00000}, {0xb7c08000}, {0xb7c10000}, {0xb7c18000}, + {0xb7c20000}, {0xb7c28000}, {0xb7c30000}, {0xb7c38000}, + {0xb7c40000}, {0xb7c48000}, {0xb7c50000}, {0xb7c58000}, + {0xb7c60000}, {0xb7c68000}, {0xb7c70000}, {0xb7c78000}, + {0xb7c80000}, {0xb7c88000}, {0xb7c90000}, {0xb7c98000}, + {0xb7ca0000}, {0xb7ca8000}, {0xb7cb0000}, {0xb7cb8000}, + {0xb7cc0000}, {0xb7cc8000}, {0xb7cd0000}, {0xb7cd8000}, + {0xb7ce0000}, {0xb7ce8000}, {0xb7cf0000}, {0xb7cf8000}, + {0xb7d00000}, {0xb7d08000}, {0xb7d10000}, {0xb7d18000}, + {0xb7d20000}, {0xb7d28000}, {0xb7d30000}, {0xb7d38000}, + {0xb7d40000}, {0xb7d48000}, {0xb7d50000}, {0xb7d58000}, + {0xb7d60000}, {0xb7d68000}, {0xb7d70000}, {0xb7d78000}, + {0xb7d80000}, {0xb7d88000}, {0xb7d90000}, {0xb7d98000}, + {0xb7da0000}, {0xb7da8000}, {0xb7db0000}, {0xb7db8000}, + {0xb7dc0000}, {0xb7dc8000}, {0xb7dd0000}, {0xb7dd8000}, + {0xb7de0000}, {0xb7de8000}, {0xb7df0000}, {0xb7df8000}, + {0xb7e00000}, {0xb7e08000}, {0xb7e10000}, {0xb7e18000}, + {0xb7e20000}, {0xb7e28000}, {0xb7e30000}, {0xb7e38000}, + {0xb7e40000}, {0xb7e48000}, {0xb7e50000}, {0xb7e58000}, + {0xb7e60000}, {0xb7e68000}, {0xb7e70000}, {0xb7e78000}, + {0xb7e80000}, {0xb7e88000}, {0xb7e90000}, {0xb7e98000}, + {0xb7ea0000}, {0xb7ea8000}, {0xb7eb0000}, {0xb7eb8000}, + {0xb7ec0000}, {0xb7ec8000}, {0xb7ed0000}, {0xb7ed8000}, + {0xb7ee0000}, {0xb7ee8000}, {0xb7ef0000}, {0xb7ef8000}, + {0xb7f00000}, {0xb7f08000}, {0xb7f10000}, {0xb7f18000}, + {0xb7f20000}, {0xb7f28000}, {0xb7f30000}, {0xb7f38000}, + {0xb7f40000}, {0xb7f48000}, {0xb7f50000}, {0xb7f58000}, + {0xb7f60000}, {0xb7f68000}, {0xb7f70000}, {0xb7f78000}, + {0xb7f80000}, {0xb7f88000}, {0xb7f90000}, {0xb7f98000}, + {0xb7fa0000}, {0xb7fa8000}, {0xb7fb0000}, {0xb7fb8000}, + {0xb7fc0000}, {0xb7fc8000}, {0xb7fd0000}, {0xb7fd8000}, + {0xb7fe0000}, {0xb7fe8000}, {0xb7ff0000}, {0xb7ff8000}, + {0xb8000000}, {0xb8004000}, {0xb8008000}, {0xb800c000}, + {0xb8010000}, {0xb8014000}, {0xb8018000}, {0xb801c000}, + {0xb8020000}, {0xb8024000}, {0xb8028000}, {0xb802c000}, + {0xb8030000}, {0xb8034000}, {0xb8038000}, {0xb803c000}, + {0xb8040000}, {0xb8044000}, {0xb8048000}, {0xb804c000}, + {0xb8050000}, {0xb8054000}, {0xb8058000}, {0xb805c000}, + {0xb8060000}, {0xb8064000}, {0xb8068000}, {0xb806c000}, + {0xb8070000}, {0xb8074000}, {0xb8078000}, {0xb807c000}, + {0xb8080000}, {0xb8084000}, {0xb8088000}, {0xb808c000}, + {0xb8090000}, {0xb8094000}, {0xb8098000}, {0xb809c000}, + {0xb80a0000}, {0xb80a4000}, {0xb80a8000}, {0xb80ac000}, + {0xb80b0000}, {0xb80b4000}, {0xb80b8000}, {0xb80bc000}, + {0xb80c0000}, {0xb80c4000}, {0xb80c8000}, {0xb80cc000}, + {0xb80d0000}, {0xb80d4000}, {0xb80d8000}, {0xb80dc000}, + {0xb80e0000}, {0xb80e4000}, {0xb80e8000}, {0xb80ec000}, + {0xb80f0000}, {0xb80f4000}, {0xb80f8000}, {0xb80fc000}, + {0xb8100000}, {0xb8104000}, {0xb8108000}, {0xb810c000}, + {0xb8110000}, {0xb8114000}, {0xb8118000}, {0xb811c000}, + {0xb8120000}, {0xb8124000}, {0xb8128000}, {0xb812c000}, + {0xb8130000}, {0xb8134000}, {0xb8138000}, {0xb813c000}, + {0xb8140000}, {0xb8144000}, {0xb8148000}, {0xb814c000}, + {0xb8150000}, {0xb8154000}, {0xb8158000}, {0xb815c000}, + {0xb8160000}, {0xb8164000}, {0xb8168000}, {0xb816c000}, + {0xb8170000}, {0xb8174000}, {0xb8178000}, {0xb817c000}, + {0xb8180000}, {0xb8184000}, {0xb8188000}, {0xb818c000}, + {0xb8190000}, {0xb8194000}, {0xb8198000}, {0xb819c000}, + {0xb81a0000}, {0xb81a4000}, {0xb81a8000}, {0xb81ac000}, + {0xb81b0000}, {0xb81b4000}, {0xb81b8000}, {0xb81bc000}, + {0xb81c0000}, {0xb81c4000}, {0xb81c8000}, {0xb81cc000}, + {0xb81d0000}, {0xb81d4000}, {0xb81d8000}, {0xb81dc000}, + {0xb81e0000}, {0xb81e4000}, {0xb81e8000}, {0xb81ec000}, + {0xb81f0000}, {0xb81f4000}, {0xb81f8000}, {0xb81fc000}, + {0xb8200000}, {0xb8204000}, {0xb8208000}, {0xb820c000}, + {0xb8210000}, {0xb8214000}, {0xb8218000}, {0xb821c000}, + {0xb8220000}, {0xb8224000}, {0xb8228000}, {0xb822c000}, + {0xb8230000}, {0xb8234000}, {0xb8238000}, {0xb823c000}, + {0xb8240000}, {0xb8244000}, {0xb8248000}, {0xb824c000}, + {0xb8250000}, {0xb8254000}, {0xb8258000}, {0xb825c000}, + {0xb8260000}, {0xb8264000}, {0xb8268000}, {0xb826c000}, + {0xb8270000}, {0xb8274000}, {0xb8278000}, {0xb827c000}, + {0xb8280000}, {0xb8284000}, {0xb8288000}, {0xb828c000}, + {0xb8290000}, {0xb8294000}, {0xb8298000}, {0xb829c000}, + {0xb82a0000}, {0xb82a4000}, {0xb82a8000}, {0xb82ac000}, + {0xb82b0000}, {0xb82b4000}, {0xb82b8000}, {0xb82bc000}, + {0xb82c0000}, {0xb82c4000}, {0xb82c8000}, {0xb82cc000}, + {0xb82d0000}, {0xb82d4000}, {0xb82d8000}, {0xb82dc000}, + {0xb82e0000}, {0xb82e4000}, {0xb82e8000}, {0xb82ec000}, + {0xb82f0000}, {0xb82f4000}, {0xb82f8000}, {0xb82fc000}, + {0xb8300000}, {0xb8304000}, {0xb8308000}, {0xb830c000}, + {0xb8310000}, {0xb8314000}, {0xb8318000}, {0xb831c000}, + {0xb8320000}, {0xb8324000}, {0xb8328000}, {0xb832c000}, + {0xb8330000}, {0xb8334000}, {0xb8338000}, {0xb833c000}, + {0xb8340000}, {0xb8344000}, {0xb8348000}, {0xb834c000}, + {0xb8350000}, {0xb8354000}, {0xb8358000}, {0xb835c000}, + {0xb8360000}, {0xb8364000}, {0xb8368000}, {0xb836c000}, + {0xb8370000}, {0xb8374000}, {0xb8378000}, {0xb837c000}, + {0xb8380000}, {0xb8384000}, {0xb8388000}, {0xb838c000}, + {0xb8390000}, {0xb8394000}, {0xb8398000}, {0xb839c000}, + {0xb83a0000}, {0xb83a4000}, {0xb83a8000}, {0xb83ac000}, + {0xb83b0000}, {0xb83b4000}, {0xb83b8000}, {0xb83bc000}, + {0xb83c0000}, {0xb83c4000}, {0xb83c8000}, {0xb83cc000}, + {0xb83d0000}, {0xb83d4000}, {0xb83d8000}, {0xb83dc000}, + {0xb83e0000}, {0xb83e4000}, {0xb83e8000}, {0xb83ec000}, + {0xb83f0000}, {0xb83f4000}, {0xb83f8000}, {0xb83fc000}, + {0xb8400000}, {0xb8404000}, {0xb8408000}, {0xb840c000}, + {0xb8410000}, {0xb8414000}, {0xb8418000}, {0xb841c000}, + {0xb8420000}, {0xb8424000}, {0xb8428000}, {0xb842c000}, + {0xb8430000}, {0xb8434000}, {0xb8438000}, {0xb843c000}, + {0xb8440000}, {0xb8444000}, {0xb8448000}, {0xb844c000}, + {0xb8450000}, {0xb8454000}, {0xb8458000}, {0xb845c000}, + {0xb8460000}, {0xb8464000}, {0xb8468000}, {0xb846c000}, + {0xb8470000}, {0xb8474000}, {0xb8478000}, {0xb847c000}, + {0xb8480000}, {0xb8484000}, {0xb8488000}, {0xb848c000}, + {0xb8490000}, {0xb8494000}, {0xb8498000}, {0xb849c000}, + {0xb84a0000}, {0xb84a4000}, {0xb84a8000}, {0xb84ac000}, + {0xb84b0000}, {0xb84b4000}, {0xb84b8000}, {0xb84bc000}, + {0xb84c0000}, {0xb84c4000}, {0xb84c8000}, {0xb84cc000}, + {0xb84d0000}, {0xb84d4000}, {0xb84d8000}, {0xb84dc000}, + {0xb84e0000}, {0xb84e4000}, {0xb84e8000}, {0xb84ec000}, + {0xb84f0000}, {0xb84f4000}, {0xb84f8000}, {0xb84fc000}, + {0xb8500000}, {0xb8504000}, {0xb8508000}, {0xb850c000}, + {0xb8510000}, {0xb8514000}, {0xb8518000}, {0xb851c000}, + {0xb8520000}, {0xb8524000}, {0xb8528000}, {0xb852c000}, + {0xb8530000}, {0xb8534000}, {0xb8538000}, {0xb853c000}, + {0xb8540000}, {0xb8544000}, {0xb8548000}, {0xb854c000}, + {0xb8550000}, {0xb8554000}, {0xb8558000}, {0xb855c000}, + {0xb8560000}, {0xb8564000}, {0xb8568000}, {0xb856c000}, + {0xb8570000}, {0xb8574000}, {0xb8578000}, {0xb857c000}, + {0xb8580000}, {0xb8584000}, {0xb8588000}, {0xb858c000}, + {0xb8590000}, {0xb8594000}, {0xb8598000}, {0xb859c000}, + {0xb85a0000}, {0xb85a4000}, {0xb85a8000}, {0xb85ac000}, + {0xb85b0000}, {0xb85b4000}, {0xb85b8000}, {0xb85bc000}, + {0xb85c0000}, {0xb85c4000}, {0xb85c8000}, {0xb85cc000}, + {0xb85d0000}, {0xb85d4000}, {0xb85d8000}, {0xb85dc000}, + {0xb85e0000}, {0xb85e4000}, {0xb85e8000}, {0xb85ec000}, + {0xb85f0000}, {0xb85f4000}, {0xb85f8000}, {0xb85fc000}, + {0xb8600000}, {0xb8604000}, {0xb8608000}, {0xb860c000}, + {0xb8610000}, {0xb8614000}, {0xb8618000}, {0xb861c000}, + {0xb8620000}, {0xb8624000}, {0xb8628000}, {0xb862c000}, + {0xb8630000}, {0xb8634000}, {0xb8638000}, {0xb863c000}, + {0xb8640000}, {0xb8644000}, {0xb8648000}, {0xb864c000}, + {0xb8650000}, {0xb8654000}, {0xb8658000}, {0xb865c000}, + {0xb8660000}, {0xb8664000}, {0xb8668000}, {0xb866c000}, + {0xb8670000}, {0xb8674000}, {0xb8678000}, {0xb867c000}, + {0xb8680000}, {0xb8684000}, {0xb8688000}, {0xb868c000}, + {0xb8690000}, {0xb8694000}, {0xb8698000}, {0xb869c000}, + {0xb86a0000}, {0xb86a4000}, {0xb86a8000}, {0xb86ac000}, + {0xb86b0000}, {0xb86b4000}, {0xb86b8000}, {0xb86bc000}, + {0xb86c0000}, {0xb86c4000}, {0xb86c8000}, {0xb86cc000}, + {0xb86d0000}, {0xb86d4000}, {0xb86d8000}, {0xb86dc000}, + {0xb86e0000}, {0xb86e4000}, {0xb86e8000}, {0xb86ec000}, + {0xb86f0000}, {0xb86f4000}, {0xb86f8000}, {0xb86fc000}, + {0xb8700000}, {0xb8704000}, {0xb8708000}, {0xb870c000}, + {0xb8710000}, {0xb8714000}, {0xb8718000}, {0xb871c000}, + {0xb8720000}, {0xb8724000}, {0xb8728000}, {0xb872c000}, + {0xb8730000}, {0xb8734000}, {0xb8738000}, {0xb873c000}, + {0xb8740000}, {0xb8744000}, {0xb8748000}, {0xb874c000}, + {0xb8750000}, {0xb8754000}, {0xb8758000}, {0xb875c000}, + {0xb8760000}, {0xb8764000}, {0xb8768000}, {0xb876c000}, + {0xb8770000}, {0xb8774000}, {0xb8778000}, {0xb877c000}, + {0xb8780000}, {0xb8784000}, {0xb8788000}, {0xb878c000}, + {0xb8790000}, {0xb8794000}, {0xb8798000}, {0xb879c000}, + {0xb87a0000}, {0xb87a4000}, {0xb87a8000}, {0xb87ac000}, + {0xb87b0000}, {0xb87b4000}, {0xb87b8000}, {0xb87bc000}, + {0xb87c0000}, {0xb87c4000}, {0xb87c8000}, {0xb87cc000}, + {0xb87d0000}, {0xb87d4000}, {0xb87d8000}, {0xb87dc000}, + {0xb87e0000}, {0xb87e4000}, {0xb87e8000}, {0xb87ec000}, + {0xb87f0000}, {0xb87f4000}, {0xb87f8000}, {0xb87fc000}, + {0xb8800000}, {0xb8802000}, {0xb8804000}, {0xb8806000}, + {0xb8808000}, {0xb880a000}, {0xb880c000}, {0xb880e000}, + {0xb8810000}, {0xb8812000}, {0xb8814000}, {0xb8816000}, + {0xb8818000}, {0xb881a000}, {0xb881c000}, {0xb881e000}, + {0xb8820000}, {0xb8822000}, {0xb8824000}, {0xb8826000}, + {0xb8828000}, {0xb882a000}, {0xb882c000}, {0xb882e000}, + {0xb8830000}, {0xb8832000}, {0xb8834000}, {0xb8836000}, + {0xb8838000}, {0xb883a000}, {0xb883c000}, {0xb883e000}, + {0xb8840000}, {0xb8842000}, {0xb8844000}, {0xb8846000}, + {0xb8848000}, {0xb884a000}, {0xb884c000}, {0xb884e000}, + {0xb8850000}, {0xb8852000}, {0xb8854000}, {0xb8856000}, + {0xb8858000}, {0xb885a000}, {0xb885c000}, {0xb885e000}, + {0xb8860000}, {0xb8862000}, {0xb8864000}, {0xb8866000}, + {0xb8868000}, {0xb886a000}, {0xb886c000}, {0xb886e000}, + {0xb8870000}, {0xb8872000}, {0xb8874000}, {0xb8876000}, + {0xb8878000}, {0xb887a000}, {0xb887c000}, {0xb887e000}, + {0xb8880000}, {0xb8882000}, {0xb8884000}, {0xb8886000}, + {0xb8888000}, {0xb888a000}, {0xb888c000}, {0xb888e000}, + {0xb8890000}, {0xb8892000}, {0xb8894000}, {0xb8896000}, + {0xb8898000}, {0xb889a000}, {0xb889c000}, {0xb889e000}, + {0xb88a0000}, {0xb88a2000}, {0xb88a4000}, {0xb88a6000}, + {0xb88a8000}, {0xb88aa000}, {0xb88ac000}, {0xb88ae000}, + {0xb88b0000}, {0xb88b2000}, {0xb88b4000}, {0xb88b6000}, + {0xb88b8000}, {0xb88ba000}, {0xb88bc000}, {0xb88be000}, + {0xb88c0000}, {0xb88c2000}, {0xb88c4000}, {0xb88c6000}, + {0xb88c8000}, {0xb88ca000}, {0xb88cc000}, {0xb88ce000}, + {0xb88d0000}, {0xb88d2000}, {0xb88d4000}, {0xb88d6000}, + {0xb88d8000}, {0xb88da000}, {0xb88dc000}, {0xb88de000}, + {0xb88e0000}, {0xb88e2000}, {0xb88e4000}, {0xb88e6000}, + {0xb88e8000}, {0xb88ea000}, {0xb88ec000}, {0xb88ee000}, + {0xb88f0000}, {0xb88f2000}, {0xb88f4000}, {0xb88f6000}, + {0xb88f8000}, {0xb88fa000}, {0xb88fc000}, {0xb88fe000}, + {0xb8900000}, {0xb8902000}, {0xb8904000}, {0xb8906000}, + {0xb8908000}, {0xb890a000}, {0xb890c000}, {0xb890e000}, + {0xb8910000}, {0xb8912000}, {0xb8914000}, {0xb8916000}, + {0xb8918000}, {0xb891a000}, {0xb891c000}, {0xb891e000}, + {0xb8920000}, {0xb8922000}, {0xb8924000}, {0xb8926000}, + {0xb8928000}, {0xb892a000}, {0xb892c000}, {0xb892e000}, + {0xb8930000}, {0xb8932000}, {0xb8934000}, {0xb8936000}, + {0xb8938000}, {0xb893a000}, {0xb893c000}, {0xb893e000}, + {0xb8940000}, {0xb8942000}, {0xb8944000}, {0xb8946000}, + {0xb8948000}, {0xb894a000}, {0xb894c000}, {0xb894e000}, + {0xb8950000}, {0xb8952000}, {0xb8954000}, {0xb8956000}, + {0xb8958000}, {0xb895a000}, {0xb895c000}, {0xb895e000}, + {0xb8960000}, {0xb8962000}, {0xb8964000}, {0xb8966000}, + {0xb8968000}, {0xb896a000}, {0xb896c000}, {0xb896e000}, + {0xb8970000}, {0xb8972000}, {0xb8974000}, {0xb8976000}, + {0xb8978000}, {0xb897a000}, {0xb897c000}, {0xb897e000}, + {0xb8980000}, {0xb8982000}, {0xb8984000}, {0xb8986000}, + {0xb8988000}, {0xb898a000}, {0xb898c000}, {0xb898e000}, + {0xb8990000}, {0xb8992000}, {0xb8994000}, {0xb8996000}, + {0xb8998000}, {0xb899a000}, {0xb899c000}, {0xb899e000}, + {0xb89a0000}, {0xb89a2000}, {0xb89a4000}, {0xb89a6000}, + {0xb89a8000}, {0xb89aa000}, {0xb89ac000}, {0xb89ae000}, + {0xb89b0000}, {0xb89b2000}, {0xb89b4000}, {0xb89b6000}, + {0xb89b8000}, {0xb89ba000}, {0xb89bc000}, {0xb89be000}, + {0xb89c0000}, {0xb89c2000}, {0xb89c4000}, {0xb89c6000}, + {0xb89c8000}, {0xb89ca000}, {0xb89cc000}, {0xb89ce000}, + {0xb89d0000}, {0xb89d2000}, {0xb89d4000}, {0xb89d6000}, + {0xb89d8000}, {0xb89da000}, {0xb89dc000}, {0xb89de000}, + {0xb89e0000}, {0xb89e2000}, {0xb89e4000}, {0xb89e6000}, + {0xb89e8000}, {0xb89ea000}, {0xb89ec000}, {0xb89ee000}, + {0xb89f0000}, {0xb89f2000}, {0xb89f4000}, {0xb89f6000}, + {0xb89f8000}, {0xb89fa000}, {0xb89fc000}, {0xb89fe000}, + {0xb8a00000}, {0xb8a02000}, {0xb8a04000}, {0xb8a06000}, + {0xb8a08000}, {0xb8a0a000}, {0xb8a0c000}, {0xb8a0e000}, + {0xb8a10000}, {0xb8a12000}, {0xb8a14000}, {0xb8a16000}, + {0xb8a18000}, {0xb8a1a000}, {0xb8a1c000}, {0xb8a1e000}, + {0xb8a20000}, {0xb8a22000}, {0xb8a24000}, {0xb8a26000}, + {0xb8a28000}, {0xb8a2a000}, {0xb8a2c000}, {0xb8a2e000}, + {0xb8a30000}, {0xb8a32000}, {0xb8a34000}, {0xb8a36000}, + {0xb8a38000}, {0xb8a3a000}, {0xb8a3c000}, {0xb8a3e000}, + {0xb8a40000}, {0xb8a42000}, {0xb8a44000}, {0xb8a46000}, + {0xb8a48000}, {0xb8a4a000}, {0xb8a4c000}, {0xb8a4e000}, + {0xb8a50000}, {0xb8a52000}, {0xb8a54000}, {0xb8a56000}, + {0xb8a58000}, {0xb8a5a000}, {0xb8a5c000}, {0xb8a5e000}, + {0xb8a60000}, {0xb8a62000}, {0xb8a64000}, {0xb8a66000}, + {0xb8a68000}, {0xb8a6a000}, {0xb8a6c000}, {0xb8a6e000}, + {0xb8a70000}, {0xb8a72000}, {0xb8a74000}, {0xb8a76000}, + {0xb8a78000}, {0xb8a7a000}, {0xb8a7c000}, {0xb8a7e000}, + {0xb8a80000}, {0xb8a82000}, {0xb8a84000}, {0xb8a86000}, + {0xb8a88000}, {0xb8a8a000}, {0xb8a8c000}, {0xb8a8e000}, + {0xb8a90000}, {0xb8a92000}, {0xb8a94000}, {0xb8a96000}, + {0xb8a98000}, {0xb8a9a000}, {0xb8a9c000}, {0xb8a9e000}, + {0xb8aa0000}, {0xb8aa2000}, {0xb8aa4000}, {0xb8aa6000}, + {0xb8aa8000}, {0xb8aaa000}, {0xb8aac000}, {0xb8aae000}, + {0xb8ab0000}, {0xb8ab2000}, {0xb8ab4000}, {0xb8ab6000}, + {0xb8ab8000}, {0xb8aba000}, {0xb8abc000}, {0xb8abe000}, + {0xb8ac0000}, {0xb8ac2000}, {0xb8ac4000}, {0xb8ac6000}, + {0xb8ac8000}, {0xb8aca000}, {0xb8acc000}, {0xb8ace000}, + {0xb8ad0000}, {0xb8ad2000}, {0xb8ad4000}, {0xb8ad6000}, + {0xb8ad8000}, {0xb8ada000}, {0xb8adc000}, {0xb8ade000}, + {0xb8ae0000}, {0xb8ae2000}, {0xb8ae4000}, {0xb8ae6000}, + {0xb8ae8000}, {0xb8aea000}, {0xb8aec000}, {0xb8aee000}, + {0xb8af0000}, {0xb8af2000}, {0xb8af4000}, {0xb8af6000}, + {0xb8af8000}, {0xb8afa000}, {0xb8afc000}, {0xb8afe000}, + {0xb8b00000}, {0xb8b02000}, {0xb8b04000}, {0xb8b06000}, + {0xb8b08000}, {0xb8b0a000}, {0xb8b0c000}, {0xb8b0e000}, + {0xb8b10000}, {0xb8b12000}, {0xb8b14000}, {0xb8b16000}, + {0xb8b18000}, {0xb8b1a000}, {0xb8b1c000}, {0xb8b1e000}, + {0xb8b20000}, {0xb8b22000}, {0xb8b24000}, {0xb8b26000}, + {0xb8b28000}, {0xb8b2a000}, {0xb8b2c000}, {0xb8b2e000}, + {0xb8b30000}, {0xb8b32000}, {0xb8b34000}, {0xb8b36000}, + {0xb8b38000}, {0xb8b3a000}, {0xb8b3c000}, {0xb8b3e000}, + {0xb8b40000}, {0xb8b42000}, {0xb8b44000}, {0xb8b46000}, + {0xb8b48000}, {0xb8b4a000}, {0xb8b4c000}, {0xb8b4e000}, + {0xb8b50000}, {0xb8b52000}, {0xb8b54000}, {0xb8b56000}, + {0xb8b58000}, {0xb8b5a000}, {0xb8b5c000}, {0xb8b5e000}, + {0xb8b60000}, {0xb8b62000}, {0xb8b64000}, {0xb8b66000}, + {0xb8b68000}, {0xb8b6a000}, {0xb8b6c000}, {0xb8b6e000}, + {0xb8b70000}, {0xb8b72000}, {0xb8b74000}, {0xb8b76000}, + {0xb8b78000}, {0xb8b7a000}, {0xb8b7c000}, {0xb8b7e000}, + {0xb8b80000}, {0xb8b82000}, {0xb8b84000}, {0xb8b86000}, + {0xb8b88000}, {0xb8b8a000}, {0xb8b8c000}, {0xb8b8e000}, + {0xb8b90000}, {0xb8b92000}, {0xb8b94000}, {0xb8b96000}, + {0xb8b98000}, {0xb8b9a000}, {0xb8b9c000}, {0xb8b9e000}, + {0xb8ba0000}, {0xb8ba2000}, {0xb8ba4000}, {0xb8ba6000}, + {0xb8ba8000}, {0xb8baa000}, {0xb8bac000}, {0xb8bae000}, + {0xb8bb0000}, {0xb8bb2000}, {0xb8bb4000}, {0xb8bb6000}, + {0xb8bb8000}, {0xb8bba000}, {0xb8bbc000}, {0xb8bbe000}, + {0xb8bc0000}, {0xb8bc2000}, {0xb8bc4000}, {0xb8bc6000}, + {0xb8bc8000}, {0xb8bca000}, {0xb8bcc000}, {0xb8bce000}, + {0xb8bd0000}, {0xb8bd2000}, {0xb8bd4000}, {0xb8bd6000}, + {0xb8bd8000}, {0xb8bda000}, {0xb8bdc000}, {0xb8bde000}, + {0xb8be0000}, {0xb8be2000}, {0xb8be4000}, {0xb8be6000}, + {0xb8be8000}, {0xb8bea000}, {0xb8bec000}, {0xb8bee000}, + {0xb8bf0000}, {0xb8bf2000}, {0xb8bf4000}, {0xb8bf6000}, + {0xb8bf8000}, {0xb8bfa000}, {0xb8bfc000}, {0xb8bfe000}, + {0xb8c00000}, {0xb8c02000}, {0xb8c04000}, {0xb8c06000}, + {0xb8c08000}, {0xb8c0a000}, {0xb8c0c000}, {0xb8c0e000}, + {0xb8c10000}, {0xb8c12000}, {0xb8c14000}, {0xb8c16000}, + {0xb8c18000}, {0xb8c1a000}, {0xb8c1c000}, {0xb8c1e000}, + {0xb8c20000}, {0xb8c22000}, {0xb8c24000}, {0xb8c26000}, + {0xb8c28000}, {0xb8c2a000}, {0xb8c2c000}, {0xb8c2e000}, + {0xb8c30000}, {0xb8c32000}, {0xb8c34000}, {0xb8c36000}, + {0xb8c38000}, {0xb8c3a000}, {0xb8c3c000}, {0xb8c3e000}, + {0xb8c40000}, {0xb8c42000}, {0xb8c44000}, {0xb8c46000}, + {0xb8c48000}, {0xb8c4a000}, {0xb8c4c000}, {0xb8c4e000}, + {0xb8c50000}, {0xb8c52000}, {0xb8c54000}, {0xb8c56000}, + {0xb8c58000}, {0xb8c5a000}, {0xb8c5c000}, {0xb8c5e000}, + {0xb8c60000}, {0xb8c62000}, {0xb8c64000}, {0xb8c66000}, + {0xb8c68000}, {0xb8c6a000}, {0xb8c6c000}, {0xb8c6e000}, + {0xb8c70000}, {0xb8c72000}, {0xb8c74000}, {0xb8c76000}, + {0xb8c78000}, {0xb8c7a000}, {0xb8c7c000}, {0xb8c7e000}, + {0xb8c80000}, {0xb8c82000}, {0xb8c84000}, {0xb8c86000}, + {0xb8c88000}, {0xb8c8a000}, {0xb8c8c000}, {0xb8c8e000}, + {0xb8c90000}, {0xb8c92000}, {0xb8c94000}, {0xb8c96000}, + {0xb8c98000}, {0xb8c9a000}, {0xb8c9c000}, {0xb8c9e000}, + {0xb8ca0000}, {0xb8ca2000}, {0xb8ca4000}, {0xb8ca6000}, + {0xb8ca8000}, {0xb8caa000}, {0xb8cac000}, {0xb8cae000}, + {0xb8cb0000}, {0xb8cb2000}, {0xb8cb4000}, {0xb8cb6000}, + {0xb8cb8000}, {0xb8cba000}, {0xb8cbc000}, {0xb8cbe000}, + {0xb8cc0000}, {0xb8cc2000}, {0xb8cc4000}, {0xb8cc6000}, + {0xb8cc8000}, {0xb8cca000}, {0xb8ccc000}, {0xb8cce000}, + {0xb8cd0000}, {0xb8cd2000}, {0xb8cd4000}, {0xb8cd6000}, + {0xb8cd8000}, {0xb8cda000}, {0xb8cdc000}, {0xb8cde000}, + {0xb8ce0000}, {0xb8ce2000}, {0xb8ce4000}, {0xb8ce6000}, + {0xb8ce8000}, {0xb8cea000}, {0xb8cec000}, {0xb8cee000}, + {0xb8cf0000}, {0xb8cf2000}, {0xb8cf4000}, {0xb8cf6000}, + {0xb8cf8000}, {0xb8cfa000}, {0xb8cfc000}, {0xb8cfe000}, + {0xb8d00000}, {0xb8d02000}, {0xb8d04000}, {0xb8d06000}, + {0xb8d08000}, {0xb8d0a000}, {0xb8d0c000}, {0xb8d0e000}, + {0xb8d10000}, {0xb8d12000}, {0xb8d14000}, {0xb8d16000}, + {0xb8d18000}, {0xb8d1a000}, {0xb8d1c000}, {0xb8d1e000}, + {0xb8d20000}, {0xb8d22000}, {0xb8d24000}, {0xb8d26000}, + {0xb8d28000}, {0xb8d2a000}, {0xb8d2c000}, {0xb8d2e000}, + {0xb8d30000}, {0xb8d32000}, {0xb8d34000}, {0xb8d36000}, + {0xb8d38000}, {0xb8d3a000}, {0xb8d3c000}, {0xb8d3e000}, + {0xb8d40000}, {0xb8d42000}, {0xb8d44000}, {0xb8d46000}, + {0xb8d48000}, {0xb8d4a000}, {0xb8d4c000}, {0xb8d4e000}, + {0xb8d50000}, {0xb8d52000}, {0xb8d54000}, {0xb8d56000}, + {0xb8d58000}, {0xb8d5a000}, {0xb8d5c000}, {0xb8d5e000}, + {0xb8d60000}, {0xb8d62000}, {0xb8d64000}, {0xb8d66000}, + {0xb8d68000}, {0xb8d6a000}, {0xb8d6c000}, {0xb8d6e000}, + {0xb8d70000}, {0xb8d72000}, {0xb8d74000}, {0xb8d76000}, + {0xb8d78000}, {0xb8d7a000}, {0xb8d7c000}, {0xb8d7e000}, + {0xb8d80000}, {0xb8d82000}, {0xb8d84000}, {0xb8d86000}, + {0xb8d88000}, {0xb8d8a000}, {0xb8d8c000}, {0xb8d8e000}, + {0xb8d90000}, {0xb8d92000}, {0xb8d94000}, {0xb8d96000}, + {0xb8d98000}, {0xb8d9a000}, {0xb8d9c000}, {0xb8d9e000}, + {0xb8da0000}, {0xb8da2000}, {0xb8da4000}, {0xb8da6000}, + {0xb8da8000}, {0xb8daa000}, {0xb8dac000}, {0xb8dae000}, + {0xb8db0000}, {0xb8db2000}, {0xb8db4000}, {0xb8db6000}, + {0xb8db8000}, {0xb8dba000}, {0xb8dbc000}, {0xb8dbe000}, + {0xb8dc0000}, {0xb8dc2000}, {0xb8dc4000}, {0xb8dc6000}, + {0xb8dc8000}, {0xb8dca000}, {0xb8dcc000}, {0xb8dce000}, + {0xb8dd0000}, {0xb8dd2000}, {0xb8dd4000}, {0xb8dd6000}, + {0xb8dd8000}, {0xb8dda000}, {0xb8ddc000}, {0xb8dde000}, + {0xb8de0000}, {0xb8de2000}, {0xb8de4000}, {0xb8de6000}, + {0xb8de8000}, {0xb8dea000}, {0xb8dec000}, {0xb8dee000}, + {0xb8df0000}, {0xb8df2000}, {0xb8df4000}, {0xb8df6000}, + {0xb8df8000}, {0xb8dfa000}, {0xb8dfc000}, {0xb8dfe000}, + {0xb8e00000}, {0xb8e02000}, {0xb8e04000}, {0xb8e06000}, + {0xb8e08000}, {0xb8e0a000}, {0xb8e0c000}, {0xb8e0e000}, + {0xb8e10000}, {0xb8e12000}, {0xb8e14000}, {0xb8e16000}, + {0xb8e18000}, {0xb8e1a000}, {0xb8e1c000}, {0xb8e1e000}, + {0xb8e20000}, {0xb8e22000}, {0xb8e24000}, {0xb8e26000}, + {0xb8e28000}, {0xb8e2a000}, {0xb8e2c000}, {0xb8e2e000}, + {0xb8e30000}, {0xb8e32000}, {0xb8e34000}, {0xb8e36000}, + {0xb8e38000}, {0xb8e3a000}, {0xb8e3c000}, {0xb8e3e000}, + {0xb8e40000}, {0xb8e42000}, {0xb8e44000}, {0xb8e46000}, + {0xb8e48000}, {0xb8e4a000}, {0xb8e4c000}, {0xb8e4e000}, + {0xb8e50000}, {0xb8e52000}, {0xb8e54000}, {0xb8e56000}, + {0xb8e58000}, {0xb8e5a000}, {0xb8e5c000}, {0xb8e5e000}, + {0xb8e60000}, {0xb8e62000}, {0xb8e64000}, {0xb8e66000}, + {0xb8e68000}, {0xb8e6a000}, {0xb8e6c000}, {0xb8e6e000}, + {0xb8e70000}, {0xb8e72000}, {0xb8e74000}, {0xb8e76000}, + {0xb8e78000}, {0xb8e7a000}, {0xb8e7c000}, {0xb8e7e000}, + {0xb8e80000}, {0xb8e82000}, {0xb8e84000}, {0xb8e86000}, + {0xb8e88000}, {0xb8e8a000}, {0xb8e8c000}, {0xb8e8e000}, + {0xb8e90000}, {0xb8e92000}, {0xb8e94000}, {0xb8e96000}, + {0xb8e98000}, {0xb8e9a000}, {0xb8e9c000}, {0xb8e9e000}, + {0xb8ea0000}, {0xb8ea2000}, {0xb8ea4000}, {0xb8ea6000}, + {0xb8ea8000}, {0xb8eaa000}, {0xb8eac000}, {0xb8eae000}, + {0xb8eb0000}, {0xb8eb2000}, {0xb8eb4000}, {0xb8eb6000}, + {0xb8eb8000}, {0xb8eba000}, {0xb8ebc000}, {0xb8ebe000}, + {0xb8ec0000}, {0xb8ec2000}, {0xb8ec4000}, {0xb8ec6000}, + {0xb8ec8000}, {0xb8eca000}, {0xb8ecc000}, {0xb8ece000}, + {0xb8ed0000}, {0xb8ed2000}, {0xb8ed4000}, {0xb8ed6000}, + {0xb8ed8000}, {0xb8eda000}, {0xb8edc000}, {0xb8ede000}, + {0xb8ee0000}, {0xb8ee2000}, {0xb8ee4000}, {0xb8ee6000}, + {0xb8ee8000}, {0xb8eea000}, {0xb8eec000}, {0xb8eee000}, + {0xb8ef0000}, {0xb8ef2000}, {0xb8ef4000}, {0xb8ef6000}, + {0xb8ef8000}, {0xb8efa000}, {0xb8efc000}, {0xb8efe000}, + {0xb8f00000}, {0xb8f02000}, {0xb8f04000}, {0xb8f06000}, + {0xb8f08000}, {0xb8f0a000}, {0xb8f0c000}, {0xb8f0e000}, + {0xb8f10000}, {0xb8f12000}, {0xb8f14000}, {0xb8f16000}, + {0xb8f18000}, {0xb8f1a000}, {0xb8f1c000}, {0xb8f1e000}, + {0xb8f20000}, {0xb8f22000}, {0xb8f24000}, {0xb8f26000}, + {0xb8f28000}, {0xb8f2a000}, {0xb8f2c000}, {0xb8f2e000}, + {0xb8f30000}, {0xb8f32000}, {0xb8f34000}, {0xb8f36000}, + {0xb8f38000}, {0xb8f3a000}, {0xb8f3c000}, {0xb8f3e000}, + {0xb8f40000}, {0xb8f42000}, {0xb8f44000}, {0xb8f46000}, + {0xb8f48000}, {0xb8f4a000}, {0xb8f4c000}, {0xb8f4e000}, + {0xb8f50000}, {0xb8f52000}, {0xb8f54000}, {0xb8f56000}, + {0xb8f58000}, {0xb8f5a000}, {0xb8f5c000}, {0xb8f5e000}, + {0xb8f60000}, {0xb8f62000}, {0xb8f64000}, {0xb8f66000}, + {0xb8f68000}, {0xb8f6a000}, {0xb8f6c000}, {0xb8f6e000}, + {0xb8f70000}, {0xb8f72000}, {0xb8f74000}, {0xb8f76000}, + {0xb8f78000}, {0xb8f7a000}, {0xb8f7c000}, {0xb8f7e000}, + {0xb8f80000}, {0xb8f82000}, {0xb8f84000}, {0xb8f86000}, + {0xb8f88000}, {0xb8f8a000}, {0xb8f8c000}, {0xb8f8e000}, + {0xb8f90000}, {0xb8f92000}, {0xb8f94000}, {0xb8f96000}, + {0xb8f98000}, {0xb8f9a000}, {0xb8f9c000}, {0xb8f9e000}, + {0xb8fa0000}, {0xb8fa2000}, {0xb8fa4000}, {0xb8fa6000}, + {0xb8fa8000}, {0xb8faa000}, {0xb8fac000}, {0xb8fae000}, + {0xb8fb0000}, {0xb8fb2000}, {0xb8fb4000}, {0xb8fb6000}, + {0xb8fb8000}, {0xb8fba000}, {0xb8fbc000}, {0xb8fbe000}, + {0xb8fc0000}, {0xb8fc2000}, {0xb8fc4000}, {0xb8fc6000}, + {0xb8fc8000}, {0xb8fca000}, {0xb8fcc000}, {0xb8fce000}, + {0xb8fd0000}, {0xb8fd2000}, {0xb8fd4000}, {0xb8fd6000}, + {0xb8fd8000}, {0xb8fda000}, {0xb8fdc000}, {0xb8fde000}, + {0xb8fe0000}, {0xb8fe2000}, {0xb8fe4000}, {0xb8fe6000}, + {0xb8fe8000}, {0xb8fea000}, {0xb8fec000}, {0xb8fee000}, + {0xb8ff0000}, {0xb8ff2000}, {0xb8ff4000}, {0xb8ff6000}, + {0xb8ff8000}, {0xb8ffa000}, {0xb8ffc000}, {0xb8ffe000}, + {0xb9000000}, {0xb9002000}, {0xb9004000}, {0xb9006000}, + {0xb9008000}, {0xb900a000}, {0xb900c000}, {0xb900e000}, + {0xb9010000}, {0xb9012000}, {0xb9014000}, {0xb9016000}, + {0xb9018000}, {0xb901a000}, {0xb901c000}, {0xb901e000}, + {0xb9020000}, {0xb9022000}, {0xb9024000}, {0xb9026000}, + {0xb9028000}, {0xb902a000}, {0xb902c000}, {0xb902e000}, + {0xb9030000}, {0xb9032000}, {0xb9034000}, {0xb9036000}, + {0xb9038000}, {0xb903a000}, {0xb903c000}, {0xb903e000}, + {0xb9040000}, {0xb9042000}, {0xb9044000}, {0xb9046000}, + {0xb9048000}, {0xb904a000}, {0xb904c000}, {0xb904e000}, + {0xb9050000}, {0xb9052000}, {0xb9054000}, {0xb9056000}, + {0xb9058000}, {0xb905a000}, {0xb905c000}, {0xb905e000}, + {0xb9060000}, {0xb9062000}, {0xb9064000}, {0xb9066000}, + {0xb9068000}, {0xb906a000}, {0xb906c000}, {0xb906e000}, + {0xb9070000}, {0xb9072000}, {0xb9074000}, {0xb9076000}, + {0xb9078000}, {0xb907a000}, {0xb907c000}, {0xb907e000}, + {0xb9080000}, {0xb9082000}, {0xb9084000}, {0xb9086000}, + {0xb9088000}, {0xb908a000}, {0xb908c000}, {0xb908e000}, + {0xb9090000}, {0xb9092000}, {0xb9094000}, {0xb9096000}, + {0xb9098000}, {0xb909a000}, {0xb909c000}, {0xb909e000}, + {0xb90a0000}, {0xb90a2000}, {0xb90a4000}, {0xb90a6000}, + {0xb90a8000}, {0xb90aa000}, {0xb90ac000}, {0xb90ae000}, + {0xb90b0000}, {0xb90b2000}, {0xb90b4000}, {0xb90b6000}, + {0xb90b8000}, {0xb90ba000}, {0xb90bc000}, {0xb90be000}, + {0xb90c0000}, {0xb90c2000}, {0xb90c4000}, {0xb90c6000}, + {0xb90c8000}, {0xb90ca000}, {0xb90cc000}, {0xb90ce000}, + {0xb90d0000}, {0xb90d2000}, {0xb90d4000}, {0xb90d6000}, + {0xb90d8000}, {0xb90da000}, {0xb90dc000}, {0xb90de000}, + {0xb90e0000}, {0xb90e2000}, {0xb90e4000}, {0xb90e6000}, + {0xb90e8000}, {0xb90ea000}, {0xb90ec000}, {0xb90ee000}, + {0xb90f0000}, {0xb90f2000}, {0xb90f4000}, {0xb90f6000}, + {0xb90f8000}, {0xb90fa000}, {0xb90fc000}, {0xb90fe000}, + {0xb9100000}, {0xb9102000}, {0xb9104000}, {0xb9106000}, + {0xb9108000}, {0xb910a000}, {0xb910c000}, {0xb910e000}, + {0xb9110000}, {0xb9112000}, {0xb9114000}, {0xb9116000}, + {0xb9118000}, {0xb911a000}, {0xb911c000}, {0xb911e000}, + {0xb9120000}, {0xb9122000}, {0xb9124000}, {0xb9126000}, + {0xb9128000}, {0xb912a000}, {0xb912c000}, {0xb912e000}, + {0xb9130000}, {0xb9132000}, {0xb9134000}, {0xb9136000}, + {0xb9138000}, {0xb913a000}, {0xb913c000}, {0xb913e000}, + {0xb9140000}, {0xb9142000}, {0xb9144000}, {0xb9146000}, + {0xb9148000}, {0xb914a000}, {0xb914c000}, {0xb914e000}, + {0xb9150000}, {0xb9152000}, {0xb9154000}, {0xb9156000}, + {0xb9158000}, {0xb915a000}, {0xb915c000}, {0xb915e000}, + {0xb9160000}, {0xb9162000}, {0xb9164000}, {0xb9166000}, + {0xb9168000}, {0xb916a000}, {0xb916c000}, {0xb916e000}, + {0xb9170000}, {0xb9172000}, {0xb9174000}, {0xb9176000}, + {0xb9178000}, {0xb917a000}, {0xb917c000}, {0xb917e000}, + {0xb9180000}, {0xb9182000}, {0xb9184000}, {0xb9186000}, + {0xb9188000}, {0xb918a000}, {0xb918c000}, {0xb918e000}, + {0xb9190000}, {0xb9192000}, {0xb9194000}, {0xb9196000}, + {0xb9198000}, {0xb919a000}, {0xb919c000}, {0xb919e000}, + {0xb91a0000}, {0xb91a2000}, {0xb91a4000}, {0xb91a6000}, + {0xb91a8000}, {0xb91aa000}, {0xb91ac000}, {0xb91ae000}, + {0xb91b0000}, {0xb91b2000}, {0xb91b4000}, {0xb91b6000}, + {0xb91b8000}, {0xb91ba000}, {0xb91bc000}, {0xb91be000}, + {0xb91c0000}, {0xb91c2000}, {0xb91c4000}, {0xb91c6000}, + {0xb91c8000}, {0xb91ca000}, {0xb91cc000}, {0xb91ce000}, + {0xb91d0000}, {0xb91d2000}, {0xb91d4000}, {0xb91d6000}, + {0xb91d8000}, {0xb91da000}, {0xb91dc000}, {0xb91de000}, + {0xb91e0000}, {0xb91e2000}, {0xb91e4000}, {0xb91e6000}, + {0xb91e8000}, {0xb91ea000}, {0xb91ec000}, {0xb91ee000}, + {0xb91f0000}, {0xb91f2000}, {0xb91f4000}, {0xb91f6000}, + {0xb91f8000}, {0xb91fa000}, {0xb91fc000}, {0xb91fe000}, + {0xb9200000}, {0xb9202000}, {0xb9204000}, {0xb9206000}, + {0xb9208000}, {0xb920a000}, {0xb920c000}, {0xb920e000}, + {0xb9210000}, {0xb9212000}, {0xb9214000}, {0xb9216000}, + {0xb9218000}, {0xb921a000}, {0xb921c000}, {0xb921e000}, + {0xb9220000}, {0xb9222000}, {0xb9224000}, {0xb9226000}, + {0xb9228000}, {0xb922a000}, {0xb922c000}, {0xb922e000}, + {0xb9230000}, {0xb9232000}, {0xb9234000}, {0xb9236000}, + {0xb9238000}, {0xb923a000}, {0xb923c000}, {0xb923e000}, + {0xb9240000}, {0xb9242000}, {0xb9244000}, {0xb9246000}, + {0xb9248000}, {0xb924a000}, {0xb924c000}, {0xb924e000}, + {0xb9250000}, {0xb9252000}, {0xb9254000}, {0xb9256000}, + {0xb9258000}, {0xb925a000}, {0xb925c000}, {0xb925e000}, + {0xb9260000}, {0xb9262000}, {0xb9264000}, {0xb9266000}, + {0xb9268000}, {0xb926a000}, {0xb926c000}, {0xb926e000}, + {0xb9270000}, {0xb9272000}, {0xb9274000}, {0xb9276000}, + {0xb9278000}, {0xb927a000}, {0xb927c000}, {0xb927e000}, + {0xb9280000}, {0xb9282000}, {0xb9284000}, {0xb9286000}, + {0xb9288000}, {0xb928a000}, {0xb928c000}, {0xb928e000}, + {0xb9290000}, {0xb9292000}, {0xb9294000}, {0xb9296000}, + {0xb9298000}, {0xb929a000}, {0xb929c000}, {0xb929e000}, + {0xb92a0000}, {0xb92a2000}, {0xb92a4000}, {0xb92a6000}, + {0xb92a8000}, {0xb92aa000}, {0xb92ac000}, {0xb92ae000}, + {0xb92b0000}, {0xb92b2000}, {0xb92b4000}, {0xb92b6000}, + {0xb92b8000}, {0xb92ba000}, {0xb92bc000}, {0xb92be000}, + {0xb92c0000}, {0xb92c2000}, {0xb92c4000}, {0xb92c6000}, + {0xb92c8000}, {0xb92ca000}, {0xb92cc000}, {0xb92ce000}, + {0xb92d0000}, {0xb92d2000}, {0xb92d4000}, {0xb92d6000}, + {0xb92d8000}, {0xb92da000}, {0xb92dc000}, {0xb92de000}, + {0xb92e0000}, {0xb92e2000}, {0xb92e4000}, {0xb92e6000}, + {0xb92e8000}, {0xb92ea000}, {0xb92ec000}, {0xb92ee000}, + {0xb92f0000}, {0xb92f2000}, {0xb92f4000}, {0xb92f6000}, + {0xb92f8000}, {0xb92fa000}, {0xb92fc000}, {0xb92fe000}, + {0xb9300000}, {0xb9302000}, {0xb9304000}, {0xb9306000}, + {0xb9308000}, {0xb930a000}, {0xb930c000}, {0xb930e000}, + {0xb9310000}, {0xb9312000}, {0xb9314000}, {0xb9316000}, + {0xb9318000}, {0xb931a000}, {0xb931c000}, {0xb931e000}, + {0xb9320000}, {0xb9322000}, {0xb9324000}, {0xb9326000}, + {0xb9328000}, {0xb932a000}, {0xb932c000}, {0xb932e000}, + {0xb9330000}, {0xb9332000}, {0xb9334000}, {0xb9336000}, + {0xb9338000}, {0xb933a000}, {0xb933c000}, {0xb933e000}, + {0xb9340000}, {0xb9342000}, {0xb9344000}, {0xb9346000}, + {0xb9348000}, {0xb934a000}, {0xb934c000}, {0xb934e000}, + {0xb9350000}, {0xb9352000}, {0xb9354000}, {0xb9356000}, + {0xb9358000}, {0xb935a000}, {0xb935c000}, {0xb935e000}, + {0xb9360000}, {0xb9362000}, {0xb9364000}, {0xb9366000}, + {0xb9368000}, {0xb936a000}, {0xb936c000}, {0xb936e000}, + {0xb9370000}, {0xb9372000}, {0xb9374000}, {0xb9376000}, + {0xb9378000}, {0xb937a000}, {0xb937c000}, {0xb937e000}, + {0xb9380000}, {0xb9382000}, {0xb9384000}, {0xb9386000}, + {0xb9388000}, {0xb938a000}, {0xb938c000}, {0xb938e000}, + {0xb9390000}, {0xb9392000}, {0xb9394000}, {0xb9396000}, + {0xb9398000}, {0xb939a000}, {0xb939c000}, {0xb939e000}, + {0xb93a0000}, {0xb93a2000}, {0xb93a4000}, {0xb93a6000}, + {0xb93a8000}, {0xb93aa000}, {0xb93ac000}, {0xb93ae000}, + {0xb93b0000}, {0xb93b2000}, {0xb93b4000}, {0xb93b6000}, + {0xb93b8000}, {0xb93ba000}, {0xb93bc000}, {0xb93be000}, + {0xb93c0000}, {0xb93c2000}, {0xb93c4000}, {0xb93c6000}, + {0xb93c8000}, {0xb93ca000}, {0xb93cc000}, {0xb93ce000}, + {0xb93d0000}, {0xb93d2000}, {0xb93d4000}, {0xb93d6000}, + {0xb93d8000}, {0xb93da000}, {0xb93dc000}, {0xb93de000}, + {0xb93e0000}, {0xb93e2000}, {0xb93e4000}, {0xb93e6000}, + {0xb93e8000}, {0xb93ea000}, {0xb93ec000}, {0xb93ee000}, + {0xb93f0000}, {0xb93f2000}, {0xb93f4000}, {0xb93f6000}, + {0xb93f8000}, {0xb93fa000}, {0xb93fc000}, {0xb93fe000}, + {0xb9400000}, {0xb9402000}, {0xb9404000}, {0xb9406000}, + {0xb9408000}, {0xb940a000}, {0xb940c000}, {0xb940e000}, + {0xb9410000}, {0xb9412000}, {0xb9414000}, {0xb9416000}, + {0xb9418000}, {0xb941a000}, {0xb941c000}, {0xb941e000}, + {0xb9420000}, {0xb9422000}, {0xb9424000}, {0xb9426000}, + {0xb9428000}, {0xb942a000}, {0xb942c000}, {0xb942e000}, + {0xb9430000}, {0xb9432000}, {0xb9434000}, {0xb9436000}, + {0xb9438000}, {0xb943a000}, {0xb943c000}, {0xb943e000}, + {0xb9440000}, {0xb9442000}, {0xb9444000}, {0xb9446000}, + {0xb9448000}, {0xb944a000}, {0xb944c000}, {0xb944e000}, + {0xb9450000}, {0xb9452000}, {0xb9454000}, {0xb9456000}, + {0xb9458000}, {0xb945a000}, {0xb945c000}, {0xb945e000}, + {0xb9460000}, {0xb9462000}, {0xb9464000}, {0xb9466000}, + {0xb9468000}, {0xb946a000}, {0xb946c000}, {0xb946e000}, + {0xb9470000}, {0xb9472000}, {0xb9474000}, {0xb9476000}, + {0xb9478000}, {0xb947a000}, {0xb947c000}, {0xb947e000}, + {0xb9480000}, {0xb9482000}, {0xb9484000}, {0xb9486000}, + {0xb9488000}, {0xb948a000}, {0xb948c000}, {0xb948e000}, + {0xb9490000}, {0xb9492000}, {0xb9494000}, {0xb9496000}, + {0xb9498000}, {0xb949a000}, {0xb949c000}, {0xb949e000}, + {0xb94a0000}, {0xb94a2000}, {0xb94a4000}, {0xb94a6000}, + {0xb94a8000}, {0xb94aa000}, {0xb94ac000}, {0xb94ae000}, + {0xb94b0000}, {0xb94b2000}, {0xb94b4000}, {0xb94b6000}, + {0xb94b8000}, {0xb94ba000}, {0xb94bc000}, {0xb94be000}, + {0xb94c0000}, {0xb94c2000}, {0xb94c4000}, {0xb94c6000}, + {0xb94c8000}, {0xb94ca000}, {0xb94cc000}, {0xb94ce000}, + {0xb94d0000}, {0xb94d2000}, {0xb94d4000}, {0xb94d6000}, + {0xb94d8000}, {0xb94da000}, {0xb94dc000}, {0xb94de000}, + {0xb94e0000}, {0xb94e2000}, {0xb94e4000}, {0xb94e6000}, + {0xb94e8000}, {0xb94ea000}, {0xb94ec000}, {0xb94ee000}, + {0xb94f0000}, {0xb94f2000}, {0xb94f4000}, {0xb94f6000}, + {0xb94f8000}, {0xb94fa000}, {0xb94fc000}, {0xb94fe000}, + {0xb9500000}, {0xb9502000}, {0xb9504000}, {0xb9506000}, + {0xb9508000}, {0xb950a000}, {0xb950c000}, {0xb950e000}, + {0xb9510000}, {0xb9512000}, {0xb9514000}, {0xb9516000}, + {0xb9518000}, {0xb951a000}, {0xb951c000}, {0xb951e000}, + {0xb9520000}, {0xb9522000}, {0xb9524000}, {0xb9526000}, + {0xb9528000}, {0xb952a000}, {0xb952c000}, {0xb952e000}, + {0xb9530000}, {0xb9532000}, {0xb9534000}, {0xb9536000}, + {0xb9538000}, {0xb953a000}, {0xb953c000}, {0xb953e000}, + {0xb9540000}, {0xb9542000}, {0xb9544000}, {0xb9546000}, + {0xb9548000}, {0xb954a000}, {0xb954c000}, {0xb954e000}, + {0xb9550000}, {0xb9552000}, {0xb9554000}, {0xb9556000}, + {0xb9558000}, {0xb955a000}, {0xb955c000}, {0xb955e000}, + {0xb9560000}, {0xb9562000}, {0xb9564000}, {0xb9566000}, + {0xb9568000}, {0xb956a000}, {0xb956c000}, {0xb956e000}, + {0xb9570000}, {0xb9572000}, {0xb9574000}, {0xb9576000}, + {0xb9578000}, {0xb957a000}, {0xb957c000}, {0xb957e000}, + {0xb9580000}, {0xb9582000}, {0xb9584000}, {0xb9586000}, + {0xb9588000}, {0xb958a000}, {0xb958c000}, {0xb958e000}, + {0xb9590000}, {0xb9592000}, {0xb9594000}, {0xb9596000}, + {0xb9598000}, {0xb959a000}, {0xb959c000}, {0xb959e000}, + {0xb95a0000}, {0xb95a2000}, {0xb95a4000}, {0xb95a6000}, + {0xb95a8000}, {0xb95aa000}, {0xb95ac000}, {0xb95ae000}, + {0xb95b0000}, {0xb95b2000}, {0xb95b4000}, {0xb95b6000}, + {0xb95b8000}, {0xb95ba000}, {0xb95bc000}, {0xb95be000}, + {0xb95c0000}, {0xb95c2000}, {0xb95c4000}, {0xb95c6000}, + {0xb95c8000}, {0xb95ca000}, {0xb95cc000}, {0xb95ce000}, + {0xb95d0000}, {0xb95d2000}, {0xb95d4000}, {0xb95d6000}, + {0xb95d8000}, {0xb95da000}, {0xb95dc000}, {0xb95de000}, + {0xb95e0000}, {0xb95e2000}, {0xb95e4000}, {0xb95e6000}, + {0xb95e8000}, {0xb95ea000}, {0xb95ec000}, {0xb95ee000}, + {0xb95f0000}, {0xb95f2000}, {0xb95f4000}, {0xb95f6000}, + {0xb95f8000}, {0xb95fa000}, {0xb95fc000}, {0xb95fe000}, + {0xb9600000}, {0xb9602000}, {0xb9604000}, {0xb9606000}, + {0xb9608000}, {0xb960a000}, {0xb960c000}, {0xb960e000}, + {0xb9610000}, {0xb9612000}, {0xb9614000}, {0xb9616000}, + {0xb9618000}, {0xb961a000}, {0xb961c000}, {0xb961e000}, + {0xb9620000}, {0xb9622000}, {0xb9624000}, {0xb9626000}, + {0xb9628000}, {0xb962a000}, {0xb962c000}, {0xb962e000}, + {0xb9630000}, {0xb9632000}, {0xb9634000}, {0xb9636000}, + {0xb9638000}, {0xb963a000}, {0xb963c000}, {0xb963e000}, + {0xb9640000}, {0xb9642000}, {0xb9644000}, {0xb9646000}, + {0xb9648000}, {0xb964a000}, {0xb964c000}, {0xb964e000}, + {0xb9650000}, {0xb9652000}, {0xb9654000}, {0xb9656000}, + {0xb9658000}, {0xb965a000}, {0xb965c000}, {0xb965e000}, + {0xb9660000}, {0xb9662000}, {0xb9664000}, {0xb9666000}, + {0xb9668000}, {0xb966a000}, {0xb966c000}, {0xb966e000}, + {0xb9670000}, {0xb9672000}, {0xb9674000}, {0xb9676000}, + {0xb9678000}, {0xb967a000}, {0xb967c000}, {0xb967e000}, + {0xb9680000}, {0xb9682000}, {0xb9684000}, {0xb9686000}, + {0xb9688000}, {0xb968a000}, {0xb968c000}, {0xb968e000}, + {0xb9690000}, {0xb9692000}, {0xb9694000}, {0xb9696000}, + {0xb9698000}, {0xb969a000}, {0xb969c000}, {0xb969e000}, + {0xb96a0000}, {0xb96a2000}, {0xb96a4000}, {0xb96a6000}, + {0xb96a8000}, {0xb96aa000}, {0xb96ac000}, {0xb96ae000}, + {0xb96b0000}, {0xb96b2000}, {0xb96b4000}, {0xb96b6000}, + {0xb96b8000}, {0xb96ba000}, {0xb96bc000}, {0xb96be000}, + {0xb96c0000}, {0xb96c2000}, {0xb96c4000}, {0xb96c6000}, + {0xb96c8000}, {0xb96ca000}, {0xb96cc000}, {0xb96ce000}, + {0xb96d0000}, {0xb96d2000}, {0xb96d4000}, {0xb96d6000}, + {0xb96d8000}, {0xb96da000}, {0xb96dc000}, {0xb96de000}, + {0xb96e0000}, {0xb96e2000}, {0xb96e4000}, {0xb96e6000}, + {0xb96e8000}, {0xb96ea000}, {0xb96ec000}, {0xb96ee000}, + {0xb96f0000}, {0xb96f2000}, {0xb96f4000}, {0xb96f6000}, + {0xb96f8000}, {0xb96fa000}, {0xb96fc000}, {0xb96fe000}, + {0xb9700000}, {0xb9702000}, {0xb9704000}, {0xb9706000}, + {0xb9708000}, {0xb970a000}, {0xb970c000}, {0xb970e000}, + {0xb9710000}, {0xb9712000}, {0xb9714000}, {0xb9716000}, + {0xb9718000}, {0xb971a000}, {0xb971c000}, {0xb971e000}, + {0xb9720000}, {0xb9722000}, {0xb9724000}, {0xb9726000}, + {0xb9728000}, {0xb972a000}, {0xb972c000}, {0xb972e000}, + {0xb9730000}, {0xb9732000}, {0xb9734000}, {0xb9736000}, + {0xb9738000}, {0xb973a000}, {0xb973c000}, {0xb973e000}, + {0xb9740000}, {0xb9742000}, {0xb9744000}, {0xb9746000}, + {0xb9748000}, {0xb974a000}, {0xb974c000}, {0xb974e000}, + {0xb9750000}, {0xb9752000}, {0xb9754000}, {0xb9756000}, + {0xb9758000}, {0xb975a000}, {0xb975c000}, {0xb975e000}, + {0xb9760000}, {0xb9762000}, {0xb9764000}, {0xb9766000}, + {0xb9768000}, {0xb976a000}, {0xb976c000}, {0xb976e000}, + {0xb9770000}, {0xb9772000}, {0xb9774000}, {0xb9776000}, + {0xb9778000}, {0xb977a000}, {0xb977c000}, {0xb977e000}, + {0xb9780000}, {0xb9782000}, {0xb9784000}, {0xb9786000}, + {0xb9788000}, {0xb978a000}, {0xb978c000}, {0xb978e000}, + {0xb9790000}, {0xb9792000}, {0xb9794000}, {0xb9796000}, + {0xb9798000}, {0xb979a000}, {0xb979c000}, {0xb979e000}, + {0xb97a0000}, {0xb97a2000}, {0xb97a4000}, {0xb97a6000}, + {0xb97a8000}, {0xb97aa000}, {0xb97ac000}, {0xb97ae000}, + {0xb97b0000}, {0xb97b2000}, {0xb97b4000}, {0xb97b6000}, + {0xb97b8000}, {0xb97ba000}, {0xb97bc000}, {0xb97be000}, + {0xb97c0000}, {0xb97c2000}, {0xb97c4000}, {0xb97c6000}, + {0xb97c8000}, {0xb97ca000}, {0xb97cc000}, {0xb97ce000}, + {0xb97d0000}, {0xb97d2000}, {0xb97d4000}, {0xb97d6000}, + {0xb97d8000}, {0xb97da000}, {0xb97dc000}, {0xb97de000}, + {0xb97e0000}, {0xb97e2000}, {0xb97e4000}, {0xb97e6000}, + {0xb97e8000}, {0xb97ea000}, {0xb97ec000}, {0xb97ee000}, + {0xb97f0000}, {0xb97f2000}, {0xb97f4000}, {0xb97f6000}, + {0xb97f8000}, {0xb97fa000}, {0xb97fc000}, {0xb97fe000}, + {0xb9800000}, {0xb9802000}, {0xb9804000}, {0xb9806000}, + {0xb9808000}, {0xb980a000}, {0xb980c000}, {0xb980e000}, + {0xb9810000}, {0xb9812000}, {0xb9814000}, {0xb9816000}, + {0xb9818000}, {0xb981a000}, {0xb981c000}, {0xb981e000}, + {0xb9820000}, {0xb9822000}, {0xb9824000}, {0xb9826000}, + {0xb9828000}, {0xb982a000}, {0xb982c000}, {0xb982e000}, + {0xb9830000}, {0xb9832000}, {0xb9834000}, {0xb9836000}, + {0xb9838000}, {0xb983a000}, {0xb983c000}, {0xb983e000}, + {0xb9840000}, {0xb9842000}, {0xb9844000}, {0xb9846000}, + {0xb9848000}, {0xb984a000}, {0xb984c000}, {0xb984e000}, + {0xb9850000}, {0xb9852000}, {0xb9854000}, {0xb9856000}, + {0xb9858000}, {0xb985a000}, {0xb985c000}, {0xb985e000}, + {0xb9860000}, {0xb9862000}, {0xb9864000}, {0xb9866000}, + {0xb9868000}, {0xb986a000}, {0xb986c000}, {0xb986e000}, + {0xb9870000}, {0xb9872000}, {0xb9874000}, {0xb9876000}, + {0xb9878000}, {0xb987a000}, {0xb987c000}, {0xb987e000}, + {0xb9880000}, {0xb9882000}, {0xb9884000}, {0xb9886000}, + {0xb9888000}, {0xb988a000}, {0xb988c000}, {0xb988e000}, + {0xb9890000}, {0xb9892000}, {0xb9894000}, {0xb9896000}, + {0xb9898000}, {0xb989a000}, {0xb989c000}, {0xb989e000}, + {0xb98a0000}, {0xb98a2000}, {0xb98a4000}, {0xb98a6000}, + {0xb98a8000}, {0xb98aa000}, {0xb98ac000}, {0xb98ae000}, + {0xb98b0000}, {0xb98b2000}, {0xb98b4000}, {0xb98b6000}, + {0xb98b8000}, {0xb98ba000}, {0xb98bc000}, {0xb98be000}, + {0xb98c0000}, {0xb98c2000}, {0xb98c4000}, {0xb98c6000}, + {0xb98c8000}, {0xb98ca000}, {0xb98cc000}, {0xb98ce000}, + {0xb98d0000}, {0xb98d2000}, {0xb98d4000}, {0xb98d6000}, + {0xb98d8000}, {0xb98da000}, {0xb98dc000}, {0xb98de000}, + {0xb98e0000}, {0xb98e2000}, {0xb98e4000}, {0xb98e6000}, + {0xb98e8000}, {0xb98ea000}, {0xb98ec000}, {0xb98ee000}, + {0xb98f0000}, {0xb98f2000}, {0xb98f4000}, {0xb98f6000}, + {0xb98f8000}, {0xb98fa000}, {0xb98fc000}, {0xb98fe000}, + {0xb9900000}, {0xb9902000}, {0xb9904000}, {0xb9906000}, + {0xb9908000}, {0xb990a000}, {0xb990c000}, {0xb990e000}, + {0xb9910000}, {0xb9912000}, {0xb9914000}, {0xb9916000}, + {0xb9918000}, {0xb991a000}, {0xb991c000}, {0xb991e000}, + {0xb9920000}, {0xb9922000}, {0xb9924000}, {0xb9926000}, + {0xb9928000}, {0xb992a000}, {0xb992c000}, {0xb992e000}, + {0xb9930000}, {0xb9932000}, {0xb9934000}, {0xb9936000}, + {0xb9938000}, {0xb993a000}, {0xb993c000}, {0xb993e000}, + {0xb9940000}, {0xb9942000}, {0xb9944000}, {0xb9946000}, + {0xb9948000}, {0xb994a000}, {0xb994c000}, {0xb994e000}, + {0xb9950000}, {0xb9952000}, {0xb9954000}, {0xb9956000}, + {0xb9958000}, {0xb995a000}, {0xb995c000}, {0xb995e000}, + {0xb9960000}, {0xb9962000}, {0xb9964000}, {0xb9966000}, + {0xb9968000}, {0xb996a000}, {0xb996c000}, {0xb996e000}, + {0xb9970000}, {0xb9972000}, {0xb9974000}, {0xb9976000}, + {0xb9978000}, {0xb997a000}, {0xb997c000}, {0xb997e000}, + {0xb9980000}, {0xb9982000}, {0xb9984000}, {0xb9986000}, + {0xb9988000}, {0xb998a000}, {0xb998c000}, {0xb998e000}, + {0xb9990000}, {0xb9992000}, {0xb9994000}, {0xb9996000}, + {0xb9998000}, {0xb999a000}, {0xb999c000}, {0xb999e000}, + {0xb99a0000}, {0xb99a2000}, {0xb99a4000}, {0xb99a6000}, + {0xb99a8000}, {0xb99aa000}, {0xb99ac000}, {0xb99ae000}, + {0xb99b0000}, {0xb99b2000}, {0xb99b4000}, {0xb99b6000}, + {0xb99b8000}, {0xb99ba000}, {0xb99bc000}, {0xb99be000}, + {0xb99c0000}, {0xb99c2000}, {0xb99c4000}, {0xb99c6000}, + {0xb99c8000}, {0xb99ca000}, {0xb99cc000}, {0xb99ce000}, + {0xb99d0000}, {0xb99d2000}, {0xb99d4000}, {0xb99d6000}, + {0xb99d8000}, {0xb99da000}, {0xb99dc000}, {0xb99de000}, + {0xb99e0000}, {0xb99e2000}, {0xb99e4000}, {0xb99e6000}, + {0xb99e8000}, {0xb99ea000}, {0xb99ec000}, {0xb99ee000}, + {0xb99f0000}, {0xb99f2000}, {0xb99f4000}, {0xb99f6000}, + {0xb99f8000}, {0xb99fa000}, {0xb99fc000}, {0xb99fe000}, + {0xb9a00000}, {0xb9a02000}, {0xb9a04000}, {0xb9a06000}, + {0xb9a08000}, {0xb9a0a000}, {0xb9a0c000}, {0xb9a0e000}, + {0xb9a10000}, {0xb9a12000}, {0xb9a14000}, {0xb9a16000}, + {0xb9a18000}, {0xb9a1a000}, {0xb9a1c000}, {0xb9a1e000}, + {0xb9a20000}, {0xb9a22000}, {0xb9a24000}, {0xb9a26000}, + {0xb9a28000}, {0xb9a2a000}, {0xb9a2c000}, {0xb9a2e000}, + {0xb9a30000}, {0xb9a32000}, {0xb9a34000}, {0xb9a36000}, + {0xb9a38000}, {0xb9a3a000}, {0xb9a3c000}, {0xb9a3e000}, + {0xb9a40000}, {0xb9a42000}, {0xb9a44000}, {0xb9a46000}, + {0xb9a48000}, {0xb9a4a000}, {0xb9a4c000}, {0xb9a4e000}, + {0xb9a50000}, {0xb9a52000}, {0xb9a54000}, {0xb9a56000}, + {0xb9a58000}, {0xb9a5a000}, {0xb9a5c000}, {0xb9a5e000}, + {0xb9a60000}, {0xb9a62000}, {0xb9a64000}, {0xb9a66000}, + {0xb9a68000}, {0xb9a6a000}, {0xb9a6c000}, {0xb9a6e000}, + {0xb9a70000}, {0xb9a72000}, {0xb9a74000}, {0xb9a76000}, + {0xb9a78000}, {0xb9a7a000}, {0xb9a7c000}, {0xb9a7e000}, + {0xb9a80000}, {0xb9a82000}, {0xb9a84000}, {0xb9a86000}, + {0xb9a88000}, {0xb9a8a000}, {0xb9a8c000}, {0xb9a8e000}, + {0xb9a90000}, {0xb9a92000}, {0xb9a94000}, {0xb9a96000}, + {0xb9a98000}, {0xb9a9a000}, {0xb9a9c000}, {0xb9a9e000}, + {0xb9aa0000}, {0xb9aa2000}, {0xb9aa4000}, {0xb9aa6000}, + {0xb9aa8000}, {0xb9aaa000}, {0xb9aac000}, {0xb9aae000}, + {0xb9ab0000}, {0xb9ab2000}, {0xb9ab4000}, {0xb9ab6000}, + {0xb9ab8000}, {0xb9aba000}, {0xb9abc000}, {0xb9abe000}, + {0xb9ac0000}, {0xb9ac2000}, {0xb9ac4000}, {0xb9ac6000}, + {0xb9ac8000}, {0xb9aca000}, {0xb9acc000}, {0xb9ace000}, + {0xb9ad0000}, {0xb9ad2000}, {0xb9ad4000}, {0xb9ad6000}, + {0xb9ad8000}, {0xb9ada000}, {0xb9adc000}, {0xb9ade000}, + {0xb9ae0000}, {0xb9ae2000}, {0xb9ae4000}, {0xb9ae6000}, + {0xb9ae8000}, {0xb9aea000}, {0xb9aec000}, {0xb9aee000}, + {0xb9af0000}, {0xb9af2000}, {0xb9af4000}, {0xb9af6000}, + {0xb9af8000}, {0xb9afa000}, {0xb9afc000}, {0xb9afe000}, + {0xb9b00000}, {0xb9b02000}, {0xb9b04000}, {0xb9b06000}, + {0xb9b08000}, {0xb9b0a000}, {0xb9b0c000}, {0xb9b0e000}, + {0xb9b10000}, {0xb9b12000}, {0xb9b14000}, {0xb9b16000}, + {0xb9b18000}, {0xb9b1a000}, {0xb9b1c000}, {0xb9b1e000}, + {0xb9b20000}, {0xb9b22000}, {0xb9b24000}, {0xb9b26000}, + {0xb9b28000}, {0xb9b2a000}, {0xb9b2c000}, {0xb9b2e000}, + {0xb9b30000}, {0xb9b32000}, {0xb9b34000}, {0xb9b36000}, + {0xb9b38000}, {0xb9b3a000}, {0xb9b3c000}, {0xb9b3e000}, + {0xb9b40000}, {0xb9b42000}, {0xb9b44000}, {0xb9b46000}, + {0xb9b48000}, {0xb9b4a000}, {0xb9b4c000}, {0xb9b4e000}, + {0xb9b50000}, {0xb9b52000}, {0xb9b54000}, {0xb9b56000}, + {0xb9b58000}, {0xb9b5a000}, {0xb9b5c000}, {0xb9b5e000}, + {0xb9b60000}, {0xb9b62000}, {0xb9b64000}, {0xb9b66000}, + {0xb9b68000}, {0xb9b6a000}, {0xb9b6c000}, {0xb9b6e000}, + {0xb9b70000}, {0xb9b72000}, {0xb9b74000}, {0xb9b76000}, + {0xb9b78000}, {0xb9b7a000}, {0xb9b7c000}, {0xb9b7e000}, + {0xb9b80000}, {0xb9b82000}, {0xb9b84000}, {0xb9b86000}, + {0xb9b88000}, {0xb9b8a000}, {0xb9b8c000}, {0xb9b8e000}, + {0xb9b90000}, {0xb9b92000}, {0xb9b94000}, {0xb9b96000}, + {0xb9b98000}, {0xb9b9a000}, {0xb9b9c000}, {0xb9b9e000}, + {0xb9ba0000}, {0xb9ba2000}, {0xb9ba4000}, {0xb9ba6000}, + {0xb9ba8000}, {0xb9baa000}, {0xb9bac000}, {0xb9bae000}, + {0xb9bb0000}, {0xb9bb2000}, {0xb9bb4000}, {0xb9bb6000}, + {0xb9bb8000}, {0xb9bba000}, {0xb9bbc000}, {0xb9bbe000}, + {0xb9bc0000}, {0xb9bc2000}, {0xb9bc4000}, {0xb9bc6000}, + {0xb9bc8000}, {0xb9bca000}, {0xb9bcc000}, {0xb9bce000}, + {0xb9bd0000}, {0xb9bd2000}, {0xb9bd4000}, {0xb9bd6000}, + {0xb9bd8000}, {0xb9bda000}, {0xb9bdc000}, {0xb9bde000}, + {0xb9be0000}, {0xb9be2000}, {0xb9be4000}, {0xb9be6000}, + {0xb9be8000}, {0xb9bea000}, {0xb9bec000}, {0xb9bee000}, + {0xb9bf0000}, {0xb9bf2000}, {0xb9bf4000}, {0xb9bf6000}, + {0xb9bf8000}, {0xb9bfa000}, {0xb9bfc000}, {0xb9bfe000}, + {0xb9c00000}, {0xb9c02000}, {0xb9c04000}, {0xb9c06000}, + {0xb9c08000}, {0xb9c0a000}, {0xb9c0c000}, {0xb9c0e000}, + {0xb9c10000}, {0xb9c12000}, {0xb9c14000}, {0xb9c16000}, + {0xb9c18000}, {0xb9c1a000}, {0xb9c1c000}, {0xb9c1e000}, + {0xb9c20000}, {0xb9c22000}, {0xb9c24000}, {0xb9c26000}, + {0xb9c28000}, {0xb9c2a000}, {0xb9c2c000}, {0xb9c2e000}, + {0xb9c30000}, {0xb9c32000}, {0xb9c34000}, {0xb9c36000}, + {0xb9c38000}, {0xb9c3a000}, {0xb9c3c000}, {0xb9c3e000}, + {0xb9c40000}, {0xb9c42000}, {0xb9c44000}, {0xb9c46000}, + {0xb9c48000}, {0xb9c4a000}, {0xb9c4c000}, {0xb9c4e000}, + {0xb9c50000}, {0xb9c52000}, {0xb9c54000}, {0xb9c56000}, + {0xb9c58000}, {0xb9c5a000}, {0xb9c5c000}, {0xb9c5e000}, + {0xb9c60000}, {0xb9c62000}, {0xb9c64000}, {0xb9c66000}, + {0xb9c68000}, {0xb9c6a000}, {0xb9c6c000}, {0xb9c6e000}, + {0xb9c70000}, {0xb9c72000}, {0xb9c74000}, {0xb9c76000}, + {0xb9c78000}, {0xb9c7a000}, {0xb9c7c000}, {0xb9c7e000}, + {0xb9c80000}, {0xb9c82000}, {0xb9c84000}, {0xb9c86000}, + {0xb9c88000}, {0xb9c8a000}, {0xb9c8c000}, {0xb9c8e000}, + {0xb9c90000}, {0xb9c92000}, {0xb9c94000}, {0xb9c96000}, + {0xb9c98000}, {0xb9c9a000}, {0xb9c9c000}, {0xb9c9e000}, + {0xb9ca0000}, {0xb9ca2000}, {0xb9ca4000}, {0xb9ca6000}, + {0xb9ca8000}, {0xb9caa000}, {0xb9cac000}, {0xb9cae000}, + {0xb9cb0000}, {0xb9cb2000}, {0xb9cb4000}, {0xb9cb6000}, + {0xb9cb8000}, {0xb9cba000}, {0xb9cbc000}, {0xb9cbe000}, + {0xb9cc0000}, {0xb9cc2000}, {0xb9cc4000}, {0xb9cc6000}, + {0xb9cc8000}, {0xb9cca000}, {0xb9ccc000}, {0xb9cce000}, + {0xb9cd0000}, {0xb9cd2000}, {0xb9cd4000}, {0xb9cd6000}, + {0xb9cd8000}, {0xb9cda000}, {0xb9cdc000}, {0xb9cde000}, + {0xb9ce0000}, {0xb9ce2000}, {0xb9ce4000}, {0xb9ce6000}, + {0xb9ce8000}, {0xb9cea000}, {0xb9cec000}, {0xb9cee000}, + {0xb9cf0000}, {0xb9cf2000}, {0xb9cf4000}, {0xb9cf6000}, + {0xb9cf8000}, {0xb9cfa000}, {0xb9cfc000}, {0xb9cfe000}, + {0xb9d00000}, {0xb9d02000}, {0xb9d04000}, {0xb9d06000}, + {0xb9d08000}, {0xb9d0a000}, {0xb9d0c000}, {0xb9d0e000}, + {0xb9d10000}, {0xb9d12000}, {0xb9d14000}, {0xb9d16000}, + {0xb9d18000}, {0xb9d1a000}, {0xb9d1c000}, {0xb9d1e000}, + {0xb9d20000}, {0xb9d22000}, {0xb9d24000}, {0xb9d26000}, + {0xb9d28000}, {0xb9d2a000}, {0xb9d2c000}, {0xb9d2e000}, + {0xb9d30000}, {0xb9d32000}, {0xb9d34000}, {0xb9d36000}, + {0xb9d38000}, {0xb9d3a000}, {0xb9d3c000}, {0xb9d3e000}, + {0xb9d40000}, {0xb9d42000}, {0xb9d44000}, {0xb9d46000}, + {0xb9d48000}, {0xb9d4a000}, {0xb9d4c000}, {0xb9d4e000}, + {0xb9d50000}, {0xb9d52000}, {0xb9d54000}, {0xb9d56000}, + {0xb9d58000}, {0xb9d5a000}, {0xb9d5c000}, {0xb9d5e000}, + {0xb9d60000}, {0xb9d62000}, {0xb9d64000}, {0xb9d66000}, + {0xb9d68000}, {0xb9d6a000}, {0xb9d6c000}, {0xb9d6e000}, + {0xb9d70000}, {0xb9d72000}, {0xb9d74000}, {0xb9d76000}, + {0xb9d78000}, {0xb9d7a000}, {0xb9d7c000}, {0xb9d7e000}, + {0xb9d80000}, {0xb9d82000}, {0xb9d84000}, {0xb9d86000}, + {0xb9d88000}, {0xb9d8a000}, {0xb9d8c000}, {0xb9d8e000}, + {0xb9d90000}, {0xb9d92000}, {0xb9d94000}, {0xb9d96000}, + {0xb9d98000}, {0xb9d9a000}, {0xb9d9c000}, {0xb9d9e000}, + {0xb9da0000}, {0xb9da2000}, {0xb9da4000}, {0xb9da6000}, + {0xb9da8000}, {0xb9daa000}, {0xb9dac000}, {0xb9dae000}, + {0xb9db0000}, {0xb9db2000}, {0xb9db4000}, {0xb9db6000}, + {0xb9db8000}, {0xb9dba000}, {0xb9dbc000}, {0xb9dbe000}, + {0xb9dc0000}, {0xb9dc2000}, {0xb9dc4000}, {0xb9dc6000}, + {0xb9dc8000}, {0xb9dca000}, {0xb9dcc000}, {0xb9dce000}, + {0xb9dd0000}, {0xb9dd2000}, {0xb9dd4000}, {0xb9dd6000}, + {0xb9dd8000}, {0xb9dda000}, {0xb9ddc000}, {0xb9dde000}, + {0xb9de0000}, {0xb9de2000}, {0xb9de4000}, {0xb9de6000}, + {0xb9de8000}, {0xb9dea000}, {0xb9dec000}, {0xb9dee000}, + {0xb9df0000}, {0xb9df2000}, {0xb9df4000}, {0xb9df6000}, + {0xb9df8000}, {0xb9dfa000}, {0xb9dfc000}, {0xb9dfe000}, + {0xb9e00000}, {0xb9e02000}, {0xb9e04000}, {0xb9e06000}, + {0xb9e08000}, {0xb9e0a000}, {0xb9e0c000}, {0xb9e0e000}, + {0xb9e10000}, {0xb9e12000}, {0xb9e14000}, {0xb9e16000}, + {0xb9e18000}, {0xb9e1a000}, {0xb9e1c000}, {0xb9e1e000}, + {0xb9e20000}, {0xb9e22000}, {0xb9e24000}, {0xb9e26000}, + {0xb9e28000}, {0xb9e2a000}, {0xb9e2c000}, {0xb9e2e000}, + {0xb9e30000}, {0xb9e32000}, {0xb9e34000}, {0xb9e36000}, + {0xb9e38000}, {0xb9e3a000}, {0xb9e3c000}, {0xb9e3e000}, + {0xb9e40000}, {0xb9e42000}, {0xb9e44000}, {0xb9e46000}, + {0xb9e48000}, {0xb9e4a000}, {0xb9e4c000}, {0xb9e4e000}, + {0xb9e50000}, {0xb9e52000}, {0xb9e54000}, {0xb9e56000}, + {0xb9e58000}, {0xb9e5a000}, {0xb9e5c000}, {0xb9e5e000}, + {0xb9e60000}, {0xb9e62000}, {0xb9e64000}, {0xb9e66000}, + {0xb9e68000}, {0xb9e6a000}, {0xb9e6c000}, {0xb9e6e000}, + {0xb9e70000}, {0xb9e72000}, {0xb9e74000}, {0xb9e76000}, + {0xb9e78000}, {0xb9e7a000}, {0xb9e7c000}, {0xb9e7e000}, + {0xb9e80000}, {0xb9e82000}, {0xb9e84000}, {0xb9e86000}, + {0xb9e88000}, {0xb9e8a000}, {0xb9e8c000}, {0xb9e8e000}, + {0xb9e90000}, {0xb9e92000}, {0xb9e94000}, {0xb9e96000}, + {0xb9e98000}, {0xb9e9a000}, {0xb9e9c000}, {0xb9e9e000}, + {0xb9ea0000}, {0xb9ea2000}, {0xb9ea4000}, {0xb9ea6000}, + {0xb9ea8000}, {0xb9eaa000}, {0xb9eac000}, {0xb9eae000}, + {0xb9eb0000}, {0xb9eb2000}, {0xb9eb4000}, {0xb9eb6000}, + {0xb9eb8000}, {0xb9eba000}, {0xb9ebc000}, {0xb9ebe000}, + {0xb9ec0000}, {0xb9ec2000}, {0xb9ec4000}, {0xb9ec6000}, + {0xb9ec8000}, {0xb9eca000}, {0xb9ecc000}, {0xb9ece000}, + {0xb9ed0000}, {0xb9ed2000}, {0xb9ed4000}, {0xb9ed6000}, + {0xb9ed8000}, {0xb9eda000}, {0xb9edc000}, {0xb9ede000}, + {0xb9ee0000}, {0xb9ee2000}, {0xb9ee4000}, {0xb9ee6000}, + {0xb9ee8000}, {0xb9eea000}, {0xb9eec000}, {0xb9eee000}, + {0xb9ef0000}, {0xb9ef2000}, {0xb9ef4000}, {0xb9ef6000}, + {0xb9ef8000}, {0xb9efa000}, {0xb9efc000}, {0xb9efe000}, + {0xb9f00000}, {0xb9f02000}, {0xb9f04000}, {0xb9f06000}, + {0xb9f08000}, {0xb9f0a000}, {0xb9f0c000}, {0xb9f0e000}, + {0xb9f10000}, {0xb9f12000}, {0xb9f14000}, {0xb9f16000}, + {0xb9f18000}, {0xb9f1a000}, {0xb9f1c000}, {0xb9f1e000}, + {0xb9f20000}, {0xb9f22000}, {0xb9f24000}, {0xb9f26000}, + {0xb9f28000}, {0xb9f2a000}, {0xb9f2c000}, {0xb9f2e000}, + {0xb9f30000}, {0xb9f32000}, {0xb9f34000}, {0xb9f36000}, + {0xb9f38000}, {0xb9f3a000}, {0xb9f3c000}, {0xb9f3e000}, + {0xb9f40000}, {0xb9f42000}, {0xb9f44000}, {0xb9f46000}, + {0xb9f48000}, {0xb9f4a000}, {0xb9f4c000}, {0xb9f4e000}, + {0xb9f50000}, {0xb9f52000}, {0xb9f54000}, {0xb9f56000}, + {0xb9f58000}, {0xb9f5a000}, {0xb9f5c000}, {0xb9f5e000}, + {0xb9f60000}, {0xb9f62000}, {0xb9f64000}, {0xb9f66000}, + {0xb9f68000}, {0xb9f6a000}, {0xb9f6c000}, {0xb9f6e000}, + {0xb9f70000}, {0xb9f72000}, {0xb9f74000}, {0xb9f76000}, + {0xb9f78000}, {0xb9f7a000}, {0xb9f7c000}, {0xb9f7e000}, + {0xb9f80000}, {0xb9f82000}, {0xb9f84000}, {0xb9f86000}, + {0xb9f88000}, {0xb9f8a000}, {0xb9f8c000}, {0xb9f8e000}, + {0xb9f90000}, {0xb9f92000}, {0xb9f94000}, {0xb9f96000}, + {0xb9f98000}, {0xb9f9a000}, {0xb9f9c000}, {0xb9f9e000}, + {0xb9fa0000}, {0xb9fa2000}, {0xb9fa4000}, {0xb9fa6000}, + {0xb9fa8000}, {0xb9faa000}, {0xb9fac000}, {0xb9fae000}, + {0xb9fb0000}, {0xb9fb2000}, {0xb9fb4000}, {0xb9fb6000}, + {0xb9fb8000}, {0xb9fba000}, {0xb9fbc000}, {0xb9fbe000}, + {0xb9fc0000}, {0xb9fc2000}, {0xb9fc4000}, {0xb9fc6000}, + {0xb9fc8000}, {0xb9fca000}, {0xb9fcc000}, {0xb9fce000}, + {0xb9fd0000}, {0xb9fd2000}, {0xb9fd4000}, {0xb9fd6000}, + {0xb9fd8000}, {0xb9fda000}, {0xb9fdc000}, {0xb9fde000}, + {0xb9fe0000}, {0xb9fe2000}, {0xb9fe4000}, {0xb9fe6000}, + {0xb9fe8000}, {0xb9fea000}, {0xb9fec000}, {0xb9fee000}, + {0xb9ff0000}, {0xb9ff2000}, {0xb9ff4000}, {0xb9ff6000}, + {0xb9ff8000}, {0xb9ffa000}, {0xb9ffc000}, {0xb9ffe000}, + {0xba000000}, {0xba002000}, {0xba004000}, {0xba006000}, + {0xba008000}, {0xba00a000}, {0xba00c000}, {0xba00e000}, + {0xba010000}, {0xba012000}, {0xba014000}, {0xba016000}, + {0xba018000}, {0xba01a000}, {0xba01c000}, {0xba01e000}, + {0xba020000}, {0xba022000}, {0xba024000}, {0xba026000}, + {0xba028000}, {0xba02a000}, {0xba02c000}, {0xba02e000}, + {0xba030000}, {0xba032000}, {0xba034000}, {0xba036000}, + {0xba038000}, {0xba03a000}, {0xba03c000}, {0xba03e000}, + {0xba040000}, {0xba042000}, {0xba044000}, {0xba046000}, + {0xba048000}, {0xba04a000}, {0xba04c000}, {0xba04e000}, + {0xba050000}, {0xba052000}, {0xba054000}, {0xba056000}, + {0xba058000}, {0xba05a000}, {0xba05c000}, {0xba05e000}, + {0xba060000}, {0xba062000}, {0xba064000}, {0xba066000}, + {0xba068000}, {0xba06a000}, {0xba06c000}, {0xba06e000}, + {0xba070000}, {0xba072000}, {0xba074000}, {0xba076000}, + {0xba078000}, {0xba07a000}, {0xba07c000}, {0xba07e000}, + {0xba080000}, {0xba082000}, {0xba084000}, {0xba086000}, + {0xba088000}, {0xba08a000}, {0xba08c000}, {0xba08e000}, + {0xba090000}, {0xba092000}, {0xba094000}, {0xba096000}, + {0xba098000}, {0xba09a000}, {0xba09c000}, {0xba09e000}, + {0xba0a0000}, {0xba0a2000}, {0xba0a4000}, {0xba0a6000}, + {0xba0a8000}, {0xba0aa000}, {0xba0ac000}, {0xba0ae000}, + {0xba0b0000}, {0xba0b2000}, {0xba0b4000}, {0xba0b6000}, + {0xba0b8000}, {0xba0ba000}, {0xba0bc000}, {0xba0be000}, + {0xba0c0000}, {0xba0c2000}, {0xba0c4000}, {0xba0c6000}, + {0xba0c8000}, {0xba0ca000}, {0xba0cc000}, {0xba0ce000}, + {0xba0d0000}, {0xba0d2000}, {0xba0d4000}, {0xba0d6000}, + {0xba0d8000}, {0xba0da000}, {0xba0dc000}, {0xba0de000}, + {0xba0e0000}, {0xba0e2000}, {0xba0e4000}, {0xba0e6000}, + {0xba0e8000}, {0xba0ea000}, {0xba0ec000}, {0xba0ee000}, + {0xba0f0000}, {0xba0f2000}, {0xba0f4000}, {0xba0f6000}, + {0xba0f8000}, {0xba0fa000}, {0xba0fc000}, {0xba0fe000}, + {0xba100000}, {0xba102000}, {0xba104000}, {0xba106000}, + {0xba108000}, {0xba10a000}, {0xba10c000}, {0xba10e000}, + {0xba110000}, {0xba112000}, {0xba114000}, {0xba116000}, + {0xba118000}, {0xba11a000}, {0xba11c000}, {0xba11e000}, + {0xba120000}, {0xba122000}, {0xba124000}, {0xba126000}, + {0xba128000}, {0xba12a000}, {0xba12c000}, {0xba12e000}, + {0xba130000}, {0xba132000}, {0xba134000}, {0xba136000}, + {0xba138000}, {0xba13a000}, {0xba13c000}, {0xba13e000}, + {0xba140000}, {0xba142000}, {0xba144000}, {0xba146000}, + {0xba148000}, {0xba14a000}, {0xba14c000}, {0xba14e000}, + {0xba150000}, {0xba152000}, {0xba154000}, {0xba156000}, + {0xba158000}, {0xba15a000}, {0xba15c000}, {0xba15e000}, + {0xba160000}, {0xba162000}, {0xba164000}, {0xba166000}, + {0xba168000}, {0xba16a000}, {0xba16c000}, {0xba16e000}, + {0xba170000}, {0xba172000}, {0xba174000}, {0xba176000}, + {0xba178000}, {0xba17a000}, {0xba17c000}, {0xba17e000}, + {0xba180000}, {0xba182000}, {0xba184000}, {0xba186000}, + {0xba188000}, {0xba18a000}, {0xba18c000}, {0xba18e000}, + {0xba190000}, {0xba192000}, {0xba194000}, {0xba196000}, + {0xba198000}, {0xba19a000}, {0xba19c000}, {0xba19e000}, + {0xba1a0000}, {0xba1a2000}, {0xba1a4000}, {0xba1a6000}, + {0xba1a8000}, {0xba1aa000}, {0xba1ac000}, {0xba1ae000}, + {0xba1b0000}, {0xba1b2000}, {0xba1b4000}, {0xba1b6000}, + {0xba1b8000}, {0xba1ba000}, {0xba1bc000}, {0xba1be000}, + {0xba1c0000}, {0xba1c2000}, {0xba1c4000}, {0xba1c6000}, + {0xba1c8000}, {0xba1ca000}, {0xba1cc000}, {0xba1ce000}, + {0xba1d0000}, {0xba1d2000}, {0xba1d4000}, {0xba1d6000}, + {0xba1d8000}, {0xba1da000}, {0xba1dc000}, {0xba1de000}, + {0xba1e0000}, {0xba1e2000}, {0xba1e4000}, {0xba1e6000}, + {0xba1e8000}, {0xba1ea000}, {0xba1ec000}, {0xba1ee000}, + {0xba1f0000}, {0xba1f2000}, {0xba1f4000}, {0xba1f6000}, + {0xba1f8000}, {0xba1fa000}, {0xba1fc000}, {0xba1fe000}, + {0xba200000}, {0xba202000}, {0xba204000}, {0xba206000}, + {0xba208000}, {0xba20a000}, {0xba20c000}, {0xba20e000}, + {0xba210000}, {0xba212000}, {0xba214000}, {0xba216000}, + {0xba218000}, {0xba21a000}, {0xba21c000}, {0xba21e000}, + {0xba220000}, {0xba222000}, {0xba224000}, {0xba226000}, + {0xba228000}, {0xba22a000}, {0xba22c000}, {0xba22e000}, + {0xba230000}, {0xba232000}, {0xba234000}, {0xba236000}, + {0xba238000}, {0xba23a000}, {0xba23c000}, {0xba23e000}, + {0xba240000}, {0xba242000}, {0xba244000}, {0xba246000}, + {0xba248000}, {0xba24a000}, {0xba24c000}, {0xba24e000}, + {0xba250000}, {0xba252000}, {0xba254000}, {0xba256000}, + {0xba258000}, {0xba25a000}, {0xba25c000}, {0xba25e000}, + {0xba260000}, {0xba262000}, {0xba264000}, {0xba266000}, + {0xba268000}, {0xba26a000}, {0xba26c000}, {0xba26e000}, + {0xba270000}, {0xba272000}, {0xba274000}, {0xba276000}, + {0xba278000}, {0xba27a000}, {0xba27c000}, {0xba27e000}, + {0xba280000}, {0xba282000}, {0xba284000}, {0xba286000}, + {0xba288000}, {0xba28a000}, {0xba28c000}, {0xba28e000}, + {0xba290000}, {0xba292000}, {0xba294000}, {0xba296000}, + {0xba298000}, {0xba29a000}, {0xba29c000}, {0xba29e000}, + {0xba2a0000}, {0xba2a2000}, {0xba2a4000}, {0xba2a6000}, + {0xba2a8000}, {0xba2aa000}, {0xba2ac000}, {0xba2ae000}, + {0xba2b0000}, {0xba2b2000}, {0xba2b4000}, {0xba2b6000}, + {0xba2b8000}, {0xba2ba000}, {0xba2bc000}, {0xba2be000}, + {0xba2c0000}, {0xba2c2000}, {0xba2c4000}, {0xba2c6000}, + {0xba2c8000}, {0xba2ca000}, {0xba2cc000}, {0xba2ce000}, + {0xba2d0000}, {0xba2d2000}, {0xba2d4000}, {0xba2d6000}, + {0xba2d8000}, {0xba2da000}, {0xba2dc000}, {0xba2de000}, + {0xba2e0000}, {0xba2e2000}, {0xba2e4000}, {0xba2e6000}, + {0xba2e8000}, {0xba2ea000}, {0xba2ec000}, {0xba2ee000}, + {0xba2f0000}, {0xba2f2000}, {0xba2f4000}, {0xba2f6000}, + {0xba2f8000}, {0xba2fa000}, {0xba2fc000}, {0xba2fe000}, + {0xba300000}, {0xba302000}, {0xba304000}, {0xba306000}, + {0xba308000}, {0xba30a000}, {0xba30c000}, {0xba30e000}, + {0xba310000}, {0xba312000}, {0xba314000}, {0xba316000}, + {0xba318000}, {0xba31a000}, {0xba31c000}, {0xba31e000}, + {0xba320000}, {0xba322000}, {0xba324000}, {0xba326000}, + {0xba328000}, {0xba32a000}, {0xba32c000}, {0xba32e000}, + {0xba330000}, {0xba332000}, {0xba334000}, {0xba336000}, + {0xba338000}, {0xba33a000}, {0xba33c000}, {0xba33e000}, + {0xba340000}, {0xba342000}, {0xba344000}, {0xba346000}, + {0xba348000}, {0xba34a000}, {0xba34c000}, {0xba34e000}, + {0xba350000}, {0xba352000}, {0xba354000}, {0xba356000}, + {0xba358000}, {0xba35a000}, {0xba35c000}, {0xba35e000}, + {0xba360000}, {0xba362000}, {0xba364000}, {0xba366000}, + {0xba368000}, {0xba36a000}, {0xba36c000}, {0xba36e000}, + {0xba370000}, {0xba372000}, {0xba374000}, {0xba376000}, + {0xba378000}, {0xba37a000}, {0xba37c000}, {0xba37e000}, + {0xba380000}, {0xba382000}, {0xba384000}, {0xba386000}, + {0xba388000}, {0xba38a000}, {0xba38c000}, {0xba38e000}, + {0xba390000}, {0xba392000}, {0xba394000}, {0xba396000}, + {0xba398000}, {0xba39a000}, {0xba39c000}, {0xba39e000}, + {0xba3a0000}, {0xba3a2000}, {0xba3a4000}, {0xba3a6000}, + {0xba3a8000}, {0xba3aa000}, {0xba3ac000}, {0xba3ae000}, + {0xba3b0000}, {0xba3b2000}, {0xba3b4000}, {0xba3b6000}, + {0xba3b8000}, {0xba3ba000}, {0xba3bc000}, {0xba3be000}, + {0xba3c0000}, {0xba3c2000}, {0xba3c4000}, {0xba3c6000}, + {0xba3c8000}, {0xba3ca000}, {0xba3cc000}, {0xba3ce000}, + {0xba3d0000}, {0xba3d2000}, {0xba3d4000}, {0xba3d6000}, + {0xba3d8000}, {0xba3da000}, {0xba3dc000}, {0xba3de000}, + {0xba3e0000}, {0xba3e2000}, {0xba3e4000}, {0xba3e6000}, + {0xba3e8000}, {0xba3ea000}, {0xba3ec000}, {0xba3ee000}, + {0xba3f0000}, {0xba3f2000}, {0xba3f4000}, {0xba3f6000}, + {0xba3f8000}, {0xba3fa000}, {0xba3fc000}, {0xba3fe000}, + {0xba400000}, {0xba402000}, {0xba404000}, {0xba406000}, + {0xba408000}, {0xba40a000}, {0xba40c000}, {0xba40e000}, + {0xba410000}, {0xba412000}, {0xba414000}, {0xba416000}, + {0xba418000}, {0xba41a000}, {0xba41c000}, {0xba41e000}, + {0xba420000}, {0xba422000}, {0xba424000}, {0xba426000}, + {0xba428000}, {0xba42a000}, {0xba42c000}, {0xba42e000}, + {0xba430000}, {0xba432000}, {0xba434000}, {0xba436000}, + {0xba438000}, {0xba43a000}, {0xba43c000}, {0xba43e000}, + {0xba440000}, {0xba442000}, {0xba444000}, {0xba446000}, + {0xba448000}, {0xba44a000}, {0xba44c000}, {0xba44e000}, + {0xba450000}, {0xba452000}, {0xba454000}, {0xba456000}, + {0xba458000}, {0xba45a000}, {0xba45c000}, {0xba45e000}, + {0xba460000}, {0xba462000}, {0xba464000}, {0xba466000}, + {0xba468000}, {0xba46a000}, {0xba46c000}, {0xba46e000}, + {0xba470000}, {0xba472000}, {0xba474000}, {0xba476000}, + {0xba478000}, {0xba47a000}, {0xba47c000}, {0xba47e000}, + {0xba480000}, {0xba482000}, {0xba484000}, {0xba486000}, + {0xba488000}, {0xba48a000}, {0xba48c000}, {0xba48e000}, + {0xba490000}, {0xba492000}, {0xba494000}, {0xba496000}, + {0xba498000}, {0xba49a000}, {0xba49c000}, {0xba49e000}, + {0xba4a0000}, {0xba4a2000}, {0xba4a4000}, {0xba4a6000}, + {0xba4a8000}, {0xba4aa000}, {0xba4ac000}, {0xba4ae000}, + {0xba4b0000}, {0xba4b2000}, {0xba4b4000}, {0xba4b6000}, + {0xba4b8000}, {0xba4ba000}, {0xba4bc000}, {0xba4be000}, + {0xba4c0000}, {0xba4c2000}, {0xba4c4000}, {0xba4c6000}, + {0xba4c8000}, {0xba4ca000}, {0xba4cc000}, {0xba4ce000}, + {0xba4d0000}, {0xba4d2000}, {0xba4d4000}, {0xba4d6000}, + {0xba4d8000}, {0xba4da000}, {0xba4dc000}, {0xba4de000}, + {0xba4e0000}, {0xba4e2000}, {0xba4e4000}, {0xba4e6000}, + {0xba4e8000}, {0xba4ea000}, {0xba4ec000}, {0xba4ee000}, + {0xba4f0000}, {0xba4f2000}, {0xba4f4000}, {0xba4f6000}, + {0xba4f8000}, {0xba4fa000}, {0xba4fc000}, {0xba4fe000}, + {0xba500000}, {0xba502000}, {0xba504000}, {0xba506000}, + {0xba508000}, {0xba50a000}, {0xba50c000}, {0xba50e000}, + {0xba510000}, {0xba512000}, {0xba514000}, {0xba516000}, + {0xba518000}, {0xba51a000}, {0xba51c000}, {0xba51e000}, + {0xba520000}, {0xba522000}, {0xba524000}, {0xba526000}, + {0xba528000}, {0xba52a000}, {0xba52c000}, {0xba52e000}, + {0xba530000}, {0xba532000}, {0xba534000}, {0xba536000}, + {0xba538000}, {0xba53a000}, {0xba53c000}, {0xba53e000}, + {0xba540000}, {0xba542000}, {0xba544000}, {0xba546000}, + {0xba548000}, {0xba54a000}, {0xba54c000}, {0xba54e000}, + {0xba550000}, {0xba552000}, {0xba554000}, {0xba556000}, + {0xba558000}, {0xba55a000}, {0xba55c000}, {0xba55e000}, + {0xba560000}, {0xba562000}, {0xba564000}, {0xba566000}, + {0xba568000}, {0xba56a000}, {0xba56c000}, {0xba56e000}, + {0xba570000}, {0xba572000}, {0xba574000}, {0xba576000}, + {0xba578000}, {0xba57a000}, {0xba57c000}, {0xba57e000}, + {0xba580000}, {0xba582000}, {0xba584000}, {0xba586000}, + {0xba588000}, {0xba58a000}, {0xba58c000}, {0xba58e000}, + {0xba590000}, {0xba592000}, {0xba594000}, {0xba596000}, + {0xba598000}, {0xba59a000}, {0xba59c000}, {0xba59e000}, + {0xba5a0000}, {0xba5a2000}, {0xba5a4000}, {0xba5a6000}, + {0xba5a8000}, {0xba5aa000}, {0xba5ac000}, {0xba5ae000}, + {0xba5b0000}, {0xba5b2000}, {0xba5b4000}, {0xba5b6000}, + {0xba5b8000}, {0xba5ba000}, {0xba5bc000}, {0xba5be000}, + {0xba5c0000}, {0xba5c2000}, {0xba5c4000}, {0xba5c6000}, + {0xba5c8000}, {0xba5ca000}, {0xba5cc000}, {0xba5ce000}, + {0xba5d0000}, {0xba5d2000}, {0xba5d4000}, {0xba5d6000}, + {0xba5d8000}, {0xba5da000}, {0xba5dc000}, {0xba5de000}, + {0xba5e0000}, {0xba5e2000}, {0xba5e4000}, {0xba5e6000}, + {0xba5e8000}, {0xba5ea000}, {0xba5ec000}, {0xba5ee000}, + {0xba5f0000}, {0xba5f2000}, {0xba5f4000}, {0xba5f6000}, + {0xba5f8000}, {0xba5fa000}, {0xba5fc000}, {0xba5fe000}, + {0xba600000}, {0xba602000}, {0xba604000}, {0xba606000}, + {0xba608000}, {0xba60a000}, {0xba60c000}, {0xba60e000}, + {0xba610000}, {0xba612000}, {0xba614000}, {0xba616000}, + {0xba618000}, {0xba61a000}, {0xba61c000}, {0xba61e000}, + {0xba620000}, {0xba622000}, {0xba624000}, {0xba626000}, + {0xba628000}, {0xba62a000}, {0xba62c000}, {0xba62e000}, + {0xba630000}, {0xba632000}, {0xba634000}, {0xba636000}, + {0xba638000}, {0xba63a000}, {0xba63c000}, {0xba63e000}, + {0xba640000}, {0xba642000}, {0xba644000}, {0xba646000}, + {0xba648000}, {0xba64a000}, {0xba64c000}, {0xba64e000}, + {0xba650000}, {0xba652000}, {0xba654000}, {0xba656000}, + {0xba658000}, {0xba65a000}, {0xba65c000}, {0xba65e000}, + {0xba660000}, {0xba662000}, {0xba664000}, {0xba666000}, + {0xba668000}, {0xba66a000}, {0xba66c000}, {0xba66e000}, + {0xba670000}, {0xba672000}, {0xba674000}, {0xba676000}, + {0xba678000}, {0xba67a000}, {0xba67c000}, {0xba67e000}, + {0xba680000}, {0xba682000}, {0xba684000}, {0xba686000}, + {0xba688000}, {0xba68a000}, {0xba68c000}, {0xba68e000}, + {0xba690000}, {0xba692000}, {0xba694000}, {0xba696000}, + {0xba698000}, {0xba69a000}, {0xba69c000}, {0xba69e000}, + {0xba6a0000}, {0xba6a2000}, {0xba6a4000}, {0xba6a6000}, + {0xba6a8000}, {0xba6aa000}, {0xba6ac000}, {0xba6ae000}, + {0xba6b0000}, {0xba6b2000}, {0xba6b4000}, {0xba6b6000}, + {0xba6b8000}, {0xba6ba000}, {0xba6bc000}, {0xba6be000}, + {0xba6c0000}, {0xba6c2000}, {0xba6c4000}, {0xba6c6000}, + {0xba6c8000}, {0xba6ca000}, {0xba6cc000}, {0xba6ce000}, + {0xba6d0000}, {0xba6d2000}, {0xba6d4000}, {0xba6d6000}, + {0xba6d8000}, {0xba6da000}, {0xba6dc000}, {0xba6de000}, + {0xba6e0000}, {0xba6e2000}, {0xba6e4000}, {0xba6e6000}, + {0xba6e8000}, {0xba6ea000}, {0xba6ec000}, {0xba6ee000}, + {0xba6f0000}, {0xba6f2000}, {0xba6f4000}, {0xba6f6000}, + {0xba6f8000}, {0xba6fa000}, {0xba6fc000}, {0xba6fe000}, + {0xba700000}, {0xba702000}, {0xba704000}, {0xba706000}, + {0xba708000}, {0xba70a000}, {0xba70c000}, {0xba70e000}, + {0xba710000}, {0xba712000}, {0xba714000}, {0xba716000}, + {0xba718000}, {0xba71a000}, {0xba71c000}, {0xba71e000}, + {0xba720000}, {0xba722000}, {0xba724000}, {0xba726000}, + {0xba728000}, {0xba72a000}, {0xba72c000}, {0xba72e000}, + {0xba730000}, {0xba732000}, {0xba734000}, {0xba736000}, + {0xba738000}, {0xba73a000}, {0xba73c000}, {0xba73e000}, + {0xba740000}, {0xba742000}, {0xba744000}, {0xba746000}, + {0xba748000}, {0xba74a000}, {0xba74c000}, {0xba74e000}, + {0xba750000}, {0xba752000}, {0xba754000}, {0xba756000}, + {0xba758000}, {0xba75a000}, {0xba75c000}, {0xba75e000}, + {0xba760000}, {0xba762000}, {0xba764000}, {0xba766000}, + {0xba768000}, {0xba76a000}, {0xba76c000}, {0xba76e000}, + {0xba770000}, {0xba772000}, {0xba774000}, {0xba776000}, + {0xba778000}, {0xba77a000}, {0xba77c000}, {0xba77e000}, + {0xba780000}, {0xba782000}, {0xba784000}, {0xba786000}, + {0xba788000}, {0xba78a000}, {0xba78c000}, {0xba78e000}, + {0xba790000}, {0xba792000}, {0xba794000}, {0xba796000}, + {0xba798000}, {0xba79a000}, {0xba79c000}, {0xba79e000}, + {0xba7a0000}, {0xba7a2000}, {0xba7a4000}, {0xba7a6000}, + {0xba7a8000}, {0xba7aa000}, {0xba7ac000}, {0xba7ae000}, + {0xba7b0000}, {0xba7b2000}, {0xba7b4000}, {0xba7b6000}, + {0xba7b8000}, {0xba7ba000}, {0xba7bc000}, {0xba7be000}, + {0xba7c0000}, {0xba7c2000}, {0xba7c4000}, {0xba7c6000}, + {0xba7c8000}, {0xba7ca000}, {0xba7cc000}, {0xba7ce000}, + {0xba7d0000}, {0xba7d2000}, {0xba7d4000}, {0xba7d6000}, + {0xba7d8000}, {0xba7da000}, {0xba7dc000}, {0xba7de000}, + {0xba7e0000}, {0xba7e2000}, {0xba7e4000}, {0xba7e6000}, + {0xba7e8000}, {0xba7ea000}, {0xba7ec000}, {0xba7ee000}, + {0xba7f0000}, {0xba7f2000}, {0xba7f4000}, {0xba7f6000}, + {0xba7f8000}, {0xba7fa000}, {0xba7fc000}, {0xba7fe000}, + {0xba800000}, {0xba802000}, {0xba804000}, {0xba806000}, + {0xba808000}, {0xba80a000}, {0xba80c000}, {0xba80e000}, + {0xba810000}, {0xba812000}, {0xba814000}, {0xba816000}, + {0xba818000}, {0xba81a000}, {0xba81c000}, {0xba81e000}, + {0xba820000}, {0xba822000}, {0xba824000}, {0xba826000}, + {0xba828000}, {0xba82a000}, {0xba82c000}, {0xba82e000}, + {0xba830000}, {0xba832000}, {0xba834000}, {0xba836000}, + {0xba838000}, {0xba83a000}, {0xba83c000}, {0xba83e000}, + {0xba840000}, {0xba842000}, {0xba844000}, {0xba846000}, + {0xba848000}, {0xba84a000}, {0xba84c000}, {0xba84e000}, + {0xba850000}, {0xba852000}, {0xba854000}, {0xba856000}, + {0xba858000}, {0xba85a000}, {0xba85c000}, {0xba85e000}, + {0xba860000}, {0xba862000}, {0xba864000}, {0xba866000}, + {0xba868000}, {0xba86a000}, {0xba86c000}, {0xba86e000}, + {0xba870000}, {0xba872000}, {0xba874000}, {0xba876000}, + {0xba878000}, {0xba87a000}, {0xba87c000}, {0xba87e000}, + {0xba880000}, {0xba882000}, {0xba884000}, {0xba886000}, + {0xba888000}, {0xba88a000}, {0xba88c000}, {0xba88e000}, + {0xba890000}, {0xba892000}, {0xba894000}, {0xba896000}, + {0xba898000}, {0xba89a000}, {0xba89c000}, {0xba89e000}, + {0xba8a0000}, {0xba8a2000}, {0xba8a4000}, {0xba8a6000}, + {0xba8a8000}, {0xba8aa000}, {0xba8ac000}, {0xba8ae000}, + {0xba8b0000}, {0xba8b2000}, {0xba8b4000}, {0xba8b6000}, + {0xba8b8000}, {0xba8ba000}, {0xba8bc000}, {0xba8be000}, + {0xba8c0000}, {0xba8c2000}, {0xba8c4000}, {0xba8c6000}, + {0xba8c8000}, {0xba8ca000}, {0xba8cc000}, {0xba8ce000}, + {0xba8d0000}, {0xba8d2000}, {0xba8d4000}, {0xba8d6000}, + {0xba8d8000}, {0xba8da000}, {0xba8dc000}, {0xba8de000}, + {0xba8e0000}, {0xba8e2000}, {0xba8e4000}, {0xba8e6000}, + {0xba8e8000}, {0xba8ea000}, {0xba8ec000}, {0xba8ee000}, + {0xba8f0000}, {0xba8f2000}, {0xba8f4000}, {0xba8f6000}, + {0xba8f8000}, {0xba8fa000}, {0xba8fc000}, {0xba8fe000}, + {0xba900000}, {0xba902000}, {0xba904000}, {0xba906000}, + {0xba908000}, {0xba90a000}, {0xba90c000}, {0xba90e000}, + {0xba910000}, {0xba912000}, {0xba914000}, {0xba916000}, + {0xba918000}, {0xba91a000}, {0xba91c000}, {0xba91e000}, + {0xba920000}, {0xba922000}, {0xba924000}, {0xba926000}, + {0xba928000}, {0xba92a000}, {0xba92c000}, {0xba92e000}, + {0xba930000}, {0xba932000}, {0xba934000}, {0xba936000}, + {0xba938000}, {0xba93a000}, {0xba93c000}, {0xba93e000}, + {0xba940000}, {0xba942000}, {0xba944000}, {0xba946000}, + {0xba948000}, {0xba94a000}, {0xba94c000}, {0xba94e000}, + {0xba950000}, {0xba952000}, {0xba954000}, {0xba956000}, + {0xba958000}, {0xba95a000}, {0xba95c000}, {0xba95e000}, + {0xba960000}, {0xba962000}, {0xba964000}, {0xba966000}, + {0xba968000}, {0xba96a000}, {0xba96c000}, {0xba96e000}, + {0xba970000}, {0xba972000}, {0xba974000}, {0xba976000}, + {0xba978000}, {0xba97a000}, {0xba97c000}, {0xba97e000}, + {0xba980000}, {0xba982000}, {0xba984000}, {0xba986000}, + {0xba988000}, {0xba98a000}, {0xba98c000}, {0xba98e000}, + {0xba990000}, {0xba992000}, {0xba994000}, {0xba996000}, + {0xba998000}, {0xba99a000}, {0xba99c000}, {0xba99e000}, + {0xba9a0000}, {0xba9a2000}, {0xba9a4000}, {0xba9a6000}, + {0xba9a8000}, {0xba9aa000}, {0xba9ac000}, {0xba9ae000}, + {0xba9b0000}, {0xba9b2000}, {0xba9b4000}, {0xba9b6000}, + {0xba9b8000}, {0xba9ba000}, {0xba9bc000}, {0xba9be000}, + {0xba9c0000}, {0xba9c2000}, {0xba9c4000}, {0xba9c6000}, + {0xba9c8000}, {0xba9ca000}, {0xba9cc000}, {0xba9ce000}, + {0xba9d0000}, {0xba9d2000}, {0xba9d4000}, {0xba9d6000}, + {0xba9d8000}, {0xba9da000}, {0xba9dc000}, {0xba9de000}, + {0xba9e0000}, {0xba9e2000}, {0xba9e4000}, {0xba9e6000}, + {0xba9e8000}, {0xba9ea000}, {0xba9ec000}, {0xba9ee000}, + {0xba9f0000}, {0xba9f2000}, {0xba9f4000}, {0xba9f6000}, + {0xba9f8000}, {0xba9fa000}, {0xba9fc000}, {0xba9fe000}, + {0xbaa00000}, {0xbaa02000}, {0xbaa04000}, {0xbaa06000}, + {0xbaa08000}, {0xbaa0a000}, {0xbaa0c000}, {0xbaa0e000}, + {0xbaa10000}, {0xbaa12000}, {0xbaa14000}, {0xbaa16000}, + {0xbaa18000}, {0xbaa1a000}, {0xbaa1c000}, {0xbaa1e000}, + {0xbaa20000}, {0xbaa22000}, {0xbaa24000}, {0xbaa26000}, + {0xbaa28000}, {0xbaa2a000}, {0xbaa2c000}, {0xbaa2e000}, + {0xbaa30000}, {0xbaa32000}, {0xbaa34000}, {0xbaa36000}, + {0xbaa38000}, {0xbaa3a000}, {0xbaa3c000}, {0xbaa3e000}, + {0xbaa40000}, {0xbaa42000}, {0xbaa44000}, {0xbaa46000}, + {0xbaa48000}, {0xbaa4a000}, {0xbaa4c000}, {0xbaa4e000}, + {0xbaa50000}, {0xbaa52000}, {0xbaa54000}, {0xbaa56000}, + {0xbaa58000}, {0xbaa5a000}, {0xbaa5c000}, {0xbaa5e000}, + {0xbaa60000}, {0xbaa62000}, {0xbaa64000}, {0xbaa66000}, + {0xbaa68000}, {0xbaa6a000}, {0xbaa6c000}, {0xbaa6e000}, + {0xbaa70000}, {0xbaa72000}, {0xbaa74000}, {0xbaa76000}, + {0xbaa78000}, {0xbaa7a000}, {0xbaa7c000}, {0xbaa7e000}, + {0xbaa80000}, {0xbaa82000}, {0xbaa84000}, {0xbaa86000}, + {0xbaa88000}, {0xbaa8a000}, {0xbaa8c000}, {0xbaa8e000}, + {0xbaa90000}, {0xbaa92000}, {0xbaa94000}, {0xbaa96000}, + {0xbaa98000}, {0xbaa9a000}, {0xbaa9c000}, {0xbaa9e000}, + {0xbaaa0000}, {0xbaaa2000}, {0xbaaa4000}, {0xbaaa6000}, + {0xbaaa8000}, {0xbaaaa000}, {0xbaaac000}, {0xbaaae000}, + {0xbaab0000}, {0xbaab2000}, {0xbaab4000}, {0xbaab6000}, + {0xbaab8000}, {0xbaaba000}, {0xbaabc000}, {0xbaabe000}, + {0xbaac0000}, {0xbaac2000}, {0xbaac4000}, {0xbaac6000}, + {0xbaac8000}, {0xbaaca000}, {0xbaacc000}, {0xbaace000}, + {0xbaad0000}, {0xbaad2000}, {0xbaad4000}, {0xbaad6000}, + {0xbaad8000}, {0xbaada000}, {0xbaadc000}, {0xbaade000}, + {0xbaae0000}, {0xbaae2000}, {0xbaae4000}, {0xbaae6000}, + {0xbaae8000}, {0xbaaea000}, {0xbaaec000}, {0xbaaee000}, + {0xbaaf0000}, {0xbaaf2000}, {0xbaaf4000}, {0xbaaf6000}, + {0xbaaf8000}, {0xbaafa000}, {0xbaafc000}, {0xbaafe000}, + {0xbab00000}, {0xbab02000}, {0xbab04000}, {0xbab06000}, + {0xbab08000}, {0xbab0a000}, {0xbab0c000}, {0xbab0e000}, + {0xbab10000}, {0xbab12000}, {0xbab14000}, {0xbab16000}, + {0xbab18000}, {0xbab1a000}, {0xbab1c000}, {0xbab1e000}, + {0xbab20000}, {0xbab22000}, {0xbab24000}, {0xbab26000}, + {0xbab28000}, {0xbab2a000}, {0xbab2c000}, {0xbab2e000}, + {0xbab30000}, {0xbab32000}, {0xbab34000}, {0xbab36000}, + {0xbab38000}, {0xbab3a000}, {0xbab3c000}, {0xbab3e000}, + {0xbab40000}, {0xbab42000}, {0xbab44000}, {0xbab46000}, + {0xbab48000}, {0xbab4a000}, {0xbab4c000}, {0xbab4e000}, + {0xbab50000}, {0xbab52000}, {0xbab54000}, {0xbab56000}, + {0xbab58000}, {0xbab5a000}, {0xbab5c000}, {0xbab5e000}, + {0xbab60000}, {0xbab62000}, {0xbab64000}, {0xbab66000}, + {0xbab68000}, {0xbab6a000}, {0xbab6c000}, {0xbab6e000}, + {0xbab70000}, {0xbab72000}, {0xbab74000}, {0xbab76000}, + {0xbab78000}, {0xbab7a000}, {0xbab7c000}, {0xbab7e000}, + {0xbab80000}, {0xbab82000}, {0xbab84000}, {0xbab86000}, + {0xbab88000}, {0xbab8a000}, {0xbab8c000}, {0xbab8e000}, + {0xbab90000}, {0xbab92000}, {0xbab94000}, {0xbab96000}, + {0xbab98000}, {0xbab9a000}, {0xbab9c000}, {0xbab9e000}, + {0xbaba0000}, {0xbaba2000}, {0xbaba4000}, {0xbaba6000}, + {0xbaba8000}, {0xbabaa000}, {0xbabac000}, {0xbabae000}, + {0xbabb0000}, {0xbabb2000}, {0xbabb4000}, {0xbabb6000}, + {0xbabb8000}, {0xbabba000}, {0xbabbc000}, {0xbabbe000}, + {0xbabc0000}, {0xbabc2000}, {0xbabc4000}, {0xbabc6000}, + {0xbabc8000}, {0xbabca000}, {0xbabcc000}, {0xbabce000}, + {0xbabd0000}, {0xbabd2000}, {0xbabd4000}, {0xbabd6000}, + {0xbabd8000}, {0xbabda000}, {0xbabdc000}, {0xbabde000}, + {0xbabe0000}, {0xbabe2000}, {0xbabe4000}, {0xbabe6000}, + {0xbabe8000}, {0xbabea000}, {0xbabec000}, {0xbabee000}, + {0xbabf0000}, {0xbabf2000}, {0xbabf4000}, {0xbabf6000}, + {0xbabf8000}, {0xbabfa000}, {0xbabfc000}, {0xbabfe000}, + {0xbac00000}, {0xbac02000}, {0xbac04000}, {0xbac06000}, + {0xbac08000}, {0xbac0a000}, {0xbac0c000}, {0xbac0e000}, + {0xbac10000}, {0xbac12000}, {0xbac14000}, {0xbac16000}, + {0xbac18000}, {0xbac1a000}, {0xbac1c000}, {0xbac1e000}, + {0xbac20000}, {0xbac22000}, {0xbac24000}, {0xbac26000}, + {0xbac28000}, {0xbac2a000}, {0xbac2c000}, {0xbac2e000}, + {0xbac30000}, {0xbac32000}, {0xbac34000}, {0xbac36000}, + {0xbac38000}, {0xbac3a000}, {0xbac3c000}, {0xbac3e000}, + {0xbac40000}, {0xbac42000}, {0xbac44000}, {0xbac46000}, + {0xbac48000}, {0xbac4a000}, {0xbac4c000}, {0xbac4e000}, + {0xbac50000}, {0xbac52000}, {0xbac54000}, {0xbac56000}, + {0xbac58000}, {0xbac5a000}, {0xbac5c000}, {0xbac5e000}, + {0xbac60000}, {0xbac62000}, {0xbac64000}, {0xbac66000}, + {0xbac68000}, {0xbac6a000}, {0xbac6c000}, {0xbac6e000}, + {0xbac70000}, {0xbac72000}, {0xbac74000}, {0xbac76000}, + {0xbac78000}, {0xbac7a000}, {0xbac7c000}, {0xbac7e000}, + {0xbac80000}, {0xbac82000}, {0xbac84000}, {0xbac86000}, + {0xbac88000}, {0xbac8a000}, {0xbac8c000}, {0xbac8e000}, + {0xbac90000}, {0xbac92000}, {0xbac94000}, {0xbac96000}, + {0xbac98000}, {0xbac9a000}, {0xbac9c000}, {0xbac9e000}, + {0xbaca0000}, {0xbaca2000}, {0xbaca4000}, {0xbaca6000}, + {0xbaca8000}, {0xbacaa000}, {0xbacac000}, {0xbacae000}, + {0xbacb0000}, {0xbacb2000}, {0xbacb4000}, {0xbacb6000}, + {0xbacb8000}, {0xbacba000}, {0xbacbc000}, {0xbacbe000}, + {0xbacc0000}, {0xbacc2000}, {0xbacc4000}, {0xbacc6000}, + {0xbacc8000}, {0xbacca000}, {0xbaccc000}, {0xbacce000}, + {0xbacd0000}, {0xbacd2000}, {0xbacd4000}, {0xbacd6000}, + {0xbacd8000}, {0xbacda000}, {0xbacdc000}, {0xbacde000}, + {0xbace0000}, {0xbace2000}, {0xbace4000}, {0xbace6000}, + {0xbace8000}, {0xbacea000}, {0xbacec000}, {0xbacee000}, + {0xbacf0000}, {0xbacf2000}, {0xbacf4000}, {0xbacf6000}, + {0xbacf8000}, {0xbacfa000}, {0xbacfc000}, {0xbacfe000}, + {0xbad00000}, {0xbad02000}, {0xbad04000}, {0xbad06000}, + {0xbad08000}, {0xbad0a000}, {0xbad0c000}, {0xbad0e000}, + {0xbad10000}, {0xbad12000}, {0xbad14000}, {0xbad16000}, + {0xbad18000}, {0xbad1a000}, {0xbad1c000}, {0xbad1e000}, + {0xbad20000}, {0xbad22000}, {0xbad24000}, {0xbad26000}, + {0xbad28000}, {0xbad2a000}, {0xbad2c000}, {0xbad2e000}, + {0xbad30000}, {0xbad32000}, {0xbad34000}, {0xbad36000}, + {0xbad38000}, {0xbad3a000}, {0xbad3c000}, {0xbad3e000}, + {0xbad40000}, {0xbad42000}, {0xbad44000}, {0xbad46000}, + {0xbad48000}, {0xbad4a000}, {0xbad4c000}, {0xbad4e000}, + {0xbad50000}, {0xbad52000}, {0xbad54000}, {0xbad56000}, + {0xbad58000}, {0xbad5a000}, {0xbad5c000}, {0xbad5e000}, + {0xbad60000}, {0xbad62000}, {0xbad64000}, {0xbad66000}, + {0xbad68000}, {0xbad6a000}, {0xbad6c000}, {0xbad6e000}, + {0xbad70000}, {0xbad72000}, {0xbad74000}, {0xbad76000}, + {0xbad78000}, {0xbad7a000}, {0xbad7c000}, {0xbad7e000}, + {0xbad80000}, {0xbad82000}, {0xbad84000}, {0xbad86000}, + {0xbad88000}, {0xbad8a000}, {0xbad8c000}, {0xbad8e000}, + {0xbad90000}, {0xbad92000}, {0xbad94000}, {0xbad96000}, + {0xbad98000}, {0xbad9a000}, {0xbad9c000}, {0xbad9e000}, + {0xbada0000}, {0xbada2000}, {0xbada4000}, {0xbada6000}, + {0xbada8000}, {0xbadaa000}, {0xbadac000}, {0xbadae000}, + {0xbadb0000}, {0xbadb2000}, {0xbadb4000}, {0xbadb6000}, + {0xbadb8000}, {0xbadba000}, {0xbadbc000}, {0xbadbe000}, + {0xbadc0000}, {0xbadc2000}, {0xbadc4000}, {0xbadc6000}, + {0xbadc8000}, {0xbadca000}, {0xbadcc000}, {0xbadce000}, + {0xbadd0000}, {0xbadd2000}, {0xbadd4000}, {0xbadd6000}, + {0xbadd8000}, {0xbadda000}, {0xbaddc000}, {0xbadde000}, + {0xbade0000}, {0xbade2000}, {0xbade4000}, {0xbade6000}, + {0xbade8000}, {0xbadea000}, {0xbadec000}, {0xbadee000}, + {0xbadf0000}, {0xbadf2000}, {0xbadf4000}, {0xbadf6000}, + {0xbadf8000}, {0xbadfa000}, {0xbadfc000}, {0xbadfe000}, + {0xbae00000}, {0xbae02000}, {0xbae04000}, {0xbae06000}, + {0xbae08000}, {0xbae0a000}, {0xbae0c000}, {0xbae0e000}, + {0xbae10000}, {0xbae12000}, {0xbae14000}, {0xbae16000}, + {0xbae18000}, {0xbae1a000}, {0xbae1c000}, {0xbae1e000}, + {0xbae20000}, {0xbae22000}, {0xbae24000}, {0xbae26000}, + {0xbae28000}, {0xbae2a000}, {0xbae2c000}, {0xbae2e000}, + {0xbae30000}, {0xbae32000}, {0xbae34000}, {0xbae36000}, + {0xbae38000}, {0xbae3a000}, {0xbae3c000}, {0xbae3e000}, + {0xbae40000}, {0xbae42000}, {0xbae44000}, {0xbae46000}, + {0xbae48000}, {0xbae4a000}, {0xbae4c000}, {0xbae4e000}, + {0xbae50000}, {0xbae52000}, {0xbae54000}, {0xbae56000}, + {0xbae58000}, {0xbae5a000}, {0xbae5c000}, {0xbae5e000}, + {0xbae60000}, {0xbae62000}, {0xbae64000}, {0xbae66000}, + {0xbae68000}, {0xbae6a000}, {0xbae6c000}, {0xbae6e000}, + {0xbae70000}, {0xbae72000}, {0xbae74000}, {0xbae76000}, + {0xbae78000}, {0xbae7a000}, {0xbae7c000}, {0xbae7e000}, + {0xbae80000}, {0xbae82000}, {0xbae84000}, {0xbae86000}, + {0xbae88000}, {0xbae8a000}, {0xbae8c000}, {0xbae8e000}, + {0xbae90000}, {0xbae92000}, {0xbae94000}, {0xbae96000}, + {0xbae98000}, {0xbae9a000}, {0xbae9c000}, {0xbae9e000}, + {0xbaea0000}, {0xbaea2000}, {0xbaea4000}, {0xbaea6000}, + {0xbaea8000}, {0xbaeaa000}, {0xbaeac000}, {0xbaeae000}, + {0xbaeb0000}, {0xbaeb2000}, {0xbaeb4000}, {0xbaeb6000}, + {0xbaeb8000}, {0xbaeba000}, {0xbaebc000}, {0xbaebe000}, + {0xbaec0000}, {0xbaec2000}, {0xbaec4000}, {0xbaec6000}, + {0xbaec8000}, {0xbaeca000}, {0xbaecc000}, {0xbaece000}, + {0xbaed0000}, {0xbaed2000}, {0xbaed4000}, {0xbaed6000}, + {0xbaed8000}, {0xbaeda000}, {0xbaedc000}, {0xbaede000}, + {0xbaee0000}, {0xbaee2000}, {0xbaee4000}, {0xbaee6000}, + {0xbaee8000}, {0xbaeea000}, {0xbaeec000}, {0xbaeee000}, + {0xbaef0000}, {0xbaef2000}, {0xbaef4000}, {0xbaef6000}, + {0xbaef8000}, {0xbaefa000}, {0xbaefc000}, {0xbaefe000}, + {0xbaf00000}, {0xbaf02000}, {0xbaf04000}, {0xbaf06000}, + {0xbaf08000}, {0xbaf0a000}, {0xbaf0c000}, {0xbaf0e000}, + {0xbaf10000}, {0xbaf12000}, {0xbaf14000}, {0xbaf16000}, + {0xbaf18000}, {0xbaf1a000}, {0xbaf1c000}, {0xbaf1e000}, + {0xbaf20000}, {0xbaf22000}, {0xbaf24000}, {0xbaf26000}, + {0xbaf28000}, {0xbaf2a000}, {0xbaf2c000}, {0xbaf2e000}, + {0xbaf30000}, {0xbaf32000}, {0xbaf34000}, {0xbaf36000}, + {0xbaf38000}, {0xbaf3a000}, {0xbaf3c000}, {0xbaf3e000}, + {0xbaf40000}, {0xbaf42000}, {0xbaf44000}, {0xbaf46000}, + {0xbaf48000}, {0xbaf4a000}, {0xbaf4c000}, {0xbaf4e000}, + {0xbaf50000}, {0xbaf52000}, {0xbaf54000}, {0xbaf56000}, + {0xbaf58000}, {0xbaf5a000}, {0xbaf5c000}, {0xbaf5e000}, + {0xbaf60000}, {0xbaf62000}, {0xbaf64000}, {0xbaf66000}, + {0xbaf68000}, {0xbaf6a000}, {0xbaf6c000}, {0xbaf6e000}, + {0xbaf70000}, {0xbaf72000}, {0xbaf74000}, {0xbaf76000}, + {0xbaf78000}, {0xbaf7a000}, {0xbaf7c000}, {0xbaf7e000}, + {0xbaf80000}, {0xbaf82000}, {0xbaf84000}, {0xbaf86000}, + {0xbaf88000}, {0xbaf8a000}, {0xbaf8c000}, {0xbaf8e000}, + {0xbaf90000}, {0xbaf92000}, {0xbaf94000}, {0xbaf96000}, + {0xbaf98000}, {0xbaf9a000}, {0xbaf9c000}, {0xbaf9e000}, + {0xbafa0000}, {0xbafa2000}, {0xbafa4000}, {0xbafa6000}, + {0xbafa8000}, {0xbafaa000}, {0xbafac000}, {0xbafae000}, + {0xbafb0000}, {0xbafb2000}, {0xbafb4000}, {0xbafb6000}, + {0xbafb8000}, {0xbafba000}, {0xbafbc000}, {0xbafbe000}, + {0xbafc0000}, {0xbafc2000}, {0xbafc4000}, {0xbafc6000}, + {0xbafc8000}, {0xbafca000}, {0xbafcc000}, {0xbafce000}, + {0xbafd0000}, {0xbafd2000}, {0xbafd4000}, {0xbafd6000}, + {0xbafd8000}, {0xbafda000}, {0xbafdc000}, {0xbafde000}, + {0xbafe0000}, {0xbafe2000}, {0xbafe4000}, {0xbafe6000}, + {0xbafe8000}, {0xbafea000}, {0xbafec000}, {0xbafee000}, + {0xbaff0000}, {0xbaff2000}, {0xbaff4000}, {0xbaff6000}, + {0xbaff8000}, {0xbaffa000}, {0xbaffc000}, {0xbaffe000}, + {0xbb000000}, {0xbb002000}, {0xbb004000}, {0xbb006000}, + {0xbb008000}, {0xbb00a000}, {0xbb00c000}, {0xbb00e000}, + {0xbb010000}, {0xbb012000}, {0xbb014000}, {0xbb016000}, + {0xbb018000}, {0xbb01a000}, {0xbb01c000}, {0xbb01e000}, + {0xbb020000}, {0xbb022000}, {0xbb024000}, {0xbb026000}, + {0xbb028000}, {0xbb02a000}, {0xbb02c000}, {0xbb02e000}, + {0xbb030000}, {0xbb032000}, {0xbb034000}, {0xbb036000}, + {0xbb038000}, {0xbb03a000}, {0xbb03c000}, {0xbb03e000}, + {0xbb040000}, {0xbb042000}, {0xbb044000}, {0xbb046000}, + {0xbb048000}, {0xbb04a000}, {0xbb04c000}, {0xbb04e000}, + {0xbb050000}, {0xbb052000}, {0xbb054000}, {0xbb056000}, + {0xbb058000}, {0xbb05a000}, {0xbb05c000}, {0xbb05e000}, + {0xbb060000}, {0xbb062000}, {0xbb064000}, {0xbb066000}, + {0xbb068000}, {0xbb06a000}, {0xbb06c000}, {0xbb06e000}, + {0xbb070000}, {0xbb072000}, {0xbb074000}, {0xbb076000}, + {0xbb078000}, {0xbb07a000}, {0xbb07c000}, {0xbb07e000}, + {0xbb080000}, {0xbb082000}, {0xbb084000}, {0xbb086000}, + {0xbb088000}, {0xbb08a000}, {0xbb08c000}, {0xbb08e000}, + {0xbb090000}, {0xbb092000}, {0xbb094000}, {0xbb096000}, + {0xbb098000}, {0xbb09a000}, {0xbb09c000}, {0xbb09e000}, + {0xbb0a0000}, {0xbb0a2000}, {0xbb0a4000}, {0xbb0a6000}, + {0xbb0a8000}, {0xbb0aa000}, {0xbb0ac000}, {0xbb0ae000}, + {0xbb0b0000}, {0xbb0b2000}, {0xbb0b4000}, {0xbb0b6000}, + {0xbb0b8000}, {0xbb0ba000}, {0xbb0bc000}, {0xbb0be000}, + {0xbb0c0000}, {0xbb0c2000}, {0xbb0c4000}, {0xbb0c6000}, + {0xbb0c8000}, {0xbb0ca000}, {0xbb0cc000}, {0xbb0ce000}, + {0xbb0d0000}, {0xbb0d2000}, {0xbb0d4000}, {0xbb0d6000}, + {0xbb0d8000}, {0xbb0da000}, {0xbb0dc000}, {0xbb0de000}, + {0xbb0e0000}, {0xbb0e2000}, {0xbb0e4000}, {0xbb0e6000}, + {0xbb0e8000}, {0xbb0ea000}, {0xbb0ec000}, {0xbb0ee000}, + {0xbb0f0000}, {0xbb0f2000}, {0xbb0f4000}, {0xbb0f6000}, + {0xbb0f8000}, {0xbb0fa000}, {0xbb0fc000}, {0xbb0fe000}, + {0xbb100000}, {0xbb102000}, {0xbb104000}, {0xbb106000}, + {0xbb108000}, {0xbb10a000}, {0xbb10c000}, {0xbb10e000}, + {0xbb110000}, {0xbb112000}, {0xbb114000}, {0xbb116000}, + {0xbb118000}, {0xbb11a000}, {0xbb11c000}, {0xbb11e000}, + {0xbb120000}, {0xbb122000}, {0xbb124000}, {0xbb126000}, + {0xbb128000}, {0xbb12a000}, {0xbb12c000}, {0xbb12e000}, + {0xbb130000}, {0xbb132000}, {0xbb134000}, {0xbb136000}, + {0xbb138000}, {0xbb13a000}, {0xbb13c000}, {0xbb13e000}, + {0xbb140000}, {0xbb142000}, {0xbb144000}, {0xbb146000}, + {0xbb148000}, {0xbb14a000}, {0xbb14c000}, {0xbb14e000}, + {0xbb150000}, {0xbb152000}, {0xbb154000}, {0xbb156000}, + {0xbb158000}, {0xbb15a000}, {0xbb15c000}, {0xbb15e000}, + {0xbb160000}, {0xbb162000}, {0xbb164000}, {0xbb166000}, + {0xbb168000}, {0xbb16a000}, {0xbb16c000}, {0xbb16e000}, + {0xbb170000}, {0xbb172000}, {0xbb174000}, {0xbb176000}, + {0xbb178000}, {0xbb17a000}, {0xbb17c000}, {0xbb17e000}, + {0xbb180000}, {0xbb182000}, {0xbb184000}, {0xbb186000}, + {0xbb188000}, {0xbb18a000}, {0xbb18c000}, {0xbb18e000}, + {0xbb190000}, {0xbb192000}, {0xbb194000}, {0xbb196000}, + {0xbb198000}, {0xbb19a000}, {0xbb19c000}, {0xbb19e000}, + {0xbb1a0000}, {0xbb1a2000}, {0xbb1a4000}, {0xbb1a6000}, + {0xbb1a8000}, {0xbb1aa000}, {0xbb1ac000}, {0xbb1ae000}, + {0xbb1b0000}, {0xbb1b2000}, {0xbb1b4000}, {0xbb1b6000}, + {0xbb1b8000}, {0xbb1ba000}, {0xbb1bc000}, {0xbb1be000}, + {0xbb1c0000}, {0xbb1c2000}, {0xbb1c4000}, {0xbb1c6000}, + {0xbb1c8000}, {0xbb1ca000}, {0xbb1cc000}, {0xbb1ce000}, + {0xbb1d0000}, {0xbb1d2000}, {0xbb1d4000}, {0xbb1d6000}, + {0xbb1d8000}, {0xbb1da000}, {0xbb1dc000}, {0xbb1de000}, + {0xbb1e0000}, {0xbb1e2000}, {0xbb1e4000}, {0xbb1e6000}, + {0xbb1e8000}, {0xbb1ea000}, {0xbb1ec000}, {0xbb1ee000}, + {0xbb1f0000}, {0xbb1f2000}, {0xbb1f4000}, {0xbb1f6000}, + {0xbb1f8000}, {0xbb1fa000}, {0xbb1fc000}, {0xbb1fe000}, + {0xbb200000}, {0xbb202000}, {0xbb204000}, {0xbb206000}, + {0xbb208000}, {0xbb20a000}, {0xbb20c000}, {0xbb20e000}, + {0xbb210000}, {0xbb212000}, {0xbb214000}, {0xbb216000}, + {0xbb218000}, {0xbb21a000}, {0xbb21c000}, {0xbb21e000}, + {0xbb220000}, {0xbb222000}, {0xbb224000}, {0xbb226000}, + {0xbb228000}, {0xbb22a000}, {0xbb22c000}, {0xbb22e000}, + {0xbb230000}, {0xbb232000}, {0xbb234000}, {0xbb236000}, + {0xbb238000}, {0xbb23a000}, {0xbb23c000}, {0xbb23e000}, + {0xbb240000}, {0xbb242000}, {0xbb244000}, {0xbb246000}, + {0xbb248000}, {0xbb24a000}, {0xbb24c000}, {0xbb24e000}, + {0xbb250000}, {0xbb252000}, {0xbb254000}, {0xbb256000}, + {0xbb258000}, {0xbb25a000}, {0xbb25c000}, {0xbb25e000}, + {0xbb260000}, {0xbb262000}, {0xbb264000}, {0xbb266000}, + {0xbb268000}, {0xbb26a000}, {0xbb26c000}, {0xbb26e000}, + {0xbb270000}, {0xbb272000}, {0xbb274000}, {0xbb276000}, + {0xbb278000}, {0xbb27a000}, {0xbb27c000}, {0xbb27e000}, + {0xbb280000}, {0xbb282000}, {0xbb284000}, {0xbb286000}, + {0xbb288000}, {0xbb28a000}, {0xbb28c000}, {0xbb28e000}, + {0xbb290000}, {0xbb292000}, {0xbb294000}, {0xbb296000}, + {0xbb298000}, {0xbb29a000}, {0xbb29c000}, {0xbb29e000}, + {0xbb2a0000}, {0xbb2a2000}, {0xbb2a4000}, {0xbb2a6000}, + {0xbb2a8000}, {0xbb2aa000}, {0xbb2ac000}, {0xbb2ae000}, + {0xbb2b0000}, {0xbb2b2000}, {0xbb2b4000}, {0xbb2b6000}, + {0xbb2b8000}, {0xbb2ba000}, {0xbb2bc000}, {0xbb2be000}, + {0xbb2c0000}, {0xbb2c2000}, {0xbb2c4000}, {0xbb2c6000}, + {0xbb2c8000}, {0xbb2ca000}, {0xbb2cc000}, {0xbb2ce000}, + {0xbb2d0000}, {0xbb2d2000}, {0xbb2d4000}, {0xbb2d6000}, + {0xbb2d8000}, {0xbb2da000}, {0xbb2dc000}, {0xbb2de000}, + {0xbb2e0000}, {0xbb2e2000}, {0xbb2e4000}, {0xbb2e6000}, + {0xbb2e8000}, {0xbb2ea000}, {0xbb2ec000}, {0xbb2ee000}, + {0xbb2f0000}, {0xbb2f2000}, {0xbb2f4000}, {0xbb2f6000}, + {0xbb2f8000}, {0xbb2fa000}, {0xbb2fc000}, {0xbb2fe000}, + {0xbb300000}, {0xbb302000}, {0xbb304000}, {0xbb306000}, + {0xbb308000}, {0xbb30a000}, {0xbb30c000}, {0xbb30e000}, + {0xbb310000}, {0xbb312000}, {0xbb314000}, {0xbb316000}, + {0xbb318000}, {0xbb31a000}, {0xbb31c000}, {0xbb31e000}, + {0xbb320000}, {0xbb322000}, {0xbb324000}, {0xbb326000}, + {0xbb328000}, {0xbb32a000}, {0xbb32c000}, {0xbb32e000}, + {0xbb330000}, {0xbb332000}, {0xbb334000}, {0xbb336000}, + {0xbb338000}, {0xbb33a000}, {0xbb33c000}, {0xbb33e000}, + {0xbb340000}, {0xbb342000}, {0xbb344000}, {0xbb346000}, + {0xbb348000}, {0xbb34a000}, {0xbb34c000}, {0xbb34e000}, + {0xbb350000}, {0xbb352000}, {0xbb354000}, {0xbb356000}, + {0xbb358000}, {0xbb35a000}, {0xbb35c000}, {0xbb35e000}, + {0xbb360000}, {0xbb362000}, {0xbb364000}, {0xbb366000}, + {0xbb368000}, {0xbb36a000}, {0xbb36c000}, {0xbb36e000}, + {0xbb370000}, {0xbb372000}, {0xbb374000}, {0xbb376000}, + {0xbb378000}, {0xbb37a000}, {0xbb37c000}, {0xbb37e000}, + {0xbb380000}, {0xbb382000}, {0xbb384000}, {0xbb386000}, + {0xbb388000}, {0xbb38a000}, {0xbb38c000}, {0xbb38e000}, + {0xbb390000}, {0xbb392000}, {0xbb394000}, {0xbb396000}, + {0xbb398000}, {0xbb39a000}, {0xbb39c000}, {0xbb39e000}, + {0xbb3a0000}, {0xbb3a2000}, {0xbb3a4000}, {0xbb3a6000}, + {0xbb3a8000}, {0xbb3aa000}, {0xbb3ac000}, {0xbb3ae000}, + {0xbb3b0000}, {0xbb3b2000}, {0xbb3b4000}, {0xbb3b6000}, + {0xbb3b8000}, {0xbb3ba000}, {0xbb3bc000}, {0xbb3be000}, + {0xbb3c0000}, {0xbb3c2000}, {0xbb3c4000}, {0xbb3c6000}, + {0xbb3c8000}, {0xbb3ca000}, {0xbb3cc000}, {0xbb3ce000}, + {0xbb3d0000}, {0xbb3d2000}, {0xbb3d4000}, {0xbb3d6000}, + {0xbb3d8000}, {0xbb3da000}, {0xbb3dc000}, {0xbb3de000}, + {0xbb3e0000}, {0xbb3e2000}, {0xbb3e4000}, {0xbb3e6000}, + {0xbb3e8000}, {0xbb3ea000}, {0xbb3ec000}, {0xbb3ee000}, + {0xbb3f0000}, {0xbb3f2000}, {0xbb3f4000}, {0xbb3f6000}, + {0xbb3f8000}, {0xbb3fa000}, {0xbb3fc000}, {0xbb3fe000}, + {0xbb400000}, {0xbb402000}, {0xbb404000}, {0xbb406000}, + {0xbb408000}, {0xbb40a000}, {0xbb40c000}, {0xbb40e000}, + {0xbb410000}, {0xbb412000}, {0xbb414000}, {0xbb416000}, + {0xbb418000}, {0xbb41a000}, {0xbb41c000}, {0xbb41e000}, + {0xbb420000}, {0xbb422000}, {0xbb424000}, {0xbb426000}, + {0xbb428000}, {0xbb42a000}, {0xbb42c000}, {0xbb42e000}, + {0xbb430000}, {0xbb432000}, {0xbb434000}, {0xbb436000}, + {0xbb438000}, {0xbb43a000}, {0xbb43c000}, {0xbb43e000}, + {0xbb440000}, {0xbb442000}, {0xbb444000}, {0xbb446000}, + {0xbb448000}, {0xbb44a000}, {0xbb44c000}, {0xbb44e000}, + {0xbb450000}, {0xbb452000}, {0xbb454000}, {0xbb456000}, + {0xbb458000}, {0xbb45a000}, {0xbb45c000}, {0xbb45e000}, + {0xbb460000}, {0xbb462000}, {0xbb464000}, {0xbb466000}, + {0xbb468000}, {0xbb46a000}, {0xbb46c000}, {0xbb46e000}, + {0xbb470000}, {0xbb472000}, {0xbb474000}, {0xbb476000}, + {0xbb478000}, {0xbb47a000}, {0xbb47c000}, {0xbb47e000}, + {0xbb480000}, {0xbb482000}, {0xbb484000}, {0xbb486000}, + {0xbb488000}, {0xbb48a000}, {0xbb48c000}, {0xbb48e000}, + {0xbb490000}, {0xbb492000}, {0xbb494000}, {0xbb496000}, + {0xbb498000}, {0xbb49a000}, {0xbb49c000}, {0xbb49e000}, + {0xbb4a0000}, {0xbb4a2000}, {0xbb4a4000}, {0xbb4a6000}, + {0xbb4a8000}, {0xbb4aa000}, {0xbb4ac000}, {0xbb4ae000}, + {0xbb4b0000}, {0xbb4b2000}, {0xbb4b4000}, {0xbb4b6000}, + {0xbb4b8000}, {0xbb4ba000}, {0xbb4bc000}, {0xbb4be000}, + {0xbb4c0000}, {0xbb4c2000}, {0xbb4c4000}, {0xbb4c6000}, + {0xbb4c8000}, {0xbb4ca000}, {0xbb4cc000}, {0xbb4ce000}, + {0xbb4d0000}, {0xbb4d2000}, {0xbb4d4000}, {0xbb4d6000}, + {0xbb4d8000}, {0xbb4da000}, {0xbb4dc000}, {0xbb4de000}, + {0xbb4e0000}, {0xbb4e2000}, {0xbb4e4000}, {0xbb4e6000}, + {0xbb4e8000}, {0xbb4ea000}, {0xbb4ec000}, {0xbb4ee000}, + {0xbb4f0000}, {0xbb4f2000}, {0xbb4f4000}, {0xbb4f6000}, + {0xbb4f8000}, {0xbb4fa000}, {0xbb4fc000}, {0xbb4fe000}, + {0xbb500000}, {0xbb502000}, {0xbb504000}, {0xbb506000}, + {0xbb508000}, {0xbb50a000}, {0xbb50c000}, {0xbb50e000}, + {0xbb510000}, {0xbb512000}, {0xbb514000}, {0xbb516000}, + {0xbb518000}, {0xbb51a000}, {0xbb51c000}, {0xbb51e000}, + {0xbb520000}, {0xbb522000}, {0xbb524000}, {0xbb526000}, + {0xbb528000}, {0xbb52a000}, {0xbb52c000}, {0xbb52e000}, + {0xbb530000}, {0xbb532000}, {0xbb534000}, {0xbb536000}, + {0xbb538000}, {0xbb53a000}, {0xbb53c000}, {0xbb53e000}, + {0xbb540000}, {0xbb542000}, {0xbb544000}, {0xbb546000}, + {0xbb548000}, {0xbb54a000}, {0xbb54c000}, {0xbb54e000}, + {0xbb550000}, {0xbb552000}, {0xbb554000}, {0xbb556000}, + {0xbb558000}, {0xbb55a000}, {0xbb55c000}, {0xbb55e000}, + {0xbb560000}, {0xbb562000}, {0xbb564000}, {0xbb566000}, + {0xbb568000}, {0xbb56a000}, {0xbb56c000}, {0xbb56e000}, + {0xbb570000}, {0xbb572000}, {0xbb574000}, {0xbb576000}, + {0xbb578000}, {0xbb57a000}, {0xbb57c000}, {0xbb57e000}, + {0xbb580000}, {0xbb582000}, {0xbb584000}, {0xbb586000}, + {0xbb588000}, {0xbb58a000}, {0xbb58c000}, {0xbb58e000}, + {0xbb590000}, {0xbb592000}, {0xbb594000}, {0xbb596000}, + {0xbb598000}, {0xbb59a000}, {0xbb59c000}, {0xbb59e000}, + {0xbb5a0000}, {0xbb5a2000}, {0xbb5a4000}, {0xbb5a6000}, + {0xbb5a8000}, {0xbb5aa000}, {0xbb5ac000}, {0xbb5ae000}, + {0xbb5b0000}, {0xbb5b2000}, {0xbb5b4000}, {0xbb5b6000}, + {0xbb5b8000}, {0xbb5ba000}, {0xbb5bc000}, {0xbb5be000}, + {0xbb5c0000}, {0xbb5c2000}, {0xbb5c4000}, {0xbb5c6000}, + {0xbb5c8000}, {0xbb5ca000}, {0xbb5cc000}, {0xbb5ce000}, + {0xbb5d0000}, {0xbb5d2000}, {0xbb5d4000}, {0xbb5d6000}, + {0xbb5d8000}, {0xbb5da000}, {0xbb5dc000}, {0xbb5de000}, + {0xbb5e0000}, {0xbb5e2000}, {0xbb5e4000}, {0xbb5e6000}, + {0xbb5e8000}, {0xbb5ea000}, {0xbb5ec000}, {0xbb5ee000}, + {0xbb5f0000}, {0xbb5f2000}, {0xbb5f4000}, {0xbb5f6000}, + {0xbb5f8000}, {0xbb5fa000}, {0xbb5fc000}, {0xbb5fe000}, + {0xbb600000}, {0xbb602000}, {0xbb604000}, {0xbb606000}, + {0xbb608000}, {0xbb60a000}, {0xbb60c000}, {0xbb60e000}, + {0xbb610000}, {0xbb612000}, {0xbb614000}, {0xbb616000}, + {0xbb618000}, {0xbb61a000}, {0xbb61c000}, {0xbb61e000}, + {0xbb620000}, {0xbb622000}, {0xbb624000}, {0xbb626000}, + {0xbb628000}, {0xbb62a000}, {0xbb62c000}, {0xbb62e000}, + {0xbb630000}, {0xbb632000}, {0xbb634000}, {0xbb636000}, + {0xbb638000}, {0xbb63a000}, {0xbb63c000}, {0xbb63e000}, + {0xbb640000}, {0xbb642000}, {0xbb644000}, {0xbb646000}, + {0xbb648000}, {0xbb64a000}, {0xbb64c000}, {0xbb64e000}, + {0xbb650000}, {0xbb652000}, {0xbb654000}, {0xbb656000}, + {0xbb658000}, {0xbb65a000}, {0xbb65c000}, {0xbb65e000}, + {0xbb660000}, {0xbb662000}, {0xbb664000}, {0xbb666000}, + {0xbb668000}, {0xbb66a000}, {0xbb66c000}, {0xbb66e000}, + {0xbb670000}, {0xbb672000}, {0xbb674000}, {0xbb676000}, + {0xbb678000}, {0xbb67a000}, {0xbb67c000}, {0xbb67e000}, + {0xbb680000}, {0xbb682000}, {0xbb684000}, {0xbb686000}, + {0xbb688000}, {0xbb68a000}, {0xbb68c000}, {0xbb68e000}, + {0xbb690000}, {0xbb692000}, {0xbb694000}, {0xbb696000}, + {0xbb698000}, {0xbb69a000}, {0xbb69c000}, {0xbb69e000}, + {0xbb6a0000}, {0xbb6a2000}, {0xbb6a4000}, {0xbb6a6000}, + {0xbb6a8000}, {0xbb6aa000}, {0xbb6ac000}, {0xbb6ae000}, + {0xbb6b0000}, {0xbb6b2000}, {0xbb6b4000}, {0xbb6b6000}, + {0xbb6b8000}, {0xbb6ba000}, {0xbb6bc000}, {0xbb6be000}, + {0xbb6c0000}, {0xbb6c2000}, {0xbb6c4000}, {0xbb6c6000}, + {0xbb6c8000}, {0xbb6ca000}, {0xbb6cc000}, {0xbb6ce000}, + {0xbb6d0000}, {0xbb6d2000}, {0xbb6d4000}, {0xbb6d6000}, + {0xbb6d8000}, {0xbb6da000}, {0xbb6dc000}, {0xbb6de000}, + {0xbb6e0000}, {0xbb6e2000}, {0xbb6e4000}, {0xbb6e6000}, + {0xbb6e8000}, {0xbb6ea000}, {0xbb6ec000}, {0xbb6ee000}, + {0xbb6f0000}, {0xbb6f2000}, {0xbb6f4000}, {0xbb6f6000}, + {0xbb6f8000}, {0xbb6fa000}, {0xbb6fc000}, {0xbb6fe000}, + {0xbb700000}, {0xbb702000}, {0xbb704000}, {0xbb706000}, + {0xbb708000}, {0xbb70a000}, {0xbb70c000}, {0xbb70e000}, + {0xbb710000}, {0xbb712000}, {0xbb714000}, {0xbb716000}, + {0xbb718000}, {0xbb71a000}, {0xbb71c000}, {0xbb71e000}, + {0xbb720000}, {0xbb722000}, {0xbb724000}, {0xbb726000}, + {0xbb728000}, {0xbb72a000}, {0xbb72c000}, {0xbb72e000}, + {0xbb730000}, {0xbb732000}, {0xbb734000}, {0xbb736000}, + {0xbb738000}, {0xbb73a000}, {0xbb73c000}, {0xbb73e000}, + {0xbb740000}, {0xbb742000}, {0xbb744000}, {0xbb746000}, + {0xbb748000}, {0xbb74a000}, {0xbb74c000}, {0xbb74e000}, + {0xbb750000}, {0xbb752000}, {0xbb754000}, {0xbb756000}, + {0xbb758000}, {0xbb75a000}, {0xbb75c000}, {0xbb75e000}, + {0xbb760000}, {0xbb762000}, {0xbb764000}, {0xbb766000}, + {0xbb768000}, {0xbb76a000}, {0xbb76c000}, {0xbb76e000}, + {0xbb770000}, {0xbb772000}, {0xbb774000}, {0xbb776000}, + {0xbb778000}, {0xbb77a000}, {0xbb77c000}, {0xbb77e000}, + {0xbb780000}, {0xbb782000}, {0xbb784000}, {0xbb786000}, + {0xbb788000}, {0xbb78a000}, {0xbb78c000}, {0xbb78e000}, + {0xbb790000}, {0xbb792000}, {0xbb794000}, {0xbb796000}, + {0xbb798000}, {0xbb79a000}, {0xbb79c000}, {0xbb79e000}, + {0xbb7a0000}, {0xbb7a2000}, {0xbb7a4000}, {0xbb7a6000}, + {0xbb7a8000}, {0xbb7aa000}, {0xbb7ac000}, {0xbb7ae000}, + {0xbb7b0000}, {0xbb7b2000}, {0xbb7b4000}, {0xbb7b6000}, + {0xbb7b8000}, {0xbb7ba000}, {0xbb7bc000}, {0xbb7be000}, + {0xbb7c0000}, {0xbb7c2000}, {0xbb7c4000}, {0xbb7c6000}, + {0xbb7c8000}, {0xbb7ca000}, {0xbb7cc000}, {0xbb7ce000}, + {0xbb7d0000}, {0xbb7d2000}, {0xbb7d4000}, {0xbb7d6000}, + {0xbb7d8000}, {0xbb7da000}, {0xbb7dc000}, {0xbb7de000}, + {0xbb7e0000}, {0xbb7e2000}, {0xbb7e4000}, {0xbb7e6000}, + {0xbb7e8000}, {0xbb7ea000}, {0xbb7ec000}, {0xbb7ee000}, + {0xbb7f0000}, {0xbb7f2000}, {0xbb7f4000}, {0xbb7f6000}, + {0xbb7f8000}, {0xbb7fa000}, {0xbb7fc000}, {0xbb7fe000}, + {0xbb800000}, {0xbb802000}, {0xbb804000}, {0xbb806000}, + {0xbb808000}, {0xbb80a000}, {0xbb80c000}, {0xbb80e000}, + {0xbb810000}, {0xbb812000}, {0xbb814000}, {0xbb816000}, + {0xbb818000}, {0xbb81a000}, {0xbb81c000}, {0xbb81e000}, + {0xbb820000}, {0xbb822000}, {0xbb824000}, {0xbb826000}, + {0xbb828000}, {0xbb82a000}, {0xbb82c000}, {0xbb82e000}, + {0xbb830000}, {0xbb832000}, {0xbb834000}, {0xbb836000}, + {0xbb838000}, {0xbb83a000}, {0xbb83c000}, {0xbb83e000}, + {0xbb840000}, {0xbb842000}, {0xbb844000}, {0xbb846000}, + {0xbb848000}, {0xbb84a000}, {0xbb84c000}, {0xbb84e000}, + {0xbb850000}, {0xbb852000}, {0xbb854000}, {0xbb856000}, + {0xbb858000}, {0xbb85a000}, {0xbb85c000}, {0xbb85e000}, + {0xbb860000}, {0xbb862000}, {0xbb864000}, {0xbb866000}, + {0xbb868000}, {0xbb86a000}, {0xbb86c000}, {0xbb86e000}, + {0xbb870000}, {0xbb872000}, {0xbb874000}, {0xbb876000}, + {0xbb878000}, {0xbb87a000}, {0xbb87c000}, {0xbb87e000}, + {0xbb880000}, {0xbb882000}, {0xbb884000}, {0xbb886000}, + {0xbb888000}, {0xbb88a000}, {0xbb88c000}, {0xbb88e000}, + {0xbb890000}, {0xbb892000}, {0xbb894000}, {0xbb896000}, + {0xbb898000}, {0xbb89a000}, {0xbb89c000}, {0xbb89e000}, + {0xbb8a0000}, {0xbb8a2000}, {0xbb8a4000}, {0xbb8a6000}, + {0xbb8a8000}, {0xbb8aa000}, {0xbb8ac000}, {0xbb8ae000}, + {0xbb8b0000}, {0xbb8b2000}, {0xbb8b4000}, {0xbb8b6000}, + {0xbb8b8000}, {0xbb8ba000}, {0xbb8bc000}, {0xbb8be000}, + {0xbb8c0000}, {0xbb8c2000}, {0xbb8c4000}, {0xbb8c6000}, + {0xbb8c8000}, {0xbb8ca000}, {0xbb8cc000}, {0xbb8ce000}, + {0xbb8d0000}, {0xbb8d2000}, {0xbb8d4000}, {0xbb8d6000}, + {0xbb8d8000}, {0xbb8da000}, {0xbb8dc000}, {0xbb8de000}, + {0xbb8e0000}, {0xbb8e2000}, {0xbb8e4000}, {0xbb8e6000}, + {0xbb8e8000}, {0xbb8ea000}, {0xbb8ec000}, {0xbb8ee000}, + {0xbb8f0000}, {0xbb8f2000}, {0xbb8f4000}, {0xbb8f6000}, + {0xbb8f8000}, {0xbb8fa000}, {0xbb8fc000}, {0xbb8fe000}, + {0xbb900000}, {0xbb902000}, {0xbb904000}, {0xbb906000}, + {0xbb908000}, {0xbb90a000}, {0xbb90c000}, {0xbb90e000}, + {0xbb910000}, {0xbb912000}, {0xbb914000}, {0xbb916000}, + {0xbb918000}, {0xbb91a000}, {0xbb91c000}, {0xbb91e000}, + {0xbb920000}, {0xbb922000}, {0xbb924000}, {0xbb926000}, + {0xbb928000}, {0xbb92a000}, {0xbb92c000}, {0xbb92e000}, + {0xbb930000}, {0xbb932000}, {0xbb934000}, {0xbb936000}, + {0xbb938000}, {0xbb93a000}, {0xbb93c000}, {0xbb93e000}, + {0xbb940000}, {0xbb942000}, {0xbb944000}, {0xbb946000}, + {0xbb948000}, {0xbb94a000}, {0xbb94c000}, {0xbb94e000}, + {0xbb950000}, {0xbb952000}, {0xbb954000}, {0xbb956000}, + {0xbb958000}, {0xbb95a000}, {0xbb95c000}, {0xbb95e000}, + {0xbb960000}, {0xbb962000}, {0xbb964000}, {0xbb966000}, + {0xbb968000}, {0xbb96a000}, {0xbb96c000}, {0xbb96e000}, + {0xbb970000}, {0xbb972000}, {0xbb974000}, {0xbb976000}, + {0xbb978000}, {0xbb97a000}, {0xbb97c000}, {0xbb97e000}, + {0xbb980000}, {0xbb982000}, {0xbb984000}, {0xbb986000}, + {0xbb988000}, {0xbb98a000}, {0xbb98c000}, {0xbb98e000}, + {0xbb990000}, {0xbb992000}, {0xbb994000}, {0xbb996000}, + {0xbb998000}, {0xbb99a000}, {0xbb99c000}, {0xbb99e000}, + {0xbb9a0000}, {0xbb9a2000}, {0xbb9a4000}, {0xbb9a6000}, + {0xbb9a8000}, {0xbb9aa000}, {0xbb9ac000}, {0xbb9ae000}, + {0xbb9b0000}, {0xbb9b2000}, {0xbb9b4000}, {0xbb9b6000}, + {0xbb9b8000}, {0xbb9ba000}, {0xbb9bc000}, {0xbb9be000}, + {0xbb9c0000}, {0xbb9c2000}, {0xbb9c4000}, {0xbb9c6000}, + {0xbb9c8000}, {0xbb9ca000}, {0xbb9cc000}, {0xbb9ce000}, + {0xbb9d0000}, {0xbb9d2000}, {0xbb9d4000}, {0xbb9d6000}, + {0xbb9d8000}, {0xbb9da000}, {0xbb9dc000}, {0xbb9de000}, + {0xbb9e0000}, {0xbb9e2000}, {0xbb9e4000}, {0xbb9e6000}, + {0xbb9e8000}, {0xbb9ea000}, {0xbb9ec000}, {0xbb9ee000}, + {0xbb9f0000}, {0xbb9f2000}, {0xbb9f4000}, {0xbb9f6000}, + {0xbb9f8000}, {0xbb9fa000}, {0xbb9fc000}, {0xbb9fe000}, + {0xbba00000}, {0xbba02000}, {0xbba04000}, {0xbba06000}, + {0xbba08000}, {0xbba0a000}, {0xbba0c000}, {0xbba0e000}, + {0xbba10000}, {0xbba12000}, {0xbba14000}, {0xbba16000}, + {0xbba18000}, {0xbba1a000}, {0xbba1c000}, {0xbba1e000}, + {0xbba20000}, {0xbba22000}, {0xbba24000}, {0xbba26000}, + {0xbba28000}, {0xbba2a000}, {0xbba2c000}, {0xbba2e000}, + {0xbba30000}, {0xbba32000}, {0xbba34000}, {0xbba36000}, + {0xbba38000}, {0xbba3a000}, {0xbba3c000}, {0xbba3e000}, + {0xbba40000}, {0xbba42000}, {0xbba44000}, {0xbba46000}, + {0xbba48000}, {0xbba4a000}, {0xbba4c000}, {0xbba4e000}, + {0xbba50000}, {0xbba52000}, {0xbba54000}, {0xbba56000}, + {0xbba58000}, {0xbba5a000}, {0xbba5c000}, {0xbba5e000}, + {0xbba60000}, {0xbba62000}, {0xbba64000}, {0xbba66000}, + {0xbba68000}, {0xbba6a000}, {0xbba6c000}, {0xbba6e000}, + {0xbba70000}, {0xbba72000}, {0xbba74000}, {0xbba76000}, + {0xbba78000}, {0xbba7a000}, {0xbba7c000}, {0xbba7e000}, + {0xbba80000}, {0xbba82000}, {0xbba84000}, {0xbba86000}, + {0xbba88000}, {0xbba8a000}, {0xbba8c000}, {0xbba8e000}, + {0xbba90000}, {0xbba92000}, {0xbba94000}, {0xbba96000}, + {0xbba98000}, {0xbba9a000}, {0xbba9c000}, {0xbba9e000}, + {0xbbaa0000}, {0xbbaa2000}, {0xbbaa4000}, {0xbbaa6000}, + {0xbbaa8000}, {0xbbaaa000}, {0xbbaac000}, {0xbbaae000}, + {0xbbab0000}, {0xbbab2000}, {0xbbab4000}, {0xbbab6000}, + {0xbbab8000}, {0xbbaba000}, {0xbbabc000}, {0xbbabe000}, + {0xbbac0000}, {0xbbac2000}, {0xbbac4000}, {0xbbac6000}, + {0xbbac8000}, {0xbbaca000}, {0xbbacc000}, {0xbbace000}, + {0xbbad0000}, {0xbbad2000}, {0xbbad4000}, {0xbbad6000}, + {0xbbad8000}, {0xbbada000}, {0xbbadc000}, {0xbbade000}, + {0xbbae0000}, {0xbbae2000}, {0xbbae4000}, {0xbbae6000}, + {0xbbae8000}, {0xbbaea000}, {0xbbaec000}, {0xbbaee000}, + {0xbbaf0000}, {0xbbaf2000}, {0xbbaf4000}, {0xbbaf6000}, + {0xbbaf8000}, {0xbbafa000}, {0xbbafc000}, {0xbbafe000}, + {0xbbb00000}, {0xbbb02000}, {0xbbb04000}, {0xbbb06000}, + {0xbbb08000}, {0xbbb0a000}, {0xbbb0c000}, {0xbbb0e000}, + {0xbbb10000}, {0xbbb12000}, {0xbbb14000}, {0xbbb16000}, + {0xbbb18000}, {0xbbb1a000}, {0xbbb1c000}, {0xbbb1e000}, + {0xbbb20000}, {0xbbb22000}, {0xbbb24000}, {0xbbb26000}, + {0xbbb28000}, {0xbbb2a000}, {0xbbb2c000}, {0xbbb2e000}, + {0xbbb30000}, {0xbbb32000}, {0xbbb34000}, {0xbbb36000}, + {0xbbb38000}, {0xbbb3a000}, {0xbbb3c000}, {0xbbb3e000}, + {0xbbb40000}, {0xbbb42000}, {0xbbb44000}, {0xbbb46000}, + {0xbbb48000}, {0xbbb4a000}, {0xbbb4c000}, {0xbbb4e000}, + {0xbbb50000}, {0xbbb52000}, {0xbbb54000}, {0xbbb56000}, + {0xbbb58000}, {0xbbb5a000}, {0xbbb5c000}, {0xbbb5e000}, + {0xbbb60000}, {0xbbb62000}, {0xbbb64000}, {0xbbb66000}, + {0xbbb68000}, {0xbbb6a000}, {0xbbb6c000}, {0xbbb6e000}, + {0xbbb70000}, {0xbbb72000}, {0xbbb74000}, {0xbbb76000}, + {0xbbb78000}, {0xbbb7a000}, {0xbbb7c000}, {0xbbb7e000}, + {0xbbb80000}, {0xbbb82000}, {0xbbb84000}, {0xbbb86000}, + {0xbbb88000}, {0xbbb8a000}, {0xbbb8c000}, {0xbbb8e000}, + {0xbbb90000}, {0xbbb92000}, {0xbbb94000}, {0xbbb96000}, + {0xbbb98000}, {0xbbb9a000}, {0xbbb9c000}, {0xbbb9e000}, + {0xbbba0000}, {0xbbba2000}, {0xbbba4000}, {0xbbba6000}, + {0xbbba8000}, {0xbbbaa000}, {0xbbbac000}, {0xbbbae000}, + {0xbbbb0000}, {0xbbbb2000}, {0xbbbb4000}, {0xbbbb6000}, + {0xbbbb8000}, {0xbbbba000}, {0xbbbbc000}, {0xbbbbe000}, + {0xbbbc0000}, {0xbbbc2000}, {0xbbbc4000}, {0xbbbc6000}, + {0xbbbc8000}, {0xbbbca000}, {0xbbbcc000}, {0xbbbce000}, + {0xbbbd0000}, {0xbbbd2000}, {0xbbbd4000}, {0xbbbd6000}, + {0xbbbd8000}, {0xbbbda000}, {0xbbbdc000}, {0xbbbde000}, + {0xbbbe0000}, {0xbbbe2000}, {0xbbbe4000}, {0xbbbe6000}, + {0xbbbe8000}, {0xbbbea000}, {0xbbbec000}, {0xbbbee000}, + {0xbbbf0000}, {0xbbbf2000}, {0xbbbf4000}, {0xbbbf6000}, + {0xbbbf8000}, {0xbbbfa000}, {0xbbbfc000}, {0xbbbfe000}, + {0xbbc00000}, {0xbbc02000}, {0xbbc04000}, {0xbbc06000}, + {0xbbc08000}, {0xbbc0a000}, {0xbbc0c000}, {0xbbc0e000}, + {0xbbc10000}, {0xbbc12000}, {0xbbc14000}, {0xbbc16000}, + {0xbbc18000}, {0xbbc1a000}, {0xbbc1c000}, {0xbbc1e000}, + {0xbbc20000}, {0xbbc22000}, {0xbbc24000}, {0xbbc26000}, + {0xbbc28000}, {0xbbc2a000}, {0xbbc2c000}, {0xbbc2e000}, + {0xbbc30000}, {0xbbc32000}, {0xbbc34000}, {0xbbc36000}, + {0xbbc38000}, {0xbbc3a000}, {0xbbc3c000}, {0xbbc3e000}, + {0xbbc40000}, {0xbbc42000}, {0xbbc44000}, {0xbbc46000}, + {0xbbc48000}, {0xbbc4a000}, {0xbbc4c000}, {0xbbc4e000}, + {0xbbc50000}, {0xbbc52000}, {0xbbc54000}, {0xbbc56000}, + {0xbbc58000}, {0xbbc5a000}, {0xbbc5c000}, {0xbbc5e000}, + {0xbbc60000}, {0xbbc62000}, {0xbbc64000}, {0xbbc66000}, + {0xbbc68000}, {0xbbc6a000}, {0xbbc6c000}, {0xbbc6e000}, + {0xbbc70000}, {0xbbc72000}, {0xbbc74000}, {0xbbc76000}, + {0xbbc78000}, {0xbbc7a000}, {0xbbc7c000}, {0xbbc7e000}, + {0xbbc80000}, {0xbbc82000}, {0xbbc84000}, {0xbbc86000}, + {0xbbc88000}, {0xbbc8a000}, {0xbbc8c000}, {0xbbc8e000}, + {0xbbc90000}, {0xbbc92000}, {0xbbc94000}, {0xbbc96000}, + {0xbbc98000}, {0xbbc9a000}, {0xbbc9c000}, {0xbbc9e000}, + {0xbbca0000}, {0xbbca2000}, {0xbbca4000}, {0xbbca6000}, + {0xbbca8000}, {0xbbcaa000}, {0xbbcac000}, {0xbbcae000}, + {0xbbcb0000}, {0xbbcb2000}, {0xbbcb4000}, {0xbbcb6000}, + {0xbbcb8000}, {0xbbcba000}, {0xbbcbc000}, {0xbbcbe000}, + {0xbbcc0000}, {0xbbcc2000}, {0xbbcc4000}, {0xbbcc6000}, + {0xbbcc8000}, {0xbbcca000}, {0xbbccc000}, {0xbbcce000}, + {0xbbcd0000}, {0xbbcd2000}, {0xbbcd4000}, {0xbbcd6000}, + {0xbbcd8000}, {0xbbcda000}, {0xbbcdc000}, {0xbbcde000}, + {0xbbce0000}, {0xbbce2000}, {0xbbce4000}, {0xbbce6000}, + {0xbbce8000}, {0xbbcea000}, {0xbbcec000}, {0xbbcee000}, + {0xbbcf0000}, {0xbbcf2000}, {0xbbcf4000}, {0xbbcf6000}, + {0xbbcf8000}, {0xbbcfa000}, {0xbbcfc000}, {0xbbcfe000}, + {0xbbd00000}, {0xbbd02000}, {0xbbd04000}, {0xbbd06000}, + {0xbbd08000}, {0xbbd0a000}, {0xbbd0c000}, {0xbbd0e000}, + {0xbbd10000}, {0xbbd12000}, {0xbbd14000}, {0xbbd16000}, + {0xbbd18000}, {0xbbd1a000}, {0xbbd1c000}, {0xbbd1e000}, + {0xbbd20000}, {0xbbd22000}, {0xbbd24000}, {0xbbd26000}, + {0xbbd28000}, {0xbbd2a000}, {0xbbd2c000}, {0xbbd2e000}, + {0xbbd30000}, {0xbbd32000}, {0xbbd34000}, {0xbbd36000}, + {0xbbd38000}, {0xbbd3a000}, {0xbbd3c000}, {0xbbd3e000}, + {0xbbd40000}, {0xbbd42000}, {0xbbd44000}, {0xbbd46000}, + {0xbbd48000}, {0xbbd4a000}, {0xbbd4c000}, {0xbbd4e000}, + {0xbbd50000}, {0xbbd52000}, {0xbbd54000}, {0xbbd56000}, + {0xbbd58000}, {0xbbd5a000}, {0xbbd5c000}, {0xbbd5e000}, + {0xbbd60000}, {0xbbd62000}, {0xbbd64000}, {0xbbd66000}, + {0xbbd68000}, {0xbbd6a000}, {0xbbd6c000}, {0xbbd6e000}, + {0xbbd70000}, {0xbbd72000}, {0xbbd74000}, {0xbbd76000}, + {0xbbd78000}, {0xbbd7a000}, {0xbbd7c000}, {0xbbd7e000}, + {0xbbd80000}, {0xbbd82000}, {0xbbd84000}, {0xbbd86000}, + {0xbbd88000}, {0xbbd8a000}, {0xbbd8c000}, {0xbbd8e000}, + {0xbbd90000}, {0xbbd92000}, {0xbbd94000}, {0xbbd96000}, + {0xbbd98000}, {0xbbd9a000}, {0xbbd9c000}, {0xbbd9e000}, + {0xbbda0000}, {0xbbda2000}, {0xbbda4000}, {0xbbda6000}, + {0xbbda8000}, {0xbbdaa000}, {0xbbdac000}, {0xbbdae000}, + {0xbbdb0000}, {0xbbdb2000}, {0xbbdb4000}, {0xbbdb6000}, + {0xbbdb8000}, {0xbbdba000}, {0xbbdbc000}, {0xbbdbe000}, + {0xbbdc0000}, {0xbbdc2000}, {0xbbdc4000}, {0xbbdc6000}, + {0xbbdc8000}, {0xbbdca000}, {0xbbdcc000}, {0xbbdce000}, + {0xbbdd0000}, {0xbbdd2000}, {0xbbdd4000}, {0xbbdd6000}, + {0xbbdd8000}, {0xbbdda000}, {0xbbddc000}, {0xbbdde000}, + {0xbbde0000}, {0xbbde2000}, {0xbbde4000}, {0xbbde6000}, + {0xbbde8000}, {0xbbdea000}, {0xbbdec000}, {0xbbdee000}, + {0xbbdf0000}, {0xbbdf2000}, {0xbbdf4000}, {0xbbdf6000}, + {0xbbdf8000}, {0xbbdfa000}, {0xbbdfc000}, {0xbbdfe000}, + {0xbbe00000}, {0xbbe02000}, {0xbbe04000}, {0xbbe06000}, + {0xbbe08000}, {0xbbe0a000}, {0xbbe0c000}, {0xbbe0e000}, + {0xbbe10000}, {0xbbe12000}, {0xbbe14000}, {0xbbe16000}, + {0xbbe18000}, {0xbbe1a000}, {0xbbe1c000}, {0xbbe1e000}, + {0xbbe20000}, {0xbbe22000}, {0xbbe24000}, {0xbbe26000}, + {0xbbe28000}, {0xbbe2a000}, {0xbbe2c000}, {0xbbe2e000}, + {0xbbe30000}, {0xbbe32000}, {0xbbe34000}, {0xbbe36000}, + {0xbbe38000}, {0xbbe3a000}, {0xbbe3c000}, {0xbbe3e000}, + {0xbbe40000}, {0xbbe42000}, {0xbbe44000}, {0xbbe46000}, + {0xbbe48000}, {0xbbe4a000}, {0xbbe4c000}, {0xbbe4e000}, + {0xbbe50000}, {0xbbe52000}, {0xbbe54000}, {0xbbe56000}, + {0xbbe58000}, {0xbbe5a000}, {0xbbe5c000}, {0xbbe5e000}, + {0xbbe60000}, {0xbbe62000}, {0xbbe64000}, {0xbbe66000}, + {0xbbe68000}, {0xbbe6a000}, {0xbbe6c000}, {0xbbe6e000}, + {0xbbe70000}, {0xbbe72000}, {0xbbe74000}, {0xbbe76000}, + {0xbbe78000}, {0xbbe7a000}, {0xbbe7c000}, {0xbbe7e000}, + {0xbbe80000}, {0xbbe82000}, {0xbbe84000}, {0xbbe86000}, + {0xbbe88000}, {0xbbe8a000}, {0xbbe8c000}, {0xbbe8e000}, + {0xbbe90000}, {0xbbe92000}, {0xbbe94000}, {0xbbe96000}, + {0xbbe98000}, {0xbbe9a000}, {0xbbe9c000}, {0xbbe9e000}, + {0xbbea0000}, {0xbbea2000}, {0xbbea4000}, {0xbbea6000}, + {0xbbea8000}, {0xbbeaa000}, {0xbbeac000}, {0xbbeae000}, + {0xbbeb0000}, {0xbbeb2000}, {0xbbeb4000}, {0xbbeb6000}, + {0xbbeb8000}, {0xbbeba000}, {0xbbebc000}, {0xbbebe000}, + {0xbbec0000}, {0xbbec2000}, {0xbbec4000}, {0xbbec6000}, + {0xbbec8000}, {0xbbeca000}, {0xbbecc000}, {0xbbece000}, + {0xbbed0000}, {0xbbed2000}, {0xbbed4000}, {0xbbed6000}, + {0xbbed8000}, {0xbbeda000}, {0xbbedc000}, {0xbbede000}, + {0xbbee0000}, {0xbbee2000}, {0xbbee4000}, {0xbbee6000}, + {0xbbee8000}, {0xbbeea000}, {0xbbeec000}, {0xbbeee000}, + {0xbbef0000}, {0xbbef2000}, {0xbbef4000}, {0xbbef6000}, + {0xbbef8000}, {0xbbefa000}, {0xbbefc000}, {0xbbefe000}, + {0xbbf00000}, {0xbbf02000}, {0xbbf04000}, {0xbbf06000}, + {0xbbf08000}, {0xbbf0a000}, {0xbbf0c000}, {0xbbf0e000}, + {0xbbf10000}, {0xbbf12000}, {0xbbf14000}, {0xbbf16000}, + {0xbbf18000}, {0xbbf1a000}, {0xbbf1c000}, {0xbbf1e000}, + {0xbbf20000}, {0xbbf22000}, {0xbbf24000}, {0xbbf26000}, + {0xbbf28000}, {0xbbf2a000}, {0xbbf2c000}, {0xbbf2e000}, + {0xbbf30000}, {0xbbf32000}, {0xbbf34000}, {0xbbf36000}, + {0xbbf38000}, {0xbbf3a000}, {0xbbf3c000}, {0xbbf3e000}, + {0xbbf40000}, {0xbbf42000}, {0xbbf44000}, {0xbbf46000}, + {0xbbf48000}, {0xbbf4a000}, {0xbbf4c000}, {0xbbf4e000}, + {0xbbf50000}, {0xbbf52000}, {0xbbf54000}, {0xbbf56000}, + {0xbbf58000}, {0xbbf5a000}, {0xbbf5c000}, {0xbbf5e000}, + {0xbbf60000}, {0xbbf62000}, {0xbbf64000}, {0xbbf66000}, + {0xbbf68000}, {0xbbf6a000}, {0xbbf6c000}, {0xbbf6e000}, + {0xbbf70000}, {0xbbf72000}, {0xbbf74000}, {0xbbf76000}, + {0xbbf78000}, {0xbbf7a000}, {0xbbf7c000}, {0xbbf7e000}, + {0xbbf80000}, {0xbbf82000}, {0xbbf84000}, {0xbbf86000}, + {0xbbf88000}, {0xbbf8a000}, {0xbbf8c000}, {0xbbf8e000}, + {0xbbf90000}, {0xbbf92000}, {0xbbf94000}, {0xbbf96000}, + {0xbbf98000}, {0xbbf9a000}, {0xbbf9c000}, {0xbbf9e000}, + {0xbbfa0000}, {0xbbfa2000}, {0xbbfa4000}, {0xbbfa6000}, + {0xbbfa8000}, {0xbbfaa000}, {0xbbfac000}, {0xbbfae000}, + {0xbbfb0000}, {0xbbfb2000}, {0xbbfb4000}, {0xbbfb6000}, + {0xbbfb8000}, {0xbbfba000}, {0xbbfbc000}, {0xbbfbe000}, + {0xbbfc0000}, {0xbbfc2000}, {0xbbfc4000}, {0xbbfc6000}, + {0xbbfc8000}, {0xbbfca000}, {0xbbfcc000}, {0xbbfce000}, + {0xbbfd0000}, {0xbbfd2000}, {0xbbfd4000}, {0xbbfd6000}, + {0xbbfd8000}, {0xbbfda000}, {0xbbfdc000}, {0xbbfde000}, + {0xbbfe0000}, {0xbbfe2000}, {0xbbfe4000}, {0xbbfe6000}, + {0xbbfe8000}, {0xbbfea000}, {0xbbfec000}, {0xbbfee000}, + {0xbbff0000}, {0xbbff2000}, {0xbbff4000}, {0xbbff6000}, + {0xbbff8000}, {0xbbffa000}, {0xbbffc000}, {0xbbffe000}, + {0xbc000000}, {0xbc002000}, {0xbc004000}, {0xbc006000}, + {0xbc008000}, {0xbc00a000}, {0xbc00c000}, {0xbc00e000}, + {0xbc010000}, {0xbc012000}, {0xbc014000}, {0xbc016000}, + {0xbc018000}, {0xbc01a000}, {0xbc01c000}, {0xbc01e000}, + {0xbc020000}, {0xbc022000}, {0xbc024000}, {0xbc026000}, + {0xbc028000}, {0xbc02a000}, {0xbc02c000}, {0xbc02e000}, + {0xbc030000}, {0xbc032000}, {0xbc034000}, {0xbc036000}, + {0xbc038000}, {0xbc03a000}, {0xbc03c000}, {0xbc03e000}, + {0xbc040000}, {0xbc042000}, {0xbc044000}, {0xbc046000}, + {0xbc048000}, {0xbc04a000}, {0xbc04c000}, {0xbc04e000}, + {0xbc050000}, {0xbc052000}, {0xbc054000}, {0xbc056000}, + {0xbc058000}, {0xbc05a000}, {0xbc05c000}, {0xbc05e000}, + {0xbc060000}, {0xbc062000}, {0xbc064000}, {0xbc066000}, + {0xbc068000}, {0xbc06a000}, {0xbc06c000}, {0xbc06e000}, + {0xbc070000}, {0xbc072000}, {0xbc074000}, {0xbc076000}, + {0xbc078000}, {0xbc07a000}, {0xbc07c000}, {0xbc07e000}, + {0xbc080000}, {0xbc082000}, {0xbc084000}, {0xbc086000}, + {0xbc088000}, {0xbc08a000}, {0xbc08c000}, {0xbc08e000}, + {0xbc090000}, {0xbc092000}, {0xbc094000}, {0xbc096000}, + {0xbc098000}, {0xbc09a000}, {0xbc09c000}, {0xbc09e000}, + {0xbc0a0000}, {0xbc0a2000}, {0xbc0a4000}, {0xbc0a6000}, + {0xbc0a8000}, {0xbc0aa000}, {0xbc0ac000}, {0xbc0ae000}, + {0xbc0b0000}, {0xbc0b2000}, {0xbc0b4000}, {0xbc0b6000}, + {0xbc0b8000}, {0xbc0ba000}, {0xbc0bc000}, {0xbc0be000}, + {0xbc0c0000}, {0xbc0c2000}, {0xbc0c4000}, {0xbc0c6000}, + {0xbc0c8000}, {0xbc0ca000}, {0xbc0cc000}, {0xbc0ce000}, + {0xbc0d0000}, {0xbc0d2000}, {0xbc0d4000}, {0xbc0d6000}, + {0xbc0d8000}, {0xbc0da000}, {0xbc0dc000}, {0xbc0de000}, + {0xbc0e0000}, {0xbc0e2000}, {0xbc0e4000}, {0xbc0e6000}, + {0xbc0e8000}, {0xbc0ea000}, {0xbc0ec000}, {0xbc0ee000}, + {0xbc0f0000}, {0xbc0f2000}, {0xbc0f4000}, {0xbc0f6000}, + {0xbc0f8000}, {0xbc0fa000}, {0xbc0fc000}, {0xbc0fe000}, + {0xbc100000}, {0xbc102000}, {0xbc104000}, {0xbc106000}, + {0xbc108000}, {0xbc10a000}, {0xbc10c000}, {0xbc10e000}, + {0xbc110000}, {0xbc112000}, {0xbc114000}, {0xbc116000}, + {0xbc118000}, {0xbc11a000}, {0xbc11c000}, {0xbc11e000}, + {0xbc120000}, {0xbc122000}, {0xbc124000}, {0xbc126000}, + {0xbc128000}, {0xbc12a000}, {0xbc12c000}, {0xbc12e000}, + {0xbc130000}, {0xbc132000}, {0xbc134000}, {0xbc136000}, + {0xbc138000}, {0xbc13a000}, {0xbc13c000}, {0xbc13e000}, + {0xbc140000}, {0xbc142000}, {0xbc144000}, {0xbc146000}, + {0xbc148000}, {0xbc14a000}, {0xbc14c000}, {0xbc14e000}, + {0xbc150000}, {0xbc152000}, {0xbc154000}, {0xbc156000}, + {0xbc158000}, {0xbc15a000}, {0xbc15c000}, {0xbc15e000}, + {0xbc160000}, {0xbc162000}, {0xbc164000}, {0xbc166000}, + {0xbc168000}, {0xbc16a000}, {0xbc16c000}, {0xbc16e000}, + {0xbc170000}, {0xbc172000}, {0xbc174000}, {0xbc176000}, + {0xbc178000}, {0xbc17a000}, {0xbc17c000}, {0xbc17e000}, + {0xbc180000}, {0xbc182000}, {0xbc184000}, {0xbc186000}, + {0xbc188000}, {0xbc18a000}, {0xbc18c000}, {0xbc18e000}, + {0xbc190000}, {0xbc192000}, {0xbc194000}, {0xbc196000}, + {0xbc198000}, {0xbc19a000}, {0xbc19c000}, {0xbc19e000}, + {0xbc1a0000}, {0xbc1a2000}, {0xbc1a4000}, {0xbc1a6000}, + {0xbc1a8000}, {0xbc1aa000}, {0xbc1ac000}, {0xbc1ae000}, + {0xbc1b0000}, {0xbc1b2000}, {0xbc1b4000}, {0xbc1b6000}, + {0xbc1b8000}, {0xbc1ba000}, {0xbc1bc000}, {0xbc1be000}, + {0xbc1c0000}, {0xbc1c2000}, {0xbc1c4000}, {0xbc1c6000}, + {0xbc1c8000}, {0xbc1ca000}, {0xbc1cc000}, {0xbc1ce000}, + {0xbc1d0000}, {0xbc1d2000}, {0xbc1d4000}, {0xbc1d6000}, + {0xbc1d8000}, {0xbc1da000}, {0xbc1dc000}, {0xbc1de000}, + {0xbc1e0000}, {0xbc1e2000}, {0xbc1e4000}, {0xbc1e6000}, + {0xbc1e8000}, {0xbc1ea000}, {0xbc1ec000}, {0xbc1ee000}, + {0xbc1f0000}, {0xbc1f2000}, {0xbc1f4000}, {0xbc1f6000}, + {0xbc1f8000}, {0xbc1fa000}, {0xbc1fc000}, {0xbc1fe000}, + {0xbc200000}, {0xbc202000}, {0xbc204000}, {0xbc206000}, + {0xbc208000}, {0xbc20a000}, {0xbc20c000}, {0xbc20e000}, + {0xbc210000}, {0xbc212000}, {0xbc214000}, {0xbc216000}, + {0xbc218000}, {0xbc21a000}, {0xbc21c000}, {0xbc21e000}, + {0xbc220000}, {0xbc222000}, {0xbc224000}, {0xbc226000}, + {0xbc228000}, {0xbc22a000}, {0xbc22c000}, {0xbc22e000}, + {0xbc230000}, {0xbc232000}, {0xbc234000}, {0xbc236000}, + {0xbc238000}, {0xbc23a000}, {0xbc23c000}, {0xbc23e000}, + {0xbc240000}, {0xbc242000}, {0xbc244000}, {0xbc246000}, + {0xbc248000}, {0xbc24a000}, {0xbc24c000}, {0xbc24e000}, + {0xbc250000}, {0xbc252000}, {0xbc254000}, {0xbc256000}, + {0xbc258000}, {0xbc25a000}, {0xbc25c000}, {0xbc25e000}, + {0xbc260000}, {0xbc262000}, {0xbc264000}, {0xbc266000}, + {0xbc268000}, {0xbc26a000}, {0xbc26c000}, {0xbc26e000}, + {0xbc270000}, {0xbc272000}, {0xbc274000}, {0xbc276000}, + {0xbc278000}, {0xbc27a000}, {0xbc27c000}, {0xbc27e000}, + {0xbc280000}, {0xbc282000}, {0xbc284000}, {0xbc286000}, + {0xbc288000}, {0xbc28a000}, {0xbc28c000}, {0xbc28e000}, + {0xbc290000}, {0xbc292000}, {0xbc294000}, {0xbc296000}, + {0xbc298000}, {0xbc29a000}, {0xbc29c000}, {0xbc29e000}, + {0xbc2a0000}, {0xbc2a2000}, {0xbc2a4000}, {0xbc2a6000}, + {0xbc2a8000}, {0xbc2aa000}, {0xbc2ac000}, {0xbc2ae000}, + {0xbc2b0000}, {0xbc2b2000}, {0xbc2b4000}, {0xbc2b6000}, + {0xbc2b8000}, {0xbc2ba000}, {0xbc2bc000}, {0xbc2be000}, + {0xbc2c0000}, {0xbc2c2000}, {0xbc2c4000}, {0xbc2c6000}, + {0xbc2c8000}, {0xbc2ca000}, {0xbc2cc000}, {0xbc2ce000}, + {0xbc2d0000}, {0xbc2d2000}, {0xbc2d4000}, {0xbc2d6000}, + {0xbc2d8000}, {0xbc2da000}, {0xbc2dc000}, {0xbc2de000}, + {0xbc2e0000}, {0xbc2e2000}, {0xbc2e4000}, {0xbc2e6000}, + {0xbc2e8000}, {0xbc2ea000}, {0xbc2ec000}, {0xbc2ee000}, + {0xbc2f0000}, {0xbc2f2000}, {0xbc2f4000}, {0xbc2f6000}, + {0xbc2f8000}, {0xbc2fa000}, {0xbc2fc000}, {0xbc2fe000}, + {0xbc300000}, {0xbc302000}, {0xbc304000}, {0xbc306000}, + {0xbc308000}, {0xbc30a000}, {0xbc30c000}, {0xbc30e000}, + {0xbc310000}, {0xbc312000}, {0xbc314000}, {0xbc316000}, + {0xbc318000}, {0xbc31a000}, {0xbc31c000}, {0xbc31e000}, + {0xbc320000}, {0xbc322000}, {0xbc324000}, {0xbc326000}, + {0xbc328000}, {0xbc32a000}, {0xbc32c000}, {0xbc32e000}, + {0xbc330000}, {0xbc332000}, {0xbc334000}, {0xbc336000}, + {0xbc338000}, {0xbc33a000}, {0xbc33c000}, {0xbc33e000}, + {0xbc340000}, {0xbc342000}, {0xbc344000}, {0xbc346000}, + {0xbc348000}, {0xbc34a000}, {0xbc34c000}, {0xbc34e000}, + {0xbc350000}, {0xbc352000}, {0xbc354000}, {0xbc356000}, + {0xbc358000}, {0xbc35a000}, {0xbc35c000}, {0xbc35e000}, + {0xbc360000}, {0xbc362000}, {0xbc364000}, {0xbc366000}, + {0xbc368000}, {0xbc36a000}, {0xbc36c000}, {0xbc36e000}, + {0xbc370000}, {0xbc372000}, {0xbc374000}, {0xbc376000}, + {0xbc378000}, {0xbc37a000}, {0xbc37c000}, {0xbc37e000}, + {0xbc380000}, {0xbc382000}, {0xbc384000}, {0xbc386000}, + {0xbc388000}, {0xbc38a000}, {0xbc38c000}, {0xbc38e000}, + {0xbc390000}, {0xbc392000}, {0xbc394000}, {0xbc396000}, + {0xbc398000}, {0xbc39a000}, {0xbc39c000}, {0xbc39e000}, + {0xbc3a0000}, {0xbc3a2000}, {0xbc3a4000}, {0xbc3a6000}, + {0xbc3a8000}, {0xbc3aa000}, {0xbc3ac000}, {0xbc3ae000}, + {0xbc3b0000}, {0xbc3b2000}, {0xbc3b4000}, {0xbc3b6000}, + {0xbc3b8000}, {0xbc3ba000}, {0xbc3bc000}, {0xbc3be000}, + {0xbc3c0000}, {0xbc3c2000}, {0xbc3c4000}, {0xbc3c6000}, + {0xbc3c8000}, {0xbc3ca000}, {0xbc3cc000}, {0xbc3ce000}, + {0xbc3d0000}, {0xbc3d2000}, {0xbc3d4000}, {0xbc3d6000}, + {0xbc3d8000}, {0xbc3da000}, {0xbc3dc000}, {0xbc3de000}, + {0xbc3e0000}, {0xbc3e2000}, {0xbc3e4000}, {0xbc3e6000}, + {0xbc3e8000}, {0xbc3ea000}, {0xbc3ec000}, {0xbc3ee000}, + {0xbc3f0000}, {0xbc3f2000}, {0xbc3f4000}, {0xbc3f6000}, + {0xbc3f8000}, {0xbc3fa000}, {0xbc3fc000}, {0xbc3fe000}, + {0xbc400000}, {0xbc402000}, {0xbc404000}, {0xbc406000}, + {0xbc408000}, {0xbc40a000}, {0xbc40c000}, {0xbc40e000}, + {0xbc410000}, {0xbc412000}, {0xbc414000}, {0xbc416000}, + {0xbc418000}, {0xbc41a000}, {0xbc41c000}, {0xbc41e000}, + {0xbc420000}, {0xbc422000}, {0xbc424000}, {0xbc426000}, + {0xbc428000}, {0xbc42a000}, {0xbc42c000}, {0xbc42e000}, + {0xbc430000}, {0xbc432000}, {0xbc434000}, {0xbc436000}, + {0xbc438000}, {0xbc43a000}, {0xbc43c000}, {0xbc43e000}, + {0xbc440000}, {0xbc442000}, {0xbc444000}, {0xbc446000}, + {0xbc448000}, {0xbc44a000}, {0xbc44c000}, {0xbc44e000}, + {0xbc450000}, {0xbc452000}, {0xbc454000}, {0xbc456000}, + {0xbc458000}, {0xbc45a000}, {0xbc45c000}, {0xbc45e000}, + {0xbc460000}, {0xbc462000}, {0xbc464000}, {0xbc466000}, + {0xbc468000}, {0xbc46a000}, {0xbc46c000}, {0xbc46e000}, + {0xbc470000}, {0xbc472000}, {0xbc474000}, {0xbc476000}, + {0xbc478000}, {0xbc47a000}, {0xbc47c000}, {0xbc47e000}, + {0xbc480000}, {0xbc482000}, {0xbc484000}, {0xbc486000}, + {0xbc488000}, {0xbc48a000}, {0xbc48c000}, {0xbc48e000}, + {0xbc490000}, {0xbc492000}, {0xbc494000}, {0xbc496000}, + {0xbc498000}, {0xbc49a000}, {0xbc49c000}, {0xbc49e000}, + {0xbc4a0000}, {0xbc4a2000}, {0xbc4a4000}, {0xbc4a6000}, + {0xbc4a8000}, {0xbc4aa000}, {0xbc4ac000}, {0xbc4ae000}, + {0xbc4b0000}, {0xbc4b2000}, {0xbc4b4000}, {0xbc4b6000}, + {0xbc4b8000}, {0xbc4ba000}, {0xbc4bc000}, {0xbc4be000}, + {0xbc4c0000}, {0xbc4c2000}, {0xbc4c4000}, {0xbc4c6000}, + {0xbc4c8000}, {0xbc4ca000}, {0xbc4cc000}, {0xbc4ce000}, + {0xbc4d0000}, {0xbc4d2000}, {0xbc4d4000}, {0xbc4d6000}, + {0xbc4d8000}, {0xbc4da000}, {0xbc4dc000}, {0xbc4de000}, + {0xbc4e0000}, {0xbc4e2000}, {0xbc4e4000}, {0xbc4e6000}, + {0xbc4e8000}, {0xbc4ea000}, {0xbc4ec000}, {0xbc4ee000}, + {0xbc4f0000}, {0xbc4f2000}, {0xbc4f4000}, {0xbc4f6000}, + {0xbc4f8000}, {0xbc4fa000}, {0xbc4fc000}, {0xbc4fe000}, + {0xbc500000}, {0xbc502000}, {0xbc504000}, {0xbc506000}, + {0xbc508000}, {0xbc50a000}, {0xbc50c000}, {0xbc50e000}, + {0xbc510000}, {0xbc512000}, {0xbc514000}, {0xbc516000}, + {0xbc518000}, {0xbc51a000}, {0xbc51c000}, {0xbc51e000}, + {0xbc520000}, {0xbc522000}, {0xbc524000}, {0xbc526000}, + {0xbc528000}, {0xbc52a000}, {0xbc52c000}, {0xbc52e000}, + {0xbc530000}, {0xbc532000}, {0xbc534000}, {0xbc536000}, + {0xbc538000}, {0xbc53a000}, {0xbc53c000}, {0xbc53e000}, + {0xbc540000}, {0xbc542000}, {0xbc544000}, {0xbc546000}, + {0xbc548000}, {0xbc54a000}, {0xbc54c000}, {0xbc54e000}, + {0xbc550000}, {0xbc552000}, {0xbc554000}, {0xbc556000}, + {0xbc558000}, {0xbc55a000}, {0xbc55c000}, {0xbc55e000}, + {0xbc560000}, {0xbc562000}, {0xbc564000}, {0xbc566000}, + {0xbc568000}, {0xbc56a000}, {0xbc56c000}, {0xbc56e000}, + {0xbc570000}, {0xbc572000}, {0xbc574000}, {0xbc576000}, + {0xbc578000}, {0xbc57a000}, {0xbc57c000}, {0xbc57e000}, + {0xbc580000}, {0xbc582000}, {0xbc584000}, {0xbc586000}, + {0xbc588000}, {0xbc58a000}, {0xbc58c000}, {0xbc58e000}, + {0xbc590000}, {0xbc592000}, {0xbc594000}, {0xbc596000}, + {0xbc598000}, {0xbc59a000}, {0xbc59c000}, {0xbc59e000}, + {0xbc5a0000}, {0xbc5a2000}, {0xbc5a4000}, {0xbc5a6000}, + {0xbc5a8000}, {0xbc5aa000}, {0xbc5ac000}, {0xbc5ae000}, + {0xbc5b0000}, {0xbc5b2000}, {0xbc5b4000}, {0xbc5b6000}, + {0xbc5b8000}, {0xbc5ba000}, {0xbc5bc000}, {0xbc5be000}, + {0xbc5c0000}, {0xbc5c2000}, {0xbc5c4000}, {0xbc5c6000}, + {0xbc5c8000}, {0xbc5ca000}, {0xbc5cc000}, {0xbc5ce000}, + {0xbc5d0000}, {0xbc5d2000}, {0xbc5d4000}, {0xbc5d6000}, + {0xbc5d8000}, {0xbc5da000}, {0xbc5dc000}, {0xbc5de000}, + {0xbc5e0000}, {0xbc5e2000}, {0xbc5e4000}, {0xbc5e6000}, + {0xbc5e8000}, {0xbc5ea000}, {0xbc5ec000}, {0xbc5ee000}, + {0xbc5f0000}, {0xbc5f2000}, {0xbc5f4000}, {0xbc5f6000}, + {0xbc5f8000}, {0xbc5fa000}, {0xbc5fc000}, {0xbc5fe000}, + {0xbc600000}, {0xbc602000}, {0xbc604000}, {0xbc606000}, + {0xbc608000}, {0xbc60a000}, {0xbc60c000}, {0xbc60e000}, + {0xbc610000}, {0xbc612000}, {0xbc614000}, {0xbc616000}, + {0xbc618000}, {0xbc61a000}, {0xbc61c000}, {0xbc61e000}, + {0xbc620000}, {0xbc622000}, {0xbc624000}, {0xbc626000}, + {0xbc628000}, {0xbc62a000}, {0xbc62c000}, {0xbc62e000}, + {0xbc630000}, {0xbc632000}, {0xbc634000}, {0xbc636000}, + {0xbc638000}, {0xbc63a000}, {0xbc63c000}, {0xbc63e000}, + {0xbc640000}, {0xbc642000}, {0xbc644000}, {0xbc646000}, + {0xbc648000}, {0xbc64a000}, {0xbc64c000}, {0xbc64e000}, + {0xbc650000}, {0xbc652000}, {0xbc654000}, {0xbc656000}, + {0xbc658000}, {0xbc65a000}, {0xbc65c000}, {0xbc65e000}, + {0xbc660000}, {0xbc662000}, {0xbc664000}, {0xbc666000}, + {0xbc668000}, {0xbc66a000}, {0xbc66c000}, {0xbc66e000}, + {0xbc670000}, {0xbc672000}, {0xbc674000}, {0xbc676000}, + {0xbc678000}, {0xbc67a000}, {0xbc67c000}, {0xbc67e000}, + {0xbc680000}, {0xbc682000}, {0xbc684000}, {0xbc686000}, + {0xbc688000}, {0xbc68a000}, {0xbc68c000}, {0xbc68e000}, + {0xbc690000}, {0xbc692000}, {0xbc694000}, {0xbc696000}, + {0xbc698000}, {0xbc69a000}, {0xbc69c000}, {0xbc69e000}, + {0xbc6a0000}, {0xbc6a2000}, {0xbc6a4000}, {0xbc6a6000}, + {0xbc6a8000}, {0xbc6aa000}, {0xbc6ac000}, {0xbc6ae000}, + {0xbc6b0000}, {0xbc6b2000}, {0xbc6b4000}, {0xbc6b6000}, + {0xbc6b8000}, {0xbc6ba000}, {0xbc6bc000}, {0xbc6be000}, + {0xbc6c0000}, {0xbc6c2000}, {0xbc6c4000}, {0xbc6c6000}, + {0xbc6c8000}, {0xbc6ca000}, {0xbc6cc000}, {0xbc6ce000}, + {0xbc6d0000}, {0xbc6d2000}, {0xbc6d4000}, {0xbc6d6000}, + {0xbc6d8000}, {0xbc6da000}, {0xbc6dc000}, {0xbc6de000}, + {0xbc6e0000}, {0xbc6e2000}, {0xbc6e4000}, {0xbc6e6000}, + {0xbc6e8000}, {0xbc6ea000}, {0xbc6ec000}, {0xbc6ee000}, + {0xbc6f0000}, {0xbc6f2000}, {0xbc6f4000}, {0xbc6f6000}, + {0xbc6f8000}, {0xbc6fa000}, {0xbc6fc000}, {0xbc6fe000}, + {0xbc700000}, {0xbc702000}, {0xbc704000}, {0xbc706000}, + {0xbc708000}, {0xbc70a000}, {0xbc70c000}, {0xbc70e000}, + {0xbc710000}, {0xbc712000}, {0xbc714000}, {0xbc716000}, + {0xbc718000}, {0xbc71a000}, {0xbc71c000}, {0xbc71e000}, + {0xbc720000}, {0xbc722000}, {0xbc724000}, {0xbc726000}, + {0xbc728000}, {0xbc72a000}, {0xbc72c000}, {0xbc72e000}, + {0xbc730000}, {0xbc732000}, {0xbc734000}, {0xbc736000}, + {0xbc738000}, {0xbc73a000}, {0xbc73c000}, {0xbc73e000}, + {0xbc740000}, {0xbc742000}, {0xbc744000}, {0xbc746000}, + {0xbc748000}, {0xbc74a000}, {0xbc74c000}, {0xbc74e000}, + {0xbc750000}, {0xbc752000}, {0xbc754000}, {0xbc756000}, + {0xbc758000}, {0xbc75a000}, {0xbc75c000}, {0xbc75e000}, + {0xbc760000}, {0xbc762000}, {0xbc764000}, {0xbc766000}, + {0xbc768000}, {0xbc76a000}, {0xbc76c000}, {0xbc76e000}, + {0xbc770000}, {0xbc772000}, {0xbc774000}, {0xbc776000}, + {0xbc778000}, {0xbc77a000}, {0xbc77c000}, {0xbc77e000}, + {0xbc780000}, {0xbc782000}, {0xbc784000}, {0xbc786000}, + {0xbc788000}, {0xbc78a000}, {0xbc78c000}, {0xbc78e000}, + {0xbc790000}, {0xbc792000}, {0xbc794000}, {0xbc796000}, + {0xbc798000}, {0xbc79a000}, {0xbc79c000}, {0xbc79e000}, + {0xbc7a0000}, {0xbc7a2000}, {0xbc7a4000}, {0xbc7a6000}, + {0xbc7a8000}, {0xbc7aa000}, {0xbc7ac000}, {0xbc7ae000}, + {0xbc7b0000}, {0xbc7b2000}, {0xbc7b4000}, {0xbc7b6000}, + {0xbc7b8000}, {0xbc7ba000}, {0xbc7bc000}, {0xbc7be000}, + {0xbc7c0000}, {0xbc7c2000}, {0xbc7c4000}, {0xbc7c6000}, + {0xbc7c8000}, {0xbc7ca000}, {0xbc7cc000}, {0xbc7ce000}, + {0xbc7d0000}, {0xbc7d2000}, {0xbc7d4000}, {0xbc7d6000}, + {0xbc7d8000}, {0xbc7da000}, {0xbc7dc000}, {0xbc7de000}, + {0xbc7e0000}, {0xbc7e2000}, {0xbc7e4000}, {0xbc7e6000}, + {0xbc7e8000}, {0xbc7ea000}, {0xbc7ec000}, {0xbc7ee000}, + {0xbc7f0000}, {0xbc7f2000}, {0xbc7f4000}, {0xbc7f6000}, + {0xbc7f8000}, {0xbc7fa000}, {0xbc7fc000}, {0xbc7fe000}, + {0xbc800000}, {0xbc802000}, {0xbc804000}, {0xbc806000}, + {0xbc808000}, {0xbc80a000}, {0xbc80c000}, {0xbc80e000}, + {0xbc810000}, {0xbc812000}, {0xbc814000}, {0xbc816000}, + {0xbc818000}, {0xbc81a000}, {0xbc81c000}, {0xbc81e000}, + {0xbc820000}, {0xbc822000}, {0xbc824000}, {0xbc826000}, + {0xbc828000}, {0xbc82a000}, {0xbc82c000}, {0xbc82e000}, + {0xbc830000}, {0xbc832000}, {0xbc834000}, {0xbc836000}, + {0xbc838000}, {0xbc83a000}, {0xbc83c000}, {0xbc83e000}, + {0xbc840000}, {0xbc842000}, {0xbc844000}, {0xbc846000}, + {0xbc848000}, {0xbc84a000}, {0xbc84c000}, {0xbc84e000}, + {0xbc850000}, {0xbc852000}, {0xbc854000}, {0xbc856000}, + {0xbc858000}, {0xbc85a000}, {0xbc85c000}, {0xbc85e000}, + {0xbc860000}, {0xbc862000}, {0xbc864000}, {0xbc866000}, + {0xbc868000}, {0xbc86a000}, {0xbc86c000}, {0xbc86e000}, + {0xbc870000}, {0xbc872000}, {0xbc874000}, {0xbc876000}, + {0xbc878000}, {0xbc87a000}, {0xbc87c000}, {0xbc87e000}, + {0xbc880000}, {0xbc882000}, {0xbc884000}, {0xbc886000}, + {0xbc888000}, {0xbc88a000}, {0xbc88c000}, {0xbc88e000}, + {0xbc890000}, {0xbc892000}, {0xbc894000}, {0xbc896000}, + {0xbc898000}, {0xbc89a000}, {0xbc89c000}, {0xbc89e000}, + {0xbc8a0000}, {0xbc8a2000}, {0xbc8a4000}, {0xbc8a6000}, + {0xbc8a8000}, {0xbc8aa000}, {0xbc8ac000}, {0xbc8ae000}, + {0xbc8b0000}, {0xbc8b2000}, {0xbc8b4000}, {0xbc8b6000}, + {0xbc8b8000}, {0xbc8ba000}, {0xbc8bc000}, {0xbc8be000}, + {0xbc8c0000}, {0xbc8c2000}, {0xbc8c4000}, {0xbc8c6000}, + {0xbc8c8000}, {0xbc8ca000}, {0xbc8cc000}, {0xbc8ce000}, + {0xbc8d0000}, {0xbc8d2000}, {0xbc8d4000}, {0xbc8d6000}, + {0xbc8d8000}, {0xbc8da000}, {0xbc8dc000}, {0xbc8de000}, + {0xbc8e0000}, {0xbc8e2000}, {0xbc8e4000}, {0xbc8e6000}, + {0xbc8e8000}, {0xbc8ea000}, {0xbc8ec000}, {0xbc8ee000}, + {0xbc8f0000}, {0xbc8f2000}, {0xbc8f4000}, {0xbc8f6000}, + {0xbc8f8000}, {0xbc8fa000}, {0xbc8fc000}, {0xbc8fe000}, + {0xbc900000}, {0xbc902000}, {0xbc904000}, {0xbc906000}, + {0xbc908000}, {0xbc90a000}, {0xbc90c000}, {0xbc90e000}, + {0xbc910000}, {0xbc912000}, {0xbc914000}, {0xbc916000}, + {0xbc918000}, {0xbc91a000}, {0xbc91c000}, {0xbc91e000}, + {0xbc920000}, {0xbc922000}, {0xbc924000}, {0xbc926000}, + {0xbc928000}, {0xbc92a000}, {0xbc92c000}, {0xbc92e000}, + {0xbc930000}, {0xbc932000}, {0xbc934000}, {0xbc936000}, + {0xbc938000}, {0xbc93a000}, {0xbc93c000}, {0xbc93e000}, + {0xbc940000}, {0xbc942000}, {0xbc944000}, {0xbc946000}, + {0xbc948000}, {0xbc94a000}, {0xbc94c000}, {0xbc94e000}, + {0xbc950000}, {0xbc952000}, {0xbc954000}, {0xbc956000}, + {0xbc958000}, {0xbc95a000}, {0xbc95c000}, {0xbc95e000}, + {0xbc960000}, {0xbc962000}, {0xbc964000}, {0xbc966000}, + {0xbc968000}, {0xbc96a000}, {0xbc96c000}, {0xbc96e000}, + {0xbc970000}, {0xbc972000}, {0xbc974000}, {0xbc976000}, + {0xbc978000}, {0xbc97a000}, {0xbc97c000}, {0xbc97e000}, + {0xbc980000}, {0xbc982000}, {0xbc984000}, {0xbc986000}, + {0xbc988000}, {0xbc98a000}, {0xbc98c000}, {0xbc98e000}, + {0xbc990000}, {0xbc992000}, {0xbc994000}, {0xbc996000}, + {0xbc998000}, {0xbc99a000}, {0xbc99c000}, {0xbc99e000}, + {0xbc9a0000}, {0xbc9a2000}, {0xbc9a4000}, {0xbc9a6000}, + {0xbc9a8000}, {0xbc9aa000}, {0xbc9ac000}, {0xbc9ae000}, + {0xbc9b0000}, {0xbc9b2000}, {0xbc9b4000}, {0xbc9b6000}, + {0xbc9b8000}, {0xbc9ba000}, {0xbc9bc000}, {0xbc9be000}, + {0xbc9c0000}, {0xbc9c2000}, {0xbc9c4000}, {0xbc9c6000}, + {0xbc9c8000}, {0xbc9ca000}, {0xbc9cc000}, {0xbc9ce000}, + {0xbc9d0000}, {0xbc9d2000}, {0xbc9d4000}, {0xbc9d6000}, + {0xbc9d8000}, {0xbc9da000}, {0xbc9dc000}, {0xbc9de000}, + {0xbc9e0000}, {0xbc9e2000}, {0xbc9e4000}, {0xbc9e6000}, + {0xbc9e8000}, {0xbc9ea000}, {0xbc9ec000}, {0xbc9ee000}, + {0xbc9f0000}, {0xbc9f2000}, {0xbc9f4000}, {0xbc9f6000}, + {0xbc9f8000}, {0xbc9fa000}, {0xbc9fc000}, {0xbc9fe000}, + {0xbca00000}, {0xbca02000}, {0xbca04000}, {0xbca06000}, + {0xbca08000}, {0xbca0a000}, {0xbca0c000}, {0xbca0e000}, + {0xbca10000}, {0xbca12000}, {0xbca14000}, {0xbca16000}, + {0xbca18000}, {0xbca1a000}, {0xbca1c000}, {0xbca1e000}, + {0xbca20000}, {0xbca22000}, {0xbca24000}, {0xbca26000}, + {0xbca28000}, {0xbca2a000}, {0xbca2c000}, {0xbca2e000}, + {0xbca30000}, {0xbca32000}, {0xbca34000}, {0xbca36000}, + {0xbca38000}, {0xbca3a000}, {0xbca3c000}, {0xbca3e000}, + {0xbca40000}, {0xbca42000}, {0xbca44000}, {0xbca46000}, + {0xbca48000}, {0xbca4a000}, {0xbca4c000}, {0xbca4e000}, + {0xbca50000}, {0xbca52000}, {0xbca54000}, {0xbca56000}, + {0xbca58000}, {0xbca5a000}, {0xbca5c000}, {0xbca5e000}, + {0xbca60000}, {0xbca62000}, {0xbca64000}, {0xbca66000}, + {0xbca68000}, {0xbca6a000}, {0xbca6c000}, {0xbca6e000}, + {0xbca70000}, {0xbca72000}, {0xbca74000}, {0xbca76000}, + {0xbca78000}, {0xbca7a000}, {0xbca7c000}, {0xbca7e000}, + {0xbca80000}, {0xbca82000}, {0xbca84000}, {0xbca86000}, + {0xbca88000}, {0xbca8a000}, {0xbca8c000}, {0xbca8e000}, + {0xbca90000}, {0xbca92000}, {0xbca94000}, {0xbca96000}, + {0xbca98000}, {0xbca9a000}, {0xbca9c000}, {0xbca9e000}, + {0xbcaa0000}, {0xbcaa2000}, {0xbcaa4000}, {0xbcaa6000}, + {0xbcaa8000}, {0xbcaaa000}, {0xbcaac000}, {0xbcaae000}, + {0xbcab0000}, {0xbcab2000}, {0xbcab4000}, {0xbcab6000}, + {0xbcab8000}, {0xbcaba000}, {0xbcabc000}, {0xbcabe000}, + {0xbcac0000}, {0xbcac2000}, {0xbcac4000}, {0xbcac6000}, + {0xbcac8000}, {0xbcaca000}, {0xbcacc000}, {0xbcace000}, + {0xbcad0000}, {0xbcad2000}, {0xbcad4000}, {0xbcad6000}, + {0xbcad8000}, {0xbcada000}, {0xbcadc000}, {0xbcade000}, + {0xbcae0000}, {0xbcae2000}, {0xbcae4000}, {0xbcae6000}, + {0xbcae8000}, {0xbcaea000}, {0xbcaec000}, {0xbcaee000}, + {0xbcaf0000}, {0xbcaf2000}, {0xbcaf4000}, {0xbcaf6000}, + {0xbcaf8000}, {0xbcafa000}, {0xbcafc000}, {0xbcafe000}, + {0xbcb00000}, {0xbcb02000}, {0xbcb04000}, {0xbcb06000}, + {0xbcb08000}, {0xbcb0a000}, {0xbcb0c000}, {0xbcb0e000}, + {0xbcb10000}, {0xbcb12000}, {0xbcb14000}, {0xbcb16000}, + {0xbcb18000}, {0xbcb1a000}, {0xbcb1c000}, {0xbcb1e000}, + {0xbcb20000}, {0xbcb22000}, {0xbcb24000}, {0xbcb26000}, + {0xbcb28000}, {0xbcb2a000}, {0xbcb2c000}, {0xbcb2e000}, + {0xbcb30000}, {0xbcb32000}, {0xbcb34000}, {0xbcb36000}, + {0xbcb38000}, {0xbcb3a000}, {0xbcb3c000}, {0xbcb3e000}, + {0xbcb40000}, {0xbcb42000}, {0xbcb44000}, {0xbcb46000}, + {0xbcb48000}, {0xbcb4a000}, {0xbcb4c000}, {0xbcb4e000}, + {0xbcb50000}, {0xbcb52000}, {0xbcb54000}, {0xbcb56000}, + {0xbcb58000}, {0xbcb5a000}, {0xbcb5c000}, {0xbcb5e000}, + {0xbcb60000}, {0xbcb62000}, {0xbcb64000}, {0xbcb66000}, + {0xbcb68000}, {0xbcb6a000}, {0xbcb6c000}, {0xbcb6e000}, + {0xbcb70000}, {0xbcb72000}, {0xbcb74000}, {0xbcb76000}, + {0xbcb78000}, {0xbcb7a000}, {0xbcb7c000}, {0xbcb7e000}, + {0xbcb80000}, {0xbcb82000}, {0xbcb84000}, {0xbcb86000}, + {0xbcb88000}, {0xbcb8a000}, {0xbcb8c000}, {0xbcb8e000}, + {0xbcb90000}, {0xbcb92000}, {0xbcb94000}, {0xbcb96000}, + {0xbcb98000}, {0xbcb9a000}, {0xbcb9c000}, {0xbcb9e000}, + {0xbcba0000}, {0xbcba2000}, {0xbcba4000}, {0xbcba6000}, + {0xbcba8000}, {0xbcbaa000}, {0xbcbac000}, {0xbcbae000}, + {0xbcbb0000}, {0xbcbb2000}, {0xbcbb4000}, {0xbcbb6000}, + {0xbcbb8000}, {0xbcbba000}, {0xbcbbc000}, {0xbcbbe000}, + {0xbcbc0000}, {0xbcbc2000}, {0xbcbc4000}, {0xbcbc6000}, + {0xbcbc8000}, {0xbcbca000}, {0xbcbcc000}, {0xbcbce000}, + {0xbcbd0000}, {0xbcbd2000}, {0xbcbd4000}, {0xbcbd6000}, + {0xbcbd8000}, {0xbcbda000}, {0xbcbdc000}, {0xbcbde000}, + {0xbcbe0000}, {0xbcbe2000}, {0xbcbe4000}, {0xbcbe6000}, + {0xbcbe8000}, {0xbcbea000}, {0xbcbec000}, {0xbcbee000}, + {0xbcbf0000}, {0xbcbf2000}, {0xbcbf4000}, {0xbcbf6000}, + {0xbcbf8000}, {0xbcbfa000}, {0xbcbfc000}, {0xbcbfe000}, + {0xbcc00000}, {0xbcc02000}, {0xbcc04000}, {0xbcc06000}, + {0xbcc08000}, {0xbcc0a000}, {0xbcc0c000}, {0xbcc0e000}, + {0xbcc10000}, {0xbcc12000}, {0xbcc14000}, {0xbcc16000}, + {0xbcc18000}, {0xbcc1a000}, {0xbcc1c000}, {0xbcc1e000}, + {0xbcc20000}, {0xbcc22000}, {0xbcc24000}, {0xbcc26000}, + {0xbcc28000}, {0xbcc2a000}, {0xbcc2c000}, {0xbcc2e000}, + {0xbcc30000}, {0xbcc32000}, {0xbcc34000}, {0xbcc36000}, + {0xbcc38000}, {0xbcc3a000}, {0xbcc3c000}, {0xbcc3e000}, + {0xbcc40000}, {0xbcc42000}, {0xbcc44000}, {0xbcc46000}, + {0xbcc48000}, {0xbcc4a000}, {0xbcc4c000}, {0xbcc4e000}, + {0xbcc50000}, {0xbcc52000}, {0xbcc54000}, {0xbcc56000}, + {0xbcc58000}, {0xbcc5a000}, {0xbcc5c000}, {0xbcc5e000}, + {0xbcc60000}, {0xbcc62000}, {0xbcc64000}, {0xbcc66000}, + {0xbcc68000}, {0xbcc6a000}, {0xbcc6c000}, {0xbcc6e000}, + {0xbcc70000}, {0xbcc72000}, {0xbcc74000}, {0xbcc76000}, + {0xbcc78000}, {0xbcc7a000}, {0xbcc7c000}, {0xbcc7e000}, + {0xbcc80000}, {0xbcc82000}, {0xbcc84000}, {0xbcc86000}, + {0xbcc88000}, {0xbcc8a000}, {0xbcc8c000}, {0xbcc8e000}, + {0xbcc90000}, {0xbcc92000}, {0xbcc94000}, {0xbcc96000}, + {0xbcc98000}, {0xbcc9a000}, {0xbcc9c000}, {0xbcc9e000}, + {0xbcca0000}, {0xbcca2000}, {0xbcca4000}, {0xbcca6000}, + {0xbcca8000}, {0xbccaa000}, {0xbccac000}, {0xbccae000}, + {0xbccb0000}, {0xbccb2000}, {0xbccb4000}, {0xbccb6000}, + {0xbccb8000}, {0xbccba000}, {0xbccbc000}, {0xbccbe000}, + {0xbccc0000}, {0xbccc2000}, {0xbccc4000}, {0xbccc6000}, + {0xbccc8000}, {0xbccca000}, {0xbcccc000}, {0xbccce000}, + {0xbccd0000}, {0xbccd2000}, {0xbccd4000}, {0xbccd6000}, + {0xbccd8000}, {0xbccda000}, {0xbccdc000}, {0xbccde000}, + {0xbcce0000}, {0xbcce2000}, {0xbcce4000}, {0xbcce6000}, + {0xbcce8000}, {0xbccea000}, {0xbccec000}, {0xbccee000}, + {0xbccf0000}, {0xbccf2000}, {0xbccf4000}, {0xbccf6000}, + {0xbccf8000}, {0xbccfa000}, {0xbccfc000}, {0xbccfe000}, + {0xbcd00000}, {0xbcd02000}, {0xbcd04000}, {0xbcd06000}, + {0xbcd08000}, {0xbcd0a000}, {0xbcd0c000}, {0xbcd0e000}, + {0xbcd10000}, {0xbcd12000}, {0xbcd14000}, {0xbcd16000}, + {0xbcd18000}, {0xbcd1a000}, {0xbcd1c000}, {0xbcd1e000}, + {0xbcd20000}, {0xbcd22000}, {0xbcd24000}, {0xbcd26000}, + {0xbcd28000}, {0xbcd2a000}, {0xbcd2c000}, {0xbcd2e000}, + {0xbcd30000}, {0xbcd32000}, {0xbcd34000}, {0xbcd36000}, + {0xbcd38000}, {0xbcd3a000}, {0xbcd3c000}, {0xbcd3e000}, + {0xbcd40000}, {0xbcd42000}, {0xbcd44000}, {0xbcd46000}, + {0xbcd48000}, {0xbcd4a000}, {0xbcd4c000}, {0xbcd4e000}, + {0xbcd50000}, {0xbcd52000}, {0xbcd54000}, {0xbcd56000}, + {0xbcd58000}, {0xbcd5a000}, {0xbcd5c000}, {0xbcd5e000}, + {0xbcd60000}, {0xbcd62000}, {0xbcd64000}, {0xbcd66000}, + {0xbcd68000}, {0xbcd6a000}, {0xbcd6c000}, {0xbcd6e000}, + {0xbcd70000}, {0xbcd72000}, {0xbcd74000}, {0xbcd76000}, + {0xbcd78000}, {0xbcd7a000}, {0xbcd7c000}, {0xbcd7e000}, + {0xbcd80000}, {0xbcd82000}, {0xbcd84000}, {0xbcd86000}, + {0xbcd88000}, {0xbcd8a000}, {0xbcd8c000}, {0xbcd8e000}, + {0xbcd90000}, {0xbcd92000}, {0xbcd94000}, {0xbcd96000}, + {0xbcd98000}, {0xbcd9a000}, {0xbcd9c000}, {0xbcd9e000}, + {0xbcda0000}, {0xbcda2000}, {0xbcda4000}, {0xbcda6000}, + {0xbcda8000}, {0xbcdaa000}, {0xbcdac000}, {0xbcdae000}, + {0xbcdb0000}, {0xbcdb2000}, {0xbcdb4000}, {0xbcdb6000}, + {0xbcdb8000}, {0xbcdba000}, {0xbcdbc000}, {0xbcdbe000}, + {0xbcdc0000}, {0xbcdc2000}, {0xbcdc4000}, {0xbcdc6000}, + {0xbcdc8000}, {0xbcdca000}, {0xbcdcc000}, {0xbcdce000}, + {0xbcdd0000}, {0xbcdd2000}, {0xbcdd4000}, {0xbcdd6000}, + {0xbcdd8000}, {0xbcdda000}, {0xbcddc000}, {0xbcdde000}, + {0xbcde0000}, {0xbcde2000}, {0xbcde4000}, {0xbcde6000}, + {0xbcde8000}, {0xbcdea000}, {0xbcdec000}, {0xbcdee000}, + {0xbcdf0000}, {0xbcdf2000}, {0xbcdf4000}, {0xbcdf6000}, + {0xbcdf8000}, {0xbcdfa000}, {0xbcdfc000}, {0xbcdfe000}, + {0xbce00000}, {0xbce02000}, {0xbce04000}, {0xbce06000}, + {0xbce08000}, {0xbce0a000}, {0xbce0c000}, {0xbce0e000}, + {0xbce10000}, {0xbce12000}, {0xbce14000}, {0xbce16000}, + {0xbce18000}, {0xbce1a000}, {0xbce1c000}, {0xbce1e000}, + {0xbce20000}, {0xbce22000}, {0xbce24000}, {0xbce26000}, + {0xbce28000}, {0xbce2a000}, {0xbce2c000}, {0xbce2e000}, + {0xbce30000}, {0xbce32000}, {0xbce34000}, {0xbce36000}, + {0xbce38000}, {0xbce3a000}, {0xbce3c000}, {0xbce3e000}, + {0xbce40000}, {0xbce42000}, {0xbce44000}, {0xbce46000}, + {0xbce48000}, {0xbce4a000}, {0xbce4c000}, {0xbce4e000}, + {0xbce50000}, {0xbce52000}, {0xbce54000}, {0xbce56000}, + {0xbce58000}, {0xbce5a000}, {0xbce5c000}, {0xbce5e000}, + {0xbce60000}, {0xbce62000}, {0xbce64000}, {0xbce66000}, + {0xbce68000}, {0xbce6a000}, {0xbce6c000}, {0xbce6e000}, + {0xbce70000}, {0xbce72000}, {0xbce74000}, {0xbce76000}, + {0xbce78000}, {0xbce7a000}, {0xbce7c000}, {0xbce7e000}, + {0xbce80000}, {0xbce82000}, {0xbce84000}, {0xbce86000}, + {0xbce88000}, {0xbce8a000}, {0xbce8c000}, {0xbce8e000}, + {0xbce90000}, {0xbce92000}, {0xbce94000}, {0xbce96000}, + {0xbce98000}, {0xbce9a000}, {0xbce9c000}, {0xbce9e000}, + {0xbcea0000}, {0xbcea2000}, {0xbcea4000}, {0xbcea6000}, + {0xbcea8000}, {0xbceaa000}, {0xbceac000}, {0xbceae000}, + {0xbceb0000}, {0xbceb2000}, {0xbceb4000}, {0xbceb6000}, + {0xbceb8000}, {0xbceba000}, {0xbcebc000}, {0xbcebe000}, + {0xbcec0000}, {0xbcec2000}, {0xbcec4000}, {0xbcec6000}, + {0xbcec8000}, {0xbceca000}, {0xbcecc000}, {0xbcece000}, + {0xbced0000}, {0xbced2000}, {0xbced4000}, {0xbced6000}, + {0xbced8000}, {0xbceda000}, {0xbcedc000}, {0xbcede000}, + {0xbcee0000}, {0xbcee2000}, {0xbcee4000}, {0xbcee6000}, + {0xbcee8000}, {0xbceea000}, {0xbceec000}, {0xbceee000}, + {0xbcef0000}, {0xbcef2000}, {0xbcef4000}, {0xbcef6000}, + {0xbcef8000}, {0xbcefa000}, {0xbcefc000}, {0xbcefe000}, + {0xbcf00000}, {0xbcf02000}, {0xbcf04000}, {0xbcf06000}, + {0xbcf08000}, {0xbcf0a000}, {0xbcf0c000}, {0xbcf0e000}, + {0xbcf10000}, {0xbcf12000}, {0xbcf14000}, {0xbcf16000}, + {0xbcf18000}, {0xbcf1a000}, {0xbcf1c000}, {0xbcf1e000}, + {0xbcf20000}, {0xbcf22000}, {0xbcf24000}, {0xbcf26000}, + {0xbcf28000}, {0xbcf2a000}, {0xbcf2c000}, {0xbcf2e000}, + {0xbcf30000}, {0xbcf32000}, {0xbcf34000}, {0xbcf36000}, + {0xbcf38000}, {0xbcf3a000}, {0xbcf3c000}, {0xbcf3e000}, + {0xbcf40000}, {0xbcf42000}, {0xbcf44000}, {0xbcf46000}, + {0xbcf48000}, {0xbcf4a000}, {0xbcf4c000}, {0xbcf4e000}, + {0xbcf50000}, {0xbcf52000}, {0xbcf54000}, {0xbcf56000}, + {0xbcf58000}, {0xbcf5a000}, {0xbcf5c000}, {0xbcf5e000}, + {0xbcf60000}, {0xbcf62000}, {0xbcf64000}, {0xbcf66000}, + {0xbcf68000}, {0xbcf6a000}, {0xbcf6c000}, {0xbcf6e000}, + {0xbcf70000}, {0xbcf72000}, {0xbcf74000}, {0xbcf76000}, + {0xbcf78000}, {0xbcf7a000}, {0xbcf7c000}, {0xbcf7e000}, + {0xbcf80000}, {0xbcf82000}, {0xbcf84000}, {0xbcf86000}, + {0xbcf88000}, {0xbcf8a000}, {0xbcf8c000}, {0xbcf8e000}, + {0xbcf90000}, {0xbcf92000}, {0xbcf94000}, {0xbcf96000}, + {0xbcf98000}, {0xbcf9a000}, {0xbcf9c000}, {0xbcf9e000}, + {0xbcfa0000}, {0xbcfa2000}, {0xbcfa4000}, {0xbcfa6000}, + {0xbcfa8000}, {0xbcfaa000}, {0xbcfac000}, {0xbcfae000}, + {0xbcfb0000}, {0xbcfb2000}, {0xbcfb4000}, {0xbcfb6000}, + {0xbcfb8000}, {0xbcfba000}, {0xbcfbc000}, {0xbcfbe000}, + {0xbcfc0000}, {0xbcfc2000}, {0xbcfc4000}, {0xbcfc6000}, + {0xbcfc8000}, {0xbcfca000}, {0xbcfcc000}, {0xbcfce000}, + {0xbcfd0000}, {0xbcfd2000}, {0xbcfd4000}, {0xbcfd6000}, + {0xbcfd8000}, {0xbcfda000}, {0xbcfdc000}, {0xbcfde000}, + {0xbcfe0000}, {0xbcfe2000}, {0xbcfe4000}, {0xbcfe6000}, + {0xbcfe8000}, {0xbcfea000}, {0xbcfec000}, {0xbcfee000}, + {0xbcff0000}, {0xbcff2000}, {0xbcff4000}, {0xbcff6000}, + {0xbcff8000}, {0xbcffa000}, {0xbcffc000}, {0xbcffe000}, + {0xbd000000}, {0xbd002000}, {0xbd004000}, {0xbd006000}, + {0xbd008000}, {0xbd00a000}, {0xbd00c000}, {0xbd00e000}, + {0xbd010000}, {0xbd012000}, {0xbd014000}, {0xbd016000}, + {0xbd018000}, {0xbd01a000}, {0xbd01c000}, {0xbd01e000}, + {0xbd020000}, {0xbd022000}, {0xbd024000}, {0xbd026000}, + {0xbd028000}, {0xbd02a000}, {0xbd02c000}, {0xbd02e000}, + {0xbd030000}, {0xbd032000}, {0xbd034000}, {0xbd036000}, + {0xbd038000}, {0xbd03a000}, {0xbd03c000}, {0xbd03e000}, + {0xbd040000}, {0xbd042000}, {0xbd044000}, {0xbd046000}, + {0xbd048000}, {0xbd04a000}, {0xbd04c000}, {0xbd04e000}, + {0xbd050000}, {0xbd052000}, {0xbd054000}, {0xbd056000}, + {0xbd058000}, {0xbd05a000}, {0xbd05c000}, {0xbd05e000}, + {0xbd060000}, {0xbd062000}, {0xbd064000}, {0xbd066000}, + {0xbd068000}, {0xbd06a000}, {0xbd06c000}, {0xbd06e000}, + {0xbd070000}, {0xbd072000}, {0xbd074000}, {0xbd076000}, + {0xbd078000}, {0xbd07a000}, {0xbd07c000}, {0xbd07e000}, + {0xbd080000}, {0xbd082000}, {0xbd084000}, {0xbd086000}, + {0xbd088000}, {0xbd08a000}, {0xbd08c000}, {0xbd08e000}, + {0xbd090000}, {0xbd092000}, {0xbd094000}, {0xbd096000}, + {0xbd098000}, {0xbd09a000}, {0xbd09c000}, {0xbd09e000}, + {0xbd0a0000}, {0xbd0a2000}, {0xbd0a4000}, {0xbd0a6000}, + {0xbd0a8000}, {0xbd0aa000}, {0xbd0ac000}, {0xbd0ae000}, + {0xbd0b0000}, {0xbd0b2000}, {0xbd0b4000}, {0xbd0b6000}, + {0xbd0b8000}, {0xbd0ba000}, {0xbd0bc000}, {0xbd0be000}, + {0xbd0c0000}, {0xbd0c2000}, {0xbd0c4000}, {0xbd0c6000}, + {0xbd0c8000}, {0xbd0ca000}, {0xbd0cc000}, {0xbd0ce000}, + {0xbd0d0000}, {0xbd0d2000}, {0xbd0d4000}, {0xbd0d6000}, + {0xbd0d8000}, {0xbd0da000}, {0xbd0dc000}, {0xbd0de000}, + {0xbd0e0000}, {0xbd0e2000}, {0xbd0e4000}, {0xbd0e6000}, + {0xbd0e8000}, {0xbd0ea000}, {0xbd0ec000}, {0xbd0ee000}, + {0xbd0f0000}, {0xbd0f2000}, {0xbd0f4000}, {0xbd0f6000}, + {0xbd0f8000}, {0xbd0fa000}, {0xbd0fc000}, {0xbd0fe000}, + {0xbd100000}, {0xbd102000}, {0xbd104000}, {0xbd106000}, + {0xbd108000}, {0xbd10a000}, {0xbd10c000}, {0xbd10e000}, + {0xbd110000}, {0xbd112000}, {0xbd114000}, {0xbd116000}, + {0xbd118000}, {0xbd11a000}, {0xbd11c000}, {0xbd11e000}, + {0xbd120000}, {0xbd122000}, {0xbd124000}, {0xbd126000}, + {0xbd128000}, {0xbd12a000}, {0xbd12c000}, {0xbd12e000}, + {0xbd130000}, {0xbd132000}, {0xbd134000}, {0xbd136000}, + {0xbd138000}, {0xbd13a000}, {0xbd13c000}, {0xbd13e000}, + {0xbd140000}, {0xbd142000}, {0xbd144000}, {0xbd146000}, + {0xbd148000}, {0xbd14a000}, {0xbd14c000}, {0xbd14e000}, + {0xbd150000}, {0xbd152000}, {0xbd154000}, {0xbd156000}, + {0xbd158000}, {0xbd15a000}, {0xbd15c000}, {0xbd15e000}, + {0xbd160000}, {0xbd162000}, {0xbd164000}, {0xbd166000}, + {0xbd168000}, {0xbd16a000}, {0xbd16c000}, {0xbd16e000}, + {0xbd170000}, {0xbd172000}, {0xbd174000}, {0xbd176000}, + {0xbd178000}, {0xbd17a000}, {0xbd17c000}, {0xbd17e000}, + {0xbd180000}, {0xbd182000}, {0xbd184000}, {0xbd186000}, + {0xbd188000}, {0xbd18a000}, {0xbd18c000}, {0xbd18e000}, + {0xbd190000}, {0xbd192000}, {0xbd194000}, {0xbd196000}, + {0xbd198000}, {0xbd19a000}, {0xbd19c000}, {0xbd19e000}, + {0xbd1a0000}, {0xbd1a2000}, {0xbd1a4000}, {0xbd1a6000}, + {0xbd1a8000}, {0xbd1aa000}, {0xbd1ac000}, {0xbd1ae000}, + {0xbd1b0000}, {0xbd1b2000}, {0xbd1b4000}, {0xbd1b6000}, + {0xbd1b8000}, {0xbd1ba000}, {0xbd1bc000}, {0xbd1be000}, + {0xbd1c0000}, {0xbd1c2000}, {0xbd1c4000}, {0xbd1c6000}, + {0xbd1c8000}, {0xbd1ca000}, {0xbd1cc000}, {0xbd1ce000}, + {0xbd1d0000}, {0xbd1d2000}, {0xbd1d4000}, {0xbd1d6000}, + {0xbd1d8000}, {0xbd1da000}, {0xbd1dc000}, {0xbd1de000}, + {0xbd1e0000}, {0xbd1e2000}, {0xbd1e4000}, {0xbd1e6000}, + {0xbd1e8000}, {0xbd1ea000}, {0xbd1ec000}, {0xbd1ee000}, + {0xbd1f0000}, {0xbd1f2000}, {0xbd1f4000}, {0xbd1f6000}, + {0xbd1f8000}, {0xbd1fa000}, {0xbd1fc000}, {0xbd1fe000}, + {0xbd200000}, {0xbd202000}, {0xbd204000}, {0xbd206000}, + {0xbd208000}, {0xbd20a000}, {0xbd20c000}, {0xbd20e000}, + {0xbd210000}, {0xbd212000}, {0xbd214000}, {0xbd216000}, + {0xbd218000}, {0xbd21a000}, {0xbd21c000}, {0xbd21e000}, + {0xbd220000}, {0xbd222000}, {0xbd224000}, {0xbd226000}, + {0xbd228000}, {0xbd22a000}, {0xbd22c000}, {0xbd22e000}, + {0xbd230000}, {0xbd232000}, {0xbd234000}, {0xbd236000}, + {0xbd238000}, {0xbd23a000}, {0xbd23c000}, {0xbd23e000}, + {0xbd240000}, {0xbd242000}, {0xbd244000}, {0xbd246000}, + {0xbd248000}, {0xbd24a000}, {0xbd24c000}, {0xbd24e000}, + {0xbd250000}, {0xbd252000}, {0xbd254000}, {0xbd256000}, + {0xbd258000}, {0xbd25a000}, {0xbd25c000}, {0xbd25e000}, + {0xbd260000}, {0xbd262000}, {0xbd264000}, {0xbd266000}, + {0xbd268000}, {0xbd26a000}, {0xbd26c000}, {0xbd26e000}, + {0xbd270000}, {0xbd272000}, {0xbd274000}, {0xbd276000}, + {0xbd278000}, {0xbd27a000}, {0xbd27c000}, {0xbd27e000}, + {0xbd280000}, {0xbd282000}, {0xbd284000}, {0xbd286000}, + {0xbd288000}, {0xbd28a000}, {0xbd28c000}, {0xbd28e000}, + {0xbd290000}, {0xbd292000}, {0xbd294000}, {0xbd296000}, + {0xbd298000}, {0xbd29a000}, {0xbd29c000}, {0xbd29e000}, + {0xbd2a0000}, {0xbd2a2000}, {0xbd2a4000}, {0xbd2a6000}, + {0xbd2a8000}, {0xbd2aa000}, {0xbd2ac000}, {0xbd2ae000}, + {0xbd2b0000}, {0xbd2b2000}, {0xbd2b4000}, {0xbd2b6000}, + {0xbd2b8000}, {0xbd2ba000}, {0xbd2bc000}, {0xbd2be000}, + {0xbd2c0000}, {0xbd2c2000}, {0xbd2c4000}, {0xbd2c6000}, + {0xbd2c8000}, {0xbd2ca000}, {0xbd2cc000}, {0xbd2ce000}, + {0xbd2d0000}, {0xbd2d2000}, {0xbd2d4000}, {0xbd2d6000}, + {0xbd2d8000}, {0xbd2da000}, {0xbd2dc000}, {0xbd2de000}, + {0xbd2e0000}, {0xbd2e2000}, {0xbd2e4000}, {0xbd2e6000}, + {0xbd2e8000}, {0xbd2ea000}, {0xbd2ec000}, {0xbd2ee000}, + {0xbd2f0000}, {0xbd2f2000}, {0xbd2f4000}, {0xbd2f6000}, + {0xbd2f8000}, {0xbd2fa000}, {0xbd2fc000}, {0xbd2fe000}, + {0xbd300000}, {0xbd302000}, {0xbd304000}, {0xbd306000}, + {0xbd308000}, {0xbd30a000}, {0xbd30c000}, {0xbd30e000}, + {0xbd310000}, {0xbd312000}, {0xbd314000}, {0xbd316000}, + {0xbd318000}, {0xbd31a000}, {0xbd31c000}, {0xbd31e000}, + {0xbd320000}, {0xbd322000}, {0xbd324000}, {0xbd326000}, + {0xbd328000}, {0xbd32a000}, {0xbd32c000}, {0xbd32e000}, + {0xbd330000}, {0xbd332000}, {0xbd334000}, {0xbd336000}, + {0xbd338000}, {0xbd33a000}, {0xbd33c000}, {0xbd33e000}, + {0xbd340000}, {0xbd342000}, {0xbd344000}, {0xbd346000}, + {0xbd348000}, {0xbd34a000}, {0xbd34c000}, {0xbd34e000}, + {0xbd350000}, {0xbd352000}, {0xbd354000}, {0xbd356000}, + {0xbd358000}, {0xbd35a000}, {0xbd35c000}, {0xbd35e000}, + {0xbd360000}, {0xbd362000}, {0xbd364000}, {0xbd366000}, + {0xbd368000}, {0xbd36a000}, {0xbd36c000}, {0xbd36e000}, + {0xbd370000}, {0xbd372000}, {0xbd374000}, {0xbd376000}, + {0xbd378000}, {0xbd37a000}, {0xbd37c000}, {0xbd37e000}, + {0xbd380000}, {0xbd382000}, {0xbd384000}, {0xbd386000}, + {0xbd388000}, {0xbd38a000}, {0xbd38c000}, {0xbd38e000}, + {0xbd390000}, {0xbd392000}, {0xbd394000}, {0xbd396000}, + {0xbd398000}, {0xbd39a000}, {0xbd39c000}, {0xbd39e000}, + {0xbd3a0000}, {0xbd3a2000}, {0xbd3a4000}, {0xbd3a6000}, + {0xbd3a8000}, {0xbd3aa000}, {0xbd3ac000}, {0xbd3ae000}, + {0xbd3b0000}, {0xbd3b2000}, {0xbd3b4000}, {0xbd3b6000}, + {0xbd3b8000}, {0xbd3ba000}, {0xbd3bc000}, {0xbd3be000}, + {0xbd3c0000}, {0xbd3c2000}, {0xbd3c4000}, {0xbd3c6000}, + {0xbd3c8000}, {0xbd3ca000}, {0xbd3cc000}, {0xbd3ce000}, + {0xbd3d0000}, {0xbd3d2000}, {0xbd3d4000}, {0xbd3d6000}, + {0xbd3d8000}, {0xbd3da000}, {0xbd3dc000}, {0xbd3de000}, + {0xbd3e0000}, {0xbd3e2000}, {0xbd3e4000}, {0xbd3e6000}, + {0xbd3e8000}, {0xbd3ea000}, {0xbd3ec000}, {0xbd3ee000}, + {0xbd3f0000}, {0xbd3f2000}, {0xbd3f4000}, {0xbd3f6000}, + {0xbd3f8000}, {0xbd3fa000}, {0xbd3fc000}, {0xbd3fe000}, + {0xbd400000}, {0xbd402000}, {0xbd404000}, {0xbd406000}, + {0xbd408000}, {0xbd40a000}, {0xbd40c000}, {0xbd40e000}, + {0xbd410000}, {0xbd412000}, {0xbd414000}, {0xbd416000}, + {0xbd418000}, {0xbd41a000}, {0xbd41c000}, {0xbd41e000}, + {0xbd420000}, {0xbd422000}, {0xbd424000}, {0xbd426000}, + {0xbd428000}, {0xbd42a000}, {0xbd42c000}, {0xbd42e000}, + {0xbd430000}, {0xbd432000}, {0xbd434000}, {0xbd436000}, + {0xbd438000}, {0xbd43a000}, {0xbd43c000}, {0xbd43e000}, + {0xbd440000}, {0xbd442000}, {0xbd444000}, {0xbd446000}, + {0xbd448000}, {0xbd44a000}, {0xbd44c000}, {0xbd44e000}, + {0xbd450000}, {0xbd452000}, {0xbd454000}, {0xbd456000}, + {0xbd458000}, {0xbd45a000}, {0xbd45c000}, {0xbd45e000}, + {0xbd460000}, {0xbd462000}, {0xbd464000}, {0xbd466000}, + {0xbd468000}, {0xbd46a000}, {0xbd46c000}, {0xbd46e000}, + {0xbd470000}, {0xbd472000}, {0xbd474000}, {0xbd476000}, + {0xbd478000}, {0xbd47a000}, {0xbd47c000}, {0xbd47e000}, + {0xbd480000}, {0xbd482000}, {0xbd484000}, {0xbd486000}, + {0xbd488000}, {0xbd48a000}, {0xbd48c000}, {0xbd48e000}, + {0xbd490000}, {0xbd492000}, {0xbd494000}, {0xbd496000}, + {0xbd498000}, {0xbd49a000}, {0xbd49c000}, {0xbd49e000}, + {0xbd4a0000}, {0xbd4a2000}, {0xbd4a4000}, {0xbd4a6000}, + {0xbd4a8000}, {0xbd4aa000}, {0xbd4ac000}, {0xbd4ae000}, + {0xbd4b0000}, {0xbd4b2000}, {0xbd4b4000}, {0xbd4b6000}, + {0xbd4b8000}, {0xbd4ba000}, {0xbd4bc000}, {0xbd4be000}, + {0xbd4c0000}, {0xbd4c2000}, {0xbd4c4000}, {0xbd4c6000}, + {0xbd4c8000}, {0xbd4ca000}, {0xbd4cc000}, {0xbd4ce000}, + {0xbd4d0000}, {0xbd4d2000}, {0xbd4d4000}, {0xbd4d6000}, + {0xbd4d8000}, {0xbd4da000}, {0xbd4dc000}, {0xbd4de000}, + {0xbd4e0000}, {0xbd4e2000}, {0xbd4e4000}, {0xbd4e6000}, + {0xbd4e8000}, {0xbd4ea000}, {0xbd4ec000}, {0xbd4ee000}, + {0xbd4f0000}, {0xbd4f2000}, {0xbd4f4000}, {0xbd4f6000}, + {0xbd4f8000}, {0xbd4fa000}, {0xbd4fc000}, {0xbd4fe000}, + {0xbd500000}, {0xbd502000}, {0xbd504000}, {0xbd506000}, + {0xbd508000}, {0xbd50a000}, {0xbd50c000}, {0xbd50e000}, + {0xbd510000}, {0xbd512000}, {0xbd514000}, {0xbd516000}, + {0xbd518000}, {0xbd51a000}, {0xbd51c000}, {0xbd51e000}, + {0xbd520000}, {0xbd522000}, {0xbd524000}, {0xbd526000}, + {0xbd528000}, {0xbd52a000}, {0xbd52c000}, {0xbd52e000}, + {0xbd530000}, {0xbd532000}, {0xbd534000}, {0xbd536000}, + {0xbd538000}, {0xbd53a000}, {0xbd53c000}, {0xbd53e000}, + {0xbd540000}, {0xbd542000}, {0xbd544000}, {0xbd546000}, + {0xbd548000}, {0xbd54a000}, {0xbd54c000}, {0xbd54e000}, + {0xbd550000}, {0xbd552000}, {0xbd554000}, {0xbd556000}, + {0xbd558000}, {0xbd55a000}, {0xbd55c000}, {0xbd55e000}, + {0xbd560000}, {0xbd562000}, {0xbd564000}, {0xbd566000}, + {0xbd568000}, {0xbd56a000}, {0xbd56c000}, {0xbd56e000}, + {0xbd570000}, {0xbd572000}, {0xbd574000}, {0xbd576000}, + {0xbd578000}, {0xbd57a000}, {0xbd57c000}, {0xbd57e000}, + {0xbd580000}, {0xbd582000}, {0xbd584000}, {0xbd586000}, + {0xbd588000}, {0xbd58a000}, {0xbd58c000}, {0xbd58e000}, + {0xbd590000}, {0xbd592000}, {0xbd594000}, {0xbd596000}, + {0xbd598000}, {0xbd59a000}, {0xbd59c000}, {0xbd59e000}, + {0xbd5a0000}, {0xbd5a2000}, {0xbd5a4000}, {0xbd5a6000}, + {0xbd5a8000}, {0xbd5aa000}, {0xbd5ac000}, {0xbd5ae000}, + {0xbd5b0000}, {0xbd5b2000}, {0xbd5b4000}, {0xbd5b6000}, + {0xbd5b8000}, {0xbd5ba000}, {0xbd5bc000}, {0xbd5be000}, + {0xbd5c0000}, {0xbd5c2000}, {0xbd5c4000}, {0xbd5c6000}, + {0xbd5c8000}, {0xbd5ca000}, {0xbd5cc000}, {0xbd5ce000}, + {0xbd5d0000}, {0xbd5d2000}, {0xbd5d4000}, {0xbd5d6000}, + {0xbd5d8000}, {0xbd5da000}, {0xbd5dc000}, {0xbd5de000}, + {0xbd5e0000}, {0xbd5e2000}, {0xbd5e4000}, {0xbd5e6000}, + {0xbd5e8000}, {0xbd5ea000}, {0xbd5ec000}, {0xbd5ee000}, + {0xbd5f0000}, {0xbd5f2000}, {0xbd5f4000}, {0xbd5f6000}, + {0xbd5f8000}, {0xbd5fa000}, {0xbd5fc000}, {0xbd5fe000}, + {0xbd600000}, {0xbd602000}, {0xbd604000}, {0xbd606000}, + {0xbd608000}, {0xbd60a000}, {0xbd60c000}, {0xbd60e000}, + {0xbd610000}, {0xbd612000}, {0xbd614000}, {0xbd616000}, + {0xbd618000}, {0xbd61a000}, {0xbd61c000}, {0xbd61e000}, + {0xbd620000}, {0xbd622000}, {0xbd624000}, {0xbd626000}, + {0xbd628000}, {0xbd62a000}, {0xbd62c000}, {0xbd62e000}, + {0xbd630000}, {0xbd632000}, {0xbd634000}, {0xbd636000}, + {0xbd638000}, {0xbd63a000}, {0xbd63c000}, {0xbd63e000}, + {0xbd640000}, {0xbd642000}, {0xbd644000}, {0xbd646000}, + {0xbd648000}, {0xbd64a000}, {0xbd64c000}, {0xbd64e000}, + {0xbd650000}, {0xbd652000}, {0xbd654000}, {0xbd656000}, + {0xbd658000}, {0xbd65a000}, {0xbd65c000}, {0xbd65e000}, + {0xbd660000}, {0xbd662000}, {0xbd664000}, {0xbd666000}, + {0xbd668000}, {0xbd66a000}, {0xbd66c000}, {0xbd66e000}, + {0xbd670000}, {0xbd672000}, {0xbd674000}, {0xbd676000}, + {0xbd678000}, {0xbd67a000}, {0xbd67c000}, {0xbd67e000}, + {0xbd680000}, {0xbd682000}, {0xbd684000}, {0xbd686000}, + {0xbd688000}, {0xbd68a000}, {0xbd68c000}, {0xbd68e000}, + {0xbd690000}, {0xbd692000}, {0xbd694000}, {0xbd696000}, + {0xbd698000}, {0xbd69a000}, {0xbd69c000}, {0xbd69e000}, + {0xbd6a0000}, {0xbd6a2000}, {0xbd6a4000}, {0xbd6a6000}, + {0xbd6a8000}, {0xbd6aa000}, {0xbd6ac000}, {0xbd6ae000}, + {0xbd6b0000}, {0xbd6b2000}, {0xbd6b4000}, {0xbd6b6000}, + {0xbd6b8000}, {0xbd6ba000}, {0xbd6bc000}, {0xbd6be000}, + {0xbd6c0000}, {0xbd6c2000}, {0xbd6c4000}, {0xbd6c6000}, + {0xbd6c8000}, {0xbd6ca000}, {0xbd6cc000}, {0xbd6ce000}, + {0xbd6d0000}, {0xbd6d2000}, {0xbd6d4000}, {0xbd6d6000}, + {0xbd6d8000}, {0xbd6da000}, {0xbd6dc000}, {0xbd6de000}, + {0xbd6e0000}, {0xbd6e2000}, {0xbd6e4000}, {0xbd6e6000}, + {0xbd6e8000}, {0xbd6ea000}, {0xbd6ec000}, {0xbd6ee000}, + {0xbd6f0000}, {0xbd6f2000}, {0xbd6f4000}, {0xbd6f6000}, + {0xbd6f8000}, {0xbd6fa000}, {0xbd6fc000}, {0xbd6fe000}, + {0xbd700000}, {0xbd702000}, {0xbd704000}, {0xbd706000}, + {0xbd708000}, {0xbd70a000}, {0xbd70c000}, {0xbd70e000}, + {0xbd710000}, {0xbd712000}, {0xbd714000}, {0xbd716000}, + {0xbd718000}, {0xbd71a000}, {0xbd71c000}, {0xbd71e000}, + {0xbd720000}, {0xbd722000}, {0xbd724000}, {0xbd726000}, + {0xbd728000}, {0xbd72a000}, {0xbd72c000}, {0xbd72e000}, + {0xbd730000}, {0xbd732000}, {0xbd734000}, {0xbd736000}, + {0xbd738000}, {0xbd73a000}, {0xbd73c000}, {0xbd73e000}, + {0xbd740000}, {0xbd742000}, {0xbd744000}, {0xbd746000}, + {0xbd748000}, {0xbd74a000}, {0xbd74c000}, {0xbd74e000}, + {0xbd750000}, {0xbd752000}, {0xbd754000}, {0xbd756000}, + {0xbd758000}, {0xbd75a000}, {0xbd75c000}, {0xbd75e000}, + {0xbd760000}, {0xbd762000}, {0xbd764000}, {0xbd766000}, + {0xbd768000}, {0xbd76a000}, {0xbd76c000}, {0xbd76e000}, + {0xbd770000}, {0xbd772000}, {0xbd774000}, {0xbd776000}, + {0xbd778000}, {0xbd77a000}, {0xbd77c000}, {0xbd77e000}, + {0xbd780000}, {0xbd782000}, {0xbd784000}, {0xbd786000}, + {0xbd788000}, {0xbd78a000}, {0xbd78c000}, {0xbd78e000}, + {0xbd790000}, {0xbd792000}, {0xbd794000}, {0xbd796000}, + {0xbd798000}, {0xbd79a000}, {0xbd79c000}, {0xbd79e000}, + {0xbd7a0000}, {0xbd7a2000}, {0xbd7a4000}, {0xbd7a6000}, + {0xbd7a8000}, {0xbd7aa000}, {0xbd7ac000}, {0xbd7ae000}, + {0xbd7b0000}, {0xbd7b2000}, {0xbd7b4000}, {0xbd7b6000}, + {0xbd7b8000}, {0xbd7ba000}, {0xbd7bc000}, {0xbd7be000}, + {0xbd7c0000}, {0xbd7c2000}, {0xbd7c4000}, {0xbd7c6000}, + {0xbd7c8000}, {0xbd7ca000}, {0xbd7cc000}, {0xbd7ce000}, + {0xbd7d0000}, {0xbd7d2000}, {0xbd7d4000}, {0xbd7d6000}, + {0xbd7d8000}, {0xbd7da000}, {0xbd7dc000}, {0xbd7de000}, + {0xbd7e0000}, {0xbd7e2000}, {0xbd7e4000}, {0xbd7e6000}, + {0xbd7e8000}, {0xbd7ea000}, {0xbd7ec000}, {0xbd7ee000}, + {0xbd7f0000}, {0xbd7f2000}, {0xbd7f4000}, {0xbd7f6000}, + {0xbd7f8000}, {0xbd7fa000}, {0xbd7fc000}, {0xbd7fe000}, + {0xbd800000}, {0xbd802000}, {0xbd804000}, {0xbd806000}, + {0xbd808000}, {0xbd80a000}, {0xbd80c000}, {0xbd80e000}, + {0xbd810000}, {0xbd812000}, {0xbd814000}, {0xbd816000}, + {0xbd818000}, {0xbd81a000}, {0xbd81c000}, {0xbd81e000}, + {0xbd820000}, {0xbd822000}, {0xbd824000}, {0xbd826000}, + {0xbd828000}, {0xbd82a000}, {0xbd82c000}, {0xbd82e000}, + {0xbd830000}, {0xbd832000}, {0xbd834000}, {0xbd836000}, + {0xbd838000}, {0xbd83a000}, {0xbd83c000}, {0xbd83e000}, + {0xbd840000}, {0xbd842000}, {0xbd844000}, {0xbd846000}, + {0xbd848000}, {0xbd84a000}, {0xbd84c000}, {0xbd84e000}, + {0xbd850000}, {0xbd852000}, {0xbd854000}, {0xbd856000}, + {0xbd858000}, {0xbd85a000}, {0xbd85c000}, {0xbd85e000}, + {0xbd860000}, {0xbd862000}, {0xbd864000}, {0xbd866000}, + {0xbd868000}, {0xbd86a000}, {0xbd86c000}, {0xbd86e000}, + {0xbd870000}, {0xbd872000}, {0xbd874000}, {0xbd876000}, + {0xbd878000}, {0xbd87a000}, {0xbd87c000}, {0xbd87e000}, + {0xbd880000}, {0xbd882000}, {0xbd884000}, {0xbd886000}, + {0xbd888000}, {0xbd88a000}, {0xbd88c000}, {0xbd88e000}, + {0xbd890000}, {0xbd892000}, {0xbd894000}, {0xbd896000}, + {0xbd898000}, {0xbd89a000}, {0xbd89c000}, {0xbd89e000}, + {0xbd8a0000}, {0xbd8a2000}, {0xbd8a4000}, {0xbd8a6000}, + {0xbd8a8000}, {0xbd8aa000}, {0xbd8ac000}, {0xbd8ae000}, + {0xbd8b0000}, {0xbd8b2000}, {0xbd8b4000}, {0xbd8b6000}, + {0xbd8b8000}, {0xbd8ba000}, {0xbd8bc000}, {0xbd8be000}, + {0xbd8c0000}, {0xbd8c2000}, {0xbd8c4000}, {0xbd8c6000}, + {0xbd8c8000}, {0xbd8ca000}, {0xbd8cc000}, {0xbd8ce000}, + {0xbd8d0000}, {0xbd8d2000}, {0xbd8d4000}, {0xbd8d6000}, + {0xbd8d8000}, {0xbd8da000}, {0xbd8dc000}, {0xbd8de000}, + {0xbd8e0000}, {0xbd8e2000}, {0xbd8e4000}, {0xbd8e6000}, + {0xbd8e8000}, {0xbd8ea000}, {0xbd8ec000}, {0xbd8ee000}, + {0xbd8f0000}, {0xbd8f2000}, {0xbd8f4000}, {0xbd8f6000}, + {0xbd8f8000}, {0xbd8fa000}, {0xbd8fc000}, {0xbd8fe000}, + {0xbd900000}, {0xbd902000}, {0xbd904000}, {0xbd906000}, + {0xbd908000}, {0xbd90a000}, {0xbd90c000}, {0xbd90e000}, + {0xbd910000}, {0xbd912000}, {0xbd914000}, {0xbd916000}, + {0xbd918000}, {0xbd91a000}, {0xbd91c000}, {0xbd91e000}, + {0xbd920000}, {0xbd922000}, {0xbd924000}, {0xbd926000}, + {0xbd928000}, {0xbd92a000}, {0xbd92c000}, {0xbd92e000}, + {0xbd930000}, {0xbd932000}, {0xbd934000}, {0xbd936000}, + {0xbd938000}, {0xbd93a000}, {0xbd93c000}, {0xbd93e000}, + {0xbd940000}, {0xbd942000}, {0xbd944000}, {0xbd946000}, + {0xbd948000}, {0xbd94a000}, {0xbd94c000}, {0xbd94e000}, + {0xbd950000}, {0xbd952000}, {0xbd954000}, {0xbd956000}, + {0xbd958000}, {0xbd95a000}, {0xbd95c000}, {0xbd95e000}, + {0xbd960000}, {0xbd962000}, {0xbd964000}, {0xbd966000}, + {0xbd968000}, {0xbd96a000}, {0xbd96c000}, {0xbd96e000}, + {0xbd970000}, {0xbd972000}, {0xbd974000}, {0xbd976000}, + {0xbd978000}, {0xbd97a000}, {0xbd97c000}, {0xbd97e000}, + {0xbd980000}, {0xbd982000}, {0xbd984000}, {0xbd986000}, + {0xbd988000}, {0xbd98a000}, {0xbd98c000}, {0xbd98e000}, + {0xbd990000}, {0xbd992000}, {0xbd994000}, {0xbd996000}, + {0xbd998000}, {0xbd99a000}, {0xbd99c000}, {0xbd99e000}, + {0xbd9a0000}, {0xbd9a2000}, {0xbd9a4000}, {0xbd9a6000}, + {0xbd9a8000}, {0xbd9aa000}, {0xbd9ac000}, {0xbd9ae000}, + {0xbd9b0000}, {0xbd9b2000}, {0xbd9b4000}, {0xbd9b6000}, + {0xbd9b8000}, {0xbd9ba000}, {0xbd9bc000}, {0xbd9be000}, + {0xbd9c0000}, {0xbd9c2000}, {0xbd9c4000}, {0xbd9c6000}, + {0xbd9c8000}, {0xbd9ca000}, {0xbd9cc000}, {0xbd9ce000}, + {0xbd9d0000}, {0xbd9d2000}, {0xbd9d4000}, {0xbd9d6000}, + {0xbd9d8000}, {0xbd9da000}, {0xbd9dc000}, {0xbd9de000}, + {0xbd9e0000}, {0xbd9e2000}, {0xbd9e4000}, {0xbd9e6000}, + {0xbd9e8000}, {0xbd9ea000}, {0xbd9ec000}, {0xbd9ee000}, + {0xbd9f0000}, {0xbd9f2000}, {0xbd9f4000}, {0xbd9f6000}, + {0xbd9f8000}, {0xbd9fa000}, {0xbd9fc000}, {0xbd9fe000}, + {0xbda00000}, {0xbda02000}, {0xbda04000}, {0xbda06000}, + {0xbda08000}, {0xbda0a000}, {0xbda0c000}, {0xbda0e000}, + {0xbda10000}, {0xbda12000}, {0xbda14000}, {0xbda16000}, + {0xbda18000}, {0xbda1a000}, {0xbda1c000}, {0xbda1e000}, + {0xbda20000}, {0xbda22000}, {0xbda24000}, {0xbda26000}, + {0xbda28000}, {0xbda2a000}, {0xbda2c000}, {0xbda2e000}, + {0xbda30000}, {0xbda32000}, {0xbda34000}, {0xbda36000}, + {0xbda38000}, {0xbda3a000}, {0xbda3c000}, {0xbda3e000}, + {0xbda40000}, {0xbda42000}, {0xbda44000}, {0xbda46000}, + {0xbda48000}, {0xbda4a000}, {0xbda4c000}, {0xbda4e000}, + {0xbda50000}, {0xbda52000}, {0xbda54000}, {0xbda56000}, + {0xbda58000}, {0xbda5a000}, {0xbda5c000}, {0xbda5e000}, + {0xbda60000}, {0xbda62000}, {0xbda64000}, {0xbda66000}, + {0xbda68000}, {0xbda6a000}, {0xbda6c000}, {0xbda6e000}, + {0xbda70000}, {0xbda72000}, {0xbda74000}, {0xbda76000}, + {0xbda78000}, {0xbda7a000}, {0xbda7c000}, {0xbda7e000}, + {0xbda80000}, {0xbda82000}, {0xbda84000}, {0xbda86000}, + {0xbda88000}, {0xbda8a000}, {0xbda8c000}, {0xbda8e000}, + {0xbda90000}, {0xbda92000}, {0xbda94000}, {0xbda96000}, + {0xbda98000}, {0xbda9a000}, {0xbda9c000}, {0xbda9e000}, + {0xbdaa0000}, {0xbdaa2000}, {0xbdaa4000}, {0xbdaa6000}, + {0xbdaa8000}, {0xbdaaa000}, {0xbdaac000}, {0xbdaae000}, + {0xbdab0000}, {0xbdab2000}, {0xbdab4000}, {0xbdab6000}, + {0xbdab8000}, {0xbdaba000}, {0xbdabc000}, {0xbdabe000}, + {0xbdac0000}, {0xbdac2000}, {0xbdac4000}, {0xbdac6000}, + {0xbdac8000}, {0xbdaca000}, {0xbdacc000}, {0xbdace000}, + {0xbdad0000}, {0xbdad2000}, {0xbdad4000}, {0xbdad6000}, + {0xbdad8000}, {0xbdada000}, {0xbdadc000}, {0xbdade000}, + {0xbdae0000}, {0xbdae2000}, {0xbdae4000}, {0xbdae6000}, + {0xbdae8000}, {0xbdaea000}, {0xbdaec000}, {0xbdaee000}, + {0xbdaf0000}, {0xbdaf2000}, {0xbdaf4000}, {0xbdaf6000}, + {0xbdaf8000}, {0xbdafa000}, {0xbdafc000}, {0xbdafe000}, + {0xbdb00000}, {0xbdb02000}, {0xbdb04000}, {0xbdb06000}, + {0xbdb08000}, {0xbdb0a000}, {0xbdb0c000}, {0xbdb0e000}, + {0xbdb10000}, {0xbdb12000}, {0xbdb14000}, {0xbdb16000}, + {0xbdb18000}, {0xbdb1a000}, {0xbdb1c000}, {0xbdb1e000}, + {0xbdb20000}, {0xbdb22000}, {0xbdb24000}, {0xbdb26000}, + {0xbdb28000}, {0xbdb2a000}, {0xbdb2c000}, {0xbdb2e000}, + {0xbdb30000}, {0xbdb32000}, {0xbdb34000}, {0xbdb36000}, + {0xbdb38000}, {0xbdb3a000}, {0xbdb3c000}, {0xbdb3e000}, + {0xbdb40000}, {0xbdb42000}, {0xbdb44000}, {0xbdb46000}, + {0xbdb48000}, {0xbdb4a000}, {0xbdb4c000}, {0xbdb4e000}, + {0xbdb50000}, {0xbdb52000}, {0xbdb54000}, {0xbdb56000}, + {0xbdb58000}, {0xbdb5a000}, {0xbdb5c000}, {0xbdb5e000}, + {0xbdb60000}, {0xbdb62000}, {0xbdb64000}, {0xbdb66000}, + {0xbdb68000}, {0xbdb6a000}, {0xbdb6c000}, {0xbdb6e000}, + {0xbdb70000}, {0xbdb72000}, {0xbdb74000}, {0xbdb76000}, + {0xbdb78000}, {0xbdb7a000}, {0xbdb7c000}, {0xbdb7e000}, + {0xbdb80000}, {0xbdb82000}, {0xbdb84000}, {0xbdb86000}, + {0xbdb88000}, {0xbdb8a000}, {0xbdb8c000}, {0xbdb8e000}, + {0xbdb90000}, {0xbdb92000}, {0xbdb94000}, {0xbdb96000}, + {0xbdb98000}, {0xbdb9a000}, {0xbdb9c000}, {0xbdb9e000}, + {0xbdba0000}, {0xbdba2000}, {0xbdba4000}, {0xbdba6000}, + {0xbdba8000}, {0xbdbaa000}, {0xbdbac000}, {0xbdbae000}, + {0xbdbb0000}, {0xbdbb2000}, {0xbdbb4000}, {0xbdbb6000}, + {0xbdbb8000}, {0xbdbba000}, {0xbdbbc000}, {0xbdbbe000}, + {0xbdbc0000}, {0xbdbc2000}, {0xbdbc4000}, {0xbdbc6000}, + {0xbdbc8000}, {0xbdbca000}, {0xbdbcc000}, {0xbdbce000}, + {0xbdbd0000}, {0xbdbd2000}, {0xbdbd4000}, {0xbdbd6000}, + {0xbdbd8000}, {0xbdbda000}, {0xbdbdc000}, {0xbdbde000}, + {0xbdbe0000}, {0xbdbe2000}, {0xbdbe4000}, {0xbdbe6000}, + {0xbdbe8000}, {0xbdbea000}, {0xbdbec000}, {0xbdbee000}, + {0xbdbf0000}, {0xbdbf2000}, {0xbdbf4000}, {0xbdbf6000}, + {0xbdbf8000}, {0xbdbfa000}, {0xbdbfc000}, {0xbdbfe000}, + {0xbdc00000}, {0xbdc02000}, {0xbdc04000}, {0xbdc06000}, + {0xbdc08000}, {0xbdc0a000}, {0xbdc0c000}, {0xbdc0e000}, + {0xbdc10000}, {0xbdc12000}, {0xbdc14000}, {0xbdc16000}, + {0xbdc18000}, {0xbdc1a000}, {0xbdc1c000}, {0xbdc1e000}, + {0xbdc20000}, {0xbdc22000}, {0xbdc24000}, {0xbdc26000}, + {0xbdc28000}, {0xbdc2a000}, {0xbdc2c000}, {0xbdc2e000}, + {0xbdc30000}, {0xbdc32000}, {0xbdc34000}, {0xbdc36000}, + {0xbdc38000}, {0xbdc3a000}, {0xbdc3c000}, {0xbdc3e000}, + {0xbdc40000}, {0xbdc42000}, {0xbdc44000}, {0xbdc46000}, + {0xbdc48000}, {0xbdc4a000}, {0xbdc4c000}, {0xbdc4e000}, + {0xbdc50000}, {0xbdc52000}, {0xbdc54000}, {0xbdc56000}, + {0xbdc58000}, {0xbdc5a000}, {0xbdc5c000}, {0xbdc5e000}, + {0xbdc60000}, {0xbdc62000}, {0xbdc64000}, {0xbdc66000}, + {0xbdc68000}, {0xbdc6a000}, {0xbdc6c000}, {0xbdc6e000}, + {0xbdc70000}, {0xbdc72000}, {0xbdc74000}, {0xbdc76000}, + {0xbdc78000}, {0xbdc7a000}, {0xbdc7c000}, {0xbdc7e000}, + {0xbdc80000}, {0xbdc82000}, {0xbdc84000}, {0xbdc86000}, + {0xbdc88000}, {0xbdc8a000}, {0xbdc8c000}, {0xbdc8e000}, + {0xbdc90000}, {0xbdc92000}, {0xbdc94000}, {0xbdc96000}, + {0xbdc98000}, {0xbdc9a000}, {0xbdc9c000}, {0xbdc9e000}, + {0xbdca0000}, {0xbdca2000}, {0xbdca4000}, {0xbdca6000}, + {0xbdca8000}, {0xbdcaa000}, {0xbdcac000}, {0xbdcae000}, + {0xbdcb0000}, {0xbdcb2000}, {0xbdcb4000}, {0xbdcb6000}, + {0xbdcb8000}, {0xbdcba000}, {0xbdcbc000}, {0xbdcbe000}, + {0xbdcc0000}, {0xbdcc2000}, {0xbdcc4000}, {0xbdcc6000}, + {0xbdcc8000}, {0xbdcca000}, {0xbdccc000}, {0xbdcce000}, + {0xbdcd0000}, {0xbdcd2000}, {0xbdcd4000}, {0xbdcd6000}, + {0xbdcd8000}, {0xbdcda000}, {0xbdcdc000}, {0xbdcde000}, + {0xbdce0000}, {0xbdce2000}, {0xbdce4000}, {0xbdce6000}, + {0xbdce8000}, {0xbdcea000}, {0xbdcec000}, {0xbdcee000}, + {0xbdcf0000}, {0xbdcf2000}, {0xbdcf4000}, {0xbdcf6000}, + {0xbdcf8000}, {0xbdcfa000}, {0xbdcfc000}, {0xbdcfe000}, + {0xbdd00000}, {0xbdd02000}, {0xbdd04000}, {0xbdd06000}, + {0xbdd08000}, {0xbdd0a000}, {0xbdd0c000}, {0xbdd0e000}, + {0xbdd10000}, {0xbdd12000}, {0xbdd14000}, {0xbdd16000}, + {0xbdd18000}, {0xbdd1a000}, {0xbdd1c000}, {0xbdd1e000}, + {0xbdd20000}, {0xbdd22000}, {0xbdd24000}, {0xbdd26000}, + {0xbdd28000}, {0xbdd2a000}, {0xbdd2c000}, {0xbdd2e000}, + {0xbdd30000}, {0xbdd32000}, {0xbdd34000}, {0xbdd36000}, + {0xbdd38000}, {0xbdd3a000}, {0xbdd3c000}, {0xbdd3e000}, + {0xbdd40000}, {0xbdd42000}, {0xbdd44000}, {0xbdd46000}, + {0xbdd48000}, {0xbdd4a000}, {0xbdd4c000}, {0xbdd4e000}, + {0xbdd50000}, {0xbdd52000}, {0xbdd54000}, {0xbdd56000}, + {0xbdd58000}, {0xbdd5a000}, {0xbdd5c000}, {0xbdd5e000}, + {0xbdd60000}, {0xbdd62000}, {0xbdd64000}, {0xbdd66000}, + {0xbdd68000}, {0xbdd6a000}, {0xbdd6c000}, {0xbdd6e000}, + {0xbdd70000}, {0xbdd72000}, {0xbdd74000}, {0xbdd76000}, + {0xbdd78000}, {0xbdd7a000}, {0xbdd7c000}, {0xbdd7e000}, + {0xbdd80000}, {0xbdd82000}, {0xbdd84000}, {0xbdd86000}, + {0xbdd88000}, {0xbdd8a000}, {0xbdd8c000}, {0xbdd8e000}, + {0xbdd90000}, {0xbdd92000}, {0xbdd94000}, {0xbdd96000}, + {0xbdd98000}, {0xbdd9a000}, {0xbdd9c000}, {0xbdd9e000}, + {0xbdda0000}, {0xbdda2000}, {0xbdda4000}, {0xbdda6000}, + {0xbdda8000}, {0xbddaa000}, {0xbddac000}, {0xbddae000}, + {0xbddb0000}, {0xbddb2000}, {0xbddb4000}, {0xbddb6000}, + {0xbddb8000}, {0xbddba000}, {0xbddbc000}, {0xbddbe000}, + {0xbddc0000}, {0xbddc2000}, {0xbddc4000}, {0xbddc6000}, + {0xbddc8000}, {0xbddca000}, {0xbddcc000}, {0xbddce000}, + {0xbddd0000}, {0xbddd2000}, {0xbddd4000}, {0xbddd6000}, + {0xbddd8000}, {0xbddda000}, {0xbdddc000}, {0xbddde000}, + {0xbdde0000}, {0xbdde2000}, {0xbdde4000}, {0xbdde6000}, + {0xbdde8000}, {0xbddea000}, {0xbddec000}, {0xbddee000}, + {0xbddf0000}, {0xbddf2000}, {0xbddf4000}, {0xbddf6000}, + {0xbddf8000}, {0xbddfa000}, {0xbddfc000}, {0xbddfe000}, + {0xbde00000}, {0xbde02000}, {0xbde04000}, {0xbde06000}, + {0xbde08000}, {0xbde0a000}, {0xbde0c000}, {0xbde0e000}, + {0xbde10000}, {0xbde12000}, {0xbde14000}, {0xbde16000}, + {0xbde18000}, {0xbde1a000}, {0xbde1c000}, {0xbde1e000}, + {0xbde20000}, {0xbde22000}, {0xbde24000}, {0xbde26000}, + {0xbde28000}, {0xbde2a000}, {0xbde2c000}, {0xbde2e000}, + {0xbde30000}, {0xbde32000}, {0xbde34000}, {0xbde36000}, + {0xbde38000}, {0xbde3a000}, {0xbde3c000}, {0xbde3e000}, + {0xbde40000}, {0xbde42000}, {0xbde44000}, {0xbde46000}, + {0xbde48000}, {0xbde4a000}, {0xbde4c000}, {0xbde4e000}, + {0xbde50000}, {0xbde52000}, {0xbde54000}, {0xbde56000}, + {0xbde58000}, {0xbde5a000}, {0xbde5c000}, {0xbde5e000}, + {0xbde60000}, {0xbde62000}, {0xbde64000}, {0xbde66000}, + {0xbde68000}, {0xbde6a000}, {0xbde6c000}, {0xbde6e000}, + {0xbde70000}, {0xbde72000}, {0xbde74000}, {0xbde76000}, + {0xbde78000}, {0xbde7a000}, {0xbde7c000}, {0xbde7e000}, + {0xbde80000}, {0xbde82000}, {0xbde84000}, {0xbde86000}, + {0xbde88000}, {0xbde8a000}, {0xbde8c000}, {0xbde8e000}, + {0xbde90000}, {0xbde92000}, {0xbde94000}, {0xbde96000}, + {0xbde98000}, {0xbde9a000}, {0xbde9c000}, {0xbde9e000}, + {0xbdea0000}, {0xbdea2000}, {0xbdea4000}, {0xbdea6000}, + {0xbdea8000}, {0xbdeaa000}, {0xbdeac000}, {0xbdeae000}, + {0xbdeb0000}, {0xbdeb2000}, {0xbdeb4000}, {0xbdeb6000}, + {0xbdeb8000}, {0xbdeba000}, {0xbdebc000}, {0xbdebe000}, + {0xbdec0000}, {0xbdec2000}, {0xbdec4000}, {0xbdec6000}, + {0xbdec8000}, {0xbdeca000}, {0xbdecc000}, {0xbdece000}, + {0xbded0000}, {0xbded2000}, {0xbded4000}, {0xbded6000}, + {0xbded8000}, {0xbdeda000}, {0xbdedc000}, {0xbdede000}, + {0xbdee0000}, {0xbdee2000}, {0xbdee4000}, {0xbdee6000}, + {0xbdee8000}, {0xbdeea000}, {0xbdeec000}, {0xbdeee000}, + {0xbdef0000}, {0xbdef2000}, {0xbdef4000}, {0xbdef6000}, + {0xbdef8000}, {0xbdefa000}, {0xbdefc000}, {0xbdefe000}, + {0xbdf00000}, {0xbdf02000}, {0xbdf04000}, {0xbdf06000}, + {0xbdf08000}, {0xbdf0a000}, {0xbdf0c000}, {0xbdf0e000}, + {0xbdf10000}, {0xbdf12000}, {0xbdf14000}, {0xbdf16000}, + {0xbdf18000}, {0xbdf1a000}, {0xbdf1c000}, {0xbdf1e000}, + {0xbdf20000}, {0xbdf22000}, {0xbdf24000}, {0xbdf26000}, + {0xbdf28000}, {0xbdf2a000}, {0xbdf2c000}, {0xbdf2e000}, + {0xbdf30000}, {0xbdf32000}, {0xbdf34000}, {0xbdf36000}, + {0xbdf38000}, {0xbdf3a000}, {0xbdf3c000}, {0xbdf3e000}, + {0xbdf40000}, {0xbdf42000}, {0xbdf44000}, {0xbdf46000}, + {0xbdf48000}, {0xbdf4a000}, {0xbdf4c000}, {0xbdf4e000}, + {0xbdf50000}, {0xbdf52000}, {0xbdf54000}, {0xbdf56000}, + {0xbdf58000}, {0xbdf5a000}, {0xbdf5c000}, {0xbdf5e000}, + {0xbdf60000}, {0xbdf62000}, {0xbdf64000}, {0xbdf66000}, + {0xbdf68000}, {0xbdf6a000}, {0xbdf6c000}, {0xbdf6e000}, + {0xbdf70000}, {0xbdf72000}, {0xbdf74000}, {0xbdf76000}, + {0xbdf78000}, {0xbdf7a000}, {0xbdf7c000}, {0xbdf7e000}, + {0xbdf80000}, {0xbdf82000}, {0xbdf84000}, {0xbdf86000}, + {0xbdf88000}, {0xbdf8a000}, {0xbdf8c000}, {0xbdf8e000}, + {0xbdf90000}, {0xbdf92000}, {0xbdf94000}, {0xbdf96000}, + {0xbdf98000}, {0xbdf9a000}, {0xbdf9c000}, {0xbdf9e000}, + {0xbdfa0000}, {0xbdfa2000}, {0xbdfa4000}, {0xbdfa6000}, + {0xbdfa8000}, {0xbdfaa000}, {0xbdfac000}, {0xbdfae000}, + {0xbdfb0000}, {0xbdfb2000}, {0xbdfb4000}, {0xbdfb6000}, + {0xbdfb8000}, {0xbdfba000}, {0xbdfbc000}, {0xbdfbe000}, + {0xbdfc0000}, {0xbdfc2000}, {0xbdfc4000}, {0xbdfc6000}, + {0xbdfc8000}, {0xbdfca000}, {0xbdfcc000}, {0xbdfce000}, + {0xbdfd0000}, {0xbdfd2000}, {0xbdfd4000}, {0xbdfd6000}, + {0xbdfd8000}, {0xbdfda000}, {0xbdfdc000}, {0xbdfde000}, + {0xbdfe0000}, {0xbdfe2000}, {0xbdfe4000}, {0xbdfe6000}, + {0xbdfe8000}, {0xbdfea000}, {0xbdfec000}, {0xbdfee000}, + {0xbdff0000}, {0xbdff2000}, {0xbdff4000}, {0xbdff6000}, + {0xbdff8000}, {0xbdffa000}, {0xbdffc000}, {0xbdffe000}, + {0xbe000000}, {0xbe002000}, {0xbe004000}, {0xbe006000}, + {0xbe008000}, {0xbe00a000}, {0xbe00c000}, {0xbe00e000}, + {0xbe010000}, {0xbe012000}, {0xbe014000}, {0xbe016000}, + {0xbe018000}, {0xbe01a000}, {0xbe01c000}, {0xbe01e000}, + {0xbe020000}, {0xbe022000}, {0xbe024000}, {0xbe026000}, + {0xbe028000}, {0xbe02a000}, {0xbe02c000}, {0xbe02e000}, + {0xbe030000}, {0xbe032000}, {0xbe034000}, {0xbe036000}, + {0xbe038000}, {0xbe03a000}, {0xbe03c000}, {0xbe03e000}, + {0xbe040000}, {0xbe042000}, {0xbe044000}, {0xbe046000}, + {0xbe048000}, {0xbe04a000}, {0xbe04c000}, {0xbe04e000}, + {0xbe050000}, {0xbe052000}, {0xbe054000}, {0xbe056000}, + {0xbe058000}, {0xbe05a000}, {0xbe05c000}, {0xbe05e000}, + {0xbe060000}, {0xbe062000}, {0xbe064000}, {0xbe066000}, + {0xbe068000}, {0xbe06a000}, {0xbe06c000}, {0xbe06e000}, + {0xbe070000}, {0xbe072000}, {0xbe074000}, {0xbe076000}, + {0xbe078000}, {0xbe07a000}, {0xbe07c000}, {0xbe07e000}, + {0xbe080000}, {0xbe082000}, {0xbe084000}, {0xbe086000}, + {0xbe088000}, {0xbe08a000}, {0xbe08c000}, {0xbe08e000}, + {0xbe090000}, {0xbe092000}, {0xbe094000}, {0xbe096000}, + {0xbe098000}, {0xbe09a000}, {0xbe09c000}, {0xbe09e000}, + {0xbe0a0000}, {0xbe0a2000}, {0xbe0a4000}, {0xbe0a6000}, + {0xbe0a8000}, {0xbe0aa000}, {0xbe0ac000}, {0xbe0ae000}, + {0xbe0b0000}, {0xbe0b2000}, {0xbe0b4000}, {0xbe0b6000}, + {0xbe0b8000}, {0xbe0ba000}, {0xbe0bc000}, {0xbe0be000}, + {0xbe0c0000}, {0xbe0c2000}, {0xbe0c4000}, {0xbe0c6000}, + {0xbe0c8000}, {0xbe0ca000}, {0xbe0cc000}, {0xbe0ce000}, + {0xbe0d0000}, {0xbe0d2000}, {0xbe0d4000}, {0xbe0d6000}, + {0xbe0d8000}, {0xbe0da000}, {0xbe0dc000}, {0xbe0de000}, + {0xbe0e0000}, {0xbe0e2000}, {0xbe0e4000}, {0xbe0e6000}, + {0xbe0e8000}, {0xbe0ea000}, {0xbe0ec000}, {0xbe0ee000}, + {0xbe0f0000}, {0xbe0f2000}, {0xbe0f4000}, {0xbe0f6000}, + {0xbe0f8000}, {0xbe0fa000}, {0xbe0fc000}, {0xbe0fe000}, + {0xbe100000}, {0xbe102000}, {0xbe104000}, {0xbe106000}, + {0xbe108000}, {0xbe10a000}, {0xbe10c000}, {0xbe10e000}, + {0xbe110000}, {0xbe112000}, {0xbe114000}, {0xbe116000}, + {0xbe118000}, {0xbe11a000}, {0xbe11c000}, {0xbe11e000}, + {0xbe120000}, {0xbe122000}, {0xbe124000}, {0xbe126000}, + {0xbe128000}, {0xbe12a000}, {0xbe12c000}, {0xbe12e000}, + {0xbe130000}, {0xbe132000}, {0xbe134000}, {0xbe136000}, + {0xbe138000}, {0xbe13a000}, {0xbe13c000}, {0xbe13e000}, + {0xbe140000}, {0xbe142000}, {0xbe144000}, {0xbe146000}, + {0xbe148000}, {0xbe14a000}, {0xbe14c000}, {0xbe14e000}, + {0xbe150000}, {0xbe152000}, {0xbe154000}, {0xbe156000}, + {0xbe158000}, {0xbe15a000}, {0xbe15c000}, {0xbe15e000}, + {0xbe160000}, {0xbe162000}, {0xbe164000}, {0xbe166000}, + {0xbe168000}, {0xbe16a000}, {0xbe16c000}, {0xbe16e000}, + {0xbe170000}, {0xbe172000}, {0xbe174000}, {0xbe176000}, + {0xbe178000}, {0xbe17a000}, {0xbe17c000}, {0xbe17e000}, + {0xbe180000}, {0xbe182000}, {0xbe184000}, {0xbe186000}, + {0xbe188000}, {0xbe18a000}, {0xbe18c000}, {0xbe18e000}, + {0xbe190000}, {0xbe192000}, {0xbe194000}, {0xbe196000}, + {0xbe198000}, {0xbe19a000}, {0xbe19c000}, {0xbe19e000}, + {0xbe1a0000}, {0xbe1a2000}, {0xbe1a4000}, {0xbe1a6000}, + {0xbe1a8000}, {0xbe1aa000}, {0xbe1ac000}, {0xbe1ae000}, + {0xbe1b0000}, {0xbe1b2000}, {0xbe1b4000}, {0xbe1b6000}, + {0xbe1b8000}, {0xbe1ba000}, {0xbe1bc000}, {0xbe1be000}, + {0xbe1c0000}, {0xbe1c2000}, {0xbe1c4000}, {0xbe1c6000}, + {0xbe1c8000}, {0xbe1ca000}, {0xbe1cc000}, {0xbe1ce000}, + {0xbe1d0000}, {0xbe1d2000}, {0xbe1d4000}, {0xbe1d6000}, + {0xbe1d8000}, {0xbe1da000}, {0xbe1dc000}, {0xbe1de000}, + {0xbe1e0000}, {0xbe1e2000}, {0xbe1e4000}, {0xbe1e6000}, + {0xbe1e8000}, {0xbe1ea000}, {0xbe1ec000}, {0xbe1ee000}, + {0xbe1f0000}, {0xbe1f2000}, {0xbe1f4000}, {0xbe1f6000}, + {0xbe1f8000}, {0xbe1fa000}, {0xbe1fc000}, {0xbe1fe000}, + {0xbe200000}, {0xbe202000}, {0xbe204000}, {0xbe206000}, + {0xbe208000}, {0xbe20a000}, {0xbe20c000}, {0xbe20e000}, + {0xbe210000}, {0xbe212000}, {0xbe214000}, {0xbe216000}, + {0xbe218000}, {0xbe21a000}, {0xbe21c000}, {0xbe21e000}, + {0xbe220000}, {0xbe222000}, {0xbe224000}, {0xbe226000}, + {0xbe228000}, {0xbe22a000}, {0xbe22c000}, {0xbe22e000}, + {0xbe230000}, {0xbe232000}, {0xbe234000}, {0xbe236000}, + {0xbe238000}, {0xbe23a000}, {0xbe23c000}, {0xbe23e000}, + {0xbe240000}, {0xbe242000}, {0xbe244000}, {0xbe246000}, + {0xbe248000}, {0xbe24a000}, {0xbe24c000}, {0xbe24e000}, + {0xbe250000}, {0xbe252000}, {0xbe254000}, {0xbe256000}, + {0xbe258000}, {0xbe25a000}, {0xbe25c000}, {0xbe25e000}, + {0xbe260000}, {0xbe262000}, {0xbe264000}, {0xbe266000}, + {0xbe268000}, {0xbe26a000}, {0xbe26c000}, {0xbe26e000}, + {0xbe270000}, {0xbe272000}, {0xbe274000}, {0xbe276000}, + {0xbe278000}, {0xbe27a000}, {0xbe27c000}, {0xbe27e000}, + {0xbe280000}, {0xbe282000}, {0xbe284000}, {0xbe286000}, + {0xbe288000}, {0xbe28a000}, {0xbe28c000}, {0xbe28e000}, + {0xbe290000}, {0xbe292000}, {0xbe294000}, {0xbe296000}, + {0xbe298000}, {0xbe29a000}, {0xbe29c000}, {0xbe29e000}, + {0xbe2a0000}, {0xbe2a2000}, {0xbe2a4000}, {0xbe2a6000}, + {0xbe2a8000}, {0xbe2aa000}, {0xbe2ac000}, {0xbe2ae000}, + {0xbe2b0000}, {0xbe2b2000}, {0xbe2b4000}, {0xbe2b6000}, + {0xbe2b8000}, {0xbe2ba000}, {0xbe2bc000}, {0xbe2be000}, + {0xbe2c0000}, {0xbe2c2000}, {0xbe2c4000}, {0xbe2c6000}, + {0xbe2c8000}, {0xbe2ca000}, {0xbe2cc000}, {0xbe2ce000}, + {0xbe2d0000}, {0xbe2d2000}, {0xbe2d4000}, {0xbe2d6000}, + {0xbe2d8000}, {0xbe2da000}, {0xbe2dc000}, {0xbe2de000}, + {0xbe2e0000}, {0xbe2e2000}, {0xbe2e4000}, {0xbe2e6000}, + {0xbe2e8000}, {0xbe2ea000}, {0xbe2ec000}, {0xbe2ee000}, + {0xbe2f0000}, {0xbe2f2000}, {0xbe2f4000}, {0xbe2f6000}, + {0xbe2f8000}, {0xbe2fa000}, {0xbe2fc000}, {0xbe2fe000}, + {0xbe300000}, {0xbe302000}, {0xbe304000}, {0xbe306000}, + {0xbe308000}, {0xbe30a000}, {0xbe30c000}, {0xbe30e000}, + {0xbe310000}, {0xbe312000}, {0xbe314000}, {0xbe316000}, + {0xbe318000}, {0xbe31a000}, {0xbe31c000}, {0xbe31e000}, + {0xbe320000}, {0xbe322000}, {0xbe324000}, {0xbe326000}, + {0xbe328000}, {0xbe32a000}, {0xbe32c000}, {0xbe32e000}, + {0xbe330000}, {0xbe332000}, {0xbe334000}, {0xbe336000}, + {0xbe338000}, {0xbe33a000}, {0xbe33c000}, {0xbe33e000}, + {0xbe340000}, {0xbe342000}, {0xbe344000}, {0xbe346000}, + {0xbe348000}, {0xbe34a000}, {0xbe34c000}, {0xbe34e000}, + {0xbe350000}, {0xbe352000}, {0xbe354000}, {0xbe356000}, + {0xbe358000}, {0xbe35a000}, {0xbe35c000}, {0xbe35e000}, + {0xbe360000}, {0xbe362000}, {0xbe364000}, {0xbe366000}, + {0xbe368000}, {0xbe36a000}, {0xbe36c000}, {0xbe36e000}, + {0xbe370000}, {0xbe372000}, {0xbe374000}, {0xbe376000}, + {0xbe378000}, {0xbe37a000}, {0xbe37c000}, {0xbe37e000}, + {0xbe380000}, {0xbe382000}, {0xbe384000}, {0xbe386000}, + {0xbe388000}, {0xbe38a000}, {0xbe38c000}, {0xbe38e000}, + {0xbe390000}, {0xbe392000}, {0xbe394000}, {0xbe396000}, + {0xbe398000}, {0xbe39a000}, {0xbe39c000}, {0xbe39e000}, + {0xbe3a0000}, {0xbe3a2000}, {0xbe3a4000}, {0xbe3a6000}, + {0xbe3a8000}, {0xbe3aa000}, {0xbe3ac000}, {0xbe3ae000}, + {0xbe3b0000}, {0xbe3b2000}, {0xbe3b4000}, {0xbe3b6000}, + {0xbe3b8000}, {0xbe3ba000}, {0xbe3bc000}, {0xbe3be000}, + {0xbe3c0000}, {0xbe3c2000}, {0xbe3c4000}, {0xbe3c6000}, + {0xbe3c8000}, {0xbe3ca000}, {0xbe3cc000}, {0xbe3ce000}, + {0xbe3d0000}, {0xbe3d2000}, {0xbe3d4000}, {0xbe3d6000}, + {0xbe3d8000}, {0xbe3da000}, {0xbe3dc000}, {0xbe3de000}, + {0xbe3e0000}, {0xbe3e2000}, {0xbe3e4000}, {0xbe3e6000}, + {0xbe3e8000}, {0xbe3ea000}, {0xbe3ec000}, {0xbe3ee000}, + {0xbe3f0000}, {0xbe3f2000}, {0xbe3f4000}, {0xbe3f6000}, + {0xbe3f8000}, {0xbe3fa000}, {0xbe3fc000}, {0xbe3fe000}, + {0xbe400000}, {0xbe402000}, {0xbe404000}, {0xbe406000}, + {0xbe408000}, {0xbe40a000}, {0xbe40c000}, {0xbe40e000}, + {0xbe410000}, {0xbe412000}, {0xbe414000}, {0xbe416000}, + {0xbe418000}, {0xbe41a000}, {0xbe41c000}, {0xbe41e000}, + {0xbe420000}, {0xbe422000}, {0xbe424000}, {0xbe426000}, + {0xbe428000}, {0xbe42a000}, {0xbe42c000}, {0xbe42e000}, + {0xbe430000}, {0xbe432000}, {0xbe434000}, {0xbe436000}, + {0xbe438000}, {0xbe43a000}, {0xbe43c000}, {0xbe43e000}, + {0xbe440000}, {0xbe442000}, {0xbe444000}, {0xbe446000}, + {0xbe448000}, {0xbe44a000}, {0xbe44c000}, {0xbe44e000}, + {0xbe450000}, {0xbe452000}, {0xbe454000}, {0xbe456000}, + {0xbe458000}, {0xbe45a000}, {0xbe45c000}, {0xbe45e000}, + {0xbe460000}, {0xbe462000}, {0xbe464000}, {0xbe466000}, + {0xbe468000}, {0xbe46a000}, {0xbe46c000}, {0xbe46e000}, + {0xbe470000}, {0xbe472000}, {0xbe474000}, {0xbe476000}, + {0xbe478000}, {0xbe47a000}, {0xbe47c000}, {0xbe47e000}, + {0xbe480000}, {0xbe482000}, {0xbe484000}, {0xbe486000}, + {0xbe488000}, {0xbe48a000}, {0xbe48c000}, {0xbe48e000}, + {0xbe490000}, {0xbe492000}, {0xbe494000}, {0xbe496000}, + {0xbe498000}, {0xbe49a000}, {0xbe49c000}, {0xbe49e000}, + {0xbe4a0000}, {0xbe4a2000}, {0xbe4a4000}, {0xbe4a6000}, + {0xbe4a8000}, {0xbe4aa000}, {0xbe4ac000}, {0xbe4ae000}, + {0xbe4b0000}, {0xbe4b2000}, {0xbe4b4000}, {0xbe4b6000}, + {0xbe4b8000}, {0xbe4ba000}, {0xbe4bc000}, {0xbe4be000}, + {0xbe4c0000}, {0xbe4c2000}, {0xbe4c4000}, {0xbe4c6000}, + {0xbe4c8000}, {0xbe4ca000}, {0xbe4cc000}, {0xbe4ce000}, + {0xbe4d0000}, {0xbe4d2000}, {0xbe4d4000}, {0xbe4d6000}, + {0xbe4d8000}, {0xbe4da000}, {0xbe4dc000}, {0xbe4de000}, + {0xbe4e0000}, {0xbe4e2000}, {0xbe4e4000}, {0xbe4e6000}, + {0xbe4e8000}, {0xbe4ea000}, {0xbe4ec000}, {0xbe4ee000}, + {0xbe4f0000}, {0xbe4f2000}, {0xbe4f4000}, {0xbe4f6000}, + {0xbe4f8000}, {0xbe4fa000}, {0xbe4fc000}, {0xbe4fe000}, + {0xbe500000}, {0xbe502000}, {0xbe504000}, {0xbe506000}, + {0xbe508000}, {0xbe50a000}, {0xbe50c000}, {0xbe50e000}, + {0xbe510000}, {0xbe512000}, {0xbe514000}, {0xbe516000}, + {0xbe518000}, {0xbe51a000}, {0xbe51c000}, {0xbe51e000}, + {0xbe520000}, {0xbe522000}, {0xbe524000}, {0xbe526000}, + {0xbe528000}, {0xbe52a000}, {0xbe52c000}, {0xbe52e000}, + {0xbe530000}, {0xbe532000}, {0xbe534000}, {0xbe536000}, + {0xbe538000}, {0xbe53a000}, {0xbe53c000}, {0xbe53e000}, + {0xbe540000}, {0xbe542000}, {0xbe544000}, {0xbe546000}, + {0xbe548000}, {0xbe54a000}, {0xbe54c000}, {0xbe54e000}, + {0xbe550000}, {0xbe552000}, {0xbe554000}, {0xbe556000}, + {0xbe558000}, {0xbe55a000}, {0xbe55c000}, {0xbe55e000}, + {0xbe560000}, {0xbe562000}, {0xbe564000}, {0xbe566000}, + {0xbe568000}, {0xbe56a000}, {0xbe56c000}, {0xbe56e000}, + {0xbe570000}, {0xbe572000}, {0xbe574000}, {0xbe576000}, + {0xbe578000}, {0xbe57a000}, {0xbe57c000}, {0xbe57e000}, + {0xbe580000}, {0xbe582000}, {0xbe584000}, {0xbe586000}, + {0xbe588000}, {0xbe58a000}, {0xbe58c000}, {0xbe58e000}, + {0xbe590000}, {0xbe592000}, {0xbe594000}, {0xbe596000}, + {0xbe598000}, {0xbe59a000}, {0xbe59c000}, {0xbe59e000}, + {0xbe5a0000}, {0xbe5a2000}, {0xbe5a4000}, {0xbe5a6000}, + {0xbe5a8000}, {0xbe5aa000}, {0xbe5ac000}, {0xbe5ae000}, + {0xbe5b0000}, {0xbe5b2000}, {0xbe5b4000}, {0xbe5b6000}, + {0xbe5b8000}, {0xbe5ba000}, {0xbe5bc000}, {0xbe5be000}, + {0xbe5c0000}, {0xbe5c2000}, {0xbe5c4000}, {0xbe5c6000}, + {0xbe5c8000}, {0xbe5ca000}, {0xbe5cc000}, {0xbe5ce000}, + {0xbe5d0000}, {0xbe5d2000}, {0xbe5d4000}, {0xbe5d6000}, + {0xbe5d8000}, {0xbe5da000}, {0xbe5dc000}, {0xbe5de000}, + {0xbe5e0000}, {0xbe5e2000}, {0xbe5e4000}, {0xbe5e6000}, + {0xbe5e8000}, {0xbe5ea000}, {0xbe5ec000}, {0xbe5ee000}, + {0xbe5f0000}, {0xbe5f2000}, {0xbe5f4000}, {0xbe5f6000}, + {0xbe5f8000}, {0xbe5fa000}, {0xbe5fc000}, {0xbe5fe000}, + {0xbe600000}, {0xbe602000}, {0xbe604000}, {0xbe606000}, + {0xbe608000}, {0xbe60a000}, {0xbe60c000}, {0xbe60e000}, + {0xbe610000}, {0xbe612000}, {0xbe614000}, {0xbe616000}, + {0xbe618000}, {0xbe61a000}, {0xbe61c000}, {0xbe61e000}, + {0xbe620000}, {0xbe622000}, {0xbe624000}, {0xbe626000}, + {0xbe628000}, {0xbe62a000}, {0xbe62c000}, {0xbe62e000}, + {0xbe630000}, {0xbe632000}, {0xbe634000}, {0xbe636000}, + {0xbe638000}, {0xbe63a000}, {0xbe63c000}, {0xbe63e000}, + {0xbe640000}, {0xbe642000}, {0xbe644000}, {0xbe646000}, + {0xbe648000}, {0xbe64a000}, {0xbe64c000}, {0xbe64e000}, + {0xbe650000}, {0xbe652000}, {0xbe654000}, {0xbe656000}, + {0xbe658000}, {0xbe65a000}, {0xbe65c000}, {0xbe65e000}, + {0xbe660000}, {0xbe662000}, {0xbe664000}, {0xbe666000}, + {0xbe668000}, {0xbe66a000}, {0xbe66c000}, {0xbe66e000}, + {0xbe670000}, {0xbe672000}, {0xbe674000}, {0xbe676000}, + {0xbe678000}, {0xbe67a000}, {0xbe67c000}, {0xbe67e000}, + {0xbe680000}, {0xbe682000}, {0xbe684000}, {0xbe686000}, + {0xbe688000}, {0xbe68a000}, {0xbe68c000}, {0xbe68e000}, + {0xbe690000}, {0xbe692000}, {0xbe694000}, {0xbe696000}, + {0xbe698000}, {0xbe69a000}, {0xbe69c000}, {0xbe69e000}, + {0xbe6a0000}, {0xbe6a2000}, {0xbe6a4000}, {0xbe6a6000}, + {0xbe6a8000}, {0xbe6aa000}, {0xbe6ac000}, {0xbe6ae000}, + {0xbe6b0000}, {0xbe6b2000}, {0xbe6b4000}, {0xbe6b6000}, + {0xbe6b8000}, {0xbe6ba000}, {0xbe6bc000}, {0xbe6be000}, + {0xbe6c0000}, {0xbe6c2000}, {0xbe6c4000}, {0xbe6c6000}, + {0xbe6c8000}, {0xbe6ca000}, {0xbe6cc000}, {0xbe6ce000}, + {0xbe6d0000}, {0xbe6d2000}, {0xbe6d4000}, {0xbe6d6000}, + {0xbe6d8000}, {0xbe6da000}, {0xbe6dc000}, {0xbe6de000}, + {0xbe6e0000}, {0xbe6e2000}, {0xbe6e4000}, {0xbe6e6000}, + {0xbe6e8000}, {0xbe6ea000}, {0xbe6ec000}, {0xbe6ee000}, + {0xbe6f0000}, {0xbe6f2000}, {0xbe6f4000}, {0xbe6f6000}, + {0xbe6f8000}, {0xbe6fa000}, {0xbe6fc000}, {0xbe6fe000}, + {0xbe700000}, {0xbe702000}, {0xbe704000}, {0xbe706000}, + {0xbe708000}, {0xbe70a000}, {0xbe70c000}, {0xbe70e000}, + {0xbe710000}, {0xbe712000}, {0xbe714000}, {0xbe716000}, + {0xbe718000}, {0xbe71a000}, {0xbe71c000}, {0xbe71e000}, + {0xbe720000}, {0xbe722000}, {0xbe724000}, {0xbe726000}, + {0xbe728000}, {0xbe72a000}, {0xbe72c000}, {0xbe72e000}, + {0xbe730000}, {0xbe732000}, {0xbe734000}, {0xbe736000}, + {0xbe738000}, {0xbe73a000}, {0xbe73c000}, {0xbe73e000}, + {0xbe740000}, {0xbe742000}, {0xbe744000}, {0xbe746000}, + {0xbe748000}, {0xbe74a000}, {0xbe74c000}, {0xbe74e000}, + {0xbe750000}, {0xbe752000}, {0xbe754000}, {0xbe756000}, + {0xbe758000}, {0xbe75a000}, {0xbe75c000}, {0xbe75e000}, + {0xbe760000}, {0xbe762000}, {0xbe764000}, {0xbe766000}, + {0xbe768000}, {0xbe76a000}, {0xbe76c000}, {0xbe76e000}, + {0xbe770000}, {0xbe772000}, {0xbe774000}, {0xbe776000}, + {0xbe778000}, {0xbe77a000}, {0xbe77c000}, {0xbe77e000}, + {0xbe780000}, {0xbe782000}, {0xbe784000}, {0xbe786000}, + {0xbe788000}, {0xbe78a000}, {0xbe78c000}, {0xbe78e000}, + {0xbe790000}, {0xbe792000}, {0xbe794000}, {0xbe796000}, + {0xbe798000}, {0xbe79a000}, {0xbe79c000}, {0xbe79e000}, + {0xbe7a0000}, {0xbe7a2000}, {0xbe7a4000}, {0xbe7a6000}, + {0xbe7a8000}, {0xbe7aa000}, {0xbe7ac000}, {0xbe7ae000}, + {0xbe7b0000}, {0xbe7b2000}, {0xbe7b4000}, {0xbe7b6000}, + {0xbe7b8000}, {0xbe7ba000}, {0xbe7bc000}, {0xbe7be000}, + {0xbe7c0000}, {0xbe7c2000}, {0xbe7c4000}, {0xbe7c6000}, + {0xbe7c8000}, {0xbe7ca000}, {0xbe7cc000}, {0xbe7ce000}, + {0xbe7d0000}, {0xbe7d2000}, {0xbe7d4000}, {0xbe7d6000}, + {0xbe7d8000}, {0xbe7da000}, {0xbe7dc000}, {0xbe7de000}, + {0xbe7e0000}, {0xbe7e2000}, {0xbe7e4000}, {0xbe7e6000}, + {0xbe7e8000}, {0xbe7ea000}, {0xbe7ec000}, {0xbe7ee000}, + {0xbe7f0000}, {0xbe7f2000}, {0xbe7f4000}, {0xbe7f6000}, + {0xbe7f8000}, {0xbe7fa000}, {0xbe7fc000}, {0xbe7fe000}, + {0xbe800000}, {0xbe802000}, {0xbe804000}, {0xbe806000}, + {0xbe808000}, {0xbe80a000}, {0xbe80c000}, {0xbe80e000}, + {0xbe810000}, {0xbe812000}, {0xbe814000}, {0xbe816000}, + {0xbe818000}, {0xbe81a000}, {0xbe81c000}, {0xbe81e000}, + {0xbe820000}, {0xbe822000}, {0xbe824000}, {0xbe826000}, + {0xbe828000}, {0xbe82a000}, {0xbe82c000}, {0xbe82e000}, + {0xbe830000}, {0xbe832000}, {0xbe834000}, {0xbe836000}, + {0xbe838000}, {0xbe83a000}, {0xbe83c000}, {0xbe83e000}, + {0xbe840000}, {0xbe842000}, {0xbe844000}, {0xbe846000}, + {0xbe848000}, {0xbe84a000}, {0xbe84c000}, {0xbe84e000}, + {0xbe850000}, {0xbe852000}, {0xbe854000}, {0xbe856000}, + {0xbe858000}, {0xbe85a000}, {0xbe85c000}, {0xbe85e000}, + {0xbe860000}, {0xbe862000}, {0xbe864000}, {0xbe866000}, + {0xbe868000}, {0xbe86a000}, {0xbe86c000}, {0xbe86e000}, + {0xbe870000}, {0xbe872000}, {0xbe874000}, {0xbe876000}, + {0xbe878000}, {0xbe87a000}, {0xbe87c000}, {0xbe87e000}, + {0xbe880000}, {0xbe882000}, {0xbe884000}, {0xbe886000}, + {0xbe888000}, {0xbe88a000}, {0xbe88c000}, {0xbe88e000}, + {0xbe890000}, {0xbe892000}, {0xbe894000}, {0xbe896000}, + {0xbe898000}, {0xbe89a000}, {0xbe89c000}, {0xbe89e000}, + {0xbe8a0000}, {0xbe8a2000}, {0xbe8a4000}, {0xbe8a6000}, + {0xbe8a8000}, {0xbe8aa000}, {0xbe8ac000}, {0xbe8ae000}, + {0xbe8b0000}, {0xbe8b2000}, {0xbe8b4000}, {0xbe8b6000}, + {0xbe8b8000}, {0xbe8ba000}, {0xbe8bc000}, {0xbe8be000}, + {0xbe8c0000}, {0xbe8c2000}, {0xbe8c4000}, {0xbe8c6000}, + {0xbe8c8000}, {0xbe8ca000}, {0xbe8cc000}, {0xbe8ce000}, + {0xbe8d0000}, {0xbe8d2000}, {0xbe8d4000}, {0xbe8d6000}, + {0xbe8d8000}, {0xbe8da000}, {0xbe8dc000}, {0xbe8de000}, + {0xbe8e0000}, {0xbe8e2000}, {0xbe8e4000}, {0xbe8e6000}, + {0xbe8e8000}, {0xbe8ea000}, {0xbe8ec000}, {0xbe8ee000}, + {0xbe8f0000}, {0xbe8f2000}, {0xbe8f4000}, {0xbe8f6000}, + {0xbe8f8000}, {0xbe8fa000}, {0xbe8fc000}, {0xbe8fe000}, + {0xbe900000}, {0xbe902000}, {0xbe904000}, {0xbe906000}, + {0xbe908000}, {0xbe90a000}, {0xbe90c000}, {0xbe90e000}, + {0xbe910000}, {0xbe912000}, {0xbe914000}, {0xbe916000}, + {0xbe918000}, {0xbe91a000}, {0xbe91c000}, {0xbe91e000}, + {0xbe920000}, {0xbe922000}, {0xbe924000}, {0xbe926000}, + {0xbe928000}, {0xbe92a000}, {0xbe92c000}, {0xbe92e000}, + {0xbe930000}, {0xbe932000}, {0xbe934000}, {0xbe936000}, + {0xbe938000}, {0xbe93a000}, {0xbe93c000}, {0xbe93e000}, + {0xbe940000}, {0xbe942000}, {0xbe944000}, {0xbe946000}, + {0xbe948000}, {0xbe94a000}, {0xbe94c000}, {0xbe94e000}, + {0xbe950000}, {0xbe952000}, {0xbe954000}, {0xbe956000}, + {0xbe958000}, {0xbe95a000}, {0xbe95c000}, {0xbe95e000}, + {0xbe960000}, {0xbe962000}, {0xbe964000}, {0xbe966000}, + {0xbe968000}, {0xbe96a000}, {0xbe96c000}, {0xbe96e000}, + {0xbe970000}, {0xbe972000}, {0xbe974000}, {0xbe976000}, + {0xbe978000}, {0xbe97a000}, {0xbe97c000}, {0xbe97e000}, + {0xbe980000}, {0xbe982000}, {0xbe984000}, {0xbe986000}, + {0xbe988000}, {0xbe98a000}, {0xbe98c000}, {0xbe98e000}, + {0xbe990000}, {0xbe992000}, {0xbe994000}, {0xbe996000}, + {0xbe998000}, {0xbe99a000}, {0xbe99c000}, {0xbe99e000}, + {0xbe9a0000}, {0xbe9a2000}, {0xbe9a4000}, {0xbe9a6000}, + {0xbe9a8000}, {0xbe9aa000}, {0xbe9ac000}, {0xbe9ae000}, + {0xbe9b0000}, {0xbe9b2000}, {0xbe9b4000}, {0xbe9b6000}, + {0xbe9b8000}, {0xbe9ba000}, {0xbe9bc000}, {0xbe9be000}, + {0xbe9c0000}, {0xbe9c2000}, {0xbe9c4000}, {0xbe9c6000}, + {0xbe9c8000}, {0xbe9ca000}, {0xbe9cc000}, {0xbe9ce000}, + {0xbe9d0000}, {0xbe9d2000}, {0xbe9d4000}, {0xbe9d6000}, + {0xbe9d8000}, {0xbe9da000}, {0xbe9dc000}, {0xbe9de000}, + {0xbe9e0000}, {0xbe9e2000}, {0xbe9e4000}, {0xbe9e6000}, + {0xbe9e8000}, {0xbe9ea000}, {0xbe9ec000}, {0xbe9ee000}, + {0xbe9f0000}, {0xbe9f2000}, {0xbe9f4000}, {0xbe9f6000}, + {0xbe9f8000}, {0xbe9fa000}, {0xbe9fc000}, {0xbe9fe000}, + {0xbea00000}, {0xbea02000}, {0xbea04000}, {0xbea06000}, + {0xbea08000}, {0xbea0a000}, {0xbea0c000}, {0xbea0e000}, + {0xbea10000}, {0xbea12000}, {0xbea14000}, {0xbea16000}, + {0xbea18000}, {0xbea1a000}, {0xbea1c000}, {0xbea1e000}, + {0xbea20000}, {0xbea22000}, {0xbea24000}, {0xbea26000}, + {0xbea28000}, {0xbea2a000}, {0xbea2c000}, {0xbea2e000}, + {0xbea30000}, {0xbea32000}, {0xbea34000}, {0xbea36000}, + {0xbea38000}, {0xbea3a000}, {0xbea3c000}, {0xbea3e000}, + {0xbea40000}, {0xbea42000}, {0xbea44000}, {0xbea46000}, + {0xbea48000}, {0xbea4a000}, {0xbea4c000}, {0xbea4e000}, + {0xbea50000}, {0xbea52000}, {0xbea54000}, {0xbea56000}, + {0xbea58000}, {0xbea5a000}, {0xbea5c000}, {0xbea5e000}, + {0xbea60000}, {0xbea62000}, {0xbea64000}, {0xbea66000}, + {0xbea68000}, {0xbea6a000}, {0xbea6c000}, {0xbea6e000}, + {0xbea70000}, {0xbea72000}, {0xbea74000}, {0xbea76000}, + {0xbea78000}, {0xbea7a000}, {0xbea7c000}, {0xbea7e000}, + {0xbea80000}, {0xbea82000}, {0xbea84000}, {0xbea86000}, + {0xbea88000}, {0xbea8a000}, {0xbea8c000}, {0xbea8e000}, + {0xbea90000}, {0xbea92000}, {0xbea94000}, {0xbea96000}, + {0xbea98000}, {0xbea9a000}, {0xbea9c000}, {0xbea9e000}, + {0xbeaa0000}, {0xbeaa2000}, {0xbeaa4000}, {0xbeaa6000}, + {0xbeaa8000}, {0xbeaaa000}, {0xbeaac000}, {0xbeaae000}, + {0xbeab0000}, {0xbeab2000}, {0xbeab4000}, {0xbeab6000}, + {0xbeab8000}, {0xbeaba000}, {0xbeabc000}, {0xbeabe000}, + {0xbeac0000}, {0xbeac2000}, {0xbeac4000}, {0xbeac6000}, + {0xbeac8000}, {0xbeaca000}, {0xbeacc000}, {0xbeace000}, + {0xbead0000}, {0xbead2000}, {0xbead4000}, {0xbead6000}, + {0xbead8000}, {0xbeada000}, {0xbeadc000}, {0xbeade000}, + {0xbeae0000}, {0xbeae2000}, {0xbeae4000}, {0xbeae6000}, + {0xbeae8000}, {0xbeaea000}, {0xbeaec000}, {0xbeaee000}, + {0xbeaf0000}, {0xbeaf2000}, {0xbeaf4000}, {0xbeaf6000}, + {0xbeaf8000}, {0xbeafa000}, {0xbeafc000}, {0xbeafe000}, + {0xbeb00000}, {0xbeb02000}, {0xbeb04000}, {0xbeb06000}, + {0xbeb08000}, {0xbeb0a000}, {0xbeb0c000}, {0xbeb0e000}, + {0xbeb10000}, {0xbeb12000}, {0xbeb14000}, {0xbeb16000}, + {0xbeb18000}, {0xbeb1a000}, {0xbeb1c000}, {0xbeb1e000}, + {0xbeb20000}, {0xbeb22000}, {0xbeb24000}, {0xbeb26000}, + {0xbeb28000}, {0xbeb2a000}, {0xbeb2c000}, {0xbeb2e000}, + {0xbeb30000}, {0xbeb32000}, {0xbeb34000}, {0xbeb36000}, + {0xbeb38000}, {0xbeb3a000}, {0xbeb3c000}, {0xbeb3e000}, + {0xbeb40000}, {0xbeb42000}, {0xbeb44000}, {0xbeb46000}, + {0xbeb48000}, {0xbeb4a000}, {0xbeb4c000}, {0xbeb4e000}, + {0xbeb50000}, {0xbeb52000}, {0xbeb54000}, {0xbeb56000}, + {0xbeb58000}, {0xbeb5a000}, {0xbeb5c000}, {0xbeb5e000}, + {0xbeb60000}, {0xbeb62000}, {0xbeb64000}, {0xbeb66000}, + {0xbeb68000}, {0xbeb6a000}, {0xbeb6c000}, {0xbeb6e000}, + {0xbeb70000}, {0xbeb72000}, {0xbeb74000}, {0xbeb76000}, + {0xbeb78000}, {0xbeb7a000}, {0xbeb7c000}, {0xbeb7e000}, + {0xbeb80000}, {0xbeb82000}, {0xbeb84000}, {0xbeb86000}, + {0xbeb88000}, {0xbeb8a000}, {0xbeb8c000}, {0xbeb8e000}, + {0xbeb90000}, {0xbeb92000}, {0xbeb94000}, {0xbeb96000}, + {0xbeb98000}, {0xbeb9a000}, {0xbeb9c000}, {0xbeb9e000}, + {0xbeba0000}, {0xbeba2000}, {0xbeba4000}, {0xbeba6000}, + {0xbeba8000}, {0xbebaa000}, {0xbebac000}, {0xbebae000}, + {0xbebb0000}, {0xbebb2000}, {0xbebb4000}, {0xbebb6000}, + {0xbebb8000}, {0xbebba000}, {0xbebbc000}, {0xbebbe000}, + {0xbebc0000}, {0xbebc2000}, {0xbebc4000}, {0xbebc6000}, + {0xbebc8000}, {0xbebca000}, {0xbebcc000}, {0xbebce000}, + {0xbebd0000}, {0xbebd2000}, {0xbebd4000}, {0xbebd6000}, + {0xbebd8000}, {0xbebda000}, {0xbebdc000}, {0xbebde000}, + {0xbebe0000}, {0xbebe2000}, {0xbebe4000}, {0xbebe6000}, + {0xbebe8000}, {0xbebea000}, {0xbebec000}, {0xbebee000}, + {0xbebf0000}, {0xbebf2000}, {0xbebf4000}, {0xbebf6000}, + {0xbebf8000}, {0xbebfa000}, {0xbebfc000}, {0xbebfe000}, + {0xbec00000}, {0xbec02000}, {0xbec04000}, {0xbec06000}, + {0xbec08000}, {0xbec0a000}, {0xbec0c000}, {0xbec0e000}, + {0xbec10000}, {0xbec12000}, {0xbec14000}, {0xbec16000}, + {0xbec18000}, {0xbec1a000}, {0xbec1c000}, {0xbec1e000}, + {0xbec20000}, {0xbec22000}, {0xbec24000}, {0xbec26000}, + {0xbec28000}, {0xbec2a000}, {0xbec2c000}, {0xbec2e000}, + {0xbec30000}, {0xbec32000}, {0xbec34000}, {0xbec36000}, + {0xbec38000}, {0xbec3a000}, {0xbec3c000}, {0xbec3e000}, + {0xbec40000}, {0xbec42000}, {0xbec44000}, {0xbec46000}, + {0xbec48000}, {0xbec4a000}, {0xbec4c000}, {0xbec4e000}, + {0xbec50000}, {0xbec52000}, {0xbec54000}, {0xbec56000}, + {0xbec58000}, {0xbec5a000}, {0xbec5c000}, {0xbec5e000}, + {0xbec60000}, {0xbec62000}, {0xbec64000}, {0xbec66000}, + {0xbec68000}, {0xbec6a000}, {0xbec6c000}, {0xbec6e000}, + {0xbec70000}, {0xbec72000}, {0xbec74000}, {0xbec76000}, + {0xbec78000}, {0xbec7a000}, {0xbec7c000}, {0xbec7e000}, + {0xbec80000}, {0xbec82000}, {0xbec84000}, {0xbec86000}, + {0xbec88000}, {0xbec8a000}, {0xbec8c000}, {0xbec8e000}, + {0xbec90000}, {0xbec92000}, {0xbec94000}, {0xbec96000}, + {0xbec98000}, {0xbec9a000}, {0xbec9c000}, {0xbec9e000}, + {0xbeca0000}, {0xbeca2000}, {0xbeca4000}, {0xbeca6000}, + {0xbeca8000}, {0xbecaa000}, {0xbecac000}, {0xbecae000}, + {0xbecb0000}, {0xbecb2000}, {0xbecb4000}, {0xbecb6000}, + {0xbecb8000}, {0xbecba000}, {0xbecbc000}, {0xbecbe000}, + {0xbecc0000}, {0xbecc2000}, {0xbecc4000}, {0xbecc6000}, + {0xbecc8000}, {0xbecca000}, {0xbeccc000}, {0xbecce000}, + {0xbecd0000}, {0xbecd2000}, {0xbecd4000}, {0xbecd6000}, + {0xbecd8000}, {0xbecda000}, {0xbecdc000}, {0xbecde000}, + {0xbece0000}, {0xbece2000}, {0xbece4000}, {0xbece6000}, + {0xbece8000}, {0xbecea000}, {0xbecec000}, {0xbecee000}, + {0xbecf0000}, {0xbecf2000}, {0xbecf4000}, {0xbecf6000}, + {0xbecf8000}, {0xbecfa000}, {0xbecfc000}, {0xbecfe000}, + {0xbed00000}, {0xbed02000}, {0xbed04000}, {0xbed06000}, + {0xbed08000}, {0xbed0a000}, {0xbed0c000}, {0xbed0e000}, + {0xbed10000}, {0xbed12000}, {0xbed14000}, {0xbed16000}, + {0xbed18000}, {0xbed1a000}, {0xbed1c000}, {0xbed1e000}, + {0xbed20000}, {0xbed22000}, {0xbed24000}, {0xbed26000}, + {0xbed28000}, {0xbed2a000}, {0xbed2c000}, {0xbed2e000}, + {0xbed30000}, {0xbed32000}, {0xbed34000}, {0xbed36000}, + {0xbed38000}, {0xbed3a000}, {0xbed3c000}, {0xbed3e000}, + {0xbed40000}, {0xbed42000}, {0xbed44000}, {0xbed46000}, + {0xbed48000}, {0xbed4a000}, {0xbed4c000}, {0xbed4e000}, + {0xbed50000}, {0xbed52000}, {0xbed54000}, {0xbed56000}, + {0xbed58000}, {0xbed5a000}, {0xbed5c000}, {0xbed5e000}, + {0xbed60000}, {0xbed62000}, {0xbed64000}, {0xbed66000}, + {0xbed68000}, {0xbed6a000}, {0xbed6c000}, {0xbed6e000}, + {0xbed70000}, {0xbed72000}, {0xbed74000}, {0xbed76000}, + {0xbed78000}, {0xbed7a000}, {0xbed7c000}, {0xbed7e000}, + {0xbed80000}, {0xbed82000}, {0xbed84000}, {0xbed86000}, + {0xbed88000}, {0xbed8a000}, {0xbed8c000}, {0xbed8e000}, + {0xbed90000}, {0xbed92000}, {0xbed94000}, {0xbed96000}, + {0xbed98000}, {0xbed9a000}, {0xbed9c000}, {0xbed9e000}, + {0xbeda0000}, {0xbeda2000}, {0xbeda4000}, {0xbeda6000}, + {0xbeda8000}, {0xbedaa000}, {0xbedac000}, {0xbedae000}, + {0xbedb0000}, {0xbedb2000}, {0xbedb4000}, {0xbedb6000}, + {0xbedb8000}, {0xbedba000}, {0xbedbc000}, {0xbedbe000}, + {0xbedc0000}, {0xbedc2000}, {0xbedc4000}, {0xbedc6000}, + {0xbedc8000}, {0xbedca000}, {0xbedcc000}, {0xbedce000}, + {0xbedd0000}, {0xbedd2000}, {0xbedd4000}, {0xbedd6000}, + {0xbedd8000}, {0xbedda000}, {0xbeddc000}, {0xbedde000}, + {0xbede0000}, {0xbede2000}, {0xbede4000}, {0xbede6000}, + {0xbede8000}, {0xbedea000}, {0xbedec000}, {0xbedee000}, + {0xbedf0000}, {0xbedf2000}, {0xbedf4000}, {0xbedf6000}, + {0xbedf8000}, {0xbedfa000}, {0xbedfc000}, {0xbedfe000}, + {0xbee00000}, {0xbee02000}, {0xbee04000}, {0xbee06000}, + {0xbee08000}, {0xbee0a000}, {0xbee0c000}, {0xbee0e000}, + {0xbee10000}, {0xbee12000}, {0xbee14000}, {0xbee16000}, + {0xbee18000}, {0xbee1a000}, {0xbee1c000}, {0xbee1e000}, + {0xbee20000}, {0xbee22000}, {0xbee24000}, {0xbee26000}, + {0xbee28000}, {0xbee2a000}, {0xbee2c000}, {0xbee2e000}, + {0xbee30000}, {0xbee32000}, {0xbee34000}, {0xbee36000}, + {0xbee38000}, {0xbee3a000}, {0xbee3c000}, {0xbee3e000}, + {0xbee40000}, {0xbee42000}, {0xbee44000}, {0xbee46000}, + {0xbee48000}, {0xbee4a000}, {0xbee4c000}, {0xbee4e000}, + {0xbee50000}, {0xbee52000}, {0xbee54000}, {0xbee56000}, + {0xbee58000}, {0xbee5a000}, {0xbee5c000}, {0xbee5e000}, + {0xbee60000}, {0xbee62000}, {0xbee64000}, {0xbee66000}, + {0xbee68000}, {0xbee6a000}, {0xbee6c000}, {0xbee6e000}, + {0xbee70000}, {0xbee72000}, {0xbee74000}, {0xbee76000}, + {0xbee78000}, {0xbee7a000}, {0xbee7c000}, {0xbee7e000}, + {0xbee80000}, {0xbee82000}, {0xbee84000}, {0xbee86000}, + {0xbee88000}, {0xbee8a000}, {0xbee8c000}, {0xbee8e000}, + {0xbee90000}, {0xbee92000}, {0xbee94000}, {0xbee96000}, + {0xbee98000}, {0xbee9a000}, {0xbee9c000}, {0xbee9e000}, + {0xbeea0000}, {0xbeea2000}, {0xbeea4000}, {0xbeea6000}, + {0xbeea8000}, {0xbeeaa000}, {0xbeeac000}, {0xbeeae000}, + {0xbeeb0000}, {0xbeeb2000}, {0xbeeb4000}, {0xbeeb6000}, + {0xbeeb8000}, {0xbeeba000}, {0xbeebc000}, {0xbeebe000}, + {0xbeec0000}, {0xbeec2000}, {0xbeec4000}, {0xbeec6000}, + {0xbeec8000}, {0xbeeca000}, {0xbeecc000}, {0xbeece000}, + {0xbeed0000}, {0xbeed2000}, {0xbeed4000}, {0xbeed6000}, + {0xbeed8000}, {0xbeeda000}, {0xbeedc000}, {0xbeede000}, + {0xbeee0000}, {0xbeee2000}, {0xbeee4000}, {0xbeee6000}, + {0xbeee8000}, {0xbeeea000}, {0xbeeec000}, {0xbeeee000}, + {0xbeef0000}, {0xbeef2000}, {0xbeef4000}, {0xbeef6000}, + {0xbeef8000}, {0xbeefa000}, {0xbeefc000}, {0xbeefe000}, + {0xbef00000}, {0xbef02000}, {0xbef04000}, {0xbef06000}, + {0xbef08000}, {0xbef0a000}, {0xbef0c000}, {0xbef0e000}, + {0xbef10000}, {0xbef12000}, {0xbef14000}, {0xbef16000}, + {0xbef18000}, {0xbef1a000}, {0xbef1c000}, {0xbef1e000}, + {0xbef20000}, {0xbef22000}, {0xbef24000}, {0xbef26000}, + {0xbef28000}, {0xbef2a000}, {0xbef2c000}, {0xbef2e000}, + {0xbef30000}, {0xbef32000}, {0xbef34000}, {0xbef36000}, + {0xbef38000}, {0xbef3a000}, {0xbef3c000}, {0xbef3e000}, + {0xbef40000}, {0xbef42000}, {0xbef44000}, {0xbef46000}, + {0xbef48000}, {0xbef4a000}, {0xbef4c000}, {0xbef4e000}, + {0xbef50000}, {0xbef52000}, {0xbef54000}, {0xbef56000}, + {0xbef58000}, {0xbef5a000}, {0xbef5c000}, {0xbef5e000}, + {0xbef60000}, {0xbef62000}, {0xbef64000}, {0xbef66000}, + {0xbef68000}, {0xbef6a000}, {0xbef6c000}, {0xbef6e000}, + {0xbef70000}, {0xbef72000}, {0xbef74000}, {0xbef76000}, + {0xbef78000}, {0xbef7a000}, {0xbef7c000}, {0xbef7e000}, + {0xbef80000}, {0xbef82000}, {0xbef84000}, {0xbef86000}, + {0xbef88000}, {0xbef8a000}, {0xbef8c000}, {0xbef8e000}, + {0xbef90000}, {0xbef92000}, {0xbef94000}, {0xbef96000}, + {0xbef98000}, {0xbef9a000}, {0xbef9c000}, {0xbef9e000}, + {0xbefa0000}, {0xbefa2000}, {0xbefa4000}, {0xbefa6000}, + {0xbefa8000}, {0xbefaa000}, {0xbefac000}, {0xbefae000}, + {0xbefb0000}, {0xbefb2000}, {0xbefb4000}, {0xbefb6000}, + {0xbefb8000}, {0xbefba000}, {0xbefbc000}, {0xbefbe000}, + {0xbefc0000}, {0xbefc2000}, {0xbefc4000}, {0xbefc6000}, + {0xbefc8000}, {0xbefca000}, {0xbefcc000}, {0xbefce000}, + {0xbefd0000}, {0xbefd2000}, {0xbefd4000}, {0xbefd6000}, + {0xbefd8000}, {0xbefda000}, {0xbefdc000}, {0xbefde000}, + {0xbefe0000}, {0xbefe2000}, {0xbefe4000}, {0xbefe6000}, + {0xbefe8000}, {0xbefea000}, {0xbefec000}, {0xbefee000}, + {0xbeff0000}, {0xbeff2000}, {0xbeff4000}, {0xbeff6000}, + {0xbeff8000}, {0xbeffa000}, {0xbeffc000}, {0xbeffe000}, + {0xbf000000}, {0xbf002000}, {0xbf004000}, {0xbf006000}, + {0xbf008000}, {0xbf00a000}, {0xbf00c000}, {0xbf00e000}, + {0xbf010000}, {0xbf012000}, {0xbf014000}, {0xbf016000}, + {0xbf018000}, {0xbf01a000}, {0xbf01c000}, {0xbf01e000}, + {0xbf020000}, {0xbf022000}, {0xbf024000}, {0xbf026000}, + {0xbf028000}, {0xbf02a000}, {0xbf02c000}, {0xbf02e000}, + {0xbf030000}, {0xbf032000}, {0xbf034000}, {0xbf036000}, + {0xbf038000}, {0xbf03a000}, {0xbf03c000}, {0xbf03e000}, + {0xbf040000}, {0xbf042000}, {0xbf044000}, {0xbf046000}, + {0xbf048000}, {0xbf04a000}, {0xbf04c000}, {0xbf04e000}, + {0xbf050000}, {0xbf052000}, {0xbf054000}, {0xbf056000}, + {0xbf058000}, {0xbf05a000}, {0xbf05c000}, {0xbf05e000}, + {0xbf060000}, {0xbf062000}, {0xbf064000}, {0xbf066000}, + {0xbf068000}, {0xbf06a000}, {0xbf06c000}, {0xbf06e000}, + {0xbf070000}, {0xbf072000}, {0xbf074000}, {0xbf076000}, + {0xbf078000}, {0xbf07a000}, {0xbf07c000}, {0xbf07e000}, + {0xbf080000}, {0xbf082000}, {0xbf084000}, {0xbf086000}, + {0xbf088000}, {0xbf08a000}, {0xbf08c000}, {0xbf08e000}, + {0xbf090000}, {0xbf092000}, {0xbf094000}, {0xbf096000}, + {0xbf098000}, {0xbf09a000}, {0xbf09c000}, {0xbf09e000}, + {0xbf0a0000}, {0xbf0a2000}, {0xbf0a4000}, {0xbf0a6000}, + {0xbf0a8000}, {0xbf0aa000}, {0xbf0ac000}, {0xbf0ae000}, + {0xbf0b0000}, {0xbf0b2000}, {0xbf0b4000}, {0xbf0b6000}, + {0xbf0b8000}, {0xbf0ba000}, {0xbf0bc000}, {0xbf0be000}, + {0xbf0c0000}, {0xbf0c2000}, {0xbf0c4000}, {0xbf0c6000}, + {0xbf0c8000}, {0xbf0ca000}, {0xbf0cc000}, {0xbf0ce000}, + {0xbf0d0000}, {0xbf0d2000}, {0xbf0d4000}, {0xbf0d6000}, + {0xbf0d8000}, {0xbf0da000}, {0xbf0dc000}, {0xbf0de000}, + {0xbf0e0000}, {0xbf0e2000}, {0xbf0e4000}, {0xbf0e6000}, + {0xbf0e8000}, {0xbf0ea000}, {0xbf0ec000}, {0xbf0ee000}, + {0xbf0f0000}, {0xbf0f2000}, {0xbf0f4000}, {0xbf0f6000}, + {0xbf0f8000}, {0xbf0fa000}, {0xbf0fc000}, {0xbf0fe000}, + {0xbf100000}, {0xbf102000}, {0xbf104000}, {0xbf106000}, + {0xbf108000}, {0xbf10a000}, {0xbf10c000}, {0xbf10e000}, + {0xbf110000}, {0xbf112000}, {0xbf114000}, {0xbf116000}, + {0xbf118000}, {0xbf11a000}, {0xbf11c000}, {0xbf11e000}, + {0xbf120000}, {0xbf122000}, {0xbf124000}, {0xbf126000}, + {0xbf128000}, {0xbf12a000}, {0xbf12c000}, {0xbf12e000}, + {0xbf130000}, {0xbf132000}, {0xbf134000}, {0xbf136000}, + {0xbf138000}, {0xbf13a000}, {0xbf13c000}, {0xbf13e000}, + {0xbf140000}, {0xbf142000}, {0xbf144000}, {0xbf146000}, + {0xbf148000}, {0xbf14a000}, {0xbf14c000}, {0xbf14e000}, + {0xbf150000}, {0xbf152000}, {0xbf154000}, {0xbf156000}, + {0xbf158000}, {0xbf15a000}, {0xbf15c000}, {0xbf15e000}, + {0xbf160000}, {0xbf162000}, {0xbf164000}, {0xbf166000}, + {0xbf168000}, {0xbf16a000}, {0xbf16c000}, {0xbf16e000}, + {0xbf170000}, {0xbf172000}, {0xbf174000}, {0xbf176000}, + {0xbf178000}, {0xbf17a000}, {0xbf17c000}, {0xbf17e000}, + {0xbf180000}, {0xbf182000}, {0xbf184000}, {0xbf186000}, + {0xbf188000}, {0xbf18a000}, {0xbf18c000}, {0xbf18e000}, + {0xbf190000}, {0xbf192000}, {0xbf194000}, {0xbf196000}, + {0xbf198000}, {0xbf19a000}, {0xbf19c000}, {0xbf19e000}, + {0xbf1a0000}, {0xbf1a2000}, {0xbf1a4000}, {0xbf1a6000}, + {0xbf1a8000}, {0xbf1aa000}, {0xbf1ac000}, {0xbf1ae000}, + {0xbf1b0000}, {0xbf1b2000}, {0xbf1b4000}, {0xbf1b6000}, + {0xbf1b8000}, {0xbf1ba000}, {0xbf1bc000}, {0xbf1be000}, + {0xbf1c0000}, {0xbf1c2000}, {0xbf1c4000}, {0xbf1c6000}, + {0xbf1c8000}, {0xbf1ca000}, {0xbf1cc000}, {0xbf1ce000}, + {0xbf1d0000}, {0xbf1d2000}, {0xbf1d4000}, {0xbf1d6000}, + {0xbf1d8000}, {0xbf1da000}, {0xbf1dc000}, {0xbf1de000}, + {0xbf1e0000}, {0xbf1e2000}, {0xbf1e4000}, {0xbf1e6000}, + {0xbf1e8000}, {0xbf1ea000}, {0xbf1ec000}, {0xbf1ee000}, + {0xbf1f0000}, {0xbf1f2000}, {0xbf1f4000}, {0xbf1f6000}, + {0xbf1f8000}, {0xbf1fa000}, {0xbf1fc000}, {0xbf1fe000}, + {0xbf200000}, {0xbf202000}, {0xbf204000}, {0xbf206000}, + {0xbf208000}, {0xbf20a000}, {0xbf20c000}, {0xbf20e000}, + {0xbf210000}, {0xbf212000}, {0xbf214000}, {0xbf216000}, + {0xbf218000}, {0xbf21a000}, {0xbf21c000}, {0xbf21e000}, + {0xbf220000}, {0xbf222000}, {0xbf224000}, {0xbf226000}, + {0xbf228000}, {0xbf22a000}, {0xbf22c000}, {0xbf22e000}, + {0xbf230000}, {0xbf232000}, {0xbf234000}, {0xbf236000}, + {0xbf238000}, {0xbf23a000}, {0xbf23c000}, {0xbf23e000}, + {0xbf240000}, {0xbf242000}, {0xbf244000}, {0xbf246000}, + {0xbf248000}, {0xbf24a000}, {0xbf24c000}, {0xbf24e000}, + {0xbf250000}, {0xbf252000}, {0xbf254000}, {0xbf256000}, + {0xbf258000}, {0xbf25a000}, {0xbf25c000}, {0xbf25e000}, + {0xbf260000}, {0xbf262000}, {0xbf264000}, {0xbf266000}, + {0xbf268000}, {0xbf26a000}, {0xbf26c000}, {0xbf26e000}, + {0xbf270000}, {0xbf272000}, {0xbf274000}, {0xbf276000}, + {0xbf278000}, {0xbf27a000}, {0xbf27c000}, {0xbf27e000}, + {0xbf280000}, {0xbf282000}, {0xbf284000}, {0xbf286000}, + {0xbf288000}, {0xbf28a000}, {0xbf28c000}, {0xbf28e000}, + {0xbf290000}, {0xbf292000}, {0xbf294000}, {0xbf296000}, + {0xbf298000}, {0xbf29a000}, {0xbf29c000}, {0xbf29e000}, + {0xbf2a0000}, {0xbf2a2000}, {0xbf2a4000}, {0xbf2a6000}, + {0xbf2a8000}, {0xbf2aa000}, {0xbf2ac000}, {0xbf2ae000}, + {0xbf2b0000}, {0xbf2b2000}, {0xbf2b4000}, {0xbf2b6000}, + {0xbf2b8000}, {0xbf2ba000}, {0xbf2bc000}, {0xbf2be000}, + {0xbf2c0000}, {0xbf2c2000}, {0xbf2c4000}, {0xbf2c6000}, + {0xbf2c8000}, {0xbf2ca000}, {0xbf2cc000}, {0xbf2ce000}, + {0xbf2d0000}, {0xbf2d2000}, {0xbf2d4000}, {0xbf2d6000}, + {0xbf2d8000}, {0xbf2da000}, {0xbf2dc000}, {0xbf2de000}, + {0xbf2e0000}, {0xbf2e2000}, {0xbf2e4000}, {0xbf2e6000}, + {0xbf2e8000}, {0xbf2ea000}, {0xbf2ec000}, {0xbf2ee000}, + {0xbf2f0000}, {0xbf2f2000}, {0xbf2f4000}, {0xbf2f6000}, + {0xbf2f8000}, {0xbf2fa000}, {0xbf2fc000}, {0xbf2fe000}, + {0xbf300000}, {0xbf302000}, {0xbf304000}, {0xbf306000}, + {0xbf308000}, {0xbf30a000}, {0xbf30c000}, {0xbf30e000}, + {0xbf310000}, {0xbf312000}, {0xbf314000}, {0xbf316000}, + {0xbf318000}, {0xbf31a000}, {0xbf31c000}, {0xbf31e000}, + {0xbf320000}, {0xbf322000}, {0xbf324000}, {0xbf326000}, + {0xbf328000}, {0xbf32a000}, {0xbf32c000}, {0xbf32e000}, + {0xbf330000}, {0xbf332000}, {0xbf334000}, {0xbf336000}, + {0xbf338000}, {0xbf33a000}, {0xbf33c000}, {0xbf33e000}, + {0xbf340000}, {0xbf342000}, {0xbf344000}, {0xbf346000}, + {0xbf348000}, {0xbf34a000}, {0xbf34c000}, {0xbf34e000}, + {0xbf350000}, {0xbf352000}, {0xbf354000}, {0xbf356000}, + {0xbf358000}, {0xbf35a000}, {0xbf35c000}, {0xbf35e000}, + {0xbf360000}, {0xbf362000}, {0xbf364000}, {0xbf366000}, + {0xbf368000}, {0xbf36a000}, {0xbf36c000}, {0xbf36e000}, + {0xbf370000}, {0xbf372000}, {0xbf374000}, {0xbf376000}, + {0xbf378000}, {0xbf37a000}, {0xbf37c000}, {0xbf37e000}, + {0xbf380000}, {0xbf382000}, {0xbf384000}, {0xbf386000}, + {0xbf388000}, {0xbf38a000}, {0xbf38c000}, {0xbf38e000}, + {0xbf390000}, {0xbf392000}, {0xbf394000}, {0xbf396000}, + {0xbf398000}, {0xbf39a000}, {0xbf39c000}, {0xbf39e000}, + {0xbf3a0000}, {0xbf3a2000}, {0xbf3a4000}, {0xbf3a6000}, + {0xbf3a8000}, {0xbf3aa000}, {0xbf3ac000}, {0xbf3ae000}, + {0xbf3b0000}, {0xbf3b2000}, {0xbf3b4000}, {0xbf3b6000}, + {0xbf3b8000}, {0xbf3ba000}, {0xbf3bc000}, {0xbf3be000}, + {0xbf3c0000}, {0xbf3c2000}, {0xbf3c4000}, {0xbf3c6000}, + {0xbf3c8000}, {0xbf3ca000}, {0xbf3cc000}, {0xbf3ce000}, + {0xbf3d0000}, {0xbf3d2000}, {0xbf3d4000}, {0xbf3d6000}, + {0xbf3d8000}, {0xbf3da000}, {0xbf3dc000}, {0xbf3de000}, + {0xbf3e0000}, {0xbf3e2000}, {0xbf3e4000}, {0xbf3e6000}, + {0xbf3e8000}, {0xbf3ea000}, {0xbf3ec000}, {0xbf3ee000}, + {0xbf3f0000}, {0xbf3f2000}, {0xbf3f4000}, {0xbf3f6000}, + {0xbf3f8000}, {0xbf3fa000}, {0xbf3fc000}, {0xbf3fe000}, + {0xbf400000}, {0xbf402000}, {0xbf404000}, {0xbf406000}, + {0xbf408000}, {0xbf40a000}, {0xbf40c000}, {0xbf40e000}, + {0xbf410000}, {0xbf412000}, {0xbf414000}, {0xbf416000}, + {0xbf418000}, {0xbf41a000}, {0xbf41c000}, {0xbf41e000}, + {0xbf420000}, {0xbf422000}, {0xbf424000}, {0xbf426000}, + {0xbf428000}, {0xbf42a000}, {0xbf42c000}, {0xbf42e000}, + {0xbf430000}, {0xbf432000}, {0xbf434000}, {0xbf436000}, + {0xbf438000}, {0xbf43a000}, {0xbf43c000}, {0xbf43e000}, + {0xbf440000}, {0xbf442000}, {0xbf444000}, {0xbf446000}, + {0xbf448000}, {0xbf44a000}, {0xbf44c000}, {0xbf44e000}, + {0xbf450000}, {0xbf452000}, {0xbf454000}, {0xbf456000}, + {0xbf458000}, {0xbf45a000}, {0xbf45c000}, {0xbf45e000}, + {0xbf460000}, {0xbf462000}, {0xbf464000}, {0xbf466000}, + {0xbf468000}, {0xbf46a000}, {0xbf46c000}, {0xbf46e000}, + {0xbf470000}, {0xbf472000}, {0xbf474000}, {0xbf476000}, + {0xbf478000}, {0xbf47a000}, {0xbf47c000}, {0xbf47e000}, + {0xbf480000}, {0xbf482000}, {0xbf484000}, {0xbf486000}, + {0xbf488000}, {0xbf48a000}, {0xbf48c000}, {0xbf48e000}, + {0xbf490000}, {0xbf492000}, {0xbf494000}, {0xbf496000}, + {0xbf498000}, {0xbf49a000}, {0xbf49c000}, {0xbf49e000}, + {0xbf4a0000}, {0xbf4a2000}, {0xbf4a4000}, {0xbf4a6000}, + {0xbf4a8000}, {0xbf4aa000}, {0xbf4ac000}, {0xbf4ae000}, + {0xbf4b0000}, {0xbf4b2000}, {0xbf4b4000}, {0xbf4b6000}, + {0xbf4b8000}, {0xbf4ba000}, {0xbf4bc000}, {0xbf4be000}, + {0xbf4c0000}, {0xbf4c2000}, {0xbf4c4000}, {0xbf4c6000}, + {0xbf4c8000}, {0xbf4ca000}, {0xbf4cc000}, {0xbf4ce000}, + {0xbf4d0000}, {0xbf4d2000}, {0xbf4d4000}, {0xbf4d6000}, + {0xbf4d8000}, {0xbf4da000}, {0xbf4dc000}, {0xbf4de000}, + {0xbf4e0000}, {0xbf4e2000}, {0xbf4e4000}, {0xbf4e6000}, + {0xbf4e8000}, {0xbf4ea000}, {0xbf4ec000}, {0xbf4ee000}, + {0xbf4f0000}, {0xbf4f2000}, {0xbf4f4000}, {0xbf4f6000}, + {0xbf4f8000}, {0xbf4fa000}, {0xbf4fc000}, {0xbf4fe000}, + {0xbf500000}, {0xbf502000}, {0xbf504000}, {0xbf506000}, + {0xbf508000}, {0xbf50a000}, {0xbf50c000}, {0xbf50e000}, + {0xbf510000}, {0xbf512000}, {0xbf514000}, {0xbf516000}, + {0xbf518000}, {0xbf51a000}, {0xbf51c000}, {0xbf51e000}, + {0xbf520000}, {0xbf522000}, {0xbf524000}, {0xbf526000}, + {0xbf528000}, {0xbf52a000}, {0xbf52c000}, {0xbf52e000}, + {0xbf530000}, {0xbf532000}, {0xbf534000}, {0xbf536000}, + {0xbf538000}, {0xbf53a000}, {0xbf53c000}, {0xbf53e000}, + {0xbf540000}, {0xbf542000}, {0xbf544000}, {0xbf546000}, + {0xbf548000}, {0xbf54a000}, {0xbf54c000}, {0xbf54e000}, + {0xbf550000}, {0xbf552000}, {0xbf554000}, {0xbf556000}, + {0xbf558000}, {0xbf55a000}, {0xbf55c000}, {0xbf55e000}, + {0xbf560000}, {0xbf562000}, {0xbf564000}, {0xbf566000}, + {0xbf568000}, {0xbf56a000}, {0xbf56c000}, {0xbf56e000}, + {0xbf570000}, {0xbf572000}, {0xbf574000}, {0xbf576000}, + {0xbf578000}, {0xbf57a000}, {0xbf57c000}, {0xbf57e000}, + {0xbf580000}, {0xbf582000}, {0xbf584000}, {0xbf586000}, + {0xbf588000}, {0xbf58a000}, {0xbf58c000}, {0xbf58e000}, + {0xbf590000}, {0xbf592000}, {0xbf594000}, {0xbf596000}, + {0xbf598000}, {0xbf59a000}, {0xbf59c000}, {0xbf59e000}, + {0xbf5a0000}, {0xbf5a2000}, {0xbf5a4000}, {0xbf5a6000}, + {0xbf5a8000}, {0xbf5aa000}, {0xbf5ac000}, {0xbf5ae000}, + {0xbf5b0000}, {0xbf5b2000}, {0xbf5b4000}, {0xbf5b6000}, + {0xbf5b8000}, {0xbf5ba000}, {0xbf5bc000}, {0xbf5be000}, + {0xbf5c0000}, {0xbf5c2000}, {0xbf5c4000}, {0xbf5c6000}, + {0xbf5c8000}, {0xbf5ca000}, {0xbf5cc000}, {0xbf5ce000}, + {0xbf5d0000}, {0xbf5d2000}, {0xbf5d4000}, {0xbf5d6000}, + {0xbf5d8000}, {0xbf5da000}, {0xbf5dc000}, {0xbf5de000}, + {0xbf5e0000}, {0xbf5e2000}, {0xbf5e4000}, {0xbf5e6000}, + {0xbf5e8000}, {0xbf5ea000}, {0xbf5ec000}, {0xbf5ee000}, + {0xbf5f0000}, {0xbf5f2000}, {0xbf5f4000}, {0xbf5f6000}, + {0xbf5f8000}, {0xbf5fa000}, {0xbf5fc000}, {0xbf5fe000}, + {0xbf600000}, {0xbf602000}, {0xbf604000}, {0xbf606000}, + {0xbf608000}, {0xbf60a000}, {0xbf60c000}, {0xbf60e000}, + {0xbf610000}, {0xbf612000}, {0xbf614000}, {0xbf616000}, + {0xbf618000}, {0xbf61a000}, {0xbf61c000}, {0xbf61e000}, + {0xbf620000}, {0xbf622000}, {0xbf624000}, {0xbf626000}, + {0xbf628000}, {0xbf62a000}, {0xbf62c000}, {0xbf62e000}, + {0xbf630000}, {0xbf632000}, {0xbf634000}, {0xbf636000}, + {0xbf638000}, {0xbf63a000}, {0xbf63c000}, {0xbf63e000}, + {0xbf640000}, {0xbf642000}, {0xbf644000}, {0xbf646000}, + {0xbf648000}, {0xbf64a000}, {0xbf64c000}, {0xbf64e000}, + {0xbf650000}, {0xbf652000}, {0xbf654000}, {0xbf656000}, + {0xbf658000}, {0xbf65a000}, {0xbf65c000}, {0xbf65e000}, + {0xbf660000}, {0xbf662000}, {0xbf664000}, {0xbf666000}, + {0xbf668000}, {0xbf66a000}, {0xbf66c000}, {0xbf66e000}, + {0xbf670000}, {0xbf672000}, {0xbf674000}, {0xbf676000}, + {0xbf678000}, {0xbf67a000}, {0xbf67c000}, {0xbf67e000}, + {0xbf680000}, {0xbf682000}, {0xbf684000}, {0xbf686000}, + {0xbf688000}, {0xbf68a000}, {0xbf68c000}, {0xbf68e000}, + {0xbf690000}, {0xbf692000}, {0xbf694000}, {0xbf696000}, + {0xbf698000}, {0xbf69a000}, {0xbf69c000}, {0xbf69e000}, + {0xbf6a0000}, {0xbf6a2000}, {0xbf6a4000}, {0xbf6a6000}, + {0xbf6a8000}, {0xbf6aa000}, {0xbf6ac000}, {0xbf6ae000}, + {0xbf6b0000}, {0xbf6b2000}, {0xbf6b4000}, {0xbf6b6000}, + {0xbf6b8000}, {0xbf6ba000}, {0xbf6bc000}, {0xbf6be000}, + {0xbf6c0000}, {0xbf6c2000}, {0xbf6c4000}, {0xbf6c6000}, + {0xbf6c8000}, {0xbf6ca000}, {0xbf6cc000}, {0xbf6ce000}, + {0xbf6d0000}, {0xbf6d2000}, {0xbf6d4000}, {0xbf6d6000}, + {0xbf6d8000}, {0xbf6da000}, {0xbf6dc000}, {0xbf6de000}, + {0xbf6e0000}, {0xbf6e2000}, {0xbf6e4000}, {0xbf6e6000}, + {0xbf6e8000}, {0xbf6ea000}, {0xbf6ec000}, {0xbf6ee000}, + {0xbf6f0000}, {0xbf6f2000}, {0xbf6f4000}, {0xbf6f6000}, + {0xbf6f8000}, {0xbf6fa000}, {0xbf6fc000}, {0xbf6fe000}, + {0xbf700000}, {0xbf702000}, {0xbf704000}, {0xbf706000}, + {0xbf708000}, {0xbf70a000}, {0xbf70c000}, {0xbf70e000}, + {0xbf710000}, {0xbf712000}, {0xbf714000}, {0xbf716000}, + {0xbf718000}, {0xbf71a000}, {0xbf71c000}, {0xbf71e000}, + {0xbf720000}, {0xbf722000}, {0xbf724000}, {0xbf726000}, + {0xbf728000}, {0xbf72a000}, {0xbf72c000}, {0xbf72e000}, + {0xbf730000}, {0xbf732000}, {0xbf734000}, {0xbf736000}, + {0xbf738000}, {0xbf73a000}, {0xbf73c000}, {0xbf73e000}, + {0xbf740000}, {0xbf742000}, {0xbf744000}, {0xbf746000}, + {0xbf748000}, {0xbf74a000}, {0xbf74c000}, {0xbf74e000}, + {0xbf750000}, {0xbf752000}, {0xbf754000}, {0xbf756000}, + {0xbf758000}, {0xbf75a000}, {0xbf75c000}, {0xbf75e000}, + {0xbf760000}, {0xbf762000}, {0xbf764000}, {0xbf766000}, + {0xbf768000}, {0xbf76a000}, {0xbf76c000}, {0xbf76e000}, + {0xbf770000}, {0xbf772000}, {0xbf774000}, {0xbf776000}, + {0xbf778000}, {0xbf77a000}, {0xbf77c000}, {0xbf77e000}, + {0xbf780000}, {0xbf782000}, {0xbf784000}, {0xbf786000}, + {0xbf788000}, {0xbf78a000}, {0xbf78c000}, {0xbf78e000}, + {0xbf790000}, {0xbf792000}, {0xbf794000}, {0xbf796000}, + {0xbf798000}, {0xbf79a000}, {0xbf79c000}, {0xbf79e000}, + {0xbf7a0000}, {0xbf7a2000}, {0xbf7a4000}, {0xbf7a6000}, + {0xbf7a8000}, {0xbf7aa000}, {0xbf7ac000}, {0xbf7ae000}, + {0xbf7b0000}, {0xbf7b2000}, {0xbf7b4000}, {0xbf7b6000}, + {0xbf7b8000}, {0xbf7ba000}, {0xbf7bc000}, {0xbf7be000}, + {0xbf7c0000}, {0xbf7c2000}, {0xbf7c4000}, {0xbf7c6000}, + {0xbf7c8000}, {0xbf7ca000}, {0xbf7cc000}, {0xbf7ce000}, + {0xbf7d0000}, {0xbf7d2000}, {0xbf7d4000}, {0xbf7d6000}, + {0xbf7d8000}, {0xbf7da000}, {0xbf7dc000}, {0xbf7de000}, + {0xbf7e0000}, {0xbf7e2000}, {0xbf7e4000}, {0xbf7e6000}, + {0xbf7e8000}, {0xbf7ea000}, {0xbf7ec000}, {0xbf7ee000}, + {0xbf7f0000}, {0xbf7f2000}, {0xbf7f4000}, {0xbf7f6000}, + {0xbf7f8000}, {0xbf7fa000}, {0xbf7fc000}, {0xbf7fe000}, + {0xbf800000}, {0xbf802000}, {0xbf804000}, {0xbf806000}, + {0xbf808000}, {0xbf80a000}, {0xbf80c000}, {0xbf80e000}, + {0xbf810000}, {0xbf812000}, {0xbf814000}, {0xbf816000}, + {0xbf818000}, {0xbf81a000}, {0xbf81c000}, {0xbf81e000}, + {0xbf820000}, {0xbf822000}, {0xbf824000}, {0xbf826000}, + {0xbf828000}, {0xbf82a000}, {0xbf82c000}, {0xbf82e000}, + {0xbf830000}, {0xbf832000}, {0xbf834000}, {0xbf836000}, + {0xbf838000}, {0xbf83a000}, {0xbf83c000}, {0xbf83e000}, + {0xbf840000}, {0xbf842000}, {0xbf844000}, {0xbf846000}, + {0xbf848000}, {0xbf84a000}, {0xbf84c000}, {0xbf84e000}, + {0xbf850000}, {0xbf852000}, {0xbf854000}, {0xbf856000}, + {0xbf858000}, {0xbf85a000}, {0xbf85c000}, {0xbf85e000}, + {0xbf860000}, {0xbf862000}, {0xbf864000}, {0xbf866000}, + {0xbf868000}, {0xbf86a000}, {0xbf86c000}, {0xbf86e000}, + {0xbf870000}, {0xbf872000}, {0xbf874000}, {0xbf876000}, + {0xbf878000}, {0xbf87a000}, {0xbf87c000}, {0xbf87e000}, + {0xbf880000}, {0xbf882000}, {0xbf884000}, {0xbf886000}, + {0xbf888000}, {0xbf88a000}, {0xbf88c000}, {0xbf88e000}, + {0xbf890000}, {0xbf892000}, {0xbf894000}, {0xbf896000}, + {0xbf898000}, {0xbf89a000}, {0xbf89c000}, {0xbf89e000}, + {0xbf8a0000}, {0xbf8a2000}, {0xbf8a4000}, {0xbf8a6000}, + {0xbf8a8000}, {0xbf8aa000}, {0xbf8ac000}, {0xbf8ae000}, + {0xbf8b0000}, {0xbf8b2000}, {0xbf8b4000}, {0xbf8b6000}, + {0xbf8b8000}, {0xbf8ba000}, {0xbf8bc000}, {0xbf8be000}, + {0xbf8c0000}, {0xbf8c2000}, {0xbf8c4000}, {0xbf8c6000}, + {0xbf8c8000}, {0xbf8ca000}, {0xbf8cc000}, {0xbf8ce000}, + {0xbf8d0000}, {0xbf8d2000}, {0xbf8d4000}, {0xbf8d6000}, + {0xbf8d8000}, {0xbf8da000}, {0xbf8dc000}, {0xbf8de000}, + {0xbf8e0000}, {0xbf8e2000}, {0xbf8e4000}, {0xbf8e6000}, + {0xbf8e8000}, {0xbf8ea000}, {0xbf8ec000}, {0xbf8ee000}, + {0xbf8f0000}, {0xbf8f2000}, {0xbf8f4000}, {0xbf8f6000}, + {0xbf8f8000}, {0xbf8fa000}, {0xbf8fc000}, {0xbf8fe000}, + {0xbf900000}, {0xbf902000}, {0xbf904000}, {0xbf906000}, + {0xbf908000}, {0xbf90a000}, {0xbf90c000}, {0xbf90e000}, + {0xbf910000}, {0xbf912000}, {0xbf914000}, {0xbf916000}, + {0xbf918000}, {0xbf91a000}, {0xbf91c000}, {0xbf91e000}, + {0xbf920000}, {0xbf922000}, {0xbf924000}, {0xbf926000}, + {0xbf928000}, {0xbf92a000}, {0xbf92c000}, {0xbf92e000}, + {0xbf930000}, {0xbf932000}, {0xbf934000}, {0xbf936000}, + {0xbf938000}, {0xbf93a000}, {0xbf93c000}, {0xbf93e000}, + {0xbf940000}, {0xbf942000}, {0xbf944000}, {0xbf946000}, + {0xbf948000}, {0xbf94a000}, {0xbf94c000}, {0xbf94e000}, + {0xbf950000}, {0xbf952000}, {0xbf954000}, {0xbf956000}, + {0xbf958000}, {0xbf95a000}, {0xbf95c000}, {0xbf95e000}, + {0xbf960000}, {0xbf962000}, {0xbf964000}, {0xbf966000}, + {0xbf968000}, {0xbf96a000}, {0xbf96c000}, {0xbf96e000}, + {0xbf970000}, {0xbf972000}, {0xbf974000}, {0xbf976000}, + {0xbf978000}, {0xbf97a000}, {0xbf97c000}, {0xbf97e000}, + {0xbf980000}, {0xbf982000}, {0xbf984000}, {0xbf986000}, + {0xbf988000}, {0xbf98a000}, {0xbf98c000}, {0xbf98e000}, + {0xbf990000}, {0xbf992000}, {0xbf994000}, {0xbf996000}, + {0xbf998000}, {0xbf99a000}, {0xbf99c000}, {0xbf99e000}, + {0xbf9a0000}, {0xbf9a2000}, {0xbf9a4000}, {0xbf9a6000}, + {0xbf9a8000}, {0xbf9aa000}, {0xbf9ac000}, {0xbf9ae000}, + {0xbf9b0000}, {0xbf9b2000}, {0xbf9b4000}, {0xbf9b6000}, + {0xbf9b8000}, {0xbf9ba000}, {0xbf9bc000}, {0xbf9be000}, + {0xbf9c0000}, {0xbf9c2000}, {0xbf9c4000}, {0xbf9c6000}, + {0xbf9c8000}, {0xbf9ca000}, {0xbf9cc000}, {0xbf9ce000}, + {0xbf9d0000}, {0xbf9d2000}, {0xbf9d4000}, {0xbf9d6000}, + {0xbf9d8000}, {0xbf9da000}, {0xbf9dc000}, {0xbf9de000}, + {0xbf9e0000}, {0xbf9e2000}, {0xbf9e4000}, {0xbf9e6000}, + {0xbf9e8000}, {0xbf9ea000}, {0xbf9ec000}, {0xbf9ee000}, + {0xbf9f0000}, {0xbf9f2000}, {0xbf9f4000}, {0xbf9f6000}, + {0xbf9f8000}, {0xbf9fa000}, {0xbf9fc000}, {0xbf9fe000}, + {0xbfa00000}, {0xbfa02000}, {0xbfa04000}, {0xbfa06000}, + {0xbfa08000}, {0xbfa0a000}, {0xbfa0c000}, {0xbfa0e000}, + {0xbfa10000}, {0xbfa12000}, {0xbfa14000}, {0xbfa16000}, + {0xbfa18000}, {0xbfa1a000}, {0xbfa1c000}, {0xbfa1e000}, + {0xbfa20000}, {0xbfa22000}, {0xbfa24000}, {0xbfa26000}, + {0xbfa28000}, {0xbfa2a000}, {0xbfa2c000}, {0xbfa2e000}, + {0xbfa30000}, {0xbfa32000}, {0xbfa34000}, {0xbfa36000}, + {0xbfa38000}, {0xbfa3a000}, {0xbfa3c000}, {0xbfa3e000}, + {0xbfa40000}, {0xbfa42000}, {0xbfa44000}, {0xbfa46000}, + {0xbfa48000}, {0xbfa4a000}, {0xbfa4c000}, {0xbfa4e000}, + {0xbfa50000}, {0xbfa52000}, {0xbfa54000}, {0xbfa56000}, + {0xbfa58000}, {0xbfa5a000}, {0xbfa5c000}, {0xbfa5e000}, + {0xbfa60000}, {0xbfa62000}, {0xbfa64000}, {0xbfa66000}, + {0xbfa68000}, {0xbfa6a000}, {0xbfa6c000}, {0xbfa6e000}, + {0xbfa70000}, {0xbfa72000}, {0xbfa74000}, {0xbfa76000}, + {0xbfa78000}, {0xbfa7a000}, {0xbfa7c000}, {0xbfa7e000}, + {0xbfa80000}, {0xbfa82000}, {0xbfa84000}, {0xbfa86000}, + {0xbfa88000}, {0xbfa8a000}, {0xbfa8c000}, {0xbfa8e000}, + {0xbfa90000}, {0xbfa92000}, {0xbfa94000}, {0xbfa96000}, + {0xbfa98000}, {0xbfa9a000}, {0xbfa9c000}, {0xbfa9e000}, + {0xbfaa0000}, {0xbfaa2000}, {0xbfaa4000}, {0xbfaa6000}, + {0xbfaa8000}, {0xbfaaa000}, {0xbfaac000}, {0xbfaae000}, + {0xbfab0000}, {0xbfab2000}, {0xbfab4000}, {0xbfab6000}, + {0xbfab8000}, {0xbfaba000}, {0xbfabc000}, {0xbfabe000}, + {0xbfac0000}, {0xbfac2000}, {0xbfac4000}, {0xbfac6000}, + {0xbfac8000}, {0xbfaca000}, {0xbfacc000}, {0xbface000}, + {0xbfad0000}, {0xbfad2000}, {0xbfad4000}, {0xbfad6000}, + {0xbfad8000}, {0xbfada000}, {0xbfadc000}, {0xbfade000}, + {0xbfae0000}, {0xbfae2000}, {0xbfae4000}, {0xbfae6000}, + {0xbfae8000}, {0xbfaea000}, {0xbfaec000}, {0xbfaee000}, + {0xbfaf0000}, {0xbfaf2000}, {0xbfaf4000}, {0xbfaf6000}, + {0xbfaf8000}, {0xbfafa000}, {0xbfafc000}, {0xbfafe000}, + {0xbfb00000}, {0xbfb02000}, {0xbfb04000}, {0xbfb06000}, + {0xbfb08000}, {0xbfb0a000}, {0xbfb0c000}, {0xbfb0e000}, + {0xbfb10000}, {0xbfb12000}, {0xbfb14000}, {0xbfb16000}, + {0xbfb18000}, {0xbfb1a000}, {0xbfb1c000}, {0xbfb1e000}, + {0xbfb20000}, {0xbfb22000}, {0xbfb24000}, {0xbfb26000}, + {0xbfb28000}, {0xbfb2a000}, {0xbfb2c000}, {0xbfb2e000}, + {0xbfb30000}, {0xbfb32000}, {0xbfb34000}, {0xbfb36000}, + {0xbfb38000}, {0xbfb3a000}, {0xbfb3c000}, {0xbfb3e000}, + {0xbfb40000}, {0xbfb42000}, {0xbfb44000}, {0xbfb46000}, + {0xbfb48000}, {0xbfb4a000}, {0xbfb4c000}, {0xbfb4e000}, + {0xbfb50000}, {0xbfb52000}, {0xbfb54000}, {0xbfb56000}, + {0xbfb58000}, {0xbfb5a000}, {0xbfb5c000}, {0xbfb5e000}, + {0xbfb60000}, {0xbfb62000}, {0xbfb64000}, {0xbfb66000}, + {0xbfb68000}, {0xbfb6a000}, {0xbfb6c000}, {0xbfb6e000}, + {0xbfb70000}, {0xbfb72000}, {0xbfb74000}, {0xbfb76000}, + {0xbfb78000}, {0xbfb7a000}, {0xbfb7c000}, {0xbfb7e000}, + {0xbfb80000}, {0xbfb82000}, {0xbfb84000}, {0xbfb86000}, + {0xbfb88000}, {0xbfb8a000}, {0xbfb8c000}, {0xbfb8e000}, + {0xbfb90000}, {0xbfb92000}, {0xbfb94000}, {0xbfb96000}, + {0xbfb98000}, {0xbfb9a000}, {0xbfb9c000}, {0xbfb9e000}, + {0xbfba0000}, {0xbfba2000}, {0xbfba4000}, {0xbfba6000}, + {0xbfba8000}, {0xbfbaa000}, {0xbfbac000}, {0xbfbae000}, + {0xbfbb0000}, {0xbfbb2000}, {0xbfbb4000}, {0xbfbb6000}, + {0xbfbb8000}, {0xbfbba000}, {0xbfbbc000}, {0xbfbbe000}, + {0xbfbc0000}, {0xbfbc2000}, {0xbfbc4000}, {0xbfbc6000}, + {0xbfbc8000}, {0xbfbca000}, {0xbfbcc000}, {0xbfbce000}, + {0xbfbd0000}, {0xbfbd2000}, {0xbfbd4000}, {0xbfbd6000}, + {0xbfbd8000}, {0xbfbda000}, {0xbfbdc000}, {0xbfbde000}, + {0xbfbe0000}, {0xbfbe2000}, {0xbfbe4000}, {0xbfbe6000}, + {0xbfbe8000}, {0xbfbea000}, {0xbfbec000}, {0xbfbee000}, + {0xbfbf0000}, {0xbfbf2000}, {0xbfbf4000}, {0xbfbf6000}, + {0xbfbf8000}, {0xbfbfa000}, {0xbfbfc000}, {0xbfbfe000}, + {0xbfc00000}, {0xbfc02000}, {0xbfc04000}, {0xbfc06000}, + {0xbfc08000}, {0xbfc0a000}, {0xbfc0c000}, {0xbfc0e000}, + {0xbfc10000}, {0xbfc12000}, {0xbfc14000}, {0xbfc16000}, + {0xbfc18000}, {0xbfc1a000}, {0xbfc1c000}, {0xbfc1e000}, + {0xbfc20000}, {0xbfc22000}, {0xbfc24000}, {0xbfc26000}, + {0xbfc28000}, {0xbfc2a000}, {0xbfc2c000}, {0xbfc2e000}, + {0xbfc30000}, {0xbfc32000}, {0xbfc34000}, {0xbfc36000}, + {0xbfc38000}, {0xbfc3a000}, {0xbfc3c000}, {0xbfc3e000}, + {0xbfc40000}, {0xbfc42000}, {0xbfc44000}, {0xbfc46000}, + {0xbfc48000}, {0xbfc4a000}, {0xbfc4c000}, {0xbfc4e000}, + {0xbfc50000}, {0xbfc52000}, {0xbfc54000}, {0xbfc56000}, + {0xbfc58000}, {0xbfc5a000}, {0xbfc5c000}, {0xbfc5e000}, + {0xbfc60000}, {0xbfc62000}, {0xbfc64000}, {0xbfc66000}, + {0xbfc68000}, {0xbfc6a000}, {0xbfc6c000}, {0xbfc6e000}, + {0xbfc70000}, {0xbfc72000}, {0xbfc74000}, {0xbfc76000}, + {0xbfc78000}, {0xbfc7a000}, {0xbfc7c000}, {0xbfc7e000}, + {0xbfc80000}, {0xbfc82000}, {0xbfc84000}, {0xbfc86000}, + {0xbfc88000}, {0xbfc8a000}, {0xbfc8c000}, {0xbfc8e000}, + {0xbfc90000}, {0xbfc92000}, {0xbfc94000}, {0xbfc96000}, + {0xbfc98000}, {0xbfc9a000}, {0xbfc9c000}, {0xbfc9e000}, + {0xbfca0000}, {0xbfca2000}, {0xbfca4000}, {0xbfca6000}, + {0xbfca8000}, {0xbfcaa000}, {0xbfcac000}, {0xbfcae000}, + {0xbfcb0000}, {0xbfcb2000}, {0xbfcb4000}, {0xbfcb6000}, + {0xbfcb8000}, {0xbfcba000}, {0xbfcbc000}, {0xbfcbe000}, + {0xbfcc0000}, {0xbfcc2000}, {0xbfcc4000}, {0xbfcc6000}, + {0xbfcc8000}, {0xbfcca000}, {0xbfccc000}, {0xbfcce000}, + {0xbfcd0000}, {0xbfcd2000}, {0xbfcd4000}, {0xbfcd6000}, + {0xbfcd8000}, {0xbfcda000}, {0xbfcdc000}, {0xbfcde000}, + {0xbfce0000}, {0xbfce2000}, {0xbfce4000}, {0xbfce6000}, + {0xbfce8000}, {0xbfcea000}, {0xbfcec000}, {0xbfcee000}, + {0xbfcf0000}, {0xbfcf2000}, {0xbfcf4000}, {0xbfcf6000}, + {0xbfcf8000}, {0xbfcfa000}, {0xbfcfc000}, {0xbfcfe000}, + {0xbfd00000}, {0xbfd02000}, {0xbfd04000}, {0xbfd06000}, + {0xbfd08000}, {0xbfd0a000}, {0xbfd0c000}, {0xbfd0e000}, + {0xbfd10000}, {0xbfd12000}, {0xbfd14000}, {0xbfd16000}, + {0xbfd18000}, {0xbfd1a000}, {0xbfd1c000}, {0xbfd1e000}, + {0xbfd20000}, {0xbfd22000}, {0xbfd24000}, {0xbfd26000}, + {0xbfd28000}, {0xbfd2a000}, {0xbfd2c000}, {0xbfd2e000}, + {0xbfd30000}, {0xbfd32000}, {0xbfd34000}, {0xbfd36000}, + {0xbfd38000}, {0xbfd3a000}, {0xbfd3c000}, {0xbfd3e000}, + {0xbfd40000}, {0xbfd42000}, {0xbfd44000}, {0xbfd46000}, + {0xbfd48000}, {0xbfd4a000}, {0xbfd4c000}, {0xbfd4e000}, + {0xbfd50000}, {0xbfd52000}, {0xbfd54000}, {0xbfd56000}, + {0xbfd58000}, {0xbfd5a000}, {0xbfd5c000}, {0xbfd5e000}, + {0xbfd60000}, {0xbfd62000}, {0xbfd64000}, {0xbfd66000}, + {0xbfd68000}, {0xbfd6a000}, {0xbfd6c000}, {0xbfd6e000}, + {0xbfd70000}, {0xbfd72000}, {0xbfd74000}, {0xbfd76000}, + {0xbfd78000}, {0xbfd7a000}, {0xbfd7c000}, {0xbfd7e000}, + {0xbfd80000}, {0xbfd82000}, {0xbfd84000}, {0xbfd86000}, + {0xbfd88000}, {0xbfd8a000}, {0xbfd8c000}, {0xbfd8e000}, + {0xbfd90000}, {0xbfd92000}, {0xbfd94000}, {0xbfd96000}, + {0xbfd98000}, {0xbfd9a000}, {0xbfd9c000}, {0xbfd9e000}, + {0xbfda0000}, {0xbfda2000}, {0xbfda4000}, {0xbfda6000}, + {0xbfda8000}, {0xbfdaa000}, {0xbfdac000}, {0xbfdae000}, + {0xbfdb0000}, {0xbfdb2000}, {0xbfdb4000}, {0xbfdb6000}, + {0xbfdb8000}, {0xbfdba000}, {0xbfdbc000}, {0xbfdbe000}, + {0xbfdc0000}, {0xbfdc2000}, {0xbfdc4000}, {0xbfdc6000}, + {0xbfdc8000}, {0xbfdca000}, {0xbfdcc000}, {0xbfdce000}, + {0xbfdd0000}, {0xbfdd2000}, {0xbfdd4000}, {0xbfdd6000}, + {0xbfdd8000}, {0xbfdda000}, {0xbfddc000}, {0xbfdde000}, + {0xbfde0000}, {0xbfde2000}, {0xbfde4000}, {0xbfde6000}, + {0xbfde8000}, {0xbfdea000}, {0xbfdec000}, {0xbfdee000}, + {0xbfdf0000}, {0xbfdf2000}, {0xbfdf4000}, {0xbfdf6000}, + {0xbfdf8000}, {0xbfdfa000}, {0xbfdfc000}, {0xbfdfe000}, + {0xbfe00000}, {0xbfe02000}, {0xbfe04000}, {0xbfe06000}, + {0xbfe08000}, {0xbfe0a000}, {0xbfe0c000}, {0xbfe0e000}, + {0xbfe10000}, {0xbfe12000}, {0xbfe14000}, {0xbfe16000}, + {0xbfe18000}, {0xbfe1a000}, {0xbfe1c000}, {0xbfe1e000}, + {0xbfe20000}, {0xbfe22000}, {0xbfe24000}, {0xbfe26000}, + {0xbfe28000}, {0xbfe2a000}, {0xbfe2c000}, {0xbfe2e000}, + {0xbfe30000}, {0xbfe32000}, {0xbfe34000}, {0xbfe36000}, + {0xbfe38000}, {0xbfe3a000}, {0xbfe3c000}, {0xbfe3e000}, + {0xbfe40000}, {0xbfe42000}, {0xbfe44000}, {0xbfe46000}, + {0xbfe48000}, {0xbfe4a000}, {0xbfe4c000}, {0xbfe4e000}, + {0xbfe50000}, {0xbfe52000}, {0xbfe54000}, {0xbfe56000}, + {0xbfe58000}, {0xbfe5a000}, {0xbfe5c000}, {0xbfe5e000}, + {0xbfe60000}, {0xbfe62000}, {0xbfe64000}, {0xbfe66000}, + {0xbfe68000}, {0xbfe6a000}, {0xbfe6c000}, {0xbfe6e000}, + {0xbfe70000}, {0xbfe72000}, {0xbfe74000}, {0xbfe76000}, + {0xbfe78000}, {0xbfe7a000}, {0xbfe7c000}, {0xbfe7e000}, + {0xbfe80000}, {0xbfe82000}, {0xbfe84000}, {0xbfe86000}, + {0xbfe88000}, {0xbfe8a000}, {0xbfe8c000}, {0xbfe8e000}, + {0xbfe90000}, {0xbfe92000}, {0xbfe94000}, {0xbfe96000}, + {0xbfe98000}, {0xbfe9a000}, {0xbfe9c000}, {0xbfe9e000}, + {0xbfea0000}, {0xbfea2000}, {0xbfea4000}, {0xbfea6000}, + {0xbfea8000}, {0xbfeaa000}, {0xbfeac000}, {0xbfeae000}, + {0xbfeb0000}, {0xbfeb2000}, {0xbfeb4000}, {0xbfeb6000}, + {0xbfeb8000}, {0xbfeba000}, {0xbfebc000}, {0xbfebe000}, + {0xbfec0000}, {0xbfec2000}, {0xbfec4000}, {0xbfec6000}, + {0xbfec8000}, {0xbfeca000}, {0xbfecc000}, {0xbfece000}, + {0xbfed0000}, {0xbfed2000}, {0xbfed4000}, {0xbfed6000}, + {0xbfed8000}, {0xbfeda000}, {0xbfedc000}, {0xbfede000}, + {0xbfee0000}, {0xbfee2000}, {0xbfee4000}, {0xbfee6000}, + {0xbfee8000}, {0xbfeea000}, {0xbfeec000}, {0xbfeee000}, + {0xbfef0000}, {0xbfef2000}, {0xbfef4000}, {0xbfef6000}, + {0xbfef8000}, {0xbfefa000}, {0xbfefc000}, {0xbfefe000}, + {0xbff00000}, {0xbff02000}, {0xbff04000}, {0xbff06000}, + {0xbff08000}, {0xbff0a000}, {0xbff0c000}, {0xbff0e000}, + {0xbff10000}, {0xbff12000}, {0xbff14000}, {0xbff16000}, + {0xbff18000}, {0xbff1a000}, {0xbff1c000}, {0xbff1e000}, + {0xbff20000}, {0xbff22000}, {0xbff24000}, {0xbff26000}, + {0xbff28000}, {0xbff2a000}, {0xbff2c000}, {0xbff2e000}, + {0xbff30000}, {0xbff32000}, {0xbff34000}, {0xbff36000}, + {0xbff38000}, {0xbff3a000}, {0xbff3c000}, {0xbff3e000}, + {0xbff40000}, {0xbff42000}, {0xbff44000}, {0xbff46000}, + {0xbff48000}, {0xbff4a000}, {0xbff4c000}, {0xbff4e000}, + {0xbff50000}, {0xbff52000}, {0xbff54000}, {0xbff56000}, + {0xbff58000}, {0xbff5a000}, {0xbff5c000}, {0xbff5e000}, + {0xbff60000}, {0xbff62000}, {0xbff64000}, {0xbff66000}, + {0xbff68000}, {0xbff6a000}, {0xbff6c000}, {0xbff6e000}, + {0xbff70000}, {0xbff72000}, {0xbff74000}, {0xbff76000}, + {0xbff78000}, {0xbff7a000}, {0xbff7c000}, {0xbff7e000}, + {0xbff80000}, {0xbff82000}, {0xbff84000}, {0xbff86000}, + {0xbff88000}, {0xbff8a000}, {0xbff8c000}, {0xbff8e000}, + {0xbff90000}, {0xbff92000}, {0xbff94000}, {0xbff96000}, + {0xbff98000}, {0xbff9a000}, {0xbff9c000}, {0xbff9e000}, + {0xbffa0000}, {0xbffa2000}, {0xbffa4000}, {0xbffa6000}, + {0xbffa8000}, {0xbffaa000}, {0xbffac000}, {0xbffae000}, + {0xbffb0000}, {0xbffb2000}, {0xbffb4000}, {0xbffb6000}, + {0xbffb8000}, {0xbffba000}, {0xbffbc000}, {0xbffbe000}, + {0xbffc0000}, {0xbffc2000}, {0xbffc4000}, {0xbffc6000}, + {0xbffc8000}, {0xbffca000}, {0xbffcc000}, {0xbffce000}, + {0xbffd0000}, {0xbffd2000}, {0xbffd4000}, {0xbffd6000}, + {0xbffd8000}, {0xbffda000}, {0xbffdc000}, {0xbffde000}, + {0xbffe0000}, {0xbffe2000}, {0xbffe4000}, {0xbffe6000}, + {0xbffe8000}, {0xbffea000}, {0xbffec000}, {0xbffee000}, + {0xbfff0000}, {0xbfff2000}, {0xbfff4000}, {0xbfff6000}, + {0xbfff8000}, {0xbfffa000}, {0xbfffc000}, {0xbfffe000}, + {0xc0000000}, {0xc0002000}, {0xc0004000}, {0xc0006000}, + {0xc0008000}, {0xc000a000}, {0xc000c000}, {0xc000e000}, + {0xc0010000}, {0xc0012000}, {0xc0014000}, {0xc0016000}, + {0xc0018000}, {0xc001a000}, {0xc001c000}, {0xc001e000}, + {0xc0020000}, {0xc0022000}, {0xc0024000}, {0xc0026000}, + {0xc0028000}, {0xc002a000}, {0xc002c000}, {0xc002e000}, + {0xc0030000}, {0xc0032000}, {0xc0034000}, {0xc0036000}, + {0xc0038000}, {0xc003a000}, {0xc003c000}, {0xc003e000}, + {0xc0040000}, {0xc0042000}, {0xc0044000}, {0xc0046000}, + {0xc0048000}, {0xc004a000}, {0xc004c000}, {0xc004e000}, + {0xc0050000}, {0xc0052000}, {0xc0054000}, {0xc0056000}, + {0xc0058000}, {0xc005a000}, {0xc005c000}, {0xc005e000}, + {0xc0060000}, {0xc0062000}, {0xc0064000}, {0xc0066000}, + {0xc0068000}, {0xc006a000}, {0xc006c000}, {0xc006e000}, + {0xc0070000}, {0xc0072000}, {0xc0074000}, {0xc0076000}, + {0xc0078000}, {0xc007a000}, {0xc007c000}, {0xc007e000}, + {0xc0080000}, {0xc0082000}, {0xc0084000}, {0xc0086000}, + {0xc0088000}, {0xc008a000}, {0xc008c000}, {0xc008e000}, + {0xc0090000}, {0xc0092000}, {0xc0094000}, {0xc0096000}, + {0xc0098000}, {0xc009a000}, {0xc009c000}, {0xc009e000}, + {0xc00a0000}, {0xc00a2000}, {0xc00a4000}, {0xc00a6000}, + {0xc00a8000}, {0xc00aa000}, {0xc00ac000}, {0xc00ae000}, + {0xc00b0000}, {0xc00b2000}, {0xc00b4000}, {0xc00b6000}, + {0xc00b8000}, {0xc00ba000}, {0xc00bc000}, {0xc00be000}, + {0xc00c0000}, {0xc00c2000}, {0xc00c4000}, {0xc00c6000}, + {0xc00c8000}, {0xc00ca000}, {0xc00cc000}, {0xc00ce000}, + {0xc00d0000}, {0xc00d2000}, {0xc00d4000}, {0xc00d6000}, + {0xc00d8000}, {0xc00da000}, {0xc00dc000}, {0xc00de000}, + {0xc00e0000}, {0xc00e2000}, {0xc00e4000}, {0xc00e6000}, + {0xc00e8000}, {0xc00ea000}, {0xc00ec000}, {0xc00ee000}, + {0xc00f0000}, {0xc00f2000}, {0xc00f4000}, {0xc00f6000}, + {0xc00f8000}, {0xc00fa000}, {0xc00fc000}, {0xc00fe000}, + {0xc0100000}, {0xc0102000}, {0xc0104000}, {0xc0106000}, + {0xc0108000}, {0xc010a000}, {0xc010c000}, {0xc010e000}, + {0xc0110000}, {0xc0112000}, {0xc0114000}, {0xc0116000}, + {0xc0118000}, {0xc011a000}, {0xc011c000}, {0xc011e000}, + {0xc0120000}, {0xc0122000}, {0xc0124000}, {0xc0126000}, + {0xc0128000}, {0xc012a000}, {0xc012c000}, {0xc012e000}, + {0xc0130000}, {0xc0132000}, {0xc0134000}, {0xc0136000}, + {0xc0138000}, {0xc013a000}, {0xc013c000}, {0xc013e000}, + {0xc0140000}, {0xc0142000}, {0xc0144000}, {0xc0146000}, + {0xc0148000}, {0xc014a000}, {0xc014c000}, {0xc014e000}, + {0xc0150000}, {0xc0152000}, {0xc0154000}, {0xc0156000}, + {0xc0158000}, {0xc015a000}, {0xc015c000}, {0xc015e000}, + {0xc0160000}, {0xc0162000}, {0xc0164000}, {0xc0166000}, + {0xc0168000}, {0xc016a000}, {0xc016c000}, {0xc016e000}, + {0xc0170000}, {0xc0172000}, {0xc0174000}, {0xc0176000}, + {0xc0178000}, {0xc017a000}, {0xc017c000}, {0xc017e000}, + {0xc0180000}, {0xc0182000}, {0xc0184000}, {0xc0186000}, + {0xc0188000}, {0xc018a000}, {0xc018c000}, {0xc018e000}, + {0xc0190000}, {0xc0192000}, {0xc0194000}, {0xc0196000}, + {0xc0198000}, {0xc019a000}, {0xc019c000}, {0xc019e000}, + {0xc01a0000}, {0xc01a2000}, {0xc01a4000}, {0xc01a6000}, + {0xc01a8000}, {0xc01aa000}, {0xc01ac000}, {0xc01ae000}, + {0xc01b0000}, {0xc01b2000}, {0xc01b4000}, {0xc01b6000}, + {0xc01b8000}, {0xc01ba000}, {0xc01bc000}, {0xc01be000}, + {0xc01c0000}, {0xc01c2000}, {0xc01c4000}, {0xc01c6000}, + {0xc01c8000}, {0xc01ca000}, {0xc01cc000}, {0xc01ce000}, + {0xc01d0000}, {0xc01d2000}, {0xc01d4000}, {0xc01d6000}, + {0xc01d8000}, {0xc01da000}, {0xc01dc000}, {0xc01de000}, + {0xc01e0000}, {0xc01e2000}, {0xc01e4000}, {0xc01e6000}, + {0xc01e8000}, {0xc01ea000}, {0xc01ec000}, {0xc01ee000}, + {0xc01f0000}, {0xc01f2000}, {0xc01f4000}, {0xc01f6000}, + {0xc01f8000}, {0xc01fa000}, {0xc01fc000}, {0xc01fe000}, + {0xc0200000}, {0xc0202000}, {0xc0204000}, {0xc0206000}, + {0xc0208000}, {0xc020a000}, {0xc020c000}, {0xc020e000}, + {0xc0210000}, {0xc0212000}, {0xc0214000}, {0xc0216000}, + {0xc0218000}, {0xc021a000}, {0xc021c000}, {0xc021e000}, + {0xc0220000}, {0xc0222000}, {0xc0224000}, {0xc0226000}, + {0xc0228000}, {0xc022a000}, {0xc022c000}, {0xc022e000}, + {0xc0230000}, {0xc0232000}, {0xc0234000}, {0xc0236000}, + {0xc0238000}, {0xc023a000}, {0xc023c000}, {0xc023e000}, + {0xc0240000}, {0xc0242000}, {0xc0244000}, {0xc0246000}, + {0xc0248000}, {0xc024a000}, {0xc024c000}, {0xc024e000}, + {0xc0250000}, {0xc0252000}, {0xc0254000}, {0xc0256000}, + {0xc0258000}, {0xc025a000}, {0xc025c000}, {0xc025e000}, + {0xc0260000}, {0xc0262000}, {0xc0264000}, {0xc0266000}, + {0xc0268000}, {0xc026a000}, {0xc026c000}, {0xc026e000}, + {0xc0270000}, {0xc0272000}, {0xc0274000}, {0xc0276000}, + {0xc0278000}, {0xc027a000}, {0xc027c000}, {0xc027e000}, + {0xc0280000}, {0xc0282000}, {0xc0284000}, {0xc0286000}, + {0xc0288000}, {0xc028a000}, {0xc028c000}, {0xc028e000}, + {0xc0290000}, {0xc0292000}, {0xc0294000}, {0xc0296000}, + {0xc0298000}, {0xc029a000}, {0xc029c000}, {0xc029e000}, + {0xc02a0000}, {0xc02a2000}, {0xc02a4000}, {0xc02a6000}, + {0xc02a8000}, {0xc02aa000}, {0xc02ac000}, {0xc02ae000}, + {0xc02b0000}, {0xc02b2000}, {0xc02b4000}, {0xc02b6000}, + {0xc02b8000}, {0xc02ba000}, {0xc02bc000}, {0xc02be000}, + {0xc02c0000}, {0xc02c2000}, {0xc02c4000}, {0xc02c6000}, + {0xc02c8000}, {0xc02ca000}, {0xc02cc000}, {0xc02ce000}, + {0xc02d0000}, {0xc02d2000}, {0xc02d4000}, {0xc02d6000}, + {0xc02d8000}, {0xc02da000}, {0xc02dc000}, {0xc02de000}, + {0xc02e0000}, {0xc02e2000}, {0xc02e4000}, {0xc02e6000}, + {0xc02e8000}, {0xc02ea000}, {0xc02ec000}, {0xc02ee000}, + {0xc02f0000}, {0xc02f2000}, {0xc02f4000}, {0xc02f6000}, + {0xc02f8000}, {0xc02fa000}, {0xc02fc000}, {0xc02fe000}, + {0xc0300000}, {0xc0302000}, {0xc0304000}, {0xc0306000}, + {0xc0308000}, {0xc030a000}, {0xc030c000}, {0xc030e000}, + {0xc0310000}, {0xc0312000}, {0xc0314000}, {0xc0316000}, + {0xc0318000}, {0xc031a000}, {0xc031c000}, {0xc031e000}, + {0xc0320000}, {0xc0322000}, {0xc0324000}, {0xc0326000}, + {0xc0328000}, {0xc032a000}, {0xc032c000}, {0xc032e000}, + {0xc0330000}, {0xc0332000}, {0xc0334000}, {0xc0336000}, + {0xc0338000}, {0xc033a000}, {0xc033c000}, {0xc033e000}, + {0xc0340000}, {0xc0342000}, {0xc0344000}, {0xc0346000}, + {0xc0348000}, {0xc034a000}, {0xc034c000}, {0xc034e000}, + {0xc0350000}, {0xc0352000}, {0xc0354000}, {0xc0356000}, + {0xc0358000}, {0xc035a000}, {0xc035c000}, {0xc035e000}, + {0xc0360000}, {0xc0362000}, {0xc0364000}, {0xc0366000}, + {0xc0368000}, {0xc036a000}, {0xc036c000}, {0xc036e000}, + {0xc0370000}, {0xc0372000}, {0xc0374000}, {0xc0376000}, + {0xc0378000}, {0xc037a000}, {0xc037c000}, {0xc037e000}, + {0xc0380000}, {0xc0382000}, {0xc0384000}, {0xc0386000}, + {0xc0388000}, {0xc038a000}, {0xc038c000}, {0xc038e000}, + {0xc0390000}, {0xc0392000}, {0xc0394000}, {0xc0396000}, + {0xc0398000}, {0xc039a000}, {0xc039c000}, {0xc039e000}, + {0xc03a0000}, {0xc03a2000}, {0xc03a4000}, {0xc03a6000}, + {0xc03a8000}, {0xc03aa000}, {0xc03ac000}, {0xc03ae000}, + {0xc03b0000}, {0xc03b2000}, {0xc03b4000}, {0xc03b6000}, + {0xc03b8000}, {0xc03ba000}, {0xc03bc000}, {0xc03be000}, + {0xc03c0000}, {0xc03c2000}, {0xc03c4000}, {0xc03c6000}, + {0xc03c8000}, {0xc03ca000}, {0xc03cc000}, {0xc03ce000}, + {0xc03d0000}, {0xc03d2000}, {0xc03d4000}, {0xc03d6000}, + {0xc03d8000}, {0xc03da000}, {0xc03dc000}, {0xc03de000}, + {0xc03e0000}, {0xc03e2000}, {0xc03e4000}, {0xc03e6000}, + {0xc03e8000}, {0xc03ea000}, {0xc03ec000}, {0xc03ee000}, + {0xc03f0000}, {0xc03f2000}, {0xc03f4000}, {0xc03f6000}, + {0xc03f8000}, {0xc03fa000}, {0xc03fc000}, {0xc03fe000}, + {0xc0400000}, {0xc0402000}, {0xc0404000}, {0xc0406000}, + {0xc0408000}, {0xc040a000}, {0xc040c000}, {0xc040e000}, + {0xc0410000}, {0xc0412000}, {0xc0414000}, {0xc0416000}, + {0xc0418000}, {0xc041a000}, {0xc041c000}, {0xc041e000}, + {0xc0420000}, {0xc0422000}, {0xc0424000}, {0xc0426000}, + {0xc0428000}, {0xc042a000}, {0xc042c000}, {0xc042e000}, + {0xc0430000}, {0xc0432000}, {0xc0434000}, {0xc0436000}, + {0xc0438000}, {0xc043a000}, {0xc043c000}, {0xc043e000}, + {0xc0440000}, {0xc0442000}, {0xc0444000}, {0xc0446000}, + {0xc0448000}, {0xc044a000}, {0xc044c000}, {0xc044e000}, + {0xc0450000}, {0xc0452000}, {0xc0454000}, {0xc0456000}, + {0xc0458000}, {0xc045a000}, {0xc045c000}, {0xc045e000}, + {0xc0460000}, {0xc0462000}, {0xc0464000}, {0xc0466000}, + {0xc0468000}, {0xc046a000}, {0xc046c000}, {0xc046e000}, + {0xc0470000}, {0xc0472000}, {0xc0474000}, {0xc0476000}, + {0xc0478000}, {0xc047a000}, {0xc047c000}, {0xc047e000}, + {0xc0480000}, {0xc0482000}, {0xc0484000}, {0xc0486000}, + {0xc0488000}, {0xc048a000}, {0xc048c000}, {0xc048e000}, + {0xc0490000}, {0xc0492000}, {0xc0494000}, {0xc0496000}, + {0xc0498000}, {0xc049a000}, {0xc049c000}, {0xc049e000}, + {0xc04a0000}, {0xc04a2000}, {0xc04a4000}, {0xc04a6000}, + {0xc04a8000}, {0xc04aa000}, {0xc04ac000}, {0xc04ae000}, + {0xc04b0000}, {0xc04b2000}, {0xc04b4000}, {0xc04b6000}, + {0xc04b8000}, {0xc04ba000}, {0xc04bc000}, {0xc04be000}, + {0xc04c0000}, {0xc04c2000}, {0xc04c4000}, {0xc04c6000}, + {0xc04c8000}, {0xc04ca000}, {0xc04cc000}, {0xc04ce000}, + {0xc04d0000}, {0xc04d2000}, {0xc04d4000}, {0xc04d6000}, + {0xc04d8000}, {0xc04da000}, {0xc04dc000}, {0xc04de000}, + {0xc04e0000}, {0xc04e2000}, {0xc04e4000}, {0xc04e6000}, + {0xc04e8000}, {0xc04ea000}, {0xc04ec000}, {0xc04ee000}, + {0xc04f0000}, {0xc04f2000}, {0xc04f4000}, {0xc04f6000}, + {0xc04f8000}, {0xc04fa000}, {0xc04fc000}, {0xc04fe000}, + {0xc0500000}, {0xc0502000}, {0xc0504000}, {0xc0506000}, + {0xc0508000}, {0xc050a000}, {0xc050c000}, {0xc050e000}, + {0xc0510000}, {0xc0512000}, {0xc0514000}, {0xc0516000}, + {0xc0518000}, {0xc051a000}, {0xc051c000}, {0xc051e000}, + {0xc0520000}, {0xc0522000}, {0xc0524000}, {0xc0526000}, + {0xc0528000}, {0xc052a000}, {0xc052c000}, {0xc052e000}, + {0xc0530000}, {0xc0532000}, {0xc0534000}, {0xc0536000}, + {0xc0538000}, {0xc053a000}, {0xc053c000}, {0xc053e000}, + {0xc0540000}, {0xc0542000}, {0xc0544000}, {0xc0546000}, + {0xc0548000}, {0xc054a000}, {0xc054c000}, {0xc054e000}, + {0xc0550000}, {0xc0552000}, {0xc0554000}, {0xc0556000}, + {0xc0558000}, {0xc055a000}, {0xc055c000}, {0xc055e000}, + {0xc0560000}, {0xc0562000}, {0xc0564000}, {0xc0566000}, + {0xc0568000}, {0xc056a000}, {0xc056c000}, {0xc056e000}, + {0xc0570000}, {0xc0572000}, {0xc0574000}, {0xc0576000}, + {0xc0578000}, {0xc057a000}, {0xc057c000}, {0xc057e000}, + {0xc0580000}, {0xc0582000}, {0xc0584000}, {0xc0586000}, + {0xc0588000}, {0xc058a000}, {0xc058c000}, {0xc058e000}, + {0xc0590000}, {0xc0592000}, {0xc0594000}, {0xc0596000}, + {0xc0598000}, {0xc059a000}, {0xc059c000}, {0xc059e000}, + {0xc05a0000}, {0xc05a2000}, {0xc05a4000}, {0xc05a6000}, + {0xc05a8000}, {0xc05aa000}, {0xc05ac000}, {0xc05ae000}, + {0xc05b0000}, {0xc05b2000}, {0xc05b4000}, {0xc05b6000}, + {0xc05b8000}, {0xc05ba000}, {0xc05bc000}, {0xc05be000}, + {0xc05c0000}, {0xc05c2000}, {0xc05c4000}, {0xc05c6000}, + {0xc05c8000}, {0xc05ca000}, {0xc05cc000}, {0xc05ce000}, + {0xc05d0000}, {0xc05d2000}, {0xc05d4000}, {0xc05d6000}, + {0xc05d8000}, {0xc05da000}, {0xc05dc000}, {0xc05de000}, + {0xc05e0000}, {0xc05e2000}, {0xc05e4000}, {0xc05e6000}, + {0xc05e8000}, {0xc05ea000}, {0xc05ec000}, {0xc05ee000}, + {0xc05f0000}, {0xc05f2000}, {0xc05f4000}, {0xc05f6000}, + {0xc05f8000}, {0xc05fa000}, {0xc05fc000}, {0xc05fe000}, + {0xc0600000}, {0xc0602000}, {0xc0604000}, {0xc0606000}, + {0xc0608000}, {0xc060a000}, {0xc060c000}, {0xc060e000}, + {0xc0610000}, {0xc0612000}, {0xc0614000}, {0xc0616000}, + {0xc0618000}, {0xc061a000}, {0xc061c000}, {0xc061e000}, + {0xc0620000}, {0xc0622000}, {0xc0624000}, {0xc0626000}, + {0xc0628000}, {0xc062a000}, {0xc062c000}, {0xc062e000}, + {0xc0630000}, {0xc0632000}, {0xc0634000}, {0xc0636000}, + {0xc0638000}, {0xc063a000}, {0xc063c000}, {0xc063e000}, + {0xc0640000}, {0xc0642000}, {0xc0644000}, {0xc0646000}, + {0xc0648000}, {0xc064a000}, {0xc064c000}, {0xc064e000}, + {0xc0650000}, {0xc0652000}, {0xc0654000}, {0xc0656000}, + {0xc0658000}, {0xc065a000}, {0xc065c000}, {0xc065e000}, + {0xc0660000}, {0xc0662000}, {0xc0664000}, {0xc0666000}, + {0xc0668000}, {0xc066a000}, {0xc066c000}, {0xc066e000}, + {0xc0670000}, {0xc0672000}, {0xc0674000}, {0xc0676000}, + {0xc0678000}, {0xc067a000}, {0xc067c000}, {0xc067e000}, + {0xc0680000}, {0xc0682000}, {0xc0684000}, {0xc0686000}, + {0xc0688000}, {0xc068a000}, {0xc068c000}, {0xc068e000}, + {0xc0690000}, {0xc0692000}, {0xc0694000}, {0xc0696000}, + {0xc0698000}, {0xc069a000}, {0xc069c000}, {0xc069e000}, + {0xc06a0000}, {0xc06a2000}, {0xc06a4000}, {0xc06a6000}, + {0xc06a8000}, {0xc06aa000}, {0xc06ac000}, {0xc06ae000}, + {0xc06b0000}, {0xc06b2000}, {0xc06b4000}, {0xc06b6000}, + {0xc06b8000}, {0xc06ba000}, {0xc06bc000}, {0xc06be000}, + {0xc06c0000}, {0xc06c2000}, {0xc06c4000}, {0xc06c6000}, + {0xc06c8000}, {0xc06ca000}, {0xc06cc000}, {0xc06ce000}, + {0xc06d0000}, {0xc06d2000}, {0xc06d4000}, {0xc06d6000}, + {0xc06d8000}, {0xc06da000}, {0xc06dc000}, {0xc06de000}, + {0xc06e0000}, {0xc06e2000}, {0xc06e4000}, {0xc06e6000}, + {0xc06e8000}, {0xc06ea000}, {0xc06ec000}, {0xc06ee000}, + {0xc06f0000}, {0xc06f2000}, {0xc06f4000}, {0xc06f6000}, + {0xc06f8000}, {0xc06fa000}, {0xc06fc000}, {0xc06fe000}, + {0xc0700000}, {0xc0702000}, {0xc0704000}, {0xc0706000}, + {0xc0708000}, {0xc070a000}, {0xc070c000}, {0xc070e000}, + {0xc0710000}, {0xc0712000}, {0xc0714000}, {0xc0716000}, + {0xc0718000}, {0xc071a000}, {0xc071c000}, {0xc071e000}, + {0xc0720000}, {0xc0722000}, {0xc0724000}, {0xc0726000}, + {0xc0728000}, {0xc072a000}, {0xc072c000}, {0xc072e000}, + {0xc0730000}, {0xc0732000}, {0xc0734000}, {0xc0736000}, + {0xc0738000}, {0xc073a000}, {0xc073c000}, {0xc073e000}, + {0xc0740000}, {0xc0742000}, {0xc0744000}, {0xc0746000}, + {0xc0748000}, {0xc074a000}, {0xc074c000}, {0xc074e000}, + {0xc0750000}, {0xc0752000}, {0xc0754000}, {0xc0756000}, + {0xc0758000}, {0xc075a000}, {0xc075c000}, {0xc075e000}, + {0xc0760000}, {0xc0762000}, {0xc0764000}, {0xc0766000}, + {0xc0768000}, {0xc076a000}, {0xc076c000}, {0xc076e000}, + {0xc0770000}, {0xc0772000}, {0xc0774000}, {0xc0776000}, + {0xc0778000}, {0xc077a000}, {0xc077c000}, {0xc077e000}, + {0xc0780000}, {0xc0782000}, {0xc0784000}, {0xc0786000}, + {0xc0788000}, {0xc078a000}, {0xc078c000}, {0xc078e000}, + {0xc0790000}, {0xc0792000}, {0xc0794000}, {0xc0796000}, + {0xc0798000}, {0xc079a000}, {0xc079c000}, {0xc079e000}, + {0xc07a0000}, {0xc07a2000}, {0xc07a4000}, {0xc07a6000}, + {0xc07a8000}, {0xc07aa000}, {0xc07ac000}, {0xc07ae000}, + {0xc07b0000}, {0xc07b2000}, {0xc07b4000}, {0xc07b6000}, + {0xc07b8000}, {0xc07ba000}, {0xc07bc000}, {0xc07be000}, + {0xc07c0000}, {0xc07c2000}, {0xc07c4000}, {0xc07c6000}, + {0xc07c8000}, {0xc07ca000}, {0xc07cc000}, {0xc07ce000}, + {0xc07d0000}, {0xc07d2000}, {0xc07d4000}, {0xc07d6000}, + {0xc07d8000}, {0xc07da000}, {0xc07dc000}, {0xc07de000}, + {0xc07e0000}, {0xc07e2000}, {0xc07e4000}, {0xc07e6000}, + {0xc07e8000}, {0xc07ea000}, {0xc07ec000}, {0xc07ee000}, + {0xc07f0000}, {0xc07f2000}, {0xc07f4000}, {0xc07f6000}, + {0xc07f8000}, {0xc07fa000}, {0xc07fc000}, {0xc07fe000}, + {0xc0800000}, {0xc0802000}, {0xc0804000}, {0xc0806000}, + {0xc0808000}, {0xc080a000}, {0xc080c000}, {0xc080e000}, + {0xc0810000}, {0xc0812000}, {0xc0814000}, {0xc0816000}, + {0xc0818000}, {0xc081a000}, {0xc081c000}, {0xc081e000}, + {0xc0820000}, {0xc0822000}, {0xc0824000}, {0xc0826000}, + {0xc0828000}, {0xc082a000}, {0xc082c000}, {0xc082e000}, + {0xc0830000}, {0xc0832000}, {0xc0834000}, {0xc0836000}, + {0xc0838000}, {0xc083a000}, {0xc083c000}, {0xc083e000}, + {0xc0840000}, {0xc0842000}, {0xc0844000}, {0xc0846000}, + {0xc0848000}, {0xc084a000}, {0xc084c000}, {0xc084e000}, + {0xc0850000}, {0xc0852000}, {0xc0854000}, {0xc0856000}, + {0xc0858000}, {0xc085a000}, {0xc085c000}, {0xc085e000}, + {0xc0860000}, {0xc0862000}, {0xc0864000}, {0xc0866000}, + {0xc0868000}, {0xc086a000}, {0xc086c000}, {0xc086e000}, + {0xc0870000}, {0xc0872000}, {0xc0874000}, {0xc0876000}, + {0xc0878000}, {0xc087a000}, {0xc087c000}, {0xc087e000}, + {0xc0880000}, {0xc0882000}, {0xc0884000}, {0xc0886000}, + {0xc0888000}, {0xc088a000}, {0xc088c000}, {0xc088e000}, + {0xc0890000}, {0xc0892000}, {0xc0894000}, {0xc0896000}, + {0xc0898000}, {0xc089a000}, {0xc089c000}, {0xc089e000}, + {0xc08a0000}, {0xc08a2000}, {0xc08a4000}, {0xc08a6000}, + {0xc08a8000}, {0xc08aa000}, {0xc08ac000}, {0xc08ae000}, + {0xc08b0000}, {0xc08b2000}, {0xc08b4000}, {0xc08b6000}, + {0xc08b8000}, {0xc08ba000}, {0xc08bc000}, {0xc08be000}, + {0xc08c0000}, {0xc08c2000}, {0xc08c4000}, {0xc08c6000}, + {0xc08c8000}, {0xc08ca000}, {0xc08cc000}, {0xc08ce000}, + {0xc08d0000}, {0xc08d2000}, {0xc08d4000}, {0xc08d6000}, + {0xc08d8000}, {0xc08da000}, {0xc08dc000}, {0xc08de000}, + {0xc08e0000}, {0xc08e2000}, {0xc08e4000}, {0xc08e6000}, + {0xc08e8000}, {0xc08ea000}, {0xc08ec000}, {0xc08ee000}, + {0xc08f0000}, {0xc08f2000}, {0xc08f4000}, {0xc08f6000}, + {0xc08f8000}, {0xc08fa000}, {0xc08fc000}, {0xc08fe000}, + {0xc0900000}, {0xc0902000}, {0xc0904000}, {0xc0906000}, + {0xc0908000}, {0xc090a000}, {0xc090c000}, {0xc090e000}, + {0xc0910000}, {0xc0912000}, {0xc0914000}, {0xc0916000}, + {0xc0918000}, {0xc091a000}, {0xc091c000}, {0xc091e000}, + {0xc0920000}, {0xc0922000}, {0xc0924000}, {0xc0926000}, + {0xc0928000}, {0xc092a000}, {0xc092c000}, {0xc092e000}, + {0xc0930000}, {0xc0932000}, {0xc0934000}, {0xc0936000}, + {0xc0938000}, {0xc093a000}, {0xc093c000}, {0xc093e000}, + {0xc0940000}, {0xc0942000}, {0xc0944000}, {0xc0946000}, + {0xc0948000}, {0xc094a000}, {0xc094c000}, {0xc094e000}, + {0xc0950000}, {0xc0952000}, {0xc0954000}, {0xc0956000}, + {0xc0958000}, {0xc095a000}, {0xc095c000}, {0xc095e000}, + {0xc0960000}, {0xc0962000}, {0xc0964000}, {0xc0966000}, + {0xc0968000}, {0xc096a000}, {0xc096c000}, {0xc096e000}, + {0xc0970000}, {0xc0972000}, {0xc0974000}, {0xc0976000}, + {0xc0978000}, {0xc097a000}, {0xc097c000}, {0xc097e000}, + {0xc0980000}, {0xc0982000}, {0xc0984000}, {0xc0986000}, + {0xc0988000}, {0xc098a000}, {0xc098c000}, {0xc098e000}, + {0xc0990000}, {0xc0992000}, {0xc0994000}, {0xc0996000}, + {0xc0998000}, {0xc099a000}, {0xc099c000}, {0xc099e000}, + {0xc09a0000}, {0xc09a2000}, {0xc09a4000}, {0xc09a6000}, + {0xc09a8000}, {0xc09aa000}, {0xc09ac000}, {0xc09ae000}, + {0xc09b0000}, {0xc09b2000}, {0xc09b4000}, {0xc09b6000}, + {0xc09b8000}, {0xc09ba000}, {0xc09bc000}, {0xc09be000}, + {0xc09c0000}, {0xc09c2000}, {0xc09c4000}, {0xc09c6000}, + {0xc09c8000}, {0xc09ca000}, {0xc09cc000}, {0xc09ce000}, + {0xc09d0000}, {0xc09d2000}, {0xc09d4000}, {0xc09d6000}, + {0xc09d8000}, {0xc09da000}, {0xc09dc000}, {0xc09de000}, + {0xc09e0000}, {0xc09e2000}, {0xc09e4000}, {0xc09e6000}, + {0xc09e8000}, {0xc09ea000}, {0xc09ec000}, {0xc09ee000}, + {0xc09f0000}, {0xc09f2000}, {0xc09f4000}, {0xc09f6000}, + {0xc09f8000}, {0xc09fa000}, {0xc09fc000}, {0xc09fe000}, + {0xc0a00000}, {0xc0a02000}, {0xc0a04000}, {0xc0a06000}, + {0xc0a08000}, {0xc0a0a000}, {0xc0a0c000}, {0xc0a0e000}, + {0xc0a10000}, {0xc0a12000}, {0xc0a14000}, {0xc0a16000}, + {0xc0a18000}, {0xc0a1a000}, {0xc0a1c000}, {0xc0a1e000}, + {0xc0a20000}, {0xc0a22000}, {0xc0a24000}, {0xc0a26000}, + {0xc0a28000}, {0xc0a2a000}, {0xc0a2c000}, {0xc0a2e000}, + {0xc0a30000}, {0xc0a32000}, {0xc0a34000}, {0xc0a36000}, + {0xc0a38000}, {0xc0a3a000}, {0xc0a3c000}, {0xc0a3e000}, + {0xc0a40000}, {0xc0a42000}, {0xc0a44000}, {0xc0a46000}, + {0xc0a48000}, {0xc0a4a000}, {0xc0a4c000}, {0xc0a4e000}, + {0xc0a50000}, {0xc0a52000}, {0xc0a54000}, {0xc0a56000}, + {0xc0a58000}, {0xc0a5a000}, {0xc0a5c000}, {0xc0a5e000}, + {0xc0a60000}, {0xc0a62000}, {0xc0a64000}, {0xc0a66000}, + {0xc0a68000}, {0xc0a6a000}, {0xc0a6c000}, {0xc0a6e000}, + {0xc0a70000}, {0xc0a72000}, {0xc0a74000}, {0xc0a76000}, + {0xc0a78000}, {0xc0a7a000}, {0xc0a7c000}, {0xc0a7e000}, + {0xc0a80000}, {0xc0a82000}, {0xc0a84000}, {0xc0a86000}, + {0xc0a88000}, {0xc0a8a000}, {0xc0a8c000}, {0xc0a8e000}, + {0xc0a90000}, {0xc0a92000}, {0xc0a94000}, {0xc0a96000}, + {0xc0a98000}, {0xc0a9a000}, {0xc0a9c000}, {0xc0a9e000}, + {0xc0aa0000}, {0xc0aa2000}, {0xc0aa4000}, {0xc0aa6000}, + {0xc0aa8000}, {0xc0aaa000}, {0xc0aac000}, {0xc0aae000}, + {0xc0ab0000}, {0xc0ab2000}, {0xc0ab4000}, {0xc0ab6000}, + {0xc0ab8000}, {0xc0aba000}, {0xc0abc000}, {0xc0abe000}, + {0xc0ac0000}, {0xc0ac2000}, {0xc0ac4000}, {0xc0ac6000}, + {0xc0ac8000}, {0xc0aca000}, {0xc0acc000}, {0xc0ace000}, + {0xc0ad0000}, {0xc0ad2000}, {0xc0ad4000}, {0xc0ad6000}, + {0xc0ad8000}, {0xc0ada000}, {0xc0adc000}, {0xc0ade000}, + {0xc0ae0000}, {0xc0ae2000}, {0xc0ae4000}, {0xc0ae6000}, + {0xc0ae8000}, {0xc0aea000}, {0xc0aec000}, {0xc0aee000}, + {0xc0af0000}, {0xc0af2000}, {0xc0af4000}, {0xc0af6000}, + {0xc0af8000}, {0xc0afa000}, {0xc0afc000}, {0xc0afe000}, + {0xc0b00000}, {0xc0b02000}, {0xc0b04000}, {0xc0b06000}, + {0xc0b08000}, {0xc0b0a000}, {0xc0b0c000}, {0xc0b0e000}, + {0xc0b10000}, {0xc0b12000}, {0xc0b14000}, {0xc0b16000}, + {0xc0b18000}, {0xc0b1a000}, {0xc0b1c000}, {0xc0b1e000}, + {0xc0b20000}, {0xc0b22000}, {0xc0b24000}, {0xc0b26000}, + {0xc0b28000}, {0xc0b2a000}, {0xc0b2c000}, {0xc0b2e000}, + {0xc0b30000}, {0xc0b32000}, {0xc0b34000}, {0xc0b36000}, + {0xc0b38000}, {0xc0b3a000}, {0xc0b3c000}, {0xc0b3e000}, + {0xc0b40000}, {0xc0b42000}, {0xc0b44000}, {0xc0b46000}, + {0xc0b48000}, {0xc0b4a000}, {0xc0b4c000}, {0xc0b4e000}, + {0xc0b50000}, {0xc0b52000}, {0xc0b54000}, {0xc0b56000}, + {0xc0b58000}, {0xc0b5a000}, {0xc0b5c000}, {0xc0b5e000}, + {0xc0b60000}, {0xc0b62000}, {0xc0b64000}, {0xc0b66000}, + {0xc0b68000}, {0xc0b6a000}, {0xc0b6c000}, {0xc0b6e000}, + {0xc0b70000}, {0xc0b72000}, {0xc0b74000}, {0xc0b76000}, + {0xc0b78000}, {0xc0b7a000}, {0xc0b7c000}, {0xc0b7e000}, + {0xc0b80000}, {0xc0b82000}, {0xc0b84000}, {0xc0b86000}, + {0xc0b88000}, {0xc0b8a000}, {0xc0b8c000}, {0xc0b8e000}, + {0xc0b90000}, {0xc0b92000}, {0xc0b94000}, {0xc0b96000}, + {0xc0b98000}, {0xc0b9a000}, {0xc0b9c000}, {0xc0b9e000}, + {0xc0ba0000}, {0xc0ba2000}, {0xc0ba4000}, {0xc0ba6000}, + {0xc0ba8000}, {0xc0baa000}, {0xc0bac000}, {0xc0bae000}, + {0xc0bb0000}, {0xc0bb2000}, {0xc0bb4000}, {0xc0bb6000}, + {0xc0bb8000}, {0xc0bba000}, {0xc0bbc000}, {0xc0bbe000}, + {0xc0bc0000}, {0xc0bc2000}, {0xc0bc4000}, {0xc0bc6000}, + {0xc0bc8000}, {0xc0bca000}, {0xc0bcc000}, {0xc0bce000}, + {0xc0bd0000}, {0xc0bd2000}, {0xc0bd4000}, {0xc0bd6000}, + {0xc0bd8000}, {0xc0bda000}, {0xc0bdc000}, {0xc0bde000}, + {0xc0be0000}, {0xc0be2000}, {0xc0be4000}, {0xc0be6000}, + {0xc0be8000}, {0xc0bea000}, {0xc0bec000}, {0xc0bee000}, + {0xc0bf0000}, {0xc0bf2000}, {0xc0bf4000}, {0xc0bf6000}, + {0xc0bf8000}, {0xc0bfa000}, {0xc0bfc000}, {0xc0bfe000}, + {0xc0c00000}, {0xc0c02000}, {0xc0c04000}, {0xc0c06000}, + {0xc0c08000}, {0xc0c0a000}, {0xc0c0c000}, {0xc0c0e000}, + {0xc0c10000}, {0xc0c12000}, {0xc0c14000}, {0xc0c16000}, + {0xc0c18000}, {0xc0c1a000}, {0xc0c1c000}, {0xc0c1e000}, + {0xc0c20000}, {0xc0c22000}, {0xc0c24000}, {0xc0c26000}, + {0xc0c28000}, {0xc0c2a000}, {0xc0c2c000}, {0xc0c2e000}, + {0xc0c30000}, {0xc0c32000}, {0xc0c34000}, {0xc0c36000}, + {0xc0c38000}, {0xc0c3a000}, {0xc0c3c000}, {0xc0c3e000}, + {0xc0c40000}, {0xc0c42000}, {0xc0c44000}, {0xc0c46000}, + {0xc0c48000}, {0xc0c4a000}, {0xc0c4c000}, {0xc0c4e000}, + {0xc0c50000}, {0xc0c52000}, {0xc0c54000}, {0xc0c56000}, + {0xc0c58000}, {0xc0c5a000}, {0xc0c5c000}, {0xc0c5e000}, + {0xc0c60000}, {0xc0c62000}, {0xc0c64000}, {0xc0c66000}, + {0xc0c68000}, {0xc0c6a000}, {0xc0c6c000}, {0xc0c6e000}, + {0xc0c70000}, {0xc0c72000}, {0xc0c74000}, {0xc0c76000}, + {0xc0c78000}, {0xc0c7a000}, {0xc0c7c000}, {0xc0c7e000}, + {0xc0c80000}, {0xc0c82000}, {0xc0c84000}, {0xc0c86000}, + {0xc0c88000}, {0xc0c8a000}, {0xc0c8c000}, {0xc0c8e000}, + {0xc0c90000}, {0xc0c92000}, {0xc0c94000}, {0xc0c96000}, + {0xc0c98000}, {0xc0c9a000}, {0xc0c9c000}, {0xc0c9e000}, + {0xc0ca0000}, {0xc0ca2000}, {0xc0ca4000}, {0xc0ca6000}, + {0xc0ca8000}, {0xc0caa000}, {0xc0cac000}, {0xc0cae000}, + {0xc0cb0000}, {0xc0cb2000}, {0xc0cb4000}, {0xc0cb6000}, + {0xc0cb8000}, {0xc0cba000}, {0xc0cbc000}, {0xc0cbe000}, + {0xc0cc0000}, {0xc0cc2000}, {0xc0cc4000}, {0xc0cc6000}, + {0xc0cc8000}, {0xc0cca000}, {0xc0ccc000}, {0xc0cce000}, + {0xc0cd0000}, {0xc0cd2000}, {0xc0cd4000}, {0xc0cd6000}, + {0xc0cd8000}, {0xc0cda000}, {0xc0cdc000}, {0xc0cde000}, + {0xc0ce0000}, {0xc0ce2000}, {0xc0ce4000}, {0xc0ce6000}, + {0xc0ce8000}, {0xc0cea000}, {0xc0cec000}, {0xc0cee000}, + {0xc0cf0000}, {0xc0cf2000}, {0xc0cf4000}, {0xc0cf6000}, + {0xc0cf8000}, {0xc0cfa000}, {0xc0cfc000}, {0xc0cfe000}, + {0xc0d00000}, {0xc0d02000}, {0xc0d04000}, {0xc0d06000}, + {0xc0d08000}, {0xc0d0a000}, {0xc0d0c000}, {0xc0d0e000}, + {0xc0d10000}, {0xc0d12000}, {0xc0d14000}, {0xc0d16000}, + {0xc0d18000}, {0xc0d1a000}, {0xc0d1c000}, {0xc0d1e000}, + {0xc0d20000}, {0xc0d22000}, {0xc0d24000}, {0xc0d26000}, + {0xc0d28000}, {0xc0d2a000}, {0xc0d2c000}, {0xc0d2e000}, + {0xc0d30000}, {0xc0d32000}, {0xc0d34000}, {0xc0d36000}, + {0xc0d38000}, {0xc0d3a000}, {0xc0d3c000}, {0xc0d3e000}, + {0xc0d40000}, {0xc0d42000}, {0xc0d44000}, {0xc0d46000}, + {0xc0d48000}, {0xc0d4a000}, {0xc0d4c000}, {0xc0d4e000}, + {0xc0d50000}, {0xc0d52000}, {0xc0d54000}, {0xc0d56000}, + {0xc0d58000}, {0xc0d5a000}, {0xc0d5c000}, {0xc0d5e000}, + {0xc0d60000}, {0xc0d62000}, {0xc0d64000}, {0xc0d66000}, + {0xc0d68000}, {0xc0d6a000}, {0xc0d6c000}, {0xc0d6e000}, + {0xc0d70000}, {0xc0d72000}, {0xc0d74000}, {0xc0d76000}, + {0xc0d78000}, {0xc0d7a000}, {0xc0d7c000}, {0xc0d7e000}, + {0xc0d80000}, {0xc0d82000}, {0xc0d84000}, {0xc0d86000}, + {0xc0d88000}, {0xc0d8a000}, {0xc0d8c000}, {0xc0d8e000}, + {0xc0d90000}, {0xc0d92000}, {0xc0d94000}, {0xc0d96000}, + {0xc0d98000}, {0xc0d9a000}, {0xc0d9c000}, {0xc0d9e000}, + {0xc0da0000}, {0xc0da2000}, {0xc0da4000}, {0xc0da6000}, + {0xc0da8000}, {0xc0daa000}, {0xc0dac000}, {0xc0dae000}, + {0xc0db0000}, {0xc0db2000}, {0xc0db4000}, {0xc0db6000}, + {0xc0db8000}, {0xc0dba000}, {0xc0dbc000}, {0xc0dbe000}, + {0xc0dc0000}, {0xc0dc2000}, {0xc0dc4000}, {0xc0dc6000}, + {0xc0dc8000}, {0xc0dca000}, {0xc0dcc000}, {0xc0dce000}, + {0xc0dd0000}, {0xc0dd2000}, {0xc0dd4000}, {0xc0dd6000}, + {0xc0dd8000}, {0xc0dda000}, {0xc0ddc000}, {0xc0dde000}, + {0xc0de0000}, {0xc0de2000}, {0xc0de4000}, {0xc0de6000}, + {0xc0de8000}, {0xc0dea000}, {0xc0dec000}, {0xc0dee000}, + {0xc0df0000}, {0xc0df2000}, {0xc0df4000}, {0xc0df6000}, + {0xc0df8000}, {0xc0dfa000}, {0xc0dfc000}, {0xc0dfe000}, + {0xc0e00000}, {0xc0e02000}, {0xc0e04000}, {0xc0e06000}, + {0xc0e08000}, {0xc0e0a000}, {0xc0e0c000}, {0xc0e0e000}, + {0xc0e10000}, {0xc0e12000}, {0xc0e14000}, {0xc0e16000}, + {0xc0e18000}, {0xc0e1a000}, {0xc0e1c000}, {0xc0e1e000}, + {0xc0e20000}, {0xc0e22000}, {0xc0e24000}, {0xc0e26000}, + {0xc0e28000}, {0xc0e2a000}, {0xc0e2c000}, {0xc0e2e000}, + {0xc0e30000}, {0xc0e32000}, {0xc0e34000}, {0xc0e36000}, + {0xc0e38000}, {0xc0e3a000}, {0xc0e3c000}, {0xc0e3e000}, + {0xc0e40000}, {0xc0e42000}, {0xc0e44000}, {0xc0e46000}, + {0xc0e48000}, {0xc0e4a000}, {0xc0e4c000}, {0xc0e4e000}, + {0xc0e50000}, {0xc0e52000}, {0xc0e54000}, {0xc0e56000}, + {0xc0e58000}, {0xc0e5a000}, {0xc0e5c000}, {0xc0e5e000}, + {0xc0e60000}, {0xc0e62000}, {0xc0e64000}, {0xc0e66000}, + {0xc0e68000}, {0xc0e6a000}, {0xc0e6c000}, {0xc0e6e000}, + {0xc0e70000}, {0xc0e72000}, {0xc0e74000}, {0xc0e76000}, + {0xc0e78000}, {0xc0e7a000}, {0xc0e7c000}, {0xc0e7e000}, + {0xc0e80000}, {0xc0e82000}, {0xc0e84000}, {0xc0e86000}, + {0xc0e88000}, {0xc0e8a000}, {0xc0e8c000}, {0xc0e8e000}, + {0xc0e90000}, {0xc0e92000}, {0xc0e94000}, {0xc0e96000}, + {0xc0e98000}, {0xc0e9a000}, {0xc0e9c000}, {0xc0e9e000}, + {0xc0ea0000}, {0xc0ea2000}, {0xc0ea4000}, {0xc0ea6000}, + {0xc0ea8000}, {0xc0eaa000}, {0xc0eac000}, {0xc0eae000}, + {0xc0eb0000}, {0xc0eb2000}, {0xc0eb4000}, {0xc0eb6000}, + {0xc0eb8000}, {0xc0eba000}, {0xc0ebc000}, {0xc0ebe000}, + {0xc0ec0000}, {0xc0ec2000}, {0xc0ec4000}, {0xc0ec6000}, + {0xc0ec8000}, {0xc0eca000}, {0xc0ecc000}, {0xc0ece000}, + {0xc0ed0000}, {0xc0ed2000}, {0xc0ed4000}, {0xc0ed6000}, + {0xc0ed8000}, {0xc0eda000}, {0xc0edc000}, {0xc0ede000}, + {0xc0ee0000}, {0xc0ee2000}, {0xc0ee4000}, {0xc0ee6000}, + {0xc0ee8000}, {0xc0eea000}, {0xc0eec000}, {0xc0eee000}, + {0xc0ef0000}, {0xc0ef2000}, {0xc0ef4000}, {0xc0ef6000}, + {0xc0ef8000}, {0xc0efa000}, {0xc0efc000}, {0xc0efe000}, + {0xc0f00000}, {0xc0f02000}, {0xc0f04000}, {0xc0f06000}, + {0xc0f08000}, {0xc0f0a000}, {0xc0f0c000}, {0xc0f0e000}, + {0xc0f10000}, {0xc0f12000}, {0xc0f14000}, {0xc0f16000}, + {0xc0f18000}, {0xc0f1a000}, {0xc0f1c000}, {0xc0f1e000}, + {0xc0f20000}, {0xc0f22000}, {0xc0f24000}, {0xc0f26000}, + {0xc0f28000}, {0xc0f2a000}, {0xc0f2c000}, {0xc0f2e000}, + {0xc0f30000}, {0xc0f32000}, {0xc0f34000}, {0xc0f36000}, + {0xc0f38000}, {0xc0f3a000}, {0xc0f3c000}, {0xc0f3e000}, + {0xc0f40000}, {0xc0f42000}, {0xc0f44000}, {0xc0f46000}, + {0xc0f48000}, {0xc0f4a000}, {0xc0f4c000}, {0xc0f4e000}, + {0xc0f50000}, {0xc0f52000}, {0xc0f54000}, {0xc0f56000}, + {0xc0f58000}, {0xc0f5a000}, {0xc0f5c000}, {0xc0f5e000}, + {0xc0f60000}, {0xc0f62000}, {0xc0f64000}, {0xc0f66000}, + {0xc0f68000}, {0xc0f6a000}, {0xc0f6c000}, {0xc0f6e000}, + {0xc0f70000}, {0xc0f72000}, {0xc0f74000}, {0xc0f76000}, + {0xc0f78000}, {0xc0f7a000}, {0xc0f7c000}, {0xc0f7e000}, + {0xc0f80000}, {0xc0f82000}, {0xc0f84000}, {0xc0f86000}, + {0xc0f88000}, {0xc0f8a000}, {0xc0f8c000}, {0xc0f8e000}, + {0xc0f90000}, {0xc0f92000}, {0xc0f94000}, {0xc0f96000}, + {0xc0f98000}, {0xc0f9a000}, {0xc0f9c000}, {0xc0f9e000}, + {0xc0fa0000}, {0xc0fa2000}, {0xc0fa4000}, {0xc0fa6000}, + {0xc0fa8000}, {0xc0faa000}, {0xc0fac000}, {0xc0fae000}, + {0xc0fb0000}, {0xc0fb2000}, {0xc0fb4000}, {0xc0fb6000}, + {0xc0fb8000}, {0xc0fba000}, {0xc0fbc000}, {0xc0fbe000}, + {0xc0fc0000}, {0xc0fc2000}, {0xc0fc4000}, {0xc0fc6000}, + {0xc0fc8000}, {0xc0fca000}, {0xc0fcc000}, {0xc0fce000}, + {0xc0fd0000}, {0xc0fd2000}, {0xc0fd4000}, {0xc0fd6000}, + {0xc0fd8000}, {0xc0fda000}, {0xc0fdc000}, {0xc0fde000}, + {0xc0fe0000}, {0xc0fe2000}, {0xc0fe4000}, {0xc0fe6000}, + {0xc0fe8000}, {0xc0fea000}, {0xc0fec000}, {0xc0fee000}, + {0xc0ff0000}, {0xc0ff2000}, {0xc0ff4000}, {0xc0ff6000}, + {0xc0ff8000}, {0xc0ffa000}, {0xc0ffc000}, {0xc0ffe000}, + {0xc1000000}, {0xc1002000}, {0xc1004000}, {0xc1006000}, + {0xc1008000}, {0xc100a000}, {0xc100c000}, {0xc100e000}, + {0xc1010000}, {0xc1012000}, {0xc1014000}, {0xc1016000}, + {0xc1018000}, {0xc101a000}, {0xc101c000}, {0xc101e000}, + {0xc1020000}, {0xc1022000}, {0xc1024000}, {0xc1026000}, + {0xc1028000}, {0xc102a000}, {0xc102c000}, {0xc102e000}, + {0xc1030000}, {0xc1032000}, {0xc1034000}, {0xc1036000}, + {0xc1038000}, {0xc103a000}, {0xc103c000}, {0xc103e000}, + {0xc1040000}, {0xc1042000}, {0xc1044000}, {0xc1046000}, + {0xc1048000}, {0xc104a000}, {0xc104c000}, {0xc104e000}, + {0xc1050000}, {0xc1052000}, {0xc1054000}, {0xc1056000}, + {0xc1058000}, {0xc105a000}, {0xc105c000}, {0xc105e000}, + {0xc1060000}, {0xc1062000}, {0xc1064000}, {0xc1066000}, + {0xc1068000}, {0xc106a000}, {0xc106c000}, {0xc106e000}, + {0xc1070000}, {0xc1072000}, {0xc1074000}, {0xc1076000}, + {0xc1078000}, {0xc107a000}, {0xc107c000}, {0xc107e000}, + {0xc1080000}, {0xc1082000}, {0xc1084000}, {0xc1086000}, + {0xc1088000}, {0xc108a000}, {0xc108c000}, {0xc108e000}, + {0xc1090000}, {0xc1092000}, {0xc1094000}, {0xc1096000}, + {0xc1098000}, {0xc109a000}, {0xc109c000}, {0xc109e000}, + {0xc10a0000}, {0xc10a2000}, {0xc10a4000}, {0xc10a6000}, + {0xc10a8000}, {0xc10aa000}, {0xc10ac000}, {0xc10ae000}, + {0xc10b0000}, {0xc10b2000}, {0xc10b4000}, {0xc10b6000}, + {0xc10b8000}, {0xc10ba000}, {0xc10bc000}, {0xc10be000}, + {0xc10c0000}, {0xc10c2000}, {0xc10c4000}, {0xc10c6000}, + {0xc10c8000}, {0xc10ca000}, {0xc10cc000}, {0xc10ce000}, + {0xc10d0000}, {0xc10d2000}, {0xc10d4000}, {0xc10d6000}, + {0xc10d8000}, {0xc10da000}, {0xc10dc000}, {0xc10de000}, + {0xc10e0000}, {0xc10e2000}, {0xc10e4000}, {0xc10e6000}, + {0xc10e8000}, {0xc10ea000}, {0xc10ec000}, {0xc10ee000}, + {0xc10f0000}, {0xc10f2000}, {0xc10f4000}, {0xc10f6000}, + {0xc10f8000}, {0xc10fa000}, {0xc10fc000}, {0xc10fe000}, + {0xc1100000}, {0xc1102000}, {0xc1104000}, {0xc1106000}, + {0xc1108000}, {0xc110a000}, {0xc110c000}, {0xc110e000}, + {0xc1110000}, {0xc1112000}, {0xc1114000}, {0xc1116000}, + {0xc1118000}, {0xc111a000}, {0xc111c000}, {0xc111e000}, + {0xc1120000}, {0xc1122000}, {0xc1124000}, {0xc1126000}, + {0xc1128000}, {0xc112a000}, {0xc112c000}, {0xc112e000}, + {0xc1130000}, {0xc1132000}, {0xc1134000}, {0xc1136000}, + {0xc1138000}, {0xc113a000}, {0xc113c000}, {0xc113e000}, + {0xc1140000}, {0xc1142000}, {0xc1144000}, {0xc1146000}, + {0xc1148000}, {0xc114a000}, {0xc114c000}, {0xc114e000}, + {0xc1150000}, {0xc1152000}, {0xc1154000}, {0xc1156000}, + {0xc1158000}, {0xc115a000}, {0xc115c000}, {0xc115e000}, + {0xc1160000}, {0xc1162000}, {0xc1164000}, {0xc1166000}, + {0xc1168000}, {0xc116a000}, {0xc116c000}, {0xc116e000}, + {0xc1170000}, {0xc1172000}, {0xc1174000}, {0xc1176000}, + {0xc1178000}, {0xc117a000}, {0xc117c000}, {0xc117e000}, + {0xc1180000}, {0xc1182000}, {0xc1184000}, {0xc1186000}, + {0xc1188000}, {0xc118a000}, {0xc118c000}, {0xc118e000}, + {0xc1190000}, {0xc1192000}, {0xc1194000}, {0xc1196000}, + {0xc1198000}, {0xc119a000}, {0xc119c000}, {0xc119e000}, + {0xc11a0000}, {0xc11a2000}, {0xc11a4000}, {0xc11a6000}, + {0xc11a8000}, {0xc11aa000}, {0xc11ac000}, {0xc11ae000}, + {0xc11b0000}, {0xc11b2000}, {0xc11b4000}, {0xc11b6000}, + {0xc11b8000}, {0xc11ba000}, {0xc11bc000}, {0xc11be000}, + {0xc11c0000}, {0xc11c2000}, {0xc11c4000}, {0xc11c6000}, + {0xc11c8000}, {0xc11ca000}, {0xc11cc000}, {0xc11ce000}, + {0xc11d0000}, {0xc11d2000}, {0xc11d4000}, {0xc11d6000}, + {0xc11d8000}, {0xc11da000}, {0xc11dc000}, {0xc11de000}, + {0xc11e0000}, {0xc11e2000}, {0xc11e4000}, {0xc11e6000}, + {0xc11e8000}, {0xc11ea000}, {0xc11ec000}, {0xc11ee000}, + {0xc11f0000}, {0xc11f2000}, {0xc11f4000}, {0xc11f6000}, + {0xc11f8000}, {0xc11fa000}, {0xc11fc000}, {0xc11fe000}, + {0xc1200000}, {0xc1202000}, {0xc1204000}, {0xc1206000}, + {0xc1208000}, {0xc120a000}, {0xc120c000}, {0xc120e000}, + {0xc1210000}, {0xc1212000}, {0xc1214000}, {0xc1216000}, + {0xc1218000}, {0xc121a000}, {0xc121c000}, {0xc121e000}, + {0xc1220000}, {0xc1222000}, {0xc1224000}, {0xc1226000}, + {0xc1228000}, {0xc122a000}, {0xc122c000}, {0xc122e000}, + {0xc1230000}, {0xc1232000}, {0xc1234000}, {0xc1236000}, + {0xc1238000}, {0xc123a000}, {0xc123c000}, {0xc123e000}, + {0xc1240000}, {0xc1242000}, {0xc1244000}, {0xc1246000}, + {0xc1248000}, {0xc124a000}, {0xc124c000}, {0xc124e000}, + {0xc1250000}, {0xc1252000}, {0xc1254000}, {0xc1256000}, + {0xc1258000}, {0xc125a000}, {0xc125c000}, {0xc125e000}, + {0xc1260000}, {0xc1262000}, {0xc1264000}, {0xc1266000}, + {0xc1268000}, {0xc126a000}, {0xc126c000}, {0xc126e000}, + {0xc1270000}, {0xc1272000}, {0xc1274000}, {0xc1276000}, + {0xc1278000}, {0xc127a000}, {0xc127c000}, {0xc127e000}, + {0xc1280000}, {0xc1282000}, {0xc1284000}, {0xc1286000}, + {0xc1288000}, {0xc128a000}, {0xc128c000}, {0xc128e000}, + {0xc1290000}, {0xc1292000}, {0xc1294000}, {0xc1296000}, + {0xc1298000}, {0xc129a000}, {0xc129c000}, {0xc129e000}, + {0xc12a0000}, {0xc12a2000}, {0xc12a4000}, {0xc12a6000}, + {0xc12a8000}, {0xc12aa000}, {0xc12ac000}, {0xc12ae000}, + {0xc12b0000}, {0xc12b2000}, {0xc12b4000}, {0xc12b6000}, + {0xc12b8000}, {0xc12ba000}, {0xc12bc000}, {0xc12be000}, + {0xc12c0000}, {0xc12c2000}, {0xc12c4000}, {0xc12c6000}, + {0xc12c8000}, {0xc12ca000}, {0xc12cc000}, {0xc12ce000}, + {0xc12d0000}, {0xc12d2000}, {0xc12d4000}, {0xc12d6000}, + {0xc12d8000}, {0xc12da000}, {0xc12dc000}, {0xc12de000}, + {0xc12e0000}, {0xc12e2000}, {0xc12e4000}, {0xc12e6000}, + {0xc12e8000}, {0xc12ea000}, {0xc12ec000}, {0xc12ee000}, + {0xc12f0000}, {0xc12f2000}, {0xc12f4000}, {0xc12f6000}, + {0xc12f8000}, {0xc12fa000}, {0xc12fc000}, {0xc12fe000}, + {0xc1300000}, {0xc1302000}, {0xc1304000}, {0xc1306000}, + {0xc1308000}, {0xc130a000}, {0xc130c000}, {0xc130e000}, + {0xc1310000}, {0xc1312000}, {0xc1314000}, {0xc1316000}, + {0xc1318000}, {0xc131a000}, {0xc131c000}, {0xc131e000}, + {0xc1320000}, {0xc1322000}, {0xc1324000}, {0xc1326000}, + {0xc1328000}, {0xc132a000}, {0xc132c000}, {0xc132e000}, + {0xc1330000}, {0xc1332000}, {0xc1334000}, {0xc1336000}, + {0xc1338000}, {0xc133a000}, {0xc133c000}, {0xc133e000}, + {0xc1340000}, {0xc1342000}, {0xc1344000}, {0xc1346000}, + {0xc1348000}, {0xc134a000}, {0xc134c000}, {0xc134e000}, + {0xc1350000}, {0xc1352000}, {0xc1354000}, {0xc1356000}, + {0xc1358000}, {0xc135a000}, {0xc135c000}, {0xc135e000}, + {0xc1360000}, {0xc1362000}, {0xc1364000}, {0xc1366000}, + {0xc1368000}, {0xc136a000}, {0xc136c000}, {0xc136e000}, + {0xc1370000}, {0xc1372000}, {0xc1374000}, {0xc1376000}, + {0xc1378000}, {0xc137a000}, {0xc137c000}, {0xc137e000}, + {0xc1380000}, {0xc1382000}, {0xc1384000}, {0xc1386000}, + {0xc1388000}, {0xc138a000}, {0xc138c000}, {0xc138e000}, + {0xc1390000}, {0xc1392000}, {0xc1394000}, {0xc1396000}, + {0xc1398000}, {0xc139a000}, {0xc139c000}, {0xc139e000}, + {0xc13a0000}, {0xc13a2000}, {0xc13a4000}, {0xc13a6000}, + {0xc13a8000}, {0xc13aa000}, {0xc13ac000}, {0xc13ae000}, + {0xc13b0000}, {0xc13b2000}, {0xc13b4000}, {0xc13b6000}, + {0xc13b8000}, {0xc13ba000}, {0xc13bc000}, {0xc13be000}, + {0xc13c0000}, {0xc13c2000}, {0xc13c4000}, {0xc13c6000}, + {0xc13c8000}, {0xc13ca000}, {0xc13cc000}, {0xc13ce000}, + {0xc13d0000}, {0xc13d2000}, {0xc13d4000}, {0xc13d6000}, + {0xc13d8000}, {0xc13da000}, {0xc13dc000}, {0xc13de000}, + {0xc13e0000}, {0xc13e2000}, {0xc13e4000}, {0xc13e6000}, + {0xc13e8000}, {0xc13ea000}, {0xc13ec000}, {0xc13ee000}, + {0xc13f0000}, {0xc13f2000}, {0xc13f4000}, {0xc13f6000}, + {0xc13f8000}, {0xc13fa000}, {0xc13fc000}, {0xc13fe000}, + {0xc1400000}, {0xc1402000}, {0xc1404000}, {0xc1406000}, + {0xc1408000}, {0xc140a000}, {0xc140c000}, {0xc140e000}, + {0xc1410000}, {0xc1412000}, {0xc1414000}, {0xc1416000}, + {0xc1418000}, {0xc141a000}, {0xc141c000}, {0xc141e000}, + {0xc1420000}, {0xc1422000}, {0xc1424000}, {0xc1426000}, + {0xc1428000}, {0xc142a000}, {0xc142c000}, {0xc142e000}, + {0xc1430000}, {0xc1432000}, {0xc1434000}, {0xc1436000}, + {0xc1438000}, {0xc143a000}, {0xc143c000}, {0xc143e000}, + {0xc1440000}, {0xc1442000}, {0xc1444000}, {0xc1446000}, + {0xc1448000}, {0xc144a000}, {0xc144c000}, {0xc144e000}, + {0xc1450000}, {0xc1452000}, {0xc1454000}, {0xc1456000}, + {0xc1458000}, {0xc145a000}, {0xc145c000}, {0xc145e000}, + {0xc1460000}, {0xc1462000}, {0xc1464000}, {0xc1466000}, + {0xc1468000}, {0xc146a000}, {0xc146c000}, {0xc146e000}, + {0xc1470000}, {0xc1472000}, {0xc1474000}, {0xc1476000}, + {0xc1478000}, {0xc147a000}, {0xc147c000}, {0xc147e000}, + {0xc1480000}, {0xc1482000}, {0xc1484000}, {0xc1486000}, + {0xc1488000}, {0xc148a000}, {0xc148c000}, {0xc148e000}, + {0xc1490000}, {0xc1492000}, {0xc1494000}, {0xc1496000}, + {0xc1498000}, {0xc149a000}, {0xc149c000}, {0xc149e000}, + {0xc14a0000}, {0xc14a2000}, {0xc14a4000}, {0xc14a6000}, + {0xc14a8000}, {0xc14aa000}, {0xc14ac000}, {0xc14ae000}, + {0xc14b0000}, {0xc14b2000}, {0xc14b4000}, {0xc14b6000}, + {0xc14b8000}, {0xc14ba000}, {0xc14bc000}, {0xc14be000}, + {0xc14c0000}, {0xc14c2000}, {0xc14c4000}, {0xc14c6000}, + {0xc14c8000}, {0xc14ca000}, {0xc14cc000}, {0xc14ce000}, + {0xc14d0000}, {0xc14d2000}, {0xc14d4000}, {0xc14d6000}, + {0xc14d8000}, {0xc14da000}, {0xc14dc000}, {0xc14de000}, + {0xc14e0000}, {0xc14e2000}, {0xc14e4000}, {0xc14e6000}, + {0xc14e8000}, {0xc14ea000}, {0xc14ec000}, {0xc14ee000}, + {0xc14f0000}, {0xc14f2000}, {0xc14f4000}, {0xc14f6000}, + {0xc14f8000}, {0xc14fa000}, {0xc14fc000}, {0xc14fe000}, + {0xc1500000}, {0xc1502000}, {0xc1504000}, {0xc1506000}, + {0xc1508000}, {0xc150a000}, {0xc150c000}, {0xc150e000}, + {0xc1510000}, {0xc1512000}, {0xc1514000}, {0xc1516000}, + {0xc1518000}, {0xc151a000}, {0xc151c000}, {0xc151e000}, + {0xc1520000}, {0xc1522000}, {0xc1524000}, {0xc1526000}, + {0xc1528000}, {0xc152a000}, {0xc152c000}, {0xc152e000}, + {0xc1530000}, {0xc1532000}, {0xc1534000}, {0xc1536000}, + {0xc1538000}, {0xc153a000}, {0xc153c000}, {0xc153e000}, + {0xc1540000}, {0xc1542000}, {0xc1544000}, {0xc1546000}, + {0xc1548000}, {0xc154a000}, {0xc154c000}, {0xc154e000}, + {0xc1550000}, {0xc1552000}, {0xc1554000}, {0xc1556000}, + {0xc1558000}, {0xc155a000}, {0xc155c000}, {0xc155e000}, + {0xc1560000}, {0xc1562000}, {0xc1564000}, {0xc1566000}, + {0xc1568000}, {0xc156a000}, {0xc156c000}, {0xc156e000}, + {0xc1570000}, {0xc1572000}, {0xc1574000}, {0xc1576000}, + {0xc1578000}, {0xc157a000}, {0xc157c000}, {0xc157e000}, + {0xc1580000}, {0xc1582000}, {0xc1584000}, {0xc1586000}, + {0xc1588000}, {0xc158a000}, {0xc158c000}, {0xc158e000}, + {0xc1590000}, {0xc1592000}, {0xc1594000}, {0xc1596000}, + {0xc1598000}, {0xc159a000}, {0xc159c000}, {0xc159e000}, + {0xc15a0000}, {0xc15a2000}, {0xc15a4000}, {0xc15a6000}, + {0xc15a8000}, {0xc15aa000}, {0xc15ac000}, {0xc15ae000}, + {0xc15b0000}, {0xc15b2000}, {0xc15b4000}, {0xc15b6000}, + {0xc15b8000}, {0xc15ba000}, {0xc15bc000}, {0xc15be000}, + {0xc15c0000}, {0xc15c2000}, {0xc15c4000}, {0xc15c6000}, + {0xc15c8000}, {0xc15ca000}, {0xc15cc000}, {0xc15ce000}, + {0xc15d0000}, {0xc15d2000}, {0xc15d4000}, {0xc15d6000}, + {0xc15d8000}, {0xc15da000}, {0xc15dc000}, {0xc15de000}, + {0xc15e0000}, {0xc15e2000}, {0xc15e4000}, {0xc15e6000}, + {0xc15e8000}, {0xc15ea000}, {0xc15ec000}, {0xc15ee000}, + {0xc15f0000}, {0xc15f2000}, {0xc15f4000}, {0xc15f6000}, + {0xc15f8000}, {0xc15fa000}, {0xc15fc000}, {0xc15fe000}, + {0xc1600000}, {0xc1602000}, {0xc1604000}, {0xc1606000}, + {0xc1608000}, {0xc160a000}, {0xc160c000}, {0xc160e000}, + {0xc1610000}, {0xc1612000}, {0xc1614000}, {0xc1616000}, + {0xc1618000}, {0xc161a000}, {0xc161c000}, {0xc161e000}, + {0xc1620000}, {0xc1622000}, {0xc1624000}, {0xc1626000}, + {0xc1628000}, {0xc162a000}, {0xc162c000}, {0xc162e000}, + {0xc1630000}, {0xc1632000}, {0xc1634000}, {0xc1636000}, + {0xc1638000}, {0xc163a000}, {0xc163c000}, {0xc163e000}, + {0xc1640000}, {0xc1642000}, {0xc1644000}, {0xc1646000}, + {0xc1648000}, {0xc164a000}, {0xc164c000}, {0xc164e000}, + {0xc1650000}, {0xc1652000}, {0xc1654000}, {0xc1656000}, + {0xc1658000}, {0xc165a000}, {0xc165c000}, {0xc165e000}, + {0xc1660000}, {0xc1662000}, {0xc1664000}, {0xc1666000}, + {0xc1668000}, {0xc166a000}, {0xc166c000}, {0xc166e000}, + {0xc1670000}, {0xc1672000}, {0xc1674000}, {0xc1676000}, + {0xc1678000}, {0xc167a000}, {0xc167c000}, {0xc167e000}, + {0xc1680000}, {0xc1682000}, {0xc1684000}, {0xc1686000}, + {0xc1688000}, {0xc168a000}, {0xc168c000}, {0xc168e000}, + {0xc1690000}, {0xc1692000}, {0xc1694000}, {0xc1696000}, + {0xc1698000}, {0xc169a000}, {0xc169c000}, {0xc169e000}, + {0xc16a0000}, {0xc16a2000}, {0xc16a4000}, {0xc16a6000}, + {0xc16a8000}, {0xc16aa000}, {0xc16ac000}, {0xc16ae000}, + {0xc16b0000}, {0xc16b2000}, {0xc16b4000}, {0xc16b6000}, + {0xc16b8000}, {0xc16ba000}, {0xc16bc000}, {0xc16be000}, + {0xc16c0000}, {0xc16c2000}, {0xc16c4000}, {0xc16c6000}, + {0xc16c8000}, {0xc16ca000}, {0xc16cc000}, {0xc16ce000}, + {0xc16d0000}, {0xc16d2000}, {0xc16d4000}, {0xc16d6000}, + {0xc16d8000}, {0xc16da000}, {0xc16dc000}, {0xc16de000}, + {0xc16e0000}, {0xc16e2000}, {0xc16e4000}, {0xc16e6000}, + {0xc16e8000}, {0xc16ea000}, {0xc16ec000}, {0xc16ee000}, + {0xc16f0000}, {0xc16f2000}, {0xc16f4000}, {0xc16f6000}, + {0xc16f8000}, {0xc16fa000}, {0xc16fc000}, {0xc16fe000}, + {0xc1700000}, {0xc1702000}, {0xc1704000}, {0xc1706000}, + {0xc1708000}, {0xc170a000}, {0xc170c000}, {0xc170e000}, + {0xc1710000}, {0xc1712000}, {0xc1714000}, {0xc1716000}, + {0xc1718000}, {0xc171a000}, {0xc171c000}, {0xc171e000}, + {0xc1720000}, {0xc1722000}, {0xc1724000}, {0xc1726000}, + {0xc1728000}, {0xc172a000}, {0xc172c000}, {0xc172e000}, + {0xc1730000}, {0xc1732000}, {0xc1734000}, {0xc1736000}, + {0xc1738000}, {0xc173a000}, {0xc173c000}, {0xc173e000}, + {0xc1740000}, {0xc1742000}, {0xc1744000}, {0xc1746000}, + {0xc1748000}, {0xc174a000}, {0xc174c000}, {0xc174e000}, + {0xc1750000}, {0xc1752000}, {0xc1754000}, {0xc1756000}, + {0xc1758000}, {0xc175a000}, {0xc175c000}, {0xc175e000}, + {0xc1760000}, {0xc1762000}, {0xc1764000}, {0xc1766000}, + {0xc1768000}, {0xc176a000}, {0xc176c000}, {0xc176e000}, + {0xc1770000}, {0xc1772000}, {0xc1774000}, {0xc1776000}, + {0xc1778000}, {0xc177a000}, {0xc177c000}, {0xc177e000}, + {0xc1780000}, {0xc1782000}, {0xc1784000}, {0xc1786000}, + {0xc1788000}, {0xc178a000}, {0xc178c000}, {0xc178e000}, + {0xc1790000}, {0xc1792000}, {0xc1794000}, {0xc1796000}, + {0xc1798000}, {0xc179a000}, {0xc179c000}, {0xc179e000}, + {0xc17a0000}, {0xc17a2000}, {0xc17a4000}, {0xc17a6000}, + {0xc17a8000}, {0xc17aa000}, {0xc17ac000}, {0xc17ae000}, + {0xc17b0000}, {0xc17b2000}, {0xc17b4000}, {0xc17b6000}, + {0xc17b8000}, {0xc17ba000}, {0xc17bc000}, {0xc17be000}, + {0xc17c0000}, {0xc17c2000}, {0xc17c4000}, {0xc17c6000}, + {0xc17c8000}, {0xc17ca000}, {0xc17cc000}, {0xc17ce000}, + {0xc17d0000}, {0xc17d2000}, {0xc17d4000}, {0xc17d6000}, + {0xc17d8000}, {0xc17da000}, {0xc17dc000}, {0xc17de000}, + {0xc17e0000}, {0xc17e2000}, {0xc17e4000}, {0xc17e6000}, + {0xc17e8000}, {0xc17ea000}, {0xc17ec000}, {0xc17ee000}, + {0xc17f0000}, {0xc17f2000}, {0xc17f4000}, {0xc17f6000}, + {0xc17f8000}, {0xc17fa000}, {0xc17fc000}, {0xc17fe000}, + {0xc1800000}, {0xc1802000}, {0xc1804000}, {0xc1806000}, + {0xc1808000}, {0xc180a000}, {0xc180c000}, {0xc180e000}, + {0xc1810000}, {0xc1812000}, {0xc1814000}, {0xc1816000}, + {0xc1818000}, {0xc181a000}, {0xc181c000}, {0xc181e000}, + {0xc1820000}, {0xc1822000}, {0xc1824000}, {0xc1826000}, + {0xc1828000}, {0xc182a000}, {0xc182c000}, {0xc182e000}, + {0xc1830000}, {0xc1832000}, {0xc1834000}, {0xc1836000}, + {0xc1838000}, {0xc183a000}, {0xc183c000}, {0xc183e000}, + {0xc1840000}, {0xc1842000}, {0xc1844000}, {0xc1846000}, + {0xc1848000}, {0xc184a000}, {0xc184c000}, {0xc184e000}, + {0xc1850000}, {0xc1852000}, {0xc1854000}, {0xc1856000}, + {0xc1858000}, {0xc185a000}, {0xc185c000}, {0xc185e000}, + {0xc1860000}, {0xc1862000}, {0xc1864000}, {0xc1866000}, + {0xc1868000}, {0xc186a000}, {0xc186c000}, {0xc186e000}, + {0xc1870000}, {0xc1872000}, {0xc1874000}, {0xc1876000}, + {0xc1878000}, {0xc187a000}, {0xc187c000}, {0xc187e000}, + {0xc1880000}, {0xc1882000}, {0xc1884000}, {0xc1886000}, + {0xc1888000}, {0xc188a000}, {0xc188c000}, {0xc188e000}, + {0xc1890000}, {0xc1892000}, {0xc1894000}, {0xc1896000}, + {0xc1898000}, {0xc189a000}, {0xc189c000}, {0xc189e000}, + {0xc18a0000}, {0xc18a2000}, {0xc18a4000}, {0xc18a6000}, + {0xc18a8000}, {0xc18aa000}, {0xc18ac000}, {0xc18ae000}, + {0xc18b0000}, {0xc18b2000}, {0xc18b4000}, {0xc18b6000}, + {0xc18b8000}, {0xc18ba000}, {0xc18bc000}, {0xc18be000}, + {0xc18c0000}, {0xc18c2000}, {0xc18c4000}, {0xc18c6000}, + {0xc18c8000}, {0xc18ca000}, {0xc18cc000}, {0xc18ce000}, + {0xc18d0000}, {0xc18d2000}, {0xc18d4000}, {0xc18d6000}, + {0xc18d8000}, {0xc18da000}, {0xc18dc000}, {0xc18de000}, + {0xc18e0000}, {0xc18e2000}, {0xc18e4000}, {0xc18e6000}, + {0xc18e8000}, {0xc18ea000}, {0xc18ec000}, {0xc18ee000}, + {0xc18f0000}, {0xc18f2000}, {0xc18f4000}, {0xc18f6000}, + {0xc18f8000}, {0xc18fa000}, {0xc18fc000}, {0xc18fe000}, + {0xc1900000}, {0xc1902000}, {0xc1904000}, {0xc1906000}, + {0xc1908000}, {0xc190a000}, {0xc190c000}, {0xc190e000}, + {0xc1910000}, {0xc1912000}, {0xc1914000}, {0xc1916000}, + {0xc1918000}, {0xc191a000}, {0xc191c000}, {0xc191e000}, + {0xc1920000}, {0xc1922000}, {0xc1924000}, {0xc1926000}, + {0xc1928000}, {0xc192a000}, {0xc192c000}, {0xc192e000}, + {0xc1930000}, {0xc1932000}, {0xc1934000}, {0xc1936000}, + {0xc1938000}, {0xc193a000}, {0xc193c000}, {0xc193e000}, + {0xc1940000}, {0xc1942000}, {0xc1944000}, {0xc1946000}, + {0xc1948000}, {0xc194a000}, {0xc194c000}, {0xc194e000}, + {0xc1950000}, {0xc1952000}, {0xc1954000}, {0xc1956000}, + {0xc1958000}, {0xc195a000}, {0xc195c000}, {0xc195e000}, + {0xc1960000}, {0xc1962000}, {0xc1964000}, {0xc1966000}, + {0xc1968000}, {0xc196a000}, {0xc196c000}, {0xc196e000}, + {0xc1970000}, {0xc1972000}, {0xc1974000}, {0xc1976000}, + {0xc1978000}, {0xc197a000}, {0xc197c000}, {0xc197e000}, + {0xc1980000}, {0xc1982000}, {0xc1984000}, {0xc1986000}, + {0xc1988000}, {0xc198a000}, {0xc198c000}, {0xc198e000}, + {0xc1990000}, {0xc1992000}, {0xc1994000}, {0xc1996000}, + {0xc1998000}, {0xc199a000}, {0xc199c000}, {0xc199e000}, + {0xc19a0000}, {0xc19a2000}, {0xc19a4000}, {0xc19a6000}, + {0xc19a8000}, {0xc19aa000}, {0xc19ac000}, {0xc19ae000}, + {0xc19b0000}, {0xc19b2000}, {0xc19b4000}, {0xc19b6000}, + {0xc19b8000}, {0xc19ba000}, {0xc19bc000}, {0xc19be000}, + {0xc19c0000}, {0xc19c2000}, {0xc19c4000}, {0xc19c6000}, + {0xc19c8000}, {0xc19ca000}, {0xc19cc000}, {0xc19ce000}, + {0xc19d0000}, {0xc19d2000}, {0xc19d4000}, {0xc19d6000}, + {0xc19d8000}, {0xc19da000}, {0xc19dc000}, {0xc19de000}, + {0xc19e0000}, {0xc19e2000}, {0xc19e4000}, {0xc19e6000}, + {0xc19e8000}, {0xc19ea000}, {0xc19ec000}, {0xc19ee000}, + {0xc19f0000}, {0xc19f2000}, {0xc19f4000}, {0xc19f6000}, + {0xc19f8000}, {0xc19fa000}, {0xc19fc000}, {0xc19fe000}, + {0xc1a00000}, {0xc1a02000}, {0xc1a04000}, {0xc1a06000}, + {0xc1a08000}, {0xc1a0a000}, {0xc1a0c000}, {0xc1a0e000}, + {0xc1a10000}, {0xc1a12000}, {0xc1a14000}, {0xc1a16000}, + {0xc1a18000}, {0xc1a1a000}, {0xc1a1c000}, {0xc1a1e000}, + {0xc1a20000}, {0xc1a22000}, {0xc1a24000}, {0xc1a26000}, + {0xc1a28000}, {0xc1a2a000}, {0xc1a2c000}, {0xc1a2e000}, + {0xc1a30000}, {0xc1a32000}, {0xc1a34000}, {0xc1a36000}, + {0xc1a38000}, {0xc1a3a000}, {0xc1a3c000}, {0xc1a3e000}, + {0xc1a40000}, {0xc1a42000}, {0xc1a44000}, {0xc1a46000}, + {0xc1a48000}, {0xc1a4a000}, {0xc1a4c000}, {0xc1a4e000}, + {0xc1a50000}, {0xc1a52000}, {0xc1a54000}, {0xc1a56000}, + {0xc1a58000}, {0xc1a5a000}, {0xc1a5c000}, {0xc1a5e000}, + {0xc1a60000}, {0xc1a62000}, {0xc1a64000}, {0xc1a66000}, + {0xc1a68000}, {0xc1a6a000}, {0xc1a6c000}, {0xc1a6e000}, + {0xc1a70000}, {0xc1a72000}, {0xc1a74000}, {0xc1a76000}, + {0xc1a78000}, {0xc1a7a000}, {0xc1a7c000}, {0xc1a7e000}, + {0xc1a80000}, {0xc1a82000}, {0xc1a84000}, {0xc1a86000}, + {0xc1a88000}, {0xc1a8a000}, {0xc1a8c000}, {0xc1a8e000}, + {0xc1a90000}, {0xc1a92000}, {0xc1a94000}, {0xc1a96000}, + {0xc1a98000}, {0xc1a9a000}, {0xc1a9c000}, {0xc1a9e000}, + {0xc1aa0000}, {0xc1aa2000}, {0xc1aa4000}, {0xc1aa6000}, + {0xc1aa8000}, {0xc1aaa000}, {0xc1aac000}, {0xc1aae000}, + {0xc1ab0000}, {0xc1ab2000}, {0xc1ab4000}, {0xc1ab6000}, + {0xc1ab8000}, {0xc1aba000}, {0xc1abc000}, {0xc1abe000}, + {0xc1ac0000}, {0xc1ac2000}, {0xc1ac4000}, {0xc1ac6000}, + {0xc1ac8000}, {0xc1aca000}, {0xc1acc000}, {0xc1ace000}, + {0xc1ad0000}, {0xc1ad2000}, {0xc1ad4000}, {0xc1ad6000}, + {0xc1ad8000}, {0xc1ada000}, {0xc1adc000}, {0xc1ade000}, + {0xc1ae0000}, {0xc1ae2000}, {0xc1ae4000}, {0xc1ae6000}, + {0xc1ae8000}, {0xc1aea000}, {0xc1aec000}, {0xc1aee000}, + {0xc1af0000}, {0xc1af2000}, {0xc1af4000}, {0xc1af6000}, + {0xc1af8000}, {0xc1afa000}, {0xc1afc000}, {0xc1afe000}, + {0xc1b00000}, {0xc1b02000}, {0xc1b04000}, {0xc1b06000}, + {0xc1b08000}, {0xc1b0a000}, {0xc1b0c000}, {0xc1b0e000}, + {0xc1b10000}, {0xc1b12000}, {0xc1b14000}, {0xc1b16000}, + {0xc1b18000}, {0xc1b1a000}, {0xc1b1c000}, {0xc1b1e000}, + {0xc1b20000}, {0xc1b22000}, {0xc1b24000}, {0xc1b26000}, + {0xc1b28000}, {0xc1b2a000}, {0xc1b2c000}, {0xc1b2e000}, + {0xc1b30000}, {0xc1b32000}, {0xc1b34000}, {0xc1b36000}, + {0xc1b38000}, {0xc1b3a000}, {0xc1b3c000}, {0xc1b3e000}, + {0xc1b40000}, {0xc1b42000}, {0xc1b44000}, {0xc1b46000}, + {0xc1b48000}, {0xc1b4a000}, {0xc1b4c000}, {0xc1b4e000}, + {0xc1b50000}, {0xc1b52000}, {0xc1b54000}, {0xc1b56000}, + {0xc1b58000}, {0xc1b5a000}, {0xc1b5c000}, {0xc1b5e000}, + {0xc1b60000}, {0xc1b62000}, {0xc1b64000}, {0xc1b66000}, + {0xc1b68000}, {0xc1b6a000}, {0xc1b6c000}, {0xc1b6e000}, + {0xc1b70000}, {0xc1b72000}, {0xc1b74000}, {0xc1b76000}, + {0xc1b78000}, {0xc1b7a000}, {0xc1b7c000}, {0xc1b7e000}, + {0xc1b80000}, {0xc1b82000}, {0xc1b84000}, {0xc1b86000}, + {0xc1b88000}, {0xc1b8a000}, {0xc1b8c000}, {0xc1b8e000}, + {0xc1b90000}, {0xc1b92000}, {0xc1b94000}, {0xc1b96000}, + {0xc1b98000}, {0xc1b9a000}, {0xc1b9c000}, {0xc1b9e000}, + {0xc1ba0000}, {0xc1ba2000}, {0xc1ba4000}, {0xc1ba6000}, + {0xc1ba8000}, {0xc1baa000}, {0xc1bac000}, {0xc1bae000}, + {0xc1bb0000}, {0xc1bb2000}, {0xc1bb4000}, {0xc1bb6000}, + {0xc1bb8000}, {0xc1bba000}, {0xc1bbc000}, {0xc1bbe000}, + {0xc1bc0000}, {0xc1bc2000}, {0xc1bc4000}, {0xc1bc6000}, + {0xc1bc8000}, {0xc1bca000}, {0xc1bcc000}, {0xc1bce000}, + {0xc1bd0000}, {0xc1bd2000}, {0xc1bd4000}, {0xc1bd6000}, + {0xc1bd8000}, {0xc1bda000}, {0xc1bdc000}, {0xc1bde000}, + {0xc1be0000}, {0xc1be2000}, {0xc1be4000}, {0xc1be6000}, + {0xc1be8000}, {0xc1bea000}, {0xc1bec000}, {0xc1bee000}, + {0xc1bf0000}, {0xc1bf2000}, {0xc1bf4000}, {0xc1bf6000}, + {0xc1bf8000}, {0xc1bfa000}, {0xc1bfc000}, {0xc1bfe000}, + {0xc1c00000}, {0xc1c02000}, {0xc1c04000}, {0xc1c06000}, + {0xc1c08000}, {0xc1c0a000}, {0xc1c0c000}, {0xc1c0e000}, + {0xc1c10000}, {0xc1c12000}, {0xc1c14000}, {0xc1c16000}, + {0xc1c18000}, {0xc1c1a000}, {0xc1c1c000}, {0xc1c1e000}, + {0xc1c20000}, {0xc1c22000}, {0xc1c24000}, {0xc1c26000}, + {0xc1c28000}, {0xc1c2a000}, {0xc1c2c000}, {0xc1c2e000}, + {0xc1c30000}, {0xc1c32000}, {0xc1c34000}, {0xc1c36000}, + {0xc1c38000}, {0xc1c3a000}, {0xc1c3c000}, {0xc1c3e000}, + {0xc1c40000}, {0xc1c42000}, {0xc1c44000}, {0xc1c46000}, + {0xc1c48000}, {0xc1c4a000}, {0xc1c4c000}, {0xc1c4e000}, + {0xc1c50000}, {0xc1c52000}, {0xc1c54000}, {0xc1c56000}, + {0xc1c58000}, {0xc1c5a000}, {0xc1c5c000}, {0xc1c5e000}, + {0xc1c60000}, {0xc1c62000}, {0xc1c64000}, {0xc1c66000}, + {0xc1c68000}, {0xc1c6a000}, {0xc1c6c000}, {0xc1c6e000}, + {0xc1c70000}, {0xc1c72000}, {0xc1c74000}, {0xc1c76000}, + {0xc1c78000}, {0xc1c7a000}, {0xc1c7c000}, {0xc1c7e000}, + {0xc1c80000}, {0xc1c82000}, {0xc1c84000}, {0xc1c86000}, + {0xc1c88000}, {0xc1c8a000}, {0xc1c8c000}, {0xc1c8e000}, + {0xc1c90000}, {0xc1c92000}, {0xc1c94000}, {0xc1c96000}, + {0xc1c98000}, {0xc1c9a000}, {0xc1c9c000}, {0xc1c9e000}, + {0xc1ca0000}, {0xc1ca2000}, {0xc1ca4000}, {0xc1ca6000}, + {0xc1ca8000}, {0xc1caa000}, {0xc1cac000}, {0xc1cae000}, + {0xc1cb0000}, {0xc1cb2000}, {0xc1cb4000}, {0xc1cb6000}, + {0xc1cb8000}, {0xc1cba000}, {0xc1cbc000}, {0xc1cbe000}, + {0xc1cc0000}, {0xc1cc2000}, {0xc1cc4000}, {0xc1cc6000}, + {0xc1cc8000}, {0xc1cca000}, {0xc1ccc000}, {0xc1cce000}, + {0xc1cd0000}, {0xc1cd2000}, {0xc1cd4000}, {0xc1cd6000}, + {0xc1cd8000}, {0xc1cda000}, {0xc1cdc000}, {0xc1cde000}, + {0xc1ce0000}, {0xc1ce2000}, {0xc1ce4000}, {0xc1ce6000}, + {0xc1ce8000}, {0xc1cea000}, {0xc1cec000}, {0xc1cee000}, + {0xc1cf0000}, {0xc1cf2000}, {0xc1cf4000}, {0xc1cf6000}, + {0xc1cf8000}, {0xc1cfa000}, {0xc1cfc000}, {0xc1cfe000}, + {0xc1d00000}, {0xc1d02000}, {0xc1d04000}, {0xc1d06000}, + {0xc1d08000}, {0xc1d0a000}, {0xc1d0c000}, {0xc1d0e000}, + {0xc1d10000}, {0xc1d12000}, {0xc1d14000}, {0xc1d16000}, + {0xc1d18000}, {0xc1d1a000}, {0xc1d1c000}, {0xc1d1e000}, + {0xc1d20000}, {0xc1d22000}, {0xc1d24000}, {0xc1d26000}, + {0xc1d28000}, {0xc1d2a000}, {0xc1d2c000}, {0xc1d2e000}, + {0xc1d30000}, {0xc1d32000}, {0xc1d34000}, {0xc1d36000}, + {0xc1d38000}, {0xc1d3a000}, {0xc1d3c000}, {0xc1d3e000}, + {0xc1d40000}, {0xc1d42000}, {0xc1d44000}, {0xc1d46000}, + {0xc1d48000}, {0xc1d4a000}, {0xc1d4c000}, {0xc1d4e000}, + {0xc1d50000}, {0xc1d52000}, {0xc1d54000}, {0xc1d56000}, + {0xc1d58000}, {0xc1d5a000}, {0xc1d5c000}, {0xc1d5e000}, + {0xc1d60000}, {0xc1d62000}, {0xc1d64000}, {0xc1d66000}, + {0xc1d68000}, {0xc1d6a000}, {0xc1d6c000}, {0xc1d6e000}, + {0xc1d70000}, {0xc1d72000}, {0xc1d74000}, {0xc1d76000}, + {0xc1d78000}, {0xc1d7a000}, {0xc1d7c000}, {0xc1d7e000}, + {0xc1d80000}, {0xc1d82000}, {0xc1d84000}, {0xc1d86000}, + {0xc1d88000}, {0xc1d8a000}, {0xc1d8c000}, {0xc1d8e000}, + {0xc1d90000}, {0xc1d92000}, {0xc1d94000}, {0xc1d96000}, + {0xc1d98000}, {0xc1d9a000}, {0xc1d9c000}, {0xc1d9e000}, + {0xc1da0000}, {0xc1da2000}, {0xc1da4000}, {0xc1da6000}, + {0xc1da8000}, {0xc1daa000}, {0xc1dac000}, {0xc1dae000}, + {0xc1db0000}, {0xc1db2000}, {0xc1db4000}, {0xc1db6000}, + {0xc1db8000}, {0xc1dba000}, {0xc1dbc000}, {0xc1dbe000}, + {0xc1dc0000}, {0xc1dc2000}, {0xc1dc4000}, {0xc1dc6000}, + {0xc1dc8000}, {0xc1dca000}, {0xc1dcc000}, {0xc1dce000}, + {0xc1dd0000}, {0xc1dd2000}, {0xc1dd4000}, {0xc1dd6000}, + {0xc1dd8000}, {0xc1dda000}, {0xc1ddc000}, {0xc1dde000}, + {0xc1de0000}, {0xc1de2000}, {0xc1de4000}, {0xc1de6000}, + {0xc1de8000}, {0xc1dea000}, {0xc1dec000}, {0xc1dee000}, + {0xc1df0000}, {0xc1df2000}, {0xc1df4000}, {0xc1df6000}, + {0xc1df8000}, {0xc1dfa000}, {0xc1dfc000}, {0xc1dfe000}, + {0xc1e00000}, {0xc1e02000}, {0xc1e04000}, {0xc1e06000}, + {0xc1e08000}, {0xc1e0a000}, {0xc1e0c000}, {0xc1e0e000}, + {0xc1e10000}, {0xc1e12000}, {0xc1e14000}, {0xc1e16000}, + {0xc1e18000}, {0xc1e1a000}, {0xc1e1c000}, {0xc1e1e000}, + {0xc1e20000}, {0xc1e22000}, {0xc1e24000}, {0xc1e26000}, + {0xc1e28000}, {0xc1e2a000}, {0xc1e2c000}, {0xc1e2e000}, + {0xc1e30000}, {0xc1e32000}, {0xc1e34000}, {0xc1e36000}, + {0xc1e38000}, {0xc1e3a000}, {0xc1e3c000}, {0xc1e3e000}, + {0xc1e40000}, {0xc1e42000}, {0xc1e44000}, {0xc1e46000}, + {0xc1e48000}, {0xc1e4a000}, {0xc1e4c000}, {0xc1e4e000}, + {0xc1e50000}, {0xc1e52000}, {0xc1e54000}, {0xc1e56000}, + {0xc1e58000}, {0xc1e5a000}, {0xc1e5c000}, {0xc1e5e000}, + {0xc1e60000}, {0xc1e62000}, {0xc1e64000}, {0xc1e66000}, + {0xc1e68000}, {0xc1e6a000}, {0xc1e6c000}, {0xc1e6e000}, + {0xc1e70000}, {0xc1e72000}, {0xc1e74000}, {0xc1e76000}, + {0xc1e78000}, {0xc1e7a000}, {0xc1e7c000}, {0xc1e7e000}, + {0xc1e80000}, {0xc1e82000}, {0xc1e84000}, {0xc1e86000}, + {0xc1e88000}, {0xc1e8a000}, {0xc1e8c000}, {0xc1e8e000}, + {0xc1e90000}, {0xc1e92000}, {0xc1e94000}, {0xc1e96000}, + {0xc1e98000}, {0xc1e9a000}, {0xc1e9c000}, {0xc1e9e000}, + {0xc1ea0000}, {0xc1ea2000}, {0xc1ea4000}, {0xc1ea6000}, + {0xc1ea8000}, {0xc1eaa000}, {0xc1eac000}, {0xc1eae000}, + {0xc1eb0000}, {0xc1eb2000}, {0xc1eb4000}, {0xc1eb6000}, + {0xc1eb8000}, {0xc1eba000}, {0xc1ebc000}, {0xc1ebe000}, + {0xc1ec0000}, {0xc1ec2000}, {0xc1ec4000}, {0xc1ec6000}, + {0xc1ec8000}, {0xc1eca000}, {0xc1ecc000}, {0xc1ece000}, + {0xc1ed0000}, {0xc1ed2000}, {0xc1ed4000}, {0xc1ed6000}, + {0xc1ed8000}, {0xc1eda000}, {0xc1edc000}, {0xc1ede000}, + {0xc1ee0000}, {0xc1ee2000}, {0xc1ee4000}, {0xc1ee6000}, + {0xc1ee8000}, {0xc1eea000}, {0xc1eec000}, {0xc1eee000}, + {0xc1ef0000}, {0xc1ef2000}, {0xc1ef4000}, {0xc1ef6000}, + {0xc1ef8000}, {0xc1efa000}, {0xc1efc000}, {0xc1efe000}, + {0xc1f00000}, {0xc1f02000}, {0xc1f04000}, {0xc1f06000}, + {0xc1f08000}, {0xc1f0a000}, {0xc1f0c000}, {0xc1f0e000}, + {0xc1f10000}, {0xc1f12000}, {0xc1f14000}, {0xc1f16000}, + {0xc1f18000}, {0xc1f1a000}, {0xc1f1c000}, {0xc1f1e000}, + {0xc1f20000}, {0xc1f22000}, {0xc1f24000}, {0xc1f26000}, + {0xc1f28000}, {0xc1f2a000}, {0xc1f2c000}, {0xc1f2e000}, + {0xc1f30000}, {0xc1f32000}, {0xc1f34000}, {0xc1f36000}, + {0xc1f38000}, {0xc1f3a000}, {0xc1f3c000}, {0xc1f3e000}, + {0xc1f40000}, {0xc1f42000}, {0xc1f44000}, {0xc1f46000}, + {0xc1f48000}, {0xc1f4a000}, {0xc1f4c000}, {0xc1f4e000}, + {0xc1f50000}, {0xc1f52000}, {0xc1f54000}, {0xc1f56000}, + {0xc1f58000}, {0xc1f5a000}, {0xc1f5c000}, {0xc1f5e000}, + {0xc1f60000}, {0xc1f62000}, {0xc1f64000}, {0xc1f66000}, + {0xc1f68000}, {0xc1f6a000}, {0xc1f6c000}, {0xc1f6e000}, + {0xc1f70000}, {0xc1f72000}, {0xc1f74000}, {0xc1f76000}, + {0xc1f78000}, {0xc1f7a000}, {0xc1f7c000}, {0xc1f7e000}, + {0xc1f80000}, {0xc1f82000}, {0xc1f84000}, {0xc1f86000}, + {0xc1f88000}, {0xc1f8a000}, {0xc1f8c000}, {0xc1f8e000}, + {0xc1f90000}, {0xc1f92000}, {0xc1f94000}, {0xc1f96000}, + {0xc1f98000}, {0xc1f9a000}, {0xc1f9c000}, {0xc1f9e000}, + {0xc1fa0000}, {0xc1fa2000}, {0xc1fa4000}, {0xc1fa6000}, + {0xc1fa8000}, {0xc1faa000}, {0xc1fac000}, {0xc1fae000}, + {0xc1fb0000}, {0xc1fb2000}, {0xc1fb4000}, {0xc1fb6000}, + {0xc1fb8000}, {0xc1fba000}, {0xc1fbc000}, {0xc1fbe000}, + {0xc1fc0000}, {0xc1fc2000}, {0xc1fc4000}, {0xc1fc6000}, + {0xc1fc8000}, {0xc1fca000}, {0xc1fcc000}, {0xc1fce000}, + {0xc1fd0000}, {0xc1fd2000}, {0xc1fd4000}, {0xc1fd6000}, + {0xc1fd8000}, {0xc1fda000}, {0xc1fdc000}, {0xc1fde000}, + {0xc1fe0000}, {0xc1fe2000}, {0xc1fe4000}, {0xc1fe6000}, + {0xc1fe8000}, {0xc1fea000}, {0xc1fec000}, {0xc1fee000}, + {0xc1ff0000}, {0xc1ff2000}, {0xc1ff4000}, {0xc1ff6000}, + {0xc1ff8000}, {0xc1ffa000}, {0xc1ffc000}, {0xc1ffe000}, + {0xc2000000}, {0xc2002000}, {0xc2004000}, {0xc2006000}, + {0xc2008000}, {0xc200a000}, {0xc200c000}, {0xc200e000}, + {0xc2010000}, {0xc2012000}, {0xc2014000}, {0xc2016000}, + {0xc2018000}, {0xc201a000}, {0xc201c000}, {0xc201e000}, + {0xc2020000}, {0xc2022000}, {0xc2024000}, {0xc2026000}, + {0xc2028000}, {0xc202a000}, {0xc202c000}, {0xc202e000}, + {0xc2030000}, {0xc2032000}, {0xc2034000}, {0xc2036000}, + {0xc2038000}, {0xc203a000}, {0xc203c000}, {0xc203e000}, + {0xc2040000}, {0xc2042000}, {0xc2044000}, {0xc2046000}, + {0xc2048000}, {0xc204a000}, {0xc204c000}, {0xc204e000}, + {0xc2050000}, {0xc2052000}, {0xc2054000}, {0xc2056000}, + {0xc2058000}, {0xc205a000}, {0xc205c000}, {0xc205e000}, + {0xc2060000}, {0xc2062000}, {0xc2064000}, {0xc2066000}, + {0xc2068000}, {0xc206a000}, {0xc206c000}, {0xc206e000}, + {0xc2070000}, {0xc2072000}, {0xc2074000}, {0xc2076000}, + {0xc2078000}, {0xc207a000}, {0xc207c000}, {0xc207e000}, + {0xc2080000}, {0xc2082000}, {0xc2084000}, {0xc2086000}, + {0xc2088000}, {0xc208a000}, {0xc208c000}, {0xc208e000}, + {0xc2090000}, {0xc2092000}, {0xc2094000}, {0xc2096000}, + {0xc2098000}, {0xc209a000}, {0xc209c000}, {0xc209e000}, + {0xc20a0000}, {0xc20a2000}, {0xc20a4000}, {0xc20a6000}, + {0xc20a8000}, {0xc20aa000}, {0xc20ac000}, {0xc20ae000}, + {0xc20b0000}, {0xc20b2000}, {0xc20b4000}, {0xc20b6000}, + {0xc20b8000}, {0xc20ba000}, {0xc20bc000}, {0xc20be000}, + {0xc20c0000}, {0xc20c2000}, {0xc20c4000}, {0xc20c6000}, + {0xc20c8000}, {0xc20ca000}, {0xc20cc000}, {0xc20ce000}, + {0xc20d0000}, {0xc20d2000}, {0xc20d4000}, {0xc20d6000}, + {0xc20d8000}, {0xc20da000}, {0xc20dc000}, {0xc20de000}, + {0xc20e0000}, {0xc20e2000}, {0xc20e4000}, {0xc20e6000}, + {0xc20e8000}, {0xc20ea000}, {0xc20ec000}, {0xc20ee000}, + {0xc20f0000}, {0xc20f2000}, {0xc20f4000}, {0xc20f6000}, + {0xc20f8000}, {0xc20fa000}, {0xc20fc000}, {0xc20fe000}, + {0xc2100000}, {0xc2102000}, {0xc2104000}, {0xc2106000}, + {0xc2108000}, {0xc210a000}, {0xc210c000}, {0xc210e000}, + {0xc2110000}, {0xc2112000}, {0xc2114000}, {0xc2116000}, + {0xc2118000}, {0xc211a000}, {0xc211c000}, {0xc211e000}, + {0xc2120000}, {0xc2122000}, {0xc2124000}, {0xc2126000}, + {0xc2128000}, {0xc212a000}, {0xc212c000}, {0xc212e000}, + {0xc2130000}, {0xc2132000}, {0xc2134000}, {0xc2136000}, + {0xc2138000}, {0xc213a000}, {0xc213c000}, {0xc213e000}, + {0xc2140000}, {0xc2142000}, {0xc2144000}, {0xc2146000}, + {0xc2148000}, {0xc214a000}, {0xc214c000}, {0xc214e000}, + {0xc2150000}, {0xc2152000}, {0xc2154000}, {0xc2156000}, + {0xc2158000}, {0xc215a000}, {0xc215c000}, {0xc215e000}, + {0xc2160000}, {0xc2162000}, {0xc2164000}, {0xc2166000}, + {0xc2168000}, {0xc216a000}, {0xc216c000}, {0xc216e000}, + {0xc2170000}, {0xc2172000}, {0xc2174000}, {0xc2176000}, + {0xc2178000}, {0xc217a000}, {0xc217c000}, {0xc217e000}, + {0xc2180000}, {0xc2182000}, {0xc2184000}, {0xc2186000}, + {0xc2188000}, {0xc218a000}, {0xc218c000}, {0xc218e000}, + {0xc2190000}, {0xc2192000}, {0xc2194000}, {0xc2196000}, + {0xc2198000}, {0xc219a000}, {0xc219c000}, {0xc219e000}, + {0xc21a0000}, {0xc21a2000}, {0xc21a4000}, {0xc21a6000}, + {0xc21a8000}, {0xc21aa000}, {0xc21ac000}, {0xc21ae000}, + {0xc21b0000}, {0xc21b2000}, {0xc21b4000}, {0xc21b6000}, + {0xc21b8000}, {0xc21ba000}, {0xc21bc000}, {0xc21be000}, + {0xc21c0000}, {0xc21c2000}, {0xc21c4000}, {0xc21c6000}, + {0xc21c8000}, {0xc21ca000}, {0xc21cc000}, {0xc21ce000}, + {0xc21d0000}, {0xc21d2000}, {0xc21d4000}, {0xc21d6000}, + {0xc21d8000}, {0xc21da000}, {0xc21dc000}, {0xc21de000}, + {0xc21e0000}, {0xc21e2000}, {0xc21e4000}, {0xc21e6000}, + {0xc21e8000}, {0xc21ea000}, {0xc21ec000}, {0xc21ee000}, + {0xc21f0000}, {0xc21f2000}, {0xc21f4000}, {0xc21f6000}, + {0xc21f8000}, {0xc21fa000}, {0xc21fc000}, {0xc21fe000}, + {0xc2200000}, {0xc2202000}, {0xc2204000}, {0xc2206000}, + {0xc2208000}, {0xc220a000}, {0xc220c000}, {0xc220e000}, + {0xc2210000}, {0xc2212000}, {0xc2214000}, {0xc2216000}, + {0xc2218000}, {0xc221a000}, {0xc221c000}, {0xc221e000}, + {0xc2220000}, {0xc2222000}, {0xc2224000}, {0xc2226000}, + {0xc2228000}, {0xc222a000}, {0xc222c000}, {0xc222e000}, + {0xc2230000}, {0xc2232000}, {0xc2234000}, {0xc2236000}, + {0xc2238000}, {0xc223a000}, {0xc223c000}, {0xc223e000}, + {0xc2240000}, {0xc2242000}, {0xc2244000}, {0xc2246000}, + {0xc2248000}, {0xc224a000}, {0xc224c000}, {0xc224e000}, + {0xc2250000}, {0xc2252000}, {0xc2254000}, {0xc2256000}, + {0xc2258000}, {0xc225a000}, {0xc225c000}, {0xc225e000}, + {0xc2260000}, {0xc2262000}, {0xc2264000}, {0xc2266000}, + {0xc2268000}, {0xc226a000}, {0xc226c000}, {0xc226e000}, + {0xc2270000}, {0xc2272000}, {0xc2274000}, {0xc2276000}, + {0xc2278000}, {0xc227a000}, {0xc227c000}, {0xc227e000}, + {0xc2280000}, {0xc2282000}, {0xc2284000}, {0xc2286000}, + {0xc2288000}, {0xc228a000}, {0xc228c000}, {0xc228e000}, + {0xc2290000}, {0xc2292000}, {0xc2294000}, {0xc2296000}, + {0xc2298000}, {0xc229a000}, {0xc229c000}, {0xc229e000}, + {0xc22a0000}, {0xc22a2000}, {0xc22a4000}, {0xc22a6000}, + {0xc22a8000}, {0xc22aa000}, {0xc22ac000}, {0xc22ae000}, + {0xc22b0000}, {0xc22b2000}, {0xc22b4000}, {0xc22b6000}, + {0xc22b8000}, {0xc22ba000}, {0xc22bc000}, {0xc22be000}, + {0xc22c0000}, {0xc22c2000}, {0xc22c4000}, {0xc22c6000}, + {0xc22c8000}, {0xc22ca000}, {0xc22cc000}, {0xc22ce000}, + {0xc22d0000}, {0xc22d2000}, {0xc22d4000}, {0xc22d6000}, + {0xc22d8000}, {0xc22da000}, {0xc22dc000}, {0xc22de000}, + {0xc22e0000}, {0xc22e2000}, {0xc22e4000}, {0xc22e6000}, + {0xc22e8000}, {0xc22ea000}, {0xc22ec000}, {0xc22ee000}, + {0xc22f0000}, {0xc22f2000}, {0xc22f4000}, {0xc22f6000}, + {0xc22f8000}, {0xc22fa000}, {0xc22fc000}, {0xc22fe000}, + {0xc2300000}, {0xc2302000}, {0xc2304000}, {0xc2306000}, + {0xc2308000}, {0xc230a000}, {0xc230c000}, {0xc230e000}, + {0xc2310000}, {0xc2312000}, {0xc2314000}, {0xc2316000}, + {0xc2318000}, {0xc231a000}, {0xc231c000}, {0xc231e000}, + {0xc2320000}, {0xc2322000}, {0xc2324000}, {0xc2326000}, + {0xc2328000}, {0xc232a000}, {0xc232c000}, {0xc232e000}, + {0xc2330000}, {0xc2332000}, {0xc2334000}, {0xc2336000}, + {0xc2338000}, {0xc233a000}, {0xc233c000}, {0xc233e000}, + {0xc2340000}, {0xc2342000}, {0xc2344000}, {0xc2346000}, + {0xc2348000}, {0xc234a000}, {0xc234c000}, {0xc234e000}, + {0xc2350000}, {0xc2352000}, {0xc2354000}, {0xc2356000}, + {0xc2358000}, {0xc235a000}, {0xc235c000}, {0xc235e000}, + {0xc2360000}, {0xc2362000}, {0xc2364000}, {0xc2366000}, + {0xc2368000}, {0xc236a000}, {0xc236c000}, {0xc236e000}, + {0xc2370000}, {0xc2372000}, {0xc2374000}, {0xc2376000}, + {0xc2378000}, {0xc237a000}, {0xc237c000}, {0xc237e000}, + {0xc2380000}, {0xc2382000}, {0xc2384000}, {0xc2386000}, + {0xc2388000}, {0xc238a000}, {0xc238c000}, {0xc238e000}, + {0xc2390000}, {0xc2392000}, {0xc2394000}, {0xc2396000}, + {0xc2398000}, {0xc239a000}, {0xc239c000}, {0xc239e000}, + {0xc23a0000}, {0xc23a2000}, {0xc23a4000}, {0xc23a6000}, + {0xc23a8000}, {0xc23aa000}, {0xc23ac000}, {0xc23ae000}, + {0xc23b0000}, {0xc23b2000}, {0xc23b4000}, {0xc23b6000}, + {0xc23b8000}, {0xc23ba000}, {0xc23bc000}, {0xc23be000}, + {0xc23c0000}, {0xc23c2000}, {0xc23c4000}, {0xc23c6000}, + {0xc23c8000}, {0xc23ca000}, {0xc23cc000}, {0xc23ce000}, + {0xc23d0000}, {0xc23d2000}, {0xc23d4000}, {0xc23d6000}, + {0xc23d8000}, {0xc23da000}, {0xc23dc000}, {0xc23de000}, + {0xc23e0000}, {0xc23e2000}, {0xc23e4000}, {0xc23e6000}, + {0xc23e8000}, {0xc23ea000}, {0xc23ec000}, {0xc23ee000}, + {0xc23f0000}, {0xc23f2000}, {0xc23f4000}, {0xc23f6000}, + {0xc23f8000}, {0xc23fa000}, {0xc23fc000}, {0xc23fe000}, + {0xc2400000}, {0xc2402000}, {0xc2404000}, {0xc2406000}, + {0xc2408000}, {0xc240a000}, {0xc240c000}, {0xc240e000}, + {0xc2410000}, {0xc2412000}, {0xc2414000}, {0xc2416000}, + {0xc2418000}, {0xc241a000}, {0xc241c000}, {0xc241e000}, + {0xc2420000}, {0xc2422000}, {0xc2424000}, {0xc2426000}, + {0xc2428000}, {0xc242a000}, {0xc242c000}, {0xc242e000}, + {0xc2430000}, {0xc2432000}, {0xc2434000}, {0xc2436000}, + {0xc2438000}, {0xc243a000}, {0xc243c000}, {0xc243e000}, + {0xc2440000}, {0xc2442000}, {0xc2444000}, {0xc2446000}, + {0xc2448000}, {0xc244a000}, {0xc244c000}, {0xc244e000}, + {0xc2450000}, {0xc2452000}, {0xc2454000}, {0xc2456000}, + {0xc2458000}, {0xc245a000}, {0xc245c000}, {0xc245e000}, + {0xc2460000}, {0xc2462000}, {0xc2464000}, {0xc2466000}, + {0xc2468000}, {0xc246a000}, {0xc246c000}, {0xc246e000}, + {0xc2470000}, {0xc2472000}, {0xc2474000}, {0xc2476000}, + {0xc2478000}, {0xc247a000}, {0xc247c000}, {0xc247e000}, + {0xc2480000}, {0xc2482000}, {0xc2484000}, {0xc2486000}, + {0xc2488000}, {0xc248a000}, {0xc248c000}, {0xc248e000}, + {0xc2490000}, {0xc2492000}, {0xc2494000}, {0xc2496000}, + {0xc2498000}, {0xc249a000}, {0xc249c000}, {0xc249e000}, + {0xc24a0000}, {0xc24a2000}, {0xc24a4000}, {0xc24a6000}, + {0xc24a8000}, {0xc24aa000}, {0xc24ac000}, {0xc24ae000}, + {0xc24b0000}, {0xc24b2000}, {0xc24b4000}, {0xc24b6000}, + {0xc24b8000}, {0xc24ba000}, {0xc24bc000}, {0xc24be000}, + {0xc24c0000}, {0xc24c2000}, {0xc24c4000}, {0xc24c6000}, + {0xc24c8000}, {0xc24ca000}, {0xc24cc000}, {0xc24ce000}, + {0xc24d0000}, {0xc24d2000}, {0xc24d4000}, {0xc24d6000}, + {0xc24d8000}, {0xc24da000}, {0xc24dc000}, {0xc24de000}, + {0xc24e0000}, {0xc24e2000}, {0xc24e4000}, {0xc24e6000}, + {0xc24e8000}, {0xc24ea000}, {0xc24ec000}, {0xc24ee000}, + {0xc24f0000}, {0xc24f2000}, {0xc24f4000}, {0xc24f6000}, + {0xc24f8000}, {0xc24fa000}, {0xc24fc000}, {0xc24fe000}, + {0xc2500000}, {0xc2502000}, {0xc2504000}, {0xc2506000}, + {0xc2508000}, {0xc250a000}, {0xc250c000}, {0xc250e000}, + {0xc2510000}, {0xc2512000}, {0xc2514000}, {0xc2516000}, + {0xc2518000}, {0xc251a000}, {0xc251c000}, {0xc251e000}, + {0xc2520000}, {0xc2522000}, {0xc2524000}, {0xc2526000}, + {0xc2528000}, {0xc252a000}, {0xc252c000}, {0xc252e000}, + {0xc2530000}, {0xc2532000}, {0xc2534000}, {0xc2536000}, + {0xc2538000}, {0xc253a000}, {0xc253c000}, {0xc253e000}, + {0xc2540000}, {0xc2542000}, {0xc2544000}, {0xc2546000}, + {0xc2548000}, {0xc254a000}, {0xc254c000}, {0xc254e000}, + {0xc2550000}, {0xc2552000}, {0xc2554000}, {0xc2556000}, + {0xc2558000}, {0xc255a000}, {0xc255c000}, {0xc255e000}, + {0xc2560000}, {0xc2562000}, {0xc2564000}, {0xc2566000}, + {0xc2568000}, {0xc256a000}, {0xc256c000}, {0xc256e000}, + {0xc2570000}, {0xc2572000}, {0xc2574000}, {0xc2576000}, + {0xc2578000}, {0xc257a000}, {0xc257c000}, {0xc257e000}, + {0xc2580000}, {0xc2582000}, {0xc2584000}, {0xc2586000}, + {0xc2588000}, {0xc258a000}, {0xc258c000}, {0xc258e000}, + {0xc2590000}, {0xc2592000}, {0xc2594000}, {0xc2596000}, + {0xc2598000}, {0xc259a000}, {0xc259c000}, {0xc259e000}, + {0xc25a0000}, {0xc25a2000}, {0xc25a4000}, {0xc25a6000}, + {0xc25a8000}, {0xc25aa000}, {0xc25ac000}, {0xc25ae000}, + {0xc25b0000}, {0xc25b2000}, {0xc25b4000}, {0xc25b6000}, + {0xc25b8000}, {0xc25ba000}, {0xc25bc000}, {0xc25be000}, + {0xc25c0000}, {0xc25c2000}, {0xc25c4000}, {0xc25c6000}, + {0xc25c8000}, {0xc25ca000}, {0xc25cc000}, {0xc25ce000}, + {0xc25d0000}, {0xc25d2000}, {0xc25d4000}, {0xc25d6000}, + {0xc25d8000}, {0xc25da000}, {0xc25dc000}, {0xc25de000}, + {0xc25e0000}, {0xc25e2000}, {0xc25e4000}, {0xc25e6000}, + {0xc25e8000}, {0xc25ea000}, {0xc25ec000}, {0xc25ee000}, + {0xc25f0000}, {0xc25f2000}, {0xc25f4000}, {0xc25f6000}, + {0xc25f8000}, {0xc25fa000}, {0xc25fc000}, {0xc25fe000}, + {0xc2600000}, {0xc2602000}, {0xc2604000}, {0xc2606000}, + {0xc2608000}, {0xc260a000}, {0xc260c000}, {0xc260e000}, + {0xc2610000}, {0xc2612000}, {0xc2614000}, {0xc2616000}, + {0xc2618000}, {0xc261a000}, {0xc261c000}, {0xc261e000}, + {0xc2620000}, {0xc2622000}, {0xc2624000}, {0xc2626000}, + {0xc2628000}, {0xc262a000}, {0xc262c000}, {0xc262e000}, + {0xc2630000}, {0xc2632000}, {0xc2634000}, {0xc2636000}, + {0xc2638000}, {0xc263a000}, {0xc263c000}, {0xc263e000}, + {0xc2640000}, {0xc2642000}, {0xc2644000}, {0xc2646000}, + {0xc2648000}, {0xc264a000}, {0xc264c000}, {0xc264e000}, + {0xc2650000}, {0xc2652000}, {0xc2654000}, {0xc2656000}, + {0xc2658000}, {0xc265a000}, {0xc265c000}, {0xc265e000}, + {0xc2660000}, {0xc2662000}, {0xc2664000}, {0xc2666000}, + {0xc2668000}, {0xc266a000}, {0xc266c000}, {0xc266e000}, + {0xc2670000}, {0xc2672000}, {0xc2674000}, {0xc2676000}, + {0xc2678000}, {0xc267a000}, {0xc267c000}, {0xc267e000}, + {0xc2680000}, {0xc2682000}, {0xc2684000}, {0xc2686000}, + {0xc2688000}, {0xc268a000}, {0xc268c000}, {0xc268e000}, + {0xc2690000}, {0xc2692000}, {0xc2694000}, {0xc2696000}, + {0xc2698000}, {0xc269a000}, {0xc269c000}, {0xc269e000}, + {0xc26a0000}, {0xc26a2000}, {0xc26a4000}, {0xc26a6000}, + {0xc26a8000}, {0xc26aa000}, {0xc26ac000}, {0xc26ae000}, + {0xc26b0000}, {0xc26b2000}, {0xc26b4000}, {0xc26b6000}, + {0xc26b8000}, {0xc26ba000}, {0xc26bc000}, {0xc26be000}, + {0xc26c0000}, {0xc26c2000}, {0xc26c4000}, {0xc26c6000}, + {0xc26c8000}, {0xc26ca000}, {0xc26cc000}, {0xc26ce000}, + {0xc26d0000}, {0xc26d2000}, {0xc26d4000}, {0xc26d6000}, + {0xc26d8000}, {0xc26da000}, {0xc26dc000}, {0xc26de000}, + {0xc26e0000}, {0xc26e2000}, {0xc26e4000}, {0xc26e6000}, + {0xc26e8000}, {0xc26ea000}, {0xc26ec000}, {0xc26ee000}, + {0xc26f0000}, {0xc26f2000}, {0xc26f4000}, {0xc26f6000}, + {0xc26f8000}, {0xc26fa000}, {0xc26fc000}, {0xc26fe000}, + {0xc2700000}, {0xc2702000}, {0xc2704000}, {0xc2706000}, + {0xc2708000}, {0xc270a000}, {0xc270c000}, {0xc270e000}, + {0xc2710000}, {0xc2712000}, {0xc2714000}, {0xc2716000}, + {0xc2718000}, {0xc271a000}, {0xc271c000}, {0xc271e000}, + {0xc2720000}, {0xc2722000}, {0xc2724000}, {0xc2726000}, + {0xc2728000}, {0xc272a000}, {0xc272c000}, {0xc272e000}, + {0xc2730000}, {0xc2732000}, {0xc2734000}, {0xc2736000}, + {0xc2738000}, {0xc273a000}, {0xc273c000}, {0xc273e000}, + {0xc2740000}, {0xc2742000}, {0xc2744000}, {0xc2746000}, + {0xc2748000}, {0xc274a000}, {0xc274c000}, {0xc274e000}, + {0xc2750000}, {0xc2752000}, {0xc2754000}, {0xc2756000}, + {0xc2758000}, {0xc275a000}, {0xc275c000}, {0xc275e000}, + {0xc2760000}, {0xc2762000}, {0xc2764000}, {0xc2766000}, + {0xc2768000}, {0xc276a000}, {0xc276c000}, {0xc276e000}, + {0xc2770000}, {0xc2772000}, {0xc2774000}, {0xc2776000}, + {0xc2778000}, {0xc277a000}, {0xc277c000}, {0xc277e000}, + {0xc2780000}, {0xc2782000}, {0xc2784000}, {0xc2786000}, + {0xc2788000}, {0xc278a000}, {0xc278c000}, {0xc278e000}, + {0xc2790000}, {0xc2792000}, {0xc2794000}, {0xc2796000}, + {0xc2798000}, {0xc279a000}, {0xc279c000}, {0xc279e000}, + {0xc27a0000}, {0xc27a2000}, {0xc27a4000}, {0xc27a6000}, + {0xc27a8000}, {0xc27aa000}, {0xc27ac000}, {0xc27ae000}, + {0xc27b0000}, {0xc27b2000}, {0xc27b4000}, {0xc27b6000}, + {0xc27b8000}, {0xc27ba000}, {0xc27bc000}, {0xc27be000}, + {0xc27c0000}, {0xc27c2000}, {0xc27c4000}, {0xc27c6000}, + {0xc27c8000}, {0xc27ca000}, {0xc27cc000}, {0xc27ce000}, + {0xc27d0000}, {0xc27d2000}, {0xc27d4000}, {0xc27d6000}, + {0xc27d8000}, {0xc27da000}, {0xc27dc000}, {0xc27de000}, + {0xc27e0000}, {0xc27e2000}, {0xc27e4000}, {0xc27e6000}, + {0xc27e8000}, {0xc27ea000}, {0xc27ec000}, {0xc27ee000}, + {0xc27f0000}, {0xc27f2000}, {0xc27f4000}, {0xc27f6000}, + {0xc27f8000}, {0xc27fa000}, {0xc27fc000}, {0xc27fe000}, + {0xc2800000}, {0xc2802000}, {0xc2804000}, {0xc2806000}, + {0xc2808000}, {0xc280a000}, {0xc280c000}, {0xc280e000}, + {0xc2810000}, {0xc2812000}, {0xc2814000}, {0xc2816000}, + {0xc2818000}, {0xc281a000}, {0xc281c000}, {0xc281e000}, + {0xc2820000}, {0xc2822000}, {0xc2824000}, {0xc2826000}, + {0xc2828000}, {0xc282a000}, {0xc282c000}, {0xc282e000}, + {0xc2830000}, {0xc2832000}, {0xc2834000}, {0xc2836000}, + {0xc2838000}, {0xc283a000}, {0xc283c000}, {0xc283e000}, + {0xc2840000}, {0xc2842000}, {0xc2844000}, {0xc2846000}, + {0xc2848000}, {0xc284a000}, {0xc284c000}, {0xc284e000}, + {0xc2850000}, {0xc2852000}, {0xc2854000}, {0xc2856000}, + {0xc2858000}, {0xc285a000}, {0xc285c000}, {0xc285e000}, + {0xc2860000}, {0xc2862000}, {0xc2864000}, {0xc2866000}, + {0xc2868000}, {0xc286a000}, {0xc286c000}, {0xc286e000}, + {0xc2870000}, {0xc2872000}, {0xc2874000}, {0xc2876000}, + {0xc2878000}, {0xc287a000}, {0xc287c000}, {0xc287e000}, + {0xc2880000}, {0xc2882000}, {0xc2884000}, {0xc2886000}, + {0xc2888000}, {0xc288a000}, {0xc288c000}, {0xc288e000}, + {0xc2890000}, {0xc2892000}, {0xc2894000}, {0xc2896000}, + {0xc2898000}, {0xc289a000}, {0xc289c000}, {0xc289e000}, + {0xc28a0000}, {0xc28a2000}, {0xc28a4000}, {0xc28a6000}, + {0xc28a8000}, {0xc28aa000}, {0xc28ac000}, {0xc28ae000}, + {0xc28b0000}, {0xc28b2000}, {0xc28b4000}, {0xc28b6000}, + {0xc28b8000}, {0xc28ba000}, {0xc28bc000}, {0xc28be000}, + {0xc28c0000}, {0xc28c2000}, {0xc28c4000}, {0xc28c6000}, + {0xc28c8000}, {0xc28ca000}, {0xc28cc000}, {0xc28ce000}, + {0xc28d0000}, {0xc28d2000}, {0xc28d4000}, {0xc28d6000}, + {0xc28d8000}, {0xc28da000}, {0xc28dc000}, {0xc28de000}, + {0xc28e0000}, {0xc28e2000}, {0xc28e4000}, {0xc28e6000}, + {0xc28e8000}, {0xc28ea000}, {0xc28ec000}, {0xc28ee000}, + {0xc28f0000}, {0xc28f2000}, {0xc28f4000}, {0xc28f6000}, + {0xc28f8000}, {0xc28fa000}, {0xc28fc000}, {0xc28fe000}, + {0xc2900000}, {0xc2902000}, {0xc2904000}, {0xc2906000}, + {0xc2908000}, {0xc290a000}, {0xc290c000}, {0xc290e000}, + {0xc2910000}, {0xc2912000}, {0xc2914000}, {0xc2916000}, + {0xc2918000}, {0xc291a000}, {0xc291c000}, {0xc291e000}, + {0xc2920000}, {0xc2922000}, {0xc2924000}, {0xc2926000}, + {0xc2928000}, {0xc292a000}, {0xc292c000}, {0xc292e000}, + {0xc2930000}, {0xc2932000}, {0xc2934000}, {0xc2936000}, + {0xc2938000}, {0xc293a000}, {0xc293c000}, {0xc293e000}, + {0xc2940000}, {0xc2942000}, {0xc2944000}, {0xc2946000}, + {0xc2948000}, {0xc294a000}, {0xc294c000}, {0xc294e000}, + {0xc2950000}, {0xc2952000}, {0xc2954000}, {0xc2956000}, + {0xc2958000}, {0xc295a000}, {0xc295c000}, {0xc295e000}, + {0xc2960000}, {0xc2962000}, {0xc2964000}, {0xc2966000}, + {0xc2968000}, {0xc296a000}, {0xc296c000}, {0xc296e000}, + {0xc2970000}, {0xc2972000}, {0xc2974000}, {0xc2976000}, + {0xc2978000}, {0xc297a000}, {0xc297c000}, {0xc297e000}, + {0xc2980000}, {0xc2982000}, {0xc2984000}, {0xc2986000}, + {0xc2988000}, {0xc298a000}, {0xc298c000}, {0xc298e000}, + {0xc2990000}, {0xc2992000}, {0xc2994000}, {0xc2996000}, + {0xc2998000}, {0xc299a000}, {0xc299c000}, {0xc299e000}, + {0xc29a0000}, {0xc29a2000}, {0xc29a4000}, {0xc29a6000}, + {0xc29a8000}, {0xc29aa000}, {0xc29ac000}, {0xc29ae000}, + {0xc29b0000}, {0xc29b2000}, {0xc29b4000}, {0xc29b6000}, + {0xc29b8000}, {0xc29ba000}, {0xc29bc000}, {0xc29be000}, + {0xc29c0000}, {0xc29c2000}, {0xc29c4000}, {0xc29c6000}, + {0xc29c8000}, {0xc29ca000}, {0xc29cc000}, {0xc29ce000}, + {0xc29d0000}, {0xc29d2000}, {0xc29d4000}, {0xc29d6000}, + {0xc29d8000}, {0xc29da000}, {0xc29dc000}, {0xc29de000}, + {0xc29e0000}, {0xc29e2000}, {0xc29e4000}, {0xc29e6000}, + {0xc29e8000}, {0xc29ea000}, {0xc29ec000}, {0xc29ee000}, + {0xc29f0000}, {0xc29f2000}, {0xc29f4000}, {0xc29f6000}, + {0xc29f8000}, {0xc29fa000}, {0xc29fc000}, {0xc29fe000}, + {0xc2a00000}, {0xc2a02000}, {0xc2a04000}, {0xc2a06000}, + {0xc2a08000}, {0xc2a0a000}, {0xc2a0c000}, {0xc2a0e000}, + {0xc2a10000}, {0xc2a12000}, {0xc2a14000}, {0xc2a16000}, + {0xc2a18000}, {0xc2a1a000}, {0xc2a1c000}, {0xc2a1e000}, + {0xc2a20000}, {0xc2a22000}, {0xc2a24000}, {0xc2a26000}, + {0xc2a28000}, {0xc2a2a000}, {0xc2a2c000}, {0xc2a2e000}, + {0xc2a30000}, {0xc2a32000}, {0xc2a34000}, {0xc2a36000}, + {0xc2a38000}, {0xc2a3a000}, {0xc2a3c000}, {0xc2a3e000}, + {0xc2a40000}, {0xc2a42000}, {0xc2a44000}, {0xc2a46000}, + {0xc2a48000}, {0xc2a4a000}, {0xc2a4c000}, {0xc2a4e000}, + {0xc2a50000}, {0xc2a52000}, {0xc2a54000}, {0xc2a56000}, + {0xc2a58000}, {0xc2a5a000}, {0xc2a5c000}, {0xc2a5e000}, + {0xc2a60000}, {0xc2a62000}, {0xc2a64000}, {0xc2a66000}, + {0xc2a68000}, {0xc2a6a000}, {0xc2a6c000}, {0xc2a6e000}, + {0xc2a70000}, {0xc2a72000}, {0xc2a74000}, {0xc2a76000}, + {0xc2a78000}, {0xc2a7a000}, {0xc2a7c000}, {0xc2a7e000}, + {0xc2a80000}, {0xc2a82000}, {0xc2a84000}, {0xc2a86000}, + {0xc2a88000}, {0xc2a8a000}, {0xc2a8c000}, {0xc2a8e000}, + {0xc2a90000}, {0xc2a92000}, {0xc2a94000}, {0xc2a96000}, + {0xc2a98000}, {0xc2a9a000}, {0xc2a9c000}, {0xc2a9e000}, + {0xc2aa0000}, {0xc2aa2000}, {0xc2aa4000}, {0xc2aa6000}, + {0xc2aa8000}, {0xc2aaa000}, {0xc2aac000}, {0xc2aae000}, + {0xc2ab0000}, {0xc2ab2000}, {0xc2ab4000}, {0xc2ab6000}, + {0xc2ab8000}, {0xc2aba000}, {0xc2abc000}, {0xc2abe000}, + {0xc2ac0000}, {0xc2ac2000}, {0xc2ac4000}, {0xc2ac6000}, + {0xc2ac8000}, {0xc2aca000}, {0xc2acc000}, {0xc2ace000}, + {0xc2ad0000}, {0xc2ad2000}, {0xc2ad4000}, {0xc2ad6000}, + {0xc2ad8000}, {0xc2ada000}, {0xc2adc000}, {0xc2ade000}, + {0xc2ae0000}, {0xc2ae2000}, {0xc2ae4000}, {0xc2ae6000}, + {0xc2ae8000}, {0xc2aea000}, {0xc2aec000}, {0xc2aee000}, + {0xc2af0000}, {0xc2af2000}, {0xc2af4000}, {0xc2af6000}, + {0xc2af8000}, {0xc2afa000}, {0xc2afc000}, {0xc2afe000}, + {0xc2b00000}, {0xc2b02000}, {0xc2b04000}, {0xc2b06000}, + {0xc2b08000}, {0xc2b0a000}, {0xc2b0c000}, {0xc2b0e000}, + {0xc2b10000}, {0xc2b12000}, {0xc2b14000}, {0xc2b16000}, + {0xc2b18000}, {0xc2b1a000}, {0xc2b1c000}, {0xc2b1e000}, + {0xc2b20000}, {0xc2b22000}, {0xc2b24000}, {0xc2b26000}, + {0xc2b28000}, {0xc2b2a000}, {0xc2b2c000}, {0xc2b2e000}, + {0xc2b30000}, {0xc2b32000}, {0xc2b34000}, {0xc2b36000}, + {0xc2b38000}, {0xc2b3a000}, {0xc2b3c000}, {0xc2b3e000}, + {0xc2b40000}, {0xc2b42000}, {0xc2b44000}, {0xc2b46000}, + {0xc2b48000}, {0xc2b4a000}, {0xc2b4c000}, {0xc2b4e000}, + {0xc2b50000}, {0xc2b52000}, {0xc2b54000}, {0xc2b56000}, + {0xc2b58000}, {0xc2b5a000}, {0xc2b5c000}, {0xc2b5e000}, + {0xc2b60000}, {0xc2b62000}, {0xc2b64000}, {0xc2b66000}, + {0xc2b68000}, {0xc2b6a000}, {0xc2b6c000}, {0xc2b6e000}, + {0xc2b70000}, {0xc2b72000}, {0xc2b74000}, {0xc2b76000}, + {0xc2b78000}, {0xc2b7a000}, {0xc2b7c000}, {0xc2b7e000}, + {0xc2b80000}, {0xc2b82000}, {0xc2b84000}, {0xc2b86000}, + {0xc2b88000}, {0xc2b8a000}, {0xc2b8c000}, {0xc2b8e000}, + {0xc2b90000}, {0xc2b92000}, {0xc2b94000}, {0xc2b96000}, + {0xc2b98000}, {0xc2b9a000}, {0xc2b9c000}, {0xc2b9e000}, + {0xc2ba0000}, {0xc2ba2000}, {0xc2ba4000}, {0xc2ba6000}, + {0xc2ba8000}, {0xc2baa000}, {0xc2bac000}, {0xc2bae000}, + {0xc2bb0000}, {0xc2bb2000}, {0xc2bb4000}, {0xc2bb6000}, + {0xc2bb8000}, {0xc2bba000}, {0xc2bbc000}, {0xc2bbe000}, + {0xc2bc0000}, {0xc2bc2000}, {0xc2bc4000}, {0xc2bc6000}, + {0xc2bc8000}, {0xc2bca000}, {0xc2bcc000}, {0xc2bce000}, + {0xc2bd0000}, {0xc2bd2000}, {0xc2bd4000}, {0xc2bd6000}, + {0xc2bd8000}, {0xc2bda000}, {0xc2bdc000}, {0xc2bde000}, + {0xc2be0000}, {0xc2be2000}, {0xc2be4000}, {0xc2be6000}, + {0xc2be8000}, {0xc2bea000}, {0xc2bec000}, {0xc2bee000}, + {0xc2bf0000}, {0xc2bf2000}, {0xc2bf4000}, {0xc2bf6000}, + {0xc2bf8000}, {0xc2bfa000}, {0xc2bfc000}, {0xc2bfe000}, + {0xc2c00000}, {0xc2c02000}, {0xc2c04000}, {0xc2c06000}, + {0xc2c08000}, {0xc2c0a000}, {0xc2c0c000}, {0xc2c0e000}, + {0xc2c10000}, {0xc2c12000}, {0xc2c14000}, {0xc2c16000}, + {0xc2c18000}, {0xc2c1a000}, {0xc2c1c000}, {0xc2c1e000}, + {0xc2c20000}, {0xc2c22000}, {0xc2c24000}, {0xc2c26000}, + {0xc2c28000}, {0xc2c2a000}, {0xc2c2c000}, {0xc2c2e000}, + {0xc2c30000}, {0xc2c32000}, {0xc2c34000}, {0xc2c36000}, + {0xc2c38000}, {0xc2c3a000}, {0xc2c3c000}, {0xc2c3e000}, + {0xc2c40000}, {0xc2c42000}, {0xc2c44000}, {0xc2c46000}, + {0xc2c48000}, {0xc2c4a000}, {0xc2c4c000}, {0xc2c4e000}, + {0xc2c50000}, {0xc2c52000}, {0xc2c54000}, {0xc2c56000}, + {0xc2c58000}, {0xc2c5a000}, {0xc2c5c000}, {0xc2c5e000}, + {0xc2c60000}, {0xc2c62000}, {0xc2c64000}, {0xc2c66000}, + {0xc2c68000}, {0xc2c6a000}, {0xc2c6c000}, {0xc2c6e000}, + {0xc2c70000}, {0xc2c72000}, {0xc2c74000}, {0xc2c76000}, + {0xc2c78000}, {0xc2c7a000}, {0xc2c7c000}, {0xc2c7e000}, + {0xc2c80000}, {0xc2c82000}, {0xc2c84000}, {0xc2c86000}, + {0xc2c88000}, {0xc2c8a000}, {0xc2c8c000}, {0xc2c8e000}, + {0xc2c90000}, {0xc2c92000}, {0xc2c94000}, {0xc2c96000}, + {0xc2c98000}, {0xc2c9a000}, {0xc2c9c000}, {0xc2c9e000}, + {0xc2ca0000}, {0xc2ca2000}, {0xc2ca4000}, {0xc2ca6000}, + {0xc2ca8000}, {0xc2caa000}, {0xc2cac000}, {0xc2cae000}, + {0xc2cb0000}, {0xc2cb2000}, {0xc2cb4000}, {0xc2cb6000}, + {0xc2cb8000}, {0xc2cba000}, {0xc2cbc000}, {0xc2cbe000}, + {0xc2cc0000}, {0xc2cc2000}, {0xc2cc4000}, {0xc2cc6000}, + {0xc2cc8000}, {0xc2cca000}, {0xc2ccc000}, {0xc2cce000}, + {0xc2cd0000}, {0xc2cd2000}, {0xc2cd4000}, {0xc2cd6000}, + {0xc2cd8000}, {0xc2cda000}, {0xc2cdc000}, {0xc2cde000}, + {0xc2ce0000}, {0xc2ce2000}, {0xc2ce4000}, {0xc2ce6000}, + {0xc2ce8000}, {0xc2cea000}, {0xc2cec000}, {0xc2cee000}, + {0xc2cf0000}, {0xc2cf2000}, {0xc2cf4000}, {0xc2cf6000}, + {0xc2cf8000}, {0xc2cfa000}, {0xc2cfc000}, {0xc2cfe000}, + {0xc2d00000}, {0xc2d02000}, {0xc2d04000}, {0xc2d06000}, + {0xc2d08000}, {0xc2d0a000}, {0xc2d0c000}, {0xc2d0e000}, + {0xc2d10000}, {0xc2d12000}, {0xc2d14000}, {0xc2d16000}, + {0xc2d18000}, {0xc2d1a000}, {0xc2d1c000}, {0xc2d1e000}, + {0xc2d20000}, {0xc2d22000}, {0xc2d24000}, {0xc2d26000}, + {0xc2d28000}, {0xc2d2a000}, {0xc2d2c000}, {0xc2d2e000}, + {0xc2d30000}, {0xc2d32000}, {0xc2d34000}, {0xc2d36000}, + {0xc2d38000}, {0xc2d3a000}, {0xc2d3c000}, {0xc2d3e000}, + {0xc2d40000}, {0xc2d42000}, {0xc2d44000}, {0xc2d46000}, + {0xc2d48000}, {0xc2d4a000}, {0xc2d4c000}, {0xc2d4e000}, + {0xc2d50000}, {0xc2d52000}, {0xc2d54000}, {0xc2d56000}, + {0xc2d58000}, {0xc2d5a000}, {0xc2d5c000}, {0xc2d5e000}, + {0xc2d60000}, {0xc2d62000}, {0xc2d64000}, {0xc2d66000}, + {0xc2d68000}, {0xc2d6a000}, {0xc2d6c000}, {0xc2d6e000}, + {0xc2d70000}, {0xc2d72000}, {0xc2d74000}, {0xc2d76000}, + {0xc2d78000}, {0xc2d7a000}, {0xc2d7c000}, {0xc2d7e000}, + {0xc2d80000}, {0xc2d82000}, {0xc2d84000}, {0xc2d86000}, + {0xc2d88000}, {0xc2d8a000}, {0xc2d8c000}, {0xc2d8e000}, + {0xc2d90000}, {0xc2d92000}, {0xc2d94000}, {0xc2d96000}, + {0xc2d98000}, {0xc2d9a000}, {0xc2d9c000}, {0xc2d9e000}, + {0xc2da0000}, {0xc2da2000}, {0xc2da4000}, {0xc2da6000}, + {0xc2da8000}, {0xc2daa000}, {0xc2dac000}, {0xc2dae000}, + {0xc2db0000}, {0xc2db2000}, {0xc2db4000}, {0xc2db6000}, + {0xc2db8000}, {0xc2dba000}, {0xc2dbc000}, {0xc2dbe000}, + {0xc2dc0000}, {0xc2dc2000}, {0xc2dc4000}, {0xc2dc6000}, + {0xc2dc8000}, {0xc2dca000}, {0xc2dcc000}, {0xc2dce000}, + {0xc2dd0000}, {0xc2dd2000}, {0xc2dd4000}, {0xc2dd6000}, + {0xc2dd8000}, {0xc2dda000}, {0xc2ddc000}, {0xc2dde000}, + {0xc2de0000}, {0xc2de2000}, {0xc2de4000}, {0xc2de6000}, + {0xc2de8000}, {0xc2dea000}, {0xc2dec000}, {0xc2dee000}, + {0xc2df0000}, {0xc2df2000}, {0xc2df4000}, {0xc2df6000}, + {0xc2df8000}, {0xc2dfa000}, {0xc2dfc000}, {0xc2dfe000}, + {0xc2e00000}, {0xc2e02000}, {0xc2e04000}, {0xc2e06000}, + {0xc2e08000}, {0xc2e0a000}, {0xc2e0c000}, {0xc2e0e000}, + {0xc2e10000}, {0xc2e12000}, {0xc2e14000}, {0xc2e16000}, + {0xc2e18000}, {0xc2e1a000}, {0xc2e1c000}, {0xc2e1e000}, + {0xc2e20000}, {0xc2e22000}, {0xc2e24000}, {0xc2e26000}, + {0xc2e28000}, {0xc2e2a000}, {0xc2e2c000}, {0xc2e2e000}, + {0xc2e30000}, {0xc2e32000}, {0xc2e34000}, {0xc2e36000}, + {0xc2e38000}, {0xc2e3a000}, {0xc2e3c000}, {0xc2e3e000}, + {0xc2e40000}, {0xc2e42000}, {0xc2e44000}, {0xc2e46000}, + {0xc2e48000}, {0xc2e4a000}, {0xc2e4c000}, {0xc2e4e000}, + {0xc2e50000}, {0xc2e52000}, {0xc2e54000}, {0xc2e56000}, + {0xc2e58000}, {0xc2e5a000}, {0xc2e5c000}, {0xc2e5e000}, + {0xc2e60000}, {0xc2e62000}, {0xc2e64000}, {0xc2e66000}, + {0xc2e68000}, {0xc2e6a000}, {0xc2e6c000}, {0xc2e6e000}, + {0xc2e70000}, {0xc2e72000}, {0xc2e74000}, {0xc2e76000}, + {0xc2e78000}, {0xc2e7a000}, {0xc2e7c000}, {0xc2e7e000}, + {0xc2e80000}, {0xc2e82000}, {0xc2e84000}, {0xc2e86000}, + {0xc2e88000}, {0xc2e8a000}, {0xc2e8c000}, {0xc2e8e000}, + {0xc2e90000}, {0xc2e92000}, {0xc2e94000}, {0xc2e96000}, + {0xc2e98000}, {0xc2e9a000}, {0xc2e9c000}, {0xc2e9e000}, + {0xc2ea0000}, {0xc2ea2000}, {0xc2ea4000}, {0xc2ea6000}, + {0xc2ea8000}, {0xc2eaa000}, {0xc2eac000}, {0xc2eae000}, + {0xc2eb0000}, {0xc2eb2000}, {0xc2eb4000}, {0xc2eb6000}, + {0xc2eb8000}, {0xc2eba000}, {0xc2ebc000}, {0xc2ebe000}, + {0xc2ec0000}, {0xc2ec2000}, {0xc2ec4000}, {0xc2ec6000}, + {0xc2ec8000}, {0xc2eca000}, {0xc2ecc000}, {0xc2ece000}, + {0xc2ed0000}, {0xc2ed2000}, {0xc2ed4000}, {0xc2ed6000}, + {0xc2ed8000}, {0xc2eda000}, {0xc2edc000}, {0xc2ede000}, + {0xc2ee0000}, {0xc2ee2000}, {0xc2ee4000}, {0xc2ee6000}, + {0xc2ee8000}, {0xc2eea000}, {0xc2eec000}, {0xc2eee000}, + {0xc2ef0000}, {0xc2ef2000}, {0xc2ef4000}, {0xc2ef6000}, + {0xc2ef8000}, {0xc2efa000}, {0xc2efc000}, {0xc2efe000}, + {0xc2f00000}, {0xc2f02000}, {0xc2f04000}, {0xc2f06000}, + {0xc2f08000}, {0xc2f0a000}, {0xc2f0c000}, {0xc2f0e000}, + {0xc2f10000}, {0xc2f12000}, {0xc2f14000}, {0xc2f16000}, + {0xc2f18000}, {0xc2f1a000}, {0xc2f1c000}, {0xc2f1e000}, + {0xc2f20000}, {0xc2f22000}, {0xc2f24000}, {0xc2f26000}, + {0xc2f28000}, {0xc2f2a000}, {0xc2f2c000}, {0xc2f2e000}, + {0xc2f30000}, {0xc2f32000}, {0xc2f34000}, {0xc2f36000}, + {0xc2f38000}, {0xc2f3a000}, {0xc2f3c000}, {0xc2f3e000}, + {0xc2f40000}, {0xc2f42000}, {0xc2f44000}, {0xc2f46000}, + {0xc2f48000}, {0xc2f4a000}, {0xc2f4c000}, {0xc2f4e000}, + {0xc2f50000}, {0xc2f52000}, {0xc2f54000}, {0xc2f56000}, + {0xc2f58000}, {0xc2f5a000}, {0xc2f5c000}, {0xc2f5e000}, + {0xc2f60000}, {0xc2f62000}, {0xc2f64000}, {0xc2f66000}, + {0xc2f68000}, {0xc2f6a000}, {0xc2f6c000}, {0xc2f6e000}, + {0xc2f70000}, {0xc2f72000}, {0xc2f74000}, {0xc2f76000}, + {0xc2f78000}, {0xc2f7a000}, {0xc2f7c000}, {0xc2f7e000}, + {0xc2f80000}, {0xc2f82000}, {0xc2f84000}, {0xc2f86000}, + {0xc2f88000}, {0xc2f8a000}, {0xc2f8c000}, {0xc2f8e000}, + {0xc2f90000}, {0xc2f92000}, {0xc2f94000}, {0xc2f96000}, + {0xc2f98000}, {0xc2f9a000}, {0xc2f9c000}, {0xc2f9e000}, + {0xc2fa0000}, {0xc2fa2000}, {0xc2fa4000}, {0xc2fa6000}, + {0xc2fa8000}, {0xc2faa000}, {0xc2fac000}, {0xc2fae000}, + {0xc2fb0000}, {0xc2fb2000}, {0xc2fb4000}, {0xc2fb6000}, + {0xc2fb8000}, {0xc2fba000}, {0xc2fbc000}, {0xc2fbe000}, + {0xc2fc0000}, {0xc2fc2000}, {0xc2fc4000}, {0xc2fc6000}, + {0xc2fc8000}, {0xc2fca000}, {0xc2fcc000}, {0xc2fce000}, + {0xc2fd0000}, {0xc2fd2000}, {0xc2fd4000}, {0xc2fd6000}, + {0xc2fd8000}, {0xc2fda000}, {0xc2fdc000}, {0xc2fde000}, + {0xc2fe0000}, {0xc2fe2000}, {0xc2fe4000}, {0xc2fe6000}, + {0xc2fe8000}, {0xc2fea000}, {0xc2fec000}, {0xc2fee000}, + {0xc2ff0000}, {0xc2ff2000}, {0xc2ff4000}, {0xc2ff6000}, + {0xc2ff8000}, {0xc2ffa000}, {0xc2ffc000}, {0xc2ffe000}, + {0xc3000000}, {0xc3002000}, {0xc3004000}, {0xc3006000}, + {0xc3008000}, {0xc300a000}, {0xc300c000}, {0xc300e000}, + {0xc3010000}, {0xc3012000}, {0xc3014000}, {0xc3016000}, + {0xc3018000}, {0xc301a000}, {0xc301c000}, {0xc301e000}, + {0xc3020000}, {0xc3022000}, {0xc3024000}, {0xc3026000}, + {0xc3028000}, {0xc302a000}, {0xc302c000}, {0xc302e000}, + {0xc3030000}, {0xc3032000}, {0xc3034000}, {0xc3036000}, + {0xc3038000}, {0xc303a000}, {0xc303c000}, {0xc303e000}, + {0xc3040000}, {0xc3042000}, {0xc3044000}, {0xc3046000}, + {0xc3048000}, {0xc304a000}, {0xc304c000}, {0xc304e000}, + {0xc3050000}, {0xc3052000}, {0xc3054000}, {0xc3056000}, + {0xc3058000}, {0xc305a000}, {0xc305c000}, {0xc305e000}, + {0xc3060000}, {0xc3062000}, {0xc3064000}, {0xc3066000}, + {0xc3068000}, {0xc306a000}, {0xc306c000}, {0xc306e000}, + {0xc3070000}, {0xc3072000}, {0xc3074000}, {0xc3076000}, + {0xc3078000}, {0xc307a000}, {0xc307c000}, {0xc307e000}, + {0xc3080000}, {0xc3082000}, {0xc3084000}, {0xc3086000}, + {0xc3088000}, {0xc308a000}, {0xc308c000}, {0xc308e000}, + {0xc3090000}, {0xc3092000}, {0xc3094000}, {0xc3096000}, + {0xc3098000}, {0xc309a000}, {0xc309c000}, {0xc309e000}, + {0xc30a0000}, {0xc30a2000}, {0xc30a4000}, {0xc30a6000}, + {0xc30a8000}, {0xc30aa000}, {0xc30ac000}, {0xc30ae000}, + {0xc30b0000}, {0xc30b2000}, {0xc30b4000}, {0xc30b6000}, + {0xc30b8000}, {0xc30ba000}, {0xc30bc000}, {0xc30be000}, + {0xc30c0000}, {0xc30c2000}, {0xc30c4000}, {0xc30c6000}, + {0xc30c8000}, {0xc30ca000}, {0xc30cc000}, {0xc30ce000}, + {0xc30d0000}, {0xc30d2000}, {0xc30d4000}, {0xc30d6000}, + {0xc30d8000}, {0xc30da000}, {0xc30dc000}, {0xc30de000}, + {0xc30e0000}, {0xc30e2000}, {0xc30e4000}, {0xc30e6000}, + {0xc30e8000}, {0xc30ea000}, {0xc30ec000}, {0xc30ee000}, + {0xc30f0000}, {0xc30f2000}, {0xc30f4000}, {0xc30f6000}, + {0xc30f8000}, {0xc30fa000}, {0xc30fc000}, {0xc30fe000}, + {0xc3100000}, {0xc3102000}, {0xc3104000}, {0xc3106000}, + {0xc3108000}, {0xc310a000}, {0xc310c000}, {0xc310e000}, + {0xc3110000}, {0xc3112000}, {0xc3114000}, {0xc3116000}, + {0xc3118000}, {0xc311a000}, {0xc311c000}, {0xc311e000}, + {0xc3120000}, {0xc3122000}, {0xc3124000}, {0xc3126000}, + {0xc3128000}, {0xc312a000}, {0xc312c000}, {0xc312e000}, + {0xc3130000}, {0xc3132000}, {0xc3134000}, {0xc3136000}, + {0xc3138000}, {0xc313a000}, {0xc313c000}, {0xc313e000}, + {0xc3140000}, {0xc3142000}, {0xc3144000}, {0xc3146000}, + {0xc3148000}, {0xc314a000}, {0xc314c000}, {0xc314e000}, + {0xc3150000}, {0xc3152000}, {0xc3154000}, {0xc3156000}, + {0xc3158000}, {0xc315a000}, {0xc315c000}, {0xc315e000}, + {0xc3160000}, {0xc3162000}, {0xc3164000}, {0xc3166000}, + {0xc3168000}, {0xc316a000}, {0xc316c000}, {0xc316e000}, + {0xc3170000}, {0xc3172000}, {0xc3174000}, {0xc3176000}, + {0xc3178000}, {0xc317a000}, {0xc317c000}, {0xc317e000}, + {0xc3180000}, {0xc3182000}, {0xc3184000}, {0xc3186000}, + {0xc3188000}, {0xc318a000}, {0xc318c000}, {0xc318e000}, + {0xc3190000}, {0xc3192000}, {0xc3194000}, {0xc3196000}, + {0xc3198000}, {0xc319a000}, {0xc319c000}, {0xc319e000}, + {0xc31a0000}, {0xc31a2000}, {0xc31a4000}, {0xc31a6000}, + {0xc31a8000}, {0xc31aa000}, {0xc31ac000}, {0xc31ae000}, + {0xc31b0000}, {0xc31b2000}, {0xc31b4000}, {0xc31b6000}, + {0xc31b8000}, {0xc31ba000}, {0xc31bc000}, {0xc31be000}, + {0xc31c0000}, {0xc31c2000}, {0xc31c4000}, {0xc31c6000}, + {0xc31c8000}, {0xc31ca000}, {0xc31cc000}, {0xc31ce000}, + {0xc31d0000}, {0xc31d2000}, {0xc31d4000}, {0xc31d6000}, + {0xc31d8000}, {0xc31da000}, {0xc31dc000}, {0xc31de000}, + {0xc31e0000}, {0xc31e2000}, {0xc31e4000}, {0xc31e6000}, + {0xc31e8000}, {0xc31ea000}, {0xc31ec000}, {0xc31ee000}, + {0xc31f0000}, {0xc31f2000}, {0xc31f4000}, {0xc31f6000}, + {0xc31f8000}, {0xc31fa000}, {0xc31fc000}, {0xc31fe000}, + {0xc3200000}, {0xc3202000}, {0xc3204000}, {0xc3206000}, + {0xc3208000}, {0xc320a000}, {0xc320c000}, {0xc320e000}, + {0xc3210000}, {0xc3212000}, {0xc3214000}, {0xc3216000}, + {0xc3218000}, {0xc321a000}, {0xc321c000}, {0xc321e000}, + {0xc3220000}, {0xc3222000}, {0xc3224000}, {0xc3226000}, + {0xc3228000}, {0xc322a000}, {0xc322c000}, {0xc322e000}, + {0xc3230000}, {0xc3232000}, {0xc3234000}, {0xc3236000}, + {0xc3238000}, {0xc323a000}, {0xc323c000}, {0xc323e000}, + {0xc3240000}, {0xc3242000}, {0xc3244000}, {0xc3246000}, + {0xc3248000}, {0xc324a000}, {0xc324c000}, {0xc324e000}, + {0xc3250000}, {0xc3252000}, {0xc3254000}, {0xc3256000}, + {0xc3258000}, {0xc325a000}, {0xc325c000}, {0xc325e000}, + {0xc3260000}, {0xc3262000}, {0xc3264000}, {0xc3266000}, + {0xc3268000}, {0xc326a000}, {0xc326c000}, {0xc326e000}, + {0xc3270000}, {0xc3272000}, {0xc3274000}, {0xc3276000}, + {0xc3278000}, {0xc327a000}, {0xc327c000}, {0xc327e000}, + {0xc3280000}, {0xc3282000}, {0xc3284000}, {0xc3286000}, + {0xc3288000}, {0xc328a000}, {0xc328c000}, {0xc328e000}, + {0xc3290000}, {0xc3292000}, {0xc3294000}, {0xc3296000}, + {0xc3298000}, {0xc329a000}, {0xc329c000}, {0xc329e000}, + {0xc32a0000}, {0xc32a2000}, {0xc32a4000}, {0xc32a6000}, + {0xc32a8000}, {0xc32aa000}, {0xc32ac000}, {0xc32ae000}, + {0xc32b0000}, {0xc32b2000}, {0xc32b4000}, {0xc32b6000}, + {0xc32b8000}, {0xc32ba000}, {0xc32bc000}, {0xc32be000}, + {0xc32c0000}, {0xc32c2000}, {0xc32c4000}, {0xc32c6000}, + {0xc32c8000}, {0xc32ca000}, {0xc32cc000}, {0xc32ce000}, + {0xc32d0000}, {0xc32d2000}, {0xc32d4000}, {0xc32d6000}, + {0xc32d8000}, {0xc32da000}, {0xc32dc000}, {0xc32de000}, + {0xc32e0000}, {0xc32e2000}, {0xc32e4000}, {0xc32e6000}, + {0xc32e8000}, {0xc32ea000}, {0xc32ec000}, {0xc32ee000}, + {0xc32f0000}, {0xc32f2000}, {0xc32f4000}, {0xc32f6000}, + {0xc32f8000}, {0xc32fa000}, {0xc32fc000}, {0xc32fe000}, + {0xc3300000}, {0xc3302000}, {0xc3304000}, {0xc3306000}, + {0xc3308000}, {0xc330a000}, {0xc330c000}, {0xc330e000}, + {0xc3310000}, {0xc3312000}, {0xc3314000}, {0xc3316000}, + {0xc3318000}, {0xc331a000}, {0xc331c000}, {0xc331e000}, + {0xc3320000}, {0xc3322000}, {0xc3324000}, {0xc3326000}, + {0xc3328000}, {0xc332a000}, {0xc332c000}, {0xc332e000}, + {0xc3330000}, {0xc3332000}, {0xc3334000}, {0xc3336000}, + {0xc3338000}, {0xc333a000}, {0xc333c000}, {0xc333e000}, + {0xc3340000}, {0xc3342000}, {0xc3344000}, {0xc3346000}, + {0xc3348000}, {0xc334a000}, {0xc334c000}, {0xc334e000}, + {0xc3350000}, {0xc3352000}, {0xc3354000}, {0xc3356000}, + {0xc3358000}, {0xc335a000}, {0xc335c000}, {0xc335e000}, + {0xc3360000}, {0xc3362000}, {0xc3364000}, {0xc3366000}, + {0xc3368000}, {0xc336a000}, {0xc336c000}, {0xc336e000}, + {0xc3370000}, {0xc3372000}, {0xc3374000}, {0xc3376000}, + {0xc3378000}, {0xc337a000}, {0xc337c000}, {0xc337e000}, + {0xc3380000}, {0xc3382000}, {0xc3384000}, {0xc3386000}, + {0xc3388000}, {0xc338a000}, {0xc338c000}, {0xc338e000}, + {0xc3390000}, {0xc3392000}, {0xc3394000}, {0xc3396000}, + {0xc3398000}, {0xc339a000}, {0xc339c000}, {0xc339e000}, + {0xc33a0000}, {0xc33a2000}, {0xc33a4000}, {0xc33a6000}, + {0xc33a8000}, {0xc33aa000}, {0xc33ac000}, {0xc33ae000}, + {0xc33b0000}, {0xc33b2000}, {0xc33b4000}, {0xc33b6000}, + {0xc33b8000}, {0xc33ba000}, {0xc33bc000}, {0xc33be000}, + {0xc33c0000}, {0xc33c2000}, {0xc33c4000}, {0xc33c6000}, + {0xc33c8000}, {0xc33ca000}, {0xc33cc000}, {0xc33ce000}, + {0xc33d0000}, {0xc33d2000}, {0xc33d4000}, {0xc33d6000}, + {0xc33d8000}, {0xc33da000}, {0xc33dc000}, {0xc33de000}, + {0xc33e0000}, {0xc33e2000}, {0xc33e4000}, {0xc33e6000}, + {0xc33e8000}, {0xc33ea000}, {0xc33ec000}, {0xc33ee000}, + {0xc33f0000}, {0xc33f2000}, {0xc33f4000}, {0xc33f6000}, + {0xc33f8000}, {0xc33fa000}, {0xc33fc000}, {0xc33fe000}, + {0xc3400000}, {0xc3402000}, {0xc3404000}, {0xc3406000}, + {0xc3408000}, {0xc340a000}, {0xc340c000}, {0xc340e000}, + {0xc3410000}, {0xc3412000}, {0xc3414000}, {0xc3416000}, + {0xc3418000}, {0xc341a000}, {0xc341c000}, {0xc341e000}, + {0xc3420000}, {0xc3422000}, {0xc3424000}, {0xc3426000}, + {0xc3428000}, {0xc342a000}, {0xc342c000}, {0xc342e000}, + {0xc3430000}, {0xc3432000}, {0xc3434000}, {0xc3436000}, + {0xc3438000}, {0xc343a000}, {0xc343c000}, {0xc343e000}, + {0xc3440000}, {0xc3442000}, {0xc3444000}, {0xc3446000}, + {0xc3448000}, {0xc344a000}, {0xc344c000}, {0xc344e000}, + {0xc3450000}, {0xc3452000}, {0xc3454000}, {0xc3456000}, + {0xc3458000}, {0xc345a000}, {0xc345c000}, {0xc345e000}, + {0xc3460000}, {0xc3462000}, {0xc3464000}, {0xc3466000}, + {0xc3468000}, {0xc346a000}, {0xc346c000}, {0xc346e000}, + {0xc3470000}, {0xc3472000}, {0xc3474000}, {0xc3476000}, + {0xc3478000}, {0xc347a000}, {0xc347c000}, {0xc347e000}, + {0xc3480000}, {0xc3482000}, {0xc3484000}, {0xc3486000}, + {0xc3488000}, {0xc348a000}, {0xc348c000}, {0xc348e000}, + {0xc3490000}, {0xc3492000}, {0xc3494000}, {0xc3496000}, + {0xc3498000}, {0xc349a000}, {0xc349c000}, {0xc349e000}, + {0xc34a0000}, {0xc34a2000}, {0xc34a4000}, {0xc34a6000}, + {0xc34a8000}, {0xc34aa000}, {0xc34ac000}, {0xc34ae000}, + {0xc34b0000}, {0xc34b2000}, {0xc34b4000}, {0xc34b6000}, + {0xc34b8000}, {0xc34ba000}, {0xc34bc000}, {0xc34be000}, + {0xc34c0000}, {0xc34c2000}, {0xc34c4000}, {0xc34c6000}, + {0xc34c8000}, {0xc34ca000}, {0xc34cc000}, {0xc34ce000}, + {0xc34d0000}, {0xc34d2000}, {0xc34d4000}, {0xc34d6000}, + {0xc34d8000}, {0xc34da000}, {0xc34dc000}, {0xc34de000}, + {0xc34e0000}, {0xc34e2000}, {0xc34e4000}, {0xc34e6000}, + {0xc34e8000}, {0xc34ea000}, {0xc34ec000}, {0xc34ee000}, + {0xc34f0000}, {0xc34f2000}, {0xc34f4000}, {0xc34f6000}, + {0xc34f8000}, {0xc34fa000}, {0xc34fc000}, {0xc34fe000}, + {0xc3500000}, {0xc3502000}, {0xc3504000}, {0xc3506000}, + {0xc3508000}, {0xc350a000}, {0xc350c000}, {0xc350e000}, + {0xc3510000}, {0xc3512000}, {0xc3514000}, {0xc3516000}, + {0xc3518000}, {0xc351a000}, {0xc351c000}, {0xc351e000}, + {0xc3520000}, {0xc3522000}, {0xc3524000}, {0xc3526000}, + {0xc3528000}, {0xc352a000}, {0xc352c000}, {0xc352e000}, + {0xc3530000}, {0xc3532000}, {0xc3534000}, {0xc3536000}, + {0xc3538000}, {0xc353a000}, {0xc353c000}, {0xc353e000}, + {0xc3540000}, {0xc3542000}, {0xc3544000}, {0xc3546000}, + {0xc3548000}, {0xc354a000}, {0xc354c000}, {0xc354e000}, + {0xc3550000}, {0xc3552000}, {0xc3554000}, {0xc3556000}, + {0xc3558000}, {0xc355a000}, {0xc355c000}, {0xc355e000}, + {0xc3560000}, {0xc3562000}, {0xc3564000}, {0xc3566000}, + {0xc3568000}, {0xc356a000}, {0xc356c000}, {0xc356e000}, + {0xc3570000}, {0xc3572000}, {0xc3574000}, {0xc3576000}, + {0xc3578000}, {0xc357a000}, {0xc357c000}, {0xc357e000}, + {0xc3580000}, {0xc3582000}, {0xc3584000}, {0xc3586000}, + {0xc3588000}, {0xc358a000}, {0xc358c000}, {0xc358e000}, + {0xc3590000}, {0xc3592000}, {0xc3594000}, {0xc3596000}, + {0xc3598000}, {0xc359a000}, {0xc359c000}, {0xc359e000}, + {0xc35a0000}, {0xc35a2000}, {0xc35a4000}, {0xc35a6000}, + {0xc35a8000}, {0xc35aa000}, {0xc35ac000}, {0xc35ae000}, + {0xc35b0000}, {0xc35b2000}, {0xc35b4000}, {0xc35b6000}, + {0xc35b8000}, {0xc35ba000}, {0xc35bc000}, {0xc35be000}, + {0xc35c0000}, {0xc35c2000}, {0xc35c4000}, {0xc35c6000}, + {0xc35c8000}, {0xc35ca000}, {0xc35cc000}, {0xc35ce000}, + {0xc35d0000}, {0xc35d2000}, {0xc35d4000}, {0xc35d6000}, + {0xc35d8000}, {0xc35da000}, {0xc35dc000}, {0xc35de000}, + {0xc35e0000}, {0xc35e2000}, {0xc35e4000}, {0xc35e6000}, + {0xc35e8000}, {0xc35ea000}, {0xc35ec000}, {0xc35ee000}, + {0xc35f0000}, {0xc35f2000}, {0xc35f4000}, {0xc35f6000}, + {0xc35f8000}, {0xc35fa000}, {0xc35fc000}, {0xc35fe000}, + {0xc3600000}, {0xc3602000}, {0xc3604000}, {0xc3606000}, + {0xc3608000}, {0xc360a000}, {0xc360c000}, {0xc360e000}, + {0xc3610000}, {0xc3612000}, {0xc3614000}, {0xc3616000}, + {0xc3618000}, {0xc361a000}, {0xc361c000}, {0xc361e000}, + {0xc3620000}, {0xc3622000}, {0xc3624000}, {0xc3626000}, + {0xc3628000}, {0xc362a000}, {0xc362c000}, {0xc362e000}, + {0xc3630000}, {0xc3632000}, {0xc3634000}, {0xc3636000}, + {0xc3638000}, {0xc363a000}, {0xc363c000}, {0xc363e000}, + {0xc3640000}, {0xc3642000}, {0xc3644000}, {0xc3646000}, + {0xc3648000}, {0xc364a000}, {0xc364c000}, {0xc364e000}, + {0xc3650000}, {0xc3652000}, {0xc3654000}, {0xc3656000}, + {0xc3658000}, {0xc365a000}, {0xc365c000}, {0xc365e000}, + {0xc3660000}, {0xc3662000}, {0xc3664000}, {0xc3666000}, + {0xc3668000}, {0xc366a000}, {0xc366c000}, {0xc366e000}, + {0xc3670000}, {0xc3672000}, {0xc3674000}, {0xc3676000}, + {0xc3678000}, {0xc367a000}, {0xc367c000}, {0xc367e000}, + {0xc3680000}, {0xc3682000}, {0xc3684000}, {0xc3686000}, + {0xc3688000}, {0xc368a000}, {0xc368c000}, {0xc368e000}, + {0xc3690000}, {0xc3692000}, {0xc3694000}, {0xc3696000}, + {0xc3698000}, {0xc369a000}, {0xc369c000}, {0xc369e000}, + {0xc36a0000}, {0xc36a2000}, {0xc36a4000}, {0xc36a6000}, + {0xc36a8000}, {0xc36aa000}, {0xc36ac000}, {0xc36ae000}, + {0xc36b0000}, {0xc36b2000}, {0xc36b4000}, {0xc36b6000}, + {0xc36b8000}, {0xc36ba000}, {0xc36bc000}, {0xc36be000}, + {0xc36c0000}, {0xc36c2000}, {0xc36c4000}, {0xc36c6000}, + {0xc36c8000}, {0xc36ca000}, {0xc36cc000}, {0xc36ce000}, + {0xc36d0000}, {0xc36d2000}, {0xc36d4000}, {0xc36d6000}, + {0xc36d8000}, {0xc36da000}, {0xc36dc000}, {0xc36de000}, + {0xc36e0000}, {0xc36e2000}, {0xc36e4000}, {0xc36e6000}, + {0xc36e8000}, {0xc36ea000}, {0xc36ec000}, {0xc36ee000}, + {0xc36f0000}, {0xc36f2000}, {0xc36f4000}, {0xc36f6000}, + {0xc36f8000}, {0xc36fa000}, {0xc36fc000}, {0xc36fe000}, + {0xc3700000}, {0xc3702000}, {0xc3704000}, {0xc3706000}, + {0xc3708000}, {0xc370a000}, {0xc370c000}, {0xc370e000}, + {0xc3710000}, {0xc3712000}, {0xc3714000}, {0xc3716000}, + {0xc3718000}, {0xc371a000}, {0xc371c000}, {0xc371e000}, + {0xc3720000}, {0xc3722000}, {0xc3724000}, {0xc3726000}, + {0xc3728000}, {0xc372a000}, {0xc372c000}, {0xc372e000}, + {0xc3730000}, {0xc3732000}, {0xc3734000}, {0xc3736000}, + {0xc3738000}, {0xc373a000}, {0xc373c000}, {0xc373e000}, + {0xc3740000}, {0xc3742000}, {0xc3744000}, {0xc3746000}, + {0xc3748000}, {0xc374a000}, {0xc374c000}, {0xc374e000}, + {0xc3750000}, {0xc3752000}, {0xc3754000}, {0xc3756000}, + {0xc3758000}, {0xc375a000}, {0xc375c000}, {0xc375e000}, + {0xc3760000}, {0xc3762000}, {0xc3764000}, {0xc3766000}, + {0xc3768000}, {0xc376a000}, {0xc376c000}, {0xc376e000}, + {0xc3770000}, {0xc3772000}, {0xc3774000}, {0xc3776000}, + {0xc3778000}, {0xc377a000}, {0xc377c000}, {0xc377e000}, + {0xc3780000}, {0xc3782000}, {0xc3784000}, {0xc3786000}, + {0xc3788000}, {0xc378a000}, {0xc378c000}, {0xc378e000}, + {0xc3790000}, {0xc3792000}, {0xc3794000}, {0xc3796000}, + {0xc3798000}, {0xc379a000}, {0xc379c000}, {0xc379e000}, + {0xc37a0000}, {0xc37a2000}, {0xc37a4000}, {0xc37a6000}, + {0xc37a8000}, {0xc37aa000}, {0xc37ac000}, {0xc37ae000}, + {0xc37b0000}, {0xc37b2000}, {0xc37b4000}, {0xc37b6000}, + {0xc37b8000}, {0xc37ba000}, {0xc37bc000}, {0xc37be000}, + {0xc37c0000}, {0xc37c2000}, {0xc37c4000}, {0xc37c6000}, + {0xc37c8000}, {0xc37ca000}, {0xc37cc000}, {0xc37ce000}, + {0xc37d0000}, {0xc37d2000}, {0xc37d4000}, {0xc37d6000}, + {0xc37d8000}, {0xc37da000}, {0xc37dc000}, {0xc37de000}, + {0xc37e0000}, {0xc37e2000}, {0xc37e4000}, {0xc37e6000}, + {0xc37e8000}, {0xc37ea000}, {0xc37ec000}, {0xc37ee000}, + {0xc37f0000}, {0xc37f2000}, {0xc37f4000}, {0xc37f6000}, + {0xc37f8000}, {0xc37fa000}, {0xc37fc000}, {0xc37fe000}, + {0xc3800000}, {0xc3802000}, {0xc3804000}, {0xc3806000}, + {0xc3808000}, {0xc380a000}, {0xc380c000}, {0xc380e000}, + {0xc3810000}, {0xc3812000}, {0xc3814000}, {0xc3816000}, + {0xc3818000}, {0xc381a000}, {0xc381c000}, {0xc381e000}, + {0xc3820000}, {0xc3822000}, {0xc3824000}, {0xc3826000}, + {0xc3828000}, {0xc382a000}, {0xc382c000}, {0xc382e000}, + {0xc3830000}, {0xc3832000}, {0xc3834000}, {0xc3836000}, + {0xc3838000}, {0xc383a000}, {0xc383c000}, {0xc383e000}, + {0xc3840000}, {0xc3842000}, {0xc3844000}, {0xc3846000}, + {0xc3848000}, {0xc384a000}, {0xc384c000}, {0xc384e000}, + {0xc3850000}, {0xc3852000}, {0xc3854000}, {0xc3856000}, + {0xc3858000}, {0xc385a000}, {0xc385c000}, {0xc385e000}, + {0xc3860000}, {0xc3862000}, {0xc3864000}, {0xc3866000}, + {0xc3868000}, {0xc386a000}, {0xc386c000}, {0xc386e000}, + {0xc3870000}, {0xc3872000}, {0xc3874000}, {0xc3876000}, + {0xc3878000}, {0xc387a000}, {0xc387c000}, {0xc387e000}, + {0xc3880000}, {0xc3882000}, {0xc3884000}, {0xc3886000}, + {0xc3888000}, {0xc388a000}, {0xc388c000}, {0xc388e000}, + {0xc3890000}, {0xc3892000}, {0xc3894000}, {0xc3896000}, + {0xc3898000}, {0xc389a000}, {0xc389c000}, {0xc389e000}, + {0xc38a0000}, {0xc38a2000}, {0xc38a4000}, {0xc38a6000}, + {0xc38a8000}, {0xc38aa000}, {0xc38ac000}, {0xc38ae000}, + {0xc38b0000}, {0xc38b2000}, {0xc38b4000}, {0xc38b6000}, + {0xc38b8000}, {0xc38ba000}, {0xc38bc000}, {0xc38be000}, + {0xc38c0000}, {0xc38c2000}, {0xc38c4000}, {0xc38c6000}, + {0xc38c8000}, {0xc38ca000}, {0xc38cc000}, {0xc38ce000}, + {0xc38d0000}, {0xc38d2000}, {0xc38d4000}, {0xc38d6000}, + {0xc38d8000}, {0xc38da000}, {0xc38dc000}, {0xc38de000}, + {0xc38e0000}, {0xc38e2000}, {0xc38e4000}, {0xc38e6000}, + {0xc38e8000}, {0xc38ea000}, {0xc38ec000}, {0xc38ee000}, + {0xc38f0000}, {0xc38f2000}, {0xc38f4000}, {0xc38f6000}, + {0xc38f8000}, {0xc38fa000}, {0xc38fc000}, {0xc38fe000}, + {0xc3900000}, {0xc3902000}, {0xc3904000}, {0xc3906000}, + {0xc3908000}, {0xc390a000}, {0xc390c000}, {0xc390e000}, + {0xc3910000}, {0xc3912000}, {0xc3914000}, {0xc3916000}, + {0xc3918000}, {0xc391a000}, {0xc391c000}, {0xc391e000}, + {0xc3920000}, {0xc3922000}, {0xc3924000}, {0xc3926000}, + {0xc3928000}, {0xc392a000}, {0xc392c000}, {0xc392e000}, + {0xc3930000}, {0xc3932000}, {0xc3934000}, {0xc3936000}, + {0xc3938000}, {0xc393a000}, {0xc393c000}, {0xc393e000}, + {0xc3940000}, {0xc3942000}, {0xc3944000}, {0xc3946000}, + {0xc3948000}, {0xc394a000}, {0xc394c000}, {0xc394e000}, + {0xc3950000}, {0xc3952000}, {0xc3954000}, {0xc3956000}, + {0xc3958000}, {0xc395a000}, {0xc395c000}, {0xc395e000}, + {0xc3960000}, {0xc3962000}, {0xc3964000}, {0xc3966000}, + {0xc3968000}, {0xc396a000}, {0xc396c000}, {0xc396e000}, + {0xc3970000}, {0xc3972000}, {0xc3974000}, {0xc3976000}, + {0xc3978000}, {0xc397a000}, {0xc397c000}, {0xc397e000}, + {0xc3980000}, {0xc3982000}, {0xc3984000}, {0xc3986000}, + {0xc3988000}, {0xc398a000}, {0xc398c000}, {0xc398e000}, + {0xc3990000}, {0xc3992000}, {0xc3994000}, {0xc3996000}, + {0xc3998000}, {0xc399a000}, {0xc399c000}, {0xc399e000}, + {0xc39a0000}, {0xc39a2000}, {0xc39a4000}, {0xc39a6000}, + {0xc39a8000}, {0xc39aa000}, {0xc39ac000}, {0xc39ae000}, + {0xc39b0000}, {0xc39b2000}, {0xc39b4000}, {0xc39b6000}, + {0xc39b8000}, {0xc39ba000}, {0xc39bc000}, {0xc39be000}, + {0xc39c0000}, {0xc39c2000}, {0xc39c4000}, {0xc39c6000}, + {0xc39c8000}, {0xc39ca000}, {0xc39cc000}, {0xc39ce000}, + {0xc39d0000}, {0xc39d2000}, {0xc39d4000}, {0xc39d6000}, + {0xc39d8000}, {0xc39da000}, {0xc39dc000}, {0xc39de000}, + {0xc39e0000}, {0xc39e2000}, {0xc39e4000}, {0xc39e6000}, + {0xc39e8000}, {0xc39ea000}, {0xc39ec000}, {0xc39ee000}, + {0xc39f0000}, {0xc39f2000}, {0xc39f4000}, {0xc39f6000}, + {0xc39f8000}, {0xc39fa000}, {0xc39fc000}, {0xc39fe000}, + {0xc3a00000}, {0xc3a02000}, {0xc3a04000}, {0xc3a06000}, + {0xc3a08000}, {0xc3a0a000}, {0xc3a0c000}, {0xc3a0e000}, + {0xc3a10000}, {0xc3a12000}, {0xc3a14000}, {0xc3a16000}, + {0xc3a18000}, {0xc3a1a000}, {0xc3a1c000}, {0xc3a1e000}, + {0xc3a20000}, {0xc3a22000}, {0xc3a24000}, {0xc3a26000}, + {0xc3a28000}, {0xc3a2a000}, {0xc3a2c000}, {0xc3a2e000}, + {0xc3a30000}, {0xc3a32000}, {0xc3a34000}, {0xc3a36000}, + {0xc3a38000}, {0xc3a3a000}, {0xc3a3c000}, {0xc3a3e000}, + {0xc3a40000}, {0xc3a42000}, {0xc3a44000}, {0xc3a46000}, + {0xc3a48000}, {0xc3a4a000}, {0xc3a4c000}, {0xc3a4e000}, + {0xc3a50000}, {0xc3a52000}, {0xc3a54000}, {0xc3a56000}, + {0xc3a58000}, {0xc3a5a000}, {0xc3a5c000}, {0xc3a5e000}, + {0xc3a60000}, {0xc3a62000}, {0xc3a64000}, {0xc3a66000}, + {0xc3a68000}, {0xc3a6a000}, {0xc3a6c000}, {0xc3a6e000}, + {0xc3a70000}, {0xc3a72000}, {0xc3a74000}, {0xc3a76000}, + {0xc3a78000}, {0xc3a7a000}, {0xc3a7c000}, {0xc3a7e000}, + {0xc3a80000}, {0xc3a82000}, {0xc3a84000}, {0xc3a86000}, + {0xc3a88000}, {0xc3a8a000}, {0xc3a8c000}, {0xc3a8e000}, + {0xc3a90000}, {0xc3a92000}, {0xc3a94000}, {0xc3a96000}, + {0xc3a98000}, {0xc3a9a000}, {0xc3a9c000}, {0xc3a9e000}, + {0xc3aa0000}, {0xc3aa2000}, {0xc3aa4000}, {0xc3aa6000}, + {0xc3aa8000}, {0xc3aaa000}, {0xc3aac000}, {0xc3aae000}, + {0xc3ab0000}, {0xc3ab2000}, {0xc3ab4000}, {0xc3ab6000}, + {0xc3ab8000}, {0xc3aba000}, {0xc3abc000}, {0xc3abe000}, + {0xc3ac0000}, {0xc3ac2000}, {0xc3ac4000}, {0xc3ac6000}, + {0xc3ac8000}, {0xc3aca000}, {0xc3acc000}, {0xc3ace000}, + {0xc3ad0000}, {0xc3ad2000}, {0xc3ad4000}, {0xc3ad6000}, + {0xc3ad8000}, {0xc3ada000}, {0xc3adc000}, {0xc3ade000}, + {0xc3ae0000}, {0xc3ae2000}, {0xc3ae4000}, {0xc3ae6000}, + {0xc3ae8000}, {0xc3aea000}, {0xc3aec000}, {0xc3aee000}, + {0xc3af0000}, {0xc3af2000}, {0xc3af4000}, {0xc3af6000}, + {0xc3af8000}, {0xc3afa000}, {0xc3afc000}, {0xc3afe000}, + {0xc3b00000}, {0xc3b02000}, {0xc3b04000}, {0xc3b06000}, + {0xc3b08000}, {0xc3b0a000}, {0xc3b0c000}, {0xc3b0e000}, + {0xc3b10000}, {0xc3b12000}, {0xc3b14000}, {0xc3b16000}, + {0xc3b18000}, {0xc3b1a000}, {0xc3b1c000}, {0xc3b1e000}, + {0xc3b20000}, {0xc3b22000}, {0xc3b24000}, {0xc3b26000}, + {0xc3b28000}, {0xc3b2a000}, {0xc3b2c000}, {0xc3b2e000}, + {0xc3b30000}, {0xc3b32000}, {0xc3b34000}, {0xc3b36000}, + {0xc3b38000}, {0xc3b3a000}, {0xc3b3c000}, {0xc3b3e000}, + {0xc3b40000}, {0xc3b42000}, {0xc3b44000}, {0xc3b46000}, + {0xc3b48000}, {0xc3b4a000}, {0xc3b4c000}, {0xc3b4e000}, + {0xc3b50000}, {0xc3b52000}, {0xc3b54000}, {0xc3b56000}, + {0xc3b58000}, {0xc3b5a000}, {0xc3b5c000}, {0xc3b5e000}, + {0xc3b60000}, {0xc3b62000}, {0xc3b64000}, {0xc3b66000}, + {0xc3b68000}, {0xc3b6a000}, {0xc3b6c000}, {0xc3b6e000}, + {0xc3b70000}, {0xc3b72000}, {0xc3b74000}, {0xc3b76000}, + {0xc3b78000}, {0xc3b7a000}, {0xc3b7c000}, {0xc3b7e000}, + {0xc3b80000}, {0xc3b82000}, {0xc3b84000}, {0xc3b86000}, + {0xc3b88000}, {0xc3b8a000}, {0xc3b8c000}, {0xc3b8e000}, + {0xc3b90000}, {0xc3b92000}, {0xc3b94000}, {0xc3b96000}, + {0xc3b98000}, {0xc3b9a000}, {0xc3b9c000}, {0xc3b9e000}, + {0xc3ba0000}, {0xc3ba2000}, {0xc3ba4000}, {0xc3ba6000}, + {0xc3ba8000}, {0xc3baa000}, {0xc3bac000}, {0xc3bae000}, + {0xc3bb0000}, {0xc3bb2000}, {0xc3bb4000}, {0xc3bb6000}, + {0xc3bb8000}, {0xc3bba000}, {0xc3bbc000}, {0xc3bbe000}, + {0xc3bc0000}, {0xc3bc2000}, {0xc3bc4000}, {0xc3bc6000}, + {0xc3bc8000}, {0xc3bca000}, {0xc3bcc000}, {0xc3bce000}, + {0xc3bd0000}, {0xc3bd2000}, {0xc3bd4000}, {0xc3bd6000}, + {0xc3bd8000}, {0xc3bda000}, {0xc3bdc000}, {0xc3bde000}, + {0xc3be0000}, {0xc3be2000}, {0xc3be4000}, {0xc3be6000}, + {0xc3be8000}, {0xc3bea000}, {0xc3bec000}, {0xc3bee000}, + {0xc3bf0000}, {0xc3bf2000}, {0xc3bf4000}, {0xc3bf6000}, + {0xc3bf8000}, {0xc3bfa000}, {0xc3bfc000}, {0xc3bfe000}, + {0xc3c00000}, {0xc3c02000}, {0xc3c04000}, {0xc3c06000}, + {0xc3c08000}, {0xc3c0a000}, {0xc3c0c000}, {0xc3c0e000}, + {0xc3c10000}, {0xc3c12000}, {0xc3c14000}, {0xc3c16000}, + {0xc3c18000}, {0xc3c1a000}, {0xc3c1c000}, {0xc3c1e000}, + {0xc3c20000}, {0xc3c22000}, {0xc3c24000}, {0xc3c26000}, + {0xc3c28000}, {0xc3c2a000}, {0xc3c2c000}, {0xc3c2e000}, + {0xc3c30000}, {0xc3c32000}, {0xc3c34000}, {0xc3c36000}, + {0xc3c38000}, {0xc3c3a000}, {0xc3c3c000}, {0xc3c3e000}, + {0xc3c40000}, {0xc3c42000}, {0xc3c44000}, {0xc3c46000}, + {0xc3c48000}, {0xc3c4a000}, {0xc3c4c000}, {0xc3c4e000}, + {0xc3c50000}, {0xc3c52000}, {0xc3c54000}, {0xc3c56000}, + {0xc3c58000}, {0xc3c5a000}, {0xc3c5c000}, {0xc3c5e000}, + {0xc3c60000}, {0xc3c62000}, {0xc3c64000}, {0xc3c66000}, + {0xc3c68000}, {0xc3c6a000}, {0xc3c6c000}, {0xc3c6e000}, + {0xc3c70000}, {0xc3c72000}, {0xc3c74000}, {0xc3c76000}, + {0xc3c78000}, {0xc3c7a000}, {0xc3c7c000}, {0xc3c7e000}, + {0xc3c80000}, {0xc3c82000}, {0xc3c84000}, {0xc3c86000}, + {0xc3c88000}, {0xc3c8a000}, {0xc3c8c000}, {0xc3c8e000}, + {0xc3c90000}, {0xc3c92000}, {0xc3c94000}, {0xc3c96000}, + {0xc3c98000}, {0xc3c9a000}, {0xc3c9c000}, {0xc3c9e000}, + {0xc3ca0000}, {0xc3ca2000}, {0xc3ca4000}, {0xc3ca6000}, + {0xc3ca8000}, {0xc3caa000}, {0xc3cac000}, {0xc3cae000}, + {0xc3cb0000}, {0xc3cb2000}, {0xc3cb4000}, {0xc3cb6000}, + {0xc3cb8000}, {0xc3cba000}, {0xc3cbc000}, {0xc3cbe000}, + {0xc3cc0000}, {0xc3cc2000}, {0xc3cc4000}, {0xc3cc6000}, + {0xc3cc8000}, {0xc3cca000}, {0xc3ccc000}, {0xc3cce000}, + {0xc3cd0000}, {0xc3cd2000}, {0xc3cd4000}, {0xc3cd6000}, + {0xc3cd8000}, {0xc3cda000}, {0xc3cdc000}, {0xc3cde000}, + {0xc3ce0000}, {0xc3ce2000}, {0xc3ce4000}, {0xc3ce6000}, + {0xc3ce8000}, {0xc3cea000}, {0xc3cec000}, {0xc3cee000}, + {0xc3cf0000}, {0xc3cf2000}, {0xc3cf4000}, {0xc3cf6000}, + {0xc3cf8000}, {0xc3cfa000}, {0xc3cfc000}, {0xc3cfe000}, + {0xc3d00000}, {0xc3d02000}, {0xc3d04000}, {0xc3d06000}, + {0xc3d08000}, {0xc3d0a000}, {0xc3d0c000}, {0xc3d0e000}, + {0xc3d10000}, {0xc3d12000}, {0xc3d14000}, {0xc3d16000}, + {0xc3d18000}, {0xc3d1a000}, {0xc3d1c000}, {0xc3d1e000}, + {0xc3d20000}, {0xc3d22000}, {0xc3d24000}, {0xc3d26000}, + {0xc3d28000}, {0xc3d2a000}, {0xc3d2c000}, {0xc3d2e000}, + {0xc3d30000}, {0xc3d32000}, {0xc3d34000}, {0xc3d36000}, + {0xc3d38000}, {0xc3d3a000}, {0xc3d3c000}, {0xc3d3e000}, + {0xc3d40000}, {0xc3d42000}, {0xc3d44000}, {0xc3d46000}, + {0xc3d48000}, {0xc3d4a000}, {0xc3d4c000}, {0xc3d4e000}, + {0xc3d50000}, {0xc3d52000}, {0xc3d54000}, {0xc3d56000}, + {0xc3d58000}, {0xc3d5a000}, {0xc3d5c000}, {0xc3d5e000}, + {0xc3d60000}, {0xc3d62000}, {0xc3d64000}, {0xc3d66000}, + {0xc3d68000}, {0xc3d6a000}, {0xc3d6c000}, {0xc3d6e000}, + {0xc3d70000}, {0xc3d72000}, {0xc3d74000}, {0xc3d76000}, + {0xc3d78000}, {0xc3d7a000}, {0xc3d7c000}, {0xc3d7e000}, + {0xc3d80000}, {0xc3d82000}, {0xc3d84000}, {0xc3d86000}, + {0xc3d88000}, {0xc3d8a000}, {0xc3d8c000}, {0xc3d8e000}, + {0xc3d90000}, {0xc3d92000}, {0xc3d94000}, {0xc3d96000}, + {0xc3d98000}, {0xc3d9a000}, {0xc3d9c000}, {0xc3d9e000}, + {0xc3da0000}, {0xc3da2000}, {0xc3da4000}, {0xc3da6000}, + {0xc3da8000}, {0xc3daa000}, {0xc3dac000}, {0xc3dae000}, + {0xc3db0000}, {0xc3db2000}, {0xc3db4000}, {0xc3db6000}, + {0xc3db8000}, {0xc3dba000}, {0xc3dbc000}, {0xc3dbe000}, + {0xc3dc0000}, {0xc3dc2000}, {0xc3dc4000}, {0xc3dc6000}, + {0xc3dc8000}, {0xc3dca000}, {0xc3dcc000}, {0xc3dce000}, + {0xc3dd0000}, {0xc3dd2000}, {0xc3dd4000}, {0xc3dd6000}, + {0xc3dd8000}, {0xc3dda000}, {0xc3ddc000}, {0xc3dde000}, + {0xc3de0000}, {0xc3de2000}, {0xc3de4000}, {0xc3de6000}, + {0xc3de8000}, {0xc3dea000}, {0xc3dec000}, {0xc3dee000}, + {0xc3df0000}, {0xc3df2000}, {0xc3df4000}, {0xc3df6000}, + {0xc3df8000}, {0xc3dfa000}, {0xc3dfc000}, {0xc3dfe000}, + {0xc3e00000}, {0xc3e02000}, {0xc3e04000}, {0xc3e06000}, + {0xc3e08000}, {0xc3e0a000}, {0xc3e0c000}, {0xc3e0e000}, + {0xc3e10000}, {0xc3e12000}, {0xc3e14000}, {0xc3e16000}, + {0xc3e18000}, {0xc3e1a000}, {0xc3e1c000}, {0xc3e1e000}, + {0xc3e20000}, {0xc3e22000}, {0xc3e24000}, {0xc3e26000}, + {0xc3e28000}, {0xc3e2a000}, {0xc3e2c000}, {0xc3e2e000}, + {0xc3e30000}, {0xc3e32000}, {0xc3e34000}, {0xc3e36000}, + {0xc3e38000}, {0xc3e3a000}, {0xc3e3c000}, {0xc3e3e000}, + {0xc3e40000}, {0xc3e42000}, {0xc3e44000}, {0xc3e46000}, + {0xc3e48000}, {0xc3e4a000}, {0xc3e4c000}, {0xc3e4e000}, + {0xc3e50000}, {0xc3e52000}, {0xc3e54000}, {0xc3e56000}, + {0xc3e58000}, {0xc3e5a000}, {0xc3e5c000}, {0xc3e5e000}, + {0xc3e60000}, {0xc3e62000}, {0xc3e64000}, {0xc3e66000}, + {0xc3e68000}, {0xc3e6a000}, {0xc3e6c000}, {0xc3e6e000}, + {0xc3e70000}, {0xc3e72000}, {0xc3e74000}, {0xc3e76000}, + {0xc3e78000}, {0xc3e7a000}, {0xc3e7c000}, {0xc3e7e000}, + {0xc3e80000}, {0xc3e82000}, {0xc3e84000}, {0xc3e86000}, + {0xc3e88000}, {0xc3e8a000}, {0xc3e8c000}, {0xc3e8e000}, + {0xc3e90000}, {0xc3e92000}, {0xc3e94000}, {0xc3e96000}, + {0xc3e98000}, {0xc3e9a000}, {0xc3e9c000}, {0xc3e9e000}, + {0xc3ea0000}, {0xc3ea2000}, {0xc3ea4000}, {0xc3ea6000}, + {0xc3ea8000}, {0xc3eaa000}, {0xc3eac000}, {0xc3eae000}, + {0xc3eb0000}, {0xc3eb2000}, {0xc3eb4000}, {0xc3eb6000}, + {0xc3eb8000}, {0xc3eba000}, {0xc3ebc000}, {0xc3ebe000}, + {0xc3ec0000}, {0xc3ec2000}, {0xc3ec4000}, {0xc3ec6000}, + {0xc3ec8000}, {0xc3eca000}, {0xc3ecc000}, {0xc3ece000}, + {0xc3ed0000}, {0xc3ed2000}, {0xc3ed4000}, {0xc3ed6000}, + {0xc3ed8000}, {0xc3eda000}, {0xc3edc000}, {0xc3ede000}, + {0xc3ee0000}, {0xc3ee2000}, {0xc3ee4000}, {0xc3ee6000}, + {0xc3ee8000}, {0xc3eea000}, {0xc3eec000}, {0xc3eee000}, + {0xc3ef0000}, {0xc3ef2000}, {0xc3ef4000}, {0xc3ef6000}, + {0xc3ef8000}, {0xc3efa000}, {0xc3efc000}, {0xc3efe000}, + {0xc3f00000}, {0xc3f02000}, {0xc3f04000}, {0xc3f06000}, + {0xc3f08000}, {0xc3f0a000}, {0xc3f0c000}, {0xc3f0e000}, + {0xc3f10000}, {0xc3f12000}, {0xc3f14000}, {0xc3f16000}, + {0xc3f18000}, {0xc3f1a000}, {0xc3f1c000}, {0xc3f1e000}, + {0xc3f20000}, {0xc3f22000}, {0xc3f24000}, {0xc3f26000}, + {0xc3f28000}, {0xc3f2a000}, {0xc3f2c000}, {0xc3f2e000}, + {0xc3f30000}, {0xc3f32000}, {0xc3f34000}, {0xc3f36000}, + {0xc3f38000}, {0xc3f3a000}, {0xc3f3c000}, {0xc3f3e000}, + {0xc3f40000}, {0xc3f42000}, {0xc3f44000}, {0xc3f46000}, + {0xc3f48000}, {0xc3f4a000}, {0xc3f4c000}, {0xc3f4e000}, + {0xc3f50000}, {0xc3f52000}, {0xc3f54000}, {0xc3f56000}, + {0xc3f58000}, {0xc3f5a000}, {0xc3f5c000}, {0xc3f5e000}, + {0xc3f60000}, {0xc3f62000}, {0xc3f64000}, {0xc3f66000}, + {0xc3f68000}, {0xc3f6a000}, {0xc3f6c000}, {0xc3f6e000}, + {0xc3f70000}, {0xc3f72000}, {0xc3f74000}, {0xc3f76000}, + {0xc3f78000}, {0xc3f7a000}, {0xc3f7c000}, {0xc3f7e000}, + {0xc3f80000}, {0xc3f82000}, {0xc3f84000}, {0xc3f86000}, + {0xc3f88000}, {0xc3f8a000}, {0xc3f8c000}, {0xc3f8e000}, + {0xc3f90000}, {0xc3f92000}, {0xc3f94000}, {0xc3f96000}, + {0xc3f98000}, {0xc3f9a000}, {0xc3f9c000}, {0xc3f9e000}, + {0xc3fa0000}, {0xc3fa2000}, {0xc3fa4000}, {0xc3fa6000}, + {0xc3fa8000}, {0xc3faa000}, {0xc3fac000}, {0xc3fae000}, + {0xc3fb0000}, {0xc3fb2000}, {0xc3fb4000}, {0xc3fb6000}, + {0xc3fb8000}, {0xc3fba000}, {0xc3fbc000}, {0xc3fbe000}, + {0xc3fc0000}, {0xc3fc2000}, {0xc3fc4000}, {0xc3fc6000}, + {0xc3fc8000}, {0xc3fca000}, {0xc3fcc000}, {0xc3fce000}, + {0xc3fd0000}, {0xc3fd2000}, {0xc3fd4000}, {0xc3fd6000}, + {0xc3fd8000}, {0xc3fda000}, {0xc3fdc000}, {0xc3fde000}, + {0xc3fe0000}, {0xc3fe2000}, {0xc3fe4000}, {0xc3fe6000}, + {0xc3fe8000}, {0xc3fea000}, {0xc3fec000}, {0xc3fee000}, + {0xc3ff0000}, {0xc3ff2000}, {0xc3ff4000}, {0xc3ff6000}, + {0xc3ff8000}, {0xc3ffa000}, {0xc3ffc000}, {0xc3ffe000}, + {0xc4000000}, {0xc4002000}, {0xc4004000}, {0xc4006000}, + {0xc4008000}, {0xc400a000}, {0xc400c000}, {0xc400e000}, + {0xc4010000}, {0xc4012000}, {0xc4014000}, {0xc4016000}, + {0xc4018000}, {0xc401a000}, {0xc401c000}, {0xc401e000}, + {0xc4020000}, {0xc4022000}, {0xc4024000}, {0xc4026000}, + {0xc4028000}, {0xc402a000}, {0xc402c000}, {0xc402e000}, + {0xc4030000}, {0xc4032000}, {0xc4034000}, {0xc4036000}, + {0xc4038000}, {0xc403a000}, {0xc403c000}, {0xc403e000}, + {0xc4040000}, {0xc4042000}, {0xc4044000}, {0xc4046000}, + {0xc4048000}, {0xc404a000}, {0xc404c000}, {0xc404e000}, + {0xc4050000}, {0xc4052000}, {0xc4054000}, {0xc4056000}, + {0xc4058000}, {0xc405a000}, {0xc405c000}, {0xc405e000}, + {0xc4060000}, {0xc4062000}, {0xc4064000}, {0xc4066000}, + {0xc4068000}, {0xc406a000}, {0xc406c000}, {0xc406e000}, + {0xc4070000}, {0xc4072000}, {0xc4074000}, {0xc4076000}, + {0xc4078000}, {0xc407a000}, {0xc407c000}, {0xc407e000}, + {0xc4080000}, {0xc4082000}, {0xc4084000}, {0xc4086000}, + {0xc4088000}, {0xc408a000}, {0xc408c000}, {0xc408e000}, + {0xc4090000}, {0xc4092000}, {0xc4094000}, {0xc4096000}, + {0xc4098000}, {0xc409a000}, {0xc409c000}, {0xc409e000}, + {0xc40a0000}, {0xc40a2000}, {0xc40a4000}, {0xc40a6000}, + {0xc40a8000}, {0xc40aa000}, {0xc40ac000}, {0xc40ae000}, + {0xc40b0000}, {0xc40b2000}, {0xc40b4000}, {0xc40b6000}, + {0xc40b8000}, {0xc40ba000}, {0xc40bc000}, {0xc40be000}, + {0xc40c0000}, {0xc40c2000}, {0xc40c4000}, {0xc40c6000}, + {0xc40c8000}, {0xc40ca000}, {0xc40cc000}, {0xc40ce000}, + {0xc40d0000}, {0xc40d2000}, {0xc40d4000}, {0xc40d6000}, + {0xc40d8000}, {0xc40da000}, {0xc40dc000}, {0xc40de000}, + {0xc40e0000}, {0xc40e2000}, {0xc40e4000}, {0xc40e6000}, + {0xc40e8000}, {0xc40ea000}, {0xc40ec000}, {0xc40ee000}, + {0xc40f0000}, {0xc40f2000}, {0xc40f4000}, {0xc40f6000}, + {0xc40f8000}, {0xc40fa000}, {0xc40fc000}, {0xc40fe000}, + {0xc4100000}, {0xc4102000}, {0xc4104000}, {0xc4106000}, + {0xc4108000}, {0xc410a000}, {0xc410c000}, {0xc410e000}, + {0xc4110000}, {0xc4112000}, {0xc4114000}, {0xc4116000}, + {0xc4118000}, {0xc411a000}, {0xc411c000}, {0xc411e000}, + {0xc4120000}, {0xc4122000}, {0xc4124000}, {0xc4126000}, + {0xc4128000}, {0xc412a000}, {0xc412c000}, {0xc412e000}, + {0xc4130000}, {0xc4132000}, {0xc4134000}, {0xc4136000}, + {0xc4138000}, {0xc413a000}, {0xc413c000}, {0xc413e000}, + {0xc4140000}, {0xc4142000}, {0xc4144000}, {0xc4146000}, + {0xc4148000}, {0xc414a000}, {0xc414c000}, {0xc414e000}, + {0xc4150000}, {0xc4152000}, {0xc4154000}, {0xc4156000}, + {0xc4158000}, {0xc415a000}, {0xc415c000}, {0xc415e000}, + {0xc4160000}, {0xc4162000}, {0xc4164000}, {0xc4166000}, + {0xc4168000}, {0xc416a000}, {0xc416c000}, {0xc416e000}, + {0xc4170000}, {0xc4172000}, {0xc4174000}, {0xc4176000}, + {0xc4178000}, {0xc417a000}, {0xc417c000}, {0xc417e000}, + {0xc4180000}, {0xc4182000}, {0xc4184000}, {0xc4186000}, + {0xc4188000}, {0xc418a000}, {0xc418c000}, {0xc418e000}, + {0xc4190000}, {0xc4192000}, {0xc4194000}, {0xc4196000}, + {0xc4198000}, {0xc419a000}, {0xc419c000}, {0xc419e000}, + {0xc41a0000}, {0xc41a2000}, {0xc41a4000}, {0xc41a6000}, + {0xc41a8000}, {0xc41aa000}, {0xc41ac000}, {0xc41ae000}, + {0xc41b0000}, {0xc41b2000}, {0xc41b4000}, {0xc41b6000}, + {0xc41b8000}, {0xc41ba000}, {0xc41bc000}, {0xc41be000}, + {0xc41c0000}, {0xc41c2000}, {0xc41c4000}, {0xc41c6000}, + {0xc41c8000}, {0xc41ca000}, {0xc41cc000}, {0xc41ce000}, + {0xc41d0000}, {0xc41d2000}, {0xc41d4000}, {0xc41d6000}, + {0xc41d8000}, {0xc41da000}, {0xc41dc000}, {0xc41de000}, + {0xc41e0000}, {0xc41e2000}, {0xc41e4000}, {0xc41e6000}, + {0xc41e8000}, {0xc41ea000}, {0xc41ec000}, {0xc41ee000}, + {0xc41f0000}, {0xc41f2000}, {0xc41f4000}, {0xc41f6000}, + {0xc41f8000}, {0xc41fa000}, {0xc41fc000}, {0xc41fe000}, + {0xc4200000}, {0xc4202000}, {0xc4204000}, {0xc4206000}, + {0xc4208000}, {0xc420a000}, {0xc420c000}, {0xc420e000}, + {0xc4210000}, {0xc4212000}, {0xc4214000}, {0xc4216000}, + {0xc4218000}, {0xc421a000}, {0xc421c000}, {0xc421e000}, + {0xc4220000}, {0xc4222000}, {0xc4224000}, {0xc4226000}, + {0xc4228000}, {0xc422a000}, {0xc422c000}, {0xc422e000}, + {0xc4230000}, {0xc4232000}, {0xc4234000}, {0xc4236000}, + {0xc4238000}, {0xc423a000}, {0xc423c000}, {0xc423e000}, + {0xc4240000}, {0xc4242000}, {0xc4244000}, {0xc4246000}, + {0xc4248000}, {0xc424a000}, {0xc424c000}, {0xc424e000}, + {0xc4250000}, {0xc4252000}, {0xc4254000}, {0xc4256000}, + {0xc4258000}, {0xc425a000}, {0xc425c000}, {0xc425e000}, + {0xc4260000}, {0xc4262000}, {0xc4264000}, {0xc4266000}, + {0xc4268000}, {0xc426a000}, {0xc426c000}, {0xc426e000}, + {0xc4270000}, {0xc4272000}, {0xc4274000}, {0xc4276000}, + {0xc4278000}, {0xc427a000}, {0xc427c000}, {0xc427e000}, + {0xc4280000}, {0xc4282000}, {0xc4284000}, {0xc4286000}, + {0xc4288000}, {0xc428a000}, {0xc428c000}, {0xc428e000}, + {0xc4290000}, {0xc4292000}, {0xc4294000}, {0xc4296000}, + {0xc4298000}, {0xc429a000}, {0xc429c000}, {0xc429e000}, + {0xc42a0000}, {0xc42a2000}, {0xc42a4000}, {0xc42a6000}, + {0xc42a8000}, {0xc42aa000}, {0xc42ac000}, {0xc42ae000}, + {0xc42b0000}, {0xc42b2000}, {0xc42b4000}, {0xc42b6000}, + {0xc42b8000}, {0xc42ba000}, {0xc42bc000}, {0xc42be000}, + {0xc42c0000}, {0xc42c2000}, {0xc42c4000}, {0xc42c6000}, + {0xc42c8000}, {0xc42ca000}, {0xc42cc000}, {0xc42ce000}, + {0xc42d0000}, {0xc42d2000}, {0xc42d4000}, {0xc42d6000}, + {0xc42d8000}, {0xc42da000}, {0xc42dc000}, {0xc42de000}, + {0xc42e0000}, {0xc42e2000}, {0xc42e4000}, {0xc42e6000}, + {0xc42e8000}, {0xc42ea000}, {0xc42ec000}, {0xc42ee000}, + {0xc42f0000}, {0xc42f2000}, {0xc42f4000}, {0xc42f6000}, + {0xc42f8000}, {0xc42fa000}, {0xc42fc000}, {0xc42fe000}, + {0xc4300000}, {0xc4302000}, {0xc4304000}, {0xc4306000}, + {0xc4308000}, {0xc430a000}, {0xc430c000}, {0xc430e000}, + {0xc4310000}, {0xc4312000}, {0xc4314000}, {0xc4316000}, + {0xc4318000}, {0xc431a000}, {0xc431c000}, {0xc431e000}, + {0xc4320000}, {0xc4322000}, {0xc4324000}, {0xc4326000}, + {0xc4328000}, {0xc432a000}, {0xc432c000}, {0xc432e000}, + {0xc4330000}, {0xc4332000}, {0xc4334000}, {0xc4336000}, + {0xc4338000}, {0xc433a000}, {0xc433c000}, {0xc433e000}, + {0xc4340000}, {0xc4342000}, {0xc4344000}, {0xc4346000}, + {0xc4348000}, {0xc434a000}, {0xc434c000}, {0xc434e000}, + {0xc4350000}, {0xc4352000}, {0xc4354000}, {0xc4356000}, + {0xc4358000}, {0xc435a000}, {0xc435c000}, {0xc435e000}, + {0xc4360000}, {0xc4362000}, {0xc4364000}, {0xc4366000}, + {0xc4368000}, {0xc436a000}, {0xc436c000}, {0xc436e000}, + {0xc4370000}, {0xc4372000}, {0xc4374000}, {0xc4376000}, + {0xc4378000}, {0xc437a000}, {0xc437c000}, {0xc437e000}, + {0xc4380000}, {0xc4382000}, {0xc4384000}, {0xc4386000}, + {0xc4388000}, {0xc438a000}, {0xc438c000}, {0xc438e000}, + {0xc4390000}, {0xc4392000}, {0xc4394000}, {0xc4396000}, + {0xc4398000}, {0xc439a000}, {0xc439c000}, {0xc439e000}, + {0xc43a0000}, {0xc43a2000}, {0xc43a4000}, {0xc43a6000}, + {0xc43a8000}, {0xc43aa000}, {0xc43ac000}, {0xc43ae000}, + {0xc43b0000}, {0xc43b2000}, {0xc43b4000}, {0xc43b6000}, + {0xc43b8000}, {0xc43ba000}, {0xc43bc000}, {0xc43be000}, + {0xc43c0000}, {0xc43c2000}, {0xc43c4000}, {0xc43c6000}, + {0xc43c8000}, {0xc43ca000}, {0xc43cc000}, {0xc43ce000}, + {0xc43d0000}, {0xc43d2000}, {0xc43d4000}, {0xc43d6000}, + {0xc43d8000}, {0xc43da000}, {0xc43dc000}, {0xc43de000}, + {0xc43e0000}, {0xc43e2000}, {0xc43e4000}, {0xc43e6000}, + {0xc43e8000}, {0xc43ea000}, {0xc43ec000}, {0xc43ee000}, + {0xc43f0000}, {0xc43f2000}, {0xc43f4000}, {0xc43f6000}, + {0xc43f8000}, {0xc43fa000}, {0xc43fc000}, {0xc43fe000}, + {0xc4400000}, {0xc4402000}, {0xc4404000}, {0xc4406000}, + {0xc4408000}, {0xc440a000}, {0xc440c000}, {0xc440e000}, + {0xc4410000}, {0xc4412000}, {0xc4414000}, {0xc4416000}, + {0xc4418000}, {0xc441a000}, {0xc441c000}, {0xc441e000}, + {0xc4420000}, {0xc4422000}, {0xc4424000}, {0xc4426000}, + {0xc4428000}, {0xc442a000}, {0xc442c000}, {0xc442e000}, + {0xc4430000}, {0xc4432000}, {0xc4434000}, {0xc4436000}, + {0xc4438000}, {0xc443a000}, {0xc443c000}, {0xc443e000}, + {0xc4440000}, {0xc4442000}, {0xc4444000}, {0xc4446000}, + {0xc4448000}, {0xc444a000}, {0xc444c000}, {0xc444e000}, + {0xc4450000}, {0xc4452000}, {0xc4454000}, {0xc4456000}, + {0xc4458000}, {0xc445a000}, {0xc445c000}, {0xc445e000}, + {0xc4460000}, {0xc4462000}, {0xc4464000}, {0xc4466000}, + {0xc4468000}, {0xc446a000}, {0xc446c000}, {0xc446e000}, + {0xc4470000}, {0xc4472000}, {0xc4474000}, {0xc4476000}, + {0xc4478000}, {0xc447a000}, {0xc447c000}, {0xc447e000}, + {0xc4480000}, {0xc4482000}, {0xc4484000}, {0xc4486000}, + {0xc4488000}, {0xc448a000}, {0xc448c000}, {0xc448e000}, + {0xc4490000}, {0xc4492000}, {0xc4494000}, {0xc4496000}, + {0xc4498000}, {0xc449a000}, {0xc449c000}, {0xc449e000}, + {0xc44a0000}, {0xc44a2000}, {0xc44a4000}, {0xc44a6000}, + {0xc44a8000}, {0xc44aa000}, {0xc44ac000}, {0xc44ae000}, + {0xc44b0000}, {0xc44b2000}, {0xc44b4000}, {0xc44b6000}, + {0xc44b8000}, {0xc44ba000}, {0xc44bc000}, {0xc44be000}, + {0xc44c0000}, {0xc44c2000}, {0xc44c4000}, {0xc44c6000}, + {0xc44c8000}, {0xc44ca000}, {0xc44cc000}, {0xc44ce000}, + {0xc44d0000}, {0xc44d2000}, {0xc44d4000}, {0xc44d6000}, + {0xc44d8000}, {0xc44da000}, {0xc44dc000}, {0xc44de000}, + {0xc44e0000}, {0xc44e2000}, {0xc44e4000}, {0xc44e6000}, + {0xc44e8000}, {0xc44ea000}, {0xc44ec000}, {0xc44ee000}, + {0xc44f0000}, {0xc44f2000}, {0xc44f4000}, {0xc44f6000}, + {0xc44f8000}, {0xc44fa000}, {0xc44fc000}, {0xc44fe000}, + {0xc4500000}, {0xc4502000}, {0xc4504000}, {0xc4506000}, + {0xc4508000}, {0xc450a000}, {0xc450c000}, {0xc450e000}, + {0xc4510000}, {0xc4512000}, {0xc4514000}, {0xc4516000}, + {0xc4518000}, {0xc451a000}, {0xc451c000}, {0xc451e000}, + {0xc4520000}, {0xc4522000}, {0xc4524000}, {0xc4526000}, + {0xc4528000}, {0xc452a000}, {0xc452c000}, {0xc452e000}, + {0xc4530000}, {0xc4532000}, {0xc4534000}, {0xc4536000}, + {0xc4538000}, {0xc453a000}, {0xc453c000}, {0xc453e000}, + {0xc4540000}, {0xc4542000}, {0xc4544000}, {0xc4546000}, + {0xc4548000}, {0xc454a000}, {0xc454c000}, {0xc454e000}, + {0xc4550000}, {0xc4552000}, {0xc4554000}, {0xc4556000}, + {0xc4558000}, {0xc455a000}, {0xc455c000}, {0xc455e000}, + {0xc4560000}, {0xc4562000}, {0xc4564000}, {0xc4566000}, + {0xc4568000}, {0xc456a000}, {0xc456c000}, {0xc456e000}, + {0xc4570000}, {0xc4572000}, {0xc4574000}, {0xc4576000}, + {0xc4578000}, {0xc457a000}, {0xc457c000}, {0xc457e000}, + {0xc4580000}, {0xc4582000}, {0xc4584000}, {0xc4586000}, + {0xc4588000}, {0xc458a000}, {0xc458c000}, {0xc458e000}, + {0xc4590000}, {0xc4592000}, {0xc4594000}, {0xc4596000}, + {0xc4598000}, {0xc459a000}, {0xc459c000}, {0xc459e000}, + {0xc45a0000}, {0xc45a2000}, {0xc45a4000}, {0xc45a6000}, + {0xc45a8000}, {0xc45aa000}, {0xc45ac000}, {0xc45ae000}, + {0xc45b0000}, {0xc45b2000}, {0xc45b4000}, {0xc45b6000}, + {0xc45b8000}, {0xc45ba000}, {0xc45bc000}, {0xc45be000}, + {0xc45c0000}, {0xc45c2000}, {0xc45c4000}, {0xc45c6000}, + {0xc45c8000}, {0xc45ca000}, {0xc45cc000}, {0xc45ce000}, + {0xc45d0000}, {0xc45d2000}, {0xc45d4000}, {0xc45d6000}, + {0xc45d8000}, {0xc45da000}, {0xc45dc000}, {0xc45de000}, + {0xc45e0000}, {0xc45e2000}, {0xc45e4000}, {0xc45e6000}, + {0xc45e8000}, {0xc45ea000}, {0xc45ec000}, {0xc45ee000}, + {0xc45f0000}, {0xc45f2000}, {0xc45f4000}, {0xc45f6000}, + {0xc45f8000}, {0xc45fa000}, {0xc45fc000}, {0xc45fe000}, + {0xc4600000}, {0xc4602000}, {0xc4604000}, {0xc4606000}, + {0xc4608000}, {0xc460a000}, {0xc460c000}, {0xc460e000}, + {0xc4610000}, {0xc4612000}, {0xc4614000}, {0xc4616000}, + {0xc4618000}, {0xc461a000}, {0xc461c000}, {0xc461e000}, + {0xc4620000}, {0xc4622000}, {0xc4624000}, {0xc4626000}, + {0xc4628000}, {0xc462a000}, {0xc462c000}, {0xc462e000}, + {0xc4630000}, {0xc4632000}, {0xc4634000}, {0xc4636000}, + {0xc4638000}, {0xc463a000}, {0xc463c000}, {0xc463e000}, + {0xc4640000}, {0xc4642000}, {0xc4644000}, {0xc4646000}, + {0xc4648000}, {0xc464a000}, {0xc464c000}, {0xc464e000}, + {0xc4650000}, {0xc4652000}, {0xc4654000}, {0xc4656000}, + {0xc4658000}, {0xc465a000}, {0xc465c000}, {0xc465e000}, + {0xc4660000}, {0xc4662000}, {0xc4664000}, {0xc4666000}, + {0xc4668000}, {0xc466a000}, {0xc466c000}, {0xc466e000}, + {0xc4670000}, {0xc4672000}, {0xc4674000}, {0xc4676000}, + {0xc4678000}, {0xc467a000}, {0xc467c000}, {0xc467e000}, + {0xc4680000}, {0xc4682000}, {0xc4684000}, {0xc4686000}, + {0xc4688000}, {0xc468a000}, {0xc468c000}, {0xc468e000}, + {0xc4690000}, {0xc4692000}, {0xc4694000}, {0xc4696000}, + {0xc4698000}, {0xc469a000}, {0xc469c000}, {0xc469e000}, + {0xc46a0000}, {0xc46a2000}, {0xc46a4000}, {0xc46a6000}, + {0xc46a8000}, {0xc46aa000}, {0xc46ac000}, {0xc46ae000}, + {0xc46b0000}, {0xc46b2000}, {0xc46b4000}, {0xc46b6000}, + {0xc46b8000}, {0xc46ba000}, {0xc46bc000}, {0xc46be000}, + {0xc46c0000}, {0xc46c2000}, {0xc46c4000}, {0xc46c6000}, + {0xc46c8000}, {0xc46ca000}, {0xc46cc000}, {0xc46ce000}, + {0xc46d0000}, {0xc46d2000}, {0xc46d4000}, {0xc46d6000}, + {0xc46d8000}, {0xc46da000}, {0xc46dc000}, {0xc46de000}, + {0xc46e0000}, {0xc46e2000}, {0xc46e4000}, {0xc46e6000}, + {0xc46e8000}, {0xc46ea000}, {0xc46ec000}, {0xc46ee000}, + {0xc46f0000}, {0xc46f2000}, {0xc46f4000}, {0xc46f6000}, + {0xc46f8000}, {0xc46fa000}, {0xc46fc000}, {0xc46fe000}, + {0xc4700000}, {0xc4702000}, {0xc4704000}, {0xc4706000}, + {0xc4708000}, {0xc470a000}, {0xc470c000}, {0xc470e000}, + {0xc4710000}, {0xc4712000}, {0xc4714000}, {0xc4716000}, + {0xc4718000}, {0xc471a000}, {0xc471c000}, {0xc471e000}, + {0xc4720000}, {0xc4722000}, {0xc4724000}, {0xc4726000}, + {0xc4728000}, {0xc472a000}, {0xc472c000}, {0xc472e000}, + {0xc4730000}, {0xc4732000}, {0xc4734000}, {0xc4736000}, + {0xc4738000}, {0xc473a000}, {0xc473c000}, {0xc473e000}, + {0xc4740000}, {0xc4742000}, {0xc4744000}, {0xc4746000}, + {0xc4748000}, {0xc474a000}, {0xc474c000}, {0xc474e000}, + {0xc4750000}, {0xc4752000}, {0xc4754000}, {0xc4756000}, + {0xc4758000}, {0xc475a000}, {0xc475c000}, {0xc475e000}, + {0xc4760000}, {0xc4762000}, {0xc4764000}, {0xc4766000}, + {0xc4768000}, {0xc476a000}, {0xc476c000}, {0xc476e000}, + {0xc4770000}, {0xc4772000}, {0xc4774000}, {0xc4776000}, + {0xc4778000}, {0xc477a000}, {0xc477c000}, {0xc477e000}, + {0xc4780000}, {0xc4782000}, {0xc4784000}, {0xc4786000}, + {0xc4788000}, {0xc478a000}, {0xc478c000}, {0xc478e000}, + {0xc4790000}, {0xc4792000}, {0xc4794000}, {0xc4796000}, + {0xc4798000}, {0xc479a000}, {0xc479c000}, {0xc479e000}, + {0xc47a0000}, {0xc47a2000}, {0xc47a4000}, {0xc47a6000}, + {0xc47a8000}, {0xc47aa000}, {0xc47ac000}, {0xc47ae000}, + {0xc47b0000}, {0xc47b2000}, {0xc47b4000}, {0xc47b6000}, + {0xc47b8000}, {0xc47ba000}, {0xc47bc000}, {0xc47be000}, + {0xc47c0000}, {0xc47c2000}, {0xc47c4000}, {0xc47c6000}, + {0xc47c8000}, {0xc47ca000}, {0xc47cc000}, {0xc47ce000}, + {0xc47d0000}, {0xc47d2000}, {0xc47d4000}, {0xc47d6000}, + {0xc47d8000}, {0xc47da000}, {0xc47dc000}, {0xc47de000}, + {0xc47e0000}, {0xc47e2000}, {0xc47e4000}, {0xc47e6000}, + {0xc47e8000}, {0xc47ea000}, {0xc47ec000}, {0xc47ee000}, + {0xc47f0000}, {0xc47f2000}, {0xc47f4000}, {0xc47f6000}, + {0xc47f8000}, {0xc47fa000}, {0xc47fc000}, {0xc47fe000}, + {0xc4800000}, {0xc4802000}, {0xc4804000}, {0xc4806000}, + {0xc4808000}, {0xc480a000}, {0xc480c000}, {0xc480e000}, + {0xc4810000}, {0xc4812000}, {0xc4814000}, {0xc4816000}, + {0xc4818000}, {0xc481a000}, {0xc481c000}, {0xc481e000}, + {0xc4820000}, {0xc4822000}, {0xc4824000}, {0xc4826000}, + {0xc4828000}, {0xc482a000}, {0xc482c000}, {0xc482e000}, + {0xc4830000}, {0xc4832000}, {0xc4834000}, {0xc4836000}, + {0xc4838000}, {0xc483a000}, {0xc483c000}, {0xc483e000}, + {0xc4840000}, {0xc4842000}, {0xc4844000}, {0xc4846000}, + {0xc4848000}, {0xc484a000}, {0xc484c000}, {0xc484e000}, + {0xc4850000}, {0xc4852000}, {0xc4854000}, {0xc4856000}, + {0xc4858000}, {0xc485a000}, {0xc485c000}, {0xc485e000}, + {0xc4860000}, {0xc4862000}, {0xc4864000}, {0xc4866000}, + {0xc4868000}, {0xc486a000}, {0xc486c000}, {0xc486e000}, + {0xc4870000}, {0xc4872000}, {0xc4874000}, {0xc4876000}, + {0xc4878000}, {0xc487a000}, {0xc487c000}, {0xc487e000}, + {0xc4880000}, {0xc4882000}, {0xc4884000}, {0xc4886000}, + {0xc4888000}, {0xc488a000}, {0xc488c000}, {0xc488e000}, + {0xc4890000}, {0xc4892000}, {0xc4894000}, {0xc4896000}, + {0xc4898000}, {0xc489a000}, {0xc489c000}, {0xc489e000}, + {0xc48a0000}, {0xc48a2000}, {0xc48a4000}, {0xc48a6000}, + {0xc48a8000}, {0xc48aa000}, {0xc48ac000}, {0xc48ae000}, + {0xc48b0000}, {0xc48b2000}, {0xc48b4000}, {0xc48b6000}, + {0xc48b8000}, {0xc48ba000}, {0xc48bc000}, {0xc48be000}, + {0xc48c0000}, {0xc48c2000}, {0xc48c4000}, {0xc48c6000}, + {0xc48c8000}, {0xc48ca000}, {0xc48cc000}, {0xc48ce000}, + {0xc48d0000}, {0xc48d2000}, {0xc48d4000}, {0xc48d6000}, + {0xc48d8000}, {0xc48da000}, {0xc48dc000}, {0xc48de000}, + {0xc48e0000}, {0xc48e2000}, {0xc48e4000}, {0xc48e6000}, + {0xc48e8000}, {0xc48ea000}, {0xc48ec000}, {0xc48ee000}, + {0xc48f0000}, {0xc48f2000}, {0xc48f4000}, {0xc48f6000}, + {0xc48f8000}, {0xc48fa000}, {0xc48fc000}, {0xc48fe000}, + {0xc4900000}, {0xc4902000}, {0xc4904000}, {0xc4906000}, + {0xc4908000}, {0xc490a000}, {0xc490c000}, {0xc490e000}, + {0xc4910000}, {0xc4912000}, {0xc4914000}, {0xc4916000}, + {0xc4918000}, {0xc491a000}, {0xc491c000}, {0xc491e000}, + {0xc4920000}, {0xc4922000}, {0xc4924000}, {0xc4926000}, + {0xc4928000}, {0xc492a000}, {0xc492c000}, {0xc492e000}, + {0xc4930000}, {0xc4932000}, {0xc4934000}, {0xc4936000}, + {0xc4938000}, {0xc493a000}, {0xc493c000}, {0xc493e000}, + {0xc4940000}, {0xc4942000}, {0xc4944000}, {0xc4946000}, + {0xc4948000}, {0xc494a000}, {0xc494c000}, {0xc494e000}, + {0xc4950000}, {0xc4952000}, {0xc4954000}, {0xc4956000}, + {0xc4958000}, {0xc495a000}, {0xc495c000}, {0xc495e000}, + {0xc4960000}, {0xc4962000}, {0xc4964000}, {0xc4966000}, + {0xc4968000}, {0xc496a000}, {0xc496c000}, {0xc496e000}, + {0xc4970000}, {0xc4972000}, {0xc4974000}, {0xc4976000}, + {0xc4978000}, {0xc497a000}, {0xc497c000}, {0xc497e000}, + {0xc4980000}, {0xc4982000}, {0xc4984000}, {0xc4986000}, + {0xc4988000}, {0xc498a000}, {0xc498c000}, {0xc498e000}, + {0xc4990000}, {0xc4992000}, {0xc4994000}, {0xc4996000}, + {0xc4998000}, {0xc499a000}, {0xc499c000}, {0xc499e000}, + {0xc49a0000}, {0xc49a2000}, {0xc49a4000}, {0xc49a6000}, + {0xc49a8000}, {0xc49aa000}, {0xc49ac000}, {0xc49ae000}, + {0xc49b0000}, {0xc49b2000}, {0xc49b4000}, {0xc49b6000}, + {0xc49b8000}, {0xc49ba000}, {0xc49bc000}, {0xc49be000}, + {0xc49c0000}, {0xc49c2000}, {0xc49c4000}, {0xc49c6000}, + {0xc49c8000}, {0xc49ca000}, {0xc49cc000}, {0xc49ce000}, + {0xc49d0000}, {0xc49d2000}, {0xc49d4000}, {0xc49d6000}, + {0xc49d8000}, {0xc49da000}, {0xc49dc000}, {0xc49de000}, + {0xc49e0000}, {0xc49e2000}, {0xc49e4000}, {0xc49e6000}, + {0xc49e8000}, {0xc49ea000}, {0xc49ec000}, {0xc49ee000}, + {0xc49f0000}, {0xc49f2000}, {0xc49f4000}, {0xc49f6000}, + {0xc49f8000}, {0xc49fa000}, {0xc49fc000}, {0xc49fe000}, + {0xc4a00000}, {0xc4a02000}, {0xc4a04000}, {0xc4a06000}, + {0xc4a08000}, {0xc4a0a000}, {0xc4a0c000}, {0xc4a0e000}, + {0xc4a10000}, {0xc4a12000}, {0xc4a14000}, {0xc4a16000}, + {0xc4a18000}, {0xc4a1a000}, {0xc4a1c000}, {0xc4a1e000}, + {0xc4a20000}, {0xc4a22000}, {0xc4a24000}, {0xc4a26000}, + {0xc4a28000}, {0xc4a2a000}, {0xc4a2c000}, {0xc4a2e000}, + {0xc4a30000}, {0xc4a32000}, {0xc4a34000}, {0xc4a36000}, + {0xc4a38000}, {0xc4a3a000}, {0xc4a3c000}, {0xc4a3e000}, + {0xc4a40000}, {0xc4a42000}, {0xc4a44000}, {0xc4a46000}, + {0xc4a48000}, {0xc4a4a000}, {0xc4a4c000}, {0xc4a4e000}, + {0xc4a50000}, {0xc4a52000}, {0xc4a54000}, {0xc4a56000}, + {0xc4a58000}, {0xc4a5a000}, {0xc4a5c000}, {0xc4a5e000}, + {0xc4a60000}, {0xc4a62000}, {0xc4a64000}, {0xc4a66000}, + {0xc4a68000}, {0xc4a6a000}, {0xc4a6c000}, {0xc4a6e000}, + {0xc4a70000}, {0xc4a72000}, {0xc4a74000}, {0xc4a76000}, + {0xc4a78000}, {0xc4a7a000}, {0xc4a7c000}, {0xc4a7e000}, + {0xc4a80000}, {0xc4a82000}, {0xc4a84000}, {0xc4a86000}, + {0xc4a88000}, {0xc4a8a000}, {0xc4a8c000}, {0xc4a8e000}, + {0xc4a90000}, {0xc4a92000}, {0xc4a94000}, {0xc4a96000}, + {0xc4a98000}, {0xc4a9a000}, {0xc4a9c000}, {0xc4a9e000}, + {0xc4aa0000}, {0xc4aa2000}, {0xc4aa4000}, {0xc4aa6000}, + {0xc4aa8000}, {0xc4aaa000}, {0xc4aac000}, {0xc4aae000}, + {0xc4ab0000}, {0xc4ab2000}, {0xc4ab4000}, {0xc4ab6000}, + {0xc4ab8000}, {0xc4aba000}, {0xc4abc000}, {0xc4abe000}, + {0xc4ac0000}, {0xc4ac2000}, {0xc4ac4000}, {0xc4ac6000}, + {0xc4ac8000}, {0xc4aca000}, {0xc4acc000}, {0xc4ace000}, + {0xc4ad0000}, {0xc4ad2000}, {0xc4ad4000}, {0xc4ad6000}, + {0xc4ad8000}, {0xc4ada000}, {0xc4adc000}, {0xc4ade000}, + {0xc4ae0000}, {0xc4ae2000}, {0xc4ae4000}, {0xc4ae6000}, + {0xc4ae8000}, {0xc4aea000}, {0xc4aec000}, {0xc4aee000}, + {0xc4af0000}, {0xc4af2000}, {0xc4af4000}, {0xc4af6000}, + {0xc4af8000}, {0xc4afa000}, {0xc4afc000}, {0xc4afe000}, + {0xc4b00000}, {0xc4b02000}, {0xc4b04000}, {0xc4b06000}, + {0xc4b08000}, {0xc4b0a000}, {0xc4b0c000}, {0xc4b0e000}, + {0xc4b10000}, {0xc4b12000}, {0xc4b14000}, {0xc4b16000}, + {0xc4b18000}, {0xc4b1a000}, {0xc4b1c000}, {0xc4b1e000}, + {0xc4b20000}, {0xc4b22000}, {0xc4b24000}, {0xc4b26000}, + {0xc4b28000}, {0xc4b2a000}, {0xc4b2c000}, {0xc4b2e000}, + {0xc4b30000}, {0xc4b32000}, {0xc4b34000}, {0xc4b36000}, + {0xc4b38000}, {0xc4b3a000}, {0xc4b3c000}, {0xc4b3e000}, + {0xc4b40000}, {0xc4b42000}, {0xc4b44000}, {0xc4b46000}, + {0xc4b48000}, {0xc4b4a000}, {0xc4b4c000}, {0xc4b4e000}, + {0xc4b50000}, {0xc4b52000}, {0xc4b54000}, {0xc4b56000}, + {0xc4b58000}, {0xc4b5a000}, {0xc4b5c000}, {0xc4b5e000}, + {0xc4b60000}, {0xc4b62000}, {0xc4b64000}, {0xc4b66000}, + {0xc4b68000}, {0xc4b6a000}, {0xc4b6c000}, {0xc4b6e000}, + {0xc4b70000}, {0xc4b72000}, {0xc4b74000}, {0xc4b76000}, + {0xc4b78000}, {0xc4b7a000}, {0xc4b7c000}, {0xc4b7e000}, + {0xc4b80000}, {0xc4b82000}, {0xc4b84000}, {0xc4b86000}, + {0xc4b88000}, {0xc4b8a000}, {0xc4b8c000}, {0xc4b8e000}, + {0xc4b90000}, {0xc4b92000}, {0xc4b94000}, {0xc4b96000}, + {0xc4b98000}, {0xc4b9a000}, {0xc4b9c000}, {0xc4b9e000}, + {0xc4ba0000}, {0xc4ba2000}, {0xc4ba4000}, {0xc4ba6000}, + {0xc4ba8000}, {0xc4baa000}, {0xc4bac000}, {0xc4bae000}, + {0xc4bb0000}, {0xc4bb2000}, {0xc4bb4000}, {0xc4bb6000}, + {0xc4bb8000}, {0xc4bba000}, {0xc4bbc000}, {0xc4bbe000}, + {0xc4bc0000}, {0xc4bc2000}, {0xc4bc4000}, {0xc4bc6000}, + {0xc4bc8000}, {0xc4bca000}, {0xc4bcc000}, {0xc4bce000}, + {0xc4bd0000}, {0xc4bd2000}, {0xc4bd4000}, {0xc4bd6000}, + {0xc4bd8000}, {0xc4bda000}, {0xc4bdc000}, {0xc4bde000}, + {0xc4be0000}, {0xc4be2000}, {0xc4be4000}, {0xc4be6000}, + {0xc4be8000}, {0xc4bea000}, {0xc4bec000}, {0xc4bee000}, + {0xc4bf0000}, {0xc4bf2000}, {0xc4bf4000}, {0xc4bf6000}, + {0xc4bf8000}, {0xc4bfa000}, {0xc4bfc000}, {0xc4bfe000}, + {0xc4c00000}, {0xc4c02000}, {0xc4c04000}, {0xc4c06000}, + {0xc4c08000}, {0xc4c0a000}, {0xc4c0c000}, {0xc4c0e000}, + {0xc4c10000}, {0xc4c12000}, {0xc4c14000}, {0xc4c16000}, + {0xc4c18000}, {0xc4c1a000}, {0xc4c1c000}, {0xc4c1e000}, + {0xc4c20000}, {0xc4c22000}, {0xc4c24000}, {0xc4c26000}, + {0xc4c28000}, {0xc4c2a000}, {0xc4c2c000}, {0xc4c2e000}, + {0xc4c30000}, {0xc4c32000}, {0xc4c34000}, {0xc4c36000}, + {0xc4c38000}, {0xc4c3a000}, {0xc4c3c000}, {0xc4c3e000}, + {0xc4c40000}, {0xc4c42000}, {0xc4c44000}, {0xc4c46000}, + {0xc4c48000}, {0xc4c4a000}, {0xc4c4c000}, {0xc4c4e000}, + {0xc4c50000}, {0xc4c52000}, {0xc4c54000}, {0xc4c56000}, + {0xc4c58000}, {0xc4c5a000}, {0xc4c5c000}, {0xc4c5e000}, + {0xc4c60000}, {0xc4c62000}, {0xc4c64000}, {0xc4c66000}, + {0xc4c68000}, {0xc4c6a000}, {0xc4c6c000}, {0xc4c6e000}, + {0xc4c70000}, {0xc4c72000}, {0xc4c74000}, {0xc4c76000}, + {0xc4c78000}, {0xc4c7a000}, {0xc4c7c000}, {0xc4c7e000}, + {0xc4c80000}, {0xc4c82000}, {0xc4c84000}, {0xc4c86000}, + {0xc4c88000}, {0xc4c8a000}, {0xc4c8c000}, {0xc4c8e000}, + {0xc4c90000}, {0xc4c92000}, {0xc4c94000}, {0xc4c96000}, + {0xc4c98000}, {0xc4c9a000}, {0xc4c9c000}, {0xc4c9e000}, + {0xc4ca0000}, {0xc4ca2000}, {0xc4ca4000}, {0xc4ca6000}, + {0xc4ca8000}, {0xc4caa000}, {0xc4cac000}, {0xc4cae000}, + {0xc4cb0000}, {0xc4cb2000}, {0xc4cb4000}, {0xc4cb6000}, + {0xc4cb8000}, {0xc4cba000}, {0xc4cbc000}, {0xc4cbe000}, + {0xc4cc0000}, {0xc4cc2000}, {0xc4cc4000}, {0xc4cc6000}, + {0xc4cc8000}, {0xc4cca000}, {0xc4ccc000}, {0xc4cce000}, + {0xc4cd0000}, {0xc4cd2000}, {0xc4cd4000}, {0xc4cd6000}, + {0xc4cd8000}, {0xc4cda000}, {0xc4cdc000}, {0xc4cde000}, + {0xc4ce0000}, {0xc4ce2000}, {0xc4ce4000}, {0xc4ce6000}, + {0xc4ce8000}, {0xc4cea000}, {0xc4cec000}, {0xc4cee000}, + {0xc4cf0000}, {0xc4cf2000}, {0xc4cf4000}, {0xc4cf6000}, + {0xc4cf8000}, {0xc4cfa000}, {0xc4cfc000}, {0xc4cfe000}, + {0xc4d00000}, {0xc4d02000}, {0xc4d04000}, {0xc4d06000}, + {0xc4d08000}, {0xc4d0a000}, {0xc4d0c000}, {0xc4d0e000}, + {0xc4d10000}, {0xc4d12000}, {0xc4d14000}, {0xc4d16000}, + {0xc4d18000}, {0xc4d1a000}, {0xc4d1c000}, {0xc4d1e000}, + {0xc4d20000}, {0xc4d22000}, {0xc4d24000}, {0xc4d26000}, + {0xc4d28000}, {0xc4d2a000}, {0xc4d2c000}, {0xc4d2e000}, + {0xc4d30000}, {0xc4d32000}, {0xc4d34000}, {0xc4d36000}, + {0xc4d38000}, {0xc4d3a000}, {0xc4d3c000}, {0xc4d3e000}, + {0xc4d40000}, {0xc4d42000}, {0xc4d44000}, {0xc4d46000}, + {0xc4d48000}, {0xc4d4a000}, {0xc4d4c000}, {0xc4d4e000}, + {0xc4d50000}, {0xc4d52000}, {0xc4d54000}, {0xc4d56000}, + {0xc4d58000}, {0xc4d5a000}, {0xc4d5c000}, {0xc4d5e000}, + {0xc4d60000}, {0xc4d62000}, {0xc4d64000}, {0xc4d66000}, + {0xc4d68000}, {0xc4d6a000}, {0xc4d6c000}, {0xc4d6e000}, + {0xc4d70000}, {0xc4d72000}, {0xc4d74000}, {0xc4d76000}, + {0xc4d78000}, {0xc4d7a000}, {0xc4d7c000}, {0xc4d7e000}, + {0xc4d80000}, {0xc4d82000}, {0xc4d84000}, {0xc4d86000}, + {0xc4d88000}, {0xc4d8a000}, {0xc4d8c000}, {0xc4d8e000}, + {0xc4d90000}, {0xc4d92000}, {0xc4d94000}, {0xc4d96000}, + {0xc4d98000}, {0xc4d9a000}, {0xc4d9c000}, {0xc4d9e000}, + {0xc4da0000}, {0xc4da2000}, {0xc4da4000}, {0xc4da6000}, + {0xc4da8000}, {0xc4daa000}, {0xc4dac000}, {0xc4dae000}, + {0xc4db0000}, {0xc4db2000}, {0xc4db4000}, {0xc4db6000}, + {0xc4db8000}, {0xc4dba000}, {0xc4dbc000}, {0xc4dbe000}, + {0xc4dc0000}, {0xc4dc2000}, {0xc4dc4000}, {0xc4dc6000}, + {0xc4dc8000}, {0xc4dca000}, {0xc4dcc000}, {0xc4dce000}, + {0xc4dd0000}, {0xc4dd2000}, {0xc4dd4000}, {0xc4dd6000}, + {0xc4dd8000}, {0xc4dda000}, {0xc4ddc000}, {0xc4dde000}, + {0xc4de0000}, {0xc4de2000}, {0xc4de4000}, {0xc4de6000}, + {0xc4de8000}, {0xc4dea000}, {0xc4dec000}, {0xc4dee000}, + {0xc4df0000}, {0xc4df2000}, {0xc4df4000}, {0xc4df6000}, + {0xc4df8000}, {0xc4dfa000}, {0xc4dfc000}, {0xc4dfe000}, + {0xc4e00000}, {0xc4e02000}, {0xc4e04000}, {0xc4e06000}, + {0xc4e08000}, {0xc4e0a000}, {0xc4e0c000}, {0xc4e0e000}, + {0xc4e10000}, {0xc4e12000}, {0xc4e14000}, {0xc4e16000}, + {0xc4e18000}, {0xc4e1a000}, {0xc4e1c000}, {0xc4e1e000}, + {0xc4e20000}, {0xc4e22000}, {0xc4e24000}, {0xc4e26000}, + {0xc4e28000}, {0xc4e2a000}, {0xc4e2c000}, {0xc4e2e000}, + {0xc4e30000}, {0xc4e32000}, {0xc4e34000}, {0xc4e36000}, + {0xc4e38000}, {0xc4e3a000}, {0xc4e3c000}, {0xc4e3e000}, + {0xc4e40000}, {0xc4e42000}, {0xc4e44000}, {0xc4e46000}, + {0xc4e48000}, {0xc4e4a000}, {0xc4e4c000}, {0xc4e4e000}, + {0xc4e50000}, {0xc4e52000}, {0xc4e54000}, {0xc4e56000}, + {0xc4e58000}, {0xc4e5a000}, {0xc4e5c000}, {0xc4e5e000}, + {0xc4e60000}, {0xc4e62000}, {0xc4e64000}, {0xc4e66000}, + {0xc4e68000}, {0xc4e6a000}, {0xc4e6c000}, {0xc4e6e000}, + {0xc4e70000}, {0xc4e72000}, {0xc4e74000}, {0xc4e76000}, + {0xc4e78000}, {0xc4e7a000}, {0xc4e7c000}, {0xc4e7e000}, + {0xc4e80000}, {0xc4e82000}, {0xc4e84000}, {0xc4e86000}, + {0xc4e88000}, {0xc4e8a000}, {0xc4e8c000}, {0xc4e8e000}, + {0xc4e90000}, {0xc4e92000}, {0xc4e94000}, {0xc4e96000}, + {0xc4e98000}, {0xc4e9a000}, {0xc4e9c000}, {0xc4e9e000}, + {0xc4ea0000}, {0xc4ea2000}, {0xc4ea4000}, {0xc4ea6000}, + {0xc4ea8000}, {0xc4eaa000}, {0xc4eac000}, {0xc4eae000}, + {0xc4eb0000}, {0xc4eb2000}, {0xc4eb4000}, {0xc4eb6000}, + {0xc4eb8000}, {0xc4eba000}, {0xc4ebc000}, {0xc4ebe000}, + {0xc4ec0000}, {0xc4ec2000}, {0xc4ec4000}, {0xc4ec6000}, + {0xc4ec8000}, {0xc4eca000}, {0xc4ecc000}, {0xc4ece000}, + {0xc4ed0000}, {0xc4ed2000}, {0xc4ed4000}, {0xc4ed6000}, + {0xc4ed8000}, {0xc4eda000}, {0xc4edc000}, {0xc4ede000}, + {0xc4ee0000}, {0xc4ee2000}, {0xc4ee4000}, {0xc4ee6000}, + {0xc4ee8000}, {0xc4eea000}, {0xc4eec000}, {0xc4eee000}, + {0xc4ef0000}, {0xc4ef2000}, {0xc4ef4000}, {0xc4ef6000}, + {0xc4ef8000}, {0xc4efa000}, {0xc4efc000}, {0xc4efe000}, + {0xc4f00000}, {0xc4f02000}, {0xc4f04000}, {0xc4f06000}, + {0xc4f08000}, {0xc4f0a000}, {0xc4f0c000}, {0xc4f0e000}, + {0xc4f10000}, {0xc4f12000}, {0xc4f14000}, {0xc4f16000}, + {0xc4f18000}, {0xc4f1a000}, {0xc4f1c000}, {0xc4f1e000}, + {0xc4f20000}, {0xc4f22000}, {0xc4f24000}, {0xc4f26000}, + {0xc4f28000}, {0xc4f2a000}, {0xc4f2c000}, {0xc4f2e000}, + {0xc4f30000}, {0xc4f32000}, {0xc4f34000}, {0xc4f36000}, + {0xc4f38000}, {0xc4f3a000}, {0xc4f3c000}, {0xc4f3e000}, + {0xc4f40000}, {0xc4f42000}, {0xc4f44000}, {0xc4f46000}, + {0xc4f48000}, {0xc4f4a000}, {0xc4f4c000}, {0xc4f4e000}, + {0xc4f50000}, {0xc4f52000}, {0xc4f54000}, {0xc4f56000}, + {0xc4f58000}, {0xc4f5a000}, {0xc4f5c000}, {0xc4f5e000}, + {0xc4f60000}, {0xc4f62000}, {0xc4f64000}, {0xc4f66000}, + {0xc4f68000}, {0xc4f6a000}, {0xc4f6c000}, {0xc4f6e000}, + {0xc4f70000}, {0xc4f72000}, {0xc4f74000}, {0xc4f76000}, + {0xc4f78000}, {0xc4f7a000}, {0xc4f7c000}, {0xc4f7e000}, + {0xc4f80000}, {0xc4f82000}, {0xc4f84000}, {0xc4f86000}, + {0xc4f88000}, {0xc4f8a000}, {0xc4f8c000}, {0xc4f8e000}, + {0xc4f90000}, {0xc4f92000}, {0xc4f94000}, {0xc4f96000}, + {0xc4f98000}, {0xc4f9a000}, {0xc4f9c000}, {0xc4f9e000}, + {0xc4fa0000}, {0xc4fa2000}, {0xc4fa4000}, {0xc4fa6000}, + {0xc4fa8000}, {0xc4faa000}, {0xc4fac000}, {0xc4fae000}, + {0xc4fb0000}, {0xc4fb2000}, {0xc4fb4000}, {0xc4fb6000}, + {0xc4fb8000}, {0xc4fba000}, {0xc4fbc000}, {0xc4fbe000}, + {0xc4fc0000}, {0xc4fc2000}, {0xc4fc4000}, {0xc4fc6000}, + {0xc4fc8000}, {0xc4fca000}, {0xc4fcc000}, {0xc4fce000}, + {0xc4fd0000}, {0xc4fd2000}, {0xc4fd4000}, {0xc4fd6000}, + {0xc4fd8000}, {0xc4fda000}, {0xc4fdc000}, {0xc4fde000}, + {0xc4fe0000}, {0xc4fe2000}, {0xc4fe4000}, {0xc4fe6000}, + {0xc4fe8000}, {0xc4fea000}, {0xc4fec000}, {0xc4fee000}, + {0xc4ff0000}, {0xc4ff2000}, {0xc4ff4000}, {0xc4ff6000}, + {0xc4ff8000}, {0xc4ffa000}, {0xc4ffc000}, {0xc4ffe000}, + {0xc5000000}, {0xc5002000}, {0xc5004000}, {0xc5006000}, + {0xc5008000}, {0xc500a000}, {0xc500c000}, {0xc500e000}, + {0xc5010000}, {0xc5012000}, {0xc5014000}, {0xc5016000}, + {0xc5018000}, {0xc501a000}, {0xc501c000}, {0xc501e000}, + {0xc5020000}, {0xc5022000}, {0xc5024000}, {0xc5026000}, + {0xc5028000}, {0xc502a000}, {0xc502c000}, {0xc502e000}, + {0xc5030000}, {0xc5032000}, {0xc5034000}, {0xc5036000}, + {0xc5038000}, {0xc503a000}, {0xc503c000}, {0xc503e000}, + {0xc5040000}, {0xc5042000}, {0xc5044000}, {0xc5046000}, + {0xc5048000}, {0xc504a000}, {0xc504c000}, {0xc504e000}, + {0xc5050000}, {0xc5052000}, {0xc5054000}, {0xc5056000}, + {0xc5058000}, {0xc505a000}, {0xc505c000}, {0xc505e000}, + {0xc5060000}, {0xc5062000}, {0xc5064000}, {0xc5066000}, + {0xc5068000}, {0xc506a000}, {0xc506c000}, {0xc506e000}, + {0xc5070000}, {0xc5072000}, {0xc5074000}, {0xc5076000}, + {0xc5078000}, {0xc507a000}, {0xc507c000}, {0xc507e000}, + {0xc5080000}, {0xc5082000}, {0xc5084000}, {0xc5086000}, + {0xc5088000}, {0xc508a000}, {0xc508c000}, {0xc508e000}, + {0xc5090000}, {0xc5092000}, {0xc5094000}, {0xc5096000}, + {0xc5098000}, {0xc509a000}, {0xc509c000}, {0xc509e000}, + {0xc50a0000}, {0xc50a2000}, {0xc50a4000}, {0xc50a6000}, + {0xc50a8000}, {0xc50aa000}, {0xc50ac000}, {0xc50ae000}, + {0xc50b0000}, {0xc50b2000}, {0xc50b4000}, {0xc50b6000}, + {0xc50b8000}, {0xc50ba000}, {0xc50bc000}, {0xc50be000}, + {0xc50c0000}, {0xc50c2000}, {0xc50c4000}, {0xc50c6000}, + {0xc50c8000}, {0xc50ca000}, {0xc50cc000}, {0xc50ce000}, + {0xc50d0000}, {0xc50d2000}, {0xc50d4000}, {0xc50d6000}, + {0xc50d8000}, {0xc50da000}, {0xc50dc000}, {0xc50de000}, + {0xc50e0000}, {0xc50e2000}, {0xc50e4000}, {0xc50e6000}, + {0xc50e8000}, {0xc50ea000}, {0xc50ec000}, {0xc50ee000}, + {0xc50f0000}, {0xc50f2000}, {0xc50f4000}, {0xc50f6000}, + {0xc50f8000}, {0xc50fa000}, {0xc50fc000}, {0xc50fe000}, + {0xc5100000}, {0xc5102000}, {0xc5104000}, {0xc5106000}, + {0xc5108000}, {0xc510a000}, {0xc510c000}, {0xc510e000}, + {0xc5110000}, {0xc5112000}, {0xc5114000}, {0xc5116000}, + {0xc5118000}, {0xc511a000}, {0xc511c000}, {0xc511e000}, + {0xc5120000}, {0xc5122000}, {0xc5124000}, {0xc5126000}, + {0xc5128000}, {0xc512a000}, {0xc512c000}, {0xc512e000}, + {0xc5130000}, {0xc5132000}, {0xc5134000}, {0xc5136000}, + {0xc5138000}, {0xc513a000}, {0xc513c000}, {0xc513e000}, + {0xc5140000}, {0xc5142000}, {0xc5144000}, {0xc5146000}, + {0xc5148000}, {0xc514a000}, {0xc514c000}, {0xc514e000}, + {0xc5150000}, {0xc5152000}, {0xc5154000}, {0xc5156000}, + {0xc5158000}, {0xc515a000}, {0xc515c000}, {0xc515e000}, + {0xc5160000}, {0xc5162000}, {0xc5164000}, {0xc5166000}, + {0xc5168000}, {0xc516a000}, {0xc516c000}, {0xc516e000}, + {0xc5170000}, {0xc5172000}, {0xc5174000}, {0xc5176000}, + {0xc5178000}, {0xc517a000}, {0xc517c000}, {0xc517e000}, + {0xc5180000}, {0xc5182000}, {0xc5184000}, {0xc5186000}, + {0xc5188000}, {0xc518a000}, {0xc518c000}, {0xc518e000}, + {0xc5190000}, {0xc5192000}, {0xc5194000}, {0xc5196000}, + {0xc5198000}, {0xc519a000}, {0xc519c000}, {0xc519e000}, + {0xc51a0000}, {0xc51a2000}, {0xc51a4000}, {0xc51a6000}, + {0xc51a8000}, {0xc51aa000}, {0xc51ac000}, {0xc51ae000}, + {0xc51b0000}, {0xc51b2000}, {0xc51b4000}, {0xc51b6000}, + {0xc51b8000}, {0xc51ba000}, {0xc51bc000}, {0xc51be000}, + {0xc51c0000}, {0xc51c2000}, {0xc51c4000}, {0xc51c6000}, + {0xc51c8000}, {0xc51ca000}, {0xc51cc000}, {0xc51ce000}, + {0xc51d0000}, {0xc51d2000}, {0xc51d4000}, {0xc51d6000}, + {0xc51d8000}, {0xc51da000}, {0xc51dc000}, {0xc51de000}, + {0xc51e0000}, {0xc51e2000}, {0xc51e4000}, {0xc51e6000}, + {0xc51e8000}, {0xc51ea000}, {0xc51ec000}, {0xc51ee000}, + {0xc51f0000}, {0xc51f2000}, {0xc51f4000}, {0xc51f6000}, + {0xc51f8000}, {0xc51fa000}, {0xc51fc000}, {0xc51fe000}, + {0xc5200000}, {0xc5202000}, {0xc5204000}, {0xc5206000}, + {0xc5208000}, {0xc520a000}, {0xc520c000}, {0xc520e000}, + {0xc5210000}, {0xc5212000}, {0xc5214000}, {0xc5216000}, + {0xc5218000}, {0xc521a000}, {0xc521c000}, {0xc521e000}, + {0xc5220000}, {0xc5222000}, {0xc5224000}, {0xc5226000}, + {0xc5228000}, {0xc522a000}, {0xc522c000}, {0xc522e000}, + {0xc5230000}, {0xc5232000}, {0xc5234000}, {0xc5236000}, + {0xc5238000}, {0xc523a000}, {0xc523c000}, {0xc523e000}, + {0xc5240000}, {0xc5242000}, {0xc5244000}, {0xc5246000}, + {0xc5248000}, {0xc524a000}, {0xc524c000}, {0xc524e000}, + {0xc5250000}, {0xc5252000}, {0xc5254000}, {0xc5256000}, + {0xc5258000}, {0xc525a000}, {0xc525c000}, {0xc525e000}, + {0xc5260000}, {0xc5262000}, {0xc5264000}, {0xc5266000}, + {0xc5268000}, {0xc526a000}, {0xc526c000}, {0xc526e000}, + {0xc5270000}, {0xc5272000}, {0xc5274000}, {0xc5276000}, + {0xc5278000}, {0xc527a000}, {0xc527c000}, {0xc527e000}, + {0xc5280000}, {0xc5282000}, {0xc5284000}, {0xc5286000}, + {0xc5288000}, {0xc528a000}, {0xc528c000}, {0xc528e000}, + {0xc5290000}, {0xc5292000}, {0xc5294000}, {0xc5296000}, + {0xc5298000}, {0xc529a000}, {0xc529c000}, {0xc529e000}, + {0xc52a0000}, {0xc52a2000}, {0xc52a4000}, {0xc52a6000}, + {0xc52a8000}, {0xc52aa000}, {0xc52ac000}, {0xc52ae000}, + {0xc52b0000}, {0xc52b2000}, {0xc52b4000}, {0xc52b6000}, + {0xc52b8000}, {0xc52ba000}, {0xc52bc000}, {0xc52be000}, + {0xc52c0000}, {0xc52c2000}, {0xc52c4000}, {0xc52c6000}, + {0xc52c8000}, {0xc52ca000}, {0xc52cc000}, {0xc52ce000}, + {0xc52d0000}, {0xc52d2000}, {0xc52d4000}, {0xc52d6000}, + {0xc52d8000}, {0xc52da000}, {0xc52dc000}, {0xc52de000}, + {0xc52e0000}, {0xc52e2000}, {0xc52e4000}, {0xc52e6000}, + {0xc52e8000}, {0xc52ea000}, {0xc52ec000}, {0xc52ee000}, + {0xc52f0000}, {0xc52f2000}, {0xc52f4000}, {0xc52f6000}, + {0xc52f8000}, {0xc52fa000}, {0xc52fc000}, {0xc52fe000}, + {0xc5300000}, {0xc5302000}, {0xc5304000}, {0xc5306000}, + {0xc5308000}, {0xc530a000}, {0xc530c000}, {0xc530e000}, + {0xc5310000}, {0xc5312000}, {0xc5314000}, {0xc5316000}, + {0xc5318000}, {0xc531a000}, {0xc531c000}, {0xc531e000}, + {0xc5320000}, {0xc5322000}, {0xc5324000}, {0xc5326000}, + {0xc5328000}, {0xc532a000}, {0xc532c000}, {0xc532e000}, + {0xc5330000}, {0xc5332000}, {0xc5334000}, {0xc5336000}, + {0xc5338000}, {0xc533a000}, {0xc533c000}, {0xc533e000}, + {0xc5340000}, {0xc5342000}, {0xc5344000}, {0xc5346000}, + {0xc5348000}, {0xc534a000}, {0xc534c000}, {0xc534e000}, + {0xc5350000}, {0xc5352000}, {0xc5354000}, {0xc5356000}, + {0xc5358000}, {0xc535a000}, {0xc535c000}, {0xc535e000}, + {0xc5360000}, {0xc5362000}, {0xc5364000}, {0xc5366000}, + {0xc5368000}, {0xc536a000}, {0xc536c000}, {0xc536e000}, + {0xc5370000}, {0xc5372000}, {0xc5374000}, {0xc5376000}, + {0xc5378000}, {0xc537a000}, {0xc537c000}, {0xc537e000}, + {0xc5380000}, {0xc5382000}, {0xc5384000}, {0xc5386000}, + {0xc5388000}, {0xc538a000}, {0xc538c000}, {0xc538e000}, + {0xc5390000}, {0xc5392000}, {0xc5394000}, {0xc5396000}, + {0xc5398000}, {0xc539a000}, {0xc539c000}, {0xc539e000}, + {0xc53a0000}, {0xc53a2000}, {0xc53a4000}, {0xc53a6000}, + {0xc53a8000}, {0xc53aa000}, {0xc53ac000}, {0xc53ae000}, + {0xc53b0000}, {0xc53b2000}, {0xc53b4000}, {0xc53b6000}, + {0xc53b8000}, {0xc53ba000}, {0xc53bc000}, {0xc53be000}, + {0xc53c0000}, {0xc53c2000}, {0xc53c4000}, {0xc53c6000}, + {0xc53c8000}, {0xc53ca000}, {0xc53cc000}, {0xc53ce000}, + {0xc53d0000}, {0xc53d2000}, {0xc53d4000}, {0xc53d6000}, + {0xc53d8000}, {0xc53da000}, {0xc53dc000}, {0xc53de000}, + {0xc53e0000}, {0xc53e2000}, {0xc53e4000}, {0xc53e6000}, + {0xc53e8000}, {0xc53ea000}, {0xc53ec000}, {0xc53ee000}, + {0xc53f0000}, {0xc53f2000}, {0xc53f4000}, {0xc53f6000}, + {0xc53f8000}, {0xc53fa000}, {0xc53fc000}, {0xc53fe000}, + {0xc5400000}, {0xc5402000}, {0xc5404000}, {0xc5406000}, + {0xc5408000}, {0xc540a000}, {0xc540c000}, {0xc540e000}, + {0xc5410000}, {0xc5412000}, {0xc5414000}, {0xc5416000}, + {0xc5418000}, {0xc541a000}, {0xc541c000}, {0xc541e000}, + {0xc5420000}, {0xc5422000}, {0xc5424000}, {0xc5426000}, + {0xc5428000}, {0xc542a000}, {0xc542c000}, {0xc542e000}, + {0xc5430000}, {0xc5432000}, {0xc5434000}, {0xc5436000}, + {0xc5438000}, {0xc543a000}, {0xc543c000}, {0xc543e000}, + {0xc5440000}, {0xc5442000}, {0xc5444000}, {0xc5446000}, + {0xc5448000}, {0xc544a000}, {0xc544c000}, {0xc544e000}, + {0xc5450000}, {0xc5452000}, {0xc5454000}, {0xc5456000}, + {0xc5458000}, {0xc545a000}, {0xc545c000}, {0xc545e000}, + {0xc5460000}, {0xc5462000}, {0xc5464000}, {0xc5466000}, + {0xc5468000}, {0xc546a000}, {0xc546c000}, {0xc546e000}, + {0xc5470000}, {0xc5472000}, {0xc5474000}, {0xc5476000}, + {0xc5478000}, {0xc547a000}, {0xc547c000}, {0xc547e000}, + {0xc5480000}, {0xc5482000}, {0xc5484000}, {0xc5486000}, + {0xc5488000}, {0xc548a000}, {0xc548c000}, {0xc548e000}, + {0xc5490000}, {0xc5492000}, {0xc5494000}, {0xc5496000}, + {0xc5498000}, {0xc549a000}, {0xc549c000}, {0xc549e000}, + {0xc54a0000}, {0xc54a2000}, {0xc54a4000}, {0xc54a6000}, + {0xc54a8000}, {0xc54aa000}, {0xc54ac000}, {0xc54ae000}, + {0xc54b0000}, {0xc54b2000}, {0xc54b4000}, {0xc54b6000}, + {0xc54b8000}, {0xc54ba000}, {0xc54bc000}, {0xc54be000}, + {0xc54c0000}, {0xc54c2000}, {0xc54c4000}, {0xc54c6000}, + {0xc54c8000}, {0xc54ca000}, {0xc54cc000}, {0xc54ce000}, + {0xc54d0000}, {0xc54d2000}, {0xc54d4000}, {0xc54d6000}, + {0xc54d8000}, {0xc54da000}, {0xc54dc000}, {0xc54de000}, + {0xc54e0000}, {0xc54e2000}, {0xc54e4000}, {0xc54e6000}, + {0xc54e8000}, {0xc54ea000}, {0xc54ec000}, {0xc54ee000}, + {0xc54f0000}, {0xc54f2000}, {0xc54f4000}, {0xc54f6000}, + {0xc54f8000}, {0xc54fa000}, {0xc54fc000}, {0xc54fe000}, + {0xc5500000}, {0xc5502000}, {0xc5504000}, {0xc5506000}, + {0xc5508000}, {0xc550a000}, {0xc550c000}, {0xc550e000}, + {0xc5510000}, {0xc5512000}, {0xc5514000}, {0xc5516000}, + {0xc5518000}, {0xc551a000}, {0xc551c000}, {0xc551e000}, + {0xc5520000}, {0xc5522000}, {0xc5524000}, {0xc5526000}, + {0xc5528000}, {0xc552a000}, {0xc552c000}, {0xc552e000}, + {0xc5530000}, {0xc5532000}, {0xc5534000}, {0xc5536000}, + {0xc5538000}, {0xc553a000}, {0xc553c000}, {0xc553e000}, + {0xc5540000}, {0xc5542000}, {0xc5544000}, {0xc5546000}, + {0xc5548000}, {0xc554a000}, {0xc554c000}, {0xc554e000}, + {0xc5550000}, {0xc5552000}, {0xc5554000}, {0xc5556000}, + {0xc5558000}, {0xc555a000}, {0xc555c000}, {0xc555e000}, + {0xc5560000}, {0xc5562000}, {0xc5564000}, {0xc5566000}, + {0xc5568000}, {0xc556a000}, {0xc556c000}, {0xc556e000}, + {0xc5570000}, {0xc5572000}, {0xc5574000}, {0xc5576000}, + {0xc5578000}, {0xc557a000}, {0xc557c000}, {0xc557e000}, + {0xc5580000}, {0xc5582000}, {0xc5584000}, {0xc5586000}, + {0xc5588000}, {0xc558a000}, {0xc558c000}, {0xc558e000}, + {0xc5590000}, {0xc5592000}, {0xc5594000}, {0xc5596000}, + {0xc5598000}, {0xc559a000}, {0xc559c000}, {0xc559e000}, + {0xc55a0000}, {0xc55a2000}, {0xc55a4000}, {0xc55a6000}, + {0xc55a8000}, {0xc55aa000}, {0xc55ac000}, {0xc55ae000}, + {0xc55b0000}, {0xc55b2000}, {0xc55b4000}, {0xc55b6000}, + {0xc55b8000}, {0xc55ba000}, {0xc55bc000}, {0xc55be000}, + {0xc55c0000}, {0xc55c2000}, {0xc55c4000}, {0xc55c6000}, + {0xc55c8000}, {0xc55ca000}, {0xc55cc000}, {0xc55ce000}, + {0xc55d0000}, {0xc55d2000}, {0xc55d4000}, {0xc55d6000}, + {0xc55d8000}, {0xc55da000}, {0xc55dc000}, {0xc55de000}, + {0xc55e0000}, {0xc55e2000}, {0xc55e4000}, {0xc55e6000}, + {0xc55e8000}, {0xc55ea000}, {0xc55ec000}, {0xc55ee000}, + {0xc55f0000}, {0xc55f2000}, {0xc55f4000}, {0xc55f6000}, + {0xc55f8000}, {0xc55fa000}, {0xc55fc000}, {0xc55fe000}, + {0xc5600000}, {0xc5602000}, {0xc5604000}, {0xc5606000}, + {0xc5608000}, {0xc560a000}, {0xc560c000}, {0xc560e000}, + {0xc5610000}, {0xc5612000}, {0xc5614000}, {0xc5616000}, + {0xc5618000}, {0xc561a000}, {0xc561c000}, {0xc561e000}, + {0xc5620000}, {0xc5622000}, {0xc5624000}, {0xc5626000}, + {0xc5628000}, {0xc562a000}, {0xc562c000}, {0xc562e000}, + {0xc5630000}, {0xc5632000}, {0xc5634000}, {0xc5636000}, + {0xc5638000}, {0xc563a000}, {0xc563c000}, {0xc563e000}, + {0xc5640000}, {0xc5642000}, {0xc5644000}, {0xc5646000}, + {0xc5648000}, {0xc564a000}, {0xc564c000}, {0xc564e000}, + {0xc5650000}, {0xc5652000}, {0xc5654000}, {0xc5656000}, + {0xc5658000}, {0xc565a000}, {0xc565c000}, {0xc565e000}, + {0xc5660000}, {0xc5662000}, {0xc5664000}, {0xc5666000}, + {0xc5668000}, {0xc566a000}, {0xc566c000}, {0xc566e000}, + {0xc5670000}, {0xc5672000}, {0xc5674000}, {0xc5676000}, + {0xc5678000}, {0xc567a000}, {0xc567c000}, {0xc567e000}, + {0xc5680000}, {0xc5682000}, {0xc5684000}, {0xc5686000}, + {0xc5688000}, {0xc568a000}, {0xc568c000}, {0xc568e000}, + {0xc5690000}, {0xc5692000}, {0xc5694000}, {0xc5696000}, + {0xc5698000}, {0xc569a000}, {0xc569c000}, {0xc569e000}, + {0xc56a0000}, {0xc56a2000}, {0xc56a4000}, {0xc56a6000}, + {0xc56a8000}, {0xc56aa000}, {0xc56ac000}, {0xc56ae000}, + {0xc56b0000}, {0xc56b2000}, {0xc56b4000}, {0xc56b6000}, + {0xc56b8000}, {0xc56ba000}, {0xc56bc000}, {0xc56be000}, + {0xc56c0000}, {0xc56c2000}, {0xc56c4000}, {0xc56c6000}, + {0xc56c8000}, {0xc56ca000}, {0xc56cc000}, {0xc56ce000}, + {0xc56d0000}, {0xc56d2000}, {0xc56d4000}, {0xc56d6000}, + {0xc56d8000}, {0xc56da000}, {0xc56dc000}, {0xc56de000}, + {0xc56e0000}, {0xc56e2000}, {0xc56e4000}, {0xc56e6000}, + {0xc56e8000}, {0xc56ea000}, {0xc56ec000}, {0xc56ee000}, + {0xc56f0000}, {0xc56f2000}, {0xc56f4000}, {0xc56f6000}, + {0xc56f8000}, {0xc56fa000}, {0xc56fc000}, {0xc56fe000}, + {0xc5700000}, {0xc5702000}, {0xc5704000}, {0xc5706000}, + {0xc5708000}, {0xc570a000}, {0xc570c000}, {0xc570e000}, + {0xc5710000}, {0xc5712000}, {0xc5714000}, {0xc5716000}, + {0xc5718000}, {0xc571a000}, {0xc571c000}, {0xc571e000}, + {0xc5720000}, {0xc5722000}, {0xc5724000}, {0xc5726000}, + {0xc5728000}, {0xc572a000}, {0xc572c000}, {0xc572e000}, + {0xc5730000}, {0xc5732000}, {0xc5734000}, {0xc5736000}, + {0xc5738000}, {0xc573a000}, {0xc573c000}, {0xc573e000}, + {0xc5740000}, {0xc5742000}, {0xc5744000}, {0xc5746000}, + {0xc5748000}, {0xc574a000}, {0xc574c000}, {0xc574e000}, + {0xc5750000}, {0xc5752000}, {0xc5754000}, {0xc5756000}, + {0xc5758000}, {0xc575a000}, {0xc575c000}, {0xc575e000}, + {0xc5760000}, {0xc5762000}, {0xc5764000}, {0xc5766000}, + {0xc5768000}, {0xc576a000}, {0xc576c000}, {0xc576e000}, + {0xc5770000}, {0xc5772000}, {0xc5774000}, {0xc5776000}, + {0xc5778000}, {0xc577a000}, {0xc577c000}, {0xc577e000}, + {0xc5780000}, {0xc5782000}, {0xc5784000}, {0xc5786000}, + {0xc5788000}, {0xc578a000}, {0xc578c000}, {0xc578e000}, + {0xc5790000}, {0xc5792000}, {0xc5794000}, {0xc5796000}, + {0xc5798000}, {0xc579a000}, {0xc579c000}, {0xc579e000}, + {0xc57a0000}, {0xc57a2000}, {0xc57a4000}, {0xc57a6000}, + {0xc57a8000}, {0xc57aa000}, {0xc57ac000}, {0xc57ae000}, + {0xc57b0000}, {0xc57b2000}, {0xc57b4000}, {0xc57b6000}, + {0xc57b8000}, {0xc57ba000}, {0xc57bc000}, {0xc57be000}, + {0xc57c0000}, {0xc57c2000}, {0xc57c4000}, {0xc57c6000}, + {0xc57c8000}, {0xc57ca000}, {0xc57cc000}, {0xc57ce000}, + {0xc57d0000}, {0xc57d2000}, {0xc57d4000}, {0xc57d6000}, + {0xc57d8000}, {0xc57da000}, {0xc57dc000}, {0xc57de000}, + {0xc57e0000}, {0xc57e2000}, {0xc57e4000}, {0xc57e6000}, + {0xc57e8000}, {0xc57ea000}, {0xc57ec000}, {0xc57ee000}, + {0xc57f0000}, {0xc57f2000}, {0xc57f4000}, {0xc57f6000}, + {0xc57f8000}, {0xc57fa000}, {0xc57fc000}, {0xc57fe000}, + {0xc5800000}, {0xc5802000}, {0xc5804000}, {0xc5806000}, + {0xc5808000}, {0xc580a000}, {0xc580c000}, {0xc580e000}, + {0xc5810000}, {0xc5812000}, {0xc5814000}, {0xc5816000}, + {0xc5818000}, {0xc581a000}, {0xc581c000}, {0xc581e000}, + {0xc5820000}, {0xc5822000}, {0xc5824000}, {0xc5826000}, + {0xc5828000}, {0xc582a000}, {0xc582c000}, {0xc582e000}, + {0xc5830000}, {0xc5832000}, {0xc5834000}, {0xc5836000}, + {0xc5838000}, {0xc583a000}, {0xc583c000}, {0xc583e000}, + {0xc5840000}, {0xc5842000}, {0xc5844000}, {0xc5846000}, + {0xc5848000}, {0xc584a000}, {0xc584c000}, {0xc584e000}, + {0xc5850000}, {0xc5852000}, {0xc5854000}, {0xc5856000}, + {0xc5858000}, {0xc585a000}, {0xc585c000}, {0xc585e000}, + {0xc5860000}, {0xc5862000}, {0xc5864000}, {0xc5866000}, + {0xc5868000}, {0xc586a000}, {0xc586c000}, {0xc586e000}, + {0xc5870000}, {0xc5872000}, {0xc5874000}, {0xc5876000}, + {0xc5878000}, {0xc587a000}, {0xc587c000}, {0xc587e000}, + {0xc5880000}, {0xc5882000}, {0xc5884000}, {0xc5886000}, + {0xc5888000}, {0xc588a000}, {0xc588c000}, {0xc588e000}, + {0xc5890000}, {0xc5892000}, {0xc5894000}, {0xc5896000}, + {0xc5898000}, {0xc589a000}, {0xc589c000}, {0xc589e000}, + {0xc58a0000}, {0xc58a2000}, {0xc58a4000}, {0xc58a6000}, + {0xc58a8000}, {0xc58aa000}, {0xc58ac000}, {0xc58ae000}, + {0xc58b0000}, {0xc58b2000}, {0xc58b4000}, {0xc58b6000}, + {0xc58b8000}, {0xc58ba000}, {0xc58bc000}, {0xc58be000}, + {0xc58c0000}, {0xc58c2000}, {0xc58c4000}, {0xc58c6000}, + {0xc58c8000}, {0xc58ca000}, {0xc58cc000}, {0xc58ce000}, + {0xc58d0000}, {0xc58d2000}, {0xc58d4000}, {0xc58d6000}, + {0xc58d8000}, {0xc58da000}, {0xc58dc000}, {0xc58de000}, + {0xc58e0000}, {0xc58e2000}, {0xc58e4000}, {0xc58e6000}, + {0xc58e8000}, {0xc58ea000}, {0xc58ec000}, {0xc58ee000}, + {0xc58f0000}, {0xc58f2000}, {0xc58f4000}, {0xc58f6000}, + {0xc58f8000}, {0xc58fa000}, {0xc58fc000}, {0xc58fe000}, + {0xc5900000}, {0xc5902000}, {0xc5904000}, {0xc5906000}, + {0xc5908000}, {0xc590a000}, {0xc590c000}, {0xc590e000}, + {0xc5910000}, {0xc5912000}, {0xc5914000}, {0xc5916000}, + {0xc5918000}, {0xc591a000}, {0xc591c000}, {0xc591e000}, + {0xc5920000}, {0xc5922000}, {0xc5924000}, {0xc5926000}, + {0xc5928000}, {0xc592a000}, {0xc592c000}, {0xc592e000}, + {0xc5930000}, {0xc5932000}, {0xc5934000}, {0xc5936000}, + {0xc5938000}, {0xc593a000}, {0xc593c000}, {0xc593e000}, + {0xc5940000}, {0xc5942000}, {0xc5944000}, {0xc5946000}, + {0xc5948000}, {0xc594a000}, {0xc594c000}, {0xc594e000}, + {0xc5950000}, {0xc5952000}, {0xc5954000}, {0xc5956000}, + {0xc5958000}, {0xc595a000}, {0xc595c000}, {0xc595e000}, + {0xc5960000}, {0xc5962000}, {0xc5964000}, {0xc5966000}, + {0xc5968000}, {0xc596a000}, {0xc596c000}, {0xc596e000}, + {0xc5970000}, {0xc5972000}, {0xc5974000}, {0xc5976000}, + {0xc5978000}, {0xc597a000}, {0xc597c000}, {0xc597e000}, + {0xc5980000}, {0xc5982000}, {0xc5984000}, {0xc5986000}, + {0xc5988000}, {0xc598a000}, {0xc598c000}, {0xc598e000}, + {0xc5990000}, {0xc5992000}, {0xc5994000}, {0xc5996000}, + {0xc5998000}, {0xc599a000}, {0xc599c000}, {0xc599e000}, + {0xc59a0000}, {0xc59a2000}, {0xc59a4000}, {0xc59a6000}, + {0xc59a8000}, {0xc59aa000}, {0xc59ac000}, {0xc59ae000}, + {0xc59b0000}, {0xc59b2000}, {0xc59b4000}, {0xc59b6000}, + {0xc59b8000}, {0xc59ba000}, {0xc59bc000}, {0xc59be000}, + {0xc59c0000}, {0xc59c2000}, {0xc59c4000}, {0xc59c6000}, + {0xc59c8000}, {0xc59ca000}, {0xc59cc000}, {0xc59ce000}, + {0xc59d0000}, {0xc59d2000}, {0xc59d4000}, {0xc59d6000}, + {0xc59d8000}, {0xc59da000}, {0xc59dc000}, {0xc59de000}, + {0xc59e0000}, {0xc59e2000}, {0xc59e4000}, {0xc59e6000}, + {0xc59e8000}, {0xc59ea000}, {0xc59ec000}, {0xc59ee000}, + {0xc59f0000}, {0xc59f2000}, {0xc59f4000}, {0xc59f6000}, + {0xc59f8000}, {0xc59fa000}, {0xc59fc000}, {0xc59fe000}, + {0xc5a00000}, {0xc5a02000}, {0xc5a04000}, {0xc5a06000}, + {0xc5a08000}, {0xc5a0a000}, {0xc5a0c000}, {0xc5a0e000}, + {0xc5a10000}, {0xc5a12000}, {0xc5a14000}, {0xc5a16000}, + {0xc5a18000}, {0xc5a1a000}, {0xc5a1c000}, {0xc5a1e000}, + {0xc5a20000}, {0xc5a22000}, {0xc5a24000}, {0xc5a26000}, + {0xc5a28000}, {0xc5a2a000}, {0xc5a2c000}, {0xc5a2e000}, + {0xc5a30000}, {0xc5a32000}, {0xc5a34000}, {0xc5a36000}, + {0xc5a38000}, {0xc5a3a000}, {0xc5a3c000}, {0xc5a3e000}, + {0xc5a40000}, {0xc5a42000}, {0xc5a44000}, {0xc5a46000}, + {0xc5a48000}, {0xc5a4a000}, {0xc5a4c000}, {0xc5a4e000}, + {0xc5a50000}, {0xc5a52000}, {0xc5a54000}, {0xc5a56000}, + {0xc5a58000}, {0xc5a5a000}, {0xc5a5c000}, {0xc5a5e000}, + {0xc5a60000}, {0xc5a62000}, {0xc5a64000}, {0xc5a66000}, + {0xc5a68000}, {0xc5a6a000}, {0xc5a6c000}, {0xc5a6e000}, + {0xc5a70000}, {0xc5a72000}, {0xc5a74000}, {0xc5a76000}, + {0xc5a78000}, {0xc5a7a000}, {0xc5a7c000}, {0xc5a7e000}, + {0xc5a80000}, {0xc5a82000}, {0xc5a84000}, {0xc5a86000}, + {0xc5a88000}, {0xc5a8a000}, {0xc5a8c000}, {0xc5a8e000}, + {0xc5a90000}, {0xc5a92000}, {0xc5a94000}, {0xc5a96000}, + {0xc5a98000}, {0xc5a9a000}, {0xc5a9c000}, {0xc5a9e000}, + {0xc5aa0000}, {0xc5aa2000}, {0xc5aa4000}, {0xc5aa6000}, + {0xc5aa8000}, {0xc5aaa000}, {0xc5aac000}, {0xc5aae000}, + {0xc5ab0000}, {0xc5ab2000}, {0xc5ab4000}, {0xc5ab6000}, + {0xc5ab8000}, {0xc5aba000}, {0xc5abc000}, {0xc5abe000}, + {0xc5ac0000}, {0xc5ac2000}, {0xc5ac4000}, {0xc5ac6000}, + {0xc5ac8000}, {0xc5aca000}, {0xc5acc000}, {0xc5ace000}, + {0xc5ad0000}, {0xc5ad2000}, {0xc5ad4000}, {0xc5ad6000}, + {0xc5ad8000}, {0xc5ada000}, {0xc5adc000}, {0xc5ade000}, + {0xc5ae0000}, {0xc5ae2000}, {0xc5ae4000}, {0xc5ae6000}, + {0xc5ae8000}, {0xc5aea000}, {0xc5aec000}, {0xc5aee000}, + {0xc5af0000}, {0xc5af2000}, {0xc5af4000}, {0xc5af6000}, + {0xc5af8000}, {0xc5afa000}, {0xc5afc000}, {0xc5afe000}, + {0xc5b00000}, {0xc5b02000}, {0xc5b04000}, {0xc5b06000}, + {0xc5b08000}, {0xc5b0a000}, {0xc5b0c000}, {0xc5b0e000}, + {0xc5b10000}, {0xc5b12000}, {0xc5b14000}, {0xc5b16000}, + {0xc5b18000}, {0xc5b1a000}, {0xc5b1c000}, {0xc5b1e000}, + {0xc5b20000}, {0xc5b22000}, {0xc5b24000}, {0xc5b26000}, + {0xc5b28000}, {0xc5b2a000}, {0xc5b2c000}, {0xc5b2e000}, + {0xc5b30000}, {0xc5b32000}, {0xc5b34000}, {0xc5b36000}, + {0xc5b38000}, {0xc5b3a000}, {0xc5b3c000}, {0xc5b3e000}, + {0xc5b40000}, {0xc5b42000}, {0xc5b44000}, {0xc5b46000}, + {0xc5b48000}, {0xc5b4a000}, {0xc5b4c000}, {0xc5b4e000}, + {0xc5b50000}, {0xc5b52000}, {0xc5b54000}, {0xc5b56000}, + {0xc5b58000}, {0xc5b5a000}, {0xc5b5c000}, {0xc5b5e000}, + {0xc5b60000}, {0xc5b62000}, {0xc5b64000}, {0xc5b66000}, + {0xc5b68000}, {0xc5b6a000}, {0xc5b6c000}, {0xc5b6e000}, + {0xc5b70000}, {0xc5b72000}, {0xc5b74000}, {0xc5b76000}, + {0xc5b78000}, {0xc5b7a000}, {0xc5b7c000}, {0xc5b7e000}, + {0xc5b80000}, {0xc5b82000}, {0xc5b84000}, {0xc5b86000}, + {0xc5b88000}, {0xc5b8a000}, {0xc5b8c000}, {0xc5b8e000}, + {0xc5b90000}, {0xc5b92000}, {0xc5b94000}, {0xc5b96000}, + {0xc5b98000}, {0xc5b9a000}, {0xc5b9c000}, {0xc5b9e000}, + {0xc5ba0000}, {0xc5ba2000}, {0xc5ba4000}, {0xc5ba6000}, + {0xc5ba8000}, {0xc5baa000}, {0xc5bac000}, {0xc5bae000}, + {0xc5bb0000}, {0xc5bb2000}, {0xc5bb4000}, {0xc5bb6000}, + {0xc5bb8000}, {0xc5bba000}, {0xc5bbc000}, {0xc5bbe000}, + {0xc5bc0000}, {0xc5bc2000}, {0xc5bc4000}, {0xc5bc6000}, + {0xc5bc8000}, {0xc5bca000}, {0xc5bcc000}, {0xc5bce000}, + {0xc5bd0000}, {0xc5bd2000}, {0xc5bd4000}, {0xc5bd6000}, + {0xc5bd8000}, {0xc5bda000}, {0xc5bdc000}, {0xc5bde000}, + {0xc5be0000}, {0xc5be2000}, {0xc5be4000}, {0xc5be6000}, + {0xc5be8000}, {0xc5bea000}, {0xc5bec000}, {0xc5bee000}, + {0xc5bf0000}, {0xc5bf2000}, {0xc5bf4000}, {0xc5bf6000}, + {0xc5bf8000}, {0xc5bfa000}, {0xc5bfc000}, {0xc5bfe000}, + {0xc5c00000}, {0xc5c02000}, {0xc5c04000}, {0xc5c06000}, + {0xc5c08000}, {0xc5c0a000}, {0xc5c0c000}, {0xc5c0e000}, + {0xc5c10000}, {0xc5c12000}, {0xc5c14000}, {0xc5c16000}, + {0xc5c18000}, {0xc5c1a000}, {0xc5c1c000}, {0xc5c1e000}, + {0xc5c20000}, {0xc5c22000}, {0xc5c24000}, {0xc5c26000}, + {0xc5c28000}, {0xc5c2a000}, {0xc5c2c000}, {0xc5c2e000}, + {0xc5c30000}, {0xc5c32000}, {0xc5c34000}, {0xc5c36000}, + {0xc5c38000}, {0xc5c3a000}, {0xc5c3c000}, {0xc5c3e000}, + {0xc5c40000}, {0xc5c42000}, {0xc5c44000}, {0xc5c46000}, + {0xc5c48000}, {0xc5c4a000}, {0xc5c4c000}, {0xc5c4e000}, + {0xc5c50000}, {0xc5c52000}, {0xc5c54000}, {0xc5c56000}, + {0xc5c58000}, {0xc5c5a000}, {0xc5c5c000}, {0xc5c5e000}, + {0xc5c60000}, {0xc5c62000}, {0xc5c64000}, {0xc5c66000}, + {0xc5c68000}, {0xc5c6a000}, {0xc5c6c000}, {0xc5c6e000}, + {0xc5c70000}, {0xc5c72000}, {0xc5c74000}, {0xc5c76000}, + {0xc5c78000}, {0xc5c7a000}, {0xc5c7c000}, {0xc5c7e000}, + {0xc5c80000}, {0xc5c82000}, {0xc5c84000}, {0xc5c86000}, + {0xc5c88000}, {0xc5c8a000}, {0xc5c8c000}, {0xc5c8e000}, + {0xc5c90000}, {0xc5c92000}, {0xc5c94000}, {0xc5c96000}, + {0xc5c98000}, {0xc5c9a000}, {0xc5c9c000}, {0xc5c9e000}, + {0xc5ca0000}, {0xc5ca2000}, {0xc5ca4000}, {0xc5ca6000}, + {0xc5ca8000}, {0xc5caa000}, {0xc5cac000}, {0xc5cae000}, + {0xc5cb0000}, {0xc5cb2000}, {0xc5cb4000}, {0xc5cb6000}, + {0xc5cb8000}, {0xc5cba000}, {0xc5cbc000}, {0xc5cbe000}, + {0xc5cc0000}, {0xc5cc2000}, {0xc5cc4000}, {0xc5cc6000}, + {0xc5cc8000}, {0xc5cca000}, {0xc5ccc000}, {0xc5cce000}, + {0xc5cd0000}, {0xc5cd2000}, {0xc5cd4000}, {0xc5cd6000}, + {0xc5cd8000}, {0xc5cda000}, {0xc5cdc000}, {0xc5cde000}, + {0xc5ce0000}, {0xc5ce2000}, {0xc5ce4000}, {0xc5ce6000}, + {0xc5ce8000}, {0xc5cea000}, {0xc5cec000}, {0xc5cee000}, + {0xc5cf0000}, {0xc5cf2000}, {0xc5cf4000}, {0xc5cf6000}, + {0xc5cf8000}, {0xc5cfa000}, {0xc5cfc000}, {0xc5cfe000}, + {0xc5d00000}, {0xc5d02000}, {0xc5d04000}, {0xc5d06000}, + {0xc5d08000}, {0xc5d0a000}, {0xc5d0c000}, {0xc5d0e000}, + {0xc5d10000}, {0xc5d12000}, {0xc5d14000}, {0xc5d16000}, + {0xc5d18000}, {0xc5d1a000}, {0xc5d1c000}, {0xc5d1e000}, + {0xc5d20000}, {0xc5d22000}, {0xc5d24000}, {0xc5d26000}, + {0xc5d28000}, {0xc5d2a000}, {0xc5d2c000}, {0xc5d2e000}, + {0xc5d30000}, {0xc5d32000}, {0xc5d34000}, {0xc5d36000}, + {0xc5d38000}, {0xc5d3a000}, {0xc5d3c000}, {0xc5d3e000}, + {0xc5d40000}, {0xc5d42000}, {0xc5d44000}, {0xc5d46000}, + {0xc5d48000}, {0xc5d4a000}, {0xc5d4c000}, {0xc5d4e000}, + {0xc5d50000}, {0xc5d52000}, {0xc5d54000}, {0xc5d56000}, + {0xc5d58000}, {0xc5d5a000}, {0xc5d5c000}, {0xc5d5e000}, + {0xc5d60000}, {0xc5d62000}, {0xc5d64000}, {0xc5d66000}, + {0xc5d68000}, {0xc5d6a000}, {0xc5d6c000}, {0xc5d6e000}, + {0xc5d70000}, {0xc5d72000}, {0xc5d74000}, {0xc5d76000}, + {0xc5d78000}, {0xc5d7a000}, {0xc5d7c000}, {0xc5d7e000}, + {0xc5d80000}, {0xc5d82000}, {0xc5d84000}, {0xc5d86000}, + {0xc5d88000}, {0xc5d8a000}, {0xc5d8c000}, {0xc5d8e000}, + {0xc5d90000}, {0xc5d92000}, {0xc5d94000}, {0xc5d96000}, + {0xc5d98000}, {0xc5d9a000}, {0xc5d9c000}, {0xc5d9e000}, + {0xc5da0000}, {0xc5da2000}, {0xc5da4000}, {0xc5da6000}, + {0xc5da8000}, {0xc5daa000}, {0xc5dac000}, {0xc5dae000}, + {0xc5db0000}, {0xc5db2000}, {0xc5db4000}, {0xc5db6000}, + {0xc5db8000}, {0xc5dba000}, {0xc5dbc000}, {0xc5dbe000}, + {0xc5dc0000}, {0xc5dc2000}, {0xc5dc4000}, {0xc5dc6000}, + {0xc5dc8000}, {0xc5dca000}, {0xc5dcc000}, {0xc5dce000}, + {0xc5dd0000}, {0xc5dd2000}, {0xc5dd4000}, {0xc5dd6000}, + {0xc5dd8000}, {0xc5dda000}, {0xc5ddc000}, {0xc5dde000}, + {0xc5de0000}, {0xc5de2000}, {0xc5de4000}, {0xc5de6000}, + {0xc5de8000}, {0xc5dea000}, {0xc5dec000}, {0xc5dee000}, + {0xc5df0000}, {0xc5df2000}, {0xc5df4000}, {0xc5df6000}, + {0xc5df8000}, {0xc5dfa000}, {0xc5dfc000}, {0xc5dfe000}, + {0xc5e00000}, {0xc5e02000}, {0xc5e04000}, {0xc5e06000}, + {0xc5e08000}, {0xc5e0a000}, {0xc5e0c000}, {0xc5e0e000}, + {0xc5e10000}, {0xc5e12000}, {0xc5e14000}, {0xc5e16000}, + {0xc5e18000}, {0xc5e1a000}, {0xc5e1c000}, {0xc5e1e000}, + {0xc5e20000}, {0xc5e22000}, {0xc5e24000}, {0xc5e26000}, + {0xc5e28000}, {0xc5e2a000}, {0xc5e2c000}, {0xc5e2e000}, + {0xc5e30000}, {0xc5e32000}, {0xc5e34000}, {0xc5e36000}, + {0xc5e38000}, {0xc5e3a000}, {0xc5e3c000}, {0xc5e3e000}, + {0xc5e40000}, {0xc5e42000}, {0xc5e44000}, {0xc5e46000}, + {0xc5e48000}, {0xc5e4a000}, {0xc5e4c000}, {0xc5e4e000}, + {0xc5e50000}, {0xc5e52000}, {0xc5e54000}, {0xc5e56000}, + {0xc5e58000}, {0xc5e5a000}, {0xc5e5c000}, {0xc5e5e000}, + {0xc5e60000}, {0xc5e62000}, {0xc5e64000}, {0xc5e66000}, + {0xc5e68000}, {0xc5e6a000}, {0xc5e6c000}, {0xc5e6e000}, + {0xc5e70000}, {0xc5e72000}, {0xc5e74000}, {0xc5e76000}, + {0xc5e78000}, {0xc5e7a000}, {0xc5e7c000}, {0xc5e7e000}, + {0xc5e80000}, {0xc5e82000}, {0xc5e84000}, {0xc5e86000}, + {0xc5e88000}, {0xc5e8a000}, {0xc5e8c000}, {0xc5e8e000}, + {0xc5e90000}, {0xc5e92000}, {0xc5e94000}, {0xc5e96000}, + {0xc5e98000}, {0xc5e9a000}, {0xc5e9c000}, {0xc5e9e000}, + {0xc5ea0000}, {0xc5ea2000}, {0xc5ea4000}, {0xc5ea6000}, + {0xc5ea8000}, {0xc5eaa000}, {0xc5eac000}, {0xc5eae000}, + {0xc5eb0000}, {0xc5eb2000}, {0xc5eb4000}, {0xc5eb6000}, + {0xc5eb8000}, {0xc5eba000}, {0xc5ebc000}, {0xc5ebe000}, + {0xc5ec0000}, {0xc5ec2000}, {0xc5ec4000}, {0xc5ec6000}, + {0xc5ec8000}, {0xc5eca000}, {0xc5ecc000}, {0xc5ece000}, + {0xc5ed0000}, {0xc5ed2000}, {0xc5ed4000}, {0xc5ed6000}, + {0xc5ed8000}, {0xc5eda000}, {0xc5edc000}, {0xc5ede000}, + {0xc5ee0000}, {0xc5ee2000}, {0xc5ee4000}, {0xc5ee6000}, + {0xc5ee8000}, {0xc5eea000}, {0xc5eec000}, {0xc5eee000}, + {0xc5ef0000}, {0xc5ef2000}, {0xc5ef4000}, {0xc5ef6000}, + {0xc5ef8000}, {0xc5efa000}, {0xc5efc000}, {0xc5efe000}, + {0xc5f00000}, {0xc5f02000}, {0xc5f04000}, {0xc5f06000}, + {0xc5f08000}, {0xc5f0a000}, {0xc5f0c000}, {0xc5f0e000}, + {0xc5f10000}, {0xc5f12000}, {0xc5f14000}, {0xc5f16000}, + {0xc5f18000}, {0xc5f1a000}, {0xc5f1c000}, {0xc5f1e000}, + {0xc5f20000}, {0xc5f22000}, {0xc5f24000}, {0xc5f26000}, + {0xc5f28000}, {0xc5f2a000}, {0xc5f2c000}, {0xc5f2e000}, + {0xc5f30000}, {0xc5f32000}, {0xc5f34000}, {0xc5f36000}, + {0xc5f38000}, {0xc5f3a000}, {0xc5f3c000}, {0xc5f3e000}, + {0xc5f40000}, {0xc5f42000}, {0xc5f44000}, {0xc5f46000}, + {0xc5f48000}, {0xc5f4a000}, {0xc5f4c000}, {0xc5f4e000}, + {0xc5f50000}, {0xc5f52000}, {0xc5f54000}, {0xc5f56000}, + {0xc5f58000}, {0xc5f5a000}, {0xc5f5c000}, {0xc5f5e000}, + {0xc5f60000}, {0xc5f62000}, {0xc5f64000}, {0xc5f66000}, + {0xc5f68000}, {0xc5f6a000}, {0xc5f6c000}, {0xc5f6e000}, + {0xc5f70000}, {0xc5f72000}, {0xc5f74000}, {0xc5f76000}, + {0xc5f78000}, {0xc5f7a000}, {0xc5f7c000}, {0xc5f7e000}, + {0xc5f80000}, {0xc5f82000}, {0xc5f84000}, {0xc5f86000}, + {0xc5f88000}, {0xc5f8a000}, {0xc5f8c000}, {0xc5f8e000}, + {0xc5f90000}, {0xc5f92000}, {0xc5f94000}, {0xc5f96000}, + {0xc5f98000}, {0xc5f9a000}, {0xc5f9c000}, {0xc5f9e000}, + {0xc5fa0000}, {0xc5fa2000}, {0xc5fa4000}, {0xc5fa6000}, + {0xc5fa8000}, {0xc5faa000}, {0xc5fac000}, {0xc5fae000}, + {0xc5fb0000}, {0xc5fb2000}, {0xc5fb4000}, {0xc5fb6000}, + {0xc5fb8000}, {0xc5fba000}, {0xc5fbc000}, {0xc5fbe000}, + {0xc5fc0000}, {0xc5fc2000}, {0xc5fc4000}, {0xc5fc6000}, + {0xc5fc8000}, {0xc5fca000}, {0xc5fcc000}, {0xc5fce000}, + {0xc5fd0000}, {0xc5fd2000}, {0xc5fd4000}, {0xc5fd6000}, + {0xc5fd8000}, {0xc5fda000}, {0xc5fdc000}, {0xc5fde000}, + {0xc5fe0000}, {0xc5fe2000}, {0xc5fe4000}, {0xc5fe6000}, + {0xc5fe8000}, {0xc5fea000}, {0xc5fec000}, {0xc5fee000}, + {0xc5ff0000}, {0xc5ff2000}, {0xc5ff4000}, {0xc5ff6000}, + {0xc5ff8000}, {0xc5ffa000}, {0xc5ffc000}, {0xc5ffe000}, + {0xc6000000}, {0xc6002000}, {0xc6004000}, {0xc6006000}, + {0xc6008000}, {0xc600a000}, {0xc600c000}, {0xc600e000}, + {0xc6010000}, {0xc6012000}, {0xc6014000}, {0xc6016000}, + {0xc6018000}, {0xc601a000}, {0xc601c000}, {0xc601e000}, + {0xc6020000}, {0xc6022000}, {0xc6024000}, {0xc6026000}, + {0xc6028000}, {0xc602a000}, {0xc602c000}, {0xc602e000}, + {0xc6030000}, {0xc6032000}, {0xc6034000}, {0xc6036000}, + {0xc6038000}, {0xc603a000}, {0xc603c000}, {0xc603e000}, + {0xc6040000}, {0xc6042000}, {0xc6044000}, {0xc6046000}, + {0xc6048000}, {0xc604a000}, {0xc604c000}, {0xc604e000}, + {0xc6050000}, {0xc6052000}, {0xc6054000}, {0xc6056000}, + {0xc6058000}, {0xc605a000}, {0xc605c000}, {0xc605e000}, + {0xc6060000}, {0xc6062000}, {0xc6064000}, {0xc6066000}, + {0xc6068000}, {0xc606a000}, {0xc606c000}, {0xc606e000}, + {0xc6070000}, {0xc6072000}, {0xc6074000}, {0xc6076000}, + {0xc6078000}, {0xc607a000}, {0xc607c000}, {0xc607e000}, + {0xc6080000}, {0xc6082000}, {0xc6084000}, {0xc6086000}, + {0xc6088000}, {0xc608a000}, {0xc608c000}, {0xc608e000}, + {0xc6090000}, {0xc6092000}, {0xc6094000}, {0xc6096000}, + {0xc6098000}, {0xc609a000}, {0xc609c000}, {0xc609e000}, + {0xc60a0000}, {0xc60a2000}, {0xc60a4000}, {0xc60a6000}, + {0xc60a8000}, {0xc60aa000}, {0xc60ac000}, {0xc60ae000}, + {0xc60b0000}, {0xc60b2000}, {0xc60b4000}, {0xc60b6000}, + {0xc60b8000}, {0xc60ba000}, {0xc60bc000}, {0xc60be000}, + {0xc60c0000}, {0xc60c2000}, {0xc60c4000}, {0xc60c6000}, + {0xc60c8000}, {0xc60ca000}, {0xc60cc000}, {0xc60ce000}, + {0xc60d0000}, {0xc60d2000}, {0xc60d4000}, {0xc60d6000}, + {0xc60d8000}, {0xc60da000}, {0xc60dc000}, {0xc60de000}, + {0xc60e0000}, {0xc60e2000}, {0xc60e4000}, {0xc60e6000}, + {0xc60e8000}, {0xc60ea000}, {0xc60ec000}, {0xc60ee000}, + {0xc60f0000}, {0xc60f2000}, {0xc60f4000}, {0xc60f6000}, + {0xc60f8000}, {0xc60fa000}, {0xc60fc000}, {0xc60fe000}, + {0xc6100000}, {0xc6102000}, {0xc6104000}, {0xc6106000}, + {0xc6108000}, {0xc610a000}, {0xc610c000}, {0xc610e000}, + {0xc6110000}, {0xc6112000}, {0xc6114000}, {0xc6116000}, + {0xc6118000}, {0xc611a000}, {0xc611c000}, {0xc611e000}, + {0xc6120000}, {0xc6122000}, {0xc6124000}, {0xc6126000}, + {0xc6128000}, {0xc612a000}, {0xc612c000}, {0xc612e000}, + {0xc6130000}, {0xc6132000}, {0xc6134000}, {0xc6136000}, + {0xc6138000}, {0xc613a000}, {0xc613c000}, {0xc613e000}, + {0xc6140000}, {0xc6142000}, {0xc6144000}, {0xc6146000}, + {0xc6148000}, {0xc614a000}, {0xc614c000}, {0xc614e000}, + {0xc6150000}, {0xc6152000}, {0xc6154000}, {0xc6156000}, + {0xc6158000}, {0xc615a000}, {0xc615c000}, {0xc615e000}, + {0xc6160000}, {0xc6162000}, {0xc6164000}, {0xc6166000}, + {0xc6168000}, {0xc616a000}, {0xc616c000}, {0xc616e000}, + {0xc6170000}, {0xc6172000}, {0xc6174000}, {0xc6176000}, + {0xc6178000}, {0xc617a000}, {0xc617c000}, {0xc617e000}, + {0xc6180000}, {0xc6182000}, {0xc6184000}, {0xc6186000}, + {0xc6188000}, {0xc618a000}, {0xc618c000}, {0xc618e000}, + {0xc6190000}, {0xc6192000}, {0xc6194000}, {0xc6196000}, + {0xc6198000}, {0xc619a000}, {0xc619c000}, {0xc619e000}, + {0xc61a0000}, {0xc61a2000}, {0xc61a4000}, {0xc61a6000}, + {0xc61a8000}, {0xc61aa000}, {0xc61ac000}, {0xc61ae000}, + {0xc61b0000}, {0xc61b2000}, {0xc61b4000}, {0xc61b6000}, + {0xc61b8000}, {0xc61ba000}, {0xc61bc000}, {0xc61be000}, + {0xc61c0000}, {0xc61c2000}, {0xc61c4000}, {0xc61c6000}, + {0xc61c8000}, {0xc61ca000}, {0xc61cc000}, {0xc61ce000}, + {0xc61d0000}, {0xc61d2000}, {0xc61d4000}, {0xc61d6000}, + {0xc61d8000}, {0xc61da000}, {0xc61dc000}, {0xc61de000}, + {0xc61e0000}, {0xc61e2000}, {0xc61e4000}, {0xc61e6000}, + {0xc61e8000}, {0xc61ea000}, {0xc61ec000}, {0xc61ee000}, + {0xc61f0000}, {0xc61f2000}, {0xc61f4000}, {0xc61f6000}, + {0xc61f8000}, {0xc61fa000}, {0xc61fc000}, {0xc61fe000}, + {0xc6200000}, {0xc6202000}, {0xc6204000}, {0xc6206000}, + {0xc6208000}, {0xc620a000}, {0xc620c000}, {0xc620e000}, + {0xc6210000}, {0xc6212000}, {0xc6214000}, {0xc6216000}, + {0xc6218000}, {0xc621a000}, {0xc621c000}, {0xc621e000}, + {0xc6220000}, {0xc6222000}, {0xc6224000}, {0xc6226000}, + {0xc6228000}, {0xc622a000}, {0xc622c000}, {0xc622e000}, + {0xc6230000}, {0xc6232000}, {0xc6234000}, {0xc6236000}, + {0xc6238000}, {0xc623a000}, {0xc623c000}, {0xc623e000}, + {0xc6240000}, {0xc6242000}, {0xc6244000}, {0xc6246000}, + {0xc6248000}, {0xc624a000}, {0xc624c000}, {0xc624e000}, + {0xc6250000}, {0xc6252000}, {0xc6254000}, {0xc6256000}, + {0xc6258000}, {0xc625a000}, {0xc625c000}, {0xc625e000}, + {0xc6260000}, {0xc6262000}, {0xc6264000}, {0xc6266000}, + {0xc6268000}, {0xc626a000}, {0xc626c000}, {0xc626e000}, + {0xc6270000}, {0xc6272000}, {0xc6274000}, {0xc6276000}, + {0xc6278000}, {0xc627a000}, {0xc627c000}, {0xc627e000}, + {0xc6280000}, {0xc6282000}, {0xc6284000}, {0xc6286000}, + {0xc6288000}, {0xc628a000}, {0xc628c000}, {0xc628e000}, + {0xc6290000}, {0xc6292000}, {0xc6294000}, {0xc6296000}, + {0xc6298000}, {0xc629a000}, {0xc629c000}, {0xc629e000}, + {0xc62a0000}, {0xc62a2000}, {0xc62a4000}, {0xc62a6000}, + {0xc62a8000}, {0xc62aa000}, {0xc62ac000}, {0xc62ae000}, + {0xc62b0000}, {0xc62b2000}, {0xc62b4000}, {0xc62b6000}, + {0xc62b8000}, {0xc62ba000}, {0xc62bc000}, {0xc62be000}, + {0xc62c0000}, {0xc62c2000}, {0xc62c4000}, {0xc62c6000}, + {0xc62c8000}, {0xc62ca000}, {0xc62cc000}, {0xc62ce000}, + {0xc62d0000}, {0xc62d2000}, {0xc62d4000}, {0xc62d6000}, + {0xc62d8000}, {0xc62da000}, {0xc62dc000}, {0xc62de000}, + {0xc62e0000}, {0xc62e2000}, {0xc62e4000}, {0xc62e6000}, + {0xc62e8000}, {0xc62ea000}, {0xc62ec000}, {0xc62ee000}, + {0xc62f0000}, {0xc62f2000}, {0xc62f4000}, {0xc62f6000}, + {0xc62f8000}, {0xc62fa000}, {0xc62fc000}, {0xc62fe000}, + {0xc6300000}, {0xc6302000}, {0xc6304000}, {0xc6306000}, + {0xc6308000}, {0xc630a000}, {0xc630c000}, {0xc630e000}, + {0xc6310000}, {0xc6312000}, {0xc6314000}, {0xc6316000}, + {0xc6318000}, {0xc631a000}, {0xc631c000}, {0xc631e000}, + {0xc6320000}, {0xc6322000}, {0xc6324000}, {0xc6326000}, + {0xc6328000}, {0xc632a000}, {0xc632c000}, {0xc632e000}, + {0xc6330000}, {0xc6332000}, {0xc6334000}, {0xc6336000}, + {0xc6338000}, {0xc633a000}, {0xc633c000}, {0xc633e000}, + {0xc6340000}, {0xc6342000}, {0xc6344000}, {0xc6346000}, + {0xc6348000}, {0xc634a000}, {0xc634c000}, {0xc634e000}, + {0xc6350000}, {0xc6352000}, {0xc6354000}, {0xc6356000}, + {0xc6358000}, {0xc635a000}, {0xc635c000}, {0xc635e000}, + {0xc6360000}, {0xc6362000}, {0xc6364000}, {0xc6366000}, + {0xc6368000}, {0xc636a000}, {0xc636c000}, {0xc636e000}, + {0xc6370000}, {0xc6372000}, {0xc6374000}, {0xc6376000}, + {0xc6378000}, {0xc637a000}, {0xc637c000}, {0xc637e000}, + {0xc6380000}, {0xc6382000}, {0xc6384000}, {0xc6386000}, + {0xc6388000}, {0xc638a000}, {0xc638c000}, {0xc638e000}, + {0xc6390000}, {0xc6392000}, {0xc6394000}, {0xc6396000}, + {0xc6398000}, {0xc639a000}, {0xc639c000}, {0xc639e000}, + {0xc63a0000}, {0xc63a2000}, {0xc63a4000}, {0xc63a6000}, + {0xc63a8000}, {0xc63aa000}, {0xc63ac000}, {0xc63ae000}, + {0xc63b0000}, {0xc63b2000}, {0xc63b4000}, {0xc63b6000}, + {0xc63b8000}, {0xc63ba000}, {0xc63bc000}, {0xc63be000}, + {0xc63c0000}, {0xc63c2000}, {0xc63c4000}, {0xc63c6000}, + {0xc63c8000}, {0xc63ca000}, {0xc63cc000}, {0xc63ce000}, + {0xc63d0000}, {0xc63d2000}, {0xc63d4000}, {0xc63d6000}, + {0xc63d8000}, {0xc63da000}, {0xc63dc000}, {0xc63de000}, + {0xc63e0000}, {0xc63e2000}, {0xc63e4000}, {0xc63e6000}, + {0xc63e8000}, {0xc63ea000}, {0xc63ec000}, {0xc63ee000}, + {0xc63f0000}, {0xc63f2000}, {0xc63f4000}, {0xc63f6000}, + {0xc63f8000}, {0xc63fa000}, {0xc63fc000}, {0xc63fe000}, + {0xc6400000}, {0xc6402000}, {0xc6404000}, {0xc6406000}, + {0xc6408000}, {0xc640a000}, {0xc640c000}, {0xc640e000}, + {0xc6410000}, {0xc6412000}, {0xc6414000}, {0xc6416000}, + {0xc6418000}, {0xc641a000}, {0xc641c000}, {0xc641e000}, + {0xc6420000}, {0xc6422000}, {0xc6424000}, {0xc6426000}, + {0xc6428000}, {0xc642a000}, {0xc642c000}, {0xc642e000}, + {0xc6430000}, {0xc6432000}, {0xc6434000}, {0xc6436000}, + {0xc6438000}, {0xc643a000}, {0xc643c000}, {0xc643e000}, + {0xc6440000}, {0xc6442000}, {0xc6444000}, {0xc6446000}, + {0xc6448000}, {0xc644a000}, {0xc644c000}, {0xc644e000}, + {0xc6450000}, {0xc6452000}, {0xc6454000}, {0xc6456000}, + {0xc6458000}, {0xc645a000}, {0xc645c000}, {0xc645e000}, + {0xc6460000}, {0xc6462000}, {0xc6464000}, {0xc6466000}, + {0xc6468000}, {0xc646a000}, {0xc646c000}, {0xc646e000}, + {0xc6470000}, {0xc6472000}, {0xc6474000}, {0xc6476000}, + {0xc6478000}, {0xc647a000}, {0xc647c000}, {0xc647e000}, + {0xc6480000}, {0xc6482000}, {0xc6484000}, {0xc6486000}, + {0xc6488000}, {0xc648a000}, {0xc648c000}, {0xc648e000}, + {0xc6490000}, {0xc6492000}, {0xc6494000}, {0xc6496000}, + {0xc6498000}, {0xc649a000}, {0xc649c000}, {0xc649e000}, + {0xc64a0000}, {0xc64a2000}, {0xc64a4000}, {0xc64a6000}, + {0xc64a8000}, {0xc64aa000}, {0xc64ac000}, {0xc64ae000}, + {0xc64b0000}, {0xc64b2000}, {0xc64b4000}, {0xc64b6000}, + {0xc64b8000}, {0xc64ba000}, {0xc64bc000}, {0xc64be000}, + {0xc64c0000}, {0xc64c2000}, {0xc64c4000}, {0xc64c6000}, + {0xc64c8000}, {0xc64ca000}, {0xc64cc000}, {0xc64ce000}, + {0xc64d0000}, {0xc64d2000}, {0xc64d4000}, {0xc64d6000}, + {0xc64d8000}, {0xc64da000}, {0xc64dc000}, {0xc64de000}, + {0xc64e0000}, {0xc64e2000}, {0xc64e4000}, {0xc64e6000}, + {0xc64e8000}, {0xc64ea000}, {0xc64ec000}, {0xc64ee000}, + {0xc64f0000}, {0xc64f2000}, {0xc64f4000}, {0xc64f6000}, + {0xc64f8000}, {0xc64fa000}, {0xc64fc000}, {0xc64fe000}, + {0xc6500000}, {0xc6502000}, {0xc6504000}, {0xc6506000}, + {0xc6508000}, {0xc650a000}, {0xc650c000}, {0xc650e000}, + {0xc6510000}, {0xc6512000}, {0xc6514000}, {0xc6516000}, + {0xc6518000}, {0xc651a000}, {0xc651c000}, {0xc651e000}, + {0xc6520000}, {0xc6522000}, {0xc6524000}, {0xc6526000}, + {0xc6528000}, {0xc652a000}, {0xc652c000}, {0xc652e000}, + {0xc6530000}, {0xc6532000}, {0xc6534000}, {0xc6536000}, + {0xc6538000}, {0xc653a000}, {0xc653c000}, {0xc653e000}, + {0xc6540000}, {0xc6542000}, {0xc6544000}, {0xc6546000}, + {0xc6548000}, {0xc654a000}, {0xc654c000}, {0xc654e000}, + {0xc6550000}, {0xc6552000}, {0xc6554000}, {0xc6556000}, + {0xc6558000}, {0xc655a000}, {0xc655c000}, {0xc655e000}, + {0xc6560000}, {0xc6562000}, {0xc6564000}, {0xc6566000}, + {0xc6568000}, {0xc656a000}, {0xc656c000}, {0xc656e000}, + {0xc6570000}, {0xc6572000}, {0xc6574000}, {0xc6576000}, + {0xc6578000}, {0xc657a000}, {0xc657c000}, {0xc657e000}, + {0xc6580000}, {0xc6582000}, {0xc6584000}, {0xc6586000}, + {0xc6588000}, {0xc658a000}, {0xc658c000}, {0xc658e000}, + {0xc6590000}, {0xc6592000}, {0xc6594000}, {0xc6596000}, + {0xc6598000}, {0xc659a000}, {0xc659c000}, {0xc659e000}, + {0xc65a0000}, {0xc65a2000}, {0xc65a4000}, {0xc65a6000}, + {0xc65a8000}, {0xc65aa000}, {0xc65ac000}, {0xc65ae000}, + {0xc65b0000}, {0xc65b2000}, {0xc65b4000}, {0xc65b6000}, + {0xc65b8000}, {0xc65ba000}, {0xc65bc000}, {0xc65be000}, + {0xc65c0000}, {0xc65c2000}, {0xc65c4000}, {0xc65c6000}, + {0xc65c8000}, {0xc65ca000}, {0xc65cc000}, {0xc65ce000}, + {0xc65d0000}, {0xc65d2000}, {0xc65d4000}, {0xc65d6000}, + {0xc65d8000}, {0xc65da000}, {0xc65dc000}, {0xc65de000}, + {0xc65e0000}, {0xc65e2000}, {0xc65e4000}, {0xc65e6000}, + {0xc65e8000}, {0xc65ea000}, {0xc65ec000}, {0xc65ee000}, + {0xc65f0000}, {0xc65f2000}, {0xc65f4000}, {0xc65f6000}, + {0xc65f8000}, {0xc65fa000}, {0xc65fc000}, {0xc65fe000}, + {0xc6600000}, {0xc6602000}, {0xc6604000}, {0xc6606000}, + {0xc6608000}, {0xc660a000}, {0xc660c000}, {0xc660e000}, + {0xc6610000}, {0xc6612000}, {0xc6614000}, {0xc6616000}, + {0xc6618000}, {0xc661a000}, {0xc661c000}, {0xc661e000}, + {0xc6620000}, {0xc6622000}, {0xc6624000}, {0xc6626000}, + {0xc6628000}, {0xc662a000}, {0xc662c000}, {0xc662e000}, + {0xc6630000}, {0xc6632000}, {0xc6634000}, {0xc6636000}, + {0xc6638000}, {0xc663a000}, {0xc663c000}, {0xc663e000}, + {0xc6640000}, {0xc6642000}, {0xc6644000}, {0xc6646000}, + {0xc6648000}, {0xc664a000}, {0xc664c000}, {0xc664e000}, + {0xc6650000}, {0xc6652000}, {0xc6654000}, {0xc6656000}, + {0xc6658000}, {0xc665a000}, {0xc665c000}, {0xc665e000}, + {0xc6660000}, {0xc6662000}, {0xc6664000}, {0xc6666000}, + {0xc6668000}, {0xc666a000}, {0xc666c000}, {0xc666e000}, + {0xc6670000}, {0xc6672000}, {0xc6674000}, {0xc6676000}, + {0xc6678000}, {0xc667a000}, {0xc667c000}, {0xc667e000}, + {0xc6680000}, {0xc6682000}, {0xc6684000}, {0xc6686000}, + {0xc6688000}, {0xc668a000}, {0xc668c000}, {0xc668e000}, + {0xc6690000}, {0xc6692000}, {0xc6694000}, {0xc6696000}, + {0xc6698000}, {0xc669a000}, {0xc669c000}, {0xc669e000}, + {0xc66a0000}, {0xc66a2000}, {0xc66a4000}, {0xc66a6000}, + {0xc66a8000}, {0xc66aa000}, {0xc66ac000}, {0xc66ae000}, + {0xc66b0000}, {0xc66b2000}, {0xc66b4000}, {0xc66b6000}, + {0xc66b8000}, {0xc66ba000}, {0xc66bc000}, {0xc66be000}, + {0xc66c0000}, {0xc66c2000}, {0xc66c4000}, {0xc66c6000}, + {0xc66c8000}, {0xc66ca000}, {0xc66cc000}, {0xc66ce000}, + {0xc66d0000}, {0xc66d2000}, {0xc66d4000}, {0xc66d6000}, + {0xc66d8000}, {0xc66da000}, {0xc66dc000}, {0xc66de000}, + {0xc66e0000}, {0xc66e2000}, {0xc66e4000}, {0xc66e6000}, + {0xc66e8000}, {0xc66ea000}, {0xc66ec000}, {0xc66ee000}, + {0xc66f0000}, {0xc66f2000}, {0xc66f4000}, {0xc66f6000}, + {0xc66f8000}, {0xc66fa000}, {0xc66fc000}, {0xc66fe000}, + {0xc6700000}, {0xc6702000}, {0xc6704000}, {0xc6706000}, + {0xc6708000}, {0xc670a000}, {0xc670c000}, {0xc670e000}, + {0xc6710000}, {0xc6712000}, {0xc6714000}, {0xc6716000}, + {0xc6718000}, {0xc671a000}, {0xc671c000}, {0xc671e000}, + {0xc6720000}, {0xc6722000}, {0xc6724000}, {0xc6726000}, + {0xc6728000}, {0xc672a000}, {0xc672c000}, {0xc672e000}, + {0xc6730000}, {0xc6732000}, {0xc6734000}, {0xc6736000}, + {0xc6738000}, {0xc673a000}, {0xc673c000}, {0xc673e000}, + {0xc6740000}, {0xc6742000}, {0xc6744000}, {0xc6746000}, + {0xc6748000}, {0xc674a000}, {0xc674c000}, {0xc674e000}, + {0xc6750000}, {0xc6752000}, {0xc6754000}, {0xc6756000}, + {0xc6758000}, {0xc675a000}, {0xc675c000}, {0xc675e000}, + {0xc6760000}, {0xc6762000}, {0xc6764000}, {0xc6766000}, + {0xc6768000}, {0xc676a000}, {0xc676c000}, {0xc676e000}, + {0xc6770000}, {0xc6772000}, {0xc6774000}, {0xc6776000}, + {0xc6778000}, {0xc677a000}, {0xc677c000}, {0xc677e000}, + {0xc6780000}, {0xc6782000}, {0xc6784000}, {0xc6786000}, + {0xc6788000}, {0xc678a000}, {0xc678c000}, {0xc678e000}, + {0xc6790000}, {0xc6792000}, {0xc6794000}, {0xc6796000}, + {0xc6798000}, {0xc679a000}, {0xc679c000}, {0xc679e000}, + {0xc67a0000}, {0xc67a2000}, {0xc67a4000}, {0xc67a6000}, + {0xc67a8000}, {0xc67aa000}, {0xc67ac000}, {0xc67ae000}, + {0xc67b0000}, {0xc67b2000}, {0xc67b4000}, {0xc67b6000}, + {0xc67b8000}, {0xc67ba000}, {0xc67bc000}, {0xc67be000}, + {0xc67c0000}, {0xc67c2000}, {0xc67c4000}, {0xc67c6000}, + {0xc67c8000}, {0xc67ca000}, {0xc67cc000}, {0xc67ce000}, + {0xc67d0000}, {0xc67d2000}, {0xc67d4000}, {0xc67d6000}, + {0xc67d8000}, {0xc67da000}, {0xc67dc000}, {0xc67de000}, + {0xc67e0000}, {0xc67e2000}, {0xc67e4000}, {0xc67e6000}, + {0xc67e8000}, {0xc67ea000}, {0xc67ec000}, {0xc67ee000}, + {0xc67f0000}, {0xc67f2000}, {0xc67f4000}, {0xc67f6000}, + {0xc67f8000}, {0xc67fa000}, {0xc67fc000}, {0xc67fe000}, + {0xc6800000}, {0xc6802000}, {0xc6804000}, {0xc6806000}, + {0xc6808000}, {0xc680a000}, {0xc680c000}, {0xc680e000}, + {0xc6810000}, {0xc6812000}, {0xc6814000}, {0xc6816000}, + {0xc6818000}, {0xc681a000}, {0xc681c000}, {0xc681e000}, + {0xc6820000}, {0xc6822000}, {0xc6824000}, {0xc6826000}, + {0xc6828000}, {0xc682a000}, {0xc682c000}, {0xc682e000}, + {0xc6830000}, {0xc6832000}, {0xc6834000}, {0xc6836000}, + {0xc6838000}, {0xc683a000}, {0xc683c000}, {0xc683e000}, + {0xc6840000}, {0xc6842000}, {0xc6844000}, {0xc6846000}, + {0xc6848000}, {0xc684a000}, {0xc684c000}, {0xc684e000}, + {0xc6850000}, {0xc6852000}, {0xc6854000}, {0xc6856000}, + {0xc6858000}, {0xc685a000}, {0xc685c000}, {0xc685e000}, + {0xc6860000}, {0xc6862000}, {0xc6864000}, {0xc6866000}, + {0xc6868000}, {0xc686a000}, {0xc686c000}, {0xc686e000}, + {0xc6870000}, {0xc6872000}, {0xc6874000}, {0xc6876000}, + {0xc6878000}, {0xc687a000}, {0xc687c000}, {0xc687e000}, + {0xc6880000}, {0xc6882000}, {0xc6884000}, {0xc6886000}, + {0xc6888000}, {0xc688a000}, {0xc688c000}, {0xc688e000}, + {0xc6890000}, {0xc6892000}, {0xc6894000}, {0xc6896000}, + {0xc6898000}, {0xc689a000}, {0xc689c000}, {0xc689e000}, + {0xc68a0000}, {0xc68a2000}, {0xc68a4000}, {0xc68a6000}, + {0xc68a8000}, {0xc68aa000}, {0xc68ac000}, {0xc68ae000}, + {0xc68b0000}, {0xc68b2000}, {0xc68b4000}, {0xc68b6000}, + {0xc68b8000}, {0xc68ba000}, {0xc68bc000}, {0xc68be000}, + {0xc68c0000}, {0xc68c2000}, {0xc68c4000}, {0xc68c6000}, + {0xc68c8000}, {0xc68ca000}, {0xc68cc000}, {0xc68ce000}, + {0xc68d0000}, {0xc68d2000}, {0xc68d4000}, {0xc68d6000}, + {0xc68d8000}, {0xc68da000}, {0xc68dc000}, {0xc68de000}, + {0xc68e0000}, {0xc68e2000}, {0xc68e4000}, {0xc68e6000}, + {0xc68e8000}, {0xc68ea000}, {0xc68ec000}, {0xc68ee000}, + {0xc68f0000}, {0xc68f2000}, {0xc68f4000}, {0xc68f6000}, + {0xc68f8000}, {0xc68fa000}, {0xc68fc000}, {0xc68fe000}, + {0xc6900000}, {0xc6902000}, {0xc6904000}, {0xc6906000}, + {0xc6908000}, {0xc690a000}, {0xc690c000}, {0xc690e000}, + {0xc6910000}, {0xc6912000}, {0xc6914000}, {0xc6916000}, + {0xc6918000}, {0xc691a000}, {0xc691c000}, {0xc691e000}, + {0xc6920000}, {0xc6922000}, {0xc6924000}, {0xc6926000}, + {0xc6928000}, {0xc692a000}, {0xc692c000}, {0xc692e000}, + {0xc6930000}, {0xc6932000}, {0xc6934000}, {0xc6936000}, + {0xc6938000}, {0xc693a000}, {0xc693c000}, {0xc693e000}, + {0xc6940000}, {0xc6942000}, {0xc6944000}, {0xc6946000}, + {0xc6948000}, {0xc694a000}, {0xc694c000}, {0xc694e000}, + {0xc6950000}, {0xc6952000}, {0xc6954000}, {0xc6956000}, + {0xc6958000}, {0xc695a000}, {0xc695c000}, {0xc695e000}, + {0xc6960000}, {0xc6962000}, {0xc6964000}, {0xc6966000}, + {0xc6968000}, {0xc696a000}, {0xc696c000}, {0xc696e000}, + {0xc6970000}, {0xc6972000}, {0xc6974000}, {0xc6976000}, + {0xc6978000}, {0xc697a000}, {0xc697c000}, {0xc697e000}, + {0xc6980000}, {0xc6982000}, {0xc6984000}, {0xc6986000}, + {0xc6988000}, {0xc698a000}, {0xc698c000}, {0xc698e000}, + {0xc6990000}, {0xc6992000}, {0xc6994000}, {0xc6996000}, + {0xc6998000}, {0xc699a000}, {0xc699c000}, {0xc699e000}, + {0xc69a0000}, {0xc69a2000}, {0xc69a4000}, {0xc69a6000}, + {0xc69a8000}, {0xc69aa000}, {0xc69ac000}, {0xc69ae000}, + {0xc69b0000}, {0xc69b2000}, {0xc69b4000}, {0xc69b6000}, + {0xc69b8000}, {0xc69ba000}, {0xc69bc000}, {0xc69be000}, + {0xc69c0000}, {0xc69c2000}, {0xc69c4000}, {0xc69c6000}, + {0xc69c8000}, {0xc69ca000}, {0xc69cc000}, {0xc69ce000}, + {0xc69d0000}, {0xc69d2000}, {0xc69d4000}, {0xc69d6000}, + {0xc69d8000}, {0xc69da000}, {0xc69dc000}, {0xc69de000}, + {0xc69e0000}, {0xc69e2000}, {0xc69e4000}, {0xc69e6000}, + {0xc69e8000}, {0xc69ea000}, {0xc69ec000}, {0xc69ee000}, + {0xc69f0000}, {0xc69f2000}, {0xc69f4000}, {0xc69f6000}, + {0xc69f8000}, {0xc69fa000}, {0xc69fc000}, {0xc69fe000}, + {0xc6a00000}, {0xc6a02000}, {0xc6a04000}, {0xc6a06000}, + {0xc6a08000}, {0xc6a0a000}, {0xc6a0c000}, {0xc6a0e000}, + {0xc6a10000}, {0xc6a12000}, {0xc6a14000}, {0xc6a16000}, + {0xc6a18000}, {0xc6a1a000}, {0xc6a1c000}, {0xc6a1e000}, + {0xc6a20000}, {0xc6a22000}, {0xc6a24000}, {0xc6a26000}, + {0xc6a28000}, {0xc6a2a000}, {0xc6a2c000}, {0xc6a2e000}, + {0xc6a30000}, {0xc6a32000}, {0xc6a34000}, {0xc6a36000}, + {0xc6a38000}, {0xc6a3a000}, {0xc6a3c000}, {0xc6a3e000}, + {0xc6a40000}, {0xc6a42000}, {0xc6a44000}, {0xc6a46000}, + {0xc6a48000}, {0xc6a4a000}, {0xc6a4c000}, {0xc6a4e000}, + {0xc6a50000}, {0xc6a52000}, {0xc6a54000}, {0xc6a56000}, + {0xc6a58000}, {0xc6a5a000}, {0xc6a5c000}, {0xc6a5e000}, + {0xc6a60000}, {0xc6a62000}, {0xc6a64000}, {0xc6a66000}, + {0xc6a68000}, {0xc6a6a000}, {0xc6a6c000}, {0xc6a6e000}, + {0xc6a70000}, {0xc6a72000}, {0xc6a74000}, {0xc6a76000}, + {0xc6a78000}, {0xc6a7a000}, {0xc6a7c000}, {0xc6a7e000}, + {0xc6a80000}, {0xc6a82000}, {0xc6a84000}, {0xc6a86000}, + {0xc6a88000}, {0xc6a8a000}, {0xc6a8c000}, {0xc6a8e000}, + {0xc6a90000}, {0xc6a92000}, {0xc6a94000}, {0xc6a96000}, + {0xc6a98000}, {0xc6a9a000}, {0xc6a9c000}, {0xc6a9e000}, + {0xc6aa0000}, {0xc6aa2000}, {0xc6aa4000}, {0xc6aa6000}, + {0xc6aa8000}, {0xc6aaa000}, {0xc6aac000}, {0xc6aae000}, + {0xc6ab0000}, {0xc6ab2000}, {0xc6ab4000}, {0xc6ab6000}, + {0xc6ab8000}, {0xc6aba000}, {0xc6abc000}, {0xc6abe000}, + {0xc6ac0000}, {0xc6ac2000}, {0xc6ac4000}, {0xc6ac6000}, + {0xc6ac8000}, {0xc6aca000}, {0xc6acc000}, {0xc6ace000}, + {0xc6ad0000}, {0xc6ad2000}, {0xc6ad4000}, {0xc6ad6000}, + {0xc6ad8000}, {0xc6ada000}, {0xc6adc000}, {0xc6ade000}, + {0xc6ae0000}, {0xc6ae2000}, {0xc6ae4000}, {0xc6ae6000}, + {0xc6ae8000}, {0xc6aea000}, {0xc6aec000}, {0xc6aee000}, + {0xc6af0000}, {0xc6af2000}, {0xc6af4000}, {0xc6af6000}, + {0xc6af8000}, {0xc6afa000}, {0xc6afc000}, {0xc6afe000}, + {0xc6b00000}, {0xc6b02000}, {0xc6b04000}, {0xc6b06000}, + {0xc6b08000}, {0xc6b0a000}, {0xc6b0c000}, {0xc6b0e000}, + {0xc6b10000}, {0xc6b12000}, {0xc6b14000}, {0xc6b16000}, + {0xc6b18000}, {0xc6b1a000}, {0xc6b1c000}, {0xc6b1e000}, + {0xc6b20000}, {0xc6b22000}, {0xc6b24000}, {0xc6b26000}, + {0xc6b28000}, {0xc6b2a000}, {0xc6b2c000}, {0xc6b2e000}, + {0xc6b30000}, {0xc6b32000}, {0xc6b34000}, {0xc6b36000}, + {0xc6b38000}, {0xc6b3a000}, {0xc6b3c000}, {0xc6b3e000}, + {0xc6b40000}, {0xc6b42000}, {0xc6b44000}, {0xc6b46000}, + {0xc6b48000}, {0xc6b4a000}, {0xc6b4c000}, {0xc6b4e000}, + {0xc6b50000}, {0xc6b52000}, {0xc6b54000}, {0xc6b56000}, + {0xc6b58000}, {0xc6b5a000}, {0xc6b5c000}, {0xc6b5e000}, + {0xc6b60000}, {0xc6b62000}, {0xc6b64000}, {0xc6b66000}, + {0xc6b68000}, {0xc6b6a000}, {0xc6b6c000}, {0xc6b6e000}, + {0xc6b70000}, {0xc6b72000}, {0xc6b74000}, {0xc6b76000}, + {0xc6b78000}, {0xc6b7a000}, {0xc6b7c000}, {0xc6b7e000}, + {0xc6b80000}, {0xc6b82000}, {0xc6b84000}, {0xc6b86000}, + {0xc6b88000}, {0xc6b8a000}, {0xc6b8c000}, {0xc6b8e000}, + {0xc6b90000}, {0xc6b92000}, {0xc6b94000}, {0xc6b96000}, + {0xc6b98000}, {0xc6b9a000}, {0xc6b9c000}, {0xc6b9e000}, + {0xc6ba0000}, {0xc6ba2000}, {0xc6ba4000}, {0xc6ba6000}, + {0xc6ba8000}, {0xc6baa000}, {0xc6bac000}, {0xc6bae000}, + {0xc6bb0000}, {0xc6bb2000}, {0xc6bb4000}, {0xc6bb6000}, + {0xc6bb8000}, {0xc6bba000}, {0xc6bbc000}, {0xc6bbe000}, + {0xc6bc0000}, {0xc6bc2000}, {0xc6bc4000}, {0xc6bc6000}, + {0xc6bc8000}, {0xc6bca000}, {0xc6bcc000}, {0xc6bce000}, + {0xc6bd0000}, {0xc6bd2000}, {0xc6bd4000}, {0xc6bd6000}, + {0xc6bd8000}, {0xc6bda000}, {0xc6bdc000}, {0xc6bde000}, + {0xc6be0000}, {0xc6be2000}, {0xc6be4000}, {0xc6be6000}, + {0xc6be8000}, {0xc6bea000}, {0xc6bec000}, {0xc6bee000}, + {0xc6bf0000}, {0xc6bf2000}, {0xc6bf4000}, {0xc6bf6000}, + {0xc6bf8000}, {0xc6bfa000}, {0xc6bfc000}, {0xc6bfe000}, + {0xc6c00000}, {0xc6c02000}, {0xc6c04000}, {0xc6c06000}, + {0xc6c08000}, {0xc6c0a000}, {0xc6c0c000}, {0xc6c0e000}, + {0xc6c10000}, {0xc6c12000}, {0xc6c14000}, {0xc6c16000}, + {0xc6c18000}, {0xc6c1a000}, {0xc6c1c000}, {0xc6c1e000}, + {0xc6c20000}, {0xc6c22000}, {0xc6c24000}, {0xc6c26000}, + {0xc6c28000}, {0xc6c2a000}, {0xc6c2c000}, {0xc6c2e000}, + {0xc6c30000}, {0xc6c32000}, {0xc6c34000}, {0xc6c36000}, + {0xc6c38000}, {0xc6c3a000}, {0xc6c3c000}, {0xc6c3e000}, + {0xc6c40000}, {0xc6c42000}, {0xc6c44000}, {0xc6c46000}, + {0xc6c48000}, {0xc6c4a000}, {0xc6c4c000}, {0xc6c4e000}, + {0xc6c50000}, {0xc6c52000}, {0xc6c54000}, {0xc6c56000}, + {0xc6c58000}, {0xc6c5a000}, {0xc6c5c000}, {0xc6c5e000}, + {0xc6c60000}, {0xc6c62000}, {0xc6c64000}, {0xc6c66000}, + {0xc6c68000}, {0xc6c6a000}, {0xc6c6c000}, {0xc6c6e000}, + {0xc6c70000}, {0xc6c72000}, {0xc6c74000}, {0xc6c76000}, + {0xc6c78000}, {0xc6c7a000}, {0xc6c7c000}, {0xc6c7e000}, + {0xc6c80000}, {0xc6c82000}, {0xc6c84000}, {0xc6c86000}, + {0xc6c88000}, {0xc6c8a000}, {0xc6c8c000}, {0xc6c8e000}, + {0xc6c90000}, {0xc6c92000}, {0xc6c94000}, {0xc6c96000}, + {0xc6c98000}, {0xc6c9a000}, {0xc6c9c000}, {0xc6c9e000}, + {0xc6ca0000}, {0xc6ca2000}, {0xc6ca4000}, {0xc6ca6000}, + {0xc6ca8000}, {0xc6caa000}, {0xc6cac000}, {0xc6cae000}, + {0xc6cb0000}, {0xc6cb2000}, {0xc6cb4000}, {0xc6cb6000}, + {0xc6cb8000}, {0xc6cba000}, {0xc6cbc000}, {0xc6cbe000}, + {0xc6cc0000}, {0xc6cc2000}, {0xc6cc4000}, {0xc6cc6000}, + {0xc6cc8000}, {0xc6cca000}, {0xc6ccc000}, {0xc6cce000}, + {0xc6cd0000}, {0xc6cd2000}, {0xc6cd4000}, {0xc6cd6000}, + {0xc6cd8000}, {0xc6cda000}, {0xc6cdc000}, {0xc6cde000}, + {0xc6ce0000}, {0xc6ce2000}, {0xc6ce4000}, {0xc6ce6000}, + {0xc6ce8000}, {0xc6cea000}, {0xc6cec000}, {0xc6cee000}, + {0xc6cf0000}, {0xc6cf2000}, {0xc6cf4000}, {0xc6cf6000}, + {0xc6cf8000}, {0xc6cfa000}, {0xc6cfc000}, {0xc6cfe000}, + {0xc6d00000}, {0xc6d02000}, {0xc6d04000}, {0xc6d06000}, + {0xc6d08000}, {0xc6d0a000}, {0xc6d0c000}, {0xc6d0e000}, + {0xc6d10000}, {0xc6d12000}, {0xc6d14000}, {0xc6d16000}, + {0xc6d18000}, {0xc6d1a000}, {0xc6d1c000}, {0xc6d1e000}, + {0xc6d20000}, {0xc6d22000}, {0xc6d24000}, {0xc6d26000}, + {0xc6d28000}, {0xc6d2a000}, {0xc6d2c000}, {0xc6d2e000}, + {0xc6d30000}, {0xc6d32000}, {0xc6d34000}, {0xc6d36000}, + {0xc6d38000}, {0xc6d3a000}, {0xc6d3c000}, {0xc6d3e000}, + {0xc6d40000}, {0xc6d42000}, {0xc6d44000}, {0xc6d46000}, + {0xc6d48000}, {0xc6d4a000}, {0xc6d4c000}, {0xc6d4e000}, + {0xc6d50000}, {0xc6d52000}, {0xc6d54000}, {0xc6d56000}, + {0xc6d58000}, {0xc6d5a000}, {0xc6d5c000}, {0xc6d5e000}, + {0xc6d60000}, {0xc6d62000}, {0xc6d64000}, {0xc6d66000}, + {0xc6d68000}, {0xc6d6a000}, {0xc6d6c000}, {0xc6d6e000}, + {0xc6d70000}, {0xc6d72000}, {0xc6d74000}, {0xc6d76000}, + {0xc6d78000}, {0xc6d7a000}, {0xc6d7c000}, {0xc6d7e000}, + {0xc6d80000}, {0xc6d82000}, {0xc6d84000}, {0xc6d86000}, + {0xc6d88000}, {0xc6d8a000}, {0xc6d8c000}, {0xc6d8e000}, + {0xc6d90000}, {0xc6d92000}, {0xc6d94000}, {0xc6d96000}, + {0xc6d98000}, {0xc6d9a000}, {0xc6d9c000}, {0xc6d9e000}, + {0xc6da0000}, {0xc6da2000}, {0xc6da4000}, {0xc6da6000}, + {0xc6da8000}, {0xc6daa000}, {0xc6dac000}, {0xc6dae000}, + {0xc6db0000}, {0xc6db2000}, {0xc6db4000}, {0xc6db6000}, + {0xc6db8000}, {0xc6dba000}, {0xc6dbc000}, {0xc6dbe000}, + {0xc6dc0000}, {0xc6dc2000}, {0xc6dc4000}, {0xc6dc6000}, + {0xc6dc8000}, {0xc6dca000}, {0xc6dcc000}, {0xc6dce000}, + {0xc6dd0000}, {0xc6dd2000}, {0xc6dd4000}, {0xc6dd6000}, + {0xc6dd8000}, {0xc6dda000}, {0xc6ddc000}, {0xc6dde000}, + {0xc6de0000}, {0xc6de2000}, {0xc6de4000}, {0xc6de6000}, + {0xc6de8000}, {0xc6dea000}, {0xc6dec000}, {0xc6dee000}, + {0xc6df0000}, {0xc6df2000}, {0xc6df4000}, {0xc6df6000}, + {0xc6df8000}, {0xc6dfa000}, {0xc6dfc000}, {0xc6dfe000}, + {0xc6e00000}, {0xc6e02000}, {0xc6e04000}, {0xc6e06000}, + {0xc6e08000}, {0xc6e0a000}, {0xc6e0c000}, {0xc6e0e000}, + {0xc6e10000}, {0xc6e12000}, {0xc6e14000}, {0xc6e16000}, + {0xc6e18000}, {0xc6e1a000}, {0xc6e1c000}, {0xc6e1e000}, + {0xc6e20000}, {0xc6e22000}, {0xc6e24000}, {0xc6e26000}, + {0xc6e28000}, {0xc6e2a000}, {0xc6e2c000}, {0xc6e2e000}, + {0xc6e30000}, {0xc6e32000}, {0xc6e34000}, {0xc6e36000}, + {0xc6e38000}, {0xc6e3a000}, {0xc6e3c000}, {0xc6e3e000}, + {0xc6e40000}, {0xc6e42000}, {0xc6e44000}, {0xc6e46000}, + {0xc6e48000}, {0xc6e4a000}, {0xc6e4c000}, {0xc6e4e000}, + {0xc6e50000}, {0xc6e52000}, {0xc6e54000}, {0xc6e56000}, + {0xc6e58000}, {0xc6e5a000}, {0xc6e5c000}, {0xc6e5e000}, + {0xc6e60000}, {0xc6e62000}, {0xc6e64000}, {0xc6e66000}, + {0xc6e68000}, {0xc6e6a000}, {0xc6e6c000}, {0xc6e6e000}, + {0xc6e70000}, {0xc6e72000}, {0xc6e74000}, {0xc6e76000}, + {0xc6e78000}, {0xc6e7a000}, {0xc6e7c000}, {0xc6e7e000}, + {0xc6e80000}, {0xc6e82000}, {0xc6e84000}, {0xc6e86000}, + {0xc6e88000}, {0xc6e8a000}, {0xc6e8c000}, {0xc6e8e000}, + {0xc6e90000}, {0xc6e92000}, {0xc6e94000}, {0xc6e96000}, + {0xc6e98000}, {0xc6e9a000}, {0xc6e9c000}, {0xc6e9e000}, + {0xc6ea0000}, {0xc6ea2000}, {0xc6ea4000}, {0xc6ea6000}, + {0xc6ea8000}, {0xc6eaa000}, {0xc6eac000}, {0xc6eae000}, + {0xc6eb0000}, {0xc6eb2000}, {0xc6eb4000}, {0xc6eb6000}, + {0xc6eb8000}, {0xc6eba000}, {0xc6ebc000}, {0xc6ebe000}, + {0xc6ec0000}, {0xc6ec2000}, {0xc6ec4000}, {0xc6ec6000}, + {0xc6ec8000}, {0xc6eca000}, {0xc6ecc000}, {0xc6ece000}, + {0xc6ed0000}, {0xc6ed2000}, {0xc6ed4000}, {0xc6ed6000}, + {0xc6ed8000}, {0xc6eda000}, {0xc6edc000}, {0xc6ede000}, + {0xc6ee0000}, {0xc6ee2000}, {0xc6ee4000}, {0xc6ee6000}, + {0xc6ee8000}, {0xc6eea000}, {0xc6eec000}, {0xc6eee000}, + {0xc6ef0000}, {0xc6ef2000}, {0xc6ef4000}, {0xc6ef6000}, + {0xc6ef8000}, {0xc6efa000}, {0xc6efc000}, {0xc6efe000}, + {0xc6f00000}, {0xc6f02000}, {0xc6f04000}, {0xc6f06000}, + {0xc6f08000}, {0xc6f0a000}, {0xc6f0c000}, {0xc6f0e000}, + {0xc6f10000}, {0xc6f12000}, {0xc6f14000}, {0xc6f16000}, + {0xc6f18000}, {0xc6f1a000}, {0xc6f1c000}, {0xc6f1e000}, + {0xc6f20000}, {0xc6f22000}, {0xc6f24000}, {0xc6f26000}, + {0xc6f28000}, {0xc6f2a000}, {0xc6f2c000}, {0xc6f2e000}, + {0xc6f30000}, {0xc6f32000}, {0xc6f34000}, {0xc6f36000}, + {0xc6f38000}, {0xc6f3a000}, {0xc6f3c000}, {0xc6f3e000}, + {0xc6f40000}, {0xc6f42000}, {0xc6f44000}, {0xc6f46000}, + {0xc6f48000}, {0xc6f4a000}, {0xc6f4c000}, {0xc6f4e000}, + {0xc6f50000}, {0xc6f52000}, {0xc6f54000}, {0xc6f56000}, + {0xc6f58000}, {0xc6f5a000}, {0xc6f5c000}, {0xc6f5e000}, + {0xc6f60000}, {0xc6f62000}, {0xc6f64000}, {0xc6f66000}, + {0xc6f68000}, {0xc6f6a000}, {0xc6f6c000}, {0xc6f6e000}, + {0xc6f70000}, {0xc6f72000}, {0xc6f74000}, {0xc6f76000}, + {0xc6f78000}, {0xc6f7a000}, {0xc6f7c000}, {0xc6f7e000}, + {0xc6f80000}, {0xc6f82000}, {0xc6f84000}, {0xc6f86000}, + {0xc6f88000}, {0xc6f8a000}, {0xc6f8c000}, {0xc6f8e000}, + {0xc6f90000}, {0xc6f92000}, {0xc6f94000}, {0xc6f96000}, + {0xc6f98000}, {0xc6f9a000}, {0xc6f9c000}, {0xc6f9e000}, + {0xc6fa0000}, {0xc6fa2000}, {0xc6fa4000}, {0xc6fa6000}, + {0xc6fa8000}, {0xc6faa000}, {0xc6fac000}, {0xc6fae000}, + {0xc6fb0000}, {0xc6fb2000}, {0xc6fb4000}, {0xc6fb6000}, + {0xc6fb8000}, {0xc6fba000}, {0xc6fbc000}, {0xc6fbe000}, + {0xc6fc0000}, {0xc6fc2000}, {0xc6fc4000}, {0xc6fc6000}, + {0xc6fc8000}, {0xc6fca000}, {0xc6fcc000}, {0xc6fce000}, + {0xc6fd0000}, {0xc6fd2000}, {0xc6fd4000}, {0xc6fd6000}, + {0xc6fd8000}, {0xc6fda000}, {0xc6fdc000}, {0xc6fde000}, + {0xc6fe0000}, {0xc6fe2000}, {0xc6fe4000}, {0xc6fe6000}, + {0xc6fe8000}, {0xc6fea000}, {0xc6fec000}, {0xc6fee000}, + {0xc6ff0000}, {0xc6ff2000}, {0xc6ff4000}, {0xc6ff6000}, + {0xc6ff8000}, {0xc6ffa000}, {0xc6ffc000}, {0xc6ffe000}, + {0xc7000000}, {0xc7002000}, {0xc7004000}, {0xc7006000}, + {0xc7008000}, {0xc700a000}, {0xc700c000}, {0xc700e000}, + {0xc7010000}, {0xc7012000}, {0xc7014000}, {0xc7016000}, + {0xc7018000}, {0xc701a000}, {0xc701c000}, {0xc701e000}, + {0xc7020000}, {0xc7022000}, {0xc7024000}, {0xc7026000}, + {0xc7028000}, {0xc702a000}, {0xc702c000}, {0xc702e000}, + {0xc7030000}, {0xc7032000}, {0xc7034000}, {0xc7036000}, + {0xc7038000}, {0xc703a000}, {0xc703c000}, {0xc703e000}, + {0xc7040000}, {0xc7042000}, {0xc7044000}, {0xc7046000}, + {0xc7048000}, {0xc704a000}, {0xc704c000}, {0xc704e000}, + {0xc7050000}, {0xc7052000}, {0xc7054000}, {0xc7056000}, + {0xc7058000}, {0xc705a000}, {0xc705c000}, {0xc705e000}, + {0xc7060000}, {0xc7062000}, {0xc7064000}, {0xc7066000}, + {0xc7068000}, {0xc706a000}, {0xc706c000}, {0xc706e000}, + {0xc7070000}, {0xc7072000}, {0xc7074000}, {0xc7076000}, + {0xc7078000}, {0xc707a000}, {0xc707c000}, {0xc707e000}, + {0xc7080000}, {0xc7082000}, {0xc7084000}, {0xc7086000}, + {0xc7088000}, {0xc708a000}, {0xc708c000}, {0xc708e000}, + {0xc7090000}, {0xc7092000}, {0xc7094000}, {0xc7096000}, + {0xc7098000}, {0xc709a000}, {0xc709c000}, {0xc709e000}, + {0xc70a0000}, {0xc70a2000}, {0xc70a4000}, {0xc70a6000}, + {0xc70a8000}, {0xc70aa000}, {0xc70ac000}, {0xc70ae000}, + {0xc70b0000}, {0xc70b2000}, {0xc70b4000}, {0xc70b6000}, + {0xc70b8000}, {0xc70ba000}, {0xc70bc000}, {0xc70be000}, + {0xc70c0000}, {0xc70c2000}, {0xc70c4000}, {0xc70c6000}, + {0xc70c8000}, {0xc70ca000}, {0xc70cc000}, {0xc70ce000}, + {0xc70d0000}, {0xc70d2000}, {0xc70d4000}, {0xc70d6000}, + {0xc70d8000}, {0xc70da000}, {0xc70dc000}, {0xc70de000}, + {0xc70e0000}, {0xc70e2000}, {0xc70e4000}, {0xc70e6000}, + {0xc70e8000}, {0xc70ea000}, {0xc70ec000}, {0xc70ee000}, + {0xc70f0000}, {0xc70f2000}, {0xc70f4000}, {0xc70f6000}, + {0xc70f8000}, {0xc70fa000}, {0xc70fc000}, {0xc70fe000}, + {0xc7100000}, {0xc7102000}, {0xc7104000}, {0xc7106000}, + {0xc7108000}, {0xc710a000}, {0xc710c000}, {0xc710e000}, + {0xc7110000}, {0xc7112000}, {0xc7114000}, {0xc7116000}, + {0xc7118000}, {0xc711a000}, {0xc711c000}, {0xc711e000}, + {0xc7120000}, {0xc7122000}, {0xc7124000}, {0xc7126000}, + {0xc7128000}, {0xc712a000}, {0xc712c000}, {0xc712e000}, + {0xc7130000}, {0xc7132000}, {0xc7134000}, {0xc7136000}, + {0xc7138000}, {0xc713a000}, {0xc713c000}, {0xc713e000}, + {0xc7140000}, {0xc7142000}, {0xc7144000}, {0xc7146000}, + {0xc7148000}, {0xc714a000}, {0xc714c000}, {0xc714e000}, + {0xc7150000}, {0xc7152000}, {0xc7154000}, {0xc7156000}, + {0xc7158000}, {0xc715a000}, {0xc715c000}, {0xc715e000}, + {0xc7160000}, {0xc7162000}, {0xc7164000}, {0xc7166000}, + {0xc7168000}, {0xc716a000}, {0xc716c000}, {0xc716e000}, + {0xc7170000}, {0xc7172000}, {0xc7174000}, {0xc7176000}, + {0xc7178000}, {0xc717a000}, {0xc717c000}, {0xc717e000}, + {0xc7180000}, {0xc7182000}, {0xc7184000}, {0xc7186000}, + {0xc7188000}, {0xc718a000}, {0xc718c000}, {0xc718e000}, + {0xc7190000}, {0xc7192000}, {0xc7194000}, {0xc7196000}, + {0xc7198000}, {0xc719a000}, {0xc719c000}, {0xc719e000}, + {0xc71a0000}, {0xc71a2000}, {0xc71a4000}, {0xc71a6000}, + {0xc71a8000}, {0xc71aa000}, {0xc71ac000}, {0xc71ae000}, + {0xc71b0000}, {0xc71b2000}, {0xc71b4000}, {0xc71b6000}, + {0xc71b8000}, {0xc71ba000}, {0xc71bc000}, {0xc71be000}, + {0xc71c0000}, {0xc71c2000}, {0xc71c4000}, {0xc71c6000}, + {0xc71c8000}, {0xc71ca000}, {0xc71cc000}, {0xc71ce000}, + {0xc71d0000}, {0xc71d2000}, {0xc71d4000}, {0xc71d6000}, + {0xc71d8000}, {0xc71da000}, {0xc71dc000}, {0xc71de000}, + {0xc71e0000}, {0xc71e2000}, {0xc71e4000}, {0xc71e6000}, + {0xc71e8000}, {0xc71ea000}, {0xc71ec000}, {0xc71ee000}, + {0xc71f0000}, {0xc71f2000}, {0xc71f4000}, {0xc71f6000}, + {0xc71f8000}, {0xc71fa000}, {0xc71fc000}, {0xc71fe000}, + {0xc7200000}, {0xc7202000}, {0xc7204000}, {0xc7206000}, + {0xc7208000}, {0xc720a000}, {0xc720c000}, {0xc720e000}, + {0xc7210000}, {0xc7212000}, {0xc7214000}, {0xc7216000}, + {0xc7218000}, {0xc721a000}, {0xc721c000}, {0xc721e000}, + {0xc7220000}, {0xc7222000}, {0xc7224000}, {0xc7226000}, + {0xc7228000}, {0xc722a000}, {0xc722c000}, {0xc722e000}, + {0xc7230000}, {0xc7232000}, {0xc7234000}, {0xc7236000}, + {0xc7238000}, {0xc723a000}, {0xc723c000}, {0xc723e000}, + {0xc7240000}, {0xc7242000}, {0xc7244000}, {0xc7246000}, + {0xc7248000}, {0xc724a000}, {0xc724c000}, {0xc724e000}, + {0xc7250000}, {0xc7252000}, {0xc7254000}, {0xc7256000}, + {0xc7258000}, {0xc725a000}, {0xc725c000}, {0xc725e000}, + {0xc7260000}, {0xc7262000}, {0xc7264000}, {0xc7266000}, + {0xc7268000}, {0xc726a000}, {0xc726c000}, {0xc726e000}, + {0xc7270000}, {0xc7272000}, {0xc7274000}, {0xc7276000}, + {0xc7278000}, {0xc727a000}, {0xc727c000}, {0xc727e000}, + {0xc7280000}, {0xc7282000}, {0xc7284000}, {0xc7286000}, + {0xc7288000}, {0xc728a000}, {0xc728c000}, {0xc728e000}, + {0xc7290000}, {0xc7292000}, {0xc7294000}, {0xc7296000}, + {0xc7298000}, {0xc729a000}, {0xc729c000}, {0xc729e000}, + {0xc72a0000}, {0xc72a2000}, {0xc72a4000}, {0xc72a6000}, + {0xc72a8000}, {0xc72aa000}, {0xc72ac000}, {0xc72ae000}, + {0xc72b0000}, {0xc72b2000}, {0xc72b4000}, {0xc72b6000}, + {0xc72b8000}, {0xc72ba000}, {0xc72bc000}, {0xc72be000}, + {0xc72c0000}, {0xc72c2000}, {0xc72c4000}, {0xc72c6000}, + {0xc72c8000}, {0xc72ca000}, {0xc72cc000}, {0xc72ce000}, + {0xc72d0000}, {0xc72d2000}, {0xc72d4000}, {0xc72d6000}, + {0xc72d8000}, {0xc72da000}, {0xc72dc000}, {0xc72de000}, + {0xc72e0000}, {0xc72e2000}, {0xc72e4000}, {0xc72e6000}, + {0xc72e8000}, {0xc72ea000}, {0xc72ec000}, {0xc72ee000}, + {0xc72f0000}, {0xc72f2000}, {0xc72f4000}, {0xc72f6000}, + {0xc72f8000}, {0xc72fa000}, {0xc72fc000}, {0xc72fe000}, + {0xc7300000}, {0xc7302000}, {0xc7304000}, {0xc7306000}, + {0xc7308000}, {0xc730a000}, {0xc730c000}, {0xc730e000}, + {0xc7310000}, {0xc7312000}, {0xc7314000}, {0xc7316000}, + {0xc7318000}, {0xc731a000}, {0xc731c000}, {0xc731e000}, + {0xc7320000}, {0xc7322000}, {0xc7324000}, {0xc7326000}, + {0xc7328000}, {0xc732a000}, {0xc732c000}, {0xc732e000}, + {0xc7330000}, {0xc7332000}, {0xc7334000}, {0xc7336000}, + {0xc7338000}, {0xc733a000}, {0xc733c000}, {0xc733e000}, + {0xc7340000}, {0xc7342000}, {0xc7344000}, {0xc7346000}, + {0xc7348000}, {0xc734a000}, {0xc734c000}, {0xc734e000}, + {0xc7350000}, {0xc7352000}, {0xc7354000}, {0xc7356000}, + {0xc7358000}, {0xc735a000}, {0xc735c000}, {0xc735e000}, + {0xc7360000}, {0xc7362000}, {0xc7364000}, {0xc7366000}, + {0xc7368000}, {0xc736a000}, {0xc736c000}, {0xc736e000}, + {0xc7370000}, {0xc7372000}, {0xc7374000}, {0xc7376000}, + {0xc7378000}, {0xc737a000}, {0xc737c000}, {0xc737e000}, + {0xc7380000}, {0xc7382000}, {0xc7384000}, {0xc7386000}, + {0xc7388000}, {0xc738a000}, {0xc738c000}, {0xc738e000}, + {0xc7390000}, {0xc7392000}, {0xc7394000}, {0xc7396000}, + {0xc7398000}, {0xc739a000}, {0xc739c000}, {0xc739e000}, + {0xc73a0000}, {0xc73a2000}, {0xc73a4000}, {0xc73a6000}, + {0xc73a8000}, {0xc73aa000}, {0xc73ac000}, {0xc73ae000}, + {0xc73b0000}, {0xc73b2000}, {0xc73b4000}, {0xc73b6000}, + {0xc73b8000}, {0xc73ba000}, {0xc73bc000}, {0xc73be000}, + {0xc73c0000}, {0xc73c2000}, {0xc73c4000}, {0xc73c6000}, + {0xc73c8000}, {0xc73ca000}, {0xc73cc000}, {0xc73ce000}, + {0xc73d0000}, {0xc73d2000}, {0xc73d4000}, {0xc73d6000}, + {0xc73d8000}, {0xc73da000}, {0xc73dc000}, {0xc73de000}, + {0xc73e0000}, {0xc73e2000}, {0xc73e4000}, {0xc73e6000}, + {0xc73e8000}, {0xc73ea000}, {0xc73ec000}, {0xc73ee000}, + {0xc73f0000}, {0xc73f2000}, {0xc73f4000}, {0xc73f6000}, + {0xc73f8000}, {0xc73fa000}, {0xc73fc000}, {0xc73fe000}, + {0xc7400000}, {0xc7402000}, {0xc7404000}, {0xc7406000}, + {0xc7408000}, {0xc740a000}, {0xc740c000}, {0xc740e000}, + {0xc7410000}, {0xc7412000}, {0xc7414000}, {0xc7416000}, + {0xc7418000}, {0xc741a000}, {0xc741c000}, {0xc741e000}, + {0xc7420000}, {0xc7422000}, {0xc7424000}, {0xc7426000}, + {0xc7428000}, {0xc742a000}, {0xc742c000}, {0xc742e000}, + {0xc7430000}, {0xc7432000}, {0xc7434000}, {0xc7436000}, + {0xc7438000}, {0xc743a000}, {0xc743c000}, {0xc743e000}, + {0xc7440000}, {0xc7442000}, {0xc7444000}, {0xc7446000}, + {0xc7448000}, {0xc744a000}, {0xc744c000}, {0xc744e000}, + {0xc7450000}, {0xc7452000}, {0xc7454000}, {0xc7456000}, + {0xc7458000}, {0xc745a000}, {0xc745c000}, {0xc745e000}, + {0xc7460000}, {0xc7462000}, {0xc7464000}, {0xc7466000}, + {0xc7468000}, {0xc746a000}, {0xc746c000}, {0xc746e000}, + {0xc7470000}, {0xc7472000}, {0xc7474000}, {0xc7476000}, + {0xc7478000}, {0xc747a000}, {0xc747c000}, {0xc747e000}, + {0xc7480000}, {0xc7482000}, {0xc7484000}, {0xc7486000}, + {0xc7488000}, {0xc748a000}, {0xc748c000}, {0xc748e000}, + {0xc7490000}, {0xc7492000}, {0xc7494000}, {0xc7496000}, + {0xc7498000}, {0xc749a000}, {0xc749c000}, {0xc749e000}, + {0xc74a0000}, {0xc74a2000}, {0xc74a4000}, {0xc74a6000}, + {0xc74a8000}, {0xc74aa000}, {0xc74ac000}, {0xc74ae000}, + {0xc74b0000}, {0xc74b2000}, {0xc74b4000}, {0xc74b6000}, + {0xc74b8000}, {0xc74ba000}, {0xc74bc000}, {0xc74be000}, + {0xc74c0000}, {0xc74c2000}, {0xc74c4000}, {0xc74c6000}, + {0xc74c8000}, {0xc74ca000}, {0xc74cc000}, {0xc74ce000}, + {0xc74d0000}, {0xc74d2000}, {0xc74d4000}, {0xc74d6000}, + {0xc74d8000}, {0xc74da000}, {0xc74dc000}, {0xc74de000}, + {0xc74e0000}, {0xc74e2000}, {0xc74e4000}, {0xc74e6000}, + {0xc74e8000}, {0xc74ea000}, {0xc74ec000}, {0xc74ee000}, + {0xc74f0000}, {0xc74f2000}, {0xc74f4000}, {0xc74f6000}, + {0xc74f8000}, {0xc74fa000}, {0xc74fc000}, {0xc74fe000}, + {0xc7500000}, {0xc7502000}, {0xc7504000}, {0xc7506000}, + {0xc7508000}, {0xc750a000}, {0xc750c000}, {0xc750e000}, + {0xc7510000}, {0xc7512000}, {0xc7514000}, {0xc7516000}, + {0xc7518000}, {0xc751a000}, {0xc751c000}, {0xc751e000}, + {0xc7520000}, {0xc7522000}, {0xc7524000}, {0xc7526000}, + {0xc7528000}, {0xc752a000}, {0xc752c000}, {0xc752e000}, + {0xc7530000}, {0xc7532000}, {0xc7534000}, {0xc7536000}, + {0xc7538000}, {0xc753a000}, {0xc753c000}, {0xc753e000}, + {0xc7540000}, {0xc7542000}, {0xc7544000}, {0xc7546000}, + {0xc7548000}, {0xc754a000}, {0xc754c000}, {0xc754e000}, + {0xc7550000}, {0xc7552000}, {0xc7554000}, {0xc7556000}, + {0xc7558000}, {0xc755a000}, {0xc755c000}, {0xc755e000}, + {0xc7560000}, {0xc7562000}, {0xc7564000}, {0xc7566000}, + {0xc7568000}, {0xc756a000}, {0xc756c000}, {0xc756e000}, + {0xc7570000}, {0xc7572000}, {0xc7574000}, {0xc7576000}, + {0xc7578000}, {0xc757a000}, {0xc757c000}, {0xc757e000}, + {0xc7580000}, {0xc7582000}, {0xc7584000}, {0xc7586000}, + {0xc7588000}, {0xc758a000}, {0xc758c000}, {0xc758e000}, + {0xc7590000}, {0xc7592000}, {0xc7594000}, {0xc7596000}, + {0xc7598000}, {0xc759a000}, {0xc759c000}, {0xc759e000}, + {0xc75a0000}, {0xc75a2000}, {0xc75a4000}, {0xc75a6000}, + {0xc75a8000}, {0xc75aa000}, {0xc75ac000}, {0xc75ae000}, + {0xc75b0000}, {0xc75b2000}, {0xc75b4000}, {0xc75b6000}, + {0xc75b8000}, {0xc75ba000}, {0xc75bc000}, {0xc75be000}, + {0xc75c0000}, {0xc75c2000}, {0xc75c4000}, {0xc75c6000}, + {0xc75c8000}, {0xc75ca000}, {0xc75cc000}, {0xc75ce000}, + {0xc75d0000}, {0xc75d2000}, {0xc75d4000}, {0xc75d6000}, + {0xc75d8000}, {0xc75da000}, {0xc75dc000}, {0xc75de000}, + {0xc75e0000}, {0xc75e2000}, {0xc75e4000}, {0xc75e6000}, + {0xc75e8000}, {0xc75ea000}, {0xc75ec000}, {0xc75ee000}, + {0xc75f0000}, {0xc75f2000}, {0xc75f4000}, {0xc75f6000}, + {0xc75f8000}, {0xc75fa000}, {0xc75fc000}, {0xc75fe000}, + {0xc7600000}, {0xc7602000}, {0xc7604000}, {0xc7606000}, + {0xc7608000}, {0xc760a000}, {0xc760c000}, {0xc760e000}, + {0xc7610000}, {0xc7612000}, {0xc7614000}, {0xc7616000}, + {0xc7618000}, {0xc761a000}, {0xc761c000}, {0xc761e000}, + {0xc7620000}, {0xc7622000}, {0xc7624000}, {0xc7626000}, + {0xc7628000}, {0xc762a000}, {0xc762c000}, {0xc762e000}, + {0xc7630000}, {0xc7632000}, {0xc7634000}, {0xc7636000}, + {0xc7638000}, {0xc763a000}, {0xc763c000}, {0xc763e000}, + {0xc7640000}, {0xc7642000}, {0xc7644000}, {0xc7646000}, + {0xc7648000}, {0xc764a000}, {0xc764c000}, {0xc764e000}, + {0xc7650000}, {0xc7652000}, {0xc7654000}, {0xc7656000}, + {0xc7658000}, {0xc765a000}, {0xc765c000}, {0xc765e000}, + {0xc7660000}, {0xc7662000}, {0xc7664000}, {0xc7666000}, + {0xc7668000}, {0xc766a000}, {0xc766c000}, {0xc766e000}, + {0xc7670000}, {0xc7672000}, {0xc7674000}, {0xc7676000}, + {0xc7678000}, {0xc767a000}, {0xc767c000}, {0xc767e000}, + {0xc7680000}, {0xc7682000}, {0xc7684000}, {0xc7686000}, + {0xc7688000}, {0xc768a000}, {0xc768c000}, {0xc768e000}, + {0xc7690000}, {0xc7692000}, {0xc7694000}, {0xc7696000}, + {0xc7698000}, {0xc769a000}, {0xc769c000}, {0xc769e000}, + {0xc76a0000}, {0xc76a2000}, {0xc76a4000}, {0xc76a6000}, + {0xc76a8000}, {0xc76aa000}, {0xc76ac000}, {0xc76ae000}, + {0xc76b0000}, {0xc76b2000}, {0xc76b4000}, {0xc76b6000}, + {0xc76b8000}, {0xc76ba000}, {0xc76bc000}, {0xc76be000}, + {0xc76c0000}, {0xc76c2000}, {0xc76c4000}, {0xc76c6000}, + {0xc76c8000}, {0xc76ca000}, {0xc76cc000}, {0xc76ce000}, + {0xc76d0000}, {0xc76d2000}, {0xc76d4000}, {0xc76d6000}, + {0xc76d8000}, {0xc76da000}, {0xc76dc000}, {0xc76de000}, + {0xc76e0000}, {0xc76e2000}, {0xc76e4000}, {0xc76e6000}, + {0xc76e8000}, {0xc76ea000}, {0xc76ec000}, {0xc76ee000}, + {0xc76f0000}, {0xc76f2000}, {0xc76f4000}, {0xc76f6000}, + {0xc76f8000}, {0xc76fa000}, {0xc76fc000}, {0xc76fe000}, + {0xc7700000}, {0xc7702000}, {0xc7704000}, {0xc7706000}, + {0xc7708000}, {0xc770a000}, {0xc770c000}, {0xc770e000}, + {0xc7710000}, {0xc7712000}, {0xc7714000}, {0xc7716000}, + {0xc7718000}, {0xc771a000}, {0xc771c000}, {0xc771e000}, + {0xc7720000}, {0xc7722000}, {0xc7724000}, {0xc7726000}, + {0xc7728000}, {0xc772a000}, {0xc772c000}, {0xc772e000}, + {0xc7730000}, {0xc7732000}, {0xc7734000}, {0xc7736000}, + {0xc7738000}, {0xc773a000}, {0xc773c000}, {0xc773e000}, + {0xc7740000}, {0xc7742000}, {0xc7744000}, {0xc7746000}, + {0xc7748000}, {0xc774a000}, {0xc774c000}, {0xc774e000}, + {0xc7750000}, {0xc7752000}, {0xc7754000}, {0xc7756000}, + {0xc7758000}, {0xc775a000}, {0xc775c000}, {0xc775e000}, + {0xc7760000}, {0xc7762000}, {0xc7764000}, {0xc7766000}, + {0xc7768000}, {0xc776a000}, {0xc776c000}, {0xc776e000}, + {0xc7770000}, {0xc7772000}, {0xc7774000}, {0xc7776000}, + {0xc7778000}, {0xc777a000}, {0xc777c000}, {0xc777e000}, + {0xc7780000}, {0xc7782000}, {0xc7784000}, {0xc7786000}, + {0xc7788000}, {0xc778a000}, {0xc778c000}, {0xc778e000}, + {0xc7790000}, {0xc7792000}, {0xc7794000}, {0xc7796000}, + {0xc7798000}, {0xc779a000}, {0xc779c000}, {0xc779e000}, + {0xc77a0000}, {0xc77a2000}, {0xc77a4000}, {0xc77a6000}, + {0xc77a8000}, {0xc77aa000}, {0xc77ac000}, {0xc77ae000}, + {0xc77b0000}, {0xc77b2000}, {0xc77b4000}, {0xc77b6000}, + {0xc77b8000}, {0xc77ba000}, {0xc77bc000}, {0xc77be000}, + {0xc77c0000}, {0xc77c2000}, {0xc77c4000}, {0xc77c6000}, + {0xc77c8000}, {0xc77ca000}, {0xc77cc000}, {0xc77ce000}, + {0xc77d0000}, {0xc77d2000}, {0xc77d4000}, {0xc77d6000}, + {0xc77d8000}, {0xc77da000}, {0xc77dc000}, {0xc77de000}, + {0xc77e0000}, {0xc77e2000}, {0xc77e4000}, {0xc77e6000}, + {0xc77e8000}, {0xc77ea000}, {0xc77ec000}, {0xc77ee000}, + {0xc77f0000}, {0xc77f2000}, {0xc77f4000}, {0xc77f6000}, + {0xc77f8000}, {0xc77fa000}, {0xc77fc000}, {0xc77fe000}, + {0xff800000}, {0xff802000}, {0xff804000}, {0xff806000}, + {0xff808000}, {0xff80a000}, {0xff80c000}, {0xff80e000}, + {0xff810000}, {0xff812000}, {0xff814000}, {0xff816000}, + {0xff818000}, {0xff81a000}, {0xff81c000}, {0xff81e000}, + {0xff820000}, {0xff822000}, {0xff824000}, {0xff826000}, + {0xff828000}, {0xff82a000}, {0xff82c000}, {0xff82e000}, + {0xff830000}, {0xff832000}, {0xff834000}, {0xff836000}, + {0xff838000}, {0xff83a000}, {0xff83c000}, {0xff83e000}, + {0xff840000}, {0xff842000}, {0xff844000}, {0xff846000}, + {0xff848000}, {0xff84a000}, {0xff84c000}, {0xff84e000}, + {0xff850000}, {0xff852000}, {0xff854000}, {0xff856000}, + {0xff858000}, {0xff85a000}, {0xff85c000}, {0xff85e000}, + {0xff860000}, {0xff862000}, {0xff864000}, {0xff866000}, + {0xff868000}, {0xff86a000}, {0xff86c000}, {0xff86e000}, + {0xff870000}, {0xff872000}, {0xff874000}, {0xff876000}, + {0xff878000}, {0xff87a000}, {0xff87c000}, {0xff87e000}, + {0xff880000}, {0xff882000}, {0xff884000}, {0xff886000}, + {0xff888000}, {0xff88a000}, {0xff88c000}, {0xff88e000}, + {0xff890000}, {0xff892000}, {0xff894000}, {0xff896000}, + {0xff898000}, {0xff89a000}, {0xff89c000}, {0xff89e000}, + {0xff8a0000}, {0xff8a2000}, {0xff8a4000}, {0xff8a6000}, + {0xff8a8000}, {0xff8aa000}, {0xff8ac000}, {0xff8ae000}, + {0xff8b0000}, {0xff8b2000}, {0xff8b4000}, {0xff8b6000}, + {0xff8b8000}, {0xff8ba000}, {0xff8bc000}, {0xff8be000}, + {0xff8c0000}, {0xff8c2000}, {0xff8c4000}, {0xff8c6000}, + {0xff8c8000}, {0xff8ca000}, {0xff8cc000}, {0xff8ce000}, + {0xff8d0000}, {0xff8d2000}, {0xff8d4000}, {0xff8d6000}, + {0xff8d8000}, {0xff8da000}, {0xff8dc000}, {0xff8de000}, + {0xff8e0000}, {0xff8e2000}, {0xff8e4000}, {0xff8e6000}, + {0xff8e8000}, {0xff8ea000}, {0xff8ec000}, {0xff8ee000}, + {0xff8f0000}, {0xff8f2000}, {0xff8f4000}, {0xff8f6000}, + {0xff8f8000}, {0xff8fa000}, {0xff8fc000}, {0xff8fe000}, + {0xff900000}, {0xff902000}, {0xff904000}, {0xff906000}, + {0xff908000}, {0xff90a000}, {0xff90c000}, {0xff90e000}, + {0xff910000}, {0xff912000}, {0xff914000}, {0xff916000}, + {0xff918000}, {0xff91a000}, {0xff91c000}, {0xff91e000}, + {0xff920000}, {0xff922000}, {0xff924000}, {0xff926000}, + {0xff928000}, {0xff92a000}, {0xff92c000}, {0xff92e000}, + {0xff930000}, {0xff932000}, {0xff934000}, {0xff936000}, + {0xff938000}, {0xff93a000}, {0xff93c000}, {0xff93e000}, + {0xff940000}, {0xff942000}, {0xff944000}, {0xff946000}, + {0xff948000}, {0xff94a000}, {0xff94c000}, {0xff94e000}, + {0xff950000}, {0xff952000}, {0xff954000}, {0xff956000}, + {0xff958000}, {0xff95a000}, {0xff95c000}, {0xff95e000}, + {0xff960000}, {0xff962000}, {0xff964000}, {0xff966000}, + {0xff968000}, {0xff96a000}, {0xff96c000}, {0xff96e000}, + {0xff970000}, {0xff972000}, {0xff974000}, {0xff976000}, + {0xff978000}, {0xff97a000}, {0xff97c000}, {0xff97e000}, + {0xff980000}, {0xff982000}, {0xff984000}, {0xff986000}, + {0xff988000}, {0xff98a000}, {0xff98c000}, {0xff98e000}, + {0xff990000}, {0xff992000}, {0xff994000}, {0xff996000}, + {0xff998000}, {0xff99a000}, {0xff99c000}, {0xff99e000}, + {0xff9a0000}, {0xff9a2000}, {0xff9a4000}, {0xff9a6000}, + {0xff9a8000}, {0xff9aa000}, {0xff9ac000}, {0xff9ae000}, + {0xff9b0000}, {0xff9b2000}, {0xff9b4000}, {0xff9b6000}, + {0xff9b8000}, {0xff9ba000}, {0xff9bc000}, {0xff9be000}, + {0xff9c0000}, {0xff9c2000}, {0xff9c4000}, {0xff9c6000}, + {0xff9c8000}, {0xff9ca000}, {0xff9cc000}, {0xff9ce000}, + {0xff9d0000}, {0xff9d2000}, {0xff9d4000}, {0xff9d6000}, + {0xff9d8000}, {0xff9da000}, {0xff9dc000}, {0xff9de000}, + {0xff9e0000}, {0xff9e2000}, {0xff9e4000}, {0xff9e6000}, + {0xff9e8000}, {0xff9ea000}, {0xff9ec000}, {0xff9ee000}, + {0xff9f0000}, {0xff9f2000}, {0xff9f4000}, {0xff9f6000}, + {0xff9f8000}, {0xff9fa000}, {0xff9fc000}, {0xff9fe000}, + {0xffa00000}, {0xffa02000}, {0xffa04000}, {0xffa06000}, + {0xffa08000}, {0xffa0a000}, {0xffa0c000}, {0xffa0e000}, + {0xffa10000}, {0xffa12000}, {0xffa14000}, {0xffa16000}, + {0xffa18000}, {0xffa1a000}, {0xffa1c000}, {0xffa1e000}, + {0xffa20000}, {0xffa22000}, {0xffa24000}, {0xffa26000}, + {0xffa28000}, {0xffa2a000}, {0xffa2c000}, {0xffa2e000}, + {0xffa30000}, {0xffa32000}, {0xffa34000}, {0xffa36000}, + {0xffa38000}, {0xffa3a000}, {0xffa3c000}, {0xffa3e000}, + {0xffa40000}, {0xffa42000}, {0xffa44000}, {0xffa46000}, + {0xffa48000}, {0xffa4a000}, {0xffa4c000}, {0xffa4e000}, + {0xffa50000}, {0xffa52000}, {0xffa54000}, {0xffa56000}, + {0xffa58000}, {0xffa5a000}, {0xffa5c000}, {0xffa5e000}, + {0xffa60000}, {0xffa62000}, {0xffa64000}, {0xffa66000}, + {0xffa68000}, {0xffa6a000}, {0xffa6c000}, {0xffa6e000}, + {0xffa70000}, {0xffa72000}, {0xffa74000}, {0xffa76000}, + {0xffa78000}, {0xffa7a000}, {0xffa7c000}, {0xffa7e000}, + {0xffa80000}, {0xffa82000}, {0xffa84000}, {0xffa86000}, + {0xffa88000}, {0xffa8a000}, {0xffa8c000}, {0xffa8e000}, + {0xffa90000}, {0xffa92000}, {0xffa94000}, {0xffa96000}, + {0xffa98000}, {0xffa9a000}, {0xffa9c000}, {0xffa9e000}, + {0xffaa0000}, {0xffaa2000}, {0xffaa4000}, {0xffaa6000}, + {0xffaa8000}, {0xffaaa000}, {0xffaac000}, {0xffaae000}, + {0xffab0000}, {0xffab2000}, {0xffab4000}, {0xffab6000}, + {0xffab8000}, {0xffaba000}, {0xffabc000}, {0xffabe000}, + {0xffac0000}, {0xffac2000}, {0xffac4000}, {0xffac6000}, + {0xffac8000}, {0xffaca000}, {0xffacc000}, {0xfface000}, + {0xffad0000}, {0xffad2000}, {0xffad4000}, {0xffad6000}, + {0xffad8000}, {0xffada000}, {0xffadc000}, {0xffade000}, + {0xffae0000}, {0xffae2000}, {0xffae4000}, {0xffae6000}, + {0xffae8000}, {0xffaea000}, {0xffaec000}, {0xffaee000}, + {0xffaf0000}, {0xffaf2000}, {0xffaf4000}, {0xffaf6000}, + {0xffaf8000}, {0xffafa000}, {0xffafc000}, {0xffafe000}, + {0xffb00000}, {0xffb02000}, {0xffb04000}, {0xffb06000}, + {0xffb08000}, {0xffb0a000}, {0xffb0c000}, {0xffb0e000}, + {0xffb10000}, {0xffb12000}, {0xffb14000}, {0xffb16000}, + {0xffb18000}, {0xffb1a000}, {0xffb1c000}, {0xffb1e000}, + {0xffb20000}, {0xffb22000}, {0xffb24000}, {0xffb26000}, + {0xffb28000}, {0xffb2a000}, {0xffb2c000}, {0xffb2e000}, + {0xffb30000}, {0xffb32000}, {0xffb34000}, {0xffb36000}, + {0xffb38000}, {0xffb3a000}, {0xffb3c000}, {0xffb3e000}, + {0xffb40000}, {0xffb42000}, {0xffb44000}, {0xffb46000}, + {0xffb48000}, {0xffb4a000}, {0xffb4c000}, {0xffb4e000}, + {0xffb50000}, {0xffb52000}, {0xffb54000}, {0xffb56000}, + {0xffb58000}, {0xffb5a000}, {0xffb5c000}, {0xffb5e000}, + {0xffb60000}, {0xffb62000}, {0xffb64000}, {0xffb66000}, + {0xffb68000}, {0xffb6a000}, {0xffb6c000}, {0xffb6e000}, + {0xffb70000}, {0xffb72000}, {0xffb74000}, {0xffb76000}, + {0xffb78000}, {0xffb7a000}, {0xffb7c000}, {0xffb7e000}, + {0xffb80000}, {0xffb82000}, {0xffb84000}, {0xffb86000}, + {0xffb88000}, {0xffb8a000}, {0xffb8c000}, {0xffb8e000}, + {0xffb90000}, {0xffb92000}, {0xffb94000}, {0xffb96000}, + {0xffb98000}, {0xffb9a000}, {0xffb9c000}, {0xffb9e000}, + {0xffba0000}, {0xffba2000}, {0xffba4000}, {0xffba6000}, + {0xffba8000}, {0xffbaa000}, {0xffbac000}, {0xffbae000}, + {0xffbb0000}, {0xffbb2000}, {0xffbb4000}, {0xffbb6000}, + {0xffbb8000}, {0xffbba000}, {0xffbbc000}, {0xffbbe000}, + {0xffbc0000}, {0xffbc2000}, {0xffbc4000}, {0xffbc6000}, + {0xffbc8000}, {0xffbca000}, {0xffbcc000}, {0xffbce000}, + {0xffbd0000}, {0xffbd2000}, {0xffbd4000}, {0xffbd6000}, + {0xffbd8000}, {0xffbda000}, {0xffbdc000}, {0xffbde000}, + {0xffbe0000}, {0xffbe2000}, {0xffbe4000}, {0xffbe6000}, + {0xffbe8000}, {0xffbea000}, {0xffbec000}, {0xffbee000}, + {0xffbf0000}, {0xffbf2000}, {0xffbf4000}, {0xffbf6000}, + {0xffbf8000}, {0xffbfa000}, {0xffbfc000}, {0xffbfe000}, + {0xffc00000}, {0xffc02000}, {0xffc04000}, {0xffc06000}, + {0xffc08000}, {0xffc0a000}, {0xffc0c000}, {0xffc0e000}, + {0xffc10000}, {0xffc12000}, {0xffc14000}, {0xffc16000}, + {0xffc18000}, {0xffc1a000}, {0xffc1c000}, {0xffc1e000}, + {0xffc20000}, {0xffc22000}, {0xffc24000}, {0xffc26000}, + {0xffc28000}, {0xffc2a000}, {0xffc2c000}, {0xffc2e000}, + {0xffc30000}, {0xffc32000}, {0xffc34000}, {0xffc36000}, + {0xffc38000}, {0xffc3a000}, {0xffc3c000}, {0xffc3e000}, + {0xffc40000}, {0xffc42000}, {0xffc44000}, {0xffc46000}, + {0xffc48000}, {0xffc4a000}, {0xffc4c000}, {0xffc4e000}, + {0xffc50000}, {0xffc52000}, {0xffc54000}, {0xffc56000}, + {0xffc58000}, {0xffc5a000}, {0xffc5c000}, {0xffc5e000}, + {0xffc60000}, {0xffc62000}, {0xffc64000}, {0xffc66000}, + {0xffc68000}, {0xffc6a000}, {0xffc6c000}, {0xffc6e000}, + {0xffc70000}, {0xffc72000}, {0xffc74000}, {0xffc76000}, + {0xffc78000}, {0xffc7a000}, {0xffc7c000}, {0xffc7e000}, + {0xffc80000}, {0xffc82000}, {0xffc84000}, {0xffc86000}, + {0xffc88000}, {0xffc8a000}, {0xffc8c000}, {0xffc8e000}, + {0xffc90000}, {0xffc92000}, {0xffc94000}, {0xffc96000}, + {0xffc98000}, {0xffc9a000}, {0xffc9c000}, {0xffc9e000}, + {0xffca0000}, {0xffca2000}, {0xffca4000}, {0xffca6000}, + {0xffca8000}, {0xffcaa000}, {0xffcac000}, {0xffcae000}, + {0xffcb0000}, {0xffcb2000}, {0xffcb4000}, {0xffcb6000}, + {0xffcb8000}, {0xffcba000}, {0xffcbc000}, {0xffcbe000}, + {0xffcc0000}, {0xffcc2000}, {0xffcc4000}, {0xffcc6000}, + {0xffcc8000}, {0xffcca000}, {0xffccc000}, {0xffcce000}, + {0xffcd0000}, {0xffcd2000}, {0xffcd4000}, {0xffcd6000}, + {0xffcd8000}, {0xffcda000}, {0xffcdc000}, {0xffcde000}, + {0xffce0000}, {0xffce2000}, {0xffce4000}, {0xffce6000}, + {0xffce8000}, {0xffcea000}, {0xffcec000}, {0xffcee000}, + {0xffcf0000}, {0xffcf2000}, {0xffcf4000}, {0xffcf6000}, + {0xffcf8000}, {0xffcfa000}, {0xffcfc000}, {0xffcfe000}, + {0xffd00000}, {0xffd02000}, {0xffd04000}, {0xffd06000}, + {0xffd08000}, {0xffd0a000}, {0xffd0c000}, {0xffd0e000}, + {0xffd10000}, {0xffd12000}, {0xffd14000}, {0xffd16000}, + {0xffd18000}, {0xffd1a000}, {0xffd1c000}, {0xffd1e000}, + {0xffd20000}, {0xffd22000}, {0xffd24000}, {0xffd26000}, + {0xffd28000}, {0xffd2a000}, {0xffd2c000}, {0xffd2e000}, + {0xffd30000}, {0xffd32000}, {0xffd34000}, {0xffd36000}, + {0xffd38000}, {0xffd3a000}, {0xffd3c000}, {0xffd3e000}, + {0xffd40000}, {0xffd42000}, {0xffd44000}, {0xffd46000}, + {0xffd48000}, {0xffd4a000}, {0xffd4c000}, {0xffd4e000}, + {0xffd50000}, {0xffd52000}, {0xffd54000}, {0xffd56000}, + {0xffd58000}, {0xffd5a000}, {0xffd5c000}, {0xffd5e000}, + {0xffd60000}, {0xffd62000}, {0xffd64000}, {0xffd66000}, + {0xffd68000}, {0xffd6a000}, {0xffd6c000}, {0xffd6e000}, + {0xffd70000}, {0xffd72000}, {0xffd74000}, {0xffd76000}, + {0xffd78000}, {0xffd7a000}, {0xffd7c000}, {0xffd7e000}, + {0xffd80000}, {0xffd82000}, {0xffd84000}, {0xffd86000}, + {0xffd88000}, {0xffd8a000}, {0xffd8c000}, {0xffd8e000}, + {0xffd90000}, {0xffd92000}, {0xffd94000}, {0xffd96000}, + {0xffd98000}, {0xffd9a000}, {0xffd9c000}, {0xffd9e000}, + {0xffda0000}, {0xffda2000}, {0xffda4000}, {0xffda6000}, + {0xffda8000}, {0xffdaa000}, {0xffdac000}, {0xffdae000}, + {0xffdb0000}, {0xffdb2000}, {0xffdb4000}, {0xffdb6000}, + {0xffdb8000}, {0xffdba000}, {0xffdbc000}, {0xffdbe000}, + {0xffdc0000}, {0xffdc2000}, {0xffdc4000}, {0xffdc6000}, + {0xffdc8000}, {0xffdca000}, {0xffdcc000}, {0xffdce000}, + {0xffdd0000}, {0xffdd2000}, {0xffdd4000}, {0xffdd6000}, + {0xffdd8000}, {0xffdda000}, {0xffddc000}, {0xffdde000}, + {0xffde0000}, {0xffde2000}, {0xffde4000}, {0xffde6000}, + {0xffde8000}, {0xffdea000}, {0xffdec000}, {0xffdee000}, + {0xffdf0000}, {0xffdf2000}, {0xffdf4000}, {0xffdf6000}, + {0xffdf8000}, {0xffdfa000}, {0xffdfc000}, {0xffdfe000}, + {0xffe00000}, {0xffe02000}, {0xffe04000}, {0xffe06000}, + {0xffe08000}, {0xffe0a000}, {0xffe0c000}, {0xffe0e000}, + {0xffe10000}, {0xffe12000}, {0xffe14000}, {0xffe16000}, + {0xffe18000}, {0xffe1a000}, {0xffe1c000}, {0xffe1e000}, + {0xffe20000}, {0xffe22000}, {0xffe24000}, {0xffe26000}, + {0xffe28000}, {0xffe2a000}, {0xffe2c000}, {0xffe2e000}, + {0xffe30000}, {0xffe32000}, {0xffe34000}, {0xffe36000}, + {0xffe38000}, {0xffe3a000}, {0xffe3c000}, {0xffe3e000}, + {0xffe40000}, {0xffe42000}, {0xffe44000}, {0xffe46000}, + {0xffe48000}, {0xffe4a000}, {0xffe4c000}, {0xffe4e000}, + {0xffe50000}, {0xffe52000}, {0xffe54000}, {0xffe56000}, + {0xffe58000}, {0xffe5a000}, {0xffe5c000}, {0xffe5e000}, + {0xffe60000}, {0xffe62000}, {0xffe64000}, {0xffe66000}, + {0xffe68000}, {0xffe6a000}, {0xffe6c000}, {0xffe6e000}, + {0xffe70000}, {0xffe72000}, {0xffe74000}, {0xffe76000}, + {0xffe78000}, {0xffe7a000}, {0xffe7c000}, {0xffe7e000}, + {0xffe80000}, {0xffe82000}, {0xffe84000}, {0xffe86000}, + {0xffe88000}, {0xffe8a000}, {0xffe8c000}, {0xffe8e000}, + {0xffe90000}, {0xffe92000}, {0xffe94000}, {0xffe96000}, + {0xffe98000}, {0xffe9a000}, {0xffe9c000}, {0xffe9e000}, + {0xffea0000}, {0xffea2000}, {0xffea4000}, {0xffea6000}, + {0xffea8000}, {0xffeaa000}, {0xffeac000}, {0xffeae000}, + {0xffeb0000}, {0xffeb2000}, {0xffeb4000}, {0xffeb6000}, + {0xffeb8000}, {0xffeba000}, {0xffebc000}, {0xffebe000}, + {0xffec0000}, {0xffec2000}, {0xffec4000}, {0xffec6000}, + {0xffec8000}, {0xffeca000}, {0xffecc000}, {0xffece000}, + {0xffed0000}, {0xffed2000}, {0xffed4000}, {0xffed6000}, + {0xffed8000}, {0xffeda000}, {0xffedc000}, {0xffede000}, + {0xffee0000}, {0xffee2000}, {0xffee4000}, {0xffee6000}, + {0xffee8000}, {0xffeea000}, {0xffeec000}, {0xffeee000}, + {0xffef0000}, {0xffef2000}, {0xffef4000}, {0xffef6000}, + {0xffef8000}, {0xffefa000}, {0xffefc000}, {0xffefe000}, + {0xfff00000}, {0xfff02000}, {0xfff04000}, {0xfff06000}, + {0xfff08000}, {0xfff0a000}, {0xfff0c000}, {0xfff0e000}, + {0xfff10000}, {0xfff12000}, {0xfff14000}, {0xfff16000}, + {0xfff18000}, {0xfff1a000}, {0xfff1c000}, {0xfff1e000}, + {0xfff20000}, {0xfff22000}, {0xfff24000}, {0xfff26000}, + {0xfff28000}, {0xfff2a000}, {0xfff2c000}, {0xfff2e000}, + {0xfff30000}, {0xfff32000}, {0xfff34000}, {0xfff36000}, + {0xfff38000}, {0xfff3a000}, {0xfff3c000}, {0xfff3e000}, + {0xfff40000}, {0xfff42000}, {0xfff44000}, {0xfff46000}, + {0xfff48000}, {0xfff4a000}, {0xfff4c000}, {0xfff4e000}, + {0xfff50000}, {0xfff52000}, {0xfff54000}, {0xfff56000}, + {0xfff58000}, {0xfff5a000}, {0xfff5c000}, {0xfff5e000}, + {0xfff60000}, {0xfff62000}, {0xfff64000}, {0xfff66000}, + {0xfff68000}, {0xfff6a000}, {0xfff6c000}, {0xfff6e000}, + {0xfff70000}, {0xfff72000}, {0xfff74000}, {0xfff76000}, + {0xfff78000}, {0xfff7a000}, {0xfff7c000}, {0xfff7e000}, + {0xfff80000}, {0xfff82000}, {0xfff84000}, {0xfff86000}, + {0xfff88000}, {0xfff8a000}, {0xfff8c000}, {0xfff8e000}, + {0xfff90000}, {0xfff92000}, {0xfff94000}, {0xfff96000}, + {0xfff98000}, {0xfff9a000}, {0xfff9c000}, {0xfff9e000}, + {0xfffa0000}, {0xfffa2000}, {0xfffa4000}, {0xfffa6000}, + {0xfffa8000}, {0xfffaa000}, {0xfffac000}, {0xfffae000}, + {0xfffb0000}, {0xfffb2000}, {0xfffb4000}, {0xfffb6000}, + {0xfffb8000}, {0xfffba000}, {0xfffbc000}, {0xfffbe000}, + {0xfffc0000}, {0xfffc2000}, {0xfffc4000}, {0xfffc6000}, + {0xfffc8000}, {0xfffca000}, {0xfffcc000}, {0xfffce000}, + {0xfffd0000}, {0xfffd2000}, {0xfffd4000}, {0xfffd6000}, + {0xfffd8000}, {0xfffda000}, {0xfffdc000}, {0xfffde000}, + {0xfffe0000}, {0xfffe2000}, {0xfffe4000}, {0xfffe6000}, + {0xfffe8000}, {0xfffea000}, {0xfffec000}, {0xfffee000}, + {0xffff0000}, {0xffff2000}, {0xffff4000}, {0xffff6000}, + {0xffff8000}, {0xffffa000}, {0xffffc000}, {0xffffe000}, +}; diff --git a/3rdparty/openexr/Iex/Iex.h b/3rdparty/openexr/Iex/Iex.h new file mode 100644 index 000000000..a0fd31d01 --- /dev/null +++ b/3rdparty/openexr/Iex/Iex.h @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IEX_H +#define INCLUDED_IEX_H + + +//-------------------------------- +// +// Exception handling +// +//-------------------------------- + + +#include "IexMacros.h" +#include "IexBaseExc.h" +#include "IexMathExc.h" +#include "IexThrowErrnoExc.h" + +// Note that we do not include file IexErrnoExc.h here. That file +// defines over 150 classes and significantly slows down compilation. +// If you throw ErrnoExc exceptions using the throwErrnoExc() function, +// you don't need IexErrnoExc.h. You have to include IexErrnoExc.h +// only if you want to catch specific subclasses of ErrnoExc. + + +#endif diff --git a/3rdparty/openexr/Iex/IexBaseExc.cpp b/3rdparty/openexr/Iex/IexBaseExc.cpp new file mode 100644 index 000000000..c85b0c2c7 --- /dev/null +++ b/3rdparty/openexr/Iex/IexBaseExc.cpp @@ -0,0 +1,129 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//--------------------------------------------------------------------- +// +// Constructors and destructors for our exception base class. +// +//--------------------------------------------------------------------- + +#include "IexBaseExc.h" + +namespace Iex { +namespace { + + +StackTracer currentStackTracer = 0; + + +} // namespace + + +void +setStackTracer (StackTracer stackTracer) +{ + currentStackTracer = stackTracer; +} + + +StackTracer +stackTracer () +{ + return currentStackTracer; +} + + +BaseExc::BaseExc (const char* s) throw () : + std::string (s? s: ""), + _stackTrace (currentStackTracer? currentStackTracer(): "") +{ + // empty +} + + +BaseExc::BaseExc (const std::string &s) throw () : + std::string (s), + _stackTrace (currentStackTracer? currentStackTracer(): "") +{ + // empty +} + + +BaseExc::BaseExc (std::stringstream &s) throw () : + std::string (s.str()), + _stackTrace (currentStackTracer? currentStackTracer(): "") +{ + // empty +} + + +BaseExc::BaseExc (const BaseExc &be) throw () : + std::string (be), + _stackTrace (be._stackTrace) +{ + // empty +} + + +BaseExc::~BaseExc () throw () +{ + // empty +} + + +const char * +BaseExc::what () const throw () +{ + return c_str(); +} + + +BaseExc & +BaseExc::assign (std::stringstream &s) +{ + std::string::assign (s.str()); + return *this; +} + +BaseExc & +BaseExc::append (std::stringstream &s) +{ + std::string::append (s.str()); + return *this; +} + + +} // namespace Iex diff --git a/3rdparty/openexr/Iex/IexBaseExc.h b/3rdparty/openexr/Iex/IexBaseExc.h new file mode 100644 index 000000000..9d8ab2428 --- /dev/null +++ b/3rdparty/openexr/Iex/IexBaseExc.h @@ -0,0 +1,266 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IEXBASEEXC_H +#define INCLUDED_IEXBASEEXC_H + + +//---------------------------------------------------------- +// +// A general exception base class, and a few +// useful exceptions derived from the base class. +// +//---------------------------------------------------------- + +#include +#include +#include + +namespace Iex { + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +// Tell MS VC++ to suppress exception specification warnings +#pragma warning(disable:4290) +#endif + +//------------------------------- +// Our most basic exception class +//------------------------------- + +class BaseExc: public std::string, public std::exception +{ + public: + + //---------------------------- + // Constructors and destructor + //---------------------------- + + BaseExc (const char *s = 0) throw(); // std::string (s) + BaseExc (const std::string &s) throw(); // std::string (s) + BaseExc (std::stringstream &s) throw(); // std::string (s.str()) + + BaseExc (const BaseExc &be) throw(); + virtual ~BaseExc () throw (); + + //-------------------------------------------- + // what() method -- e.what() returns e.c_str() + //-------------------------------------------- + + virtual const char * what () const throw (); + + + //-------------------------------------------------- + // Convenient methods to change the exception's text + //-------------------------------------------------- + + BaseExc & assign (std::stringstream &s); // assign (s.str()) + BaseExc & operator = (std::stringstream &s); + + BaseExc & append (std::stringstream &s); // append (s.str()) + BaseExc & operator += (std::stringstream &s); + + + //-------------------------------------------------- + // These methods from the base class get obscured by + // the definitions above. + //-------------------------------------------------- + + BaseExc & assign (const char *s); + BaseExc & operator = (const char *s); + + BaseExc & append (const char *s); + BaseExc & operator += (const char *s); + + + //-------------------------------------------------- + // Stack trace for the point at which the exception + // was thrown. The stack trace will be an empty + // string unless a working stack-tracing routine + // has been installed (see below, setStackTracer()). + //-------------------------------------------------- + + const std::string & stackTrace () const; + + private: + + std::string _stackTrace; +}; + + +//----------------------------------------------------- +// A macro to save typing when declararing an exception +// class derived directly or indirectly from BaseExc: +//----------------------------------------------------- + +#define DEFINE_EXC(name, base) \ + class name: public base \ + { \ + public: \ + name (const char* text=0) throw(): base (text) {} \ + name (const std::string &text) throw(): base (text) {} \ + name (std::stringstream &text) throw(): base (text) {} \ + }; + + +//-------------------------------------------------------- +// Some exceptions which should be useful in most programs +//-------------------------------------------------------- + +DEFINE_EXC (ArgExc, BaseExc) // Invalid arguments to a function call + +DEFINE_EXC (LogicExc, BaseExc) // General error in a program's logic, + // for example, a function was called + // in a context where the call does + // not make sense. + +DEFINE_EXC (InputExc, BaseExc) // Invalid input data, e.g. from a file + +DEFINE_EXC (IoExc, BaseExc) // Input or output operation failed + +DEFINE_EXC (MathExc, BaseExc) // Arithmetic exception; more specific + // exceptions derived from this class + // are defined in ExcMath.h + +DEFINE_EXC (ErrnoExc, BaseExc) // Base class for exceptions corresponding + // to errno values (see errno.h); more + // specific exceptions derived from this + // class are defined in ExcErrno.h + +DEFINE_EXC (NoImplExc, BaseExc) // Missing method exception e.g. from a + // call to a method that is only partially + // or not at all implemented. A reminder + // to lazy software people to get back + // to work. + +DEFINE_EXC (NullExc, BaseExc) // A pointer is inappropriately null. + +DEFINE_EXC (TypeExc, BaseExc) // An object is an inappropriate type, + // i.e. a dynamnic_cast failed. + + +//---------------------------------------------------------------------- +// Stack-tracing support: +// +// setStackTracer(st) +// +// installs a stack-tracing routine, st, which will be called from +// class BaseExc's constructor every time an exception derived from +// BaseExc is thrown. The stack-tracing routine should return a +// string that contains a printable representation of the program's +// current call stack. This string will be stored in the BaseExc +// object; the string is accesible via the BaseExc::stackTrace() +// method. +// +// setStackTracer(0) +// +// removes the current stack tracing routine. When an exception +// derived from BaseExc is thrown, the stack trace string stored +// in the BaseExc object will be empty. +// +// stackTracer() +// +// returns a pointer to the current stack-tracing routine, or 0 +// if there is no current stack stack-tracing routine. +// +//---------------------------------------------------------------------- + +typedef std::string (* StackTracer) (); + +void setStackTracer (StackTracer stackTracer); +StackTracer stackTracer (); + + +//----------------- +// Inline functions +//----------------- + +inline BaseExc & +BaseExc::operator = (std::stringstream &s) +{ + return assign (s); +} + + +inline BaseExc & +BaseExc::operator += (std::stringstream &s) +{ + return append (s); +} + + +inline BaseExc & +BaseExc::assign (const char *s) +{ + std::string::assign(s); + return *this; +} + + +inline BaseExc & +BaseExc::operator = (const char *s) +{ + return assign(s); +} + + +inline BaseExc & +BaseExc::append (const char *s) +{ + std::string::append(s); + return *this; +} + + +inline BaseExc & +BaseExc::operator += (const char *s) +{ + return append(s); +} + + +inline const std::string & +BaseExc::stackTrace () const +{ + return _stackTrace; +} + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +#pragma warning(default:4290) +#endif + +} // namespace Iex + +#endif diff --git a/3rdparty/openexr/Iex/IexErrnoExc.h b/3rdparty/openexr/Iex/IexErrnoExc.h new file mode 100644 index 000000000..53cc28ffc --- /dev/null +++ b/3rdparty/openexr/Iex/IexErrnoExc.h @@ -0,0 +1,210 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IEXERRNOEXC_H +#define INCLUDED_IEXERRNOEXC_H + +//---------------------------------------------------------------- +// +// Exceptions which correspond to "errno" error codes. +// +//---------------------------------------------------------------- + +#include "IexBaseExc.h" + +namespace Iex { + + +DEFINE_EXC (EpermExc, ErrnoExc) +DEFINE_EXC (EnoentExc, ErrnoExc) +DEFINE_EXC (EsrchExc, ErrnoExc) +DEFINE_EXC (EintrExc, ErrnoExc) +DEFINE_EXC (EioExc, ErrnoExc) +DEFINE_EXC (EnxioExc, ErrnoExc) +DEFINE_EXC (E2bigExc, ErrnoExc) +DEFINE_EXC (EnoexecExc, ErrnoExc) +DEFINE_EXC (EbadfExc, ErrnoExc) +DEFINE_EXC (EchildExc, ErrnoExc) +DEFINE_EXC (EagainExc, ErrnoExc) +DEFINE_EXC (EnomemExc, ErrnoExc) +DEFINE_EXC (EaccesExc, ErrnoExc) +DEFINE_EXC (EfaultExc, ErrnoExc) +DEFINE_EXC (EnotblkExc, ErrnoExc) +DEFINE_EXC (EbusyExc, ErrnoExc) +DEFINE_EXC (EexistExc, ErrnoExc) +DEFINE_EXC (ExdevExc, ErrnoExc) +DEFINE_EXC (EnodevExc, ErrnoExc) +DEFINE_EXC (EnotdirExc, ErrnoExc) +DEFINE_EXC (EisdirExc, ErrnoExc) +DEFINE_EXC (EinvalExc, ErrnoExc) +DEFINE_EXC (EnfileExc, ErrnoExc) +DEFINE_EXC (EmfileExc, ErrnoExc) +DEFINE_EXC (EnottyExc, ErrnoExc) +DEFINE_EXC (EtxtbsyExc, ErrnoExc) +DEFINE_EXC (EfbigExc, ErrnoExc) +DEFINE_EXC (EnospcExc, ErrnoExc) +DEFINE_EXC (EspipeExc, ErrnoExc) +DEFINE_EXC (ErofsExc, ErrnoExc) +DEFINE_EXC (EmlinkExc, ErrnoExc) +DEFINE_EXC (EpipeExc, ErrnoExc) +DEFINE_EXC (EdomExc, ErrnoExc) +DEFINE_EXC (ErangeExc, ErrnoExc) +DEFINE_EXC (EnomsgExc, ErrnoExc) +DEFINE_EXC (EidrmExc, ErrnoExc) +DEFINE_EXC (EchrngExc, ErrnoExc) +DEFINE_EXC (El2nsyncExc, ErrnoExc) +DEFINE_EXC (El3hltExc, ErrnoExc) +DEFINE_EXC (El3rstExc, ErrnoExc) +DEFINE_EXC (ElnrngExc, ErrnoExc) +DEFINE_EXC (EunatchExc, ErrnoExc) +DEFINE_EXC (EnocsiExc, ErrnoExc) +DEFINE_EXC (El2hltExc, ErrnoExc) +DEFINE_EXC (EdeadlkExc, ErrnoExc) +DEFINE_EXC (EnolckExc, ErrnoExc) +DEFINE_EXC (EbadeExc, ErrnoExc) +DEFINE_EXC (EbadrExc, ErrnoExc) +DEFINE_EXC (ExfullExc, ErrnoExc) +DEFINE_EXC (EnoanoExc, ErrnoExc) +DEFINE_EXC (EbadrqcExc, ErrnoExc) +DEFINE_EXC (EbadsltExc, ErrnoExc) +DEFINE_EXC (EdeadlockExc, ErrnoExc) +DEFINE_EXC (EbfontExc, ErrnoExc) +DEFINE_EXC (EnostrExc, ErrnoExc) +DEFINE_EXC (EnodataExc, ErrnoExc) +DEFINE_EXC (EtimeExc, ErrnoExc) +DEFINE_EXC (EnosrExc, ErrnoExc) +DEFINE_EXC (EnonetExc, ErrnoExc) +DEFINE_EXC (EnopkgExc, ErrnoExc) +DEFINE_EXC (EremoteExc, ErrnoExc) +DEFINE_EXC (EnolinkExc, ErrnoExc) +DEFINE_EXC (EadvExc, ErrnoExc) +DEFINE_EXC (EsrmntExc, ErrnoExc) +DEFINE_EXC (EcommExc, ErrnoExc) +DEFINE_EXC (EprotoExc, ErrnoExc) +DEFINE_EXC (EmultihopExc, ErrnoExc) +DEFINE_EXC (EbadmsgExc, ErrnoExc) +DEFINE_EXC (EnametoolongExc, ErrnoExc) +DEFINE_EXC (EoverflowExc, ErrnoExc) +DEFINE_EXC (EnotuniqExc, ErrnoExc) +DEFINE_EXC (EbadfdExc, ErrnoExc) +DEFINE_EXC (EremchgExc, ErrnoExc) +DEFINE_EXC (ElibaccExc, ErrnoExc) +DEFINE_EXC (ElibbadExc, ErrnoExc) +DEFINE_EXC (ElibscnExc, ErrnoExc) +DEFINE_EXC (ElibmaxExc, ErrnoExc) +DEFINE_EXC (ElibexecExc, ErrnoExc) +DEFINE_EXC (EilseqExc, ErrnoExc) +DEFINE_EXC (EnosysExc, ErrnoExc) +DEFINE_EXC (EloopExc, ErrnoExc) +DEFINE_EXC (ErestartExc, ErrnoExc) +DEFINE_EXC (EstrpipeExc, ErrnoExc) +DEFINE_EXC (EnotemptyExc, ErrnoExc) +DEFINE_EXC (EusersExc, ErrnoExc) +DEFINE_EXC (EnotsockExc, ErrnoExc) +DEFINE_EXC (EdestaddrreqExc, ErrnoExc) +DEFINE_EXC (EmsgsizeExc, ErrnoExc) +DEFINE_EXC (EprototypeExc, ErrnoExc) +DEFINE_EXC (EnoprotooptExc, ErrnoExc) +DEFINE_EXC (EprotonosupportExc, ErrnoExc) +DEFINE_EXC (EsocktnosupportExc, ErrnoExc) +DEFINE_EXC (EopnotsuppExc, ErrnoExc) +DEFINE_EXC (EpfnosupportExc, ErrnoExc) +DEFINE_EXC (EafnosupportExc, ErrnoExc) +DEFINE_EXC (EaddrinuseExc, ErrnoExc) +DEFINE_EXC (EaddrnotavailExc, ErrnoExc) +DEFINE_EXC (EnetdownExc, ErrnoExc) +DEFINE_EXC (EnetunreachExc, ErrnoExc) +DEFINE_EXC (EnetresetExc, ErrnoExc) +DEFINE_EXC (EconnabortedExc, ErrnoExc) +DEFINE_EXC (EconnresetExc, ErrnoExc) +DEFINE_EXC (EnobufsExc, ErrnoExc) +DEFINE_EXC (EisconnExc, ErrnoExc) +DEFINE_EXC (EnotconnExc, ErrnoExc) +DEFINE_EXC (EshutdownExc, ErrnoExc) +DEFINE_EXC (EtoomanyrefsExc, ErrnoExc) +DEFINE_EXC (EtimedoutExc, ErrnoExc) +DEFINE_EXC (EconnrefusedExc, ErrnoExc) +DEFINE_EXC (EhostdownExc, ErrnoExc) +DEFINE_EXC (EhostunreachExc, ErrnoExc) +DEFINE_EXC (EalreadyExc, ErrnoExc) +DEFINE_EXC (EinprogressExc, ErrnoExc) +DEFINE_EXC (EstaleExc, ErrnoExc) +DEFINE_EXC (EioresidExc, ErrnoExc) +DEFINE_EXC (EucleanExc, ErrnoExc) +DEFINE_EXC (EnotnamExc, ErrnoExc) +DEFINE_EXC (EnavailExc, ErrnoExc) +DEFINE_EXC (EisnamExc, ErrnoExc) +DEFINE_EXC (EremoteioExc, ErrnoExc) +DEFINE_EXC (EinitExc, ErrnoExc) +DEFINE_EXC (EremdevExc, ErrnoExc) +DEFINE_EXC (EcanceledExc, ErrnoExc) +DEFINE_EXC (EnolimfileExc, ErrnoExc) +DEFINE_EXC (EproclimExc, ErrnoExc) +DEFINE_EXC (EdisjointExc, ErrnoExc) +DEFINE_EXC (EnologinExc, ErrnoExc) +DEFINE_EXC (EloginlimExc, ErrnoExc) +DEFINE_EXC (EgrouploopExc, ErrnoExc) +DEFINE_EXC (EnoattachExc, ErrnoExc) +DEFINE_EXC (EnotsupExc, ErrnoExc) +DEFINE_EXC (EnoattrExc, ErrnoExc) +DEFINE_EXC (EdircorruptedExc, ErrnoExc) +DEFINE_EXC (EdquotExc, ErrnoExc) +DEFINE_EXC (EnfsremoteExc, ErrnoExc) +DEFINE_EXC (EcontrollerExc, ErrnoExc) +DEFINE_EXC (EnotcontrollerExc, ErrnoExc) +DEFINE_EXC (EenqueuedExc, ErrnoExc) +DEFINE_EXC (EnotenqueuedExc, ErrnoExc) +DEFINE_EXC (EjoinedExc, ErrnoExc) +DEFINE_EXC (EnotjoinedExc, ErrnoExc) +DEFINE_EXC (EnoprocExc, ErrnoExc) +DEFINE_EXC (EmustrunExc, ErrnoExc) +DEFINE_EXC (EnotstoppedExc, ErrnoExc) +DEFINE_EXC (EclockcpuExc, ErrnoExc) +DEFINE_EXC (EinvalstateExc, ErrnoExc) +DEFINE_EXC (EnoexistExc, ErrnoExc) +DEFINE_EXC (EendofminorExc, ErrnoExc) +DEFINE_EXC (EbufsizeExc, ErrnoExc) +DEFINE_EXC (EemptyExc, ErrnoExc) +DEFINE_EXC (EnointrgroupExc, ErrnoExc) +DEFINE_EXC (EinvalmodeExc, ErrnoExc) +DEFINE_EXC (EcantextentExc, ErrnoExc) +DEFINE_EXC (EinvaltimeExc, ErrnoExc) +DEFINE_EXC (EdestroyedExc, ErrnoExc) + + +} // namespace Iex + +#endif diff --git a/3rdparty/openexr/Iex/IexMacros.h b/3rdparty/openexr/Iex/IexMacros.h new file mode 100644 index 000000000..e3988a2b6 --- /dev/null +++ b/3rdparty/openexr/Iex/IexMacros.h @@ -0,0 +1,148 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IEXMACROS_H +#define INCLUDED_IEXMACROS_H + +//-------------------------------------------------------------------- +// +// Macros which make throwing exceptions more convenient +// +//-------------------------------------------------------------------- + +#include + + +//---------------------------------------------------------------------------- +// A macro to throw exceptions whose text is assembled using stringstreams. +// +// Example: +// +// THROW (InputExc, "Syntax error in line " << line ", " << file << "."); +// +//---------------------------------------------------------------------------- + +#define THROW(type, text) \ + do \ + { \ + std::stringstream s; \ + s << text; \ + throw type (s); \ + } \ + while (0) + + +//---------------------------------------------------------------------------- +// Macros to add to or to replace the text of an exception. +// The new text is assembled using stringstreams. +// +// Examples: +// +// Append to end of an exception's text: +// +// catch (BaseExc &e) +// { +// APPEND_EXC (e, " Directory " << name << " does not exist."); +// throw; +// } +// +// Replace an exception's text: +// +// catch (BaseExc &e) +// { +// REPLACE_EXC (e, "Directory " << name << " does not exist. " << e); +// throw; +// } +//---------------------------------------------------------------------------- + +#define APPEND_EXC(exc, text) \ + do \ + { \ + std::stringstream s; \ + s << text; \ + exc.append (s); \ + } \ + while (0) + +#define REPLACE_EXC(exc, text) \ + do \ + { \ + std::stringstream s; \ + s << text; \ + exc.assign (s); \ + } \ + while (0) + + +//------------------------------------------------------------- +// A macro to throw ErrnoExc exceptions whose text is assembled +// using stringstreams: +// +// Example: +// +// THROW_ERRNO ("Cannot open file " << name << " (%T)."); +// +//------------------------------------------------------------- + +#define THROW_ERRNO(text) \ + do \ + { \ + std::stringstream s; \ + s << text; \ + ::Iex::throwErrnoExc (s.str()); \ + } \ + while (0) + + +//------------------------------------------------------------- +// A macro to throw exceptions if an assertion is false. +// +// Example: +// +// ASSERT (ptr != NULL, NullExc, "Null pointer" ); +// +//------------------------------------------------------------- + +#define ASSERT(assertion, type, text) \ + do \ + { \ + if ((assertion) == false) \ + THROW (type, text); \ + } \ + while (0) + + +#endif diff --git a/3rdparty/openexr/Iex/IexMathExc.h b/3rdparty/openexr/Iex/IexMathExc.h new file mode 100644 index 000000000..4ef90d35b --- /dev/null +++ b/3rdparty/openexr/Iex/IexMathExc.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IEXMATHEXC_H +#define INCLUDED_IEXMATHEXC_H + +#include "IexBaseExc.h" + +namespace Iex { + +//--------------------------------------------------------- +// Exception classess which correspond to specific floating +// point exceptions. +//--------------------------------------------------------- + +DEFINE_EXC (OverflowExc, MathExc) // Overflow +DEFINE_EXC (UnderflowExc, MathExc) // Underflow +DEFINE_EXC (DivzeroExc, MathExc) // Division by zero +DEFINE_EXC (InexactExc, MathExc) // Inexact result +DEFINE_EXC (InvalidFpOpExc, MathExc) // Invalid operation + + +} // namespace Iex + +#endif diff --git a/3rdparty/openexr/Iex/IexThrowErrnoExc.cpp b/3rdparty/openexr/Iex/IexThrowErrnoExc.cpp new file mode 100644 index 000000000..410a45c62 --- /dev/null +++ b/3rdparty/openexr/Iex/IexThrowErrnoExc.cpp @@ -0,0 +1,859 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//---------------------------------------------------------------- +// +// Exceptions that correspond to "errno" error codes, +// and a function to make throwing those exceptions easy. +// +//---------------------------------------------------------------- + +#include "IexThrowErrnoExc.h" +#include "IexErrnoExc.h" +#include +#include + +namespace Iex { + + +void throwErrnoExc (const std::string &text, int errnum) +{ + const char *entext = strerror (errnum); + std::string tmp (text); + std::string::size_type pos; + + while (std::string::npos != (pos = tmp.find ("%T"))) + tmp.replace (pos, 2, entext, strlen (entext)); + + switch (errnum) + { + #if defined (EPERM) + case EPERM: + throw EpermExc (tmp); + #endif + + #if defined (ENOENT) + case ENOENT: + throw EnoentExc (tmp); + #endif + + #if defined (ESRCH) + case ESRCH: + throw EsrchExc (tmp); + #endif + + #if defined (EINTR) + case EINTR: + throw EintrExc (tmp); + #endif + + #if defined (EIO) + case EIO: + throw EioExc (tmp); + #endif + + #if defined (ENXIO) + case ENXIO: + throw EnxioExc (tmp); + #endif + + #if defined (E2BIG) + case E2BIG: + throw E2bigExc (tmp); + #endif + + #if defined (ENOEXEC) + case ENOEXEC: + throw EnoexecExc (tmp); + #endif + + #if defined (EBADF) + case EBADF: + throw EbadfExc (tmp); + #endif + + #if defined (ECHILD) + case ECHILD: + throw EchildExc (tmp); + #endif + + #if defined (EAGAIN) + case EAGAIN: + throw EagainExc (tmp); + #endif + + #if defined (ENOMEM) + case ENOMEM: + throw EnomemExc (tmp); + #endif + + #if defined (EACCES) + case EACCES: + throw EaccesExc (tmp); + #endif + + #if defined (EFAULT) + case EFAULT: + throw EfaultExc (tmp); + #endif + + #if defined (ENOTBLK) + case ENOTBLK: + throw EnotblkExc (tmp); + #endif + + #if defined (EBUSY) + case EBUSY: + throw EbusyExc (tmp); + #endif + + #if defined (EEXIST) + case EEXIST: + throw EexistExc (tmp); + #endif + + #if defined (EXDEV) + case EXDEV: + throw ExdevExc (tmp); + #endif + + #if defined (ENODEV) + case ENODEV: + throw EnodevExc (tmp); + #endif + + #if defined (ENOTDIR) + case ENOTDIR: + throw EnotdirExc (tmp); + #endif + + #if defined (EISDIR) + case EISDIR: + throw EisdirExc (tmp); + #endif + + #if defined (EINVAL) + case EINVAL: + throw EinvalExc (tmp); + #endif + + #if defined (ENFILE) + case ENFILE: + throw EnfileExc (tmp); + #endif + + #if defined (EMFILE) + case EMFILE: + throw EmfileExc (tmp); + #endif + + #if defined (ENOTTY) + case ENOTTY: + throw EnottyExc (tmp); + #endif + + #if defined (ETXTBSY) + case ETXTBSY: + throw EtxtbsyExc (tmp); + #endif + + #if defined (EFBIG) + case EFBIG: + throw EfbigExc (tmp); + #endif + + #if defined (ENOSPC) + case ENOSPC: + throw EnospcExc (tmp); + #endif + + #if defined (ESPIPE) + case ESPIPE: + throw EspipeExc (tmp); + #endif + + #if defined (EROFS) + case EROFS: + throw ErofsExc (tmp); + #endif + + #if defined (EMLINK) + case EMLINK: + throw EmlinkExc (tmp); + #endif + + #if defined (EPIPE) + case EPIPE: + throw EpipeExc (tmp); + #endif + + #if defined (EDOM) + case EDOM: + throw EdomExc (tmp); + #endif + + #if defined (ERANGE) + case ERANGE: + throw ErangeExc (tmp); + #endif + + #if defined (ENOMSG) + case ENOMSG: + throw EnomsgExc (tmp); + #endif + + #if defined (EIDRM) + case EIDRM: + throw EidrmExc (tmp); + #endif + + #if defined (ECHRNG) + case ECHRNG: + throw EchrngExc (tmp); + #endif + + #if defined (EL2NSYNC) + case EL2NSYNC: + throw El2nsyncExc (tmp); + #endif + + #if defined (EL3HLT) + case EL3HLT: + throw El3hltExc (tmp); + #endif + + #if defined (EL3RST) + case EL3RST: + throw El3rstExc (tmp); + #endif + + #if defined (ELNRNG) + case ELNRNG: + throw ElnrngExc (tmp); + #endif + + #if defined (EUNATCH) + case EUNATCH: + throw EunatchExc (tmp); + #endif + + #if defined (ENOSCI) + case ENOCSI: + throw EnocsiExc (tmp); + #endif + + #if defined (EL2HLT) + case EL2HLT: + throw El2hltExc (tmp); + #endif + + #if defined (EDEADLK) + case EDEADLK: + throw EdeadlkExc (tmp); + #endif + + #if defined (ENOLCK) + case ENOLCK: + throw EnolckExc (tmp); + #endif + + #if defined (EBADE) + case EBADE: + throw EbadeExc (tmp); + #endif + + #if defined (EBADR) + case EBADR: + throw EbadrExc (tmp); + #endif + + #if defined (EXFULL) + case EXFULL: + throw ExfullExc (tmp); + #endif + + #if defined (ENOANO) + case ENOANO: + throw EnoanoExc (tmp); + #endif + + #if defined (EBADRQC) + case EBADRQC: + throw EbadrqcExc (tmp); + #endif + + #if defined (EBADSLT) + case EBADSLT: + throw EbadsltExc (tmp); + #endif + + #if defined (EDEADLOCK) && defined (EDEADLK) + #if EDEADLOCK != EDEADLK + case EDEADLOCK: + throw EdeadlockExc (tmp); + #endif + #elif defined (EDEADLOCK) + case EDEADLOCK: + throw EdeadlockExc (tmp); + #endif + + #if defined (EBFONT) + case EBFONT: + throw EbfontExc (tmp); + #endif + + #if defined (ENOSTR) + case ENOSTR: + throw EnostrExc (tmp); + #endif + + #if defined (ENODATA) + case ENODATA: + throw EnodataExc (tmp); + #endif + + #if defined (ETIME) + case ETIME: + throw EtimeExc (tmp); + #endif + + #if defined (ENOSR) + case ENOSR: + throw EnosrExc (tmp); + #endif + + #if defined (ENONET) + case ENONET: + throw EnonetExc (tmp); + #endif + + #if defined (ENOPKG) + case ENOPKG: + throw EnopkgExc (tmp); + #endif + + #if defined (EREMOTE) + case EREMOTE: + throw EremoteExc (tmp); + #endif + + #if defined (ENOLINK) + case ENOLINK: + throw EnolinkExc (tmp); + #endif + + #if defined (EADV) + case EADV: + throw EadvExc (tmp); + #endif + + #if defined (ESRMNT) + case ESRMNT: + throw EsrmntExc (tmp); + #endif + + #if defined (ECOMM) + case ECOMM: + throw EcommExc (tmp); + #endif + + #if defined (EPROTO) + case EPROTO: + throw EprotoExc (tmp); + #endif + + #if defined (EMULTIHOP) + case EMULTIHOP: + throw EmultihopExc (tmp); + #endif + + #if defined (EBADMSG) + case EBADMSG: + throw EbadmsgExc (tmp); + #endif + + #if defined (ENAMETOOLONG) + case ENAMETOOLONG: + throw EnametoolongExc (tmp); + #endif + + #if defined (EOVERFLOW) + case EOVERFLOW: + throw EoverflowExc (tmp); + #endif + + #if defined (ENOTUNIQ) + case ENOTUNIQ: + throw EnotuniqExc (tmp); + #endif + + #if defined (EBADFD) + case EBADFD: + throw EbadfdExc (tmp); + #endif + + #if defined (EREMCHG) + case EREMCHG: + throw EremchgExc (tmp); + #endif + + #if defined (ELIBACC) + case ELIBACC: + throw ElibaccExc (tmp); + #endif + + #if defined (ELIBBAD) + case ELIBBAD: + throw ElibbadExc (tmp); + #endif + + #if defined (ELIBSCN) + case ELIBSCN: + throw ElibscnExc (tmp); + #endif + + #if defined (ELIBMAX) + case ELIBMAX: + throw ElibmaxExc (tmp); + #endif + + #if defined (ELIBEXEC) + case ELIBEXEC: + throw ElibexecExc (tmp); + #endif + + #if defined (EILSEQ) + case EILSEQ: + throw EilseqExc (tmp); + #endif + + #if defined (ENOSYS) + case ENOSYS: + throw EnosysExc (tmp); + #endif + + #if defined (ELOOP) + case ELOOP: + throw EloopExc (tmp); + #endif + + #if defined (ERESTART) + case ERESTART: + throw ErestartExc (tmp); + #endif + + #if defined (ESTRPIPE) + case ESTRPIPE: + throw EstrpipeExc (tmp); + #endif + + #if defined (ENOTEMPTY) + case ENOTEMPTY: + throw EnotemptyExc (tmp); + #endif + + #if defined (EUSERS) + case EUSERS: + throw EusersExc (tmp); + #endif + + #if defined (ENOTSOCK) + case ENOTSOCK: + throw EnotsockExc (tmp); + #endif + + #if defined (EDESTADDRREQ) + case EDESTADDRREQ: + throw EdestaddrreqExc (tmp); + #endif + + #if defined (EMSGSIZE) + case EMSGSIZE: + throw EmsgsizeExc (tmp); + #endif + + #if defined (EPROTOTYPE) + case EPROTOTYPE: + throw EprototypeExc (tmp); + #endif + + #if defined (ENOPROTOOPT) + case ENOPROTOOPT: + throw EnoprotooptExc (tmp); + #endif + + #if defined (EPROTONOSUPPORT) + case EPROTONOSUPPORT: + throw EprotonosupportExc (tmp); + #endif + + #if defined (ESOCKTNOSUPPORT) + case ESOCKTNOSUPPORT: + throw EsocktnosupportExc (tmp); + #endif + + #if defined (EOPNOTSUPP) + case EOPNOTSUPP: + throw EopnotsuppExc (tmp); + #endif + + #if defined (EPFNOSUPPORT) + case EPFNOSUPPORT: + throw EpfnosupportExc (tmp); + #endif + + #if defined (EAFNOSUPPORT) + case EAFNOSUPPORT: + throw EafnosupportExc (tmp); + #endif + + #if defined (EADDRINUSE) + case EADDRINUSE: + throw EaddrinuseExc (tmp); + #endif + + #if defined (EADDRNOTAVAIL) + case EADDRNOTAVAIL: + throw EaddrnotavailExc (tmp); + #endif + + #if defined (ENETDOWN) + case ENETDOWN: + throw EnetdownExc (tmp); + #endif + + #if defined (ENETUNREACH) + case ENETUNREACH: + throw EnetunreachExc (tmp); + #endif + + #if defined (ENETRESET) + case ENETRESET: + throw EnetresetExc (tmp); + #endif + + #if defined (ECONNABORTED) + case ECONNABORTED: + throw EconnabortedExc (tmp); + #endif + + #if defined (ECONNRESET) + case ECONNRESET: + throw EconnresetExc (tmp); + #endif + + #if defined (ENOBUFS) + case ENOBUFS: + throw EnobufsExc (tmp); + #endif + + #if defined (EISCONN) + case EISCONN: + throw EisconnExc (tmp); + #endif + + #if defined (ENOTCONN) + case ENOTCONN: + throw EnotconnExc (tmp); + #endif + + #if defined (ESHUTDOWN) + case ESHUTDOWN: + throw EshutdownExc (tmp); + #endif + + #if defined (ETOOMANYREFS) + case ETOOMANYREFS: + throw EtoomanyrefsExc (tmp); + #endif + + #if defined (ETIMEDOUT) + case ETIMEDOUT: + throw EtimedoutExc (tmp); + #endif + + #if defined (ECONNREFUSED) + case ECONNREFUSED: + throw EconnrefusedExc (tmp); + #endif + + #if defined (EHOSTDOWN) + case EHOSTDOWN: + throw EhostdownExc (tmp); + #endif + + #if defined (EHOSTUNREACH) + case EHOSTUNREACH: + throw EhostunreachExc (tmp); + #endif + + #if defined (EALREADY) + case EALREADY: + throw EalreadyExc (tmp); + #endif + + #if defined (EINPROGRESS) + case EINPROGRESS: + throw EinprogressExc (tmp); + #endif + + #if defined (ESTALE) + case ESTALE: + throw EstaleExc (tmp); + #endif + + #if defined (EIORESID) + case EIORESID: + throw EioresidExc (tmp); + #endif + + #if defined (EUCLEAN) + case EUCLEAN: + throw EucleanExc (tmp); + #endif + + #if defined (ENOTNAM) + case ENOTNAM: + throw EnotnamExc (tmp); + #endif + + #if defined (ENAVAIL) + case ENAVAIL: + throw EnavailExc (tmp); + #endif + + #if defined (EISNAM) + case EISNAM: + throw EisnamExc (tmp); + #endif + + #if defined (EREMOTEIO) + case EREMOTEIO: + throw EremoteioExc (tmp); + #endif + + #if defined (EINIT) + case EINIT: + throw EinitExc (tmp); + #endif + + #if defined (EREMDEV) + case EREMDEV: + throw EremdevExc (tmp); + #endif + + #if defined (ECANCELED) + case ECANCELED: + throw EcanceledExc (tmp); + #endif + + #if defined (ENOLIMFILE) + case ENOLIMFILE: + throw EnolimfileExc (tmp); + #endif + + #if defined (EPROCLIM) + case EPROCLIM: + throw EproclimExc (tmp); + #endif + + #if defined (EDISJOINT) + case EDISJOINT: + throw EdisjointExc (tmp); + #endif + + #if defined (ENOLOGIN) + case ENOLOGIN: + throw EnologinExc (tmp); + #endif + + #if defined (ELOGINLIM) + case ELOGINLIM: + throw EloginlimExc (tmp); + #endif + + #if defined (EGROUPLOOP) + case EGROUPLOOP: + throw EgrouploopExc (tmp); + #endif + + #if defined (ENOATTACH) + case ENOATTACH: + throw EnoattachExc (tmp); + #endif + + #if defined (ENOTSUP) && defined (EOPNOTSUPP) + #if ENOTSUP != EOPNOTSUPP + case ENOTSUP: + throw EnotsupExc (tmp); + #endif + #elif defined (ENOTSUP) + case ENOTSUP: + throw EnotsupExc (tmp); + #endif + + #if defined (ENOATTR) + case ENOATTR: + throw EnoattrExc (tmp); + #endif + + #if defined (EDIRCORRUPTED) + case EDIRCORRUPTED: + throw EdircorruptedExc (tmp); + #endif + + #if defined (EDQUOT) + case EDQUOT: + throw EdquotExc (tmp); + #endif + + #if defined (ENFSREMOTE) + case ENFSREMOTE: + throw EnfsremoteExc (tmp); + #endif + + #if defined (ECONTROLLER) + case ECONTROLLER: + throw EcontrollerExc (tmp); + #endif + + #if defined (ENOTCONTROLLER) + case ENOTCONTROLLER: + throw EnotcontrollerExc (tmp); + #endif + + #if defined (EENQUEUED) + case EENQUEUED: + throw EenqueuedExc (tmp); + #endif + + #if defined (ENOTENQUEUED) + case ENOTENQUEUED: + throw EnotenqueuedExc (tmp); + #endif + + #if defined (EJOINED) + case EJOINED: + throw EjoinedExc (tmp); + #endif + + #if defined (ENOTJOINED) + case ENOTJOINED: + throw EnotjoinedExc (tmp); + #endif + + #if defined (ENOPROC) + case ENOPROC: + throw EnoprocExc (tmp); + #endif + + #if defined (EMUSTRUN) + case EMUSTRUN: + throw EmustrunExc (tmp); + #endif + + #if defined (ENOTSTOPPED) + case ENOTSTOPPED: + throw EnotstoppedExc (tmp); + #endif + + #if defined (ECLOCKCPU) + case ECLOCKCPU: + throw EclockcpuExc (tmp); + #endif + + #if defined (EINVALSTATE) + case EINVALSTATE: + throw EinvalstateExc (tmp); + #endif + + #if defined (ENOEXIST) + case ENOEXIST: + throw EnoexistExc (tmp); + #endif + + #if defined (EENDOFMINOR) + case EENDOFMINOR: + throw EendofminorExc (tmp); + #endif + + #if defined (EBUFSIZE) + case EBUFSIZE: + throw EbufsizeExc (tmp); + #endif + + #if defined (EEMPTY) + case EEMPTY: + throw EemptyExc (tmp); + #endif + + #if defined (ENOINTRGROUP) + case ENOINTRGROUP: + throw EnointrgroupExc (tmp); + #endif + + #if defined (EINVALMODE) + case EINVALMODE: + throw EinvalmodeExc (tmp); + #endif + + #if defined (ECANTEXTENT) + case ECANTEXTENT: + throw EcantextentExc (tmp); + #endif + + #if defined (EINVALTIME) + case EINVALTIME: + throw EinvaltimeExc (tmp); + #endif + + #if defined (EDESTROYED) + case EDESTROYED: + throw EdestroyedExc (tmp); + #endif + } + + throw ErrnoExc (tmp); +} + + +void throwErrnoExc (const std::string &text) +{ + throwErrnoExc (text, errno); +} + + +} // namespace Iex diff --git a/3rdparty/openexr/Iex/IexThrowErrnoExc.h b/3rdparty/openexr/Iex/IexThrowErrnoExc.h new file mode 100644 index 000000000..5b41dcc0b --- /dev/null +++ b/3rdparty/openexr/Iex/IexThrowErrnoExc.h @@ -0,0 +1,96 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IEXTHROWERRNOEXC_H +#define INCLUDED_IEXTHROWERRNOEXC_H + +//---------------------------------------------------------- +// +// A function which throws ExcErrno exceptions +// +//---------------------------------------------------------- + +#include "IexBaseExc.h" + +namespace Iex { + + +//-------------------------------------------------------------------------- +// +// Function throwErrnoExc() throws an exception which corresponds to +// error code errnum. The exception text is initialized with a copy +// of the string passed to throwErrnoExc(), where all occurrences of +// "%T" have been replaced with the output of strerror(oserror()). +// +// Example: +// +// If opening file /tmp/output failed with an ENOENT error code, +// calling +// +// throwErrnoExc (); +// +// or +// +// throwErrnoExc ("%T."); +// +// will throw an EnoentExc whose text reads +// +// No such file or directory. +// +// More detailed messages can be assembled using stringstreams: +// +// std::stringstream s; +// s << "Cannot open file " << name << " (%T)."; +// throwErrnoExc (s); +// +// The resulting exception contains the following text: +// +// Cannot open file /tmp/output (No such file or directory). +// +// Alternatively, you may want to use the THROW_ERRNO macro defined +// in IexMacros.h: +// +// THROW_ERRNO ("Cannot open file " << name << " (%T).") +// +//-------------------------------------------------------------------------- + +void throwErrnoExc (const std::string &txt, int errnum); +void throwErrnoExc (const std::string &txt = "%T." /*, int errnum = oserror() */); + + +} // namespace Iex + +#endif diff --git a/3rdparty/openexr/IlmBaseConfig.h.cmakein b/3rdparty/openexr/IlmBaseConfig.h.cmakein new file mode 100644 index 000000000..ebbd5392b --- /dev/null +++ b/3rdparty/openexr/IlmBaseConfig.h.cmakein @@ -0,0 +1,30 @@ +// +// Define and set to 1 if the target system has POSIX thread support +// and you want IlmBase to use it for multithreaded file I/O. +// + +#cmakedefine01 HAVE_PTHREAD + +// +// Define and set to 1 if the target system supports POSIX semaphores +// and you want OpenEXR to use them; otherwise, OpenEXR will use its +// own semaphore implementation. +// + +#cmakedefine01 HAVE_POSIX_SEMAPHORES + +#undef HAVE_UCONTEXT_H + +// +// Define and set to 1 if the target system has support for large +// stack sizes. +// + +#undef ILMBASE_HAVE_LARGE_STACK + + +// +// Version string for runtime access +// +#define ILMBASE_VERSION_STRING "1.0.3" +#define ILMBASE_PACKAGE_STRING "IlmBase 1.0.3" diff --git a/3rdparty/openexr/IlmImf/ImfAcesFile.cpp b/3rdparty/openexr/IlmImf/ImfAcesFile.cpp new file mode 100644 index 000000000..e84f9fe47 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfAcesFile.cpp @@ -0,0 +1,631 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// ACES image file I/O. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include + +using namespace std; +using namespace Imath; +using namespace Iex; + +namespace Imf { + + +const Chromaticities & +acesChromaticities () +{ + static const Chromaticities acesChr + (V2f (0.73470, 0.26530), // red + V2f (0.00000, 1.00000), // green + V2f (0.00010, -0.07700), // blue + V2f (0.32168, 0.33767)); // white + + return acesChr; +} + + +class AcesOutputFile::Data +{ + public: + + Data(); + ~Data(); + + RgbaOutputFile * rgbaFile; +}; + + +AcesOutputFile::Data::Data (): + rgbaFile (0) +{ + // empty +} + + +AcesOutputFile::Data::~Data () +{ + delete rgbaFile; +} + + +namespace { + +void +checkCompression (Compression compression) +{ + // + // Not all compression methods are allowed in ACES files. + // + + switch (compression) + { + case NO_COMPRESSION: + case PIZ_COMPRESSION: + case B44A_COMPRESSION: + break; + + default: + throw ArgExc ("Invalid compression type for ACES file."); + } +} + +} // namespace + + +AcesOutputFile::AcesOutputFile + (const std::string &name, + const Header &header, + RgbaChannels rgbaChannels, + int numThreads) +: + _data (new Data) +{ + checkCompression (header.compression()); + + Header newHeader = header; + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (name.c_str(), + newHeader, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::AcesOutputFile + (OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int numThreads) +: + _data (new Data) +{ + checkCompression (header.compression()); + + Header newHeader = header; + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (os, + header, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::AcesOutputFile + (const std::string &name, + const Imath::Box2i &displayWindow, + const Imath::Box2i &dataWindow, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const Imath::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _data (new Data) +{ + checkCompression (compression); + + Header newHeader (displayWindow, + dataWindow.isEmpty()? displayWindow: dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (name.c_str(), + newHeader, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::AcesOutputFile + (const std::string &name, + int width, + int height, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const Imath::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _data (new Data) +{ + checkCompression (compression); + + Header newHeader (width, + height, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + addChromaticities (newHeader, acesChromaticities()); + addAdoptedNeutral (newHeader, acesChromaticities().white); + + _data->rgbaFile = new RgbaOutputFile (name.c_str(), + newHeader, + rgbaChannels, + numThreads); + + _data->rgbaFile->setYCRounding (7, 6); +} + + +AcesOutputFile::~AcesOutputFile () +{ + delete _data; +} + + +void +AcesOutputFile::setFrameBuffer + (const Rgba *base, + size_t xStride, + size_t yStride) +{ + _data->rgbaFile->setFrameBuffer (base, xStride, yStride); +} + + +void +AcesOutputFile::writePixels (int numScanLines) +{ + _data->rgbaFile->writePixels (numScanLines); +} + + +int +AcesOutputFile::currentScanLine () const +{ + return _data->rgbaFile->currentScanLine(); +} + + +const Header & +AcesOutputFile::header () const +{ + return _data->rgbaFile->header(); +} + + +const Imath::Box2i & +AcesOutputFile::displayWindow () const +{ + return _data->rgbaFile->displayWindow(); +} + + +const Imath::Box2i & +AcesOutputFile::dataWindow () const +{ + return _data->rgbaFile->dataWindow(); +} + + +float +AcesOutputFile::pixelAspectRatio () const +{ + return _data->rgbaFile->pixelAspectRatio(); +} + + +const Imath::V2f +AcesOutputFile::screenWindowCenter () const +{ + return _data->rgbaFile->screenWindowCenter(); +} + + +float +AcesOutputFile::screenWindowWidth () const +{ + return _data->rgbaFile->screenWindowWidth(); +} + + +LineOrder +AcesOutputFile::lineOrder () const +{ + return _data->rgbaFile->lineOrder(); +} + + +Compression +AcesOutputFile::compression () const +{ + return _data->rgbaFile->compression(); +} + + +RgbaChannels +AcesOutputFile::channels () const +{ + return _data->rgbaFile->channels(); +} + + +void +AcesOutputFile::updatePreviewImage (const PreviewRgba pixels[]) +{ + _data->rgbaFile->updatePreviewImage (pixels); +} + + +class AcesInputFile::Data +{ + public: + + Data(); + ~Data(); + + void initColorConversion (); + + RgbaInputFile * rgbaFile; + + Rgba * fbBase; + size_t fbXStride; + size_t fbYStride; + int minX; + int maxX; + + bool mustConvertColor; + M44f fileToAces; +}; + + +AcesInputFile::Data::Data (): + rgbaFile (0), + fbBase (0), + fbXStride (0), + fbYStride (0), + minX (0), + maxX (0), + mustConvertColor (false) +{ + // empty +} + + +AcesInputFile::Data::~Data () +{ + delete rgbaFile; +} + + +void +AcesInputFile::Data::initColorConversion () +{ + const Header &header = rgbaFile->header(); + + Chromaticities fileChr; + + if (hasChromaticities (header)) + fileChr = chromaticities (header); + + V2f fileNeutral = fileChr.white; + + if (hasAdoptedNeutral (header)) + fileNeutral = adoptedNeutral (header); + + const Chromaticities acesChr = acesChromaticities(); + + V2f acesNeutral = acesChr.white; + + if (fileChr.red == acesChr.red && + fileChr.green == acesChr.green && + fileChr.blue == acesChr.blue && + fileChr.white == acesChr.white && + fileNeutral == acesNeutral) + { + // + // The file already contains ACES data, + // color conversion is not necessary. + + return; + } + + mustConvertColor = true; + minX = header.dataWindow().min.x; + maxX = header.dataWindow().max.x; + + // + // Create a matrix that transforms colors from the + // RGB space of the input file into the ACES space + // using a color adaptation transform to move the + // white point. + // + + // + // We'll need the Bradford cone primary matrix and its inverse + // + + static const M44f bradfordCPM + (0.895100, -0.750200, 0.038900, 0.000000, + 0.266400, 1.713500, -0.068500, 0.000000, + -0.161400, 0.036700, 1.029600, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000); + + const static M44f inverseBradfordCPM + (0.986993, 0.432305, -0.008529, 0.000000, + -0.147054, 0.518360, 0.040043, 0.000000, + 0.159963, 0.049291, 0.968487, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000); + + // + // Convert the white points of the two RGB spaces to XYZ + // + + float fx = fileNeutral.x; + float fy = fileNeutral.y; + V3f fileNeutralXYZ (fx / fy, 1, (1 - fx - fy) / fy); + + float ax = acesNeutral.x; + float ay = acesNeutral.y; + V3f acesNeutralXYZ (ax / ay, 1, (1 - ax - ay) / ay); + + // + // Compute the Bradford transformation matrix + // + + V3f ratio ((acesNeutralXYZ * bradfordCPM) / + (fileNeutralXYZ * bradfordCPM)); + + M44f ratioMat (ratio[0], 0, 0, 0, + 0, ratio[1], 0, 0, + 0, 0, ratio[2], 0, + 0, 0, 0, 1); + + M44f bradfordTrans = bradfordCPM * + ratioMat * + inverseBradfordCPM; + + // + // Build a combined file-RGB-to-ACES-RGB conversion matrix + // + + fileToAces = RGBtoXYZ (fileChr, 1) * bradfordTrans * XYZtoRGB (acesChr, 1); +} + + +AcesInputFile::AcesInputFile (const std::string &name, int numThreads): + _data (new Data) +{ + _data->rgbaFile = new RgbaInputFile (name.c_str(), numThreads); + _data->initColorConversion(); +} + + +AcesInputFile::AcesInputFile (IStream &is, int numThreads): + _data (new Data) +{ + _data->rgbaFile = new RgbaInputFile (is, numThreads); + _data->initColorConversion(); +} + + +AcesInputFile::~AcesInputFile () +{ + delete _data; +} + + +void +AcesInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) +{ + _data->rgbaFile->setFrameBuffer (base, xStride, yStride); + _data->fbBase = base; + _data->fbXStride = xStride; + _data->fbYStride = yStride; +} + + +void +AcesInputFile::readPixels (int scanLine1, int scanLine2) +{ + // + // Copy the pixels from the RgbaInputFile into the frame buffer. + // + + _data->rgbaFile->readPixels (scanLine1, scanLine2); + + // + // If the RGB space of the input file is not the same as the ACES + // RGB space, then the pixels in the frame buffer must be transformed + // into the ACES RGB space. + // + + if (!_data->mustConvertColor) + return; + + int minY = min (scanLine1, scanLine2); + int maxY = max (scanLine1, scanLine2); + + for (int y = minY; y <= maxY; ++y) + { + Rgba *base = _data->fbBase + + _data->fbXStride * _data->minX + + _data->fbYStride * y; + + for (int x = _data->minX; x <= _data->maxX; ++x) + { + V3f aces = V3f (base->r, base->g, base->b) * _data->fileToAces; + + base->r = aces[0]; + base->g = aces[1]; + base->b = aces[2]; + + base += _data->fbXStride; + } + } +} + + +void +AcesInputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +const Header & +AcesInputFile::header () const +{ + return _data->rgbaFile->header(); +} + + +const Imath::Box2i & +AcesInputFile::displayWindow () const +{ + return _data->rgbaFile->displayWindow(); +} + + +const Imath::Box2i & +AcesInputFile::dataWindow () const +{ + return _data->rgbaFile->dataWindow(); +} + + +float +AcesInputFile::pixelAspectRatio () const +{ + return _data->rgbaFile->pixelAspectRatio(); +} + + +const Imath::V2f +AcesInputFile::screenWindowCenter () const +{ + return _data->rgbaFile->screenWindowCenter(); +} + + +float +AcesInputFile::screenWindowWidth () const +{ + return _data->rgbaFile->screenWindowWidth(); +} + + +LineOrder +AcesInputFile::lineOrder () const +{ + return _data->rgbaFile->lineOrder(); +} + + +Compression +AcesInputFile::compression () const +{ + return _data->rgbaFile->compression(); +} + + +RgbaChannels +AcesInputFile::channels () const +{ + return _data->rgbaFile->channels(); +} + + +const char * +AcesInputFile::fileName () const +{ + return _data->rgbaFile->fileName(); +} + + +bool +AcesInputFile::isComplete () const +{ + return _data->rgbaFile->isComplete(); +} + + +int +AcesInputFile::version () const +{ + return _data->rgbaFile->version(); +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfAcesFile.h b/3rdparty/openexr/IlmImf/ImfAcesFile.h new file mode 100644 index 000000000..2ab731476 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfAcesFile.h @@ -0,0 +1,322 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_ACES_FILE_H +#define INCLUDED_IMF_ACES_FILE_H + + +//----------------------------------------------------------------------------- +// +// ACES image file I/O. +// +// This header file declares two classes that directly support +// image file input and output according to the Academy Image +// Interchange Framework. +// +// The Academy Image Interchange file format is a subset of OpenEXR: +// +// - Images are stored as scanlines. Tiles are not allowed. +// +// - Images contain three color channels, either +// R, G, B (red, green, blue) or +// Y, RY, BY (luminance, sub-sampled chroma) +// +// - Images may optionally contain an alpha channel. +// +// - Only three compression types are allowed: +// - NO_COMPRESSION (file is not compressed) +// - PIZ_COMPRESSION (lossless) +// - B44A_COMPRESSION (lossy) +// +// - The "chromaticities" header attribute must specify +// the ACES RGB primaries and white point. +// +// class AcesOutputFile writes an OpenEXR file, enforcing the +// restrictions listed above. Pixel data supplied by application +// software must already be in the ACES RGB space. +// +// class AcesInputFile reads an OpenEXR file. Pixel data delivered +// to application software is guaranteed to be in the ACES RGB space. +// If the RGB space of the file is not the same as the ACES space, +// then the pixels are automatically converted: the pixels are +// converted to CIE XYZ, a color adaptation transform shifts the +// white point, and the result is converted to ACES RGB. +// +//----------------------------------------------------------------------------- + +#include +#include +#include "ImathVec.h" +#include "ImathBox.h" +#include +#include + +namespace Imf { + + +class RgbaOutputFile; +class RgbaInputFile; +struct PreviewRgba; +class Chromaticities; + +// +// ACES red, green, blue and white-point chromaticities. +// + +const Chromaticities & acesChromaticities (); + + +// +// ACES output file. +// + +class AcesOutputFile +{ + public: + + //--------------------------------------------------- + // Constructor -- header is constructed by the caller + //--------------------------------------------------- + + AcesOutputFile (const std::string &name, + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------- + // Constructor -- header is constructed by the caller, + // file is opened by the caller, destructor will not + // automatically close the file. + //---------------------------------------------------- + + AcesOutputFile (OStream &os, + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------------------- + // Constructor -- header data are explicitly specified as function + // call arguments (empty dataWindow means "same as displayWindow") + //---------------------------------------------------------------- + + AcesOutputFile (const std::string &name, + const Imath::Box2i &displayWindow, + const Imath::Box2i &dataWindow = Imath::Box2i(), + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const Imath::V2f screenWindowCenter = Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------------------------------------------- + // Constructor -- like the previous one, but both + // the display window and the data window are + // Box2i (V2i (0, 0), V2i (width - 1, height -1)) + //----------------------------------------------- + + AcesOutputFile (const std::string &name, + int width, + int height, + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const Imath::V2f screenWindowCenter = Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~AcesOutputFile (); + + + //------------------------------------------------ + // Define a frame buffer as the pixel data source: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //------------------------------------------------ + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + + //------------------------------------------------- + // Write pixel data (see class Imf::OutputFile) + // The pixels are assumed to contain ACES RGB data. + //------------------------------------------------- + + void writePixels (int numScanLines = 1); + int currentScanLine () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const Imath::Box2i & displayWindow () const; + const Imath::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const Imath::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + + + // -------------------------------------------------------------------- + // Update the preview image (see Imf::OutputFile::updatePreviewImage()) + // -------------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba[]); + + + private: + + AcesOutputFile (const AcesOutputFile &); // not implemented + AcesOutputFile & operator = (const AcesOutputFile &); // not implemented + + class Data; + + Data * _data; +}; + + +// +// ACES input file +// + +class AcesInputFile +{ + public: + + //------------------------------------------------------- + // Constructor -- opens the file with the specified name, + // destructor will automatically close the file. + //------------------------------------------------------- + + AcesInputFile (const std::string &name, + int numThreads = globalThreadCount()); + + + //----------------------------------------------------------- + // Constructor -- attaches the new AcesInputFile object to a + // file that has already been opened by the caller. + // Destroying the AcesInputFile object will not automatically + // close the file. + //----------------------------------------------------------- + + AcesInputFile (IStream &is, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~AcesInputFile (); + + + //----------------------------------------------------- + // Define a frame buffer as the pixel data destination: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //----------------------------------------------------- + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride); + + + //-------------------------------------------- + // Read pixel data (see class Imf::InputFile) + // Pixels returned will contain ACES RGB data. + //-------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const Imath::Box2i & displayWindow () const; + const Imath::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const Imath::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + const char * fileName () const; + bool isComplete () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + private: + + AcesInputFile (const AcesInputFile &); // not implemented + AcesInputFile & operator = (const AcesInputFile &); // not implemented + + class Data; + + Data * _data; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfArray.h b/3rdparty/openexr/IlmImf/ImfArray.h new file mode 100644 index 000000000..18eb66f39 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfArray.h @@ -0,0 +1,261 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_ARRAY_H +#define INCLUDED_IMF_ARRAY_H + +//------------------------------------------------------------------------- +// +// class Array +// class Array2D +// +// "Arrays of T" whose sizes are not known at compile time. +// When an array goes out of scope, its elements are automatically +// deleted. +// +// Usage example: +// +// struct C +// { +// C () {std::cout << "C::C (" << this << ")\n";}; +// virtual ~C () {std::cout << "C::~C (" << this << ")\n";}; +// }; +// +// int +// main () +// { +// Array a(3); +// +// C &b = a[1]; +// const C &c = a[1]; +// C *d = a + 2; +// const C *e = a; +// +// return 0; +// } +// +//------------------------------------------------------------------------- + +namespace Imf { + + +template +class Array +{ + public: + + //----------------------------- + // Constructors and destructors + //----------------------------- + + Array () {_data = 0;} + Array (long size) {_data = new T[size];} + ~Array () {delete [] _data;} + + + //----------------------------- + // Access to the array elements + //----------------------------- + + operator T * () {return _data;} + operator const T * () const {return _data;} + + + //------------------------------------------------------ + // Resize and clear the array (the contents of the array + // are not preserved across the resize operation). + // + // resizeEraseUnsafe() is more memory efficient than + // resizeErase() because it deletes the old memory block + // before allocating a new one, but if allocating the + // new block throws an exception, resizeEraseUnsafe() + // leaves the array in an unusable state. + // + //------------------------------------------------------ + + void resizeErase (long size); + void resizeEraseUnsafe (long size); + + + private: + + Array (const Array &); // Copying and assignment + Array & operator = (const Array &); // are not implemented + + T * _data; +}; + + +template +class Array2D +{ + public: + + //----------------------------- + // Constructors and destructors + //----------------------------- + + Array2D (); // empty array, 0 by 0 elements + Array2D (long sizeX, long sizeY); // sizeX by sizeY elements + ~Array2D (); + + + //----------------------------- + // Access to the array elements + //----------------------------- + + T * operator [] (long x); + const T * operator [] (long x) const; + + + //------------------------------------------------------ + // Resize and clear the array (the contents of the array + // are not preserved across the resize operation). + // + // resizeEraseUnsafe() is more memory efficient than + // resizeErase() because it deletes the old memory block + // before allocating a new one, but if allocating the + // new block throws an exception, resizeEraseUnsafe() + // leaves the array in an unusable state. + // + //------------------------------------------------------ + + void resizeErase (long sizeX, long sizeY); + void resizeEraseUnsafe (long sizeX, long sizeY); + + + private: + + Array2D (const Array2D &); // Copying and assignment + Array2D & operator = (const Array2D &); // are not implemented + + long _sizeY; + T * _data; +}; + + +//--------------- +// Implementation +//--------------- + +template +inline void +Array::resizeErase (long size) +{ + T *tmp = new T[size]; + delete [] _data; + _data = tmp; +} + + +template +inline void +Array::resizeEraseUnsafe (long size) +{ + delete [] _data; + _data = 0; + _data = new T[size]; +} + + +template +inline +Array2D::Array2D (): + _sizeY (0), _data (0) +{ + // emtpy +} + + +template +inline +Array2D::Array2D (long sizeX, long sizeY): + _sizeY (sizeY), _data (new T[sizeX * sizeY]) +{ + // emtpy +} + + +template +inline +Array2D::~Array2D () +{ + delete [] _data; +} + + +template +inline T * +Array2D::operator [] (long x) +{ + return _data + x * _sizeY; +} + + +template +inline const T * +Array2D::operator [] (long x) const +{ + return _data + x * _sizeY; +} + + +template +inline void +Array2D::resizeErase (long sizeX, long sizeY) +{ + T *tmp = new T[sizeX * sizeY]; + delete [] _data; + _sizeY = sizeY; + _data = tmp; +} + + +template +inline void +Array2D::resizeEraseUnsafe (long sizeX, long sizeY) +{ + delete [] _data; + _data = 0; + _sizeY = 0; + _data = new T[sizeX * sizeY]; + _sizeY = sizeY; +} + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfAttribute.cpp b/3rdparty/openexr/IlmImf/ImfAttribute.cpp new file mode 100644 index 000000000..feb5f8327 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfAttribute.cpp @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Attribute +// +//----------------------------------------------------------------------------- + +#include +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include + + +namespace Imf { + +using IlmThread::Mutex; +using IlmThread::Lock; + + +Attribute::Attribute () {} + + +Attribute::~Attribute () {} + + +namespace { + +struct NameCompare: std::binary_function +{ + bool + operator () (const char *x, const char *y) const + { + return strcmp (x, y) < 0; + } +}; + + +typedef Attribute* (*Constructor)(); +typedef std::map TypeMap; + + +class LockedTypeMap: public TypeMap +{ + public: + + Mutex mutex; +}; + + +LockedTypeMap & +typeMap () +{ + static Mutex criticalSection; + Lock lock (criticalSection); + + static LockedTypeMap* typeMap = 0; + + if (typeMap == 0) + typeMap = new LockedTypeMap (); + + return *typeMap; +} + + +} // namespace + + +bool +Attribute::knownType (const char typeName[]) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + return tMap.find (typeName) != tMap.end(); +} + + +void +Attribute::registerAttributeType (const char typeName[], + Attribute *(*newAttribute)()) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + if (tMap.find (typeName) != tMap.end()) + THROW (Iex::ArgExc, "Cannot register image file attribute " + "type \"" << typeName << "\". " + "The type has already been registered."); + + tMap.insert (TypeMap::value_type (typeName, newAttribute)); +} + + +void +Attribute::unRegisterAttributeType (const char typeName[]) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + tMap.erase (typeName); +} + + +Attribute * +Attribute::newAttribute (const char typeName[]) +{ + LockedTypeMap& tMap = typeMap(); + Lock lock (tMap.mutex); + + TypeMap::const_iterator i = tMap.find (typeName); + + if (i == tMap.end()) + THROW (Iex::ArgExc, "Cannot create image file attribute of " + "unknown type \"" << typeName << "\"."); + + return (i->second)(); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfAttribute.h b/3rdparty/openexr/IlmImf/ImfAttribute.h new file mode 100644 index 000000000..520c20c1f --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfAttribute.h @@ -0,0 +1,427 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_ATTRIBUTE_H +#define INCLUDED_IMF_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class Attribute +// +//----------------------------------------------------------------------------- + +#include "IexBaseExc.h" +#include +#include + + +namespace Imf { + + +class Attribute +{ + public: + + //--------------------------- + // Constructor and destructor + //--------------------------- + + Attribute (); + virtual ~Attribute (); + + + //------------------------------- + // Get this attribute's type name + //------------------------------- + + virtual const char * typeName () const = 0; + + + //------------------------------ + // Make a copy of this attribute + //------------------------------ + + virtual Attribute * copy () const = 0; + + + //---------------------------------------- + // Type-specific attribute I/O and copying + //---------------------------------------- + + virtual void writeValueTo (OStream &os, + int version) const = 0; + + virtual void readValueFrom (IStream &is, + int size, + int version) = 0; + + virtual void copyValueFrom (const Attribute &other) = 0; + + + //------------------ + // Attribute factory + //------------------ + + static Attribute * newAttribute (const char typeName[]); + + + //----------------------------------------------------------- + // Test if a given attribute type has already been registered + //----------------------------------------------------------- + + static bool knownType (const char typeName[]); + + + protected: + + //-------------------------------------------------- + // Register an attribute type so that newAttribute() + // knows how to make objects of this type. + //-------------------------------------------------- + + static void registerAttributeType (const char typeName[], + Attribute *(*newAttribute)()); + + //------------------------------------------------------ + // Un-register an attribute type so that newAttribute() + // no longer knows how to make objects of this type (for + // debugging only). + //------------------------------------------------------ + + static void unRegisterAttributeType (const char typeName[]); +}; + + +//------------------------------------------------- +// Class template for attributes of a specific type +//------------------------------------------------- + +template +class TypedAttribute: public Attribute +{ + public: + + //---------------------------- + // Constructors and destructor + //------------_--------------- + + TypedAttribute (); + TypedAttribute (const T &value); + TypedAttribute (const TypedAttribute &other); + virtual ~TypedAttribute (); + + + //-------------------------------- + // Access to the attribute's value + //-------------------------------- + + T & value (); + const T & value () const; + + + //-------------------------------- + // Get this attribute's type name. + //-------------------------------- + + virtual const char * typeName () const; + + + //--------------------------------------------------------- + // Static version of typeName() + // This function must be specialized for each value type T. + //--------------------------------------------------------- + + static const char * staticTypeName (); + + + //--------------------- + // Make a new attribute + //--------------------- + + static Attribute * makeNewAttribute (); + + + //------------------------------ + // Make a copy of this attribute + //------------------------------ + + virtual Attribute * copy () const; + + + //----------------------------------------------------------------- + // Type-specific attribute I/O and copying. + // Depending on type T, these functions may have to be specialized. + //----------------------------------------------------------------- + + virtual void writeValueTo (OStream &os, + int version) const; + + virtual void readValueFrom (IStream &is, + int size, + int version); + + virtual void copyValueFrom (const Attribute &other); + + + //------------------------------------------------------------ + // Dynamic casts that throw exceptions instead of returning 0. + //------------------------------------------------------------ + + static TypedAttribute * cast (Attribute *attribute); + static const TypedAttribute * cast (const Attribute *attribute); + static TypedAttribute & cast (Attribute &attribute); + static const TypedAttribute & cast (const Attribute &attribute); + + + //--------------------------------------------------------------- + // Register this attribute type so that Attribute::newAttribute() + // knows how to make objects of this type. + // + // Note that this function is not thread-safe because it modifies + // a global variable in the IlmIlm library. A thread in a multi- + // threaded program may call registerAttributeType() only when no + // other thread is accessing any functions or classes in the + // IlmImf library. + // + //--------------------------------------------------------------- + + static void registerAttributeType (); + + + //----------------------------------------------------- + // Un-register this attribute type (for debugging only) + //----------------------------------------------------- + + static void unRegisterAttributeType (); + + + private: + + T _value; +}; + + +//------------------------------------ +// Implementation of TypedAttribute +//------------------------------------ + +template +TypedAttribute::TypedAttribute (): + Attribute (), + _value (T()) +{ + // empty +} + + +template +TypedAttribute::TypedAttribute (const T &value): + Attribute (), + _value (value) +{ + // empty +} + + +template +TypedAttribute::TypedAttribute (const TypedAttribute &other): + Attribute (other), + _value () +{ + copyValueFrom (other); +} + + +template +TypedAttribute::~TypedAttribute () +{ + // empty +} + + +template +inline T & +TypedAttribute::value () +{ + return _value; +} + + +template +inline const T & +TypedAttribute::value () const +{ + return _value; +} + + +template +const char * +TypedAttribute::typeName () const +{ + return staticTypeName(); +} + + +template +Attribute * +TypedAttribute::makeNewAttribute () +{ + return new TypedAttribute(); +} + + +template +Attribute * +TypedAttribute::copy () const +{ + Attribute * attribute = new TypedAttribute(); + attribute->copyValueFrom (*this); + return attribute; +} + + +template +void +TypedAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value); +} + + +template +void +TypedAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value); +} + + +template +void +TypedAttribute::copyValueFrom (const Attribute &other) +{ + _value = cast(other)._value; +} + + +template +TypedAttribute * +TypedAttribute::cast (Attribute *attribute) +{ + TypedAttribute *t = + dynamic_cast *> (attribute); + + if (t == 0) + throw Iex::TypeExc ("Unexpected attribute type."); + + return t; +} + + +template +const TypedAttribute * +TypedAttribute::cast (const Attribute *attribute) +{ + const TypedAttribute *t = + dynamic_cast *> (attribute); + + if (t == 0) + throw Iex::TypeExc ("Unexpected attribute type."); + + return t; +} + + +template +inline TypedAttribute & +TypedAttribute::cast (Attribute &attribute) +{ + return *cast (&attribute); +} + + +template +inline const TypedAttribute & +TypedAttribute::cast (const Attribute &attribute) +{ + return *cast (&attribute); +} + + +template +inline void +TypedAttribute::registerAttributeType () +{ + Attribute::registerAttributeType (staticTypeName(), makeNewAttribute); +} + + +template +inline void +TypedAttribute::unRegisterAttributeType () +{ + Attribute::unRegisterAttributeType (staticTypeName()); +} + + +} // namespace Imf + +#if defined(OPENEXR_DLL) && defined(_MSC_VER) + // Tell MS VC++ to disable "non dll-interface class used as base + // for dll-interface class" and "no suitable definition provided + // for explicit template" + #pragma warning (disable : 4275 4661) + + #if defined (ILMIMF_EXPORTS) + #define IMF_EXPIMP_TEMPLATE + #else + #define IMF_EXPIMP_TEMPLATE extern + #endif + + IMF_EXPIMP_TEMPLATE template class Imf::TypedAttribute; + IMF_EXPIMP_TEMPLATE template class Imf::TypedAttribute; + + #pragma warning(default : 4251) + #undef EXTERN_TEMPLATE +#endif + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfAutoArray.h b/3rdparty/openexr/IlmImf/ImfAutoArray.h new file mode 100644 index 000000000..edb8b1076 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfAutoArray.h @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_AUTO_ARRAY_H +#define INCLUDED_IMF_AUTO_ARRAY_H + +//----------------------------------------------------------------------------- +// +// class AutoArray -- a workaround for systems with +// insufficient stack space for large auto arrays. +// +//----------------------------------------------------------------------------- + +#include "OpenEXRConfig.h" + +namespace Imf { + + +#if !defined (HAVE_LARGE_STACK) + + + template + class AutoArray + { + public: + + AutoArray (): _data (new T [size]) { memset(_data, 0, size*sizeof(T)); } + ~AutoArray () {delete [] _data;} + + operator T * () {return _data;} + operator const T * () const {return _data;} + + private: + + T *_data; + }; + + +#else + + + template + class AutoArray + { + public: + + operator T * () {return _data;} + operator const T * () const {return _data;} + + private: + + T _data[size]; + }; + + +#endif + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfB44Compressor.cpp b/3rdparty/openexr/IlmImf/ImfB44Compressor.cpp new file mode 100644 index 000000000..231c18ce0 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfB44Compressor.cpp @@ -0,0 +1,1069 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class B44Compressor +// +// This compressor is lossy for HALF channels; the compression rate +// is fixed at 32/14 (approximately 2.28). FLOAT and UINT channels +// are not compressed; their data are preserved exactly. +// +// Each HALF channel is split into blocks of 4 by 4 pixels. An +// uncompressed block occupies 32 bytes, which are re-interpreted +// as sixteen 16-bit unsigned integers, t[0] ... t[15]. Compression +// shrinks the block to 14 bytes. The compressed 14-byte block +// contains +// +// - t[0] +// +// - a 6-bit shift value +// +// - 15 densely packed 6-bit values, r[0] ... r[14], which are +// computed by subtracting adjacent pixel values and right- +// shifting the differences according to the stored shift value. +// +// Differences between adjacent pixels are computed according +// to the following diagram: +// +// 0 --------> 1 --------> 2 --------> 3 +// | 3 7 11 +// | +// | 0 +// | +// v +// 4 --------> 5 --------> 6 --------> 7 +// | 4 8 12 +// | +// | 1 +// | +// v +// 8 --------> 9 --------> 10 --------> 11 +// | 5 9 13 +// | +// | 2 +// | +// v +// 12 --------> 13 --------> 14 --------> 15 +// 6 10 14 +// +// Here +// +// 5 ---------> 6 +// 8 +// +// means that r[8] is the difference between t[5] and t[6]. +// +// - optionally, a 4-by-4 pixel block where all pixels have the +// same value can be treated as a special case, where the +// compressed block contains only 3 instead of 14 bytes: +// t[0], followed by an "impossible" 6-bit shift value and +// two padding bits. +// +// This compressor can handle positive and negative pixel values. +// NaNs and infinities are replaced with zeroes before compression. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Imf { + +using Imath::divp; +using Imath::modp; +using Imath::Box2i; +using Imath::V2i; +using std::min; + +namespace { + +// +// Lookup tables for +// y = exp (x / 8) +// and +// x = 8 * log (y) +// + +#include "b44ExpLogTable.h" + + +inline void +convertFromLinear (unsigned short s[16]) +{ + for (int i = 0; i < 16; ++i) + s[i] = expTable[s[i]]; +} + + +inline void +convertToLinear (unsigned short s[16]) +{ + for (int i = 0; i < 16; ++i) + s[i] = logTable[s[i]]; +} + + +inline int +shiftAndRound (int x, int shift) +{ + // + // Compute + // + // y = x * pow (2, -shift), + // + // then round y to the nearest integer. + // In case of a tie, where y is exactly + // halfway between two integers, round + // to the even one. + // + + x <<= 1; + int a = (1 << shift) - 1; + shift += 1; + int b = (x >> shift) & 1; + return (x + a + b) >> shift; +} + + +int +pack (const unsigned short s[16], + unsigned char b[14], + bool optFlatFields, + bool exactMax) +{ + // + // Pack a block of 4 by 4 16-bit pixels (32 bytes) into + // either 14 or 3 bytes. + // + + // + // Integers s[0] ... s[15] represent floating-point numbers + // in what is essentially a sign-magnitude format. Convert + // s[0] .. s[15] into a new set of integers, t[0] ... t[15], + // such that if t[i] is greater than t[j], the floating-point + // number that corresponds to s[i] is always greater than + // the floating-point number that corresponds to s[j]. + // + // Also, replace any bit patterns that represent NaNs or + // infinities with bit patterns that represent floating-point + // zeroes. + // + // bit pattern floating-point bit pattern + // in s[i] value in t[i] + // + // 0x7fff NAN 0x8000 + // 0x7ffe NAN 0x8000 + // ... ... + // 0x7c01 NAN 0x8000 + // 0x7c00 +infinity 0x8000 + // 0x7bff +HALF_MAX 0xfbff + // 0x7bfe 0xfbfe + // 0x7bfd 0xfbfd + // ... ... + // 0x0002 +2 * HALF_MIN 0x8002 + // 0x0001 +HALF_MIN 0x8001 + // 0x0000 +0.0 0x8000 + // 0x8000 -0.0 0x7fff + // 0x8001 -HALF_MIN 0x7ffe + // 0x8002 -2 * HALF_MIN 0x7ffd + // ... ... + // 0xfbfd 0x0f02 + // 0xfbfe 0x0401 + // 0xfbff -HALF_MAX 0x0400 + // 0xfc00 -infinity 0x8000 + // 0xfc01 NAN 0x8000 + // ... ... + // 0xfffe NAN 0x8000 + // 0xffff NAN 0x8000 + // + + unsigned short t[16]; + + for (int i = 0; i < 16; ++i) + { + if ((s[i] & 0x7c00) == 0x7c00) + t[i] = 0x8000; + else if (s[i] & 0x8000) + t[i] = ~s[i]; + else + t[i] = s[i] | 0x8000; + } + + // + // Find the maximum, tMax, of t[0] ... t[15]. + // + + unsigned short tMax = 0; + + for (int i = 0; i < 16; ++i) + if (tMax < t[i]) + tMax = t[i]; + + // + // Compute a set of running differences, r[0] ... r[14]: + // Find a shift value such that after rounding off the + // rightmost bits and shifting all differenes are between + // -32 and +31. Then bias the differences so that they + // end up between 0 and 63. + // + + int shift = -1; + int d[16]; + int r[15]; + int rMin; + int rMax; + + const int bias = 0x20; + + do + { + shift += 1; + + // + // Compute absolute differences, d[0] ... d[15], + // between tMax and t[0] ... t[15]. + // + // Shift and round the absolute differences. + // + + for (int i = 0; i < 16; ++i) + d[i] = shiftAndRound (tMax - t[i], shift); + + // + // Convert d[0] .. d[15] into running differences + // + + r[ 0] = d[ 0] - d[ 4] + bias; + r[ 1] = d[ 4] - d[ 8] + bias; + r[ 2] = d[ 8] - d[12] + bias; + + r[ 3] = d[ 0] - d[ 1] + bias; + r[ 4] = d[ 4] - d[ 5] + bias; + r[ 5] = d[ 8] - d[ 9] + bias; + r[ 6] = d[12] - d[13] + bias; + + r[ 7] = d[ 1] - d[ 2] + bias; + r[ 8] = d[ 5] - d[ 6] + bias; + r[ 9] = d[ 9] - d[10] + bias; + r[10] = d[13] - d[14] + bias; + + r[11] = d[ 2] - d[ 3] + bias; + r[12] = d[ 6] - d[ 7] + bias; + r[13] = d[10] - d[11] + bias; + r[14] = d[14] - d[15] + bias; + + rMin = r[0]; + rMax = r[0]; + + for (int i = 1; i < 15; ++i) + { + if (rMin > r[i]) + rMin = r[i]; + + if (rMax < r[i]) + rMax = r[i]; + } + } + while (rMin < 0 || rMax > 0x3f); + + if (rMin == bias && rMax == bias && optFlatFields) + { + // + // Special case - all pixels have the same value. + // We encode this in 3 instead of 14 bytes by + // storing the value 0xfc in the third output byte, + // which cannot occur in the 14-byte encoding. + // + + b[0] = (t[0] >> 8); + b[1] = t[0]; + b[2] = 0xfc; + + return 3; + } + + if (exactMax) + { + // + // Adjust t[0] so that the pixel whose value is equal + // to tMax gets represented as accurately as possible. + // + + t[0] = tMax - (d[0] << shift); + } + + // + // Pack t[0], shift and r[0] ... r[14] into 14 bytes: + // + + b[ 0] = (t[0] >> 8); + b[ 1] = t[0]; + + b[ 2] = (unsigned char) ((shift << 2) | (r[ 0] >> 4)); + b[ 3] = (unsigned char) ((r[ 0] << 4) | (r[ 1] >> 2)); + b[ 4] = (unsigned char) ((r[ 1] << 6) | r[ 2] ); + + b[ 5] = (unsigned char) ((r[ 3] << 2) | (r[ 4] >> 4)); + b[ 6] = (unsigned char) ((r[ 4] << 4) | (r[ 5] >> 2)); + b[ 7] = (unsigned char) ((r[ 5] << 6) | r[ 6] ); + + b[ 8] = (unsigned char) ((r[ 7] << 2) | (r[ 8] >> 4)); + b[ 9] = (unsigned char) ((r[ 8] << 4) | (r[ 9] >> 2)); + b[10] = (unsigned char) ((r[ 9] << 6) | r[10] ); + + b[11] = (unsigned char) ((r[11] << 2) | (r[12] >> 4)); + b[12] = (unsigned char) ((r[12] << 4) | (r[13] >> 2)); + b[13] = (unsigned char) ((r[13] << 6) | r[14] ); + + return 14; +} + + +inline +void +unpack14 (const unsigned char b[14], unsigned short s[16]) +{ + // + // Unpack a 14-byte block into 4 by 4 16-bit pixels. + // + + #if defined (DEBUG) + assert (b[2] != 0xfc); + #endif + + s[ 0] = (b[0] << 8) | b[1]; + + unsigned short shift = (b[ 2] >> 2); + unsigned short bias = (0x20 << shift); + + s[ 4] = s[ 0] + ((((b[ 2] << 4) | (b[ 3] >> 4)) & 0x3f) << shift) - bias; + s[ 8] = s[ 4] + ((((b[ 3] << 2) | (b[ 4] >> 6)) & 0x3f) << shift) - bias; + s[12] = s[ 8] + ((b[ 4] & 0x3f) << shift) - bias; + + s[ 1] = s[ 0] + ((b[ 5] >> 2) << shift) - bias; + s[ 5] = s[ 4] + ((((b[ 5] << 4) | (b[ 6] >> 4)) & 0x3f) << shift) - bias; + s[ 9] = s[ 8] + ((((b[ 6] << 2) | (b[ 7] >> 6)) & 0x3f) << shift) - bias; + s[13] = s[12] + ((b[ 7] & 0x3f) << shift) - bias; + + s[ 2] = s[ 1] + ((b[ 8] >> 2) << shift) - bias; + s[ 6] = s[ 5] + ((((b[ 8] << 4) | (b[ 9] >> 4)) & 0x3f) << shift) - bias; + s[10] = s[ 9] + ((((b[ 9] << 2) | (b[10] >> 6)) & 0x3f) << shift) - bias; + s[14] = s[13] + ((b[10] & 0x3f) << shift) - bias; + + s[ 3] = s[ 2] + ((b[11] >> 2) << shift) - bias; + s[ 7] = s[ 6] + ((((b[11] << 4) | (b[12] >> 4)) & 0x3f) << shift) - bias; + s[11] = s[10] + ((((b[12] << 2) | (b[13] >> 6)) & 0x3f) << shift) - bias; + s[15] = s[14] + ((b[13] & 0x3f) << shift) - bias; + + for (int i = 0; i < 16; ++i) + { + if (s[i] & 0x8000) + s[i] &= 0x7fff; + else + s[i] = ~s[i]; + } +} + + +inline +void +unpack3 (const unsigned char b[3], unsigned short s[16]) +{ + // + // Unpack a 3-byte block into 4 by 4 identical 16-bit pixels. + // + + #if defined (DEBUG) + assert (b[2] == 0xfc); + #endif + + s[0] = (b[0] << 8) | b[1]; + + if (s[0] & 0x8000) + s[0] &= 0x7fff; + else + s[0] = ~s[0]; + + for (int i = 1; i < 16; ++i) + s[i] = s[0]; +} + + +void +notEnoughData () +{ + throw Iex::InputExc ("Error decompressing data " + "(input data are shorter than expected)."); +} + + +void +tooMuchData () +{ + throw Iex::InputExc ("Error decompressing data " + "(input data are longer than expected)."); +} + +} // namespace + + +struct B44Compressor::ChannelData +{ + unsigned short * start; + unsigned short * end; + int nx; + int ny; + int ys; + PixelType type; + bool pLinear; + int size; +}; + + +B44Compressor::B44Compressor + (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines, + bool optFlatFields) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _optFlatFields (optFlatFields), + _format (XDR), + _numScanLines (numScanLines), + _tmpBuffer (0), + _outBuffer (0), + _numChans (0), + _channels (hdr.channels()), + _channelData (0) +{ + // + // Allocate buffers for compressed an uncompressed pixel data, + // allocate a set of ChannelData structs to help speed up the + // compress() and uncompress() functions, below, and determine + // if uncompressed pixel data should be in native or Xdr format. + // + + _tmpBuffer = new unsigned short + [checkArraySize (uiMult (maxScanLineSize, numScanLines), + sizeof (unsigned short))]; + + const ChannelList &channels = header().channels(); + int numHalfChans = 0; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + assert (pixelTypeSize (c.channel().type) % pixelTypeSize (HALF) == 0); + ++_numChans; + + if (c.channel().type == HALF) + ++numHalfChans; + } + + // + // Compressed data may be larger than the input data + // + + size_t padding = 12 * numHalfChans * (numScanLines + 3) / 4; + + _outBuffer = new char + [uiAdd (uiMult (maxScanLineSize, numScanLines), padding)]; + + _channelData = new ChannelData[_numChans]; + + int i = 0; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c, ++i) + { + _channelData[i].ys = c.channel().ySampling; + _channelData[i].type = c.channel().type; + _channelData[i].pLinear = c.channel().pLinear; + _channelData[i].size = + pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); + } + + const Box2i &dataWindow = hdr.dataWindow(); + + _minX = dataWindow.min.x; + _maxX = dataWindow.max.x; + _maxY = dataWindow.max.y; + + // + // We can support uncompressed data in the machine's native + // format only if all image channels are of type HALF. + // + + assert (sizeof (unsigned short) == pixelTypeSize (HALF)); + + if (_numChans == numHalfChans) + _format = NATIVE; +} + + +B44Compressor::~B44Compressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; + delete [] _channelData; +} + + +int +B44Compressor::numScanLines () const +{ + return _numScanLines; +} + + +Compressor::Format +B44Compressor::format () const +{ + return _format; +} + + +int +B44Compressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return compress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +B44Compressor::compressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range, outPtr); +} + + +int +B44Compressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return uncompress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +B44Compressor::uncompressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range, outPtr); +} + + +int +B44Compressor::compress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + // + // Compress a block of pixel data: First copy the input pixels + // from the input buffer into _tmpBuffer, rearranging them such + // that blocks of 4x4 pixels of a single channel can be accessed + // conveniently. Then compress each 4x4 block of HALF pixel data + // and append the result to the output buffer. Copy UINT and + // FLOAT data to the output buffer without compressing them. + // + + outPtr = _outBuffer; + + if (inSize == 0) + { + // + // Special case - empty input buffer. + // + + return 0; + } + + // + // For each channel, detemine how many pixels are stored + // in the input buffer, and where those pixels will be + // placed in _tmpBuffer. + // + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + if (_format == XDR) + { + // + // The data in the input buffer are in the machine-independent + // Xdr format. Copy the HALF channels into _tmpBuffer and + // convert them back into native format for compression. + // Copy UINT and FLOAT channels verbatim into _tmpBuffer. + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + if (cd.type == HALF) + { + for (int x = cd.nx; x > 0; --x) + { + Xdr::read (inPtr, *cd.end); + ++cd.end; + } + } + else + { + int n = cd.nx * cd.size; + memcpy (cd.end, inPtr, n * sizeof (unsigned short)); + inPtr += n * sizeof (unsigned short); + cd.end += n; + } + } + } + } + else + { + // + // The input buffer contains only HALF channels, and they + // are in native, machine-dependent format. Copy the pixels + // into _tmpBuffer. + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + #if defined (DEBUG) + assert (cd.type == HALF); + #endif + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (cd.end, inPtr, n * sizeof (unsigned short)); + inPtr += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + // + // The pixels for each channel have been packed into a contiguous + // block in _tmpBuffer. HALF channels are in native format; UINT + // and FLOAT channels are in Xdr format. + // + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + // + // For each HALF channel, split the data in _tmpBuffer into 4x4 + // pixel blocks. Compress each block and append the compressed + // data to the output buffer. + // + // UINT and FLOAT channels are copied from _tmpBuffer into the + // output buffer without further processing. + // + + char *outEnd = _outBuffer; + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (cd.type != HALF) + { + // + // UINT or FLOAT channel. + // + + int n = cd.nx * cd.ny * cd.size * sizeof (unsigned short); + memcpy (outEnd, cd.start, n); + outEnd += n; + + continue; + } + + // + // HALF channel + // + + for (int y = 0; y < cd.ny; y += 4) + { + // + // Copy the next 4x4 pixel block into array s. + // If the width, cd.nx, or the height, cd.ny, of + // the pixel data in _tmpBuffer is not divisible + // by 4, then pad the data by repeating the + // rightmost column and the bottom row. + // + + unsigned short *row0 = cd.start + y * cd.nx; + unsigned short *row1 = row0 + cd.nx; + unsigned short *row2 = row1 + cd.nx; + unsigned short *row3 = row2 + cd.nx; + + if (y + 3 >= cd.ny) + { + if (y + 1 >= cd.ny) + row1 = row0; + + if (y + 2 >= cd.ny) + row2 = row1; + + row3 = row2; + } + + for (int x = 0; x < cd.nx; x += 4) + { + unsigned short s[16]; + + if (x + 3 >= cd.nx) + { + int n = cd.nx - x; + + for (int i = 0; i < 4; ++i) + { + int j = min (i, n - 1); + + s[i + 0] = row0[j]; + s[i + 4] = row1[j]; + s[i + 8] = row2[j]; + s[i + 12] = row3[j]; + } + } + else + { + memcpy (&s[ 0], row0, 4 * sizeof (unsigned short)); + memcpy (&s[ 4], row1, 4 * sizeof (unsigned short)); + memcpy (&s[ 8], row2, 4 * sizeof (unsigned short)); + memcpy (&s[12], row3, 4 * sizeof (unsigned short)); + } + + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + + // + // Compress the contents of array s and append the + // results to the output buffer. + // + + if (cd.pLinear) + convertFromLinear (s); + + outEnd += pack (s, (unsigned char *) outEnd, + _optFlatFields, !cd.pLinear); + } + } + } + + return outEnd - _outBuffer; +} + + +int +B44Compressor::uncompress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + // + // This function is the reverse of the compress() function, + // above. First all pixels are moved from the input buffer + // into _tmpBuffer. UINT and FLOAT channels are copied + // verbatim; HALF channels are uncompressed in blocks of + // 4x4 pixels. Then the pixels in _tmpBuffer are copied + // into the output buffer and rearranged such that the data + // for for each scan line form a contiguous block. + // + + outPtr = _outBuffer; + + if (inSize == 0) + { + return 0; + } + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (cd.type != HALF) + { + // + // UINT or FLOAT channel. + // + + int n = cd.nx * cd.ny * cd.size * sizeof (unsigned short); + + if (inSize < n) + notEnoughData(); + + memcpy (cd.start, inPtr, n); + inPtr += n; + inSize -= n; + + continue; + } + + // + // HALF channel + // + + for (int y = 0; y < cd.ny; y += 4) + { + unsigned short *row0 = cd.start + y * cd.nx; + unsigned short *row1 = row0 + cd.nx; + unsigned short *row2 = row1 + cd.nx; + unsigned short *row3 = row2 + cd.nx; + + for (int x = 0; x < cd.nx; x += 4) + { + unsigned short s[16]; + + if (inSize < 3) + notEnoughData(); + + if (((const unsigned char *)inPtr)[2] == 0xfc) + { + unpack3 ((const unsigned char *)inPtr, s); + inPtr += 3; + inSize -= 3; + } + else + { + if (inSize < 14) + notEnoughData(); + + unpack14 ((const unsigned char *)inPtr, s); + inPtr += 14; + inSize -= 14; + } + + if (cd.pLinear) + convertToLinear (s); + + int n = (x + 3 < cd.nx)? + 4 * sizeof (unsigned short) : + (cd.nx - x) * sizeof (unsigned short); + + if (y + 3 < cd.ny) + { + memcpy (row0, &s[ 0], n); + memcpy (row1, &s[ 4], n); + memcpy (row2, &s[ 8], n); + memcpy (row3, &s[12], n); + } + else + { + memcpy (row0, &s[ 0], n); + + if (y + 1 < cd.ny) + memcpy (row1, &s[ 4], n); + + if (y + 2 < cd.ny) + memcpy (row2, &s[ 8], n); + } + + row0 += 4; + row1 += 4; + row2 += 4; + row3 += 4; + } + } + } + + char *outEnd = _outBuffer; + + if (_format == XDR) + { + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + if (cd.type == HALF) + { + for (int x = cd.nx; x > 0; --x) + { + Xdr::write (outEnd, *cd.end); + ++cd.end; + } + } + else + { + int n = cd.nx * cd.size; + memcpy (outEnd, cd.end, n * sizeof (unsigned short)); + outEnd += n * sizeof (unsigned short); + cd.end += n; + } + } + } + } + else + { + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + #if defined (DEBUG) + assert (cd.type == HALF); + #endif + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (outEnd, cd.end, n * sizeof (unsigned short)); + outEnd += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + if (inSize > 0) + tooMuchData(); + + outPtr = _outBuffer; + return outEnd - _outBuffer; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfB44Compressor.h b/3rdparty/openexr/IlmImf/ImfB44Compressor.h new file mode 100644 index 000000000..32b37134d --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfB44Compressor.h @@ -0,0 +1,117 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_B44_COMPRESSOR_H +#define INCLUDED_IMF_B44_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class B44Compressor -- lossy compression of 4x4 pixel blocks +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + +class ChannelList; + + +class B44Compressor: public Compressor +{ + public: + + B44Compressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines, + bool optFlatFields); + + virtual ~B44Compressor (); + + virtual int numScanLines () const; + + virtual Format format () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int compressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + private: + + struct ChannelData; + + int compress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + int uncompress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + int _maxScanLineSize; + bool _optFlatFields; + Format _format; + int _numScanLines; + unsigned short * _tmpBuffer; + char * _outBuffer; + int _numChans; + const ChannelList & _channels; + ChannelData * _channelData; + int _minX; + int _maxX; + int _maxY; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp b/3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp new file mode 100644 index 000000000..d275d1124 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Box2iAttribute +// class Box2fAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +Box2iAttribute::staticTypeName () +{ + return "box2i"; +} + + +template <> +void +Box2iAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.min.x); + Xdr::write (os, _value.min.y); + Xdr::write (os, _value.max.x); + Xdr::write (os, _value.max.y); +} + + +template <> +void +Box2iAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.min.x); + Xdr::read (is, _value.min.y); + Xdr::read (is, _value.max.x); + Xdr::read (is, _value.max.y); +} + + +template <> +const char * +Box2fAttribute::staticTypeName () +{ + return "box2f"; +} + + +template <> +void +Box2fAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.min.x); + Xdr::write (os, _value.min.y); + Xdr::write (os, _value.max.x); + Xdr::write (os, _value.max.y); +} + + +template <> +void +Box2fAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.min.x); + Xdr::read (is, _value.min.y); + Xdr::read (is, _value.max.x); + Xdr::read (is, _value.max.y); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfBoxAttribute.h b/3rdparty/openexr/IlmImf/ImfBoxAttribute.h new file mode 100644 index 000000000..fe3539106 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfBoxAttribute.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_BOX_ATTRIBUTE_H +#define INCLUDED_IMF_BOX_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class Box2iAttribute +// class Box2fAttribute +// +//----------------------------------------------------------------------------- + +#include +#include "ImathBox.h" + + +namespace Imf { + + +typedef TypedAttribute Box2iAttribute; +template <> const char *Box2iAttribute::staticTypeName (); +template <> void Box2iAttribute::writeValueTo (OStream &, int) const; +template <> void Box2iAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute Box2fAttribute; +template <> const char *Box2fAttribute::staticTypeName (); +template <> void Box2fAttribute::writeValueTo (OStream &, int) const; +template <> void Box2fAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfCRgbaFile.cpp b/3rdparty/openexr/IlmImf/ImfCRgbaFile.cpp new file mode 100644 index 000000000..1fcf8c611 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCRgbaFile.cpp @@ -0,0 +1,1434 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// C interface to C++ classes Imf::RgbaOutputFile and Imf::RgbaInputFile +// +//----------------------------------------------------------------------------- + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "half.h" +#include + +using Imath::Box2i; +using Imath::Box2f; +using Imath::V2i; +using Imath::V2f; +using Imath::V3i; +using Imath::V3f; +using Imath::M33f; +using Imath::M44f; + + +namespace { + + +const int MAX_ERR_LENGTH = 1024; +char errorMessage[MAX_ERR_LENGTH]; + + +void +setErrorMessage (const std::exception &e) +{ + strncpy (errorMessage, e.what(), MAX_ERR_LENGTH - 1); + errorMessage[MAX_ERR_LENGTH - 1] = 0; +} + + +inline Imf::Header * +header (ImfHeader *hdr) +{ + return (Imf::Header *)(hdr); +} + + +inline const Imf::Header * +header (const ImfHeader *hdr) +{ + return (const Imf::Header *)(hdr); +} + + +inline Imf::RgbaOutputFile * +outfile (ImfOutputFile *out) +{ + return (Imf::RgbaOutputFile *) out; +} + + +inline const Imf::RgbaOutputFile * +outfile (const ImfOutputFile *out) +{ + return (const Imf::RgbaOutputFile *) out; +} + + +inline Imf::TiledRgbaOutputFile * +outfile (ImfTiledOutputFile *out) +{ + return (Imf::TiledRgbaOutputFile *) out; +} + + +inline const Imf::TiledRgbaOutputFile * +outfile (const ImfTiledOutputFile *out) +{ + return (const Imf::TiledRgbaOutputFile *) out; +} + + +inline Imf::RgbaInputFile * +infile (ImfInputFile *in) +{ + return (Imf::RgbaInputFile *) in; +} + + +inline const Imf::RgbaInputFile * +infile (const ImfInputFile *in) +{ + return (const Imf::RgbaInputFile *) in; +} + + +inline Imf::TiledRgbaInputFile * +infile (ImfTiledInputFile *in) +{ + return (Imf::TiledRgbaInputFile *) in; +} + + +inline const Imf::TiledRgbaInputFile * +infile (const ImfTiledInputFile *in) +{ + return (const Imf::TiledRgbaInputFile *) in; +} + + +} // namespace + + +void +ImfFloatToHalf (float f, ImfHalf *h) +{ + *h = half(f).bits(); +} + + +void +ImfFloatToHalfArray (int n, const float f[/*n*/], ImfHalf h[/*n*/]) +{ + for (int i = 0; i < n; ++i) + h[i] = half(f[i]).bits(); +} + + +float +ImfHalfToFloat (ImfHalf h) +{ + return float (*((half *)&h)); +} + + +void +ImfHalfToFloatArray (int n, const ImfHalf h[/*n*/], float f[/*n*/]) +{ + for (int i = 0; i < n; ++i) + f[i] = float (*((half *)(h + i))); +} + + +ImfHeader * +ImfNewHeader (void) +{ + try + { + return (ImfHeader *) new Imf::Header; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +void +ImfDeleteHeader (ImfHeader *hdr) +{ + delete header (hdr); +} + + +ImfHeader * +ImfCopyHeader (const ImfHeader *hdr) +{ + try + { + return (ImfHeader *) new Imf::Header (*header (hdr)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +void +ImfHeaderSetDisplayWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax) +{ + header(hdr)->displayWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax)); +} + + +void +ImfHeaderDisplayWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax) +{ + const Box2i dw = header(hdr)->displayWindow(); + *xMin = dw.min.x; + *yMin = dw.min.y; + *xMax = dw.max.x; + *yMax = dw.max.y; +} + + +void +ImfHeaderSetDataWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax) +{ + header(hdr)->dataWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax)); +} + + +void +ImfHeaderDataWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax) +{ + const Box2i dw = header(hdr)->dataWindow(); + *xMin = dw.min.x; + *yMin = dw.min.y; + *xMax = dw.max.x; + *yMax = dw.max.y; +} + + +void +ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, float pixelAspectRatio) +{ + header(hdr)->pixelAspectRatio() = pixelAspectRatio; +} + + +float +ImfHeaderPixelAspectRatio (const ImfHeader *hdr) +{ + return header(hdr)->pixelAspectRatio(); +} + + +void +ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, float x, float y) +{ + header(hdr)->screenWindowCenter() = V2f (x, y); +} + + +void +ImfHeaderScreenWindowCenter (const ImfHeader *hdr, float *x, float *y) +{ + const V2i &swc = header(hdr)->screenWindowCenter(); + *x = swc.x; + *y = swc.y; +} + + +void +ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, float width) +{ + header(hdr)->screenWindowWidth() = width; +} + + +float +ImfHeaderScreenWindowWidth (const ImfHeader *hdr) +{ + return header(hdr)->screenWindowWidth(); +} + + +void +ImfHeaderSetLineOrder (ImfHeader *hdr, int lineOrder) +{ + header(hdr)->lineOrder() = Imf::LineOrder (lineOrder); +} + + +int +ImfHeaderLineOrder (const ImfHeader *hdr) +{ + return header(hdr)->lineOrder(); +} + + +void +ImfHeaderSetCompression (ImfHeader *hdr, int compression) +{ + header(hdr)->compression() = Imf::Compression (compression); +} + + +int +ImfHeaderCompression (const ImfHeader *hdr) +{ + return header(hdr)->compression(); +} + + +int +ImfHeaderSetIntAttribute (ImfHeader *hdr, const char name[], int value) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, Imf::IntAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderIntAttribute (const ImfHeader *hdr, const char name[], int *value) +{ + try + { + *value = header(hdr)->typedAttribute(name).value(); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetFloatAttribute (ImfHeader *hdr, const char name[], float value) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, Imf::FloatAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetDoubleAttribute (ImfHeader *hdr, const char name[], double value) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, Imf::DoubleAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderFloatAttribute (const ImfHeader *hdr, const char name[], float *value) +{ + try + { + *value = header(hdr)->typedAttribute(name).value(); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderDoubleAttribute (const ImfHeader *hdr, + const char name[], + double *value) +{ + try + { + *value = header(hdr)-> + typedAttribute(name).value(); + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetStringAttribute (ImfHeader *hdr, + const char name[], + const char value[]) +{ + try + { + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, Imf::StringAttribute (value)); + } + else + { + header(hdr)->typedAttribute(name).value() = + value; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderStringAttribute (const ImfHeader *hdr, + const char name[], + const char **value) +{ + try + { + *value = header(hdr)-> + typedAttribute(name).value().c_str(); + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetBox2iAttribute (ImfHeader *hdr, + const char name[], + int xMin, int yMin, + int xMax, int yMax) +{ + try + { + Box2i box (V2i (xMin, yMin), V2i (xMax, yMax)); + + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, Imf::Box2iAttribute (box)); + } + else + { + header(hdr)->typedAttribute(name).value() = + box; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderBox2iAttribute (const ImfHeader *hdr, + const char name[], + int *xMin, int *yMin, + int *xMax, int *yMax) +{ + try + { + const Box2i &box = + header(hdr)->typedAttribute(name).value(); + + *xMin = box.min.x; + *yMin = box.min.y; + *xMax = box.max.x; + *yMax = box.max.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetBox2fAttribute (ImfHeader *hdr, + const char name[], + float xMin, float yMin, + float xMax, float yMax) +{ + try + { + Box2f box (V2f (xMin, yMin), V2f (xMax, yMax)); + + if (header(hdr)->find(name) == header(hdr)->end()) + { + header(hdr)->insert (name, Imf::Box2fAttribute (box)); + } + else + { + header(hdr)->typedAttribute(name).value() = + box; + } + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderBox2fAttribute (const ImfHeader *hdr, + const char name[], + float *xMin, float *yMin, + float *xMax, float *yMax) +{ + try + { + const Box2f &box = + header(hdr)->typedAttribute(name).value(); + + *xMin = box.min.x; + *yMin = box.min.y; + *xMax = box.max.x; + *yMax = box.max.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV2iAttribute (ImfHeader *hdr, + const char name[], + int x, int y) +{ + try + { + V2i v (x, y); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, Imf::V2iAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV2iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y) +{ + try + { + const V2i &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV2fAttribute (ImfHeader *hdr, + const char name[], + float x, float y) +{ + try + { + V2f v (x, y); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, Imf::V2fAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV2fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y) +{ + try + { + const V2f &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV3iAttribute (ImfHeader *hdr, + const char name[], + int x, int y, int z) +{ + try + { + V3i v (x, y, z); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, Imf::V3iAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV3iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y, int *z) +{ + try + { + const V3i &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + *z = v.z; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetV3fAttribute (ImfHeader *hdr, + const char name[], + float x, float y, float z) +{ + try + { + V3f v (x, y, z); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, Imf::V3fAttribute (v)); + else + header(hdr)->typedAttribute(name).value() = v; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderV3fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y, float *z) +{ + try + { + const V3f &v = + header(hdr)->typedAttribute(name).value(); + + *x = v.x; + *y = v.y; + *z = v.z; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetM33fAttribute (ImfHeader *hdr, + const char name[], + const float m[3][3]) +{ + try + { + M33f m3 (m); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, Imf::M33fAttribute (m3)); + else + header(hdr)->typedAttribute(name).value() = m3; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderM33fAttribute (const ImfHeader *hdr, + const char name[], + float m[3][3]) +{ + try + { + const M33f &m3 = + header(hdr)->typedAttribute(name).value(); + + m[0][0] = m3[0][0]; + m[0][1] = m3[0][1]; + m[0][2] = m3[0][2]; + + m[1][0] = m3[1][0]; + m[1][1] = m3[1][1]; + m[1][2] = m3[1][2]; + + m[2][0] = m3[2][0]; + m[2][1] = m3[2][1]; + m[2][2] = m3[2][2]; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderSetM44fAttribute (ImfHeader *hdr, + const char name[], + const float m[4][4]) +{ + try + { + M44f m4 (m); + + if (header(hdr)->find(name) == header(hdr)->end()) + header(hdr)->insert (name, Imf::M44fAttribute (m4)); + else + header(hdr)->typedAttribute(name).value() = m4; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfHeaderM44fAttribute (const ImfHeader *hdr, + const char name[], + float m[4][4]) +{ + try + { + const M44f &m4 = + header(hdr)->typedAttribute(name).value(); + + m[0][0] = m4[0][0]; + m[0][1] = m4[0][1]; + m[0][2] = m4[0][2]; + m[0][3] = m4[0][3]; + + m[1][0] = m4[1][0]; + m[1][1] = m4[1][1]; + m[1][2] = m4[1][2]; + m[1][3] = m4[1][3]; + + m[2][0] = m4[2][0]; + m[2][1] = m4[2][1]; + m[2][2] = m4[2][2]; + m[2][3] = m4[2][3]; + + m[3][0] = m4[3][0]; + m[3][1] = m4[3][1]; + m[3][2] = m4[3][2]; + m[3][3] = m4[3][3]; + + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +ImfOutputFile * +ImfOpenOutputFile (const char name[], const ImfHeader *hdr, int channels) +{ + try + { + return (ImfOutputFile *) new Imf::RgbaOutputFile + (name, *header(hdr), Imf::RgbaChannels (channels)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseOutputFile (ImfOutputFile *out) +{ + try + { + delete outfile (out); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfOutputSetFrameBuffer (ImfOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + outfile(out)->setFrameBuffer ((Imf::Rgba *)base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfOutputWritePixels (ImfOutputFile *out, int numScanLines) +{ + try + { + outfile(out)->writePixels (numScanLines); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfOutputCurrentScanLine (const ImfOutputFile *out) +{ + return outfile(out)->currentScanLine(); +} + + +const ImfHeader * +ImfOutputHeader (const ImfOutputFile *out) +{ + return (const ImfHeader *) &outfile(out)->header(); +} + + +int +ImfOutputChannels (const ImfOutputFile *out) +{ + return outfile(out)->channels(); +} + + +ImfTiledOutputFile * +ImfOpenTiledOutputFile (const char name[], + const ImfHeader *hdr, + int channels, + int xSize, int ySize, + int mode, int rmode) +{ + try + { + return (ImfTiledOutputFile *) new Imf::TiledRgbaOutputFile + (name, *header(hdr), + Imf::RgbaChannels (channels), + xSize, ySize, + Imf::LevelMode (mode), + Imf::LevelRoundingMode (rmode)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseTiledOutputFile (ImfTiledOutputFile *out) +{ + try + { + delete outfile (out); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + outfile(out)->setFrameBuffer ((Imf::Rgba *)base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledOutputWriteTile (ImfTiledOutputFile *out, + int dx, int dy, + int lx, int ly) +{ + try + { + outfile(out)->writeTile (dx, dy, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledOutputWriteTiles (ImfTiledOutputFile *out, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly) +{ + try + { + outfile(out)->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +const ImfHeader * +ImfTiledOutputHeader (const ImfTiledOutputFile *out) +{ + return (const ImfHeader *) &outfile(out)->header(); +} + + +int +ImfTiledOutputChannels (const ImfTiledOutputFile *out) +{ + return outfile(out)->channels(); +} + + +int +ImfTiledOutputTileXSize (const ImfTiledOutputFile *out) +{ + return outfile(out)->tileXSize(); +} + + +int +ImfTiledOutputTileYSize (const ImfTiledOutputFile *out) +{ + return outfile(out)->tileYSize(); +} + + +int +ImfTiledOutputLevelMode (const ImfTiledOutputFile *out) +{ + return outfile(out)->levelMode(); +} + + +int +ImfTiledOutputLevelRoundingMode (const ImfTiledOutputFile *out) +{ + return outfile(out)->levelRoundingMode(); +} + + +ImfInputFile * +ImfOpenInputFile (const char name[]) +{ + try + { + return (ImfInputFile *) new Imf::RgbaInputFile (name); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseInputFile (ImfInputFile *in) +{ + try + { + delete infile (in); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfInputSetFrameBuffer (ImfInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + infile(in)->setFrameBuffer ((Imf::Rgba *) base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfInputReadPixels (ImfInputFile *in, int scanLine1, int scanLine2) +{ + try + { + infile(in)->readPixels (scanLine1, scanLine2); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +const ImfHeader * +ImfInputHeader (const ImfInputFile *in) +{ + return (const ImfHeader *) &infile(in)->header(); +} + + +int +ImfInputChannels (const ImfInputFile *in) +{ + return infile(in)->channels(); +} + + +const char * +ImfInputFileName (const ImfInputFile *in) +{ + return infile(in)->fileName(); +} + + +ImfTiledInputFile * +ImfOpenTiledInputFile (const char name[]) +{ + try + { + return (ImfTiledInputFile *) new Imf::TiledRgbaInputFile (name); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfCloseTiledInputFile (ImfTiledInputFile *in) +{ + try + { + delete infile (in); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride) +{ + try + { + infile(in)->setFrameBuffer ((Imf::Rgba *) base, xStride, yStride); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledInputReadTile (ImfTiledInputFile *in, + int dx, int dy, + int lx, int ly) +{ + try + { + infile(in)->readTile (dx, dy, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +int +ImfTiledInputReadTiles (ImfTiledInputFile *in, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly) +{ + try + { + infile(in)->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + return 1; + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +const ImfHeader * +ImfTiledInputHeader (const ImfTiledInputFile *in) +{ + return (const ImfHeader *) &infile(in)->header(); +} + + +int +ImfTiledInputChannels (const ImfTiledInputFile *in) +{ + return infile(in)->channels(); +} + + +const char * +ImfTiledInputFileName (const ImfTiledInputFile *in) +{ + return infile(in)->fileName(); +} + + +int +ImfTiledInputTileXSize (const ImfTiledInputFile *in) +{ + return infile(in)->tileXSize(); +} + + +int +ImfTiledInputTileYSize (const ImfTiledInputFile *in) +{ + return infile(in)->tileYSize(); +} + + +int +ImfTiledInputLevelMode (const ImfTiledInputFile *in) +{ + return infile(in)->levelMode(); +} + + +int +ImfTiledInputLevelRoundingMode (const ImfTiledInputFile *in) +{ + return infile(in)->levelRoundingMode(); +} + + +ImfLut * +ImfNewRound12logLut (int channels) +{ + try + { + return (ImfLut *) new Imf::RgbaLut + (Imf::round12log, Imf::RgbaChannels (channels)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +ImfLut * +ImfNewRoundNBitLut (unsigned int n, int channels) +{ + try + { + return (ImfLut *) new Imf::RgbaLut + (Imf::roundNBit (n), Imf::RgbaChannels (channels)); + } + catch (const std::exception &e) + { + setErrorMessage (e); + return 0; + } +} + + +void +ImfDeleteLut (ImfLut *lut) +{ + delete (Imf::RgbaLut *) lut; +} + + +void +ImfApplyLut (ImfLut *lut, ImfRgba *data, int nData, int stride) +{ + ((Imf::RgbaLut *)lut)->apply ((Imf::Rgba *)data, nData, stride); +} + + +const char * +ImfErrorMessage () +{ + return errorMessage; +} diff --git a/3rdparty/openexr/IlmImf/ImfCRgbaFile.h b/3rdparty/openexr/IlmImf/ImfCRgbaFile.h new file mode 100644 index 000000000..e3dc1cec7 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCRgbaFile.h @@ -0,0 +1,467 @@ +/* + +Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +Digital Ltd. LLC + +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 Industrial Light & Magic 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 INCLUDED_IMF_C_RGBA_FILE_H +#define INCLUDED_IMF_C_RGBA_FILE_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Interpreting unsigned shorts as 16-bit floating point numbers +*/ + +typedef unsigned short ImfHalf; + +void ImfFloatToHalf (float f, + ImfHalf *h); + +void ImfFloatToHalfArray (int n, + const float f[/*n*/], + ImfHalf h[/*n*/]); + +float ImfHalfToFloat (ImfHalf h); + +void ImfHalfToFloatArray (int n, + const ImfHalf h[/*n*/], + float f[/*n*/]); + +/* +** RGBA pixel; memory layout must be the same as struct Imf::Rgba. +*/ + +struct ImfRgba +{ + ImfHalf r; + ImfHalf g; + ImfHalf b; + ImfHalf a; +}; + +typedef struct ImfRgba ImfRgba; + +/* +** Magic number; this must be the same as Imf::MAGIC +*/ + +#define IMF_MAGIC 20000630 + +/* +** Version number; this must be the same as Imf::EXR_VERSION +*/ + +#define IMF_VERSION_NUMBER 2 + +/* +** Line order; values must the the same as in Imf::LineOrder. +*/ + +#define IMF_INCREASING_Y 0 +#define IMF_DECREASING_Y 1 +#define IMF_RAMDOM_Y 2 + + +/* +** Compression types; values must be the same as in Imf::Compression. +*/ + +#define IMF_NO_COMPRESSION 0 +#define IMF_RLE_COMPRESSION 1 +#define IMF_ZIPS_COMPRESSION 2 +#define IMF_ZIP_COMPRESSION 3 +#define IMF_PIZ_COMPRESSION 4 +#define IMF_PXR24_COMPRESSION 5 +#define IMF_B44_COMPRESSION 6 +#define IMF_B44A_COMPRESSION 7 + + +/* +** Channels; values must be the same as in Imf::RgbaChannels. +*/ + +#define IMF_WRITE_R 0x01 +#define IMF_WRITE_G 0x02 +#define IMF_WRITE_B 0x04 +#define IMF_WRITE_A 0x08 +#define IMF_WRITE_Y 0x10 +#define IMF_WRITE_C 0x20 +#define IMF_WRITE_RGB 0x07 +#define IMF_WRITE_RGBA 0x0f +#define IMF_WRITE_YC 0x30 +#define IMF_WRITE_YA 0x18 +#define IMF_WRITE_YCA 0x38 + + +/* +** Level modes; values must be the same as in Imf::LevelMode +*/ + +#define IMF_ONE_LEVEL 0 +#define IMF_MIPMAP_LEVELS 1 +#define IMF_RIPMAP_LEVELS 2 + + +/* +** Level rounding modes; values must be the same as in Imf::LevelRoundingMode +*/ + +#define IMF_ROUND_DOWN 0 +#define IMF_ROUND_UP 1 + + +/* +** RGBA file header +*/ + +struct ImfHeader; +typedef struct ImfHeader ImfHeader; + +ImfHeader * ImfNewHeader (void); + +void ImfDeleteHeader (ImfHeader *hdr); + +ImfHeader * ImfCopyHeader (const ImfHeader *hdr); + +void ImfHeaderSetDisplayWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax); + +void ImfHeaderDisplayWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax); + +void ImfHeaderSetDataWindow (ImfHeader *hdr, + int xMin, int yMin, + int xMax, int yMax); + +void ImfHeaderDataWindow (const ImfHeader *hdr, + int *xMin, int *yMin, + int *xMax, int *yMax); + +void ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, + float pixelAspectRatio); + +float ImfHeaderPixelAspectRatio (const ImfHeader *hdr); + +void ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, + float x, float y); + +void ImfHeaderScreenWindowCenter (const ImfHeader *hdr, + float *x, float *y); + +void ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, + float width); + +float ImfHeaderScreenWindowWidth (const ImfHeader *hdr); + +void ImfHeaderSetLineOrder (ImfHeader *hdr, + int lineOrder); + +int ImfHeaderLineOrder (const ImfHeader *hdr); + +void ImfHeaderSetCompression (ImfHeader *hdr, + int compression); + +int ImfHeaderCompression (const ImfHeader *hdr); + +int ImfHeaderSetIntAttribute (ImfHeader *hdr, + const char name[], + int value); + +int ImfHeaderIntAttribute (const ImfHeader *hdr, + const char name[], + int *value); + +int ImfHeaderSetFloatAttribute (ImfHeader *hdr, + const char name[], + float value); + +int ImfHeaderSetDoubleAttribute (ImfHeader *hdr, + const char name[], + double value); + +int ImfHeaderFloatAttribute (const ImfHeader *hdr, + const char name[], + float *value); + +int ImfHeaderDoubleAttribute (const ImfHeader *hdr, + const char name[], + double *value); + +int ImfHeaderSetStringAttribute (ImfHeader *hdr, + const char name[], + const char value[]); + +int ImfHeaderStringAttribute (const ImfHeader *hdr, + const char name[], + const char **value); + +int ImfHeaderSetBox2iAttribute (ImfHeader *hdr, + const char name[], + int xMin, int yMin, + int xMax, int yMax); + +int ImfHeaderBox2iAttribute (const ImfHeader *hdr, + const char name[], + int *xMin, int *yMin, + int *xMax, int *yMax); + +int ImfHeaderSetBox2fAttribute (ImfHeader *hdr, + const char name[], + float xMin, float yMin, + float xMax, float yMax); + +int ImfHeaderBox2fAttribute (const ImfHeader *hdr, + const char name[], + float *xMin, float *yMin, + float *xMax, float *yMax); + +int ImfHeaderSetV2iAttribute (ImfHeader *hdr, + const char name[], + int x, int y); + +int ImfHeaderV2iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y); + +int ImfHeaderSetV2fAttribute (ImfHeader *hdr, + const char name[], + float x, float y); + +int ImfHeaderV2fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y); + +int ImfHeaderSetV3iAttribute (ImfHeader *hdr, + const char name[], + int x, int y, int z); + +int ImfHeaderV3iAttribute (const ImfHeader *hdr, + const char name[], + int *x, int *y, int *z); + +int ImfHeaderSetV3fAttribute (ImfHeader *hdr, + const char name[], + float x, float y, float z); + +int ImfHeaderV3fAttribute (const ImfHeader *hdr, + const char name[], + float *x, float *y, float *z); + +int ImfHeaderSetM33fAttribute (ImfHeader *hdr, + const char name[], + const float m[3][3]); + +int ImfHeaderM33fAttribute (const ImfHeader *hdr, + const char name[], + float m[3][3]); + +int ImfHeaderSetM44fAttribute (ImfHeader *hdr, + const char name[], + const float m[4][4]); + +int ImfHeaderM44fAttribute (const ImfHeader *hdr, + const char name[], + float m[4][4]); + +/* +** RGBA output file +*/ + +struct ImfOutputFile; +typedef struct ImfOutputFile ImfOutputFile; + +ImfOutputFile * ImfOpenOutputFile (const char name[], + const ImfHeader *hdr, + int channels); + +int ImfCloseOutputFile (ImfOutputFile *out); + +int ImfOutputSetFrameBuffer (ImfOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride); + +int ImfOutputWritePixels (ImfOutputFile *out, + int numScanLines); + +int ImfOutputCurrentScanLine (const ImfOutputFile *out); + +const ImfHeader * ImfOutputHeader (const ImfOutputFile *out); + +int ImfOutputChannels (const ImfOutputFile *out); + + +/* +** Tiled RGBA output file +*/ + +struct ImfTiledOutputFile; +typedef struct ImfTiledOutputFile ImfTiledOutputFile; + +ImfTiledOutputFile * ImfOpenTiledOutputFile (const char name[], + const ImfHeader *hdr, + int channels, + int xSize, int ySize, + int mode, int rmode); + +int ImfCloseTiledOutputFile (ImfTiledOutputFile *out); + +int ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out, + const ImfRgba *base, + size_t xStride, + size_t yStride); + +int ImfTiledOutputWriteTile (ImfTiledOutputFile *out, + int dx, int dy, + int lx, int ly); + +int ImfTiledOutputWriteTiles (ImfTiledOutputFile *out, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly); + +const ImfHeader * ImfTiledOutputHeader (const ImfTiledOutputFile *out); + +int ImfTiledOutputChannels (const ImfTiledOutputFile *out); + +int ImfTiledOutputTileXSize (const ImfTiledOutputFile *out); + +int ImfTiledOutputTileYSize (const ImfTiledOutputFile *out); + +int ImfTiledOutputLevelMode (const ImfTiledOutputFile *out); +int ImfTiledOutputLevelRoundingMode + (const ImfTiledOutputFile *out); + + +/* +** RGBA input file +*/ + +struct ImfInputFile; +typedef struct ImfInputFile ImfInputFile; + +ImfInputFile * ImfOpenInputFile (const char name[]); + +int ImfCloseInputFile (ImfInputFile *in); + +int ImfInputSetFrameBuffer (ImfInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride); + +int ImfInputReadPixels (ImfInputFile *in, + int scanLine1, + int scanLine2); + +const ImfHeader * ImfInputHeader (const ImfInputFile *in); + +int ImfInputChannels (const ImfInputFile *in); + +const char * ImfInputFileName (const ImfInputFile *in); + + +/* +** Tiled RGBA input file +*/ + +struct ImfTiledInputFile; +typedef struct ImfTiledInputFile ImfTiledInputFile; + +ImfTiledInputFile * ImfOpenTiledInputFile (const char name[]); + +int ImfCloseTiledInputFile (ImfTiledInputFile *in); + +int ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in, + ImfRgba *base, + size_t xStride, + size_t yStride); + +int ImfTiledInputReadTile (ImfTiledInputFile *in, + int dx, int dy, + int lx, int ly); + +int ImfTiledInputReadTiles (ImfTiledInputFile *in, + int dxMin, int dxMax, + int dyMin, int dyMax, + int lx, int ly); + +const ImfHeader * ImfTiledInputHeader (const ImfTiledInputFile *in); + +int ImfTiledInputChannels (const ImfTiledInputFile *in); + +const char * ImfTiledInputFileName (const ImfTiledInputFile *in); + +int ImfTiledInputTileXSize (const ImfTiledInputFile *in); + +int ImfTiledInputTileYSize (const ImfTiledInputFile *in); + +int ImfTiledInputLevelMode (const ImfTiledInputFile *in); + +int ImfTiledInputLevelRoundingMode + (const ImfTiledInputFile *in); + +/* +** Lookup tables +*/ + +struct ImfLut; +typedef struct ImfLut ImfLut; + +ImfLut * ImfNewRound12logLut (int channels); + +ImfLut * ImfNewRoundNBitLut (unsigned int n, int channels); + +void ImfDeleteLut (ImfLut *lut); + +void ImfApplyLut (ImfLut *lut, + ImfRgba *data, + int nData, + int stride); +/* +** Most recent error message +*/ + +const char * ImfErrorMessage (void); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfChannelList.cpp b/3rdparty/openexr/IlmImf/ImfChannelList.cpp new file mode 100644 index 000000000..9b1f90459 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChannelList.cpp @@ -0,0 +1,321 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Channel +// class ChannelList +// +//----------------------------------------------------------------------------- + +#include +#include + + +using std::string; +using std::set; + +namespace Imf { + + +Channel::Channel (PixelType t, int xs, int ys, bool pl): + type (t), + xSampling (xs), + ySampling (ys), + pLinear (pl) +{ + // empty +} + + +bool +Channel::operator == (const Channel &other) const +{ + return type == other.type && + xSampling == other.xSampling && + ySampling == other.ySampling && + pLinear == other.pLinear; +} + + +void +ChannelList::insert (const char name[], const Channel &channel) +{ + if (name[0] == 0) + THROW (Iex::ArgExc, "Image channel name cannot be an empty string."); + + _map[name] = channel; +} + + +void +ChannelList::insert (const string &name, const Channel &channel) +{ + insert (name.c_str(), channel); +} + + +Channel & +ChannelList::operator [] (const char name[]) +{ + ChannelMap::iterator i = _map.find (name); + + if (i == _map.end()) + THROW (Iex::ArgExc, "Cannot find image channel \"" << name << "\"."); + + return i->second; +} + + +const Channel & +ChannelList::operator [] (const char name[]) const +{ + ChannelMap::const_iterator i = _map.find (name); + + if (i == _map.end()) + THROW (Iex::ArgExc, "Cannot find image channel \"" << name << "\"."); + + return i->second; +} + + +Channel & +ChannelList::operator [] (const string &name) +{ + return this->operator[] (name.c_str()); +} + + +const Channel & +ChannelList::operator [] (const string &name) const +{ + return this->operator[] (name.c_str()); +} + + +Channel * +ChannelList::findChannel (const char name[]) +{ + ChannelMap::iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +const Channel * +ChannelList::findChannel (const char name[]) const +{ + ChannelMap::const_iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +Channel * +ChannelList::findChannel (const string &name) +{ + return findChannel (name.c_str()); +} + + +const Channel * +ChannelList::findChannel (const string &name) const +{ + return findChannel (name.c_str()); +} + + +ChannelList::Iterator +ChannelList::begin () +{ + return _map.begin(); +} + + +ChannelList::ConstIterator +ChannelList::begin () const +{ + return _map.begin(); +} + + +ChannelList::Iterator +ChannelList::end () +{ + return _map.end(); +} + + +ChannelList::ConstIterator +ChannelList::end () const +{ + return _map.end(); +} + + +ChannelList::Iterator +ChannelList::find (const char name[]) +{ + return _map.find (name); +} + + +ChannelList::ConstIterator +ChannelList::find (const char name[]) const +{ + return _map.find (name); +} + + +ChannelList::Iterator +ChannelList::find (const string &name) +{ + return find (name.c_str()); +} + + +ChannelList::ConstIterator +ChannelList::find (const string &name) const +{ + return find (name.c_str()); +} + + +void +ChannelList::layers (set &layerNames) const +{ + layerNames.clear(); + + for (ConstIterator i = begin(); i != end(); ++i) + { + string layerName = i.name(); + size_t pos = layerName.rfind ('.'); + + if (pos != string::npos && pos != 0 && pos + 1 < layerName.size()) + { + layerName.erase (pos); + layerNames.insert (layerName); + } + } +} + + +void +ChannelList::channelsInLayer (const string &layerName, + Iterator &first, + Iterator &last) +{ + channelsWithPrefix (layerName + '.', first, last); +} + + +void +ChannelList::channelsInLayer (const string &layerName, + ConstIterator &first, + ConstIterator &last) const +{ + channelsWithPrefix (layerName + '.', first, last); +} + + +void +ChannelList::channelsWithPrefix (const char prefix[], + Iterator &first, + Iterator &last) +{ + first = last = _map.lower_bound (prefix); + int n = strlen (prefix); + + while (last != Iterator (_map.end()) && + strncmp (last.name(), prefix, n) <= 0) + { + ++last; + } +} + + +void +ChannelList::channelsWithPrefix (const char prefix[], + ConstIterator &first, + ConstIterator &last) const +{ + first = last = _map.lower_bound (prefix); + int n = strlen (prefix); + + while (last != ConstIterator (_map.end()) && + strncmp (last.name(), prefix, n) <= 0) + { + ++last; + } +} + + +void +ChannelList::channelsWithPrefix (const string &prefix, + Iterator &first, + Iterator &last) +{ + return channelsWithPrefix (prefix.c_str(), first, last); +} + + +void +ChannelList::channelsWithPrefix (const string &prefix, + ConstIterator &first, + ConstIterator &last) const +{ + return channelsWithPrefix (prefix.c_str(), first, last); +} + + +bool +ChannelList::operator == (const ChannelList &other) const +{ + ConstIterator i = begin(); + ConstIterator j = other.begin(); + + while (i != end() && j != other.end()) + { + if (!(i.channel() == j.channel())) + return false; + + ++i; + ++j; + } + + return i == end() && j == other.end(); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfChannelList.h b/3rdparty/openexr/IlmImf/ImfChannelList.h new file mode 100644 index 000000000..f3e513a31 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChannelList.h @@ -0,0 +1,433 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_CHANNEL_LIST_H +#define INCLUDED_IMF_CHANNEL_LIST_H + +//----------------------------------------------------------------------------- +// +// class Channel +// class ChannelList +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include + + +namespace Imf { + + +struct Channel +{ + //------------------------------ + // Data type; see ImfPixelType.h + //------------------------------ + + PixelType type; + + + //-------------------------------------------- + // Subsampling: pixel (x, y) is present in the + // channel only if + // + // x % xSampling == 0 && y % ySampling == 0 + // + //-------------------------------------------- + + int xSampling; + int ySampling; + + + //-------------------------------------------------------------- + // Hint to lossy compression methods that indicates whether + // human perception of the quantity represented by this channel + // is closer to linear or closer to logarithmic. Compression + // methods may optimize image quality by adjusting pixel data + // quantization acording to this hint. + // For example, perception of red, green, blue and luminance is + // approximately logarithmic; the difference between 0.1 and 0.2 + // is perceived to be roughly the same as the difference between + // 1.0 and 2.0. Perception of chroma coordinates tends to be + // closer to linear than logarithmic; the difference between 0.1 + // and 0.2 is perceived to be roughly the same as the difference + // between 1.0 and 1.1. + //-------------------------------------------------------------- + + bool pLinear; + + + //------------ + // Constructor + //------------ + + Channel (PixelType type = HALF, + int xSampling = 1, + int ySampling = 1, + bool pLinear = false); + + + //------------ + // Operator == + //------------ + + bool operator == (const Channel &other) const; +}; + + +class ChannelList +{ + public: + + //-------------- + // Add a channel + //-------------- + + void insert (const char name[], + const Channel &channel); + + void insert (const std::string &name, + const Channel &channel); + + //------------------------------------------------------------------ + // Access to existing channels: + // + // [n] Returns a reference to the channel with name n. + // If no channel with name n exists, an Iex::ArgExc + // is thrown. + // + // findChannel(n) Returns a pointer to the channel with name n, + // or 0 if no channel with name n exists. + // + //------------------------------------------------------------------ + + Channel & operator [] (const char name[]); + const Channel & operator [] (const char name[]) const; + + Channel & operator [] (const std::string &name); + const Channel & operator [] (const std::string &name) const; + + Channel * findChannel (const char name[]); + const Channel * findChannel (const char name[]) const; + + Channel * findChannel (const std::string &name); + const Channel * findChannel (const std::string &name) const; + + + //------------------------------------------- + // Iterator-style access to existing channels + //------------------------------------------- + + typedef std::map ChannelMap; + + class Iterator; + class ConstIterator; + + Iterator begin (); + ConstIterator begin () const; + + Iterator end (); + ConstIterator end () const; + + Iterator find (const char name[]); + ConstIterator find (const char name[]) const; + + Iterator find (const std::string &name); + ConstIterator find (const std::string &name) const; + + + //----------------------------------------------------------------- + // Support for image layers: + // + // In an image file with many channels it is sometimes useful to + // group the channels into "layers", that is, into sets of channels + // that logically belong together. Grouping channels into layers + // is done using a naming convention: channel C in layer L is + // called "L.C". + // + // For example, a computer graphic image may contain separate + // R, G and B channels for light that originated at each of + // several different virtual light sources. The channels in + // this image might be called "light1.R", "light1.G", "light1.B", + // "light2.R", "light2.G", "light2.B", etc. + // + // Note that this naming convention allows layers to be nested; + // for example, "light1.specular.R" identifies the "R" channel + // in the "specular" sub-layer of layer "light1". + // + // Channel names that don't contain a "." or that contain a + // "." only at the beginning or at the end are not considered + // to be part of any layer. + // + // layers(lns) sorts the channels in this ChannelList + // into layers and stores the names of + // all layers, sorted alphabetically, + // into string set lns. + // + // channelsInLayer(ln,f,l) stores a pair of iterators in f and l + // such that the loop + // + // for (ConstIterator i = f; i != l; ++i) + // ... + // + // iterates over all channels in layer ln. + // channelsInLayer (ln, l, p) calls + // channelsWithPrefix (ln + ".", l, p). + // + //----------------------------------------------------------------- + + void layers (std::set &layerNames) const; + + void channelsInLayer (const std::string &layerName, + Iterator &first, + Iterator &last); + + void channelsInLayer (const std::string &layerName, + ConstIterator &first, + ConstIterator &last) const; + + + //------------------------------------------------------------------- + // Find all channels whose name begins with a given prefix: + // + // channelsWithPrefix(p,f,l) stores a pair of iterators in f and l + // such that the following loop iterates over all channels whose name + // begins with string p: + // + // for (ConstIterator i = f; i != l; ++i) + // ... + // + //------------------------------------------------------------------- + + void channelsWithPrefix (const char prefix[], + Iterator &first, + Iterator &last); + + void channelsWithPrefix (const char prefix[], + ConstIterator &first, + ConstIterator &last) const; + + void channelsWithPrefix (const std::string &prefix, + Iterator &first, + Iterator &last); + + void channelsWithPrefix (const std::string &prefix, + ConstIterator &first, + ConstIterator &last) const; + + //------------ + // Operator == + //------------ + + bool operator == (const ChannelList &other) const; + + private: + + ChannelMap _map; +}; + + +//---------- +// Iterators +//---------- + +class ChannelList::Iterator +{ + public: + + Iterator (); + Iterator (const ChannelList::ChannelMap::iterator &i); + + Iterator & operator ++ (); + Iterator operator ++ (int); + + const char * name () const; + Channel & channel () const; + + private: + + friend class ChannelList::ConstIterator; + + ChannelList::ChannelMap::iterator _i; +}; + + +class ChannelList::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const ChannelList::ChannelMap::const_iterator &i); + ConstIterator (const ChannelList::Iterator &other); + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + const char * name () const; + const Channel & channel () const; + + private: + + friend bool operator == (const ConstIterator &, const ConstIterator &); + friend bool operator != (const ConstIterator &, const ConstIterator &); + + ChannelList::ChannelMap::const_iterator _i; +}; + + +//----------------- +// Inline Functions +//----------------- + +inline +ChannelList::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +ChannelList::Iterator::Iterator (const ChannelList::ChannelMap::iterator &i): + _i (i) +{ + // empty +} + + +inline ChannelList::Iterator & +ChannelList::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline ChannelList::Iterator +ChannelList::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +ChannelList::Iterator::name () const +{ + return *_i->first; +} + + +inline Channel & +ChannelList::Iterator::channel () const +{ + return _i->second; +} + + +inline +ChannelList::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +ChannelList::ConstIterator::ConstIterator + (const ChannelList::ChannelMap::const_iterator &i): _i (i) +{ + // empty +} + + +inline +ChannelList::ConstIterator::ConstIterator (const ChannelList::Iterator &other): + _i (other._i) +{ + // empty +} + +inline ChannelList::ConstIterator & +ChannelList::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline ChannelList::ConstIterator +ChannelList::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +ChannelList::ConstIterator::name () const +{ + return *_i->first; +} + +inline const Channel & +ChannelList::ConstIterator::channel () const +{ + return _i->second; +} + + +inline bool +operator == (const ChannelList::ConstIterator &x, + const ChannelList::ConstIterator &y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const ChannelList::ConstIterator &x, + const ChannelList::ConstIterator &y) +{ + return !(x == y); +} + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp b/3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp new file mode 100644 index 000000000..df2790be1 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp @@ -0,0 +1,145 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class ChannelListAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + +namespace { + +template +void checkIsNullTerminated (const char (&str)[N], const char *what) +{ + for (int i = 0; i < N; ++i) { + if (str[i] == '\0') + return; + } + std::stringstream s; + s << "Invalid " << what << ": it is more than " << (N - 1) + << " characters long."; + throw Iex::InputExc(s); +} + +} // namespace + +template <> +const char * +ChannelListAttribute::staticTypeName () +{ + return "chlist"; +} + + +template <> +void +ChannelListAttribute::writeValueTo (OStream &os, int version) const +{ + for (ChannelList::ConstIterator i = _value.begin(); + i != _value.end(); + ++i) + { + // + // Write name + // + + Xdr::write (os, i.name()); + + // + // Write Channel struct + // + + Xdr::write (os, int (i.channel().type)); + Xdr::write (os, i.channel().pLinear); + Xdr::pad (os, 3); + Xdr::write (os, i.channel().xSampling); + Xdr::write (os, i.channel().ySampling); + } + + // + // Write end of list marker + // + + Xdr::write (os, ""); +} + + +template <> +void +ChannelListAttribute::readValueFrom (IStream &is, int size, int version) +{ + while (true) + { + // + // Read name; zero length name means end of channel list + // + + char name[Name::SIZE]; + Xdr::read (is, Name::MAX_LENGTH, name); + + if (name[0] == 0) + break; + + checkIsNullTerminated (name, "channel name"); + + // + // Read Channel struct + // + + int type; + bool pLinear; + int xSampling; + int ySampling; + + Xdr::read (is, type); + Xdr::read (is, pLinear); + Xdr::skip (is, 3); + Xdr::read (is, xSampling); + Xdr::read (is, ySampling); + + _value.insert + (name, Channel (PixelType (type), xSampling, ySampling, pLinear)); + } +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfChannelListAttribute.h b/3rdparty/openexr/IlmImf/ImfChannelListAttribute.h new file mode 100644 index 000000000..050ecf921 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChannelListAttribute.h @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_CHANNEL_LIST_ATTRIBUTE_H +#define INCLUDED_IMF_CHANNEL_LIST_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class ChannelListAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute ChannelListAttribute; +template <> const char *ChannelListAttribute::staticTypeName (); +template <> void ChannelListAttribute::writeValueTo (OStream &, int) const; +template <> void ChannelListAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif + diff --git a/3rdparty/openexr/IlmImf/ImfCheckedArithmetic.h b/3rdparty/openexr/IlmImf/ImfCheckedArithmetic.h new file mode 100644 index 000000000..00eb93d76 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCheckedArithmetic.h @@ -0,0 +1,161 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2009, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_CHECKED_ARITHMETIC_H +#define INCLUDED_IMF_CHECKED_ARITHMETIC_H + +//----------------------------------------------------------------------------- +// +// Integer arithmetic operations that throw exceptions +// on overflow, underflow or division by zero. +// +//----------------------------------------------------------------------------- + +#include +#include + +namespace Imf { + +template struct StaticAssertionFailed; +template <> struct StaticAssertionFailed {}; + +#define IMF_STATIC_ASSERT(x) \ + do {StaticAssertionFailed staticAssertionFailed;} while (false) + + +template +T +uiMult (T a, T b) +{ + // + // Unsigned integer multiplication + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (a > 0 && b > std::numeric_limits::max() / a) + throw Iex::OverflowExc ("Integer multiplication overflow."); + + return a * b; +} + + +template +T +uiDiv (T a, T b) +{ + // + // Unsigned integer division + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (b == 0) + throw Iex::DivzeroExc ("Integer division by zero."); + + return a / b; +} + + +template +T +uiAdd (T a, T b) +{ + // + // Unsigned integer addition + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (a > std::numeric_limits::max() - b) + throw Iex::OverflowExc ("Integer addition overflow."); + + return a + b; +} + + +template +T +uiSub (T a, T b) +{ + // + // Unsigned integer subtraction + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + if (a < b) + throw Iex::UnderflowExc ("Integer subtraction underflow."); + + return a - b; +} + + +template +size_t +checkArraySize (T n, size_t s) +{ + // + // Verify that the size, in bytes, of an array with n elements + // of size s can be computed without overflowing: + // + // If computing + // + // size_t (n) * s + // + // would overflow, then throw an Iex::OverflowExc exception. + // Otherwise return + // + // size_t (n). + // + + IMF_STATIC_ASSERT (!std::numeric_limits::is_signed && + std::numeric_limits::is_integer); + + IMF_STATIC_ASSERT (sizeof (T) <= sizeof (size_t)); + + if (size_t (n) > std::numeric_limits::max() / s) + throw Iex::OverflowExc ("Integer multiplication overflow."); + + return size_t (n); +} + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfChromaticities.cpp b/3rdparty/openexr/IlmImf/ImfChromaticities.cpp new file mode 100644 index 000000000..2db9d0ea8 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChromaticities.cpp @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// CIE (x,y) chromaticities, and conversions between +// RGB tiples and CIE XYZ tristimulus values. +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + + +Chromaticities::Chromaticities (const Imath::V2f &red, + const Imath::V2f &green, + const Imath::V2f &blue, + const Imath::V2f &white) +: + red (red), + green (green), + blue (blue), + white (white) +{ + // empty +} + + +Imath::M44f +RGBtoXYZ (const Chromaticities chroma, float Y) +{ + // + // For an explanation of how the color conversion matrix is derived, + // see Roy Hall, "Illumination and Color in Computer Generated Imagery", + // Springer-Verlag, 1989, chapter 3, "Perceptual Response"; and + // Charles A. Poynton, "A Technical Introduction to Digital Video", + // John Wiley & Sons, 1996, chapter 7, "Color science for video". + // + + // + // X and Z values of RGB value (1, 1, 1), or "white" + // + + float X = chroma.white.x * Y / chroma.white.y; + float Z = (1 - chroma.white.x - chroma.white.y) * Y / chroma.white.y; + + // + // Scale factors for matrix rows + // + + float d = chroma.red.x * (chroma.blue.y - chroma.green.y) + + chroma.blue.x * (chroma.green.y - chroma.red.y) + + chroma.green.x * (chroma.red.y - chroma.blue.y); + + float Sr = (X * (chroma.blue.y - chroma.green.y) - + chroma.green.x * (Y * (chroma.blue.y - 1) + + chroma.blue.y * (X + Z)) + + chroma.blue.x * (Y * (chroma.green.y - 1) + + chroma.green.y * (X + Z))) / d; + + float Sg = (X * (chroma.red.y - chroma.blue.y) + + chroma.red.x * (Y * (chroma.blue.y - 1) + + chroma.blue.y * (X + Z)) - + chroma.blue.x * (Y * (chroma.red.y - 1) + + chroma.red.y * (X + Z))) / d; + + float Sb = (X * (chroma.green.y - chroma.red.y) - + chroma.red.x * (Y * (chroma.green.y - 1) + + chroma.green.y * (X + Z)) + + chroma.green.x * (Y * (chroma.red.y - 1) + + chroma.red.y * (X + Z))) / d; + + // + // Assemble the matrix + // + + Imath::M44f M; + + M[0][0] = Sr * chroma.red.x; + M[0][1] = Sr * chroma.red.y; + M[0][2] = Sr * (1 - chroma.red.x - chroma.red.y); + + M[1][0] = Sg * chroma.green.x; + M[1][1] = Sg * chroma.green.y; + M[1][2] = Sg * (1 - chroma.green.x - chroma.green.y); + + M[2][0] = Sb * chroma.blue.x; + M[2][1] = Sb * chroma.blue.y; + M[2][2] = Sb * (1 - chroma.blue.x - chroma.blue.y); + + return M; +} + + +Imath::M44f +XYZtoRGB (const Chromaticities chroma, float Y) +{ + return RGBtoXYZ (chroma, Y).inverse(); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfChromaticities.h b/3rdparty/openexr/IlmImf/ImfChromaticities.h new file mode 100644 index 000000000..28e8c514e --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChromaticities.h @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_CHROMATICITIES_H +#define INCLUDED_IMF_CHROMATICITIES_H + +//----------------------------------------------------------------------------- +// +// CIE (x,y) chromaticities, and conversions between +// RGB tiples and CIE XYZ tristimulus values. +// +//----------------------------------------------------------------------------- + +#include "ImathVec.h" +#include "ImathMatrix.h" + +namespace Imf { + + +struct Chromaticities +{ + //----------------------------------------------- + // The CIE x and y coordinates of the RGB triples + // (1,0,0), (0,1,0), (0,0,1) and (1,1,1). + //----------------------------------------------- + + Imath::V2f red; + Imath::V2f green; + Imath::V2f blue; + Imath::V2f white; + + //-------------------------------------------- + // Default constructor produces chromaticities + // according to Rec. ITU-R BT.709-3 + //-------------------------------------------- + + Chromaticities (const Imath::V2f &red = Imath::V2f (0.6400f, 0.3300f), + const Imath::V2f &green = Imath::V2f (0.3000f, 0.6000f), + const Imath::V2f &blue = Imath::V2f (0.1500f, 0.0600f), + const Imath::V2f &white = Imath::V2f (0.3127f, 0.3290f)); +}; + + +// +// Conversions between RGB and CIE XYZ +// +// RGB to XYZ: +// +// Given a set of chromaticities, c, and the luminance, Y, of the RGB +// triple (1,1,1), or "white", RGBtoXYZ(c,Y) computes a matrix, M, so +// that multiplying an RGB value, v, with M produces an equivalent +// XYZ value, w. (w == v * M) +// +// If we define that +// +// (Xr, Yr, Zr) == (1, 0, 0) * M +// (Xg, Yg, Zg) == (0, 1, 0) * M +// (Xb, Yb, Zb) == (0, 0, 1) * M +// (Xw, Yw, Zw) == (1, 1, 1) * M, +// +// then the following statements are true: +// +// Xr / (Xr + Yr + Zr) == c.red.x +// Yr / (Xr + Yr + Zr) == c.red.y +// +// Xg / (Xg + Yg + Zg) == c.red.x +// Yg / (Xg + Yg + Zg) == c.red.y +// +// Xb / (Xb + Yb + Zb) == c.red.x +// Yb / (Xb + Yb + Zb) == c.red.y +// +// Xw / (Xw + Yw + Zw) == c.red.x +// Yw / (Xw + Yw + Zw) == c.red.y +// +// Yw == Y. +// +// XYZ to RGB: +// +// YYZtoRGB(c,Y) returns RGBtoXYZ(c,Y).inverse(). +// + +Imath::M44f RGBtoXYZ (const Chromaticities chroma, float Y); +Imath::M44f XYZtoRGB (const Chromaticities chroma, float Y); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp b/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp new file mode 100644 index 000000000..03f3a8d66 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class ChromaticitiesAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +ChromaticitiesAttribute::staticTypeName () +{ + return "chromaticities"; +} + + +template <> +void +ChromaticitiesAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.red.x); + Xdr::write (os, _value.red.y); + Xdr::write (os, _value.green.x); + Xdr::write (os, _value.green.y); + Xdr::write (os, _value.blue.x); + Xdr::write (os, _value.blue.y); + Xdr::write (os, _value.white.x); + Xdr::write (os, _value.white.y); +} + + +template <> +void +ChromaticitiesAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.red.x); + Xdr::read (is, _value.red.y); + Xdr::read (is, _value.green.x); + Xdr::read (is, _value.green.y); + Xdr::read (is, _value.blue.x); + Xdr::read (is, _value.blue.y); + Xdr::read (is, _value.white.x); + Xdr::read (is, _value.white.y); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.h b/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.h new file mode 100644 index 000000000..08357fa64 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_CHROMATICITIES_ATTRIBUTE_H +#define INCLUDED_IMF_CHROMATICITIES_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class ChromaticitiesAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute ChromaticitiesAttribute; + +template <> +const char *ChromaticitiesAttribute::staticTypeName (); + +template <> +void ChromaticitiesAttribute::writeValueTo (OStream &, int) const; + +template <> +void ChromaticitiesAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfCompression.h b/3rdparty/openexr/IlmImf/ImfCompression.h new file mode 100644 index 000000000..211594382 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCompression.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_COMPRESSION_H +#define INCLUDED_IMF_COMPRESSION_H + +//----------------------------------------------------------------------------- +// +// enum Compression +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +enum Compression +{ + NO_COMPRESSION = 0, // no compression + + RLE_COMPRESSION = 1, // run length encoding + + ZIPS_COMPRESSION = 2, // zlib compression, one scan line at a time + + ZIP_COMPRESSION = 3, // zlib compression, in blocks of 16 scan lines + + PIZ_COMPRESSION = 4, // piz-based wavelet compression + + PXR24_COMPRESSION = 5, // lossy 24-bit float compression + + B44_COMPRESSION = 6, // lossy 4-by-4 pixel block compression, + // fixed compression rate + + B44A_COMPRESSION = 7, // lossy 4-by-4 pixel block compression, + // flat fields are compressed more + + NUM_COMPRESSION_METHODS // number of different compression methods +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp b/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp new file mode 100644 index 000000000..0c28d166e --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class CompressionAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +CompressionAttribute::staticTypeName () +{ + return "compression"; +} + + +template <> +void +CompressionAttribute::writeValueTo (OStream &os, int version) const +{ + unsigned char tmp = _value; + Xdr::write (os, tmp); +} + + +template <> +void +CompressionAttribute::readValueFrom (IStream &is, int size, int version) +{ + unsigned char tmp; + Xdr::read (is, tmp); + _value = Compression (tmp); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfCompressionAttribute.h b/3rdparty/openexr/IlmImf/ImfCompressionAttribute.h new file mode 100644 index 000000000..268c26be5 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCompressionAttribute.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_COMPRESSION_ATTRIBUTE_H +#define INCLUDED_IMF_COMPRESSION_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class CompressionAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute CompressionAttribute; +template <> const char *CompressionAttribute::staticTypeName (); +template <> void CompressionAttribute::writeValueTo (OStream &, int) const; +template <> void CompressionAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfCompressor.cpp b/3rdparty/openexr/IlmImf/ImfCompressor.cpp new file mode 100644 index 000000000..96bde8f27 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCompressor.cpp @@ -0,0 +1,192 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Compressor +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include + +namespace Imf { + +using Imath::Box2i; + + +Compressor::Compressor (const Header &hdr): _header (hdr) {} + + +Compressor::~Compressor () {} + + +Compressor::Format +Compressor::format () const +{ + return XDR; +} + + +int +Compressor::compressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range.min.y, outPtr); +} + + +int +Compressor::uncompressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range.min.y, outPtr); +} + + +bool +isValidCompression (Compression c) +{ + switch (c) + { + case NO_COMPRESSION: + case RLE_COMPRESSION: + case ZIPS_COMPRESSION: + case ZIP_COMPRESSION: + case PIZ_COMPRESSION: + case PXR24_COMPRESSION: + case B44_COMPRESSION: + case B44A_COMPRESSION: + + return true; + + default: + + return false; + } +} + + +Compressor * +newCompressor (Compression c, size_t maxScanLineSize, const Header &hdr) +{ + switch (c) + { + case RLE_COMPRESSION: + + return new RleCompressor (hdr, maxScanLineSize); + + case ZIPS_COMPRESSION: + + return new ZipCompressor (hdr, maxScanLineSize, 1); + + case ZIP_COMPRESSION: + + return new ZipCompressor (hdr, maxScanLineSize, 16); + + case PIZ_COMPRESSION: + + return new PizCompressor (hdr, maxScanLineSize, 32); + + case PXR24_COMPRESSION: + + return new Pxr24Compressor (hdr, maxScanLineSize, 16); + + case B44_COMPRESSION: + + return new B44Compressor (hdr, maxScanLineSize, 32, false); + + case B44A_COMPRESSION: + + return new B44Compressor (hdr, maxScanLineSize, 32, true); + + default: + + return 0; + } +} + + +Compressor * +newTileCompressor (Compression c, + size_t tileLineSize, + size_t numTileLines, + const Header &hdr) +{ + switch (c) + { + case RLE_COMPRESSION: + + return new RleCompressor (hdr, uiMult (tileLineSize, numTileLines)); + + case ZIPS_COMPRESSION: + case ZIP_COMPRESSION: + + return new ZipCompressor (hdr, tileLineSize, numTileLines); + + case PIZ_COMPRESSION: + + return new PizCompressor (hdr, tileLineSize, numTileLines); + + case PXR24_COMPRESSION: + + return new Pxr24Compressor (hdr, tileLineSize, numTileLines); + + case B44_COMPRESSION: + + return new B44Compressor (hdr, tileLineSize, numTileLines, false); + + case B44A_COMPRESSION: + + return new B44Compressor (hdr, tileLineSize, numTileLines, true); + + default: + + return 0; + } +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfCompressor.h b/3rdparty/openexr/IlmImf/ImfCompressor.h new file mode 100644 index 000000000..603939666 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfCompressor.h @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_COMPRESSOR_H +#define INCLUDED_IMF_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class Compressor +// +//----------------------------------------------------------------------------- + +#include +#include "ImathBox.h" +#include + +namespace Imf { + +class Header; + + +class Compressor +{ + public: + + //--------------------------------------------- + // Constructor -- hdr is the header of the file + // that will be compressed or uncompressed + //--------------------------------------------- + + Compressor (const Header &hdr); + + + //----------- + // Destructor + //----------- + + virtual ~Compressor (); + + + //---------------------------------------------- + // Maximum number of scan lines processed by + // a single call to compress() and uncompress(). + //---------------------------------------------- + + virtual int numScanLines () const = 0; + + + //-------------------------------------------- + // Format of the pixel data read and written + // by the compress() and uncompress() methods. + // The default implementation of format() + // returns XDR. + //-------------------------------------------- + + enum Format + { + NATIVE, // the machine's native format + XDR // Xdr format + }; + + virtual Format format () const; + + + //---------------------------- + // Access to the file's header + //---------------------------- + + const Header & header () const {return _header;} + + + //------------------------------------------------------------------------- + // Compress an array of bytes that represents the contents of up to + // numScanLines() scan lines: + // + // inPtr Input buffer (uncompressed data). + // + // inSize Number of bytes in the input buffer + // + // minY Minimum y coordinate of the scan lines to + // be compressed + // + // outPtr Pointer to output buffer + // + // return value Size of compressed data in output buffer + // + // Arrangement of uncompressed pixel data in the input buffer: + // + // Before calling + // + // compress (buf, size, minY, ...); + // + // the InputFile::writePixels() method gathers pixel data from the + // frame buffer, fb, and places them in buffer buf, like this: + // + // char *endOfBuf = buf; + // + // for (int y = minY; + // y <= min (minY + numScanLines() - 1, header().dataWindow().max.y); + // ++y) + // { + // for (ChannelList::ConstIterator c = header().channels().begin(); + // c != header().channels().end(); + // ++c) + // { + // if (modp (y, c.channel().ySampling) != 0) + // continue; + // + // for (int x = header().dataWindow().min.x; + // x <= header().dataWindow().max.x; + // ++x) + // { + // if (modp (x, c.channel().xSampling) != 0) + // continue; + // + // Xdr::write (endOfBuf, fb.pixel (c, x, y)); + // } + // } + // } + // + // int size = endOfBuf - buf; + // + //------------------------------------------------------------------------- + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) = 0; + + virtual int compressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + //------------------------------------------------------------------------- + // Uncompress an array of bytes that has been compressed by compress(): + // + // inPtr Input buffer (compressed data). + // + // inSize Number of bytes in the input buffer + // + // minY Minimum y coordinate of the scan lines to + // be uncompressed + // + // outPtr Pointer to output buffer + // + // return value Size of uncompressed data in output buffer + // + //------------------------------------------------------------------------- + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) = 0; + + virtual int uncompressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + private: + + const Header & _header; +}; + + +//-------------------------------------- +// Test if c is a valid compression type +//-------------------------------------- + +bool isValidCompression (Compression c); + + +//----------------------------------------------------------------- +// Construct a Compressor for compression type c: +// +// maxScanLineSize Maximum number of bytes per uncompressed +// scan line. +// +// header Header of the input or output file whose +// pixels will be compressed or uncompressed. +// +// return value A pointer to a new Compressor object (it +// is the caller's responsibility to delete +// the object), or 0 (if c is NO_COMPRESSION). +// +//----------------------------------------------------------------- + +Compressor * newCompressor (Compression c, + size_t maxScanLineSize, + const Header &hdr); + + +//----------------------------------------------------------------- +// Construct a Compressor for compression type c for a tiled image: +// +// tileLineSize Maximum number of bytes per uncompressed +// line in a tile. +// +// numTileLines Maximum number of lines in a tile. +// +// header Header of the input or output file whose +// pixels will be compressed or uncompressed. +// +// return value A pointer to a new Compressor object (it +// is the caller's responsibility to delete +// the object), or 0 (if c is NO_COMPRESSION). +// +//----------------------------------------------------------------- + +Compressor * newTileCompressor (Compression c, + size_t tileLineSize, + size_t numTileLines, + const Header &hdr); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfConvert.cpp b/3rdparty/openexr/IlmImf/ImfConvert.cpp new file mode 100644 index 000000000..0d6a4a1b2 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfConvert.cpp @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Routines for converting between pixel data types, +// with well-defined behavior for exceptional cases. +// +//----------------------------------------------------------------------------- + +#include +#include + +namespace Imf { +namespace { + +inline bool +isNegative (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x80000000) != 0; +} + + +inline bool +isNan (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x7fffffff) > 0x7f800000; +} + + +inline bool +isInfinity (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x7fffffff) == 0x7f800000; +} + + +inline bool +isFinite (float f) +{ + union {float f; int i;} u; + u.f = f; + return (u.i & 0x7f800000) != 0x7f800000; +} + +} // namespace + + +unsigned int +halfToUint (half h) +{ + if (h.isNegative() || h.isNan()) + return 0; + + if (h.isInfinity()) + return UINT_MAX; + + return (unsigned int) h; +} + + +unsigned int +floatToUint (float f) +{ + if (isNegative (f) || isNan (f)) + return 0; + + if (isInfinity (f) || f > UINT_MAX) + return UINT_MAX; + + return (unsigned int) f; +} + + +half +uintToHalf (unsigned int ui) +{ + if (ui > HALF_MAX) + return half::posInf(); + + return half (ui); +} + + +half +floatToHalf (float f) +{ + if (isFinite (f)) + { + if (f > HALF_MAX) + return half::posInf(); + + if (f < -HALF_MAX) + return half::negInf(); + } + + return half (f); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfConvert.h b/3rdparty/openexr/IlmImf/ImfConvert.h new file mode 100644 index 000000000..fc2c03725 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfConvert.h @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_CONVERT_H +#define INCLUDED_IMF_CONVERT_H + +//----------------------------------------------------------------------------- +// +// Routines for converting between pixel data types, +// with well-defined behavior for exceptional cases, +// without depending on how hardware and operating +// system handle integer overflows and floating-point +// exceptions. +// +//----------------------------------------------------------------------------- + +#include "half.h" + + +namespace Imf { + +//--------------------------------------------------------- +// Conversion from half or float to unsigned int: +// +// input result +// --------------------------------------------------- +// +// finite, >= 0 input, cast to unsigned int +// (rounds towards zero) +// +// finite, < 0 0 +// +// NaN 0 +// +// +infinity UINT_MAX +// +// -infinity 0 +// +//--------------------------------------------------------- + +unsigned int halfToUint (half h); +unsigned int floatToUint (float f); + + +//--------------------------------------------------------- +// Conversion from unsigned int or float to half: +// +// input result +// --------------------------------------------------- +// +// finite, closest possible half +// magnitude <= HALF_MAX +// +// finite, > HALF_MAX +infinity +// +// finite, < -HALF_MAX -infinity +// +// NaN NaN +// +// +infinity +infinity +// +// -infinity -infinity +// +//--------------------------------------------------------- + +half uintToHalf (unsigned int ui); +half floatToHalf (float f); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfDoubleAttribute.cpp b/3rdparty/openexr/IlmImf/ImfDoubleAttribute.cpp new file mode 100644 index 000000000..1ed40c028 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfDoubleAttribute.cpp @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class DoubleAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +DoubleAttribute::staticTypeName () +{ + return "double"; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfDoubleAttribute.h b/3rdparty/openexr/IlmImf/ImfDoubleAttribute.h new file mode 100644 index 000000000..bafd1ef2b --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfDoubleAttribute.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_DOUBLE_ATTRIBUTE_H +#define INCLUDED_IMF_DOUBLE_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class DoubleAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +typedef TypedAttribute DoubleAttribute; +template <> const char *DoubleAttribute::staticTypeName (); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfEnvmap.cpp b/3rdparty/openexr/IlmImf/ImfEnvmap.cpp new file mode 100644 index 000000000..fdb04ac21 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfEnvmap.cpp @@ -0,0 +1,328 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Environment maps +// +//----------------------------------------------------------------------------- + +#include +#include "ImathFun.h" +#include +#include + +using namespace std; +using namespace Imath; + +namespace Imf { +namespace LatLongMap { + +V2f +latLong (const V3f &dir) +{ + float r = sqrt (dir.z * dir.z + dir.x * dir.x); + + float latitude = (r < abs (dir.y))? + acos (r / dir.length()) * sign (dir.y): + asin (dir.y / dir.length()); + + float longitude = (dir.z == 0 && dir.x == 0)? 0: atan2 (dir.x, dir.z); + + return V2f (latitude, longitude); +} + + +V2f +latLong (const Box2i &dataWindow, const V2f &pixelPosition) +{ + float latitude, longitude; + + if (dataWindow.max.y > dataWindow.min.y) + { + latitude = -M_PI * + ((pixelPosition.y - dataWindow.min.y) / + (dataWindow.max.y - dataWindow.min.y) - 0.5f); + } + else + { + latitude = 0; + } + + if (dataWindow.max.x > dataWindow.min.x) + { + longitude = -2 * M_PI * + ((pixelPosition.x - dataWindow.min.x) / + (dataWindow.max.x - dataWindow.min.x) - 0.5f); + } + else + { + longitude = 0; + } + + return V2f (latitude, longitude); +} + + +V2f +pixelPosition (const Box2i &dataWindow, const V2f &latLong) +{ + float x = latLong.y / (-2 * M_PI) + 0.5f; + float y = latLong.x / -M_PI + 0.5f; + + return V2f (x * (dataWindow.max.x - dataWindow.min.x) + dataWindow.min.x, + y * (dataWindow.max.y - dataWindow.min.y) + dataWindow.min.y); +} + + +V2f +pixelPosition (const Box2i &dataWindow, const V3f &direction) +{ + return pixelPosition (dataWindow, latLong (direction)); +} + + +V3f +direction (const Box2i &dataWindow, const V2f &pixelPosition) +{ + V2f ll = latLong (dataWindow, pixelPosition); + + return V3f (sin (ll.y) * cos (ll.x), + sin (ll.x), + cos (ll.y) * cos (ll.x)); +} + +} // namespace LatLongMap + + +namespace CubeMap { + +int +sizeOfFace (const Box2i &dataWindow) +{ + return min ((dataWindow.max.x - dataWindow.min.x + 1), + (dataWindow.max.y - dataWindow.min.y + 1) / 6); +} + + +Box2i +dataWindowForFace (CubeMapFace face, const Box2i &dataWindow) +{ + int sof = sizeOfFace (dataWindow); + Box2i dwf; + + dwf.min.x = 0; + dwf.min.y = int (face) * sof; + + dwf.max.x = dwf.min.x + sof - 1; + dwf.max.y = dwf.min.y + sof - 1; + + return dwf; +} + + +V2f +pixelPosition (CubeMapFace face, const Box2i &dataWindow, V2f positionInFace) +{ + Box2i dwf = dataWindowForFace (face, dataWindow); + V2f pos (0, 0); + + switch (face) + { + case CUBEFACE_POS_X: + + pos.x = dwf.min.x + positionInFace.y; + pos.y = dwf.max.y - positionInFace.x; + break; + + case CUBEFACE_NEG_X: + + pos.x = dwf.max.x - positionInFace.y; + pos.y = dwf.max.y - positionInFace.x; + break; + + case CUBEFACE_POS_Y: + + pos.x = dwf.min.x + positionInFace.x; + pos.y = dwf.max.y - positionInFace.y; + break; + + case CUBEFACE_NEG_Y: + + pos.x = dwf.min.x + positionInFace.x; + pos.y = dwf.min.y + positionInFace.y; + break; + + case CUBEFACE_POS_Z: + + pos.x = dwf.max.x - positionInFace.x; + pos.y = dwf.max.y - positionInFace.y; + break; + + case CUBEFACE_NEG_Z: + + pos.x = dwf.min.x + positionInFace.x; + pos.y = dwf.max.y - positionInFace.y; + break; + } + + return pos; +} + + +void +faceAndPixelPosition (const V3f &direction, + const Box2i &dataWindow, + CubeMapFace &face, + V2f &pif) +{ + int sof = sizeOfFace (dataWindow); + float absx = abs (direction.x); + float absy = abs (direction.y); + float absz = abs (direction.z); + + if (absx >= absy && absx >= absz) + { + if (absx == 0) + { + // + // Special case - direction is (0, 0, 0) + // + + face = CUBEFACE_POS_X; + pif = V2f (0, 0); + return; + } + + pif.x = (direction.y / absx + 1) / 2 * (sof - 1); + pif.y = (direction.z / absx + 1) / 2 * (sof - 1); + + if (direction.x > 0) + face = CUBEFACE_POS_X; + else + face = CUBEFACE_NEG_X; + } + else if (absy >= absz) + { + pif.x = (direction.x / absy + 1) / 2 * (sof - 1); + pif.y = (direction.z / absy + 1) / 2 * (sof - 1); + + if (direction.y > 0) + face = CUBEFACE_POS_Y; + else + face = CUBEFACE_NEG_Y; + } + else + { + pif.x = (direction.x / absz + 1) / 2 * (sof - 1); + pif.y = (direction.y / absz + 1) / 2 * (sof - 1); + + if (direction.z > 0) + face = CUBEFACE_POS_Z; + else + face = CUBEFACE_NEG_Z; + } +} + + +V3f +direction (CubeMapFace face, const Box2i &dataWindow, const V2f &positionInFace) +{ + int sof = sizeOfFace (dataWindow); + + V2f pos; + + if (sof > 1) + { + pos = V2f (positionInFace.x / (sof - 1) * 2 - 1, + positionInFace.y / (sof - 1) * 2 - 1); + } + else + { + pos = V2f (0, 0); + } + + V3f dir (1, 0, 0); + + switch (face) + { + case CUBEFACE_POS_X: + + dir.x = 1; + dir.y = pos.x; + dir.z = pos.y; + break; + + case CUBEFACE_NEG_X: + + dir.x = -1; + dir.y = pos.x; + dir.z = pos.y; + break; + + case CUBEFACE_POS_Y: + + dir.x = pos.x; + dir.y = 1; + dir.z = pos.y; + break; + + case CUBEFACE_NEG_Y: + + dir.x = pos.x; + dir.y = -1; + dir.z = pos.y; + break; + + case CUBEFACE_POS_Z: + + dir.x = pos.x; + dir.y = pos.y; + dir.z = 1; + break; + + case CUBEFACE_NEG_Z: + + dir.x = pos.x; + dir.y = pos.y; + dir.z = -1; + break; + } + + return dir; +} + +} // namespace CubeMap +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfEnvmap.h b/3rdparty/openexr/IlmImf/ImfEnvmap.h new file mode 100644 index 000000000..30c61e74e --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfEnvmap.h @@ -0,0 +1,322 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_ENVMAP_H +#define INCLUDED_IMF_ENVMAP_H + +//----------------------------------------------------------------------------- +// +// Environment maps +// +// Environment maps define a mapping from 3D directions to 2D +// pixel space locations. Environment maps are typically used +// in 3D rendering, for effects such as quickly approximating +// how shiny surfaces reflect their environment. +// +// Environment maps can be stored in scanline-based or in tiled +// OpenEXR files. The fact that an image is an environment map +// is indicated by the presence of an EnvmapAttribute whose name +// is "envmap". (Convenience functions to access this attribute +// are defined in header file ImfStandardAttributes.h.) +// The attribute's value defines the mapping from 3D directions +// to 2D pixel space locations. +// +// This header file defines the set of possible EnvmapAttribute +// values. +// +// For each possible EnvmapAttribute value, this header file also +// defines a set of convienience functions to convert between 3D +// directions and 2D pixel locations. +// +// Most of the convenience functions defined below require a +// dataWindow parameter. For scanline-based images, and for +// tiled images with level mode ONE_LEVEL, the dataWindow +// parameter should be set to the image's data window, as +// defined in the image header. For tiled images with level +// mode MIPMAP_LEVELS or RIPMAP_LEVELS, the data window of the +// image level that is being accessed should be used instead. +// (See the dataWindowForLevel() methods in ImfTiledInputFile.h +// and ImfTiledOutputFile.h.) +// +//----------------------------------------------------------------------------- + +#include "ImathBox.h" + +namespace Imf { + +//-------------------------------- +// Supported environment map types +//-------------------------------- + +enum Envmap +{ + ENVMAP_LATLONG = 0, // Latitude-longitude environment map + ENVMAP_CUBE = 1, // Cube map + + NUM_ENVMAPTYPES // Number of different environment map types +}; + + +//------------------------------------------------------------------------- +// Latitude-Longitude Map: +// +// The environment is projected onto the image using polar coordinates +// (latitude and longitude). A pixel's x coordinate corresponds to +// its longitude, and the y coordinate corresponds to its latitude. +// Pixel (dataWindow.min.x, dataWindow.min.y) has latitude +pi/2 and +// longitude +pi; pixel (dataWindow.max.x, dataWindow.max.y) has +// latitude -pi/2 and longitude -pi. +// +// In 3D space, latitudes -pi/2 and +pi/2 correspond to the negative and +// positive y direction. Latitude 0, longitude 0 points into positive +// z direction; and latitude 0, longitude pi/2 points into positive x +// direction. +// +// The size of the data window should be 2*N by N pixels (width by height), +// where N can be any integer greater than 0. +//------------------------------------------------------------------------- + +namespace LatLongMap +{ + //---------------------------------------------------- + // Convert a 3D direction to a 2D vector whose x and y + // components represent the corresponding latitude + // and longitude. + //---------------------------------------------------- + + Imath::V2f latLong (const Imath::V3f &direction); + + + //-------------------------------------------------------- + // Convert the position of a pixel to a 2D vector whose + // x and y components represent the corresponding latitude + // and longitude. + //-------------------------------------------------------- + + Imath::V2f latLong (const Imath::Box2i &dataWindow, + const Imath::V2f &pixelPosition); + + + //------------------------------------------------------------- + // Convert a 2D vector, whose x and y components represent + // longitude and latitude, into a corresponding pixel position. + //------------------------------------------------------------- + + Imath::V2f pixelPosition (const Imath::Box2i &dataWindow, + const Imath::V2f &latLong); + + + //----------------------------------------------------- + // Convert a 3D direction vector into a corresponding + // pixel position. pixelPosition(dw,dir) is equivalent + // to pixelPosition(dw,latLong(dw,dir)). + //----------------------------------------------------- + + Imath::V2f pixelPosition (const Imath::Box2i &dataWindow, + const Imath::V3f &direction); + + + //-------------------------------------------------------- + // Convert the position of a pixel in a latitude-longitude + // map into a corresponding 3D direction. + //-------------------------------------------------------- + + Imath::V3f direction (const Imath::Box2i &dataWindow, + const Imath::V2f &pixelPosition); +} + + +//-------------------------------------------------------------- +// Cube Map: +// +// The environment is projected onto the six faces of an +// axis-aligned cube. The cube's faces are then arranged +// in a 2D image as shown below. +// +// 2-----------3 +// / /| +// / / | Y +// / / | | +// 6-----------7 | | +// | | | | +// | | | | +// | 0 | 1 *------- X +// | | / / +// | | / / +// | |/ / +// 4-----------5 Z +// +// dataWindow.min +// / +// / +// +-----------+ +// |3 Y 7| +// | | | +// | | | +// | ---+---Z | +X face +// | | | +// | | | +// |1 5| +// +-----------+ +// |6 Y 2| +// | | | +// | | | +// | Z---+--- | -X face +// | | | +// | | | +// |4 0| +// +-----------+ +// |6 Z 7| +// | | | +// | | | +// | ---+---X | +Y face +// | | | +// | | | +// |2 3| +// +-----------+ +// |0 1| +// | | | +// | | | +// | ---+---X | -Y face +// | | | +// | | | +// |4 Z 5| +// +-----------+ +// |7 Y 6| +// | | | +// | | | +// | X---+--- | +Z face +// | | | +// | | | +// |5 4| +// +-----------+ +// |2 Y 3| +// | | | +// | | | +// | ---+---X | -Z face +// | | | +// | | | +// |0 1| +// +-----------+ +// / +// / +// dataWindow.max +// +// The size of the data window should be N by 6*N pixels +// (width by height), where N can be any integer greater +// than 0. +// +//-------------------------------------------------------------- + +//------------------------------------ +// Names for the six faces of the cube +//------------------------------------ + +enum CubeMapFace +{ + CUBEFACE_POS_X, // +X face + CUBEFACE_NEG_X, // -X face + CUBEFACE_POS_Y, // +Y face + CUBEFACE_NEG_Y, // -Y face + CUBEFACE_POS_Z, // +Z face + CUBEFACE_NEG_Z // -Z face +}; + +namespace CubeMap +{ + //--------------------------------------------- + // Width and height of a cube's face, in pixels + //--------------------------------------------- + + int sizeOfFace (const Imath::Box2i &dataWindow); + + + //------------------------------------------ + // Compute the region in the environment map + // that is covered by the specified face. + //------------------------------------------ + + Imath::Box2i dataWindowForFace (CubeMapFace face, + const Imath::Box2i &dataWindow); + + + //---------------------------------------------------- + // Convert the coordinates of a pixel within a face + // [in the range from (0,0) to (s-1,s-1), where + // s == sizeOfFace(dataWindow)] to pixel coordinates + // in the environment map. + //---------------------------------------------------- + + Imath::V2f pixelPosition (CubeMapFace face, + const Imath::Box2i &dataWindow, + Imath::V2f positionInFace); + + + //-------------------------------------------------------------- + // Convert a 3D direction into a cube face, and a pixel position + // within that face. + // + // If you have a 3D direction, dir, the following code fragment + // finds the position, pos, of the corresponding pixel in an + // environment map with data window dw: + // + // CubeMapFace f; + // V2f pif, pos; + // + // faceAndPixelPosition (dir, dw, f, pif); + // pos = pixelPosition (f, dw, pif); + // + //-------------------------------------------------------------- + + void faceAndPixelPosition (const Imath::V3f &direction, + const Imath::Box2i &dataWindow, + CubeMapFace &face, + Imath::V2f &positionInFace); + + + // -------------------------------------------------------- + // Given a cube face and a pixel position within that face, + // compute the corresponding 3D direction. + // -------------------------------------------------------- + + Imath::V3f direction (CubeMapFace face, + const Imath::Box2i &dataWindow, + const Imath::V2f &positionInFace); +} + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp b/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp new file mode 100644 index 000000000..03a792874 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class EnvmapAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +EnvmapAttribute::staticTypeName () +{ + return "envmap"; +} + + +template <> +void +EnvmapAttribute::writeValueTo (OStream &os, int version) const +{ + unsigned char tmp = _value; + Xdr::write (os, tmp); +} + + +template <> +void +EnvmapAttribute::readValueFrom (IStream &is, int size, int version) +{ + unsigned char tmp; + Xdr::read (is, tmp); + _value = Envmap (tmp); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.h b/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.h new file mode 100644 index 000000000..716883fbd --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.h @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_ENVMAP_ATTRIBUTE_H +#define INCLUDED_IMF_ENVMAP_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class EnvmapAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute EnvmapAttribute; +template <> const char *EnvmapAttribute::staticTypeName (); +template <> void EnvmapAttribute::writeValueTo (OStream &, int) const; +template <> void EnvmapAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfFloatAttribute.cpp b/3rdparty/openexr/IlmImf/ImfFloatAttribute.cpp new file mode 100644 index 000000000..22366c368 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfFloatAttribute.cpp @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class FloatAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +FloatAttribute::staticTypeName () +{ + return "float"; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfFloatAttribute.h b/3rdparty/openexr/IlmImf/ImfFloatAttribute.h new file mode 100644 index 000000000..60d6f23c5 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfFloatAttribute.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_FLOAT_ATTRIBUTE_H +#define INCLUDED_IMF_FLOAT_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class FloatAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +typedef TypedAttribute FloatAttribute; +template <> const char *FloatAttribute::staticTypeName (); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfFrameBuffer.cpp b/3rdparty/openexr/IlmImf/ImfFrameBuffer.cpp new file mode 100644 index 000000000..f4c8fd04b --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfFrameBuffer.cpp @@ -0,0 +1,226 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Slice +// class FrameBuffer +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" + + +using namespace std; + +namespace Imf { + +Slice::Slice (PixelType t, + char *b, + size_t xst, + size_t yst, + int xsm, + int ysm, + double fv, + bool xtc, + bool ytc) +: + type (t), + base (b), + xStride (xst), + yStride (yst), + xSampling (xsm), + ySampling (ysm), + fillValue (fv), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +void +FrameBuffer::insert (const char name[], const Slice &slice) +{ + if (name[0] == 0) + { + THROW (Iex::ArgExc, + "Frame buffer slice name cannot be an empty string."); + } + + _map[name] = slice; +} + + +void +FrameBuffer::insert (const string &name, const Slice &slice) +{ + insert (name.c_str(), slice); +} + + +Slice & +FrameBuffer::operator [] (const char name[]) +{ + SliceMap::iterator i = _map.find (name); + + if (i == _map.end()) + { + THROW (Iex::ArgExc, + "Cannot find frame buffer slice \"" << name << "\"."); + } + + return i->second; +} + + +const Slice & +FrameBuffer::operator [] (const char name[]) const +{ + SliceMap::const_iterator i = _map.find (name); + + if (i == _map.end()) + { + THROW (Iex::ArgExc, + "Cannot find frame buffer slice \"" << name << "\"."); + } + + return i->second; +} + + +Slice & +FrameBuffer::operator [] (const string &name) +{ + return this->operator[] (name.c_str()); +} + + +const Slice & +FrameBuffer::operator [] (const string &name) const +{ + return this->operator[] (name.c_str()); +} + + +Slice * +FrameBuffer::findSlice (const char name[]) +{ + SliceMap::iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +const Slice * +FrameBuffer::findSlice (const char name[]) const +{ + SliceMap::const_iterator i = _map.find (name); + return (i == _map.end())? 0: &i->second; +} + + +Slice * +FrameBuffer::findSlice (const string &name) +{ + return findSlice (name.c_str()); +} + + +const Slice * +FrameBuffer::findSlice (const string &name) const +{ + return findSlice (name.c_str()); +} + + +FrameBuffer::Iterator +FrameBuffer::begin () +{ + return _map.begin(); +} + + +FrameBuffer::ConstIterator +FrameBuffer::begin () const +{ + return _map.begin(); +} + + +FrameBuffer::Iterator +FrameBuffer::end () +{ + return _map.end(); +} + + +FrameBuffer::ConstIterator +FrameBuffer::end () const +{ + return _map.end(); +} + + +FrameBuffer::Iterator +FrameBuffer::find (const char name[]) +{ + return _map.find (name); +} + + +FrameBuffer::ConstIterator +FrameBuffer::find (const char name[]) const +{ + return _map.find (name); +} + + +FrameBuffer::Iterator +FrameBuffer::find (const string &name) +{ + return find (name.c_str()); +} + + +FrameBuffer::ConstIterator +FrameBuffer::find (const string &name) const +{ + return find (name.c_str()); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfFrameBuffer.h b/3rdparty/openexr/IlmImf/ImfFrameBuffer.h new file mode 100644 index 000000000..3b6cc92cf --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfFrameBuffer.h @@ -0,0 +1,383 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_FRAME_BUFFER_H +#define INCLUDED_IMF_FRAME_BUFFER_H + +//----------------------------------------------------------------------------- +// +// class Slice +// class FrameBuffer +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include + + +namespace Imf { + + +//------------------------------------------------------- +// Description of a single slice of the frame buffer: +// +// Note -- terminology: as part of a file, a component of +// an image (e.g. red, green, blue, depth etc.) is called +// a "channel". As part of a frame buffer, an image +// component is called a "slice". +//------------------------------------------------------- + +struct Slice +{ + //------------------------------ + // Data type; see ImfPixelType.h + //------------------------------ + + PixelType type; + + + //--------------------------------------------------------------------- + // Memory layout: The address of pixel (x, y) is + // + // base + (xp / xSampling) * xStride + (yp / ySampling) * yStride + // + // where xp and yp are computed as follows: + // + // * If we are reading or writing a scanline-based file: + // + // xp = x + // yp = y + // + // * If we are reading a tile whose upper left coorner is at (xt, yt): + // + // if xTileCoords is true then xp = x - xt, else xp = x + // if yTileCoords is true then yp = y - yt, else yp = y + // + //--------------------------------------------------------------------- + + char * base; + size_t xStride; + size_t yStride; + + + //-------------------------------------------- + // Subsampling: pixel (x, y) is present in the + // slice only if + // + // x % xSampling == 0 && y % ySampling == 0 + // + //-------------------------------------------- + + int xSampling; + int ySampling; + + + //---------------------------------------------------------- + // Default value, used to fill the slice when a file without + // a channel that corresponds to this slice is read. + //---------------------------------------------------------- + + double fillValue; + + + //------------------------------------------------------- + // For tiled files, the xTileCoords and yTileCoords flags + // determine whether pixel addressing is performed using + // absolute coordinates or coordinates relative to a + // tile's upper left corner. (See the comment on base, + // xStride and yStride, above.) + // + // For scanline-based files these flags have no effect; + // pixel addressing is always done using absolute + // coordinates. + //------------------------------------------------------- + + bool xTileCoords; + bool yTileCoords; + + + //------------ + // Constructor + //------------ + + Slice (PixelType type = HALF, + char * base = 0, + size_t xStride = 0, + size_t yStride = 0, + int xSampling = 1, + int ySampling = 1, + double fillValue = 0.0, + bool xTileCoords = false, + bool yTileCoords = false); +}; + + +class FrameBuffer +{ + public: + + //------------ + // Add a slice + //------------ + + void insert (const char name[], + const Slice &slice); + + void insert (const std::string &name, + const Slice &slice); + + //---------------------------------------------------------------- + // Access to existing slices: + // + // [n] Returns a reference to the slice with name n. + // If no slice with name n exists, an Iex::ArgExc + // is thrown. + // + // findSlice(n) Returns a pointer to the slice with name n, + // or 0 if no slice with name n exists. + // + //---------------------------------------------------------------- + + Slice & operator [] (const char name[]); + const Slice & operator [] (const char name[]) const; + + Slice & operator [] (const std::string &name); + const Slice & operator [] (const std::string &name) const; + + Slice * findSlice (const char name[]); + const Slice * findSlice (const char name[]) const; + + Slice * findSlice (const std::string &name); + const Slice * findSlice (const std::string &name) const; + + + //----------------------------------------- + // Iterator-style access to existing slices + //----------------------------------------- + + typedef std::map SliceMap; + + class Iterator; + class ConstIterator; + + Iterator begin (); + ConstIterator begin () const; + + Iterator end (); + ConstIterator end () const; + + Iterator find (const char name[]); + ConstIterator find (const char name[]) const; + + Iterator find (const std::string &name); + ConstIterator find (const std::string &name) const; + + private: + + SliceMap _map; +}; + + +//---------- +// Iterators +//---------- + +class FrameBuffer::Iterator +{ + public: + + Iterator (); + Iterator (const FrameBuffer::SliceMap::iterator &i); + + Iterator & operator ++ (); + Iterator operator ++ (int); + + const char * name () const; + Slice & slice () const; + + private: + + friend class FrameBuffer::ConstIterator; + + FrameBuffer::SliceMap::iterator _i; +}; + + +class FrameBuffer::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const FrameBuffer::SliceMap::const_iterator &i); + ConstIterator (const FrameBuffer::Iterator &other); + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + const char * name () const; + const Slice & slice () const; + + private: + + friend bool operator == (const ConstIterator &, const ConstIterator &); + friend bool operator != (const ConstIterator &, const ConstIterator &); + + FrameBuffer::SliceMap::const_iterator _i; +}; + + +//----------------- +// Inline Functions +//----------------- + +inline +FrameBuffer::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +FrameBuffer::Iterator::Iterator (const FrameBuffer::SliceMap::iterator &i): + _i (i) +{ + // empty +} + + +inline FrameBuffer::Iterator & +FrameBuffer::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline FrameBuffer::Iterator +FrameBuffer::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +FrameBuffer::Iterator::name () const +{ + return *_i->first; +} + + +inline Slice & +FrameBuffer::Iterator::slice () const +{ + return _i->second; +} + + +inline +FrameBuffer::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +FrameBuffer::ConstIterator::ConstIterator + (const FrameBuffer::SliceMap::const_iterator &i): _i (i) +{ + // empty +} + + +inline +FrameBuffer::ConstIterator::ConstIterator (const FrameBuffer::Iterator &other): + _i (other._i) +{ + // empty +} + +inline FrameBuffer::ConstIterator & +FrameBuffer::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline FrameBuffer::ConstIterator +FrameBuffer::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +FrameBuffer::ConstIterator::name () const +{ + return *_i->first; +} + +inline const Slice & +FrameBuffer::ConstIterator::slice () const +{ + return _i->second; +} + + +inline bool +operator == (const FrameBuffer::ConstIterator &x, + const FrameBuffer::ConstIterator &y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const FrameBuffer::ConstIterator &x, + const FrameBuffer::ConstIterator &y) +{ + return !(x == y); +} + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfFramesPerSecond.cpp b/3rdparty/openexr/IlmImf/ImfFramesPerSecond.cpp new file mode 100644 index 000000000..cc533a0b8 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfFramesPerSecond.cpp @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Convenience functions related to the framesPerSecond attribute +// +//----------------------------------------------------------------------------- + +#include +#include "ImathFun.h" + +using namespace Imath; + +namespace Imf { + +Rational +guessExactFps (double fps) +{ + return guessExactFps (Rational (fps)); +} + + +Rational +guessExactFps (const Rational &fps) +{ + const double e = 0.002; + + if (abs (double (fps) - double (fps_23_976())) < e) + return fps_23_976(); + + if (abs (double (fps) - double (fps_29_97())) < e) + return fps_29_97(); + + if (abs (double (fps) - double (fps_47_952())) < e) + return fps_47_952(); + + if (abs (double (fps) - double (fps_59_94())) < e) + return fps_59_94(); + + return fps; +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfFramesPerSecond.h b/3rdparty/openexr/IlmImf/ImfFramesPerSecond.h new file mode 100644 index 000000000..cbef98479 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfFramesPerSecond.h @@ -0,0 +1,88 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_FRAMES_PER_SECOND_H +#define INCLUDED_IMF_FRAMES_PER_SECOND_H + +//----------------------------------------------------------------------------- +// +// Convenience functions related to the framesPerSecond attribute +// +// Functions that return the exact values for commonly used frame rates: +// +// name frames per second +// +// fps_23_976() 23.976023... +// fps_24() 24.0 35mm film frames +// fps_25() 25.0 PAL video frames +// fps_29_97() 29.970029... NTSC video frames +// fps_30() 30.0 60Hz HDTV frames +// fps_47_952() 47.952047... +// fps_48() 48.0 +// fps_50() 50.0 PAL video fields +// fps_59_94() 59.940059... NTSC video fields +// fps_60() 60.0 60Hz HDTV fields +// +// Functions that try to convert inexact frame rates into exact ones: +// +// Given a frame rate, fps, that is close to one of the pre-defined +// frame rates fps_23_976(), fps_29_97(), fps_47_952() or fps_59_94(), +// guessExactFps(fps) returns the corresponding pre-defined frame +// rate. If fps is not close to one of the pre-defined frame rates, +// then guessExactFps(fps) returns Rational(fps). +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + +inline Rational fps_23_976 () {return Rational (24000, 1001);} +inline Rational fps_24 () {return Rational (24, 1);} +inline Rational fps_25 () {return Rational (25, 1);} +inline Rational fps_29_97 () {return Rational (30000, 1001);} +inline Rational fps_30 () {return Rational (30, 1);} +inline Rational fps_47_952 () {return Rational (48000, 1001);} +inline Rational fps_48 () {return Rational (48, 1);} +inline Rational fps_50 () {return Rational (50, 1);} +inline Rational fps_59_94 () {return Rational (60000, 1001);} +inline Rational fps_60 () {return Rational (60, 1);} + +Rational guessExactFps (double fps); +Rational guessExactFps (const Rational &fps); + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfHeader.cpp b/3rdparty/openexr/IlmImf/ImfHeader.cpp new file mode 100644 index 000000000..e64300a65 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfHeader.cpp @@ -0,0 +1,1106 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class Header +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include +#include + + +namespace Imf { + +using namespace std; +using Imath::Box2i; +using Imath::V2i; +using Imath::V2f; +using IlmThread::Mutex; +using IlmThread::Lock; + + +namespace { + +int maxImageWidth = 0; +int maxImageHeight = 0; +int maxTileWidth = 0; +int maxTileHeight = 0; + + +void +initialize (Header &header, + const Box2i &displayWindow, + const Box2i &dataWindow, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +{ + header.insert ("displayWindow", Box2iAttribute (displayWindow)); + header.insert ("dataWindow", Box2iAttribute (dataWindow)); + header.insert ("pixelAspectRatio", FloatAttribute (pixelAspectRatio)); + header.insert ("screenWindowCenter", V2fAttribute (screenWindowCenter)); + header.insert ("screenWindowWidth", FloatAttribute (screenWindowWidth)); + header.insert ("lineOrder", LineOrderAttribute (lineOrder)); + header.insert ("compression", CompressionAttribute (compression)); + header.insert ("channels", ChannelListAttribute ()); +} + + +bool +usesLongNames (const Header &header) +{ + // + // If an OpenEXR file contains any attribute names, attribute type names + // or channel names longer than 31 characters, then the file cannot be + // read by older versions of the IlmImf library (up to OpenEXR 1.6.1). + // Before writing the file header, we check if the header contains + // any names longer than 31 characters; if it does, then we set the + // LONG_NAMES_FLAG in the file version number. Older versions of the + // IlmImf library will refuse to read files that have the LONG_NAMES_FLAG + // set. Without the flag, older versions of the library would mis- + // interpret the file as broken. + // + + for (Header::ConstIterator i = header.begin(); + i != header.end(); + ++i) + { + if (strlen (i.name()) >= 32 || strlen (i.attribute().typeName()) >= 32) + return true; + } + + const ChannelList &channels = header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + if (strlen (i.name()) >= 32) + return true; + } + + return false; +} + +template +void checkIsNullTerminated (const char (&str)[N], const char *what) +{ + for (int i = 0; i < N; ++i) { + if (str[i] == '\0') + return; + } + std::stringstream s; + s << "Invalid " << what << ": it is more than " << (N - 1) + << " characters long."; + throw Iex::InputExc(s); +} + +} // namespace + + +Header::Header (int width, + int height, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +: + _map() +{ + staticInitialize(); + + Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); + + initialize (*this, + displayWindow, + displayWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); +} + + +Header::Header (int width, + int height, + const Box2i &dataWindow, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +: + _map() +{ + staticInitialize(); + + Box2i displayWindow (V2i (0, 0), V2i (width - 1, height - 1)); + + initialize (*this, + displayWindow, + dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); +} + + +Header::Header (const Box2i &displayWindow, + const Box2i &dataWindow, + float pixelAspectRatio, + const V2f &screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression) +: + _map() +{ + staticInitialize(); + + initialize (*this, + displayWindow, + dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); +} + + +Header::Header (const Header &other): _map() +{ + for (AttributeMap::const_iterator i = other._map.begin(); + i != other._map.end(); + ++i) + { + insert (*i->first, *i->second); + } +} + + +Header::~Header () +{ + for (AttributeMap::iterator i = _map.begin(); + i != _map.end(); + ++i) + { + delete i->second; + } +} + + +Header & +Header::operator = (const Header &other) +{ + if (this != &other) + { + for (AttributeMap::iterator i = _map.begin(); + i != _map.end(); + ++i) + { + delete i->second; + } + + _map.erase (_map.begin(), _map.end()); + + for (AttributeMap::const_iterator i = other._map.begin(); + i != other._map.end(); + ++i) + { + insert (*i->first, *i->second); + } + } + + return *this; +} + + +void +Header::insert (const char name[], const Attribute &attribute) +{ + if (name[0] == 0) + THROW (Iex::ArgExc, "Image attribute name cannot be an empty string."); + + AttributeMap::iterator i = _map.find (name); + + if (i == _map.end()) + { + Attribute *tmp = attribute.copy(); + + try + { + _map[name] = tmp; + } + catch (...) + { + delete tmp; + throw; + } + } + else + { + if (strcmp (i->second->typeName(), attribute.typeName())) + THROW (Iex::TypeExc, "Cannot assign a value of " + "type \"" << attribute.typeName() << "\" " + "to image attribute \"" << name << "\" of " + "type \"" << i->second->typeName() << "\"."); + + Attribute *tmp = attribute.copy(); + delete i->second; + i->second = tmp; + } +} + + +void +Header::insert (const string &name, const Attribute &attribute) +{ + insert (name.c_str(), attribute); +} + + +Attribute & +Header::operator [] (const char name[]) +{ + AttributeMap::iterator i = _map.find (name); + + if (i == _map.end()) + THROW (Iex::ArgExc, "Cannot find image attribute \"" << name << "\"."); + + return *i->second; +} + + +const Attribute & +Header::operator [] (const char name[]) const +{ + AttributeMap::const_iterator i = _map.find (name); + + if (i == _map.end()) + THROW (Iex::ArgExc, "Cannot find image attribute \"" << name << "\"."); + + return *i->second; +} + + +Attribute & +Header::operator [] (const string &name) +{ + return this->operator[] (name.c_str()); +} + + +const Attribute & +Header::operator [] (const string &name) const +{ + return this->operator[] (name.c_str()); +} + + +Header::Iterator +Header::begin () +{ + return _map.begin(); +} + + +Header::ConstIterator +Header::begin () const +{ + return _map.begin(); +} + + +Header::Iterator +Header::end () +{ + return _map.end(); +} + + +Header::ConstIterator +Header::end () const +{ + return _map.end(); +} + + +Header::Iterator +Header::find (const char name[]) +{ + return _map.find (name); +} + + +Header::ConstIterator +Header::find (const char name[]) const +{ + return _map.find (name); +} + + +Header::Iterator +Header::find (const string &name) +{ + return find (name.c_str()); +} + + +Header::ConstIterator +Header::find (const string &name) const +{ + return find (name.c_str()); +} + + +Imath::Box2i & +Header::displayWindow () +{ + return static_cast + ((*this)["displayWindow"]).value(); +} + + +const Imath::Box2i & +Header::displayWindow () const +{ + return static_cast + ((*this)["displayWindow"]).value(); +} + + +Imath::Box2i & +Header::dataWindow () +{ + return static_cast + ((*this)["dataWindow"]).value(); +} + + +const Imath::Box2i & +Header::dataWindow () const +{ + return static_cast + ((*this)["dataWindow"]).value(); +} + + +float & +Header::pixelAspectRatio () +{ + return static_cast + ((*this)["pixelAspectRatio"]).value(); +} + + +const float & +Header::pixelAspectRatio () const +{ + return static_cast + ((*this)["pixelAspectRatio"]).value(); +} + + +Imath::V2f & +Header::screenWindowCenter () +{ + return static_cast + ((*this)["screenWindowCenter"]).value(); +} + + +const Imath::V2f & +Header::screenWindowCenter () const +{ + return static_cast + ((*this)["screenWindowCenter"]).value(); +} + + +float & +Header::screenWindowWidth () +{ + return static_cast + ((*this)["screenWindowWidth"]).value(); +} + + +const float & +Header::screenWindowWidth () const +{ + return static_cast + ((*this)["screenWindowWidth"]).value(); +} + + +ChannelList & +Header::channels () +{ + return static_cast + ((*this)["channels"]).value(); +} + + +const ChannelList & +Header::channels () const +{ + return static_cast + ((*this)["channels"]).value(); +} + + +LineOrder & +Header::lineOrder () +{ + return static_cast + ((*this)["lineOrder"]).value(); +} + + +const LineOrder & +Header::lineOrder () const +{ + return static_cast + ((*this)["lineOrder"]).value(); +} + + +Compression & +Header::compression () +{ + return static_cast + ((*this)["compression"]).value(); +} + + +const Compression & +Header::compression () const +{ + return static_cast + ((*this)["compression"]).value(); +} + + +void +Header::setTileDescription(const TileDescription& td) +{ + insert ("tiles", TileDescriptionAttribute (td)); +} + + +bool +Header::hasTileDescription() const +{ + return findTypedAttribute ("tiles") != 0; +} + + +TileDescription & +Header::tileDescription () +{ + return typedAttribute ("tiles").value(); +} + + +const TileDescription & +Header::tileDescription () const +{ + return typedAttribute ("tiles").value(); +} + +void +Header::setPreviewImage (const PreviewImage &pi) +{ + insert ("preview", PreviewImageAttribute (pi)); +} + + +PreviewImage & +Header::previewImage () +{ + return typedAttribute ("preview").value(); +} + + +const PreviewImage & +Header::previewImage () const +{ + return typedAttribute ("preview").value(); +} + + +bool +Header::hasPreviewImage () const +{ + return findTypedAttribute ("preview") != 0; +} + + +void +Header::sanityCheck (bool isTiled) const +{ + // + // The display window and the data window must each + // contain at least one pixel. In addition, the + // coordinates of the window corners must be small + // enough to keep expressions like max-min+1 or + // max+min from overflowing. + // + + const Box2i &displayWindow = this->displayWindow(); + + if (displayWindow.min.x > displayWindow.max.x || + displayWindow.min.y > displayWindow.max.y || + displayWindow.min.x <= -(INT_MAX / 2) || + displayWindow.min.y <= -(INT_MAX / 2) || + displayWindow.max.x >= (INT_MAX / 2) || + displayWindow.max.y >= (INT_MAX / 2)) + { + throw Iex::ArgExc ("Invalid display window in image header."); + } + + const Box2i &dataWindow = this->dataWindow(); + + if (dataWindow.min.x > dataWindow.max.x || + dataWindow.min.y > dataWindow.max.y || + dataWindow.min.x <= -(INT_MAX / 2) || + dataWindow.min.y <= -(INT_MAX / 2) || + dataWindow.max.x >= (INT_MAX / 2) || + dataWindow.max.y >= (INT_MAX / 2)) + { + throw Iex::ArgExc ("Invalid data window in image header."); + } + + if (maxImageWidth > 0 && + maxImageWidth < dataWindow.max.x - dataWindow.min.x + 1) + { + THROW (Iex::ArgExc, "The width of the data window exceeds the " + "maximum width of " << maxImageWidth << "pixels."); + } + + if (maxImageHeight > 0 && + maxImageHeight < dataWindow.max.y - dataWindow.min.y + 1) + { + THROW (Iex::ArgExc, "The width of the data window exceeds the " + "maximum width of " << maxImageHeight << "pixels."); + } + + // + // The pixel aspect ratio must be greater than 0. + // In applications, numbers like the the display or + // data window dimensions are likely to be multiplied + // or divided by the pixel aspect ratio; to avoid + // arithmetic exceptions, we limit the pixel aspect + // ratio to a range that is smaller than theoretically + // possible (real aspect ratios are likely to be close + // to 1.0 anyway). + // + + float pixelAspectRatio = this->pixelAspectRatio(); + + const float MIN_PIXEL_ASPECT_RATIO = 1e-6f; + const float MAX_PIXEL_ASPECT_RATIO = 1e+6f; + + if (pixelAspectRatio < MIN_PIXEL_ASPECT_RATIO || + pixelAspectRatio > MAX_PIXEL_ASPECT_RATIO) + { + throw Iex::ArgExc ("Invalid pixel aspect ratio in image header."); + } + + // + // The screen window width must not be less than 0. + // The size of the screen window can vary over a wide + // range (fish-eye lens to astronomical telescope), + // so we can't limit the screen window width to a + // small range. + // + + float screenWindowWidth = this->screenWindowWidth(); + + if (screenWindowWidth < 0) + throw Iex::ArgExc ("Invalid screen window width in image header."); + + // + // If the file is tiled, verify that the tile description has resonable + // values and check to see if the lineOrder is one of the predefined 3. + // If the file is not tiled, then the lineOrder can only be INCREASING_Y + // or DECREASING_Y. + // + + LineOrder lineOrder = this->lineOrder(); + + if (isTiled) + { + if (!hasTileDescription()) + { + throw Iex::ArgExc ("Tiled image has no tile " + "description attribute."); + } + + const TileDescription &tileDesc = tileDescription(); + + if (tileDesc.xSize <= 0 || tileDesc.ySize <= 0) + throw Iex::ArgExc ("Invalid tile size in image header."); + + if (maxTileWidth > 0 && + maxTileWidth < tileDesc.xSize) + { + THROW (Iex::ArgExc, "The width of the tiles exceeds the maximum " + "width of " << maxTileWidth << "pixels."); + } + + if (maxTileHeight > 0 && + maxTileHeight < tileDesc.ySize) + { + THROW (Iex::ArgExc, "The width of the tiles exceeds the maximum " + "width of " << maxTileHeight << "pixels."); + } + + if (tileDesc.mode != ONE_LEVEL && + tileDesc.mode != MIPMAP_LEVELS && + tileDesc.mode != RIPMAP_LEVELS) + throw Iex::ArgExc ("Invalid level mode in image header."); + + if (tileDesc.roundingMode != ROUND_UP && + tileDesc.roundingMode != ROUND_DOWN) + throw Iex::ArgExc ("Invalid level rounding mode in image header."); + + if (lineOrder != INCREASING_Y && + lineOrder != DECREASING_Y && + lineOrder != RANDOM_Y) + throw Iex::ArgExc ("Invalid line order in image header."); + } + else + { + if (lineOrder != INCREASING_Y && + lineOrder != DECREASING_Y) + throw Iex::ArgExc ("Invalid line order in image header."); + } + + // + // The compression method must be one of the predefined values. + // + + if (!isValidCompression (this->compression())) + throw Iex::ArgExc ("Unknown compression type in image header."); + + // + // Check the channel list: + // + // If the file is tiled then for each channel, the type must be one of the + // predefined values, and the x and y sampling must both be 1. + // + // If the file is not tiled then for each channel, the type must be one + // of the predefined values, the x and y coordinates of the data window's + // upper left corner must be divisible by the x and y subsampling factors, + // and the width and height of the data window must be divisible by the + // x and y subsampling factors. + // + + const ChannelList &channels = this->channels(); + + if (isTiled) + { + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + if (i.channel().type != UINT && + i.channel().type != HALF && + i.channel().type != FLOAT) + { + THROW (Iex::ArgExc, "Pixel type of \"" << i.name() << "\" " + "image channel is invalid."); + } + + if (i.channel().xSampling != 1) + { + THROW (Iex::ArgExc, "The x subsampling factor for the " + "\"" << i.name() << "\" channel " + "is not 1."); + } + + if (i.channel().ySampling != 1) + { + THROW (Iex::ArgExc, "The y subsampling factor for the " + "\"" << i.name() << "\" channel " + "is not 1."); + } + } + } + else + { + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + if (i.channel().type != UINT && + i.channel().type != HALF && + i.channel().type != FLOAT) + { + THROW (Iex::ArgExc, "Pixel type of \"" << i.name() << "\" " + "image channel is invalid."); + } + + if (i.channel().xSampling < 1) + { + THROW (Iex::ArgExc, "The x subsampling factor for the " + "\"" << i.name() << "\" channel " + "is invalid."); + } + + if (i.channel().ySampling < 1) + { + THROW (Iex::ArgExc, "The y subsampling factor for the " + "\"" << i.name() << "\" channel " + "is invalid."); + } + + if (dataWindow.min.x % i.channel().xSampling) + { + THROW (Iex::ArgExc, "The minimum x coordinate of the " + "image's data window is not a multiple " + "of the x subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + + if (dataWindow.min.y % i.channel().ySampling) + { + THROW (Iex::ArgExc, "The minimum y coordinate of the " + "image's data window is not a multiple " + "of the y subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + + if ((dataWindow.max.x - dataWindow.min.x + 1) % + i.channel().xSampling) + { + THROW (Iex::ArgExc, "Number of pixels per row in the " + "image's data window is not a multiple " + "of the x subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + + if ((dataWindow.max.y - dataWindow.min.y + 1) % + i.channel().ySampling) + { + THROW (Iex::ArgExc, "Number of pixels per column in the " + "image's data window is not a multiple " + "of the y subsampling factor of " + "the \"" << i.name() << "\" channel."); + } + } + } +} + + +void +Header::setMaxImageSize (int maxWidth, int maxHeight) +{ + maxImageWidth = maxWidth; + maxImageHeight = maxHeight; +} + + +void +Header::setMaxTileSize (int maxWidth, int maxHeight) +{ + maxTileWidth = maxWidth; + maxTileHeight = maxHeight; +} + + +Int64 +Header::writeTo (OStream &os, bool isTiled) const +{ + // + // Write a "magic number" to identify the file as an image file. + // Write the current file format version number. + // + + Xdr::write (os, MAGIC); + + int version = EXR_VERSION; + + if (isTiled) + version |= TILED_FLAG; + + if (usesLongNames (*this)) + version |= LONG_NAMES_FLAG; + + Xdr::write (os, version); + + // + // Write all attributes. If we have a preview image attribute, + // keep track of its position in the file. + // + + Int64 previewPosition = 0; + + const Attribute *preview = + findTypedAttribute ("preview"); + + for (ConstIterator i = begin(); i != end(); ++i) + { + // + // Write the attribute's name and type. + // + + Xdr::write (os, i.name()); + Xdr::write (os, i.attribute().typeName()); + + // + // Write the size of the attribute value, + // and the value itself. + // + + StdOSStream oss; + i.attribute().writeValueTo (oss, version); + + std::string s = oss.str(); + Xdr::write (os, (int) s.length()); + + if (&i.attribute() == preview) + previewPosition = os.tellp(); + + os.write (s.data(), s.length()); + } + + // + // Write zero-length attribute name to mark the end of the header. + // + + Xdr::write (os, ""); + + return previewPosition; +} + + +void +Header::readFrom (IStream &is, int &version) +{ + // + // Read the magic number and the file format version number. + // Then check if we can read the rest of this file. + // + + int magic; + + Xdr::read (is, magic); + Xdr::read (is, version); + + if (magic != MAGIC) + { + throw Iex::InputExc ("File is not an image file."); + } + + if (getVersion (version) != EXR_VERSION) + { + THROW (Iex::InputExc, "Cannot read " + "version " << getVersion (version) << " " + "image files. Current file format version " + "is " << EXR_VERSION << "."); + } + + if (!supportsFlags (getFlags (version))) + { + THROW (Iex::InputExc, "The file format version number's flag field " + "contains unrecognized flags."); + } + + // + // Read all attributes. + // + + while (true) + { + // + // Read the name of the attribute. + // A zero-length attribute name indicates the end of the header. + // + + char name[Name::SIZE]; + Xdr::read (is, Name::MAX_LENGTH, name); + + if (name[0] == 0) + break; + + checkIsNullTerminated (name, "attribute name"); + + // + // Read the attribute type and the size of the attribute value. + // + + char typeName[Name::SIZE]; + int size; + + Xdr::read (is, Name::MAX_LENGTH, typeName); + checkIsNullTerminated (typeName, "attribute type name"); + Xdr::read (is, size); + + AttributeMap::iterator i = _map.find (name); + + if (i != _map.end()) + { + // + // The attribute already exists (for example, + // because it is a predefined attribute). + // Read the attribute's new value from the file. + // + + if (strncmp (i->second->typeName(), typeName, sizeof (typeName))) + THROW (Iex::InputExc, "Unexpected type for image attribute " + "\"" << name << "\"."); + + i->second->readValueFrom (is, size, version); + } + else + { + // + // The new attribute does not exist yet. + // If the attribute type is of a known type, + // read the attribute value. If the attribute + // is of an unknown type, read its value and + // store it as an OpaqueAttribute. + // + + Attribute *attr; + + if (Attribute::knownType (typeName)) + attr = Attribute::newAttribute (typeName); + else + attr = new OpaqueAttribute (typeName); + + try + { + attr->readValueFrom (is, size, version); + _map[name] = attr; + } + catch (...) + { + delete attr; + throw; + } + } + } +} + + +void +staticInitialize () +{ + static Mutex criticalSection; + Lock lock (criticalSection); + + static bool initialized = false; + + if (!initialized) + { + // + // One-time initialization -- register + // some predefined attribute types. + // + + Box2fAttribute::registerAttributeType(); + Box2iAttribute::registerAttributeType(); + ChannelListAttribute::registerAttributeType(); + CompressionAttribute::registerAttributeType(); + ChromaticitiesAttribute::registerAttributeType(); + DoubleAttribute::registerAttributeType(); + EnvmapAttribute::registerAttributeType(); + FloatAttribute::registerAttributeType(); + IntAttribute::registerAttributeType(); + KeyCodeAttribute::registerAttributeType(); + LineOrderAttribute::registerAttributeType(); + M33dAttribute::registerAttributeType(); + M33fAttribute::registerAttributeType(); + M44dAttribute::registerAttributeType(); + M44fAttribute::registerAttributeType(); + PreviewImageAttribute::registerAttributeType(); + RationalAttribute::registerAttributeType(); + StringAttribute::registerAttributeType(); + StringVectorAttribute::registerAttributeType(); + TileDescriptionAttribute::registerAttributeType(); + TimeCodeAttribute::registerAttributeType(); + V2dAttribute::registerAttributeType(); + V2fAttribute::registerAttributeType(); + V2iAttribute::registerAttributeType(); + V3dAttribute::registerAttributeType(); + V3fAttribute::registerAttributeType(); + V3iAttribute::registerAttributeType(); + + initialized = true; + } +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfHeader.h b/3rdparty/openexr/IlmImf/ImfHeader.h new file mode 100644 index 000000000..bec6bc175 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfHeader.h @@ -0,0 +1,627 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_HEADER_H +#define INCLUDED_IMF_HEADER_H + +//----------------------------------------------------------------------------- +// +// class Header +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include "ImathVec.h" +#include "ImathBox.h" +#include "IexBaseExc.h" +#include +#include +#include + +namespace Imf { + + +class Attribute; +class ChannelList; +class IStream; +class OStream; +class PreviewImage; + + +class Header +{ + public: + + //---------------------------------------------------------------- + // Default constructor -- the display window and the data window + // are both set to Box2i (V2i (0, 0), V2i (width-1, height-1). + //---------------------------------------------------------------- + + Header (int width = 64, + int height = 64, + float pixelAspectRatio = 1, + const Imath::V2f &screenWindowCenter = Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression = ZIP_COMPRESSION); + + + //-------------------------------------------------------------------- + // Constructor -- the data window is specified explicitly; the display + // window is set to Box2i (V2i (0, 0), V2i (width-1, height-1). + //-------------------------------------------------------------------- + + Header (int width, + int height, + const Imath::Box2i &dataWindow, + float pixelAspectRatio = 1, + const Imath::V2f &screenWindowCenter = Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression = ZIP_COMPRESSION); + + + //---------------------------------------------------------- + // Constructor -- the display window and the data window are + // both specified explicitly. + //---------------------------------------------------------- + + Header (const Imath::Box2i &displayWindow, + const Imath::Box2i &dataWindow, + float pixelAspectRatio = 1, + const Imath::V2f &screenWindowCenter = Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression = ZIP_COMPRESSION); + + + //----------------- + // Copy constructor + //----------------- + + Header (const Header &other); + + + //----------- + // Destructor + //----------- + + ~Header (); + + + //----------- + // Assignment + //----------- + + Header & operator = (const Header &other); + + + //--------------------------------------------------------------- + // Add an attribute: + // + // insert(n,attr) If no attribute with name n exists, a new + // attribute with name n, and the same type as + // attr, is added, and the value of attr is + // copied into the new attribute. + // + // If an attribute with name n exists, and its + // type is the same as attr, the value of attr + // is copied into this attribute. + // + // If an attribute with name n exists, and its + // type is different from attr, an Iex::TypeExc + // is thrown. + // + //--------------------------------------------------------------- + + void insert (const char name[], + const Attribute &attribute); + + void insert (const std::string &name, + const Attribute &attribute); + + //------------------------------------------------------------------ + // Access to existing attributes: + // + // [n] Returns a reference to the attribute + // with name n. If no attribute with + // name n exists, an Iex::ArgExc is thrown. + // + // typedAttribute(n) Returns a reference to the attribute + // with name n and type T. If no attribute + // with name n exists, an Iex::ArgExc is + // thrown. If an attribute with name n + // exists, but its type is not T, an + // Iex::TypeExc is thrown. + // + // findTypedAttribute(n) Returns a pointer to the attribute with + // name n and type T, or 0 if no attribute + // with name n and type T exists. + // + //------------------------------------------------------------------ + + Attribute & operator [] (const char name[]); + const Attribute & operator [] (const char name[]) const; + + Attribute & operator [] (const std::string &name); + const Attribute & operator [] (const std::string &name) const; + + template T& typedAttribute (const char name[]); + template const T& typedAttribute (const char name[]) const; + + template T& typedAttribute (const std::string &name); + template const T& typedAttribute (const std::string &name) const; + + template T* findTypedAttribute (const char name[]); + template const T* findTypedAttribute (const char name[]) const; + + template T* findTypedAttribute (const std::string &name); + template const T* findTypedAttribute (const std::string &name) + const; + + //--------------------------------------------- + // Iterator-style access to existing attributes + //--------------------------------------------- + + typedef std::map AttributeMap; + + class Iterator; + class ConstIterator; + + Iterator begin (); + ConstIterator begin () const; + + Iterator end (); + ConstIterator end () const; + + Iterator find (const char name[]); + ConstIterator find (const char name[]) const; + + Iterator find (const std::string &name); + ConstIterator find (const std::string &name) const; + + + //-------------------------------- + // Access to predefined attributes + //-------------------------------- + + Imath::Box2i & displayWindow (); + const Imath::Box2i & displayWindow () const; + + Imath::Box2i & dataWindow (); + const Imath::Box2i & dataWindow () const; + + float & pixelAspectRatio (); + const float & pixelAspectRatio () const; + + Imath::V2f & screenWindowCenter (); + const Imath::V2f & screenWindowCenter () const; + + float & screenWindowWidth (); + const float & screenWindowWidth () const; + + ChannelList & channels (); + const ChannelList & channels () const; + + LineOrder & lineOrder (); + const LineOrder & lineOrder () const; + + Compression & compression (); + const Compression & compression () const; + + + //---------------------------------------------------------------------- + // Tile Description: + // + // The tile description is a TileDescriptionAttribute whose name + // is "tiles". The "tiles" attribute must be present in any tiled + // image file. When present, it describes various properties of the + // tiles that make up the file. + // + // Convenience functions: + // + // setTileDescription(td) + // calls insert ("tiles", TileDescriptionAttribute (td)) + // + // tileDescription() + // returns typedAttribute("tiles").value() + // + // hasTileDescription() + // return findTypedAttribute("tiles") != 0 + // + //---------------------------------------------------------------------- + + void setTileDescription (const TileDescription & td); + + TileDescription & tileDescription (); + const TileDescription & tileDescription () const; + + bool hasTileDescription() const; + + + //---------------------------------------------------------------------- + // Preview image: + // + // The preview image is a PreviewImageAttribute whose name is "preview". + // This attribute is special -- while an image file is being written, + // the pixels of the preview image can be changed repeatedly by calling + // OutputFile::updatePreviewImage(). + // + // Convenience functions: + // + // setPreviewImage(p) + // calls insert ("preview", PreviewImageAttribute (p)) + // + // previewImage() + // returns typedAttribute("preview").value() + // + // hasPreviewImage() + // return findTypedAttribute("preview") != 0 + // + //---------------------------------------------------------------------- + + void setPreviewImage (const PreviewImage &p); + + PreviewImage & previewImage (); + const PreviewImage & previewImage () const; + + bool hasPreviewImage () const; + + + //------------------------------------------------------------- + // Sanity check -- examines the header, and throws an exception + // if it finds something wrong (empty display window, negative + // pixel aspect ratio, unknown compression sceme etc.) + // + // set isTiled to true if you are checking a tiled/multi-res + // header + //------------------------------------------------------------- + + void sanityCheck (bool isTiled = false) const; + + + //---------------------------------------------------------------- + // Maximum image size and maximim tile size: + // + // sanityCheck() will throw an exception if the width or height of + // the data window exceeds the maximum image width or height, or + // if the size of a tile exceeds the maximum tile width or height. + // + // At program startup the maximum image and tile width and height + // are set to zero, meaning that width and height are unlimited. + // + // Limiting image and tile width and height limits how much memory + // will be allocated when a file is opened. This can help protect + // applications from running out of memory while trying to read + // a damaged image file. + //---------------------------------------------------------------- + + static void setMaxImageSize (int maxWidth, int maxHeight); + static void setMaxTileSize (int maxWidth, int maxHeight); + + + //------------------------------------------------------------------ + // Input and output: + // + // If the header contains a preview image attribute, then writeTo() + // returns the position of that attribute in the output stream; this + // information is used by OutputFile::updatePreviewImage(). + // If the header contains no preview image attribute, then writeTo() + // returns 0. + //------------------------------------------------------------------ + + + Int64 writeTo (OStream &os, + bool isTiled = false) const; + + void readFrom (IStream &is, int &version); + + private: + + AttributeMap _map; +}; + + +//---------- +// Iterators +//---------- + +class Header::Iterator +{ + public: + + Iterator (); + Iterator (const Header::AttributeMap::iterator &i); + + Iterator & operator ++ (); + Iterator operator ++ (int); + + const char * name () const; + Attribute & attribute () const; + + private: + + friend class Header::ConstIterator; + + Header::AttributeMap::iterator _i; +}; + + +class Header::ConstIterator +{ + public: + + ConstIterator (); + ConstIterator (const Header::AttributeMap::const_iterator &i); + ConstIterator (const Header::Iterator &other); + + ConstIterator & operator ++ (); + ConstIterator operator ++ (int); + + const char * name () const; + const Attribute & attribute () const; + + private: + + friend bool operator == (const ConstIterator &, const ConstIterator &); + friend bool operator != (const ConstIterator &, const ConstIterator &); + + Header::AttributeMap::const_iterator _i; +}; + + +//------------------------------------------------------------------------ +// Library initialization: +// +// In a multithreaded program, staticInitialize() must be called once +// during startup, before the program accesses any other functions or +// classes in the IlmImf library. Calling staticInitialize() in this +// way avoids races during initialization of the library's global +// variables. +// +// Single-threaded programs are not required to call staticInitialize(); +// initialization of the library's global variables happens automatically. +// +//------------------------------------------------------------------------ + +void staticInitialize (); + + +//----------------- +// Inline Functions +//----------------- + + +inline +Header::Iterator::Iterator (): _i() +{ + // empty +} + + +inline +Header::Iterator::Iterator (const Header::AttributeMap::iterator &i): _i (i) +{ + // empty +} + + +inline Header::Iterator & +Header::Iterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline Header::Iterator +Header::Iterator::operator ++ (int) +{ + Iterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +Header::Iterator::name () const +{ + return *_i->first; +} + + +inline Attribute & +Header::Iterator::attribute () const +{ + return *_i->second; +} + + +inline +Header::ConstIterator::ConstIterator (): _i() +{ + // empty +} + +inline +Header::ConstIterator::ConstIterator + (const Header::AttributeMap::const_iterator &i): _i (i) +{ + // empty +} + + +inline +Header::ConstIterator::ConstIterator (const Header::Iterator &other): + _i (other._i) +{ + // empty +} + +inline Header::ConstIterator & +Header::ConstIterator::operator ++ () +{ + ++_i; + return *this; +} + + +inline Header::ConstIterator +Header::ConstIterator::operator ++ (int) +{ + ConstIterator tmp = *this; + ++_i; + return tmp; +} + + +inline const char * +Header::ConstIterator::name () const +{ + return *_i->first; +} + + +inline const Attribute & +Header::ConstIterator::attribute () const +{ + return *_i->second; +} + + +inline bool +operator == (const Header::ConstIterator &x, const Header::ConstIterator &y) +{ + return x._i == y._i; +} + + +inline bool +operator != (const Header::ConstIterator &x, const Header::ConstIterator &y) +{ + return !(x == y); +} + + +//--------------------- +// Template definitions +//--------------------- + +template +T & +Header::typedAttribute (const char name[]) +{ + Attribute *attr = &(*this)[name]; + T *tattr = dynamic_cast (attr); + + if (tattr == 0) + throw Iex::TypeExc ("Unexpected attribute type."); + + return *tattr; +} + + +template +const T & +Header::typedAttribute (const char name[]) const +{ + const Attribute *attr = &(*this)[name]; + const T *tattr = dynamic_cast (attr); + + if (tattr == 0) + throw Iex::TypeExc ("Unexpected attribute type."); + + return *tattr; +} + + +template +T & +Header::typedAttribute (const std::string &name) +{ + return typedAttribute (name.c_str()); +} + + +template +const T & +Header::typedAttribute (const std::string &name) const +{ + return typedAttribute (name.c_str()); +} + + +template +T * +Header::findTypedAttribute (const char name[]) +{ + AttributeMap::iterator i = _map.find (name); + return (i == _map.end())? 0: dynamic_cast (i->second); +} + + +template +const T * +Header::findTypedAttribute (const char name[]) const +{ + AttributeMap::const_iterator i = _map.find (name); + return (i == _map.end())? 0: dynamic_cast (i->second); +} + + +template +T * +Header::findTypedAttribute (const std::string &name) +{ + return findTypedAttribute (name.c_str()); +} + + +template +const T * +Header::findTypedAttribute (const std::string &name) const +{ + return findTypedAttribute (name.c_str()); +} + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfHuf.cpp b/3rdparty/openexr/IlmImf/ImfHuf.cpp new file mode 100644 index 000000000..0de7d345e --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfHuf.cpp @@ -0,0 +1,1086 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +//----------------------------------------------------------------------------- +// +// 16-bit Huffman compression and decompression. +// +// The source code in this file is derived from the 8-bit +// Huffman compression and decompression routines written +// by Christian Rouet for his PIZ image file format. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "Iex.h" +#include +#include +#include + + +using namespace std; +using namespace Iex; + +namespace Imf { +namespace { + + +const int HUF_ENCBITS = 16; // literal (value) bit length +const int HUF_DECBITS = 14; // decoding bit size (>= 8) + +const int HUF_ENCSIZE = (1 << HUF_ENCBITS) + 1; // encoding table size +const int HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size +const int HUF_DECMASK = HUF_DECSIZE - 1; + + +struct HufDec +{ // short code long code + //------------------------------- + int len:8; // code length 0 + int lit:24; // lit p size + int * p; // 0 lits +}; + + +void +invalidNBits () +{ + throw InputExc ("Error in header for Huffman-encoded data " + "(invalid number of bits)."); +} + + +void +tooMuchData () +{ + throw InputExc ("Error in Huffman-encoded data " + "(decoded data are longer than expected)."); +} + + +void +notEnoughData () +{ + throw InputExc ("Error in Huffman-encoded data " + "(decoded data are shorter than expected)."); +} + + +void +invalidCode () +{ + throw InputExc ("Error in Huffman-encoded data " + "(invalid code)."); +} + + +void +invalidTableSize () +{ + throw InputExc ("Error in Huffman-encoded data " + "(invalid code table size)."); +} + + +void +unexpectedEndOfTable () +{ + throw InputExc ("Error in Huffman-encoded data " + "(unexpected end of code table data)."); +} + + +void +tableTooLong () +{ + throw InputExc ("Error in Huffman-encoded data " + "(code table is longer than expected)."); +} + + +void +invalidTableEntry () +{ + throw InputExc ("Error in Huffman-encoded data " + "(invalid code table entry)."); +} + + +inline Int64 +hufLength (Int64 code) +{ + return code & 63; +} + + +inline Int64 +hufCode (Int64 code) +{ + return code >> 6; +} + + +inline void +outputBits (int nBits, Int64 bits, Int64 &c, int &lc, char *&out) +{ + c <<= nBits; + lc += nBits; + + c |= bits; + + while (lc >= 8) + *out++ = (c >> (lc -= 8)); +} + + +inline Int64 +getBits (int nBits, Int64 &c, int &lc, const char *&in) +{ + while (lc < nBits) + { + c = (c << 8) | *(unsigned char *)(in++); + lc += 8; + } + + lc -= nBits; + return (c >> lc) & ((1 << nBits) - 1); +} + + +// +// ENCODING TABLE BUILDING & (UN)PACKING +// + +// +// Build a "canonical" Huffman code table: +// - for each (uncompressed) symbol, hcode contains the length +// of the corresponding code (in the compressed data) +// - canonical codes are computed and stored in hcode +// - the rules for constructing canonical codes are as follows: +// * shorter codes (if filled with zeroes to the right) +// have a numerically higher value than longer codes +// * for codes with the same length, numerical values +// increase with numerical symbol values +// - because the canonical code table can be constructed from +// symbol lengths alone, the code table can be transmitted +// without sending the actual code values +// - see http://www.compressconsult.com/huffman/ +// + +void +hufCanonicalCodeTable (Int64 hcode[HUF_ENCSIZE]) +{ + Int64 n[59]; + + // + // For each i from 0 through 58, count the + // number of different codes of length i, and + // store the count in n[i]. + // + + for (int i = 0; i <= 58; ++i) + n[i] = 0; + + for (int i = 0; i < HUF_ENCSIZE; ++i) + n[hcode[i]] += 1; + + // + // For each i from 58 through 1, compute the + // numerically lowest code with length i, and + // store that code in n[i]. + // + + Int64 c = 0; + + for (int i = 58; i > 0; --i) + { + Int64 nc = ((c + n[i]) >> 1); + n[i] = c; + c = nc; + } + + // + // hcode[i] contains the length, l, of the + // code for symbol i. Assign the next available + // code of length l to the symbol and store both + // l and the code in hcode[i]. + // + + for (int i = 0; i < HUF_ENCSIZE; ++i) + { + int l = hcode[i]; + + if (l > 0) + hcode[i] = l | (n[l]++ << 6); + } +} + + +// +// Compute Huffman codes (based on frq input) and store them in frq: +// - code structure is : [63:lsb - 6:msb] | [5-0: bit length]; +// - max code length is 58 bits; +// - codes outside the range [im-iM] have a null length (unused values); +// - original frequencies are destroyed; +// - encoding tables are used by hufEncode() and hufBuildDecTable(); +// + + +struct FHeapCompare +{ + bool operator () (Int64 *a, Int64 *b) {return *a > *b;} +}; + + +void +hufBuildEncTable + (Int64* frq, // io: input frequencies [HUF_ENCSIZE], output table + int* im, // o: min frq index + int* iM) // o: max frq index +{ + // + // This function assumes that when it is called, array frq + // indicates the frequency of all possible symbols in the data + // that are to be Huffman-encoded. (frq[i] contains the number + // of occurrences of symbol i in the data.) + // + // The loop below does three things: + // + // 1) Finds the minimum and maximum indices that point + // to non-zero entries in frq: + // + // frq[im] != 0, and frq[i] == 0 for all i < im + // frq[iM] != 0, and frq[i] == 0 for all i > iM + // + // 2) Fills array fHeap with pointers to all non-zero + // entries in frq. + // + // 3) Initializes array hlink such that hlink[i] == i + // for all array entries. + // + + AutoArray hlink; + AutoArray fHeap; + + *im = 0; + + while (!frq[*im]) + (*im)++; + + int nf = 0; + + for (int i = *im; i < HUF_ENCSIZE; i++) + { + hlink[i] = i; + + if (frq[i]) + { + fHeap[nf] = &frq[i]; + nf++; + *iM = i; + } + } + + // + // Add a pseudo-symbol, with a frequency count of 1, to frq; + // adjust the fHeap and hlink array accordingly. Function + // hufEncode() uses the pseudo-symbol for run-length encoding. + // + + (*iM)++; + frq[*iM] = 1; + fHeap[nf] = &frq[*iM]; + nf++; + + // + // Build an array, scode, such that scode[i] contains the number + // of bits assigned to symbol i. Conceptually this is done by + // constructing a tree whose leaves are the symbols with non-zero + // frequency: + // + // Make a heap that contains all symbols with a non-zero frequency, + // with the least frequent symbol on top. + // + // Repeat until only one symbol is left on the heap: + // + // Take the two least frequent symbols off the top of the heap. + // Create a new node that has first two nodes as children, and + // whose frequency is the sum of the frequencies of the first + // two nodes. Put the new node back into the heap. + // + // The last node left on the heap is the root of the tree. For each + // leaf node, the distance between the root and the leaf is the length + // of the code for the corresponding symbol. + // + // The loop below doesn't actually build the tree; instead we compute + // the distances of the leaves from the root on the fly. When a new + // node is added to the heap, then that node's descendants are linked + // into a single linear list that starts at the new node, and the code + // lengths of the descendants (that is, their distance from the root + // of the tree) are incremented by one. + // + + make_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + + AutoArray scode; + memset (scode, 0, sizeof (Int64) * HUF_ENCSIZE); + + while (nf > 1) + { + // + // Find the indices, mm and m, of the two smallest non-zero frq + // values in fHeap, add the smallest frq to the second-smallest + // frq, and remove the smallest frq value from fHeap. + // + + int mm = fHeap[0] - frq; + pop_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + --nf; + + int m = fHeap[0] - frq; + pop_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + + frq[m ] += frq[mm]; + push_heap (&fHeap[0], &fHeap[nf], FHeapCompare()); + + // + // The entries in scode are linked into lists with the + // entries in hlink serving as "next" pointers and with + // the end of a list marked by hlink[j] == j. + // + // Traverse the lists that start at scode[m] and scode[mm]. + // For each element visited, increment the length of the + // corresponding code by one bit. (If we visit scode[j] + // during the traversal, then the code for symbol j becomes + // one bit longer.) + // + // Merge the lists that start at scode[m] and scode[mm] + // into a single list that starts at scode[m]. + // + + // + // Add a bit to all codes in the first list. + // + + for (int j = m; true; j = hlink[j]) + { + scode[j]++; + + assert (scode[j] <= 58); + + if (hlink[j] == j) + { + // + // Merge the two lists. + // + + hlink[j] = mm; + break; + } + } + + // + // Add a bit to all codes in the second list + // + + for (int j = mm; true; j = hlink[j]) + { + scode[j]++; + + assert (scode[j] <= 58); + + if (hlink[j] == j) + break; + } + } + + // + // Build a canonical Huffman code table, replacing the code + // lengths in scode with (code, code length) pairs. Copy the + // code table from scode into frq. + // + + hufCanonicalCodeTable (scode); + memcpy (frq, scode, sizeof (Int64) * HUF_ENCSIZE); +} + + +// +// Pack an encoding table: +// - only code lengths, not actual codes, are stored +// - runs of zeroes are compressed as follows: +// +// unpacked packed +// -------------------------------- +// 1 zero 0 (6 bits) +// 2 zeroes 59 +// 3 zeroes 60 +// 4 zeroes 61 +// 5 zeroes 62 +// n zeroes (6 or more) 63 n-6 (6 + 8 bits) +// + +const int SHORT_ZEROCODE_RUN = 59; +const int LONG_ZEROCODE_RUN = 63; +const int SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN; +const int LONGEST_LONG_RUN = 255 + SHORTEST_LONG_RUN; + + +void +hufPackEncTable + (const Int64* hcode, // i : encoding table [HUF_ENCSIZE] + int im, // i : min hcode index + int iM, // i : max hcode index + char** pcode) // o: ptr to packed table (updated) +{ + char *p = *pcode; + Int64 c = 0; + int lc = 0; + + for (; im <= iM; im++) + { + int l = hufLength (hcode[im]); + + if (l == 0) + { + int zerun = 1; + + while ((im < iM) && (zerun < LONGEST_LONG_RUN)) + { + if (hufLength (hcode[im+1]) > 0 ) + break; + im++; + zerun++; + } + + if (zerun >= 2) + { + if (zerun >= SHORTEST_LONG_RUN) + { + outputBits (6, LONG_ZEROCODE_RUN, c, lc, p); + outputBits (8, zerun - SHORTEST_LONG_RUN, c, lc, p); + } + else + { + outputBits (6, SHORT_ZEROCODE_RUN + zerun - 2, c, lc, p); + } + continue; + } + } + + outputBits (6, l, c, lc, p); + } + + if (lc > 0) + *p++ = (unsigned char) (c << (8 - lc)); + + *pcode = p; +} + + +// +// Unpack an encoding table packed by hufPackEncTable(): +// + +void +hufUnpackEncTable + (const char** pcode, // io: ptr to packed table (updated) + int ni, // i : input size (in bytes) + int im, // i : min hcode index + int iM, // i : max hcode index + Int64* hcode) // o: encoding table [HUF_ENCSIZE] +{ + memset (hcode, 0, sizeof (Int64) * HUF_ENCSIZE); + + const char *p = *pcode; + Int64 c = 0; + int lc = 0; + + for (; im <= iM; im++) + { + if (p - *pcode > ni) + unexpectedEndOfTable(); + + Int64 l = hcode[im] = getBits (6, c, lc, p); // code length + + if (l == (Int64) LONG_ZEROCODE_RUN) + { + if (p - *pcode > ni) + unexpectedEndOfTable(); + + int zerun = getBits (8, c, lc, p) + SHORTEST_LONG_RUN; + + if (im + zerun > iM + 1) + tableTooLong(); + + while (zerun--) + hcode[im++] = 0; + + im--; + } + else if (l >= (Int64) SHORT_ZEROCODE_RUN) + { + int zerun = l - SHORT_ZEROCODE_RUN + 2; + + if (im + zerun > iM + 1) + tableTooLong(); + + while (zerun--) + hcode[im++] = 0; + + im--; + } + } + + *pcode = (char *) p; + + hufCanonicalCodeTable (hcode); +} + + +// +// DECODING TABLE BUILDING +// + +// +// Clear a newly allocated decoding table so that it contains only zeroes. +// + +void +hufClearDecTable + (HufDec * hdecod) // io: (allocated by caller) + // decoding table [HUF_DECSIZE] +{ + memset (hdecod, 0, sizeof (HufDec) * HUF_DECSIZE); +} + + +// +// Build a decoding hash table based on the encoding table hcode: +// - short codes (<= HUF_DECBITS) are resolved with a single table access; +// - long code entry allocations are not optimized, because long codes are +// unfrequent; +// - decoding tables are used by hufDecode(); +// + +void +hufBuildDecTable + (const Int64* hcode, // i : encoding table + int im, // i : min index in hcode + int iM, // i : max index in hcode + HufDec * hdecod) // o: (allocated by caller) + // decoding table [HUF_DECSIZE] +{ + // + // Init hashtable & loop on all codes. + // Assumes that hufClearDecTable(hdecod) has already been called. + // + + for (; im <= iM; im++) + { + Int64 c = hufCode (hcode[im]); + int l = hufLength (hcode[im]); + + if (c >> l) + { + // + // Error: c is supposed to be an l-bit code, + // but c contains a value that is greater + // than the largest l-bit number. + // + + invalidTableEntry(); + } + + if (l > HUF_DECBITS) + { + // + // Long code: add a secondary entry + // + + HufDec *pl = hdecod + (c >> (l - HUF_DECBITS)); + + if (pl->len) + { + // + // Error: a short code has already + // been stored in table entry *pl. + // + + invalidTableEntry(); + } + + pl->lit++; + + if (pl->p) + { + int *p = pl->p; + pl->p = new int [pl->lit]; + + for (int i = 0; i < pl->lit - 1; ++i) + pl->p[i] = p[i]; + + delete [] p; + } + else + { + pl->p = new int [1]; + } + + pl->p[pl->lit - 1]= im; + } + else if (l) + { + // + // Short code: init all primary entries + // + + HufDec *pl = hdecod + (c << (HUF_DECBITS - l)); + + for (Int64 i = 1 << (HUF_DECBITS - l); i > 0; i--, pl++) + { + if (pl->len || pl->p) + { + // + // Error: a short code or a long code has + // already been stored in table entry *pl. + // + + invalidTableEntry(); + } + + pl->len = l; + pl->lit = im; + } + } + } +} + + +// +// Free the long code entries of a decoding table built by hufBuildDecTable() +// + +void +hufFreeDecTable (HufDec *hdecod) // io: Decoding table +{ + for (int i = 0; i < HUF_DECSIZE; i++) + { + if (hdecod[i].p) + { + delete [] hdecod[i].p; + hdecod[i].p = 0; + } + } +} + + +// +// ENCODING +// + +inline void +outputCode (Int64 code, Int64 &c, int &lc, char *&out) +{ + outputBits (hufLength (code), hufCode (code), c, lc, out); +} + + +inline void +sendCode (Int64 sCode, int runCount, Int64 runCode, + Int64 &c, int &lc, char *&out) +{ + static const int RLMIN = 32; // min count to activate run-length coding + + if (runCount > RLMIN) + { + outputCode (sCode, c, lc, out); + outputCode (runCode, c, lc, out); + outputBits (8, runCount, c, lc, out); + } + else + { + while (runCount-- >= 0) + outputCode (sCode, c, lc, out); + } +} + + +// +// Encode (compress) ni values based on the Huffman encoding table hcode: +// + +int +hufEncode // return: output size (in bits) + (const Int64* hcode, // i : encoding table + const unsigned short* in, // i : uncompressed input buffer + const int ni, // i : input buffer size (in bytes) + int rlc, // i : rl code + char* out) // o: compressed output buffer +{ + char *outStart = out; + Int64 c = 0; // bits not yet written to out + int lc = 0; // number of valid bits in c (LSB) + int s = in[0]; + int cs = 0; + + // + // Loop on input values + // + + for (int i = 1; i < ni; i++) + { + // + // Count same values or send code + // + + if (s == in[i] && cs < 255) + { + cs++; + } + else + { + sendCode (hcode[s], cs, hcode[rlc], c, lc, out); + cs=0; + } + + s = in[i]; + } + + // + // Send remaining code + // + + sendCode (hcode[s], cs, hcode[rlc], c, lc, out); + + if (lc) + *out = (c << (8 - lc)) & 0xff; + + return (out - outStart) * 8 + lc; +} + + +// +// DECODING +// + +// +// In order to force the compiler to inline them, +// getChar() and getCode() are implemented as macros +// instead of "inline" functions. +// + +#define getChar(c, lc, in) \ +{ \ + c = (c << 8) | *(unsigned char *)(in++); \ + lc += 8; \ +} + + +#define getCode(po, rlc, c, lc, in, out, oe) \ +{ \ + if (po == rlc) \ + { \ + if (lc < 8) \ + getChar(c, lc, in); \ + \ + lc -= 8; \ + \ + unsigned char cs = (c >> lc); \ + \ + if (out + cs > oe) \ + tooMuchData(); \ + \ + unsigned short s = out[-1]; \ + \ + while (cs-- > 0) \ + *out++ = s; \ + } \ + else if (out < oe) \ + { \ + *out++ = po; \ + } \ + else \ + { \ + tooMuchData(); \ + } \ +} + + +// +// Decode (uncompress) ni bits based on encoding & decoding tables: +// + +void +hufDecode + (const Int64 * hcode, // i : encoding table + const HufDec * hdecod, // i : decoding table + const char* in, // i : compressed input buffer + int ni, // i : input size (in bits) + int rlc, // i : run-length code + int no, // i : expected output size (in bytes) + unsigned short* out) // o: uncompressed output buffer +{ + Int64 c = 0; + int lc = 0; + unsigned short * outb = out; + unsigned short * oe = out + no; + const char * ie = in + (ni + 7) / 8; // input byte size + + // + // Loop on input bytes + // + + while (in < ie) + { + getChar (c, lc, in); + + // + // Access decoding table + // + + while (lc >= HUF_DECBITS) + { + const HufDec pl = hdecod[(c >> (lc-HUF_DECBITS)) & HUF_DECMASK]; + + if (pl.len) + { + // + // Get short code + // + + lc -= pl.len; + getCode (pl.lit, rlc, c, lc, in, out, oe); + } + else + { + if (!pl.p) + invalidCode(); // wrong code + + // + // Search long code + // + + int j; + + for (j = 0; j < pl.lit; j++) + { + int l = hufLength (hcode[pl.p[j]]); + + while (lc < l && in < ie) // get more bits + getChar (c, lc, in); + + if (lc >= l) + { + if (hufCode (hcode[pl.p[j]]) == + ((c >> (lc - l)) & ((Int64(1) << l) - 1))) + { + // + // Found : get long code + // + + lc -= l; + getCode (pl.p[j], rlc, c, lc, in, out, oe); + break; + } + } + } + + if (j == pl.lit) + invalidCode(); // Not found + } + } + } + + // + // Get remaining (short) codes + // + + int i = (8 - ni) & 7; + c >>= i; + lc -= i; + + while (lc > 0) + { + const HufDec pl = hdecod[(c << (HUF_DECBITS - lc)) & HUF_DECMASK]; + + if (pl.len) + { + lc -= pl.len; + getCode (pl.lit, rlc, c, lc, in, out, oe); + } + else + { + invalidCode(); // wrong (long) code + } + } + + if (out - outb != no) + notEnoughData (); +} + + +void +countFrequencies (Int64 freq[HUF_ENCSIZE], + const unsigned short data[/*n*/], + int n) +{ + for (int i = 0; i < HUF_ENCSIZE; ++i) + freq[i] = 0; + + for (int i = 0; i < n; ++i) + ++freq[data[i]]; +} + + +void +writeUInt (char buf[4], unsigned int i) +{ + unsigned char *b = (unsigned char *) buf; + + b[0] = i; + b[1] = i >> 8; + b[2] = i >> 16; + b[3] = i >> 24; +} + + +unsigned int +readUInt (const char buf[4]) +{ + const unsigned char *b = (const unsigned char *) buf; + + return ( b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + ((b[3] << 24) & 0xff000000); +} + +} // namespace + + +// +// EXTERNAL INTERFACE +// + + +int +hufCompress (const unsigned short raw[], + int nRaw, + char compressed[]) +{ + if (nRaw == 0) + return 0; + + AutoArray freq; + + countFrequencies (freq, raw, nRaw); + + int im, iM; + hufBuildEncTable (freq, &im, &iM); + + char *tableStart = compressed + 20; + char *tableEnd = tableStart; + hufPackEncTable (freq, im, iM, &tableEnd); + int tableLength = tableEnd - tableStart; + + char *dataStart = tableEnd; + int nBits = hufEncode (freq, raw, nRaw, iM, dataStart); + int dataLength = (nBits + 7) / 8; + + writeUInt (compressed, im); + writeUInt (compressed + 4, iM); + writeUInt (compressed + 8, tableLength); + writeUInt (compressed + 12, nBits); + writeUInt (compressed + 16, 0); // room for future extensions + + return dataStart + dataLength - compressed; +} + + +void +hufUncompress (const char compressed[], + int nCompressed, + unsigned short raw[], + int nRaw) +{ + if (nCompressed == 0) + { + if (nRaw != 0) + notEnoughData(); + + return; + } + + int im = readUInt (compressed); + int iM = readUInt (compressed + 4); + // int tableLength = readUInt (compressed + 8); + int nBits = readUInt (compressed + 12); + + if (im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE) + invalidTableSize(); + + const char *ptr = compressed + 20; + + AutoArray freq; + AutoArray hdec; + + hufClearDecTable (hdec); + + hufUnpackEncTable (&ptr, nCompressed - (ptr - compressed), im, iM, freq); + + try + { + if (nBits > 8 * (nCompressed - (ptr - compressed))) + invalidNBits(); + + hufBuildDecTable (freq, im, iM, hdec); + hufDecode (freq, hdec, ptr, nBits, iM, nRaw, raw); + } + catch (...) + { + hufFreeDecTable (hdec); + throw; + } + + hufFreeDecTable (hdec); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfHuf.h b/3rdparty/openexr/IlmImf/ImfHuf.h new file mode 100644 index 000000000..5134dfdc7 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfHuf.h @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_HUF_H +#define INCLUDED_IMF_HUF_H + + +//----------------------------------------------------------------------------- +// +// 16-bit Huffman compression and decompression: +// +// hufCompress (r, nr, c) +// +// Compresses the contents of array r (of length nr), +// stores the compressed data in array c, and returns +// the size of the compressed data (in bytes). +// +// To avoid buffer overflows, the size of array c should +// be at least 2 * nr + 65536. +// +// hufUncompress (c, nc, r, nr) +// +// Uncompresses the data in array c (with length nc), +// and stores the results in array r (with length nr). +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +int +hufCompress (const unsigned short raw[/*nRaw*/], + int nRaw, + char compressed[/*2 * nRaw + 65536*/]); + + +void +hufUncompress (const char compressed[/*nCompressed*/], + int nCompressed, + unsigned short raw[/*nRaw*/], + int nRaw); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfIO.cpp b/3rdparty/openexr/IlmImf/ImfIO.cpp new file mode 100644 index 000000000..711cdbb5f --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfIO.cpp @@ -0,0 +1,109 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR. +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" + +namespace Imf { + + +IStream::IStream (const char fileName[]): _fileName (fileName) +{ + // empty +} + + +IStream::~IStream () +{ + // empty +} + + +bool +IStream::isMemoryMapped () const +{ + return false; +} + + +char * +IStream::readMemoryMapped (int n) +{ + throw Iex::InputExc ("Attempt to perform a memory-mapped read " + "on a file that is not memory mapped."); + return 0; +} + + +void +IStream::clear () +{ + // empty +} + + +const char * +IStream::fileName () const +{ + return _fileName.c_str(); +} + + +OStream::OStream (const char fileName[]): _fileName (fileName) +{ + // empty +} + + +OStream::~OStream () +{ + // empty +} + + +const char * +OStream::fileName () const +{ + return _fileName.c_str(); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfIO.h b/3rdparty/openexr/IlmImf/ImfIO.h new file mode 100644 index 000000000..44f51a304 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfIO.h @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_IO_H +#define INCLUDED_IMF_IO_H + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR. +// +//----------------------------------------------------------------------------- + +#include +#include + +namespace Imf { + +//----------------------------------------------------------- +// class IStream -- an abstract base class for input streams. +//----------------------------------------------------------- + +class IStream +{ + public: + + //----------- + // Destructor + //----------- + + virtual ~IStream (); + + + //------------------------------------------------- + // Does this input stream support memory-mapped IO? + // + // Memory-mapped streams can avoid an extra copy; + // memory-mapped read operations return a pointer + // to an internal buffer instead of copying data + // into a buffer supplied by the caller. + //------------------------------------------------- + + virtual bool isMemoryMapped () const; + + + //------------------------------------------------------ + // Read from the stream: + // + // read(c,n) reads n bytes from the stream, and stores + // them in array c. If the stream contains less than n + // bytes, or if an I/O error occurs, read(c,n) throws + // an exception. If read(c,n) reads the last byte from + // the file it returns false, otherwise it returns true. + //------------------------------------------------------ + + virtual bool read (char c[/*n*/], int n) = 0; + + + //--------------------------------------------------- + // Read from a memory-mapped stream: + // + // readMemoryMapped(n) reads n bytes from the stream + // and returns a pointer to the first byte. The + // returned pointer remains valid until the stream + // is closed. If there are less than n byte left to + // read in the stream or if the stream is not memory- + // mapped, readMemoryMapped(n) throws an exception. + //--------------------------------------------------- + + virtual char * readMemoryMapped (int n); + + + //-------------------------------------------------------- + // Get the current reading position, in bytes from the + // beginning of the file. If the next call to read() will + // read the first byte in the file, tellg() returns 0. + //-------------------------------------------------------- + + virtual Int64 tellg () = 0; + + + //------------------------------------------- + // Set the current reading position. + // After calling seekg(i), tellg() returns i. + //------------------------------------------- + + virtual void seekg (Int64 pos) = 0; + + + //------------------------------------------------------ + // Clear error conditions after an operation has failed. + //------------------------------------------------------ + + virtual void clear (); + + + //------------------------------------------------------ + // Get the name of the file associated with this stream. + //------------------------------------------------------ + + const char * fileName () const; + + protected: + + IStream (const char fileName[]); + + private: + + IStream (const IStream &); // not implemented + IStream & operator = (const IStream &); // not implemented + + std::string _fileName; +}; + + +//----------------------------------------------------------- +// class OStream -- an abstract base class for output streams +//----------------------------------------------------------- + +class OStream +{ + public: + + //----------- + // Destructor + //----------- + + virtual ~OStream (); + + + //---------------------------------------------------------- + // Write to the stream: + // + // write(c,n) takes n bytes from array c, and stores them + // in the stream. If an I/O error occurs, write(c,n) throws + // an exception. + //---------------------------------------------------------- + + virtual void write (const char c[/*n*/], int n) = 0; + + + //--------------------------------------------------------- + // Get the current writing position, in bytes from the + // beginning of the file. If the next call to write() will + // start writing at the beginning of the file, tellp() + // returns 0. + //--------------------------------------------------------- + + virtual Int64 tellp () = 0; + + + //------------------------------------------- + // Set the current writing position. + // After calling seekp(i), tellp() returns i. + //------------------------------------------- + + virtual void seekp (Int64 pos) = 0; + + + //------------------------------------------------------ + // Get the name of the file associated with this stream. + //------------------------------------------------------ + + const char * fileName () const; + + protected: + + OStream (const char fileName[]); + + private: + + OStream (const OStream &); // not implemented + OStream & operator = (const OStream &); // not implemented + + std::string _fileName; +}; + + +//----------------------- +// Helper classes for Xdr +//----------------------- + +struct StreamIO +{ + static void + writeChars (OStream &os, const char c[/*n*/], int n) + { + os.write (c, n); + } + + static bool + readChars (IStream &is, char c[/*n*/], int n) + { + return is.read (c, n); + } +}; + + +struct CharPtrIO +{ + static void + writeChars (char *&op, const char c[/*n*/], int n) + { + while (n--) + *op++ = *c++; + } + + static bool + readChars (const char *&ip, char c[/*n*/], int n) + { + while (n--) + *c++ = *ip++; + + return true; + } +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfInputFile.cpp b/3rdparty/openexr/IlmImf/ImfInputFile.cpp new file mode 100644 index 000000000..e8b6425f3 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfInputFile.cpp @@ -0,0 +1,648 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class InputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include "ImathFun.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include "half.h" +#include +#include + + +namespace Imf { + + +using Imath::Box2i; +using Imath::divp; +using Imath::modp; +using IlmThread::Mutex; +using IlmThread::Lock; + + +// +// Struct InputFile::Data stores things that will be +// needed between calls to readPixels +// + +struct InputFile::Data: public Mutex +{ + Header header; + int version; + IStream * is; + bool deleteStream; + + TiledInputFile * tFile; + ScanLineInputFile * sFile; + + LineOrder lineOrder; // the file's lineorder + int minY; // data window's min y coord + int maxY; // data window's max x coord + + FrameBuffer tFileBuffer; + FrameBuffer * cachedBuffer; + + int cachedTileY; + int offset; + + int numThreads; + + Data (bool del, int numThreads); + ~Data (); + + void deleteCachedBuffer(); +}; + + +InputFile::Data::Data (bool del, int numThreads): + is (0), + deleteStream (del), + tFile (0), + sFile (0), + cachedBuffer (0), + cachedTileY (-1), + numThreads (numThreads) +{ + // empty +} + + +InputFile::Data::~Data () +{ + delete tFile; + delete sFile; + + if (deleteStream) + delete is; + + deleteCachedBuffer(); +} + + +void +InputFile::Data::deleteCachedBuffer() +{ + // + // Delete the cached frame buffer, and all memory + // allocated for the slices in the cached frameBuffer. + // + + if (cachedBuffer) + { + for (FrameBuffer::Iterator k = cachedBuffer->begin(); + k != cachedBuffer->end(); + ++k) + { + Slice &s = k.slice(); + + switch (s.type) + { + case UINT: + + delete [] (((unsigned int *)s.base) + offset); + break; + + case HALF: + + delete [] ((half *)s.base + offset); + break; + + case FLOAT: + + delete [] (((float *)s.base) + offset); + break; + } + } + + // + // delete the cached frame buffer + // + + delete cachedBuffer; + cachedBuffer = 0; + } +} + + +namespace { + +void +bufferedReadPixels (InputFile::Data* ifd, int scanLine1, int scanLine2) +{ + // + // bufferedReadPixels reads each row of tiles that intersect the + // scan-line range (scanLine1 to scanLine2). The previous row of + // tiles is cached in order to prevent redundent tile reads when + // accessing scanlines sequentially. + // + + int minY = std::min (scanLine1, scanLine2); + int maxY = std::max (scanLine1, scanLine2); + + if (minY < ifd->minY || maxY > ifd->maxY) + { + throw Iex::ArgExc ("Tried to read scan line outside " + "the image file's data window."); + } + + // + // The minimum and maximum y tile coordinates that intersect this + // scanline range + // + + int minDy = (minY - ifd->minY) / ifd->tFile->tileYSize(); + int maxDy = (maxY - ifd->minY) / ifd->tFile->tileYSize(); + + // + // Figure out which one is first in the file so we can read without seeking + // + + int yStart, yEnd, yStep; + + if (ifd->lineOrder == DECREASING_Y) + { + yStart = maxDy; + yEnd = minDy - 1; + yStep = -1; + } + else + { + yStart = minDy; + yEnd = maxDy + 1; + yStep = 1; + } + + // + // the number of pixels in a row of tiles + // + + Box2i levelRange = ifd->tFile->dataWindowForLevel(0); + + // + // Read the tiles into our temporary framebuffer and copy them into + // the user's buffer + // + + for (int j = yStart; j != yEnd; j += yStep) + { + Box2i tileRange = ifd->tFile->dataWindowForTile (0, j, 0); + + int minYThisRow = std::max (minY, tileRange.min.y); + int maxYThisRow = std::min (maxY, tileRange.max.y); + + if (j != ifd->cachedTileY) + { + // + // We don't have any valid buffered info, so we need to read in + // from the file. + // + + ifd->tFile->readTiles (0, ifd->tFile->numXTiles (0) - 1, j, j); + ifd->cachedTileY = j; + } + + // + // Copy the data from our cached framebuffer into the user's + // framebuffer. + // + + for (FrameBuffer::ConstIterator k = ifd->cachedBuffer->begin(); + k != ifd->cachedBuffer->end(); + ++k) + { + Slice fromSlice = k.slice(); // slice to write from + Slice toSlice = ifd->tFileBuffer[k.name()]; // slice to write to + + char *fromPtr, *toPtr; + int size = pixelTypeSize (toSlice.type); + + int xStart = levelRange.min.x; + int yStart = minYThisRow; + + while (modp (xStart, toSlice.xSampling) != 0) + ++xStart; + + while (modp (yStart, toSlice.ySampling) != 0) + ++yStart; + + for (int y = yStart; + y <= maxYThisRow; + y += toSlice.ySampling) + { + // + // Set the pointers to the start of the y scanline in + // this row of tiles + // + + fromPtr = fromSlice.base + + (y - tileRange.min.y) * fromSlice.yStride + + xStart * fromSlice.xStride; + + toPtr = toSlice.base + + divp (y, toSlice.ySampling) * toSlice.yStride + + divp (xStart, toSlice.xSampling) * toSlice.xStride; + + // + // Copy all pixels for the scanline in this row of tiles + // + + for (int x = xStart; + x <= levelRange.max.x; + x += toSlice.xSampling) + { + for (size_t i = 0; i < size; ++i) + toPtr[i] = fromPtr[i]; + + fromPtr += fromSlice.xStride * toSlice.xSampling; + toPtr += toSlice.xStride; + } + } + } + } +} + +} // namespace + + + +InputFile::InputFile (const char fileName[], int numThreads): + _data (new Data (true, numThreads)) +{ + try + { + _data->is = new StdIFStream (fileName); + initialize(); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +InputFile::InputFile (IStream &is, int numThreads): + _data (new Data (false, numThreads)) +{ + try + { + _data->is = &is; + initialize(); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot read image file " + "\"" << is.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +void +InputFile::initialize () +{ + _data->header.readFrom (*_data->is, _data->version); + _data->header.sanityCheck (isTiled (_data->version)); + + if (isTiled (_data->version)) + { + _data->lineOrder = _data->header.lineOrder(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + _data->tFile = new TiledInputFile (_data->header, + _data->is, + _data->version, + _data->numThreads); + } + else + { + _data->sFile = new ScanLineInputFile (_data->header, + _data->is, + _data->numThreads); + } +} + + +InputFile::~InputFile () +{ + delete _data; +} + + +const char * +InputFile::fileName () const +{ + return _data->is->fileName(); +} + + +const Header & +InputFile::header () const +{ + return _data->header; +} + + +int +InputFile::version () const +{ + return _data->version; +} + + +void +InputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + if (isTiled (_data->version)) + { + Lock lock (*_data); + + // + // We must invalidate the cached buffer if the new frame + // buffer has a different set of channels than the old + // frame buffer, or if the type of a channel has changed. + // + + const FrameBuffer &oldFrameBuffer = _data->tFileBuffer; + + FrameBuffer::ConstIterator i = oldFrameBuffer.begin(); + FrameBuffer::ConstIterator j = frameBuffer.begin(); + + while (i != oldFrameBuffer.end() && j != frameBuffer.end()) + { + if (strcmp (i.name(), j.name()) || i.slice().type != j.slice().type) + break; + + ++i; + ++j; + } + + if (i != oldFrameBuffer.end() || j != frameBuffer.end()) + { + // + // Invalidate the cached buffer. + // + + _data->deleteCachedBuffer (); + _data->cachedTileY = -1; + + // + // Create new a cached frame buffer. It can hold a single + // row of tiles. The cached buffer can be reused for each + // row of tiles because we set the yTileCoords parameter of + // each Slice to true. + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->cachedBuffer = new FrameBuffer(); + _data->offset = dataWindow.min.x; + + int tileRowSize = (dataWindow.max.x - dataWindow.min.x + 1) * + _data->tFile->tileYSize(); + + for (FrameBuffer::ConstIterator k = frameBuffer.begin(); + k != frameBuffer.end(); + ++k) + { + Slice s = k.slice(); + + switch (s.type) + { + case UINT: + + _data->cachedBuffer->insert + (k.name(), + Slice (UINT, + (char *)(new unsigned int[tileRowSize] - + _data->offset), + sizeof (unsigned int), + sizeof (unsigned int) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + case HALF: + + _data->cachedBuffer->insert + (k.name(), + Slice (HALF, + (char *)(new half[tileRowSize] - + _data->offset), + sizeof (half), + sizeof (half) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + case FLOAT: + + _data->cachedBuffer->insert + (k.name(), + Slice (FLOAT, + (char *)(new float[tileRowSize] - + _data->offset), + sizeof(float), + sizeof(float) * + _data->tFile->levelWidth(0), + 1, 1, + s.fillValue, + false, true)); + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } + + _data->tFile->setFrameBuffer (*_data->cachedBuffer); + } + + _data->tFileBuffer = frameBuffer; + } + else + { + _data->sFile->setFrameBuffer (frameBuffer); + } +} + + +const FrameBuffer & +InputFile::frameBuffer () const +{ + if (isTiled (_data->version)) + { + Lock lock (*_data); + return _data->tFileBuffer; + } + else + { + return _data->sFile->frameBuffer(); + } +} + + +bool +InputFile::isComplete () const +{ + if (isTiled (_data->version)) + return _data->tFile->isComplete(); + else + return _data->sFile->isComplete(); +} + + +void +InputFile::readPixels (int scanLine1, int scanLine2) +{ + if (isTiled (_data->version)) + { + Lock lock (*_data); + bufferedReadPixels (_data, scanLine1, scanLine2); + } + else + { + _data->sFile->readPixels (scanLine1, scanLine2); + } +} + + +void +InputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +void +InputFile::rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + if (isTiled (_data->version)) + { + throw Iex::ArgExc ("Tried to read a raw scanline " + "from a tiled image."); + } + + _data->sFile->rawPixelData (firstScanLine, pixelData, pixelDataSize); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +InputFile::rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + if (!isTiled (_data->version)) + { + throw Iex::ArgExc ("Tried to read a raw tile " + "from a scanline-based image."); + } + + _data->tFile->rawTileData (dx, dy, lx, ly, pixelData, pixelDataSize); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error reading tile data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +TiledInputFile* +InputFile::tFile() +{ + if (!isTiled (_data->version)) + { + throw Iex::ArgExc ("Cannot get a TiledInputFile pointer " + "from an InputFile that is not tiled."); + } + + return _data->tFile; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfInputFile.h b/3rdparty/openexr/IlmImf/ImfInputFile.h new file mode 100644 index 000000000..af9256bbd --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfInputFile.h @@ -0,0 +1,209 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_INPUT_FILE_H +#define INCLUDED_IMF_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class InputFile -- a scanline-based interface that can be used +// to read both scanline-based and tiled OpenEXR image files. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include + +namespace Imf { + +class TiledInputFile; +class ScanLineInputFile; + + +class InputFile +{ + public: + + //----------------------------------------------------------- + // A constructor that opens the file with the specified name. + // Destroying the InputFile object will close the file. + // + // numThreads determines the number of threads that will be + // used to read the file (see ImfThreading.h). + //----------------------------------------------------------- + + InputFile (const char fileName[], int numThreads = globalThreadCount()); + + + //------------------------------------------------------------- + // A constructor that attaches the new InputFile object to a + // file that has already been opened. Destroying the InputFile + // object will not close the file. + // + // numThreads determines the number of threads that will be + // used to read the file (see ImfThreading.h). + //------------------------------------------------------------- + + InputFile (IStream &is, int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~InputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the InputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readPixels() is called. + // The current frame buffer can be changed after each call + // to readPixels(). + //----------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //--------------------------------------------------------------- + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window are + // present in the input file, or false if any pixels are missing. + // (Another program may still be busy writing the file, or file + // writing may have been aborted prematurely.) + //--------------------------------------------------------------- + + bool isComplete () const; + + + //--------------------------------------------------------------- + // Read pixel data: + // + // readPixels(s1,s2) reads all scan lines with y coordinates + // in the interval [min (s1, s2), max (s1, s2)] from the file, + // and stores them in the current frame buffer. + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header().dataWindow().max.y] + // + // The scan lines can be read from the file in random order, and + // individual scan lines may be skipped or read multiple times. + // For maximum efficiency, the scan lines should be read in the + // order in which they were written to the file. + // + // readPixels(s) calls readPixels(s,s). + // + //--------------------------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //---------------------------------------------- + // Read a block of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement OutputFile::copyPixels()). + //---------------------------------------------- + + void rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize); + + //-------------------------------------------------- + // Read a tile of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement TiledOutputFile::copyPixels()). + //-------------------------------------------------- + + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize); + + struct Data; + + private: + + InputFile (const InputFile &); // not implemented + InputFile & operator = (const InputFile &); // not implemented + + void initialize (); + TiledInputFile * tFile (); + + friend void TiledOutputFile::copyPixels (InputFile &); + + Data * _data; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfInt64.h b/3rdparty/openexr/IlmImf/ImfInt64.h new file mode 100644 index 000000000..d8fdc81d2 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfInt64.h @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_INT64_H +#define INCLUDED_IMF_INT64_H + +//---------------------------------------------------------------------------- +// +// Int64 -- unsigned 64-bit integers, imported from namespace Imath +// +//---------------------------------------------------------------------------- + +#include "ImathInt64.h" + +namespace Imf { + +using Imath::Int64; + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfIntAttribute.cpp b/3rdparty/openexr/IlmImf/ImfIntAttribute.cpp new file mode 100644 index 000000000..f233b587f --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfIntAttribute.cpp @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class IntAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +IntAttribute::staticTypeName () +{ + return "int"; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfIntAttribute.h b/3rdparty/openexr/IlmImf/ImfIntAttribute.h new file mode 100644 index 000000000..c67e5b167 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfIntAttribute.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_INT_ATTRIBUTE_H +#define INCLUDED_IMF_INT_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class IntAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +typedef TypedAttribute IntAttribute; +template <> const char *IntAttribute::staticTypeName (); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfKeyCode.cpp b/3rdparty/openexr/IlmImf/ImfKeyCode.cpp new file mode 100644 index 000000000..b199cf5ed --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfKeyCode.cpp @@ -0,0 +1,216 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class KeyCode +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" + +namespace Imf { + + +KeyCode::KeyCode (int filmMfcCode, + int filmType, + int prefix, + int count, + int perfOffset, + int perfsPerFrame, + int perfsPerCount) +{ + setFilmMfcCode (filmMfcCode); + setFilmType (filmType); + setPrefix (prefix); + setCount (count); + setPerfOffset (perfOffset); + setPerfsPerFrame (perfsPerFrame); + setPerfsPerCount (perfsPerCount); +} + + +KeyCode::KeyCode (const KeyCode &other) +{ + _filmMfcCode = other._filmMfcCode; + _filmType = other._filmType; + _prefix = other._prefix; + _count = other._count; + _perfOffset = other._perfOffset; + _perfsPerFrame = other._perfsPerFrame; + _perfsPerCount = other._perfsPerCount; +} + + +KeyCode & +KeyCode::operator = (const KeyCode &other) +{ + _filmMfcCode = other._filmMfcCode; + _filmType = other._filmType; + _prefix = other._prefix; + _count = other._count; + _perfOffset = other._perfOffset; + _perfsPerFrame = other._perfsPerFrame; + _perfsPerCount = other._perfsPerCount; + + return *this; +} + + +int +KeyCode::filmMfcCode () const +{ + return _filmMfcCode; +} + + +void +KeyCode::setFilmMfcCode (int filmMfcCode) +{ + if (filmMfcCode < 0 || filmMfcCode > 99) + throw Iex::ArgExc ("Invalid key code film manufacturer code " + "(must be between 0 and 99)."); + + _filmMfcCode = filmMfcCode; +} + +int +KeyCode::filmType () const +{ + return _filmType; +} + + +void +KeyCode::setFilmType (int filmType) +{ + if (filmType < 0 || filmType > 99) + throw Iex::ArgExc ("Invalid key code film type " + "(must be between 0 and 99)."); + + _filmType = filmType; +} + +int +KeyCode::prefix () const +{ + return _prefix; +} + + +void +KeyCode::setPrefix (int prefix) +{ + if (prefix < 0 || prefix > 999999) + throw Iex::ArgExc ("Invalid key code prefix " + "(must be between 0 and 999999)."); + + _prefix = prefix; +} + + +int +KeyCode::count () const +{ + return _count; +} + + +void +KeyCode::setCount (int count) +{ + if (count < 0 || count > 9999) + throw Iex::ArgExc ("Invalid key code count " + "(must be between 0 and 9999)."); + + _count = count; +} + + +int +KeyCode::perfOffset () const +{ + return _perfOffset; +} + + +void +KeyCode::setPerfOffset (int perfOffset) +{ + if (perfOffset < 0 || perfOffset > 119) + throw Iex::ArgExc ("Invalid key code perforation offset " + "(must be between 0 and 119)."); + + _perfOffset = perfOffset; +} + + +int +KeyCode::perfsPerFrame () const +{ + return _perfsPerFrame; +} + + +void +KeyCode::setPerfsPerFrame (int perfsPerFrame) +{ + if (perfsPerFrame < 1 || perfsPerFrame > 15) + throw Iex::ArgExc ("Invalid key code number of perforations per frame " + "(must be between 1 and 15)."); + + _perfsPerFrame = perfsPerFrame; +} + + +int +KeyCode::perfsPerCount () const +{ + return _perfsPerCount; +} + + +void +KeyCode::setPerfsPerCount (int perfsPerCount) +{ + if (perfsPerCount < 20 || perfsPerCount > 120) + throw Iex::ArgExc ("Invalid key code number of perforations per count " + "(must be between 20 and 120)."); + + _perfsPerCount = perfsPerCount; +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfKeyCode.h b/3rdparty/openexr/IlmImf/ImfKeyCode.h new file mode 100644 index 000000000..93dd915ed --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfKeyCode.h @@ -0,0 +1,161 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_KEY_CODE_H +#define INCLUDED_IMF_KEY_CODE_H + +//----------------------------------------------------------------------------- +// +// class KeyCode +// +// A KeyCode object uniquely identifies a motion picture film frame. +// The following fields specifiy film manufacturer, film type, film +// roll and the frame's position within the roll: +// +// filmMfcCode film manufacturer code +// range: 0 - 99 +// +// filmType film type code +// range: 0 - 99 +// +// prefix prefix to identify film roll +// range: 0 - 999999 +// +// count count, increments once every perfsPerCount +// perforations (see below) +// range: 0 - 9999 +// +// perfOffset offset of frame, in perforations from +// zero-frame reference mark +// range: 0 - 119 +// +// perfsPerFrame number of perforations per frame +// range: 1 - 15 +// +// typical values: +// +// 1 for 16mm film +// 3, 4, or 8 for 35mm film +// 5, 8 or 15 for 65mm film +// +// perfsPerCount number of perforations per count +// range: 20 - 120 +// +// typical values: +// +// 20 for 16mm film +// 64 for 35mm film +// 80 or 120 for 65mm film +// +// For more information about the interpretation of those fields see +// the following standards and recommended practice publications: +// +// SMPTE 254 Motion-Picture Film (35-mm) - Manufacturer-Printed +// Latent Image Identification Information +// +// SMPTE 268M File Format for Digital Moving-Picture Exchange (DPX) +// (section 6.1) +// +// SMPTE 270 Motion-Picture Film (65-mm) - Manufacturer- Printed +// Latent Image Identification Information +// +// SMPTE 271 Motion-Picture Film (16-mm) - Manufacturer- Printed +// Latent Image Identification Information +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +class KeyCode +{ + public: + + //------------------------------------- + // Constructors and assignment operator + //------------------------------------- + + KeyCode (int filmMfcCode = 0, + int filmType = 0, + int prefix = 0, + int count = 0, + int perfOffset = 0, + int perfsPerFrame = 4, + int perfsPerCount = 64); + + KeyCode (const KeyCode &other); + KeyCode & operator = (const KeyCode &other); + + + //---------------------------- + // Access to individual fields + //---------------------------- + + int filmMfcCode () const; + void setFilmMfcCode (int filmMfcCode); + + int filmType () const; + void setFilmType (int filmType); + + int prefix () const; + void setPrefix (int prefix); + + int count () const; + void setCount (int count); + + int perfOffset () const; + void setPerfOffset (int perfOffset); + + int perfsPerFrame () const; + void setPerfsPerFrame (int perfsPerFrame); + + int perfsPerCount () const; + void setPerfsPerCount (int perfsPerCount); + + private: + + int _filmMfcCode; + int _filmType; + int _prefix; + int _count; + int _perfOffset; + int _perfsPerFrame; + int _perfsPerCount; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp b/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp new file mode 100644 index 000000000..00156bd24 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp @@ -0,0 +1,98 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class KeyCodeAttribute +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + + +template <> +const char * +KeyCodeAttribute::staticTypeName () +{ + return "keycode"; +} + + +template <> +void +KeyCodeAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.filmMfcCode()); + Xdr::write (os, _value.filmType()); + Xdr::write (os, _value.prefix()); + Xdr::write (os, _value.count()); + Xdr::write (os, _value.perfOffset()); + Xdr::write (os, _value.perfsPerFrame()); + Xdr::write (os, _value.perfsPerCount()); +} + + +template <> +void +KeyCodeAttribute::readValueFrom (IStream &is, int size, int version) +{ + int tmp; + + Xdr::read (is, tmp); + _value.setFilmMfcCode (tmp); + + Xdr::read (is, tmp); + _value.setFilmType (tmp); + + Xdr::read (is, tmp); + _value.setPrefix (tmp); + + Xdr::read (is, tmp); + _value.setCount (tmp); + + Xdr::read (is, tmp); + _value.setPerfOffset (tmp); + + Xdr::read (is, tmp); + _value.setPerfsPerFrame (tmp); + + Xdr::read (is, tmp); + _value.setPerfsPerCount (tmp); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.h b/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.h new file mode 100644 index 000000000..9ec8f8403 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_KEY_CODE_ATTRIBUTE_H +#define INCLUDED_IMF_KEY_CODE_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class KeyCodeAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute KeyCodeAttribute; + +template <> +const char *KeyCodeAttribute::staticTypeName (); + +template <> +void KeyCodeAttribute::writeValueTo (OStream &, int) const; + +template <> +void KeyCodeAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfLineOrder.h b/3rdparty/openexr/IlmImf/ImfLineOrder.h new file mode 100644 index 000000000..2f91352fd --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfLineOrder.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_LINE_ORDER_H +#define INCLUDED_IMF_LINE_ORDER_H + +//----------------------------------------------------------------------------- +// +// enum LineOrder +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +enum LineOrder +{ + INCREASING_Y = 0, // first scan line has lowest y coordinate + + DECREASING_Y = 1, // first scan line has highest y coordinate + + RANDOM_Y = 2, // only for tiled files; tiles are written + // in random order + + NUM_LINEORDERS // number of different line orders +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp b/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp new file mode 100644 index 000000000..6b9c0f9a6 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp @@ -0,0 +1,77 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +//----------------------------------------------------------------------------- +// +// class LineOrderAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +LineOrderAttribute::staticTypeName () +{ + return "lineOrder"; +} + + +template <> +void +LineOrderAttribute::writeValueTo (OStream &os, int version) const +{ + unsigned char tmp = _value; + Xdr::write (os, tmp); +} + + +template <> +void +LineOrderAttribute::readValueFrom (IStream &is, int size, int version) +{ + unsigned char tmp; + Xdr::read (is, tmp); + _value = LineOrder (tmp); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.h b/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.h new file mode 100644 index 000000000..eb9301e04 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_LINE_ORDER_ATTRIBUTE_H +#define INCLUDED_IMF_LINE_ORDER_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class LineOrderAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute LineOrderAttribute; +template <> const char *LineOrderAttribute::staticTypeName (); +template <> void LineOrderAttribute::writeValueTo (OStream &, int) const; +template <> void LineOrderAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfLut.cpp b/3rdparty/openexr/IlmImf/ImfLut.cpp new file mode 100644 index 000000000..284bd21fb --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfLut.cpp @@ -0,0 +1,176 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Lookup tables for efficient application +// of half --> half functions to pixel data, +// and some commonly applied functions. +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +namespace Imf { + + +void +HalfLut::apply (half *data, int nData, int stride) const +{ + while (nData) + { + *data = _lut (*data); + data += stride; + nData -= 1; + } +} + + +void +HalfLut::apply (const Slice &data, const Imath::Box2i &dataWindow) const +{ + assert (data.type == HALF); + assert (dataWindow.min.x % data.xSampling == 0); + assert (dataWindow.min.y % data.ySampling == 0); + assert ((dataWindow.max.x - dataWindow.min.x + 1) % data.xSampling == 0); + assert ((dataWindow.max.y - dataWindow.min.y + 1) % data.ySampling == 0); + + char *base = data.base + data.yStride * + (dataWindow.min.y / data.ySampling); + + for (int y = dataWindow.min.y; + y <= dataWindow.max.y; + y += data.ySampling) + { + char *pixel = base + data.xStride * + (dataWindow.min.x / data.xSampling); + + for (int x = dataWindow.min.x; + x <= dataWindow.max.x; + x += data.xSampling) + { + *(half *)pixel = _lut (*(half *)pixel); + pixel += data.xStride; + } + + base += data.yStride; + } +} + + +void +RgbaLut::apply (Rgba *data, int nData, int stride) const +{ + while (nData) + { + if (_chn & WRITE_R) + data->r = _lut (data->r); + + if (_chn & WRITE_G) + data->g = _lut (data->g); + + if (_chn & WRITE_B) + data->b = _lut (data->b); + + if (_chn & WRITE_A) + data->a = _lut (data->a); + + data += stride; + nData -= 1; + } +} + + +void +RgbaLut::apply (Rgba *base, + int xStride, int yStride, + const Imath::Box2i &dataWindow) const +{ + base += dataWindow.min.y * yStride; + + for (int y = dataWindow.min.y; y <= dataWindow.max.y; ++y) + { + Rgba *pixel = base + dataWindow.min.x * xStride; + + for (int x = dataWindow.min.x; x <= dataWindow.max.x; ++x) + { + if (_chn & WRITE_R) + pixel->r = _lut (pixel->r); + + if (_chn & WRITE_G) + pixel->g = _lut (pixel->g); + + if (_chn & WRITE_B) + pixel->b = _lut (pixel->b); + + if (_chn & WRITE_A) + pixel->a = _lut (pixel->a); + + pixel += xStride; + } + + base += yStride; + } +} + + +half +round12log (half x) +{ + const float middleval = pow (2.0, -2.5); + int int12log; + + if (x <= 0) + { + return 0; + } + else + { + int12log = int (2000.5 + 200.0 * log (x / middleval) / log (2.0)); + + if (int12log > 4095) + int12log = 4095; + + if (int12log < 1) + int12log = 1; + } + + return middleval * pow (2.0, (int12log - 2000.0) / 200.0); +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfLut.h b/3rdparty/openexr/IlmImf/ImfLut.h new file mode 100644 index 000000000..ca702d2db --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfLut.h @@ -0,0 +1,185 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_LUT_H +#define INCLUDED_IMF_LUT_H + +//----------------------------------------------------------------------------- +// +// Lookup tables for efficient application +// of half --> half functions to pixel data, +// and some commonly applied functions. +// +//----------------------------------------------------------------------------- + +#include +#include +#include "ImathBox.h" +#include "halfFunction.h" + +namespace Imf { + +// +// Lookup table for individual half channels. +// + +class HalfLut +{ + public: + + //------------ + // Constructor + //------------ + + template + HalfLut (Function f); + + + //---------------------------------------------------------------------- + // Apply the table to data[0], data[stride] ... data[(nData-1) * stride] + //---------------------------------------------------------------------- + + void apply (half *data, + int nData, + int stride = 1) const; + + + //--------------------------------------------------------------- + // Apply the table to a frame buffer slice (see ImfFrameBuffer.h) + //--------------------------------------------------------------- + + void apply (const Slice &data, + const Imath::Box2i &dataWindow) const; + + private: + + halfFunction _lut; +}; + + +// +// Lookup table for combined RGBA data. +// + +class RgbaLut +{ + public: + + //------------ + // Constructor + //------------ + + template + RgbaLut (Function f, RgbaChannels chn = WRITE_RGB); + + + //---------------------------------------------------------------------- + // Apply the table to data[0], data[stride] ... data[(nData-1) * stride] + //---------------------------------------------------------------------- + + void apply (Rgba *data, + int nData, + int stride = 1) const; + + + //----------------------------------------------------------------------- + // Apply the table to a frame buffer (see RgbaOutpuFile.setFrameBuffer()) + //----------------------------------------------------------------------- + + void apply (Rgba *base, + int xStride, + int yStride, + const Imath::Box2i &dataWindow) const; + + private: + + halfFunction _lut; + RgbaChannels _chn; +}; + + +// +// 12bit log rounding reduces data to 20 stops with 200 steps per stop. +// That makes 4000 numbers. An extra 96 just come along for the ride. +// Zero explicitly remains zero. The first non-zero half will map to 1 +// in the 0-4095 12log space. A nice power of two number is placed at +// the center [2000] and that number is near 0.18. +// + +half round12log (half x); + + +// +// Round to n-bit precision (n should be between 0 and 10). +// After rounding, the significand's 10-n least significant +// bits will be zero. +// + +struct roundNBit +{ + roundNBit (int n): n(n) {} + half operator () (half x) {return x.round(n);} + int n; +}; + + +// +// Template definitions +// + + +template +HalfLut::HalfLut (Function f): + _lut(f, -HALF_MAX, HALF_MAX, half (0), + half::posInf(), half::negInf(), half::qNan()) +{ + // empty +} + + +template +RgbaLut::RgbaLut (Function f, RgbaChannels chn): + _lut(f, -HALF_MAX, HALF_MAX, half (0), + half::posInf(), half::negInf(), half::qNan()), + _chn(chn) +{ + // empty +} + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp b/3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp new file mode 100644 index 000000000..f4e447a4b --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp @@ -0,0 +1,260 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class M33fAttribute +// class M33dAttribute +// class M44fAttribute +// class M44dAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +M33fAttribute::staticTypeName () +{ + return "m33f"; +} + + +template <> +void +M33fAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); +} + + +template <> +void +M33fAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); +} + + +template <> +const char * +M33dAttribute::staticTypeName () +{ + return "m33d"; +} + + +template <> +void +M33dAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); +} + + +template <> +void +M33dAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); +} + + +template <> +const char * +M44fAttribute::staticTypeName () +{ + return "m44f"; +} + + +template <> +void +M44fAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + Xdr::write (os, _value[0][3]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + Xdr::write (os, _value[1][3]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); + Xdr::write (os, _value[2][3]); + + Xdr::write (os, _value[3][0]); + Xdr::write (os, _value[3][1]); + Xdr::write (os, _value[3][2]); + Xdr::write (os, _value[3][3]); +} + + +template <> +void +M44fAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + Xdr::read (is, _value[0][3]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + Xdr::read (is, _value[1][3]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); + Xdr::read (is, _value[2][3]); + + Xdr::read (is, _value[3][0]); + Xdr::read (is, _value[3][1]); + Xdr::read (is, _value[3][2]); + Xdr::read (is, _value[3][3]); +} + + +template <> +const char * +M44dAttribute::staticTypeName () +{ + return "m44d"; +} + + +template <> +void +M44dAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value[0][0]); + Xdr::write (os, _value[0][1]); + Xdr::write (os, _value[0][2]); + Xdr::write (os, _value[0][3]); + + Xdr::write (os, _value[1][0]); + Xdr::write (os, _value[1][1]); + Xdr::write (os, _value[1][2]); + Xdr::write (os, _value[1][3]); + + Xdr::write (os, _value[2][0]); + Xdr::write (os, _value[2][1]); + Xdr::write (os, _value[2][2]); + Xdr::write (os, _value[2][3]); + + Xdr::write (os, _value[3][0]); + Xdr::write (os, _value[3][1]); + Xdr::write (os, _value[3][2]); + Xdr::write (os, _value[3][3]); +} + + +template <> +void +M44dAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value[0][0]); + Xdr::read (is, _value[0][1]); + Xdr::read (is, _value[0][2]); + Xdr::read (is, _value[0][3]); + + Xdr::read (is, _value[1][0]); + Xdr::read (is, _value[1][1]); + Xdr::read (is, _value[1][2]); + Xdr::read (is, _value[1][3]); + + Xdr::read (is, _value[2][0]); + Xdr::read (is, _value[2][1]); + Xdr::read (is, _value[2][2]); + Xdr::read (is, _value[2][3]); + + Xdr::read (is, _value[3][0]); + Xdr::read (is, _value[3][1]); + Xdr::read (is, _value[3][2]); + Xdr::read (is, _value[3][3]); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfMatrixAttribute.h b/3rdparty/openexr/IlmImf/ImfMatrixAttribute.h new file mode 100644 index 000000000..2bb515bd8 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfMatrixAttribute.h @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_MATRIX_ATTRIBUTE_H +#define INCLUDED_IMF_MATRIX_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class M33fAttribute +// class M33dAttribute +// class M44fAttribute +// class M44dAttribute +// +//----------------------------------------------------------------------------- + +#include +#include "ImathMatrix.h" + + +namespace Imf { + + +typedef TypedAttribute M33fAttribute; +template <> const char *M33fAttribute::staticTypeName (); +template <> void M33fAttribute::writeValueTo (OStream &, int) const; +template <> void M33fAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute M33dAttribute; +template <> const char *M33dAttribute::staticTypeName (); +template <> void M33dAttribute::writeValueTo (OStream &, int) const; +template <> void M33dAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute M44fAttribute; +template <> const char *M44fAttribute::staticTypeName (); +template <> void M44fAttribute::writeValueTo (OStream &, int) const; +template <> void M44fAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute M44dAttribute; +template <> const char *M44dAttribute::staticTypeName (); +template <> void M44dAttribute::writeValueTo (OStream &, int) const; +template <> void M44dAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfMisc.cpp b/3rdparty/openexr/IlmImf/ImfMisc.cpp new file mode 100644 index 000000000..e13f390c3 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfMisc.cpp @@ -0,0 +1,787 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// Miscellaneous helper functions for OpenEXR image file I/O +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Imf { + +using Imath::Box2i; +using Imath::divp; +using Imath::modp; +using std::vector; + +int +pixelTypeSize (PixelType type) +{ + int size; + + switch (type) + { + case UINT: + + size = Xdr::size (); + break; + + case HALF: + + size = Xdr::size (); + break; + + case FLOAT: + + size = Xdr::size (); + break; + + default: + + throw Iex::ArgExc ("Unknown pixel type."); + } + + return size; +} + + +int +numSamples (int s, int a, int b) +{ + int a1 = divp (a, s); + int b1 = divp (b, s); + return b1 - a1 + ((a1 * s < a)? 0: 1); +} + + +size_t +bytesPerLineTable (const Header &header, + vector &bytesPerLine) +{ + const Box2i &dataWindow = header.dataWindow(); + const ChannelList &channels = header.channels(); + + bytesPerLine.resize (dataWindow.max.y - dataWindow.min.y + 1); + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + int nBytes = pixelTypeSize (c.channel().type) * + (dataWindow.max.x - dataWindow.min.x + 1) / + c.channel().xSampling; + + for (int y = dataWindow.min.y, i = 0; y <= dataWindow.max.y; ++y, ++i) + if (modp (y, c.channel().ySampling) == 0) + bytesPerLine[i] += nBytes; + } + + size_t maxBytesPerLine = 0; + + for (int y = dataWindow.min.y, i = 0; y <= dataWindow.max.y; ++y, ++i) + if (maxBytesPerLine < bytesPerLine[i]) + maxBytesPerLine = bytesPerLine[i]; + + return maxBytesPerLine; +} + + +void +offsetInLineBufferTable (const vector &bytesPerLine, + int linesInLineBuffer, + vector &offsetInLineBuffer) +{ + offsetInLineBuffer.resize (bytesPerLine.size()); + + size_t offset = 0; + + for (int i = 0; i < bytesPerLine.size(); ++i) + { + if (i % linesInLineBuffer == 0) + offset = 0; + + offsetInLineBuffer[i] = offset; + offset += bytesPerLine[i]; + } +} + + +int +lineBufferMinY (int y, int minY, int linesInLineBuffer) +{ + return ((y - minY) / linesInLineBuffer) * linesInLineBuffer + minY; +} + + +int +lineBufferMaxY (int y, int minY, int linesInLineBuffer) +{ + return lineBufferMinY (y, minY, linesInLineBuffer) + linesInLineBuffer - 1; +} + + +Compressor::Format +defaultFormat (Compressor * compressor) +{ + return compressor? compressor->format(): Compressor::XDR; +} + + +int +numLinesInBuffer (Compressor * compressor) +{ + return compressor? compressor->numScanLines(): 1; +} + + +void +copyIntoFrameBuffer (const char *& readPtr, + char * writePtr, + char * endPtr, + size_t xStride, + bool fill, + double fillValue, + Compressor::Format format, + PixelType typeInFrameBuffer, + PixelType typeInFile) +{ + // + // Copy a horizontal row of pixels from an input + // file's line or tile buffer to a frame buffer. + // + + if (fill) + { + // + // The file contains no data for this channel. + // Store a default value in the frame buffer. + // + + switch (typeInFrameBuffer) + { + case UINT: + + { + unsigned int fillVal = (unsigned int) (fillValue); + + while (writePtr <= endPtr) + { + *(unsigned int *) writePtr = fillVal; + writePtr += xStride; + } + } + break; + + case HALF: + + { + half fillVal = half (fillValue); + + while (writePtr <= endPtr) + { + *(half *) writePtr = fillVal; + writePtr += xStride; + } + } + break; + + case FLOAT: + + { + float fillVal = float (fillValue); + + while (writePtr <= endPtr) + { + *(float *) writePtr = fillVal; + writePtr += xStride; + } + } + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } + else if (format == Compressor::XDR) + { + // + // The the line or tile buffer is in XDR format. + // + // Convert the pixels from the file's machine- + // independent representation, and store the + // results in the frame buffer. + // + + switch (typeInFrameBuffer) + { + case UINT: + + switch (typeInFile) + { + case UINT: + + while (writePtr <= endPtr) + { + Xdr::read (readPtr, *(unsigned int *) writePtr); + writePtr += xStride; + } + break; + + case HALF: + + while (writePtr <= endPtr) + { + half h; + Xdr::read (readPtr, h); + *(unsigned int *) writePtr = halfToUint (h); + writePtr += xStride; + } + break; + + case FLOAT: + + while (writePtr <= endPtr) + { + float f; + Xdr::read (readPtr, f); + *(unsigned int *)writePtr = floatToUint (f); + writePtr += xStride; + } + break; + } + break; + + case HALF: + + switch (typeInFile) + { + case UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + Xdr::read (readPtr, ui); + *(half *) writePtr = uintToHalf (ui); + writePtr += xStride; + } + break; + + case HALF: + + while (writePtr <= endPtr) + { + Xdr::read (readPtr, *(half *) writePtr); + writePtr += xStride; + } + break; + + case FLOAT: + + while (writePtr <= endPtr) + { + float f; + Xdr::read (readPtr, f); + *(half *) writePtr = floatToHalf (f); + writePtr += xStride; + } + break; + } + break; + + case FLOAT: + + switch (typeInFile) + { + case UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + Xdr::read (readPtr, ui); + *(float *) writePtr = float (ui); + writePtr += xStride; + } + break; + + case HALF: + + while (writePtr <= endPtr) + { + half h; + Xdr::read (readPtr, h); + *(float *) writePtr = float (h); + writePtr += xStride; + } + break; + + case FLOAT: + + while (writePtr <= endPtr) + { + Xdr::read (readPtr, *(float *) writePtr); + writePtr += xStride; + } + break; + } + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // The the line or tile buffer is in NATIVE format. + // Copy the results into the frame buffer. + // + + switch (typeInFrameBuffer) + { + case UINT: + + switch (typeInFile) + { + case UINT: + + while (writePtr <= endPtr) + { + for (size_t i = 0; i < sizeof (unsigned int); ++i) + writePtr[i] = readPtr[i]; + + readPtr += sizeof (unsigned int); + writePtr += xStride; + } + break; + + case HALF: + + while (writePtr <= endPtr) + { + half h = *(half *) readPtr; + *(unsigned int *) writePtr = halfToUint (h); + readPtr += sizeof (half); + writePtr += xStride; + } + break; + + case FLOAT: + + while (writePtr <= endPtr) + { + float f; + + for (size_t i = 0; i < sizeof (float); ++i) + ((char *)&f)[i] = readPtr[i]; + + *(unsigned int *)writePtr = floatToUint (f); + readPtr += sizeof (float); + writePtr += xStride; + } + break; + } + break; + + case HALF: + + switch (typeInFile) + { + case UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + + for (size_t i = 0; i < sizeof (unsigned int); ++i) + ((char *)&ui)[i] = readPtr[i]; + + *(half *) writePtr = uintToHalf (ui); + readPtr += sizeof (unsigned int); + writePtr += xStride; + } + break; + + case HALF: + + while (writePtr <= endPtr) + { + *(half *) writePtr = *(half *)readPtr; + readPtr += sizeof (half); + writePtr += xStride; + } + break; + + case FLOAT: + + while (writePtr <= endPtr) + { + float f; + + for (size_t i = 0; i < sizeof (float); ++i) + ((char *)&f)[i] = readPtr[i]; + + *(half *) writePtr = floatToHalf (f); + readPtr += sizeof (float); + writePtr += xStride; + } + break; + } + break; + + case FLOAT: + + switch (typeInFile) + { + case UINT: + + while (writePtr <= endPtr) + { + unsigned int ui; + + for (size_t i = 0; i < sizeof (unsigned int); ++i) + ((char *)&ui)[i] = readPtr[i]; + + *(float *) writePtr = float (ui); + readPtr += sizeof (unsigned int); + writePtr += xStride; + } + break; + + case HALF: + + while (writePtr <= endPtr) + { + half h = *(half *) readPtr; + *(float *) writePtr = float (h); + readPtr += sizeof (half); + writePtr += xStride; + } + break; + + case FLOAT: + + while (writePtr <= endPtr) + { + for (size_t i = 0; i < sizeof (float); ++i) + writePtr[i] = readPtr[i]; + + readPtr += sizeof (float); + writePtr += xStride; + } + break; + } + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } +} + + +void +skipChannel (const char *& readPtr, + PixelType typeInFile, + size_t xSize) +{ + switch (typeInFile) + { + case UINT: + + Xdr::skip (readPtr, Xdr::size () * xSize); + break; + + case HALF: + + Xdr::skip (readPtr, Xdr::size () * xSize); + break; + + case FLOAT: + + Xdr::skip (readPtr, Xdr::size () * xSize); + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } +} + + +void +convertInPlace (char *& writePtr, + const char *& readPtr, + PixelType type, + size_t numPixels) +{ + switch (type) + { + case UINT: + + for (int j = 0; j < numPixels; ++j) + { + Xdr::write (writePtr, *(const unsigned int *) readPtr); + readPtr += sizeof(unsigned int); + } + break; + + case HALF: + + for (int j = 0; j < numPixels; ++j) + { + Xdr::write (writePtr, *(const half *) readPtr); + readPtr += sizeof(half); + } + break; + + case FLOAT: + + for (int j = 0; j < numPixels; ++j) + { + Xdr::write (writePtr, *(const float *) readPtr); + readPtr += sizeof(float); + } + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } +} + + +void +copyFromFrameBuffer (char *& writePtr, + const char *& readPtr, + const char * endPtr, + size_t xStride, + Compressor::Format format, + PixelType type) +{ + // + // Copy a horizontal row of pixels from a frame + // buffer to an output file's line or tile buffer. + // + + if (format == Compressor::XDR) + { + // + // The the line or tile buffer is in XDR format. + // + + switch (type) + { + case UINT: + + while (readPtr <= endPtr) + { + Xdr::write (writePtr, + *(const unsigned int *) readPtr); + readPtr += xStride; + } + break; + + case HALF: + + while (readPtr <= endPtr) + { + Xdr::write (writePtr, *(const half *) readPtr); + readPtr += xStride; + } + break; + + case FLOAT: + + while (readPtr <= endPtr) + { + Xdr::write (writePtr, *(const float *) readPtr); + readPtr += xStride; + } + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // The the line or tile buffer is in NATIVE format. + // + + switch (type) + { + case UINT: + + while (readPtr <= endPtr) + { + for (size_t i = 0; i < sizeof (unsigned int); ++i) + *writePtr++ = readPtr[i]; + + readPtr += xStride; + } + break; + + case HALF: + + while (readPtr <= endPtr) + { + *(half *) writePtr = *(const half *) readPtr; + writePtr += sizeof (half); + readPtr += xStride; + } + break; + + case FLOAT: + + while (readPtr <= endPtr) + { + for (size_t i = 0; i < sizeof (float); ++i) + *writePtr++ = readPtr[i]; + + readPtr += xStride; + } + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } +} + + +void +fillChannelWithZeroes (char *& writePtr, + Compressor::Format format, + PixelType type, + size_t xSize) +{ + if (format == Compressor::XDR) + { + // + // Fill with data in XDR format. + // + + switch (type) + { + case UINT: + + for (int j = 0; j < xSize; ++j) + Xdr::write (writePtr, (unsigned int) 0); + + break; + + case HALF: + + for (int j = 0; j < xSize; ++j) + Xdr::write (writePtr, (half) 0); + + break; + + case FLOAT: + + for (int j = 0; j < xSize; ++j) + Xdr::write (writePtr, (float) 0); + + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } + else + { + // + // Fill with data in NATIVE format. + // + + switch (type) + { + case UINT: + + for (int j = 0; j < xSize; ++j) + { + static const unsigned int ui = 0; + + for (size_t i = 0; i < sizeof (ui); ++i) + *writePtr++ = ((char *) &ui)[i]; + } + break; + + case HALF: + + for (int j = 0; j < xSize; ++j) + { + *(half *) writePtr = half (0); + writePtr += sizeof (half); + } + break; + + case FLOAT: + + for (int j = 0; j < xSize; ++j) + { + static const float f = 0; + + for (size_t i = 0; i < sizeof (f); ++i) + *writePtr++ = ((char *) &f)[i]; + } + break; + + default: + + throw Iex::ArgExc ("Unknown pixel data type."); + } + } +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfMisc.h b/3rdparty/openexr/IlmImf/ImfMisc.h new file mode 100644 index 000000000..85718f431 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfMisc.h @@ -0,0 +1,255 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_MISC_H +#define INCLUDED_IMF_MISC_H + +//----------------------------------------------------------------------------- +// +// Miscellaneous helper functions for OpenEXR image file I/O +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +namespace Imf { + +class Header; + +// +// Return the size of a single value of the indicated type, +// in the machine's native format. +// + +int pixelTypeSize (PixelType type); + + +// +// Return the number of samples a channel with subsampling rate +// s has in the interval [a, b]. For example, a channel with +// subsampling rate 2 (and samples at 0, 2, 4, 6, 8, etc.) has +// 2 samples in the interval [1, 5] and three samples in the +// interval [2, 6]. +// + +int numSamples (int s, int a, int b); + + +// +// Build a table that lists, for each scanline in a file's +// data window, how many bytes are required to store all +// pixels in all channels in that scanline (assuming that +// the pixel data are tightly packed). +// + +size_t bytesPerLineTable (const Header &header, + std::vector &bytesPerLine); + +// +// For scanline-based files, pixels are read or written in +// in multi-scanline blocks. Internally, class OutputFile +// and class ScanLineInputFile store a block of scan lines +// in a "line buffer". Function offsetInLineBufferTable() +// builds a table that lists, for each scan line in a file's +// data window, the location of the pixel data for the scanline +// relative to the beginning of the line buffer. +// + +void offsetInLineBufferTable (const std::vector &bytesPerLine, + int linesInLineBuffer, + std::vector &offsetInLineBuffer); + +// +// For a scanline-based file, compute the range of scanlines +// that occupy the same line buffer as a given scanline, y. +// (minY is the minimum y coordinate of the file's data window.) +// + +int lineBufferMinY (int y, int minY, int linesInLineBuffer); +int lineBufferMaxY (int y, int minY, int linesInLineBuffer); + + +// +// Return a compressor's data format (Compressor::NATIVE or Compressor::XDR). +// If compressor is 0, return Compressor::XDR. +// + +Compressor::Format defaultFormat (Compressor *compressor); + + +// +// Return the number of scan lines a compressor wants to compress +// or uncompress at once. If compressor is 0, return 1. +// + +int numLinesInBuffer (Compressor *compressor); + + +// +// Copy a single channel of a horizontal row of pixels from an +// input file's internal line buffer or tile buffer into a +// frame buffer slice. If necessary, perform on-the-fly data +// type conversion. +// +// readPtr initially points to the beginning of the +// data in the line or tile buffer. readPtr +// is advanced as the pixel data are copied; +// when copyIntoFrameBuffer() returns, +// readPtr points just past the end of the +// copied data. +// +// writePtr, endPtr point to the lefmost and rightmost pixels +// in the frame buffer slice +// +// xStride the xStride for the frame buffer slice +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// typeInFrameBuffer the pixel data type of the frame buffer slice +// +// typeInFile the pixel data type in the input file's channel +// + +void copyIntoFrameBuffer (const char *&readPtr, + char *writePtr, + char *endPtr, + size_t xStride, + bool fill, + double fillValue, + Compressor::Format format, + PixelType typeInFrameBuffer, + PixelType typeInFile); + +// +// Given a pointer into a an input file's line buffer or tile buffer, +// skip over the data for xSize pixels of type typeInFile. +// readPtr initially points to the beginning of the data to be skipped; +// when skipChannel() returns, readPtr points just past the end of the +// skipped data. +// + +void skipChannel (const char *&readPtr, + PixelType typeInFile, + size_t xSize); + +// +// Convert an array of pixel data from the machine's native +// representation to XDR format. +// +// toPtr, fromPtr initially point to the beginning of the input +// and output pixel data arrays; when convertInPlace() +// returns, toPtr and fromPtr point just past the +// end of the input and output arrays. +// If the native representation of the data has the +// same size as the XDR data, then the conversion +// can take in place, without an intermediate +// temporary buffer (toPtr and fromPtr can point +// to the same location). +// +// type the pixel data type +// +// numPixels number of pixels in the input and output arrays +// + +void convertInPlace (char *&toPtr, + const char *&fromPtr, + PixelType type, + size_t numPixels); + +// +// Copy a single channel of a horizontal row of pixels from a +// a frame buffer into an output file's internal line buffer or +// tile buffer. +// +// writePtr initially points to the beginning of the +// data in the line or tile buffer. writePtr +// is advanced as the pixel data are copied; +// when copyFromFrameBuffer() returns, +// writePtr points just past the end of the +// copied data. +// +// readPtr, endPtr point to the lefmost and rightmost pixels +// in the frame buffer slice +// +// xStride the xStride for the frame buffer slice +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// type the pixel data type in the frame buffer +// and in the output file's channel (function +// copyFromFrameBuffer() doesn't do on-the-fly +// data type conversion) +// + +void copyFromFrameBuffer (char *&writePtr, + const char *&readPtr, + const char *endPtr, + size_t xStride, + Compressor::Format format, + PixelType type); + +// +// Fill part of an output file's line buffer or tile buffer with +// zeroes. This routine is called when an output file contains +// a channel for which the frame buffer contains no corresponding +// slice. +// +// writePtr initially points to the beginning of the +// data in the line or tile buffer. When +// fillChannelWithZeroes() returns, writePtr +// points just past the end of the zeroed +// data. +// +// format indicates if the line or tile buffer is +// in NATIVE or XDR format. +// +// type the pixel data type in the line or frame buffer. +// +// xSize number of pixels to be filled with zeroes. +// + +void fillChannelWithZeroes (char *&writePtr, + Compressor::Format format, + PixelType type, + size_t xSize); + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfMultiView.cpp b/3rdparty/openexr/IlmImf/ImfMultiView.cpp new file mode 100644 index 000000000..8750c67bc --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfMultiView.cpp @@ -0,0 +1,396 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Functions related to accessing channels +// and views in multi-view OpenEXR files. +// +//----------------------------------------------------------------------------- + +#include + +using namespace std; + +namespace Imf { +namespace { + +StringVector +parseString (string name, char c = '.') +{ + // + // Turn name into a list of strings, separating + // on char 'c' with whitespace stripped. + // + + StringVector r; + + while (name.size() > 0) + { + size_t s = name.find (c); + string sec = name.substr (0, s); + + // + // Strip spaces from beginning + // + + while (sec.size() > 0 && sec[0] == ' ') + sec.erase (0, 1); + + // + // Strip spaces from end + // + + while (sec.size() > 0 && sec[sec.size() - 1] == ' ') + sec.erase (sec.size() - 1); + + r.push_back (sec); + + // + // Strip off name including ending 'c' + // + + if (s == name.npos) + name = ""; + else + name = name.substr (s + 1); + } + + return r; +} + + +int +viewNum (const string &view, const StringVector &multiView) +{ + // + // returns which view number is called 'view' + // returns -1 if no member of multiView is 'view' + // (i.e. if viewNum() returns -1, 'view' isn't a view name + // if viewNum() returns 0, 'view' is the default view + // otherwise, it's some other (valid) view + // + + for (int i = 0; i < multiView.size(); ++i) + { + if (multiView[i] == view) + return i; + } + + return -1; +} + +} // namespace + + +string +defaultViewName (const StringVector &multiView) +{ + if (multiView.size() > 0) + return multiView[0]; + else + return ""; +} + + +string +viewFromChannelName (const string &channel, + const StringVector &multiView) +{ + // + // Given the name of a channel, return the name of the view to + // which it belongs. + // + + // + // View name is penultimate section of name separated by periods ('.'s) + // + + StringVector s = parseString (channel, '.'); + + if (s.size() == 0) + return ""; // nothing in, nothing out + + if (s.size() == 1) + { + // + // Return default view name. + // The rules say ALL channels with no periods + // in the name belong to the default view. + // + + return multiView[0]; + } + else + { + // + // size >= 2 - the last part is the channel name, + // the next-to-last part is the view name. + // Check if that part of the name really is + // a valid view and, if it is, return it. + // + + const string &viewName = s[s.size() - 2]; + + if (viewNum (viewName, multiView) >= 0) + return viewName; + else + return ""; // not associated with any particular view + } +} + + +ChannelList +channelsInView (const string & viewName, + const ChannelList & channelList, + const StringVector & multiView) +{ + // + // Return a list of all channels belonging to view viewName. + // + + ChannelList q; + + for (ChannelList::ConstIterator i = channelList.begin(); + i != channelList.end(); + ++i) + { + // + // Get view name for this channel + // + + string view = viewFromChannelName (i.name(), multiView); + + + // + // Insert channel into q if it's a member of view viewName + // + + if (view == viewName) + q.insert (i.name(), i.channel()); + } + + return q; +} + + +ChannelList +channelsInNoView (const ChannelList &channelList, + const StringVector &multiView) +{ + // + // Return a list of channels not associated with any named view. + // + + return channelsInView ("", channelList, multiView); +} + + + +bool +areCounterparts (const string &channel1, + const string &channel2, + const StringVector &multiView) +{ + // + // Given two channels, return true if they are the same + // channel in two different views. + // + + StringVector chan1 = parseString (channel1); + unsigned int size1 = chan1.size(); // number of SECTIONS in string + // name (not string length) + + StringVector chan2 = parseString (channel2); + unsigned int size2 = chan2.size(); + + if (size1 == 0 || size2 == 0) + return false; + + // + // channel1 and channel2 can't be counterparts + // if either channel is in no view. + // + + if (size1 > 1 && viewNum (chan1[size1 - 2], multiView) == -1) + return false; + + if (size2 > 1 && viewNum (chan2[size2 - 2], multiView) == -1) + return false; + + if (viewFromChannelName (channel1, multiView) == + viewFromChannelName (channel2, multiView)) + { + // + // channel1 and channel2 are not counterparts + // if they are in the same view. + // + + return false; + } + + if (size1 == 1) + { + // + // channel1 is a default channel - the channels will only be + // counterparts if channel2 is of the form . + // + + return size2 == 2 && chan1[0] == chan2[1]; + } + + if (size2 == 1) + { + // + // channel2 is a default channel - the channels will only be + // counterparts if channel1 is of the form . + // + + return size1 == 2 && chan2[0] == chan1[1]; + } + + // + // Neither channel is a default channel. To be counterparts both + // channel names must have the same number of components, and + // all components except the penultimate one must be the same. + // + + if (size1 != size2) + return false; + + for(int i = 0; i < size1; ++i) + { + if (i != size1 - 2 && chan1[i] != chan2[i]) + return false; + } + + return true; +} + + +ChannelList +channelInAllViews (const string &channelName, + const ChannelList &channelList, + const StringVector &multiView) +{ + // + // Given the name of a channel, return a + // list of the same channel in all views. + // + + ChannelList q; + + for (ChannelList::ConstIterator i=channelList.begin(); + i != channelList.end(); + ++i) + { + if (i.name() == channelName || + areCounterparts (i.name(), channelName, multiView)) + { + q.insert (i.name(), i.channel()); + } + } + + return q; +} + + +string +channelInOtherView (const string &channelName, + const ChannelList &channelList, + const StringVector &multiView, + const string &otherViewName) +{ + // + // Given the name of a channel in one view, return the + // corresponding channel name for view otherViewName. + // + + for (ChannelList::ConstIterator i=channelList.begin(); + i != channelList.end(); + ++i) + { + if (viewFromChannelName (i.name(), multiView) == otherViewName && + areCounterparts (i.name(), channelName, multiView)) + { + return i.name(); + } + } + + return ""; +} + + +string +insertViewName (const string &channel, + const StringVector &multiView, + int i) +{ + // + // Insert multiView[i] into the channel name if appropriate. + // + + StringVector s = parseString (channel, '.'); + + if (s.size() == 0) + return ""; // nothing in, nothing out + + if (s.size() == 1 && i == 0) + { + // + // Channel in the default view, with no periods in its name. + // Do not insert view name. + // + + return channel; + } + + // + // View name becomes penultimate section of new channel name. + // + + string newName; + + for (int j = 0; j < s.size(); ++j) + { + if (j < s.size() - 1) + newName += s[j] + "."; + else + newName += multiView[i] + "." + s[j]; + } + + return newName; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfMultiView.h b/3rdparty/openexr/IlmImf/ImfMultiView.h new file mode 100644 index 000000000..6d03d5ed6 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfMultiView.h @@ -0,0 +1,164 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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 INCLUDED_IMF_MULTIVIEW_H +#define INCLUDED_IMF_MULTIVIEW_H + +#include +#include + +//----------------------------------------------------------------------------- +// +// Functions related to accessing channels and views in multi-view +// OpenEXR files. +// +// A multi-view image file contains two or more views of the same +// scene, as seen from different viewpoints, for example, a left-eye +// and a right-eye view for stereo displays. Each view has its own +// set of image channels. A naming convention identifies the channels +// that belong to a given view. +// +// A "multiView" attribute in the file header lists the names of the +// views in an image (see ImfStandardAttributes.h), and channel names +// of the form +// +// layer.view.channel +// +// allow channels to be matched with views. +// +// For compatibility with singe-view images, the first view listed in +// the multiView attribute is the "default view", and channels that +// have no periods in their names are considered part of the default +// view. +// +// For example, if a file's multiView attribute lists the views +// "left" and "right", in that order, then "left" is the default +// view. Channels +// +// "R", "left.Z", "diffuse.left.R" +// +// are part of the "left" view; channels +// +// "right.R", "right.Z", "diffuse.right.R" +// +// are part of the "right" view; and channels +// +// "tmp.R", "right.diffuse.R", "diffuse.tmp.R" +// +// belong to no view at all. +// +//----------------------------------------------------------------------------- + +namespace Imf { + +// +// Return the name of the default view given a multi-view string vector, +// that is, return the first element of the string vector. If the string +// vector is empty, return "". +// + +std::string defaultViewName (const StringVector &multiView); + + +// +// Given the name of a channel, return the name of the view to +// which it belongs. Returns the empty string ("") if the channel +// is not a member of any named view. +// + +std::string viewFromChannelName (const std::string &channel, + const StringVector &multiView); + + +// +// Return whether channel1 and channel2 are the same channel but +// viewed in different views. (Return false if either channel +// belongs to no view or if both channels belong to the same view.) +// + +bool areCounterparts (const std::string &channel1, + const std::string &channel2, + const StringVector &multiView); + +// +// Return a list of all channels belonging to view viewName. +// + +ChannelList channelsInView (const std::string &viewName, + const ChannelList &channelList, + const StringVector &multiView); + +// +// Return a list of channels not associated with any view. +// + +ChannelList channelsInNoView (const ChannelList &channelList, + const StringVector &multiView); + +// +// Given the name of a channel, return a list of the same channel +// in all views (for example, given X.left.Y return X.left.Y, +// X.right.Y, X.centre.Y, etc.). +// + +ChannelList channelInAllViews (const std::string &channame, + const ChannelList &channelList, + const StringVector &multiView); + +// +// Given the name of a channel in one view, return the corresponding +// channel name for view otherViewName. Return "" if no corresponding +// channel exists in view otherViewName, or if view otherViewName doesn't +// exist. +// + +std::string channelInOtherView (const std::string &channel, + const ChannelList &channelList, + const StringVector &multiView, + const std::string &otherViewName); + +// +// Given a channel name that does not include a view name, insert +// multiView[i] into the channel name at the appropriate location. +// If i is zero and the channel name contains no periods, then do +// not insert the view name. +// + +std::string insertViewName (const std::string &channel, + const StringVector &multiView, + int i); + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfName.h b/3rdparty/openexr/IlmImf/ImfName.h new file mode 100644 index 000000000..ebb9f8660 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfName.h @@ -0,0 +1,146 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_NAME_H +#define INCLUDED_IMF_NAME_H + +//----------------------------------------------------------------------------- +// +// class ImfName -- a zero-terminated string +// with a fixed, small maximum length +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + + +class Name +{ + public: + + //------------- + // Constructors + //------------- + + Name (); + Name (const char text[]); + + + //-------------------- + // Assignment operator + //-------------------- + + Name & operator = (const char text[]); + + + //--------------------- + // Access to the string + //--------------------- + + const char * text () const {return _text;} + const char * operator * () const {return _text;} + + //--------------- + // Maximum length + //--------------- + + static const int SIZE = 256; + static const int MAX_LENGTH = SIZE - 1; + + private: + + char _text[SIZE]; +}; + + +bool operator == (const Name &x, const Name &y); +bool operator != (const Name &x, const Name &y); +bool operator < (const Name &x, const Name &y); + + +//----------------- +// Inline functions +//----------------- + +inline Name & +Name::operator = (const char text[]) +{ + strncpy (_text, text, MAX_LENGTH); + return *this; +} + + +inline +Name::Name () +{ + _text[0] = 0; +} + + +inline +Name::Name (const char text[]) +{ + *this = text; + _text [MAX_LENGTH] = 0; +} + + +inline bool +operator == (const Name &x, const Name &y) +{ + return strcmp (*x, *y) == 0; +} + + +inline bool +operator != (const Name &x, const Name &y) +{ + return !(x == y); +} + + +inline bool +operator < (const Name &x, const Name &y) +{ + return strcmp (*x, *y) < 0; +} + + +} // namespace IMF + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp b/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp new file mode 100644 index 000000000..0abaa862d --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class OpaqueAttribute +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include + +namespace Imf { + + +OpaqueAttribute::OpaqueAttribute (const char typeName[]): + _typeName (strlen (typeName) + 1), + _dataSize (0) +{ + strcpy (_typeName, typeName); +} + + +OpaqueAttribute::OpaqueAttribute (const OpaqueAttribute &other): + _typeName (strlen (other._typeName) + 1), + _dataSize (other._dataSize), + _data (other._dataSize) +{ + strcpy (_typeName, other._typeName); + _data.resizeErase (other._dataSize); + memcpy ((char *) _data, (const char *) other._data, other._dataSize); +} + + +OpaqueAttribute::~OpaqueAttribute () +{ + // empty +} + + +const char * +OpaqueAttribute::typeName () const +{ + return _typeName; +} + + +Attribute * +OpaqueAttribute::copy () const +{ + return new OpaqueAttribute (*this); +} + + +void +OpaqueAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _data, _dataSize); +} + + +void +OpaqueAttribute::readValueFrom (IStream &is, int size, int version) +{ + _data.resizeErase (size); + _dataSize = size; + Xdr::read (is, _data, size); +} + + +void +OpaqueAttribute::copyValueFrom (const Attribute &other) +{ + const OpaqueAttribute *oa = dynamic_cast (&other); + + if (oa == 0 || strcmp (_typeName, oa->_typeName)) + { + THROW (Iex::TypeExc, "Cannot copy the value of an " + "image file attribute of type " + "\"" << other.typeName() << "\" " + "to an attribute of type " + "\"" << _typeName << "\"."); + } + + _data.resizeErase (oa->_dataSize); + _dataSize = oa->_dataSize; + memcpy ((char *) _data, (const char *) oa->_data, oa->_dataSize); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.h b/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.h new file mode 100644 index 000000000..864ae9373 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.h @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_OPAQUE_ATTRIBUTE_H +#define INCLUDED_IMF_OPAQUE_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class OpaqueAttribute +// +// When an image file is read, OpqaqueAttribute objects are used +// to hold the values of attributes whose types are not recognized +// by the reading program. OpaqueAttribute objects can be read +// from an image file, copied, and written back to to another image +// file, but their values are inaccessible. +// +//----------------------------------------------------------------------------- + +#include +#include + +namespace Imf { + + +class OpaqueAttribute: public Attribute +{ + public: + + //---------------------------- + // Constructors and destructor + //---------------------------- + + OpaqueAttribute (const char typeName[]); + OpaqueAttribute (const OpaqueAttribute &other); + virtual ~OpaqueAttribute (); + + + //------------------------------- + // Get this attribute's type name + //------------------------------- + + virtual const char * typeName () const; + + + //------------------------------ + // Make a copy of this attribute + //------------------------------ + + virtual Attribute * copy () const; + + + //---------------- + // I/O and copying + //---------------- + + virtual void writeValueTo (OStream &os, + int version) const; + + virtual void readValueFrom (IStream &is, + int size, + int version); + + virtual void copyValueFrom (const Attribute &other); + + + private: + + Array _typeName; + long _dataSize; + Array _data; +}; + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfOutputFile.cpp b/3rdparty/openexr/IlmImf/ImfOutputFile.cpp new file mode 100644 index 000000000..31a339e03 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfOutputFile.cpp @@ -0,0 +1,1287 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class OutputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include "ImathFun.h" +#include +#include +#include +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include +#include +#include + + +namespace Imf { + +using Imath::Box2i; +using Imath::divp; +using Imath::modp; +using std::string; +using std::vector; +using std::ofstream; +using std::min; +using std::max; +using IlmThread::Mutex; +using IlmThread::Lock; +using IlmThread::Semaphore; +using IlmThread::Task; +using IlmThread::TaskGroup; +using IlmThread::ThreadPool; + +namespace { + + +struct OutSliceInfo +{ + PixelType type; + const char * base; + size_t xStride; + size_t yStride; + int xSampling; + int ySampling; + bool zero; + + OutSliceInfo (PixelType type = HALF, + const char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + int xSampling = 1, + int ySampling = 1, + bool zero = false); +}; + + +OutSliceInfo::OutSliceInfo (PixelType t, + const char *b, + size_t xs, size_t ys, + int xsm, int ysm, + bool z) +: + type (t), + base (b), + xStride (xs), + yStride (ys), + xSampling (xsm), + ySampling (ysm), + zero (z) +{ + // empty +} + + +struct LineBuffer +{ + Array buffer; + const char * dataPtr; + int dataSize; + char * endOfLineBufferData; + int minY; + int maxY; + int scanLineMin; + int scanLineMax; + Compressor * compressor; + bool partiallyFull; // has incomplete data + bool hasException; + string exception; + + LineBuffer (Compressor *comp); + ~LineBuffer (); + + void wait () {_sem.wait();} + void post () {_sem.post();} + + private: + + Semaphore _sem; +}; + + +LineBuffer::LineBuffer (Compressor *comp) : + dataPtr (0), + dataSize (0), + compressor (comp), + partiallyFull (false), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +LineBuffer::~LineBuffer () +{ + delete compressor; +} + +} // namespace + + +struct OutputFile::Data: public Mutex +{ + Header header; // the image header + int version; // file format version + Int64 previewPosition; // file position for preview + FrameBuffer frameBuffer; // framebuffer to write into + int currentScanLine; // next scanline to be written + int missingScanLines; // number of lines to write + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + vector lineOffsets; // stores offsets in file for + // each scanline + vector bytesPerLine; // combined size of a line over + // all channels + vector offsetInLineBuffer; // offset for each scanline in + // its linebuffer + Compressor::Format format; // compressor's data format + vector slices; // info about channels in file + OStream * os; // file stream to write to + bool deleteStream; + Int64 lineOffsetsPosition; // file position for line + // offset table + Int64 currentPosition; // current file position + + vector lineBuffers; // each holds one line buffer + int linesInBuffer; // number of scanlines each + // buffer holds + size_t lineBufferSize; // size of the line buffer + + Data (bool deleteStream, int numThreads); + ~Data (); + + + inline LineBuffer * getLineBuffer (int number); // hash function from line + // buffer indices into our + // vector of line buffers +}; + + +OutputFile::Data::Data (bool deleteStream, int numThreads): + os (0), + deleteStream (deleteStream), + lineOffsetsPosition (0) +{ + // + // We need at least one lineBuffer, but if threading is used, + // to keep n threads busy we need 2*n lineBuffers. + // + + lineBuffers.resize (max (1, 2 * numThreads)); +} + + +OutputFile::Data::~Data () +{ + if (deleteStream) + delete os; + + for (size_t i = 0; i < lineBuffers.size(); i++) + delete lineBuffers[i]; +} + + +LineBuffer* +OutputFile::Data::getLineBuffer (int number) +{ + return lineBuffers[number % lineBuffers.size()]; +} + + +namespace { + + +Int64 +writeLineOffsets (OStream &os, const vector &lineOffsets) +{ + Int64 pos = os.tellp(); + + if (pos == -1) + Iex::throwErrnoExc ("Cannot determine current file position (%T)."); + + for (unsigned int i = 0; i < lineOffsets.size(); i++) + Xdr::write (os, lineOffsets[i]); + + return pos; +} + + +void +writePixelData (OutputFile::Data *ofd, + int lineBufferMinY, + const char pixelData[], + int pixelDataSize) +{ + // + // Store a block of pixel data in the output file, and try + // to keep track of the current writing position the file + // without calling tellp() (tellp() can be fairly expensive). + // + + Int64 currentPosition = ofd->currentPosition; + ofd->currentPosition = 0; + + if (currentPosition == 0) + currentPosition = ofd->os->tellp(); + + ofd->lineOffsets[(ofd->currentScanLine - ofd->minY) / ofd->linesInBuffer] = + currentPosition; + + #ifdef DEBUG + + assert (ofd->os->tellp() == currentPosition); + + #endif + + Xdr::write (*ofd->os, lineBufferMinY); + Xdr::write (*ofd->os, pixelDataSize); + ofd->os->write (pixelData, pixelDataSize); + + ofd->currentPosition = currentPosition + + Xdr::size() + + Xdr::size() + + pixelDataSize; +} + + +inline void +writePixelData (OutputFile::Data *ofd, const LineBuffer *lineBuffer) +{ + writePixelData (ofd, + lineBuffer->minY, + lineBuffer->dataPtr, + lineBuffer->dataSize); +} + + +void +convertToXdr (OutputFile::Data *ofd, + Array &lineBuffer, + int lineBufferMinY, + int lineBufferMaxY, + int inSize) +{ + // + // Convert the contents of a lineBuffer from the machine's native + // representation to Xdr format. This function is called by + // CompressLineBuffer::execute(), below, if the compressor wanted + // its input pixel data in the machine's native format, but then + // failed to compress the data (most compressors will expand rather + // than compress random input data). + // + // Note that this routine assumes that the machine's native + // representation of the pixel data has the same size as the + // Xdr representation. This makes it possible to convert the + // pixel data in place, without an intermediate temporary buffer. + // + + int startY, endY; // The first and last scanlines in + // the file that are in the lineBuffer. + int step; + + if (ofd->lineOrder == INCREASING_Y) + { + startY = max (lineBufferMinY, ofd->minY); + endY = min (lineBufferMaxY, ofd->maxY) + 1; + step = 1; + } + else + { + startY = min (lineBufferMaxY, ofd->maxY); + endY = max (lineBufferMinY, ofd->minY) - 1; + step = -1; + } + + // + // Iterate over all scanlines in the lineBuffer to convert. + // + + for (int y = startY; y != endY; y += step) + { + // + // Set these to point to the start of line y. + // We will write to writePtr from readPtr. + // + + char *writePtr = lineBuffer + ofd->offsetInLineBuffer[y - ofd->minY]; + const char *readPtr = writePtr; + + // + // Iterate over all slices in the file. + // + + for (unsigned int i = 0; i < ofd->slices.size(); ++i) + { + // + // Test if scan line y of this channel is + // contains any data (the scan line contains + // data only if y % ySampling == 0). + // + + const OutSliceInfo &slice = ofd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the number of sampled pixels, dMaxX-dMinX+1, for + // slice i in scan line y (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + int dMinX = divp (ofd->minX, slice.xSampling); + int dMaxX = divp (ofd->maxX, slice.xSampling); + + // + // Convert the samples in place. + // + + convertInPlace (writePtr, readPtr, slice.type, dMaxX - dMinX + 1); + } + } +} + + +// +// A LineBufferTask encapsulates the task of copying a set of scanlines +// from the user's frame buffer into a LineBuffer object, compressing +// the data if necessary. +// + +class LineBufferTask: public Task +{ + public: + + LineBufferTask (TaskGroup *group, + OutputFile::Data *ofd, + int number, + int scanLineMin, + int scanLineMax); + + virtual ~LineBufferTask (); + + virtual void execute (); + + private: + + OutputFile::Data * _ofd; + LineBuffer * _lineBuffer; +}; + + +LineBufferTask::LineBufferTask + (TaskGroup *group, + OutputFile::Data *ofd, + int number, + int scanLineMin, + int scanLineMax) +: + Task (group), + _ofd (ofd), + _lineBuffer (_ofd->getLineBuffer(number)) +{ + // + // Wait for the lineBuffer to become available + // + + _lineBuffer->wait (); + + // + // Initialize the lineBuffer data if necessary + // + + if (!_lineBuffer->partiallyFull) + { + _lineBuffer->endOfLineBufferData = _lineBuffer->buffer; + + _lineBuffer->minY = _ofd->minY + number * _ofd->linesInBuffer; + + _lineBuffer->maxY = min (_lineBuffer->minY + _ofd->linesInBuffer - 1, + _ofd->maxY); + + _lineBuffer->partiallyFull = true; + } + + _lineBuffer->scanLineMin = max (_lineBuffer->minY, scanLineMin); + _lineBuffer->scanLineMax = min (_lineBuffer->maxY, scanLineMax); +} + + +LineBufferTask::~LineBufferTask () +{ + // + // Signal that the line buffer is now free + // + + _lineBuffer->post (); +} + + +void +LineBufferTask::execute () +{ + try + { + // + // First copy the pixel data from the + // frame buffer into the line buffer + // + + int yStart, yStop, dy; + + if (_ofd->lineOrder == INCREASING_Y) + { + yStart = _lineBuffer->scanLineMin; + yStop = _lineBuffer->scanLineMax + 1; + dy = 1; + } + else + { + yStart = _lineBuffer->scanLineMax; + yStop = _lineBuffer->scanLineMin - 1; + dy = -1; + } + + int y; + + for (y = yStart; y != yStop; y += dy) + { + // + // Gather one scan line's worth of pixel data and store + // them in _ofd->lineBuffer. + // + + char *writePtr = _lineBuffer->buffer + + _ofd->offsetInLineBuffer[y - _ofd->minY]; + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ofd->slices.size(); ++i) + { + // + // Test if scan line y of this channel contains any data + // (the scan line contains data only if y % ySampling == 0). + // + + const OutSliceInfo &slice = _ofd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the x coordinates of the leftmost and rightmost + // sampled pixels (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + int dMinX = divp (_ofd->minX, slice.xSampling); + int dMaxX = divp (_ofd->maxX, slice.xSampling); + + // + // Fill the line buffer with with pixel data. + // + + if (slice.zero) + { + // + // The frame buffer contains no data for this channel. + // Store zeroes in _lineBuffer->buffer. + // + + fillChannelWithZeroes (writePtr, _ofd->format, slice.type, + dMaxX - dMinX + 1); + } + else + { + // + // If necessary, convert the pixel data to Xdr format. + // Then store the pixel data in _ofd->lineBuffer. + // + + const char *linePtr = slice.base + + divp (y, slice.ySampling) * + slice.yStride; + + const char *readPtr = linePtr + dMinX * slice.xStride; + const char *endPtr = linePtr + dMaxX * slice.xStride; + + copyFromFrameBuffer (writePtr, readPtr, endPtr, + slice.xStride, _ofd->format, + slice.type); + } + } + + if (_lineBuffer->endOfLineBufferData < writePtr) + _lineBuffer->endOfLineBufferData = writePtr; + + #ifdef DEBUG + + assert (writePtr - (_lineBuffer->buffer + + _ofd->offsetInLineBuffer[y - _ofd->minY]) == + (int) _ofd->bytesPerLine[y - _ofd->minY]); + + #endif + + } + + // + // If the next scanline isn't past the bounds of the lineBuffer + // then we are done, otherwise compress the linebuffer + // + + if (y >= _lineBuffer->minY && y <= _lineBuffer->maxY) + return; + + _lineBuffer->dataPtr = _lineBuffer->buffer; + + _lineBuffer->dataSize = _lineBuffer->endOfLineBufferData - + _lineBuffer->buffer; + + // + // Compress the data + // + + Compressor *compressor = _lineBuffer->compressor; + + if (compressor) + { + const char *compPtr; + + int compSize = compressor->compress (_lineBuffer->dataPtr, + _lineBuffer->dataSize, + _lineBuffer->minY, compPtr); + + if (compSize < _lineBuffer->dataSize) + { + _lineBuffer->dataSize = compSize; + _lineBuffer->dataPtr = compPtr; + } + else if (_ofd->format == Compressor::NATIVE) + { + // + // The data did not shrink during compression, but + // we cannot write to the file using the machine's + // native format, so we need to convert the lineBuffer + // to Xdr. + // + + convertToXdr (_ofd, _lineBuffer->buffer, _lineBuffer->minY, + _lineBuffer->maxY, _lineBuffer->dataSize); + } + } + + _lineBuffer->partiallyFull = false; + } + catch (std::exception &e) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = e.what (); + _lineBuffer->hasException = true; + } + } + catch (...) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = "unrecognized exception"; + _lineBuffer->hasException = true; + } + } +} + +} // namespace + + +OutputFile::OutputFile + (const char fileName[], + const Header &header, + int numThreads) +: + _data (new Data (true, numThreads)) +{ + try + { + header.sanityCheck(); + _data->os = new StdOFStream (fileName); + initialize (header); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +OutputFile::OutputFile + (OStream &os, + const Header &header, + int numThreads) +: + _data (new Data (false, numThreads)) +{ + try + { + header.sanityCheck(); + _data->os = &os; + initialize (header); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << os.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +void +OutputFile::initialize (const Header &header) +{ + _data->header = header; + + const Box2i &dataWindow = header.dataWindow(); + + _data->currentScanLine = (header.lineOrder() == INCREASING_Y)? + dataWindow.min.y: dataWindow.max.y; + + _data->missingScanLines = dataWindow.max.y - dataWindow.min.y + 1; + _data->lineOrder = header.lineOrder(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + size_t maxBytesPerLine = bytesPerLineTable (_data->header, + _data->bytesPerLine); + + for (size_t i = 0; i < _data->lineBuffers.size(); ++i) + { + _data->lineBuffers[i] = + new LineBuffer (newCompressor (_data->header.compression(), + maxBytesPerLine, + _data->header)); + } + + LineBuffer *lineBuffer = _data->lineBuffers[0]; + _data->format = defaultFormat (lineBuffer->compressor); + _data->linesInBuffer = numLinesInBuffer (lineBuffer->compressor); + _data->lineBufferSize = maxBytesPerLine * _data->linesInBuffer; + + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + _data->lineBuffers[i]->buffer.resizeErase(_data->lineBufferSize); + + int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + + _data->linesInBuffer) / _data->linesInBuffer; + + _data->lineOffsets.resize (lineOffsetSize); + + offsetInLineBufferTable (_data->bytesPerLine, + _data->linesInBuffer, + _data->offsetInLineBuffer); + + _data->previewPosition = + _data->header.writeTo (*_data->os); + + _data->lineOffsetsPosition = + writeLineOffsets (*_data->os, _data->lineOffsets); + + _data->currentPosition = _data->os->tellp(); +} + + +OutputFile::~OutputFile () +{ + if (_data) + { + { + if (_data->lineOffsetsPosition > 0) + { + try + { + _data->os->seekp (_data->lineOffsetsPosition); + writeLineOffsets (*_data->os, _data->lineOffsets); + } + catch (...) + { + // + // We cannot safely throw any exceptions from here. + // This destructor may have been called because the + // stack is currently being unwound for another + // exception. + // + } + } + } + + delete _data; + } +} + + +const char * +OutputFile::fileName () const +{ + return _data->os->fileName(); +} + + +const Header & +OutputFile::header () const +{ + return _data->header; +} + + +void +OutputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + Lock lock (*_data); + + // + // Check if the new frame buffer descriptor + // is compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + continue; + + if (i.channel().type != j.slice().type) + { + THROW (Iex::ArgExc, "Pixel type of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" is " + "not compatible with the frame buffer's " + "pixel type."); + } + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + { + THROW (Iex::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + } + + // + // Initialize slice table for writePixels(). + // + + vector slices; + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + { + // + // Channel i is not present in the frame buffer. + // In the file, channel i will contain only zeroes. + // + + slices.push_back (OutSliceInfo (i.channel().type, + 0, // base + 0, // xStride, + 0, // yStride, + i.channel().xSampling, + i.channel().ySampling, + true)); // zero + } + else + { + // + // Channel i is present in the frame buffer. + // + + slices.push_back (OutSliceInfo (j.slice().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + j.slice().xSampling, + j.slice().ySampling, + false)); // zero + } + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; +} + + +const FrameBuffer & +OutputFile::frameBuffer () const +{ + Lock lock (*_data); + return _data->frameBuffer; +} + + +void +OutputFile::writePixels (int numScanLines) +{ + try + { + Lock lock (*_data); + + if (_data->slices.size() == 0) + throw Iex::ArgExc ("No frame buffer specified " + "as pixel data source."); + + // + // Maintain two iterators: + // nextWriteBuffer: next linebuffer to be written to the file + // nextCompressBuffer: next linebuffer to compress + // + + int first = (_data->currentScanLine - _data->minY) / + _data->linesInBuffer; + + int nextWriteBuffer = first; + int nextCompressBuffer; + int stop; + int step; + int scanLineMin; + int scanLineMax; + + { + // + // Create a task group for all line buffer tasks. When the + // taskgroup goes out of scope, the destructor waits until + // all tasks are complete. + // + + TaskGroup taskGroup; + + // + // Determine the range of lineBuffers that intersect the scan + // line range. Then add the initial compression tasks to the + // thread pool. We always add in at least one task but the + // individual task might not do anything if numScanLines == 0. + // + + if (_data->lineOrder == INCREASING_Y) + { + int last = (_data->currentScanLine + (numScanLines - 1) - + _data->minY) / _data->linesInBuffer; + + scanLineMin = _data->currentScanLine; + scanLineMax = _data->currentScanLine + numScanLines - 1; + + int numTasks = max (min ((int)_data->lineBuffers.size(), + last - first + 1), + 1); + + for (int i = 0; i < numTasks; i++) + { + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, first + i, + scanLineMin, scanLineMax)); + } + + nextCompressBuffer = first + numTasks; + stop = last + 1; + step = 1; + } + else + { + int last = (_data->currentScanLine - (numScanLines - 1) - + _data->minY) / _data->linesInBuffer; + + scanLineMax = _data->currentScanLine; + scanLineMin = _data->currentScanLine - numScanLines + 1; + + int numTasks = max (min ((int)_data->lineBuffers.size(), + first - last + 1), + 1); + + for (int i = 0; i < numTasks; i++) + { + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, first - i, + scanLineMin, scanLineMax)); + } + + nextCompressBuffer = first - numTasks; + stop = last - 1; + step = -1; + } + + while (true) + { + if (_data->missingScanLines <= 0) + { + throw Iex::ArgExc ("Tried to write more scan lines " + "than specified by the data window."); + } + + // + // Wait until the next line buffer is ready to be written + // + + LineBuffer *writeBuffer = + _data->getLineBuffer (nextWriteBuffer); + + writeBuffer->wait(); + + int numLines = writeBuffer->scanLineMax - + writeBuffer->scanLineMin + 1; + + _data->missingScanLines -= numLines; + + // + // If the line buffer is only partially full, then it is + // not complete and we cannot write it to disk yet. + // + + if (writeBuffer->partiallyFull) + { + _data->currentScanLine = _data->currentScanLine + + step * numLines; + writeBuffer->post(); + + return; + } + + // + // Write the line buffer + // + + writePixelData (_data, writeBuffer); + nextWriteBuffer += step; + + _data->currentScanLine = _data->currentScanLine + + step * numLines; + + #ifdef DEBUG + + assert (_data->currentScanLine == + ((_data->lineOrder == INCREASING_Y) ? + writeBuffer->scanLineMax + 1: + writeBuffer->scanLineMin - 1)); + + #endif + + // + // Release the lock on the line buffer + // + + writeBuffer->post(); + + // + // If this was the last line buffer in the scanline range + // + + if (nextWriteBuffer == stop) + break; + + // + // If there are no more line buffers to compress, + // then only continue to write out remaining lineBuffers + // + + if (nextCompressBuffer == stop) + continue; + + // + // Add nextCompressBuffer as a compression task + // + + ThreadPool::addGlobalTask + (new LineBufferTask (&taskGroup, _data, nextCompressBuffer, + scanLineMin, scanLineMax)); + + // + // Update the next line buffer we need to compress + // + + nextCompressBuffer += step; + } + + // + // Finish all tasks + // + } + + // + // Exeption handling: + // + // LineBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to OutputFile::writePixels(). + // LineBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the line buffers. + // Now we check if any line buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple line buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (int i = 0; i < _data->lineBuffers.size(); ++i) + { + LineBuffer *lineBuffer = _data->lineBuffers[i]; + + if (lineBuffer->hasException && !exception) + exception = &lineBuffer->exception; + + lineBuffer->hasException = false; + } + + if (exception) + throw Iex::IoExc (*exception); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Failed to write pixel data to image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +OutputFile::currentScanLine () const +{ + Lock lock (*_data); + return _data->currentScanLine; +} + + +void +OutputFile::copyPixels (InputFile &in) +{ + Lock lock (*_data); + + // + // Check if this file's and and the InputFile's + // headers are compatible. + // + + const Header &hdr = _data->header; + const Header &inHdr = in.header(); + + if (inHdr.find("tiles") != inHdr.end()) + THROW (Iex::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". " + "The input file is tiled, but the output file is " + "not. Try using TiledOutputFile::copyPixels " + "instead."); + + if (!(hdr.dataWindow() == inHdr.dataWindow())) + THROW (Iex::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". " + "The files have different data windows."); + + if (!(hdr.lineOrder() == inHdr.lineOrder())) + THROW (Iex::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different line orders."); + + if (!(hdr.compression() == inHdr.compression())) + THROW (Iex::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files use different compression methods."); + + if (!(hdr.channels() == inHdr.channels())) + THROW (Iex::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different channel lists."); + + // + // Verify that no pixel data have been written to this file yet. + // + + const Box2i &dataWindow = hdr.dataWindow(); + + if (_data->missingScanLines != dataWindow.max.y - dataWindow.min.y + 1) + THROW (Iex::LogicExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "\"" << fileName() << "\" already contains " + "pixel data."); + + // + // Copy the pixel data. + // + + while (_data->missingScanLines > 0) + { + const char *pixelData; + int pixelDataSize; + + in.rawPixelData (_data->currentScanLine, pixelData, pixelDataSize); + + writePixelData (_data, lineBufferMinY (_data->currentScanLine, + _data->minY, + _data->linesInBuffer), + pixelData, pixelDataSize); + + _data->currentScanLine += (_data->lineOrder == INCREASING_Y)? + _data->linesInBuffer: -_data->linesInBuffer; + + _data->missingScanLines -= _data->linesInBuffer; + } +} + + +void +OutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + Lock lock (*_data); + + if (_data->previewPosition <= 0) + THROW (Iex::LogicExc, "Cannot update preview image pixels. " + "File \"" << fileName() << "\" does not " + "contain a preview image."); + + // + // Store the new pixels in the header's preview image attribute. + // + + PreviewImageAttribute &pia = + _data->header.typedAttribute ("preview"); + + PreviewImage &pi = pia.value(); + PreviewRgba *pixels = pi.pixels(); + int numPixels = pi.width() * pi.height(); + + for (int i = 0; i < numPixels; ++i) + pixels[i] = newPixels[i]; + + // + // Save the current file position, jump to the position in + // the file where the preview image starts, store the new + // preview image, and jump back to the saved file position. + // + + Int64 savedPosition = _data->os->tellp(); + + try + { + _data->os->seekp (_data->previewPosition); + pia.writeValueTo (*_data->os, _data->version); + _data->os->seekp (savedPosition); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Cannot update preview image pixels for " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +OutputFile::breakScanLine (int y, int offset, int length, char c) +{ + Lock lock (*_data); + + Int64 position = + _data->lineOffsets[(y - _data->minY) / _data->linesInBuffer]; + + if (!position) + THROW (Iex::ArgExc, "Cannot overwrite scan line " << y << ". " + "The scan line has not yet been stored in " + "file \"" << fileName() << "\"."); + + _data->currentPosition = 0; + _data->os->seekp (position + offset); + + for (int i = 0; i < length; ++i) + _data->os->write (&c, 1); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfOutputFile.h b/3rdparty/openexr/IlmImf/ImfOutputFile.h new file mode 100644 index 000000000..bdc317a48 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfOutputFile.h @@ -0,0 +1,241 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_OUTPUT_FILE_H +#define INCLUDED_IMF_OUTPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class OutputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +namespace Imf { + +class InputFile; +struct PreviewRgba; + + +class OutputFile +{ + public: + + //----------------------------------------------------------- + // Constructor -- opens the file and writes the file header. + // The file header is also copied into the OutputFile object, + // and can later be accessed via the header() method. + // Destroying this OutputFile object automatically closes + // the file. + // + // numThreads determines the number of threads that will be + // used to write the file (see ImfThreading.h). + //----------------------------------------------------------- + + OutputFile (const char fileName[], const Header &header, + int numThreads = globalThreadCount()); + + + //------------------------------------------------------------ + // Constructor -- attaches the new OutputFile object to a file + // that has already been opened, and writes the file header. + // The file header is also copied into the OutputFile object, + // and can later be accessed via the header() method. + // Destroying this OutputFile object does not automatically + // close the file. + // + // numThreads determines the number of threads that will be + // used to write the file (see ImfThreading.h). + //------------------------------------------------------------ + + OutputFile (OStream &os, const Header &header, + int numThreads = globalThreadCount()); + + + //------------------------------------------------- + // Destructor + // + // Destroying the OutputFile object before writing + // all scan lines within the data window results in + // an incomplete file. + //------------------------------------------------- + + virtual ~OutputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the OutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writePixels() is + // called. The current frame buffer can be changed + // after each call to writePixels. + //------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------------- + // Write pixel data: + // + // writePixels(n) retrieves the next n scan lines worth of data from + // the current frame buffer, starting with the scan line indicated by + // currentScanLine(), and stores the data in the output file, and + // progressing in the direction indicated by header.lineOrder(). + // + // To produce a complete and correct file, exactly m scan lines must + // be written, where m is equal to + // header().dataWindow().max.y - header().dataWindow().min.y + 1. + //------------------------------------------------------------------- + + void writePixels (int numScanLines = 1); + + + //------------------------------------------------------------------ + // Access to the current scan line: + // + // currentScanLine() returns the y coordinate of the first scan line + // that will be read from the current frame buffer during the next + // call to writePixels(). + // + // If header.lineOrder() == INCREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().min.y. After writing each scan line, + // the current scan line is incremented by 1. + // + // If header.lineOrder() == DECREASING_Y: + // + // The current scan line before the first call to writePixels() + // is header().dataWindow().max.y. After writing each scan line, + // the current scan line is decremented by 1. + // + //------------------------------------------------------------------ + + int currentScanLine () const; + + + //-------------------------------------------------------------- + // Shortcut to copy all pixels from an InputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the InputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder" and "channels" attributes must be the same. + //-------------------------------------------------------------- + + void copyPixels (InputFile &in); + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an Iex::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few scan lines at a + // time, while the image is being generated. Since the preview + // image is an attribute in the file's header, it gets stored in + // the file as soon as the file is opened, but we may not know + // what the preview image should look like until we have written + // the last scan line of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + + //--------------------------------------------------------- + // Break a scan line -- for testing and debugging only: + // + // breakScanLine(y,p,n,c) introduces an error into the + // output file by writing n copies of character c, starting + // p bytes from the beginning of the pixel data block that + // contains scan line y. + // + // Warning: Calling this function usually results in a + // broken image file. The file or parts of it may not + // be readable, or the file may contain bad data. + // + //--------------------------------------------------------- + + void breakScanLine (int y, int offset, int length, char c); + + + struct Data; + + private: + + OutputFile (const OutputFile &); // not implemented + OutputFile & operator = (const OutputFile &); // not implemented + + void initialize (const Header &header); + + Data * _data; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfPixelType.h b/3rdparty/openexr/IlmImf/ImfPixelType.h new file mode 100644 index 000000000..8f504efa2 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPixelType.h @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_PIXEL_TYPE_H +#define INCLUDED_IMF_PIXEL_TYPE_H + +//----------------------------------------------------------------------------- +// +// enum PixelType +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +enum PixelType +{ + UINT = 0, // unsigned int (32 bit) + HALF = 1, // half (16 bit floating point) + FLOAT = 2, // float (32 bit floating point) + + NUM_PIXELTYPES // number of different pixel types +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfPizCompressor.cpp b/3rdparty/openexr/IlmImf/ImfPizCompressor.cpp new file mode 100644 index 000000000..9ceb8c62a --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPizCompressor.cpp @@ -0,0 +1,666 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class PizCompressor +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Imf { + +using Imath::divp; +using Imath::modp; +using Imath::Box2i; +using Imath::V2i; +using Iex::InputExc; + +namespace { + +// +// Functions to compress the range of values in the pixel data +// + +const int USHORT_RANGE = (1 << 16); +const int BITMAP_SIZE = (USHORT_RANGE >> 3); + +void +bitmapFromData (const unsigned short data[/*nData*/], + int nData, + unsigned char bitmap[BITMAP_SIZE], + unsigned short &minNonZero, + unsigned short &maxNonZero) +{ + for (int i = 0; i < BITMAP_SIZE; ++i) + bitmap[i] = 0; + + for (int i = 0; i < nData; ++i) + bitmap[data[i] >> 3] |= (1 << (data[i] & 7)); + + bitmap[0] &= ~1; // zero is not explicitly stored in + // the bitmap; we assume that the + // data always contain zeroes + minNonZero = BITMAP_SIZE - 1; + maxNonZero = 0; + + for (int i = 0; i < BITMAP_SIZE; ++i) + { + if (bitmap[i]) + { + if (minNonZero > i) + minNonZero = i; + if (maxNonZero < i) + maxNonZero = i; + } + } +} + + +unsigned short +forwardLutFromBitmap (const unsigned char bitmap[BITMAP_SIZE], + unsigned short lut[USHORT_RANGE]) +{ + int k = 0; + + for (int i = 0; i < USHORT_RANGE; ++i) + { + if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) + lut[i] = k++; + else + lut[i] = 0; + } + + return k - 1; // maximum value stored in lut[], +} // i.e. number of ones in bitmap minus 1 + + +unsigned short +reverseLutFromBitmap (const unsigned char bitmap[BITMAP_SIZE], + unsigned short lut[USHORT_RANGE]) +{ + int k = 0; + + for (int i = 0; i < USHORT_RANGE; ++i) + { + if ((i == 0) || (bitmap[i >> 3] & (1 << (i & 7)))) + lut[k++] = i; + } + + int n = k - 1; + + while (k < USHORT_RANGE) + lut[k++] = 0; + + return n; // maximum k where lut[k] is non-zero, +} // i.e. number of ones in bitmap minus 1 + + +void +applyLut (const unsigned short lut[USHORT_RANGE], + unsigned short data[/*nData*/], + int nData) +{ + for (int i = 0; i < nData; ++i) + data[i] = lut[data[i]]; +} + + +} // namespace + + +struct PizCompressor::ChannelData +{ + unsigned short * start; + unsigned short * end; + int nx; + int ny; + int ys; + int size; +}; + + +PizCompressor::PizCompressor + (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _format (XDR), + _numScanLines (numScanLines), + _tmpBuffer (0), + _outBuffer (0), + _numChans (0), + _channels (hdr.channels()), + _channelData (0) +{ + size_t tmpBufferSize = + uiMult (maxScanLineSize, numScanLines) / 2; + + size_t outBufferSize = + uiAdd (uiMult (maxScanLineSize, numScanLines), + size_t (65536 + 8192)); + + _tmpBuffer = new unsigned short + [checkArraySize (tmpBufferSize, sizeof (unsigned short))]; + + _outBuffer = new char [outBufferSize]; + + const ChannelList &channels = header().channels(); + bool onlyHalfChannels = true; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + _numChans++; + + assert (pixelTypeSize (c.channel().type) % pixelTypeSize (HALF) == 0); + + if (c.channel().type != HALF) + onlyHalfChannels = false; + } + + _channelData = new ChannelData[_numChans]; + + const Box2i &dataWindow = hdr.dataWindow(); + + _minX = dataWindow.min.x; + _maxX = dataWindow.max.x; + _maxY = dataWindow.max.y; + + // + // We can support uncompressed data in the machine's native format + // if all image channels are of type HALF, and if the Xdr and the + // native represenations of a half have the same size. + // + + if (onlyHalfChannels && (sizeof (half) == pixelTypeSize (HALF))) + _format = NATIVE; +} + + +PizCompressor::~PizCompressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; + delete [] _channelData; +} + + +int +PizCompressor::numScanLines () const +{ + return _numScanLines; +} + + +Compressor::Format +PizCompressor::format () const +{ + return _format; +} + + +int +PizCompressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return compress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +PizCompressor::compressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range, outPtr); +} + + +int +PizCompressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return uncompress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + numScanLines() - 1)), + outPtr); +} + + +int +PizCompressor::uncompressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range, outPtr); +} + + +int +PizCompressor::compress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + // + // This is the compress function which is used by both the tiled and + // scanline compression routines. + // + + // + // Special case ­- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Rearrange the pixel data so that the wavelet + // and Huffman encoders can process them easily. + // + // The wavelet and Huffman encoders both handle only + // 16-bit data, so 32-bit data must be split into smaller + // pieces. We treat each 32-bit channel (UINT, FLOAT) as + // two interleaved 16-bit channels. + // + + int minX = range.min.x; + int maxX = range.max.x; + int minY = range.min.y; + int maxY = range.max.y; + + if (maxY > _maxY) + maxY = _maxY; + + if (maxX > _maxX) + maxX = _maxX; + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + cd.ys = c.channel().ySampling; + + cd.size = pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + if (_format == XDR) + { + // + // Machine-independent (Xdr) data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + for (int x = cd.nx * cd.size; x > 0; --x) + { + Xdr::read (inPtr, *cd.end); + ++cd.end; + } + } + } + } + else + { + // + // Native, machine-dependent data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (cd.end, inPtr, n * sizeof (unsigned short)); + inPtr += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + // + // Compress the range of the pixel data + // + + AutoArray bitmap; + unsigned short minNonZero; + unsigned short maxNonZero; + + bitmapFromData (_tmpBuffer, + tmpBufferEnd - _tmpBuffer, + bitmap, + minNonZero, maxNonZero); + + AutoArray lut; + unsigned short maxValue = forwardLutFromBitmap (bitmap, lut); + applyLut (lut, _tmpBuffer, tmpBufferEnd - _tmpBuffer); + + // + // Store range compression info in _outBuffer + // + + char *buf = _outBuffer; + + Xdr::write (buf, minNonZero); + Xdr::write (buf, maxNonZero); + + if (minNonZero <= maxNonZero) + { + Xdr::write (buf, (char *) &bitmap[0] + minNonZero, + maxNonZero - minNonZero + 1); + } + + // + // Apply wavelet encoding + // + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + for (int j = 0; j < cd.size; ++j) + { + wav2Encode (cd.start + j, + cd.nx, cd.size, + cd.ny, cd.nx * cd.size, + maxValue); + } + } + + // + // Apply Huffman encoding; append the result to _outBuffer + // + + char *lengthPtr = buf; + Xdr::write (buf, int(0)); + + int length = hufCompress (_tmpBuffer, tmpBufferEnd - _tmpBuffer, buf); + Xdr::write (lengthPtr, length); + + outPtr = _outBuffer; + return buf - _outBuffer + length; +} + + +int +PizCompressor::uncompress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr) +{ + // + // This is the cunompress function which is used by both the tiled and + // scanline decompression routines. + // + + // + // Special case - empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Determine the layout of the compressed pixel data + // + + int minX = range.min.x; + int maxX = range.max.x; + int minY = range.min.y; + int maxY = range.max.y; + + if (maxY > _maxY) + maxY = _maxY; + + if (maxX > _maxX) + maxX = _maxX; + + unsigned short *tmpBufferEnd = _tmpBuffer; + int i = 0; + + for (ChannelList::ConstIterator c = _channels.begin(); + c != _channels.end(); + ++c, ++i) + { + ChannelData &cd = _channelData[i]; + + cd.start = tmpBufferEnd; + cd.end = cd.start; + + cd.nx = numSamples (c.channel().xSampling, minX, maxX); + cd.ny = numSamples (c.channel().ySampling, minY, maxY); + cd.ys = c.channel().ySampling; + + cd.size = pixelTypeSize (c.channel().type) / pixelTypeSize (HALF); + + tmpBufferEnd += cd.nx * cd.ny * cd.size; + } + + // + // Read range compression data + // + + unsigned short minNonZero; + unsigned short maxNonZero; + + AutoArray bitmap; + memset (bitmap, 0, sizeof (unsigned char) * BITMAP_SIZE); + + Xdr::read (inPtr, minNonZero); + Xdr::read (inPtr, maxNonZero); + + if (maxNonZero >= BITMAP_SIZE) + { + throw InputExc ("Error in header for PIZ-compressed data " + "(invalid bitmap size)."); + } + + if (minNonZero <= maxNonZero) + { + Xdr::read (inPtr, (char *) &bitmap[0] + minNonZero, + maxNonZero - minNonZero + 1); + } + + AutoArray lut; + unsigned short maxValue = reverseLutFromBitmap (bitmap, lut); + + // + // Huffman decoding + // + + int length; + Xdr::read (inPtr, length); + + hufUncompress (inPtr, length, _tmpBuffer, tmpBufferEnd - _tmpBuffer); + + // + // Wavelet decoding + // + + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + for (int j = 0; j < cd.size; ++j) + { + wav2Decode (cd.start + j, + cd.nx, cd.size, + cd.ny, cd.nx * cd.size, + maxValue); + } + } + + // + // Expand the pixel data to their original range + // + + applyLut (lut, _tmpBuffer, tmpBufferEnd - _tmpBuffer); + + // + // Rearrange the pixel data into the format expected by the caller. + // + + char *outEnd = _outBuffer; + + if (_format == XDR) + { + // + // Machine-independent (Xdr) data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + for (int x = cd.nx * cd.size; x > 0; --x) + { + Xdr::write (outEnd, *cd.end); + ++cd.end; + } + } + } + } + else + { + // + // Native, machine-dependent data format + // + + for (int y = minY; y <= maxY; ++y) + { + for (int i = 0; i < _numChans; ++i) + { + ChannelData &cd = _channelData[i]; + + if (modp (y, cd.ys) != 0) + continue; + + int n = cd.nx * cd.size; + memcpy (outEnd, cd.end, n * sizeof (unsigned short)); + outEnd += n * sizeof (unsigned short); + cd.end += n; + } + } + } + + #if defined (DEBUG) + + for (int i = 1; i < _numChans; ++i) + assert (_channelData[i-1].end == _channelData[i].start); + + assert (_channelData[_numChans-1].end == tmpBufferEnd); + + #endif + + outPtr = _outBuffer; + return outEnd - _outBuffer; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfPizCompressor.h b/3rdparty/openexr/IlmImf/ImfPizCompressor.h new file mode 100644 index 000000000..0945a8c90 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPizCompressor.h @@ -0,0 +1,115 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_PIZ_COMPRESSOR_H +#define INCLUDED_IMF_PIZ_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class PizCompressor -- uses Wavelet and Huffman encoding. +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + +class ChannelList; + + +class PizCompressor: public Compressor +{ + public: + + PizCompressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines); + + virtual ~PizCompressor (); + + virtual int numScanLines () const; + + virtual Format format () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int compressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + private: + + struct ChannelData; + + int compress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + int uncompress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + int _maxScanLineSize; + Format _format; + int _numScanLines; + unsigned short * _tmpBuffer; + char * _outBuffer; + int _numChans; + const ChannelList & _channels; + ChannelData * _channelData; + int _minX; + int _maxX; + int _maxY; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfPreviewImage.cpp b/3rdparty/openexr/IlmImf/ImfPreviewImage.cpp new file mode 100644 index 000000000..d47d931d7 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPreviewImage.cpp @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class PreviewImage +// +//----------------------------------------------------------------------------- + +#include +#include +#include "Iex.h" + +namespace Imf { + + +PreviewImage::PreviewImage (unsigned int width, + unsigned int height, + const PreviewRgba pixels[]) +{ + _width = width; + _height = height; + _pixels = new PreviewRgba + [checkArraySize (uiMult (_width, _height), sizeof (PreviewRgba))]; + + if (pixels) + { + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = pixels[i]; + } + else + { + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = PreviewRgba(); + } +} + + +PreviewImage::PreviewImage (const PreviewImage &other): + _width (other._width), + _height (other._height), + _pixels (new PreviewRgba [other._width * other._height]) +{ + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = other._pixels[i]; +} + + +PreviewImage::~PreviewImage () +{ + delete [] _pixels; +} + + +PreviewImage & +PreviewImage::operator = (const PreviewImage &other) +{ + delete [] _pixels; + + _width = other._width; + _height = other._height; + _pixels = new PreviewRgba [other._width * other._height]; + + for (unsigned int i = 0; i < _width * _height; ++i) + _pixels[i] = other._pixels[i]; + + return *this; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfPreviewImage.h b/3rdparty/openexr/IlmImf/ImfPreviewImage.h new file mode 100644 index 000000000..d01662039 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPreviewImage.h @@ -0,0 +1,131 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_PREVIEW_IMAGE_H +#define INCLUDED_IMF_PREVIEW_IMAGE_H + +//----------------------------------------------------------------------------- +// +// class PreviewImage -- a usually small, low-dynamic range image, +// that is intended to be stored in an image file's header. +// +// struct PreviewRgba -- holds the value of a PreviewImage pixel. +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +struct PreviewRgba +{ + unsigned char r; // Red, green and blue components of + unsigned char g; // the pixel's color; intensity is + unsigned char b; // proportional to pow (x/255, 2.2), + // where x is r, g, or b. + + unsigned char a; // The pixel's alpha; 0 == transparent, + // 255 == opaque. + + PreviewRgba (unsigned char r = 0, + unsigned char g = 0, + unsigned char b = 0, + unsigned char a = 255) + : r(r), g(g), b(b), a(a) {} +}; + + +class PreviewImage +{ + public: + + //-------------------------------------------------------------------- + // Constructor: + // + // PreviewImage(w,h,p) constructs a preview image with w by h pixels + // whose initial values are specified in pixel array p. The x and y + // coordinates of the pixels in p go from 0 to w-1, and from 0 to h-1. + // The pixel with coordinates (x, y) is at address p + y*w + x. + // Pixel (0, 0) is in the upper left corner of the preview image. + // If p is zero, the pixels in the preview image are initialized with + // (r = 0, b = 0, g = 0, a = 255). + // + //-------------------------------------------------------------------- + + PreviewImage (unsigned int width = 0, + unsigned int height = 0, + const PreviewRgba pixels[] = 0); + + //----------------------------------------------------- + // Copy constructor, destructor and assignment operator + //----------------------------------------------------- + + PreviewImage (const PreviewImage &other); + ~PreviewImage (); + + PreviewImage & operator = (const PreviewImage &other); + + + //----------------------------------------------- + // Access to width, height and to the pixel array + //----------------------------------------------- + + unsigned int width () const {return _width;} + unsigned int height () const {return _height;} + + PreviewRgba * pixels () {return _pixels;} + const PreviewRgba * pixels () const {return _pixels;} + + + //---------------------------- + // Access to individual pixels + //---------------------------- + + PreviewRgba & pixel (unsigned int x, unsigned int y) + {return _pixels[y * _width + x];} + + const PreviewRgba & pixel (unsigned int x, unsigned int y) const + {return _pixels[y * _width + x];} + + private: + + unsigned int _width; + unsigned int _height; + PreviewRgba * _pixels; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp b/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp new file mode 100644 index 000000000..476c75678 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class PreviewImageAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +PreviewImageAttribute::staticTypeName () +{ + return "preview"; +} + + +template <> +void +PreviewImageAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.width()); + Xdr::write (os, _value.height()); + + int numPixels = _value.width() * _value.height(); + const PreviewRgba *pixels = _value.pixels(); + + for (int i = 0; i < numPixels; ++i) + { + Xdr::write (os, pixels[i].r); + Xdr::write (os, pixels[i].g); + Xdr::write (os, pixels[i].b); + Xdr::write (os, pixels[i].a); + } +} + + +template <> +void +PreviewImageAttribute::readValueFrom (IStream &is, int size, int version) +{ + int width, height; + + Xdr::read (is, width); + Xdr::read (is, height); + + PreviewImage p (width, height); + + int numPixels = p.width() * p.height(); + PreviewRgba *pixels = p.pixels(); + + for (int i = 0; i < numPixels; ++i) + { + Xdr::read (is, pixels[i].r); + Xdr::read (is, pixels[i].g); + Xdr::read (is, pixels[i].b); + Xdr::read (is, pixels[i].a); + } + + _value = p; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.h b/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.h new file mode 100644 index 000000000..f08b9b7b9 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_PREVIEW_IMAGE_ATTRIBUTE_H +#define INCLUDED_IMF_PREVIEW_IMAGE_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class PreviewImageAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute PreviewImageAttribute; + +template <> +const char *PreviewImageAttribute::staticTypeName (); + +template <> +void PreviewImageAttribute::writeValueTo (OStream &, int) const; + +template <> +void PreviewImageAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp b/3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp new file mode 100644 index 000000000..270facfce --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp @@ -0,0 +1,550 @@ +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Pixar Animation Studios +// +// 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 Pixar Animation Studios 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. +// +///////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Pxr24Compressor +// +// This compressor is based on source code that was contributed to +// OpenEXR by Pixar Animation Studios. The compression method was +// developed by Loren Carpenter. +// +// The compressor preprocesses the pixel data to reduce entropy, +// and then calls zlib. +// +// Compression of HALF and UINT channels is lossless, but compressing +// FLOAT channels is lossy: 32-bit floating-point numbers are converted +// to 24 bits by rounding the significand to 15 bits. +// +// When the compressor is invoked, the caller has already arranged +// the pixel data so that the values for each channel appear in a +// contiguous block of memory. The compressor converts the pixel +// values to unsigned integers: For UINT, this is a no-op. HALF +// values are simply re-interpreted as 16-bit integers. FLOAT +// values are converted to 24 bits, and the resulting bit patterns +// are interpreted as integers. The compressor then replaces each +// value with the difference between the value and its left neighbor. +// This turns flat fields in the image into zeroes, and ramps into +// strings of similar values. Next, each difference is split into +// 2, 3 or 4 bytes, and the bytes are transposed so that all the +// most significant bytes end up in a contiguous block, followed +// by the second most significant bytes, and so on. The resulting +// string of bytes is compressed with zlib. +// +//----------------------------------------------------------------------------- +#define ZLIB_WINAPI + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace Imath; + +namespace Imf { +namespace { + +// +// Conversion from 32-bit to 24-bit floating-point numbers. +// Conversion back to 32 bits is simply an 8-bit shift to the left. +// + +inline unsigned int +floatToFloat24 (float f) +{ + union + { + float f; + unsigned int i; + } u; + + u.f = f; + + // + // Disassemble the 32-bit floating point number, f, + // into sign, s, exponent, e, and significand, m. + // + + unsigned int s = u.i & 0x80000000; + unsigned int e = u.i & 0x7f800000; + unsigned int m = u.i & 0x007fffff; + unsigned int i; + + if (e == 0x7f800000) + { + if (m) + { + // + // F is a NAN; we preserve the sign bit and + // the 15 leftmost bits of the significand, + // with one exception: If the 15 leftmost + // bits are all zero, the NAN would turn + // into an infinity, so we have to set at + // least one bit in the significand. + // + + m >>= 8; + i = (e >> 8) | m | (m == 0); + } + else + { + // + // F is an infinity. + // + + i = e >> 8; + } + } + else + { + // + // F is finite, round the significand to 15 bits. + // + + i = ((e | m) + (m & 0x00000080)) >> 8; + + if (i >= 0x7f8000) + { + // + // F was close to FLT_MAX, and the significand was + // rounded up, resulting in an exponent overflow. + // Avoid the overflow by truncating the significand + // instead of rounding it. + // + + i = (e | m) >> 8; + } + } + + return (s >> 8) | i; +} + + +void +notEnoughData () +{ + throw Iex::InputExc ("Error decompressing data " + "(input data are shorter than expected)."); +} + + +void +tooMuchData () +{ + throw Iex::InputExc ("Error decompressing data " + "(input data are longer than expected)."); +} + +} // namespace + + +Pxr24Compressor::Pxr24Compressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _numScanLines (numScanLines), + _tmpBuffer (0), + _outBuffer (0), + _channels (hdr.channels()) +{ + size_t maxInBytes = + uiMult (maxScanLineSize, numScanLines); + + size_t maxOutBytes = + uiAdd (uiAdd (maxInBytes, + size_t (ceil (maxInBytes * 0.01))), + size_t (100)); + + _tmpBuffer = new unsigned char [maxInBytes]; + _outBuffer = new char [maxOutBytes]; + + const Box2i &dataWindow = hdr.dataWindow(); + + _minX = dataWindow.min.x; + _maxX = dataWindow.max.x; + _maxY = dataWindow.max.y; +} + + +Pxr24Compressor::~Pxr24Compressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; +} + + +int +Pxr24Compressor::numScanLines () const +{ + return _numScanLines; +} + + +Compressor::Format +Pxr24Compressor::format () const +{ + return NATIVE; +} + + +int +Pxr24Compressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return compress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + _numScanLines - 1)), + outPtr); +} + + +int +Pxr24Compressor::compressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return compress (inPtr, inSize, range, outPtr); +} + + +int +Pxr24Compressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + return uncompress (inPtr, + inSize, + Box2i (V2i (_minX, minY), + V2i (_maxX, minY + _numScanLines - 1)), + outPtr); +} + + +int +Pxr24Compressor::uncompressTile (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + return uncompress (inPtr, inSize, range, outPtr); +} + + +int +Pxr24Compressor::compress (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + unsigned char *tmpBufferEnd = _tmpBuffer; + + for (int y = minY; y <= maxY; ++y) + { + for (ChannelList::ConstIterator i = _channels.begin(); + i != _channels.end(); + ++i) + { + const Channel &c = i.channel(); + + if (modp (y, c.ySampling) != 0) + continue; + + int n = numSamples (c.xSampling, minX, maxX); + + unsigned char *ptr[4]; + unsigned int previousPixel = 0; + + switch (c.type) + { + case UINT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + ptr[3] = ptr[2] + n; + tmpBufferEnd = ptr[3] + n; + + for (int j = 0; j < n; ++j) + { + unsigned int pixel; + char *pPtr = (char *) &pixel; + + for (int k = 0; k < sizeof (pixel); ++k) + *pPtr++ = *inPtr++; + + unsigned int diff = pixel - previousPixel; + previousPixel = pixel; + + *(ptr[0]++) = diff >> 24; + *(ptr[1]++) = diff >> 16; + *(ptr[2]++) = diff >> 8; + *(ptr[3]++) = diff; + } + + break; + + case HALF: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + tmpBufferEnd = ptr[1] + n; + + for (int j = 0; j < n; ++j) + { + half pixel; + + pixel = *(const half *) inPtr; + inPtr += sizeof (half); + + unsigned int diff = pixel.bits() - previousPixel; + previousPixel = pixel.bits(); + + *(ptr[0]++) = diff >> 8; + *(ptr[1]++) = diff; + } + + break; + + case FLOAT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + tmpBufferEnd = ptr[2] + n; + + for (int j = 0; j < n; ++j) + { + float pixel; + char *pPtr = (char *) &pixel; + + for (int k = 0; k < sizeof (pixel); ++k) + *pPtr++ = *inPtr++; + + unsigned int pixel24 = floatToFloat24 (pixel); + unsigned int diff = pixel24 - previousPixel; + previousPixel = pixel24; + + *(ptr[0]++) = diff >> 16; + *(ptr[1]++) = diff >> 8; + *(ptr[2]++) = diff; + } + + break; + + default: + + assert (false); + } + } + } + + uLongf outSize = int (ceil ((tmpBufferEnd - _tmpBuffer) * 1.01)) + 100; + + if (Z_OK != ::compress ((Bytef *) _outBuffer, + &outSize, + (const Bytef *) _tmpBuffer, + tmpBufferEnd - _tmpBuffer)) + { + throw Iex::BaseExc ("Data compression (zlib) failed."); + } + + outPtr = _outBuffer; + return outSize; +} + + +int +Pxr24Compressor::uncompress (const char *inPtr, + int inSize, + Box2i range, + const char *&outPtr) +{ + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + uLongf tmpSize = _maxScanLineSize * _numScanLines; + + if (Z_OK != ::uncompress ((Bytef *)_tmpBuffer, + &tmpSize, + (const Bytef *) inPtr, + inSize)) + { + throw Iex::InputExc ("Data decompression (zlib) failed."); + } + + int minX = range.min.x; + int maxX = min (range.max.x, _maxX); + int minY = range.min.y; + int maxY = min (range.max.y, _maxY); + + const unsigned char *tmpBufferEnd = _tmpBuffer; + char *writePtr = _outBuffer; + + for (int y = minY; y <= maxY; ++y) + { + for (ChannelList::ConstIterator i = _channels.begin(); + i != _channels.end(); + ++i) + { + const Channel &c = i.channel(); + + if (modp (y, c.ySampling) != 0) + continue; + + int n = numSamples (c.xSampling, minX, maxX); + + const unsigned char *ptr[4]; + unsigned int pixel = 0; + + switch (c.type) + { + case UINT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + ptr[3] = ptr[2] + n; + tmpBufferEnd = ptr[3] + n; + + if (tmpBufferEnd - _tmpBuffer > tmpSize) + notEnoughData(); + + for (int j = 0; j < n; ++j) + { + unsigned int diff = (*(ptr[0]++) << 24) | + (*(ptr[1]++) << 16) | + (*(ptr[2]++) << 8) | + *(ptr[3]++); + + pixel += diff; + + char *pPtr = (char *) &pixel; + + for (int k = 0; k < sizeof (pixel); ++k) + *writePtr++ = *pPtr++; + } + + break; + + case HALF: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + tmpBufferEnd = ptr[1] + n; + + if (tmpBufferEnd - _tmpBuffer > tmpSize) + notEnoughData(); + + for (int j = 0; j < n; ++j) + { + unsigned int diff = (*(ptr[0]++) << 8) | + *(ptr[1]++); + + pixel += diff; + + half * hPtr = (half *) writePtr; + hPtr->setBits ((unsigned short) pixel); + writePtr += sizeof (half); + } + + break; + + case FLOAT: + + ptr[0] = tmpBufferEnd; + ptr[1] = ptr[0] + n; + ptr[2] = ptr[1] + n; + tmpBufferEnd = ptr[2] + n; + + if (tmpBufferEnd - _tmpBuffer > tmpSize) + notEnoughData(); + + for (int j = 0; j < n; ++j) + { + unsigned int diff = (*(ptr[0]++) << 24) | + (*(ptr[1]++) << 16) | + (*(ptr[2]++) << 8); + pixel += diff; + + char *pPtr = (char *) &pixel; + + for (int k = 0; k < sizeof (pixel); ++k) + *writePtr++ = *pPtr++; + } + + break; + + default: + + assert (false); + } + } + } + + if (tmpBufferEnd - _tmpBuffer < tmpSize) + tooMuchData(); + + outPtr = _outBuffer; + return writePtr - _outBuffer; +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfPxr24Compressor.h b/3rdparty/openexr/IlmImf/ImfPxr24Compressor.h new file mode 100644 index 000000000..71e610992 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfPxr24Compressor.h @@ -0,0 +1,108 @@ +#ifndef INCLUDED_IMF_PXR24_COMPRESSOR_H +#define INCLUDED_IMF_PXR24_COMPRESSOR_H + +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Pixar Animation Studios +// +// 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 Pixar Animation Studios 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. +// +///////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Pxr24Compressor -- Loren Carpenter's 24-bit float compressor +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + +class ChannelList; + + +class Pxr24Compressor: public Compressor +{ + public: + + Pxr24Compressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines); + + virtual ~Pxr24Compressor (); + + virtual int numScanLines () const; + + virtual Format format () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int compressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompressTile (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + private: + + int compress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + int uncompress (const char *inPtr, + int inSize, + Imath::Box2i range, + const char *&outPtr); + + int _maxScanLineSize; + int _numScanLines; + unsigned char * _tmpBuffer; + char * _outBuffer; + const ChannelList & _channels; + int _minX; + int _maxX; + int _maxY; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfRational.cpp b/3rdparty/openexr/IlmImf/ImfRational.cpp new file mode 100644 index 000000000..ae6bc0a04 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRational.cpp @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Rational numbers +// +// The double-to-Rational conversion code below +// was contributed to OpenEXR by Greg Ward. +// +//----------------------------------------------------------------------------- + +#include +#include + +using namespace std; + +namespace Imf { +namespace { + +double +frac (double x, double e) +{ + return x - floor (x + e); +} + + +double +square (double x) +{ + return x * x; +} + + +double +denom (double x, double e) +{ + if (e > frac (x, e)) + { + return 1; + } + else + { + double r = frac (1 / x, e); + + if (e > r) + { + return floor (1 / x + e); + } + else + { + return denom (frac (1 / r, e), e / square (x * r)) + + floor (1 / x + e) * denom (frac (1 / x, e), e / square (x)); + } + } +} + +} // namespace + + +Rational::Rational (double x) +{ + int sign; + + if (x >= 0) + { + sign = 1; // positive + } + else if (x < 0) + { + sign = -1; // negative + x = -x; + } + else + { + n = 0; // NaN + d = 0; + return; + } + + if (x >= (1U << 31) - 0.5) + { + n = sign; // infinity + d = 0; + return; + } + + double e = (x < 1? 1: x) / (1U << 30); + d = (unsigned int) denom (x, e); + n = sign * (int) floor (x * d + 0.5); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfRational.h b/3rdparty/openexr/IlmImf/ImfRational.h new file mode 100644 index 000000000..4bad7b847 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRational.h @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_RATIONAL_H +#define INCLUDED_IMF_RATIONAL_H + +//----------------------------------------------------------------------------- +// +// Rational numbers +// +// A rational number is represented as pair of integers, n and d. +// The value of of the rational number is +// +// n/d for d > 0 +// positive infinity for n > 0, d == 0 +// negative infinity for n < 0, d == 0 +// not a number (NaN) for n == 0, d == 0 +// +//----------------------------------------------------------------------------- + +namespace Imf { + +class Rational +{ + public: + + int n; // numerator + unsigned int d; // denominator + + + //---------------------------------------- + // Default constructor, sets value to zero + //---------------------------------------- + + Rational (): n (0), d (1) {} + + + //------------------------------------- + // Constructor, explicitly sets n and d + //------------------------------------- + + Rational (int n, int d): n (n), d (d) {} + + + //---------------------------- + // Constructor, approximates x + //---------------------------- + + explicit Rational (double x); + + + //--------------------------------- + // Approximate conversion to double + //--------------------------------- + + operator double () const {return double (n) / double (d);} +}; + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp b/3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp new file mode 100644 index 000000000..757ca273f --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class RationalAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +RationalAttribute::staticTypeName () +{ + return "rational"; +} + + +template <> +void +RationalAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.n); + Xdr::write (os, _value.d); +} + + +template <> +void +RationalAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.n); + Xdr::read (is, _value.d); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfRationalAttribute.h b/3rdparty/openexr/IlmImf/ImfRationalAttribute.h new file mode 100644 index 000000000..862bbf424 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRationalAttribute.h @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_RATIONAL_ATTRIBUTE_H +#define INCLUDED_IMF_RATIONAL_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class RationalAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute RationalAttribute; + +template <> +const char *RationalAttribute::staticTypeName (); + +template <> +void RationalAttribute::writeValueTo (OStream &, int) const; + +template <> +void RationalAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfRgba.h b/3rdparty/openexr/IlmImf/ImfRgba.h new file mode 100644 index 000000000..e68cb4b0e --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRgba.h @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_RGBA_H +#define INCLUDED_IMF_RGBA_H + +//----------------------------------------------------------------------------- +// +// class Rgba +// +//----------------------------------------------------------------------------- + +#include "half.h" + +namespace Imf { + + +// +// RGBA pixel +// + +struct Rgba +{ + half r; + half g; + half b; + half a; + + Rgba () {} + Rgba (half r, half g, half b, half a = 1.f): r (r), g (g), b (b), a (a) {} + + Rgba & operator = (const Rgba &other) + { + r = other.r; + g = other.g; + b = other.b; + a = other.a; + + return *this; + } +}; + + +// +// Channels in an RGBA file +// + +enum RgbaChannels +{ + WRITE_R = 0x01, // Red + WRITE_G = 0x02, // Green + WRITE_B = 0x04, // Blue + WRITE_A = 0x08, // Alpha + + WRITE_Y = 0x10, // Luminance, for black-and-white images, + // or in combination with chroma + + WRITE_C = 0x20, // Chroma (two subsampled channels, RY and BY, + // supported only for scanline-based files) + + WRITE_RGB = 0x07, // Red, green, blue + WRITE_RGBA = 0x0f, // Red, green, blue, alpha + + WRITE_YC = 0x30, // Luminance, chroma + WRITE_YA = 0x18, // Luminance, alpha + WRITE_YCA = 0x38 // Luminance, chroma, alpha +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfRgbaFile.cpp b/3rdparty/openexr/IlmImf/ImfRgbaFile.cpp new file mode 100644 index 000000000..540d12859 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRgbaFile.cpp @@ -0,0 +1,1404 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class RgbaOutputFile +// class RgbaInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace Imf { + +using namespace std; +using namespace Imath; +using namespace RgbaYca; +using namespace IlmThread; + +namespace { + +void +insertChannels (Header &header, RgbaChannels rgbaChannels) +{ + ChannelList ch; + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + { + if (rgbaChannels & WRITE_Y) + { + ch.insert ("Y", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_C) + { + ch.insert ("RY", Channel (HALF, 2, 2, true)); + ch.insert ("BY", Channel (HALF, 2, 2, true)); + } + } + else + { + if (rgbaChannels & WRITE_R) + ch.insert ("R", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_G) + ch.insert ("G", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_B) + ch.insert ("B", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_A) + ch.insert ("A", Channel (HALF, 1, 1)); + + header.channels() = ch; +} + + +RgbaChannels +rgbaChannels (const ChannelList &ch, const string &channelNamePrefix = "") +{ + int i = 0; + + if (ch.findChannel (channelNamePrefix + "R")) + i |= WRITE_R; + + if (ch.findChannel (channelNamePrefix + "G")) + i |= WRITE_G; + + if (ch.findChannel (channelNamePrefix + "B")) + i |= WRITE_B; + + if (ch.findChannel (channelNamePrefix + "A")) + i |= WRITE_A; + + if (ch.findChannel (channelNamePrefix + "Y")) + i |= WRITE_Y; + + if (ch.findChannel (channelNamePrefix + "RY") || + ch.findChannel (channelNamePrefix + "BY")) + i |= WRITE_C; + + return RgbaChannels (i); +} + + +string +prefixFromLayerName (const string &layerName, const Header &header) +{ + if (layerName.empty()) + return ""; + + if (hasMultiView (header) && multiView(header)[0] == layerName) + return ""; + + return layerName + "."; +} + + +V3f +ywFromHeader (const Header &header) +{ + Chromaticities cr; + + if (hasChromaticities (header)) + cr = chromaticities (header); + + return computeYw (cr); +} + + +ptrdiff_t +cachePadding (ptrdiff_t size) +{ + // + // Some of the buffers that are allocated by classes ToYca and + // FromYca, below, may need to be padded to avoid cache thrashing. + // If the difference between the buffer size and the nearest power + // of two is less than CACHE_LINE_SIZE, then we add an appropriate + // amount of padding. + // + // CACHE_LINE_SIZE must be a power of two, and it must be at + // least as big as the true size of a cache line on the machine + // we are running on. (It is ok if CACHE_LINE_SIZE is larger + // than a real cache line.) + // + + static int LOG2_CACHE_LINE_SIZE = 8; + static const ptrdiff_t CACHE_LINE_SIZE = (1 << LOG2_CACHE_LINE_SIZE); + + int i = LOG2_CACHE_LINE_SIZE + 2; + + while ((size >> i) > 1) + ++i; + + if (size > (1 << (i + 1)) - 64) + return 64 + ((1 << (i + 1)) - size); + + if (size < (1 << i) + 64) + return 64 + ((1 << i) - size); + + return 0; +} + +} // namespace + + +class RgbaOutputFile::ToYca: public Mutex +{ + public: + + ToYca (OutputFile &outputFile, RgbaChannels rgbaChannels); + ~ToYca (); + + void setYCRounding (unsigned int roundY, + unsigned int roundC); + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + void writePixels (int numScanLines); + int currentScanLine () const; + + private: + + void padTmpBuf (); + void rotateBuffers (); + void duplicateLastBuffer (); + void duplicateSecondToLastBuffer (); + void decimateChromaVertAndWriteScanLine (); + + OutputFile & _outputFile; + bool _writeY; + bool _writeC; + bool _writeA; + int _xMin; + int _width; + int _height; + int _linesConverted; + LineOrder _lineOrder; + int _currentScanLine; + V3f _yw; + Rgba * _bufBase; + Rgba * _buf[N]; + Rgba * _tmpBuf; + const Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; + int _roundY; + int _roundC; +}; + + +RgbaOutputFile::ToYca::ToYca (OutputFile &outputFile, + RgbaChannels rgbaChannels) +: + _outputFile (outputFile) +{ + _writeY = (rgbaChannels & WRITE_Y)? true: false; + _writeC = (rgbaChannels & WRITE_C)? true: false; + _writeA = (rgbaChannels & WRITE_A)? true: false; + + const Box2i dw = _outputFile.header().dataWindow(); + + _xMin = dw.min.x; + _width = dw.max.x - dw.min.x + 1; + _height = dw.max.y - dw.min.y + 1; + + _linesConverted = 0; + _lineOrder = _outputFile.header().lineOrder(); + + if (_lineOrder == INCREASING_Y) + _currentScanLine = dw.min.y; + else + _currentScanLine = dw.max.y; + + _yw = ywFromHeader (_outputFile.header()); + + ptrdiff_t pad = cachePadding (_width * sizeof (Rgba)) / sizeof (Rgba); + + _bufBase = new Rgba[(_width + pad) * N]; + + for (int i = 0; i < N; ++i) + _buf[i] = _bufBase + (i * (_width + pad)); + + _tmpBuf = new Rgba[_width + N - 1]; + + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; + + _roundY = 7; + _roundC = 5; +} + + +RgbaOutputFile::ToYca::~ToYca () +{ + delete [] _bufBase; + delete [] _tmpBuf; +} + + +void +RgbaOutputFile::ToYca::setYCRounding (unsigned int roundY, + unsigned int roundC) +{ + _roundY = roundY; + _roundC = roundC; +} + + +void +RgbaOutputFile::ToYca::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + if (_fbBase == 0) + { + FrameBuffer fb; + + if (_writeY) + { + fb.insert ("Y", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].g, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1)); // ySampling + } + + if (_writeC) + { + fb.insert ("RY", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].r, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2)); // ySampling + + fb.insert ("BY", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].b, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2)); // ySampling + } + + if (_writeA) + { + fb.insert ("A", + Slice (HALF, // type + (char *) &_tmpBuf[-_xMin].a, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1)); // ySampling + } + + _outputFile.setFrameBuffer (fb); + } + + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +RgbaOutputFile::ToYca::writePixels (int numScanLines) +{ + if (_fbBase == 0) + { + THROW (Iex::ArgExc, "No frame buffer was specified as the " + "pixel data source for image file " + "\"" << _outputFile.fileName() << "\"."); + } + + if (_writeY && !_writeC) + { + // + // We are writing only luminance; filtering + // and subsampling are not necessary. + // + + for (int i = 0; i < numScanLines; ++i) + { + // + // Copy the next scan line from the caller's + // frame buffer into _tmpBuf. + // + + for (int j = 0; j < _width; ++j) + { + _tmpBuf[j] = _fbBase[_fbYStride * _currentScanLine + + _fbXStride * (j + _xMin)]; + } + + // + // Convert the scan line from RGB to luminance/chroma, + // and store the result in the output file. + // + + RGBAtoYCA (_yw, _width, _writeA, _tmpBuf, _tmpBuf); + _outputFile.writePixels (1); + + ++_linesConverted; + + if (_lineOrder == INCREASING_Y) + ++_currentScanLine; + else + --_currentScanLine; + } + } + else + { + // + // We are writing chroma; the pixels must be filtered and subsampled. + // + + for (int i = 0; i < numScanLines; ++i) + { + // + // Copy the next scan line from the caller's + // frame buffer into _tmpBuf. + // + + for (int j = 0; j < _width; ++j) + { + _tmpBuf[j + N2] = _fbBase[_fbYStride * _currentScanLine + + _fbXStride * (j + _xMin)]; + } + + // + // Convert the scan line from RGB to luminance/chroma. + // + + RGBAtoYCA (_yw, _width, _writeA, _tmpBuf + N2, _tmpBuf + N2); + + // + // Append N2 copies of the first and last pixel to the + // beginning and end of the scan line. + // + + padTmpBuf (); + + // + // Filter and subsample the scan line's chroma channels + // horizontally; store the result in _buf. + // + + rotateBuffers(); + decimateChromaHoriz (_width, _tmpBuf, _buf[N - 1]); + + // + // If this is the first scan line in the image, + // store N2 more copies of the scan line in _buf. + // + + if (_linesConverted == 0) + { + for (int j = 0; j < N2; ++j) + duplicateLastBuffer(); + } + + ++_linesConverted; + + // + // If we have have converted at least N2 scan lines from + // RGBA to luminance/chroma, then we can start to filter + // and subsample vertically, and store pixels in the + // output file. + // + + if (_linesConverted > N2) + decimateChromaVertAndWriteScanLine(); + + // + // If we have already converted the last scan line in + // the image to luminance/chroma, filter, subsample and + // store the remaining scan lines in _buf. + // + + if (_linesConverted >= _height) + { + for (int j = 0; j < N2 - _height; ++j) + duplicateLastBuffer(); + + duplicateSecondToLastBuffer(); + ++_linesConverted; + decimateChromaVertAndWriteScanLine(); + + for (int j = 1; j < min (_height, N2); ++j) + { + duplicateLastBuffer(); + ++_linesConverted; + decimateChromaVertAndWriteScanLine(); + } + } + + if (_lineOrder == INCREASING_Y) + ++_currentScanLine; + else + --_currentScanLine; + } + } +} + + +int +RgbaOutputFile::ToYca::currentScanLine () const +{ + return _currentScanLine; +} + + +void +RgbaOutputFile::ToYca::padTmpBuf () +{ + for (int i = 0; i < N2; ++i) + { + _tmpBuf[i] = _tmpBuf[N2]; + _tmpBuf[_width + N2 + i] = _tmpBuf[_width + N2 - 2]; + } +} + + +void +RgbaOutputFile::ToYca::rotateBuffers () +{ + Rgba *tmp = _buf[0]; + + for (int i = 0; i < N - 1; ++i) + _buf[i] = _buf[i + 1]; + + _buf[N - 1] = tmp; +} + + +void +RgbaOutputFile::ToYca::duplicateLastBuffer () +{ + rotateBuffers(); + memcpy (_buf[N - 1], _buf[N - 2], _width * sizeof (Rgba)); +} + + +void +RgbaOutputFile::ToYca::duplicateSecondToLastBuffer () +{ + rotateBuffers(); + memcpy (_buf[N - 1], _buf[N - 3], _width * sizeof (Rgba)); +} + + +void +RgbaOutputFile::ToYca::decimateChromaVertAndWriteScanLine () +{ + if (_linesConverted & 1) + memcpy (_tmpBuf, _buf[N2], _width * sizeof (Rgba)); + else + decimateChromaVert (_width, _buf, _tmpBuf); + + if (_writeY && _writeC) + roundYCA (_width, _roundY, _roundC, _tmpBuf, _tmpBuf); + + _outputFile.writePixels (1); +} + + +RgbaOutputFile::RgbaOutputFile (const char name[], + const Header &header, + RgbaChannels rgbaChannels, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (name, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::RgbaOutputFile (OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (os, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::RgbaOutputFile (const char name[], + const Imath::Box2i &displayWindow, + const Imath::Box2i &dataWindow, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const Imath::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (displayWindow, + dataWindow.isEmpty()? displayWindow: dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (name, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::RgbaOutputFile (const char name[], + int width, + int height, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const Imath::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads): + _outputFile (0), + _toYca (0) +{ + Header hd (width, + height, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels); + _outputFile = new OutputFile (name, hd, numThreads); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _toYca = new ToYca (*_outputFile, rgbaChannels); +} + + +RgbaOutputFile::~RgbaOutputFile () +{ + delete _toYca; + delete _outputFile; +} + + +void +RgbaOutputFile::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + if (_toYca) + { + Lock lock (*_toYca); + _toYca->setFrameBuffer (base, xStride, yStride); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert ("R", Slice (HALF, (char *) &base[0].r, xs, ys)); + fb.insert ("G", Slice (HALF, (char *) &base[0].g, xs, ys)); + fb.insert ("B", Slice (HALF, (char *) &base[0].b, xs, ys)); + fb.insert ("A", Slice (HALF, (char *) &base[0].a, xs, ys)); + + _outputFile->setFrameBuffer (fb); + } +} + + +void +RgbaOutputFile::writePixels (int numScanLines) +{ + if (_toYca) + { + Lock lock (*_toYca); + _toYca->writePixels (numScanLines); + } + else + { + _outputFile->writePixels (numScanLines); + } +} + + +int +RgbaOutputFile::currentScanLine () const +{ + if (_toYca) + { + Lock lock (*_toYca); + return _toYca->currentScanLine(); + } + else + { + return _outputFile->currentScanLine(); + } +} + + +const Header & +RgbaOutputFile::header () const +{ + return _outputFile->header(); +} + + +const FrameBuffer & +RgbaOutputFile::frameBuffer () const +{ + return _outputFile->frameBuffer(); +} + + +const Imath::Box2i & +RgbaOutputFile::displayWindow () const +{ + return _outputFile->header().displayWindow(); +} + + +const Imath::Box2i & +RgbaOutputFile::dataWindow () const +{ + return _outputFile->header().dataWindow(); +} + + +float +RgbaOutputFile::pixelAspectRatio () const +{ + return _outputFile->header().pixelAspectRatio(); +} + + +const Imath::V2f +RgbaOutputFile::screenWindowCenter () const +{ + return _outputFile->header().screenWindowCenter(); +} + + +float +RgbaOutputFile::screenWindowWidth () const +{ + return _outputFile->header().screenWindowWidth(); +} + + +LineOrder +RgbaOutputFile::lineOrder () const +{ + return _outputFile->header().lineOrder(); +} + + +Compression +RgbaOutputFile::compression () const +{ + return _outputFile->header().compression(); +} + + +RgbaChannels +RgbaOutputFile::channels () const +{ + return rgbaChannels (_outputFile->header().channels()); +} + + +void +RgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + _outputFile->updatePreviewImage (newPixels); +} + + +void +RgbaOutputFile::setYCRounding (unsigned int roundY, unsigned int roundC) +{ + if (_toYca) + { + Lock lock (*_toYca); + _toYca->setYCRounding (roundY, roundC); + } +} + + +void +RgbaOutputFile::breakScanLine (int y, int offset, int length, char c) +{ + _outputFile->breakScanLine (y, offset, length, c); +} + + +class RgbaInputFile::FromYca: public Mutex +{ + public: + + FromYca (InputFile &inputFile, RgbaChannels rgbaChannels); + ~FromYca (); + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix); + + void readPixels (int scanLine1, int scanLine2); + + private: + + void readPixels (int scanLine); + void rotateBuf1 (int d); + void rotateBuf2 (int d); + void readYCAScanLine (int y, Rgba buf[]); + void padTmpBuf (); + + InputFile & _inputFile; + bool _readC; + int _xMin; + int _yMin; + int _yMax; + int _width; + int _height; + int _currentScanLine; + LineOrder _lineOrder; + V3f _yw; + Rgba * _bufBase; + Rgba * _buf1[N + 2]; + Rgba * _buf2[3]; + Rgba * _tmpBuf; + Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; +}; + + +RgbaInputFile::FromYca::FromYca (InputFile &inputFile, + RgbaChannels rgbaChannels) +: + _inputFile (inputFile) +{ + _readC = (rgbaChannels & WRITE_C)? true: false; + + const Box2i dw = _inputFile.header().dataWindow(); + + _xMin = dw.min.x; + _yMin = dw.min.y; + _yMax = dw.max.y; + _width = dw.max.x - dw.min.x + 1; + _height = dw.max.y - dw.min.y + 1; + _currentScanLine = dw.min.y - N - 2; + _lineOrder = _inputFile.header().lineOrder(); + _yw = ywFromHeader (_inputFile.header()); + + ptrdiff_t pad = cachePadding (_width * sizeof (Rgba)) / sizeof (Rgba); + + _bufBase = new Rgba[(_width + pad) * (N + 2 + 3)]; + + for (int i = 0; i < N + 2; ++i) + _buf1[i] = _bufBase + (i * (_width + pad)); + + for (int i = 0; i < 3; ++i) + _buf2[i] = _bufBase + ((i + N + 2) * (_width + pad)); + + _tmpBuf = new Rgba[_width + N - 1]; + + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; +} + + +RgbaInputFile::FromYca::~FromYca () +{ + delete [] _bufBase; + delete [] _tmpBuf; +} + + +void +RgbaInputFile::FromYca::setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix) +{ + if (_fbBase == 0) + { + FrameBuffer fb; + + fb.insert (channelNamePrefix + "Y", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].g, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1, // ySampling + 0.5)); // fillValue + + if (_readC) + { + fb.insert (channelNamePrefix + "RY", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].r, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2, // ySampling + 0.0)); // fillValue + + fb.insert (channelNamePrefix + "BY", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].b, // base + sizeof (Rgba) * 2, // xStride + 0, // yStride + 2, // xSampling + 2, // ySampling + 0.0)); // fillValue + } + + fb.insert (channelNamePrefix + "A", + Slice (HALF, // type + (char *) &_tmpBuf[N2 - _xMin].a, // base + sizeof (Rgba), // xStride + 0, // yStride + 1, // xSampling + 1, // ySampling + 1.0)); // fillValue + + _inputFile.setFrameBuffer (fb); + } + + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +RgbaInputFile::FromYca::readPixels (int scanLine1, int scanLine2) +{ + int minY = min (scanLine1, scanLine2); + int maxY = max (scanLine1, scanLine2); + + if (_lineOrder == INCREASING_Y) + { + for (int y = minY; y <= maxY; ++y) + readPixels (y); + } + else + { + for (int y = maxY; y >= minY; --y) + readPixels (y); + } +} + + +void +RgbaInputFile::FromYca::readPixels (int scanLine) +{ + if (_fbBase == 0) + { + THROW (Iex::ArgExc, "No frame buffer was specified as the " + "pixel data destination for image file " + "\"" << _inputFile.fileName() << "\"."); + } + + // + // In order to convert one scan line to RGB format, we need that + // scan line plus N2+1 extra scan lines above and N2+1 scan lines + // below in luminance/chroma format. + // + // We allow random access to scan lines, but we buffer partially + // processed luminance/chroma data in order to make reading pixels + // in increasing y or decreasing y order reasonably efficient: + // + // _currentScanLine holds the y coordinate of the scan line + // that was most recently read. + // + // _buf1 contains scan lines _currentScanLine-N2-1 + // through _currentScanLine+N2+1 in + // luminance/chroma format. Odd-numbered + // lines contain no chroma data. Even-numbered + // lines have valid chroma data for all pixels. + // + // _buf2 contains scan lines _currentScanLine-1 + // through _currentScanLine+1, in RGB format. + // Super-saturated pixels (see ImfRgbaYca.h) + // have not yet been eliminated. + // + // If the scan line we are trying to read now is close enough to + // _currentScanLine, we don't have to recompute the contents of _buf1 + // and _buf2 from scratch. We can rotate _buf1 and _buf2, and fill + // in the missing data. + // + + int dy = scanLine - _currentScanLine; + + if (abs (dy) < N + 2) + rotateBuf1 (dy); + + if (abs (dy) < 3) + rotateBuf2 (dy); + + if (dy < 0) + { + { + int n = min (-dy, N + 2); + int yMin = scanLine - N2 - 1; + + for (int i = n - 1; i >= 0; --i) + readYCAScanLine (yMin + i, _buf1[i]); + } + + { + int n = min (-dy, 3); + + for (int i = 0; i < n; ++i) + { + if ((scanLine + i) & 1) + { + YCAtoRGBA (_yw, _width, _buf1[N2 + i], _buf2[i]); + } + else + { + reconstructChromaVert (_width, _buf1 + i, _buf2[i]); + YCAtoRGBA (_yw, _width, _buf2[i], _buf2[i]); + } + } + } + } + else + { + { + int n = min (dy, N + 2); + int yMax = scanLine + N2 + 1; + + for (int i = n - 1; i >= 0; --i) + readYCAScanLine (yMax - i, _buf1[N + 1 - i]); + } + + { + int n = min (dy, 3); + + for (int i = 2; i > 2 - n; --i) + { + if ((scanLine + i) & 1) + { + YCAtoRGBA (_yw, _width, _buf1[N2 + i], _buf2[i]); + } + else + { + reconstructChromaVert (_width, _buf1 + i, _buf2[i]); + YCAtoRGBA (_yw, _width, _buf2[i], _buf2[i]); + } + } + } + } + + fixSaturation (_yw, _width, _buf2, _tmpBuf); + + for (int i = 0; i < _width; ++i) + _fbBase[_fbYStride * scanLine + _fbXStride * (i + _xMin)] = _tmpBuf[i]; + + _currentScanLine = scanLine; +} + + +void +RgbaInputFile::FromYca::rotateBuf1 (int d) +{ + d = modp (d, N + 2); + + Rgba *tmp[N + 2]; + + for (int i = 0; i < N + 2; ++i) + tmp[i] = _buf1[i]; + + for (int i = 0; i < N + 2; ++i) + _buf1[i] = tmp[(i + d) % (N + 2)]; +} + + +void +RgbaInputFile::FromYca::rotateBuf2 (int d) +{ + d = modp (d, 3); + + Rgba *tmp[3]; + + for (int i = 0; i < 3; ++i) + tmp[i] = _buf2[i]; + + for (int i = 0; i < 3; ++i) + _buf2[i] = tmp[(i + d) % 3]; +} + + +void +RgbaInputFile::FromYca::readYCAScanLine (int y, Rgba *buf) +{ + // + // Clamp y. + // + + if (y < _yMin) + y = _yMin; + else if (y > _yMax) + y = _yMax - 1; + + // + // Read scan line y into _tmpBuf. + // + + _inputFile.readPixels (y); + + // + // Reconstruct missing chroma samples and copy + // the scan line into buf. + // + + if (!_readC) + { + for (int i = 0; i < _width; ++i) + { + _tmpBuf[i + N2].r = 0; + _tmpBuf[i + N2].b = 0; + } + } + + if (y & 1) + { + memcpy (buf, _tmpBuf + N2, _width * sizeof (Rgba)); + } + else + { + padTmpBuf(); + reconstructChromaHoriz (_width, _tmpBuf, buf); + } +} + + +void +RgbaInputFile::FromYca::padTmpBuf () +{ + for (int i = 0; i < N2; ++i) + { + _tmpBuf[i] = _tmpBuf[N2]; + _tmpBuf[_width + N2 + i] = _tmpBuf[_width + N2 - 2]; + } +} + + +RgbaInputFile::RgbaInputFile (const char name[], int numThreads): + _inputFile (new InputFile (name, numThreads)), + _fromYca (0), + _channelNamePrefix ("") +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::RgbaInputFile (IStream &is, int numThreads): + _inputFile (new InputFile (is, numThreads)), + _fromYca (0), + _channelNamePrefix ("") +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::RgbaInputFile (const char name[], + const string &layerName, + int numThreads) +: + _inputFile (new InputFile (name, numThreads)), + _fromYca (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::RgbaInputFile (IStream &is, + const string &layerName, + int numThreads) +: + _inputFile (new InputFile (is, numThreads)), + _fromYca (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); +} + + +RgbaInputFile::~RgbaInputFile () +{ + delete _inputFile; + delete _fromYca; +} + + +void +RgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) +{ + if (_fromYca) + { + Lock lock (*_fromYca); + _fromYca->setFrameBuffer (base, xStride, yStride, _channelNamePrefix); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert (_channelNamePrefix + "R", + Slice (HALF, + (char *) &base[0].r, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "G", + Slice (HALF, + (char *) &base[0].g, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "B", + Slice (HALF, + (char *) &base[0].b, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "A", + Slice (HALF, + (char *) &base[0].a, + xs, ys, + 1, 1, // xSampling, ySampling + 1.0)); // fillValue + + _inputFile->setFrameBuffer (fb); + } +} + + +void +RgbaInputFile::setLayerName (const string &layerName) +{ + delete _fromYca; + _fromYca = 0; + + _channelNamePrefix = prefixFromLayerName (layerName, _inputFile->header()); + + RgbaChannels rgbaChannels = channels(); + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + _fromYca = new FromYca (*_inputFile, rgbaChannels); + + FrameBuffer fb; + _inputFile->setFrameBuffer (fb); +} + + +void +RgbaInputFile::readPixels (int scanLine1, int scanLine2) +{ + if (_fromYca) + { + Lock lock (*_fromYca); + _fromYca->readPixels (scanLine1, scanLine2); + } + else + { + _inputFile->readPixels (scanLine1, scanLine2); + } +} + + +void +RgbaInputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +bool +RgbaInputFile::isComplete () const +{ + return _inputFile->isComplete(); +} + + +const Header & +RgbaInputFile::header () const +{ + return _inputFile->header(); +} + + +const char * +RgbaInputFile::fileName () const +{ + return _inputFile->fileName(); +} + + +const FrameBuffer & +RgbaInputFile::frameBuffer () const +{ + return _inputFile->frameBuffer(); +} + + +const Imath::Box2i & +RgbaInputFile::displayWindow () const +{ + return _inputFile->header().displayWindow(); +} + + +const Imath::Box2i & +RgbaInputFile::dataWindow () const +{ + return _inputFile->header().dataWindow(); +} + + +float +RgbaInputFile::pixelAspectRatio () const +{ + return _inputFile->header().pixelAspectRatio(); +} + + +const Imath::V2f +RgbaInputFile::screenWindowCenter () const +{ + return _inputFile->header().screenWindowCenter(); +} + + +float +RgbaInputFile::screenWindowWidth () const +{ + return _inputFile->header().screenWindowWidth(); +} + + +LineOrder +RgbaInputFile::lineOrder () const +{ + return _inputFile->header().lineOrder(); +} + + +Compression +RgbaInputFile::compression () const +{ + return _inputFile->header().compression(); +} + + +RgbaChannels +RgbaInputFile::channels () const +{ + return rgbaChannels (_inputFile->header().channels(), _channelNamePrefix); +} + + +int +RgbaInputFile::version () const +{ + return _inputFile->version(); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfRgbaFile.h b/3rdparty/openexr/IlmImf/ImfRgbaFile.h new file mode 100644 index 000000000..eec67dcd6 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRgbaFile.h @@ -0,0 +1,344 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_RGBA_FILE_H +#define INCLUDED_IMF_RGBA_FILE_H + + +//----------------------------------------------------------------------------- +// +// Simplified RGBA image I/O +// +// class RgbaOutputFile +// class RgbaInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "ImathVec.h" +#include "ImathBox.h" +#include "half.h" +#include +#include + +namespace Imf { + + +class OutputFile; +class InputFile; +struct PreviewRgba; + +// +// RGBA output file. +// + +class RgbaOutputFile +{ + public: + + //--------------------------------------------------- + // Constructor -- header is constructed by the caller + //--------------------------------------------------- + + RgbaOutputFile (const char name[], + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------- + // Constructor -- header is constructed by the caller, + // file is opened by the caller, destructor will not + // automatically close the file. + //---------------------------------------------------- + + RgbaOutputFile (OStream &os, + const Header &header, + RgbaChannels rgbaChannels = WRITE_RGBA, + int numThreads = globalThreadCount()); + + + //---------------------------------------------------------------- + // Constructor -- header data are explicitly specified as function + // call arguments (empty dataWindow means "same as displayWindow") + //---------------------------------------------------------------- + + RgbaOutputFile (const char name[], + const Imath::Box2i &displayWindow, + const Imath::Box2i &dataWindow = Imath::Box2i(), + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const Imath::V2f screenWindowCenter = Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------------------------------------------- + // Constructor -- like the previous one, but both + // the display window and the data window are + // Box2i (V2i (0, 0), V2i (width - 1, height -1)) + //----------------------------------------------- + + RgbaOutputFile (const char name[], + int width, + int height, + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const Imath::V2f screenWindowCenter = Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = PIZ_COMPRESSION, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~RgbaOutputFile (); + + + //------------------------------------------------ + // Define a frame buffer as the pixel data source: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //------------------------------------------------ + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + + //--------------------------------------------- + // Write pixel data (see class Imf::OutputFile) + //--------------------------------------------- + + void writePixels (int numScanLines = 1); + int currentScanLine () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const Imath::Box2i & displayWindow () const; + const Imath::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const Imath::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + + + // -------------------------------------------------------------------- + // Update the preview image (see Imf::OutputFile::updatePreviewImage()) + // -------------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba[]); + + + //----------------------------------------------------------------------- + // Rounding control for luminance/chroma images: + // + // If the output file contains luminance and chroma channels (WRITE_YC + // or WRITE_YCA), then the the significands of the luminance and + // chroma values are rounded to roundY and roundC bits respectively (see + // function half::round()). Rounding improves compression with minimal + // image degradation, usually much less than the degradation caused by + // chroma subsampling. By default, roundY is 7, and roundC is 5. + // + // If the output file contains RGB channels or a luminance channel, + // without chroma, then no rounding is performed. + //----------------------------------------------------------------------- + + void setYCRounding (unsigned int roundY, + unsigned int roundC); + + + //---------------------------------------------------- + // Break a scan line -- for testing and debugging only + // (see Imf::OutputFile::updatePreviewImage() + // + // Warning: Calling this function usually results in a + // broken image file. The file or parts of it may not + // be readable, or the file may contain bad data. + // + //---------------------------------------------------- + + void breakScanLine (int y, + int offset, + int length, + char c); + private: + + RgbaOutputFile (const RgbaOutputFile &); // not implemented + RgbaOutputFile & operator = (const RgbaOutputFile &); // not implemented + + class ToYca; + + OutputFile * _outputFile; + ToYca * _toYca; +}; + + +// +// RGBA input file +// + +class RgbaInputFile +{ + public: + + //------------------------------------------------------- + // Constructor -- opens the file with the specified name, + // destructor will automatically close the file. + //------------------------------------------------------- + + RgbaInputFile (const char name[], int numThreads = globalThreadCount()); + + + //----------------------------------------------------------- + // Constructor -- attaches the new RgbaInputFile object to a + // file that has already been opened by the caller. + // Destroying the RgbaInputFile object will not automatically + // close the file. + //----------------------------------------------------------- + + RgbaInputFile (IStream &is, int numThreads = globalThreadCount()); + + + //-------------------------------------------------------------- + // Constructors -- the same as the previous two, but the names + // of the red, green, blue, alpha, luminance and chroma channels + // are expected to be layerName.R, layerName.G, etc. + //-------------------------------------------------------------- + + RgbaInputFile (const char name[], + const std::string &layerName, + int numThreads = globalThreadCount()); + + RgbaInputFile (IStream &is, + const std::string &layerName, + int numThreads = globalThreadCount()); + + + //----------- + // Destructor + //----------- + + virtual ~RgbaInputFile (); + + + //----------------------------------------------------- + // Define a frame buffer as the pixel data destination: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //----------------------------------------------------- + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride); + + + //---------------------------------------------------------------- + // Switch to a different layer -- subsequent calls to readPixels() + // will read channels layerName.R, layerName.G, etc. + // After each call to setLayerName(), setFrameBuffer() must be + // called at least once before the next call to readPixels(). + //---------------------------------------------------------------- + + void setLayerName (const std::string &layerName); + + + //------------------------------------------- + // Read pixel data (see class Imf::InputFile) + //------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const Imath::Box2i & displayWindow () const; + const Imath::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const Imath::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + const char * fileName () const; + bool isComplete () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + private: + + RgbaInputFile (const RgbaInputFile &); // not implemented + RgbaInputFile & operator = (const RgbaInputFile &); // not implemented + + class FromYca; + + InputFile * _inputFile; + FromYca * _fromYca; + std::string _channelNamePrefix; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfRgbaYca.cpp b/3rdparty/openexr/IlmImf/ImfRgbaYca.cpp new file mode 100644 index 000000000..9a571deb9 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRgbaYca.cpp @@ -0,0 +1,495 @@ +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software 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. +// +////////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Conversion between RGBA and YCA data. +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +using namespace Imath; +using namespace std; + +namespace Imf { +namespace RgbaYca { + + +V3f +computeYw (const Chromaticities &cr) +{ + M44f m = RGBtoXYZ (cr, 1); + return V3f (m[0][1], m[1][1], m[2][1]) / (m[0][1] + m[1][1] + m[2][1]); +} + + +void +RGBAtoYCA (const V3f &yw, + int n, + bool aIsValid, + const Rgba rgbaIn[/*n*/], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + Rgba in = rgbaIn[i]; + Rgba &out = ycaOut[i]; + + // + // Conversion to YCA and subsequent chroma subsampling + // work only if R, G and B are finite and non-negative. + // + + if (!in.r.isFinite() || in.r < 0) + in.r = 0; + + if (!in.g.isFinite() || in.g < 0) + in.g = 0; + + if (!in.b.isFinite() || in.b < 0) + in.b = 0; + + if (in.r == in.g && in.g == in.b) + { + // + // Special case -- R, G and B are equal. To avoid rounding + // errors, we explicitly set the output luminance channel + // to G, and the chroma channels to 0. + // + // The special cases here and in YCAtoRGBA() ensure that + // converting black-and white images from RGBA to YCA and + // back is lossless. + // + + out.r = 0; + out.g = in.g; + out.b = 0; + } + else + { + out.g = in.r * yw.x + in.g * yw.y + in.b * yw.z; + + float Y = out.g; + + if (abs (in.r - Y) < HALF_MAX * Y) + out.r = (in.r - Y) / Y; + else + out.r = 0; + + if (abs (in.b - Y) < HALF_MAX * Y) + out.b = (in.b - Y) / Y; + else + out.b = 0; + } + + if (aIsValid) + out.a = in.a; + else + out.a = 1; + } +} + + +void +decimateChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]) +{ + #ifdef DEBUG + assert (ycaIn != ycaOut); + #endif + + int begin = N2; + int end = begin + n; + + for (int i = begin, j = 0; i < end; ++i, ++j) + { + if ((j & 1) == 0) + { + ycaOut[j].r = ycaIn[i - 13].r * 0.001064f + + ycaIn[i - 11].r * -0.003771f + + ycaIn[i - 9].r * 0.009801f + + ycaIn[i - 7].r * -0.021586f + + ycaIn[i - 5].r * 0.043978f + + ycaIn[i - 3].r * -0.093067f + + ycaIn[i - 1].r * 0.313659f + + ycaIn[i ].r * 0.499846f + + ycaIn[i + 1].r * 0.313659f + + ycaIn[i + 3].r * -0.093067f + + ycaIn[i + 5].r * 0.043978f + + ycaIn[i + 7].r * -0.021586f + + ycaIn[i + 9].r * 0.009801f + + ycaIn[i + 11].r * -0.003771f + + ycaIn[i + 13].r * 0.001064f; + + ycaOut[j].b = ycaIn[i - 13].b * 0.001064f + + ycaIn[i - 11].b * -0.003771f + + ycaIn[i - 9].b * 0.009801f + + ycaIn[i - 7].b * -0.021586f + + ycaIn[i - 5].b * 0.043978f + + ycaIn[i - 3].b * -0.093067f + + ycaIn[i - 1].b * 0.313659f + + ycaIn[i ].b * 0.499846f + + ycaIn[i + 1].b * 0.313659f + + ycaIn[i + 3].b * -0.093067f + + ycaIn[i + 5].b * 0.043978f + + ycaIn[i + 7].b * -0.021586f + + ycaIn[i + 9].b * 0.009801f + + ycaIn[i + 11].b * -0.003771f + + ycaIn[i + 13].b * 0.001064f; + } + + ycaOut[j].g = ycaIn[i].g; + ycaOut[j].a = ycaIn[i].a; + } +} + + +void +decimateChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + if ((i & 1) == 0) + { + ycaOut[i].r = ycaIn[ 0][i].r * 0.001064f + + ycaIn[ 2][i].r * -0.003771f + + ycaIn[ 4][i].r * 0.009801f + + ycaIn[ 6][i].r * -0.021586f + + ycaIn[ 8][i].r * 0.043978f + + ycaIn[10][i].r * -0.093067f + + ycaIn[12][i].r * 0.313659f + + ycaIn[13][i].r * 0.499846f + + ycaIn[14][i].r * 0.313659f + + ycaIn[16][i].r * -0.093067f + + ycaIn[18][i].r * 0.043978f + + ycaIn[20][i].r * -0.021586f + + ycaIn[22][i].r * 0.009801f + + ycaIn[24][i].r * -0.003771f + + ycaIn[26][i].r * 0.001064f; + + ycaOut[i].b = ycaIn[ 0][i].b * 0.001064f + + ycaIn[ 2][i].b * -0.003771f + + ycaIn[ 4][i].b * 0.009801f + + ycaIn[ 6][i].b * -0.021586f + + ycaIn[ 8][i].b * 0.043978f + + ycaIn[10][i].b * -0.093067f + + ycaIn[12][i].b * 0.313659f + + ycaIn[13][i].b * 0.499846f + + ycaIn[14][i].b * 0.313659f + + ycaIn[16][i].b * -0.093067f + + ycaIn[18][i].b * 0.043978f + + ycaIn[20][i].b * -0.021586f + + ycaIn[22][i].b * 0.009801f + + ycaIn[24][i].b * -0.003771f + + ycaIn[26][i].b * 0.001064f; + } + + ycaOut[i].g = ycaIn[13][i].g; + ycaOut[i].a = ycaIn[13][i].a; + } +} + + +void +roundYCA (int n, + unsigned int roundY, + unsigned int roundC, + const Rgba ycaIn[/*n*/], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + ycaOut[i].g = ycaIn[i].g.round (roundY); + ycaOut[i].a = ycaIn[i].a; + + if ((i & 1) == 0) + { + ycaOut[i].r = ycaIn[i].r.round (roundC); + ycaOut[i].b = ycaIn[i].b.round (roundC); + } + } +} + + +void +reconstructChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]) +{ + #ifdef DEBUG + assert (ycaIn != ycaOut); + #endif + + int begin = N2; + int end = begin + n; + + for (int i = begin, j = 0; i < end; ++i, ++j) + { + if (j & 1) + { + ycaOut[j].r = ycaIn[i - 13].r * 0.002128f + + ycaIn[i - 11].r * -0.007540f + + ycaIn[i - 9].r * 0.019597f + + ycaIn[i - 7].r * -0.043159f + + ycaIn[i - 5].r * 0.087929f + + ycaIn[i - 3].r * -0.186077f + + ycaIn[i - 1].r * 0.627123f + + ycaIn[i + 1].r * 0.627123f + + ycaIn[i + 3].r * -0.186077f + + ycaIn[i + 5].r * 0.087929f + + ycaIn[i + 7].r * -0.043159f + + ycaIn[i + 9].r * 0.019597f + + ycaIn[i + 11].r * -0.007540f + + ycaIn[i + 13].r * 0.002128f; + + ycaOut[j].b = ycaIn[i - 13].b * 0.002128f + + ycaIn[i - 11].b * -0.007540f + + ycaIn[i - 9].b * 0.019597f + + ycaIn[i - 7].b * -0.043159f + + ycaIn[i - 5].b * 0.087929f + + ycaIn[i - 3].b * -0.186077f + + ycaIn[i - 1].b * 0.627123f + + ycaIn[i + 1].b * 0.627123f + + ycaIn[i + 3].b * -0.186077f + + ycaIn[i + 5].b * 0.087929f + + ycaIn[i + 7].b * -0.043159f + + ycaIn[i + 9].b * 0.019597f + + ycaIn[i + 11].b * -0.007540f + + ycaIn[i + 13].b * 0.002128f; + } + else + { + ycaOut[j].r = ycaIn[i].r; + ycaOut[j].b = ycaIn[i].b; + } + + ycaOut[j].g = ycaIn[i].g; + ycaOut[j].a = ycaIn[i].a; + } +} + + +void +reconstructChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + ycaOut[i].r = ycaIn[ 0][i].r * 0.002128f + + ycaIn[ 2][i].r * -0.007540f + + ycaIn[ 4][i].r * 0.019597f + + ycaIn[ 6][i].r * -0.043159f + + ycaIn[ 8][i].r * 0.087929f + + ycaIn[10][i].r * -0.186077f + + ycaIn[12][i].r * 0.627123f + + ycaIn[14][i].r * 0.627123f + + ycaIn[16][i].r * -0.186077f + + ycaIn[18][i].r * 0.087929f + + ycaIn[20][i].r * -0.043159f + + ycaIn[22][i].r * 0.019597f + + ycaIn[24][i].r * -0.007540f + + ycaIn[26][i].r * 0.002128f; + + ycaOut[i].b = ycaIn[ 0][i].b * 0.002128f + + ycaIn[ 2][i].b * -0.007540f + + ycaIn[ 4][i].b * 0.019597f + + ycaIn[ 6][i].b * -0.043159f + + ycaIn[ 8][i].b * 0.087929f + + ycaIn[10][i].b * -0.186077f + + ycaIn[12][i].b * 0.627123f + + ycaIn[14][i].b * 0.627123f + + ycaIn[16][i].b * -0.186077f + + ycaIn[18][i].b * 0.087929f + + ycaIn[20][i].b * -0.043159f + + ycaIn[22][i].b * 0.019597f + + ycaIn[24][i].b * -0.007540f + + ycaIn[26][i].b * 0.002128f; + + ycaOut[i].g = ycaIn[13][i].g; + ycaOut[i].a = ycaIn[13][i].a; + } +} + + +void +YCAtoRGBA (const Imath::V3f &yw, + int n, + const Rgba ycaIn[/*n*/], + Rgba rgbaOut[/*n*/]) +{ + for (int i = 0; i < n; ++i) + { + const Rgba &in = ycaIn[i]; + Rgba &out = rgbaOut[i]; + + if (in.r == 0 && in.b == 0) + { + // + // Special case -- both chroma channels are 0. To avoid + // rounding errors, we explicitly set the output R, G and B + // channels equal to the input luminance. + // + // The special cases here and in RGBAtoYCA() ensure that + // converting black-and white images from RGBA to YCA and + // back is lossless. + // + + out.r = in.g; + out.g = in.g; + out.b = in.g; + out.a = in.a; + } + else + { + float Y = in.g; + float r = (in.r + 1) * Y; + float b = (in.b + 1) * Y; + float g = (Y - r * yw.x - b * yw.z) / yw.y; + + out.r = r; + out.g = g; + out.b = b; + out.a = in.a; + } + } +} + + +namespace { + +inline float +saturation (const Rgba &in) +{ + float rgbMax = max (in.r, max (in.g, in.b)); + float rgbMin = min (in.r, min (in.g, in.b)); + + if (rgbMax > 0) + return 1 - rgbMin / rgbMax; + else + return 0; +} + + +void +desaturate (const Rgba &in, float f, const V3f &yw, Rgba &out) +{ + float rgbMax = max (in.r, max (in.g, in.b)); + + out.r = max (float (rgbMax - (rgbMax - in.r) * f), 0.0f); + out.g = max (float (rgbMax - (rgbMax - in.g) * f), 0.0f); + out.b = max (float (rgbMax - (rgbMax - in.b) * f), 0.0f); + out.a = in.a; + + float Yin = in.r * yw.x + in.g * yw.y + in.b * yw.z; + float Yout = out.r * yw.x + out.g * yw.y + out.b * yw.z; + + if (Yout > 0) + { + out.r *= Yin / Yout; + out.g *= Yin / Yout; + out.b *= Yin / Yout; + } +} + +} // namespace + + +void +fixSaturation (const Imath::V3f &yw, + int n, + const Rgba * const rgbaIn[3], + Rgba rgbaOut[/*n*/]) +{ + float neighborA2 = saturation (rgbaIn[0][0]); + float neighborA1 = neighborA2; + + float neighborB2 = saturation (rgbaIn[2][0]); + float neighborB1 = neighborB2; + + for (int i = 0; i < n; ++i) + { + float neighborA0 = neighborA1; + neighborA1 = neighborA2; + + float neighborB0 = neighborB1; + neighborB1 = neighborB2; + + if (i < n - 1) + { + neighborA2 = saturation (rgbaIn[0][i + 1]); + neighborB2 = saturation (rgbaIn[2][i + 1]); + } + + // + // A0 A1 A2 + // rgbaOut[i] + // B0 B1 B2 + // + + float sMean = min (1.0f, 0.25f * (neighborA0 + neighborA2 + + neighborB0 + neighborB2)); + + const Rgba &in = rgbaIn[1][i]; + Rgba &out = rgbaOut[i]; + + float s = saturation (in); + + if (s > sMean) + { + float sMax = min (1.0f, 1 - (1 - sMean) * 0.25f); + + if (s > sMax) + { + desaturate (in, sMax / s, yw, out); + continue; + } + } + + out = in; + } +} + +} // namespace RgbaYca +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfRgbaYca.h b/3rdparty/openexr/IlmImf/ImfRgbaYca.h new file mode 100644 index 000000000..4a2743ecc --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRgbaYca.h @@ -0,0 +1,248 @@ +#ifndef INCLUDED_IMF_RGBA_YCA_H +#define INCLUDED_IMF_RGBA_YCA_H + +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm +// Entertainment Company Ltd. Portions contributed and copyright held by +// others as indicated. 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 Industrial Light & Magic nor the names of +// any other contributors to this software 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. +// +////////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Conversion between RGBA (red, green, blue alpha) +// and YCA (luminance, subsampled chroma, alpha) data: +// +// Luminance, Y, is computed as a weighted sum of R, G, and B: +// +// Y = yw.x * R + yw.y * G + yw.z * B +// +// Function computeYw() computes a set of RGB-to-Y weights, yw, +// from a set of primary and white point chromaticities. +// +// Chroma, C, consists of two components, RY and BY: +// +// RY = (R - Y) / Y +// BY = (B - Y) / Y +// +// For efficiency, the x and y subsampling rates for chroma are +// hardwired to 2, and the chroma subsampling and reconstruction +// filters are fixed 27-pixel wide windowed sinc functions. +// +// Starting with an image that has RGBA data for all pixels, +// +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// ... +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// RGBA RGBA RGBA RGBA ... RGBA RGBA +// +// function RGBAtoYCA() converts the pixels to YCA format: +// +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// ... +// YCA YCA YCA YCA ... YCA YCA +// YCA YCA YCA YCA ... YCA YCA +// +// Next, decimateChomaHoriz() eliminates the chroma values from +// the odd-numbered pixels in every scan line: +// +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// ... +// YCA YA YCA YA ... YCA YA +// YCA YA YCA YA ... YCA YA +// +// decimateChromaVert() eliminates all chroma values from the +// odd-numbered scan lines: +// +// YCA YA YCA YA ... YCA YA +// YA YA YA YA ... YA YA +// YCA YA YCA YA ... YCA YA +// YA YA YA YA ... YA YA +// ... +// YCA YA YCA YA ... YCA YA +// YA YA YA YA ... YA YA +// +// Finally, roundYCA() reduces the precision of the luminance +// and chroma values so that the pixel data shrink more when +// they are saved in a compressed file. +// +// The output of roundYCA() can be converted back to a set +// of RGBA pixel data that is visually very similar to the +// original RGBA image, by calling reconstructChromaHoriz(), +// reconstructChromaVert(), YCAtoRGBA(), and finally +// fixSaturation(). +// +//----------------------------------------------------------------------------- + +#include +#include + +namespace Imf { +namespace RgbaYca { + + +// +// Width of the chroma subsampling and reconstruction filters +// + +static const int N = 27; +static const int N2 = N / 2; + + +// +// Convert a set of primary chromaticities into a set of weighting +// factors for computing a pixels's luminance, Y, from R, G and B +// + +Imath::V3f computeYw (const Chromaticities &cr); + + +// +// Convert an array of n RGBA pixels, rgbaIn, to YCA (luminance/chroma/alpha): +// +// ycaOut[i].g = Y (rgbaIn[i]); +// ycaOut[i].r = RY (rgbaIn[i]); +// ycaOut[i].b = BY (rgbaIn[i]); +// ycaOut[i].a = aIsValid? rgbaIn[i].a: 1 +// +// yw is a set of RGB-to-Y weighting factors, as computed by computeYw(). +// + +void RGBAtoYCA (const Imath::V3f &yw, + int n, + bool aIsValid, + const Rgba rgbaIn[/*n*/], + Rgba ycaOut[/*n*/]); + +// +// Perform horizontal low-pass filtering and subsampling of +// the chroma channels of an array of n pixels. In order +// to avoid indexing off the ends of the input array during +// low-pass filtering, ycaIn must have N2 extra pixels at +// both ends. Before calling decimateChromaHoriz(), the extra +// pixels should be filled with copies of the first and last +// "real" input pixel. +// + +void decimateChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]); + +// +// Perform vertical chroma channel low-pass filtering and subsampling. +// N scan lines of input pixels are combined into a single scan line +// of output pixels. +// + +void decimateChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]); + +// +// Round the luminance and chroma channels of an array of YCA +// pixels that has already been filtered and subsampled. +// The signifcands of the pixels' luminance and chroma values +// are rounded to roundY and roundC bits respectively. +// + +void roundYCA (int n, + unsigned int roundY, + unsigned int roundC, + const Rgba ycaIn[/*n*/], + Rgba ycaOut[/*n*/]); + +// +// For a scan line that has valid chroma data only for every other pixel, +// reconstruct the missing chroma values. +// + +void reconstructChromaHoriz (int n, + const Rgba ycaIn[/*n+N-1*/], + Rgba ycaOut[/*n*/]); + +// +// For a scan line that has only luminance and no valid chroma data, +// reconstruct chroma from the surronding N scan lines. +// + +void reconstructChromaVert (int n, + const Rgba * const ycaIn[N], + Rgba ycaOut[/*n*/]); + +// +// Convert an array of n YCA (luminance/chroma/alpha) pixels to RGBA. +// This function is the inverse of RGBAtoYCA(). +// yw is a set of RGB-to-Y weighting factors, as computed by computeYw(). +// + +void YCAtoRGBA (const Imath::V3f &yw, + int n, + const Rgba ycaIn[/*n*/], + Rgba rgbaOut[/*n*/]); + +// +// Eliminate super-saturated pixels: +// +// Converting an image from RGBA to YCA, low-pass filtering chroma, +// and converting the result back to RGBA can produce pixels with +// super-saturated colors, where one or two of the RGB components +// become zero or negative. (The low-pass and reconstruction filters +// introduce some amount of ringing into the chroma components. +// This can lead to negative RGB values near high-contrast edges.) +// +// The fixSaturation() function finds super-saturated pixels and +// corrects them by desaturating their colors while maintaining +// their luminance. fixSaturation() takes three adjacent input +// scan lines, rgbaIn[0], rgbaIn[1], rgbaIn[2], adjusts the +// saturation of rgbaIn[1], and stores the result in rgbaOut. +// + +void fixSaturation (const Imath::V3f &yw, + int n, + const Rgba * const rgbaIn[3], + Rgba rgbaOut[/*n*/]); + +} // namespace RgbaYca +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfRleCompressor.cpp b/3rdparty/openexr/IlmImf/ImfRleCompressor.cpp new file mode 100644 index 000000000..90619b4ca --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRleCompressor.cpp @@ -0,0 +1,331 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class RleCompressor +// +//----------------------------------------------------------------------------- + +#include +#include +#include "Iex.h" + +namespace Imf { +namespace { + +const int MIN_RUN_LENGTH = 3; +const int MAX_RUN_LENGTH = 127; + + +// +// Compress an array of bytes, using run-length encoding, +// and return the length of the compressed data. +// + +int +rleCompress (int inLength, const char in[], signed char out[]) +{ + const char *inEnd = in + inLength; + const char *runStart = in; + const char *runEnd = in + 1; + signed char *outWrite = out; + + while (runStart < inEnd) + { + while (runEnd < inEnd && + *runStart == *runEnd && + runEnd - runStart - 1 < MAX_RUN_LENGTH) + { + ++runEnd; + } + + if (runEnd - runStart >= MIN_RUN_LENGTH) + { + // + // Compressable run + // + + *outWrite++ = (runEnd - runStart) - 1; + *outWrite++ = *(signed char *) runStart; + runStart = runEnd; + } + else + { + // + // Uncompressable run + // + + while (runEnd < inEnd && + ((runEnd + 1 >= inEnd || + *runEnd != *(runEnd + 1)) || + (runEnd + 2 >= inEnd || + *(runEnd + 1) != *(runEnd + 2))) && + runEnd - runStart < MAX_RUN_LENGTH) + { + ++runEnd; + } + + *outWrite++ = runStart - runEnd; + + while (runStart < runEnd) + { + *outWrite++ = *(signed char *) (runStart++); + } + } + + ++runEnd; + } + + return outWrite - out; +} + + +// +// Uncompress an array of bytes compressed with rleCompress(). +// Returns the length of the oncompressed data, or 0 if the +// length of the uncompressed data would be more than maxLength. +// + +int +rleUncompress (int inLength, int maxLength, const signed char in[], char out[]) +{ + char *outStart = out; + + while (inLength > 0) + { + if (*in < 0) + { + int count = -((int)*in++); + inLength -= count + 1; + + if (0 > (maxLength -= count)) + return 0; + + while (count-- > 0) + *out++ = *(char *) (in++); + } + else + { + int count = *in++; + inLength -= 2; + + if (0 > (maxLength -= count + 1)) + return 0; + + while (count-- >= 0) + *out++ = *(char *) in; + + in++; + } + } + + return out - outStart; +} + +} // namespace + + +RleCompressor::RleCompressor (const Header &hdr, size_t maxScanLineSize): + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _tmpBuffer (0), + _outBuffer (0) +{ + _tmpBuffer = new char [maxScanLineSize]; + _outBuffer = new char [uiMult (maxScanLineSize, size_t (3)) / 2]; +} + + +RleCompressor::~RleCompressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; +} + + +int +RleCompressor::numScanLines () const +{ + // + // This compressor compresses individual scan lines. + // + + return 1; +} + + +int +RleCompressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case ­- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Reorder the pixel data. + // + + { + char *t1 = _tmpBuffer; + char *t2 = _tmpBuffer + (inSize + 1) / 2; + const char *stop = inPtr + inSize; + + while (true) + { + if (inPtr < stop) + *(t1++) = *(inPtr++); + else + break; + + if (inPtr < stop) + *(t2++) = *(inPtr++); + else + break; + } + } + + // + // Predictor. + // + + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + inSize; + int p = t[-1]; + + while (t < stop) + { + int d = int (t[0]) - p + (128 + 256); + p = t[0]; + t[0] = d; + ++t; + } + } + + // + // Run-length encode the data. + // + + outPtr = _outBuffer; + return rleCompress (inSize, _tmpBuffer, (signed char *) _outBuffer); +} + + +int +RleCompressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case ­- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Decode the run-length encoded data + // + + int outSize; + + if (0 == (outSize = rleUncompress (inSize, _maxScanLineSize, + (const signed char *) inPtr, + _tmpBuffer))) + { + throw Iex::InputExc ("Data decoding (rle) failed."); + } + + // + // Predictor. + // + + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + outSize; + + while (t < stop) + { + int d = int (t[-1]) + int (t[0]) - 128; + t[0] = d; + ++t; + } + } + + // + // Reorder the pixel data. + // + + { + const char *t1 = _tmpBuffer; + const char *t2 = _tmpBuffer + (outSize + 1) / 2; + char *s = _outBuffer; + char *stop = s + outSize; + + while (true) + { + if (s < stop) + *(s++) = *(t1++); + else + break; + + if (s < stop) + *(s++) = *(t2++); + else + break; + } + } + + outPtr = _outBuffer; + return outSize; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfRleCompressor.h b/3rdparty/openexr/IlmImf/ImfRleCompressor.h new file mode 100644 index 000000000..e2723811b --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfRleCompressor.h @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_RLE_COMPRESSOR_H +#define INCLUDED_IMF_RLE_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class RleCompressor -- performs run-length encoding +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + + +class RleCompressor: public Compressor +{ + public: + + RleCompressor (const Header &hdr, size_t maxScanLineSize); + virtual ~RleCompressor (); + + virtual int numScanLines () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + private: + + int _maxScanLineSize; + char * _tmpBuffer; + char * _outBuffer; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfScanLineInputFile.cpp b/3rdparty/openexr/IlmImf/ImfScanLineInputFile.cpp new file mode 100644 index 000000000..c5c646525 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfScanLineInputFile.cpp @@ -0,0 +1,1021 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class ScanLineInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include "ImathFun.h" +#include +#include +#include +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include +#include + + +namespace Imf { + +using Imath::Box2i; +using Imath::divp; +using Imath::modp; +using std::string; +using std::vector; +using std::ifstream; +using std::min; +using std::max; +using IlmThread::Mutex; +using IlmThread::Lock; +using IlmThread::Semaphore; +using IlmThread::Task; +using IlmThread::TaskGroup; +using IlmThread::ThreadPool; + +namespace { + +struct InSliceInfo +{ + PixelType typeInFrameBuffer; + PixelType typeInFile; + char * base; + size_t xStride; + size_t yStride; + int xSampling; + int ySampling; + bool fill; + bool skip; + double fillValue; + + InSliceInfo (PixelType typeInFrameBuffer = HALF, + PixelType typeInFile = HALF, + char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + int xSampling = 1, + int ySampling = 1, + bool fill = false, + bool skip = false, + double fillValue = 0.0); +}; + + +InSliceInfo::InSliceInfo (PixelType tifb, + PixelType tifl, + char *b, + size_t xs, size_t ys, + int xsm, int ysm, + bool f, bool s, + double fv) +: + typeInFrameBuffer (tifb), + typeInFile (tifl), + base (b), + xStride (xs), + yStride (ys), + xSampling (xsm), + ySampling (ysm), + fill (f), + skip (s), + fillValue (fv) +{ + // empty +} + + +struct LineBuffer +{ + const char * uncompressedData; + char * buffer; + int dataSize; + int minY; + int maxY; + Compressor * compressor; + Compressor::Format format; + int number; + bool hasException; + string exception; + + LineBuffer (Compressor * const comp); + ~LineBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + private: + + Semaphore _sem; +}; + + +LineBuffer::LineBuffer (Compressor *comp): + uncompressedData (0), + buffer (0), + dataSize (0), + compressor (comp), + format (defaultFormat(compressor)), + number (-1), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +LineBuffer::~LineBuffer () +{ + delete compressor; +} + +} // namespace + + +struct ScanLineInputFile::Data: public Mutex +{ + Header header; // the image header + int version; // file's version + FrameBuffer frameBuffer; // framebuffer to write into + LineOrder lineOrder; // order of the scanlines in file + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + vector lineOffsets; // stores offsets in file for + // each line + bool fileIsComplete; // True if no scanlines are missing + // in the file + int nextLineBufferMinY; // minimum y of the next linebuffer + vector bytesPerLine; // combined size of a line over all + // channels + vector offsetInLineBuffer; // offset for each scanline in its + // linebuffer + vector slices; // info about channels in file + IStream * is; // file stream to read from + + vector lineBuffers; // each holds one line buffer + int linesInBuffer; // number of scanlines each buffer + // holds + size_t lineBufferSize; // size of the line buffer + + Data (IStream *is, int numThreads); + ~Data (); + + inline LineBuffer * getLineBuffer (int number); // hash function from line + // buffer indices into our + // vector of line buffers +}; + + +ScanLineInputFile::Data::Data (IStream *is, int numThreads): + is (is) +{ + // + // We need at least one lineBuffer, but if threading is used, + // to keep n threads busy we need 2*n lineBuffers + // + + lineBuffers.resize (max (1, 2 * numThreads)); +} + + +ScanLineInputFile::Data::~Data () +{ + for (size_t i = 0; i < lineBuffers.size(); i++) + delete lineBuffers[i]; +} + + +inline LineBuffer * +ScanLineInputFile::Data::getLineBuffer (int lineBufferNumber) +{ + return lineBuffers[lineBufferNumber % lineBuffers.size()]; +} + + +namespace { + + +void +reconstructLineOffsets (IStream &is, + LineOrder lineOrder, + vector &lineOffsets) +{ + Int64 position = is.tellg(); + + try + { + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + Int64 lineOffset = is.tellg(); + + int y; + Xdr::read (is, y); + + int dataSize; + Xdr::read (is, dataSize); + + Xdr::skip (is, dataSize); + + if (lineOrder == INCREASING_Y) + lineOffsets[i] = lineOffset; + else + lineOffsets[lineOffsets.size() - i - 1] = lineOffset; + } + } + catch (...) + { + // + // Suppress all exceptions. This functions is + // called only to reconstruct the line offset + // table for incomplete files, and exceptions + // are likely. + // + } + + is.clear(); + is.seekg (position); +} + + +void +readLineOffsets (IStream &is, + LineOrder lineOrder, + vector &lineOffsets, + bool &complete) +{ + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + Xdr::read (is, lineOffsets[i]); + } + + complete = true; + + for (unsigned int i = 0; i < lineOffsets.size(); i++) + { + if (lineOffsets[i] <= 0) + { + // + // Invalid data in the line offset table mean that + // the file is probably incomplete (the table is + // the last thing written to the file). Either + // some process is still busy writing the file, + // or writing the file was aborted. + // + // We should still be able to read the existing + // parts of the file. In order to do this, we + // have to make a sequential scan over the scan + // line data to reconstruct the line offset table. + // + + complete = false; + reconstructLineOffsets (is, lineOrder, lineOffsets); + break; + } + } +} + + +void +readPixelData (ScanLineInputFile::Data *ifd, + int minY, + char *&buffer, + int &dataSize) +{ + // + // Read a single line buffer from the input file. + // + // If the input file is not memory-mapped, we copy the pixel data into + // into the array pointed to by buffer. If the file is memory-mapped, + // then we change where buffer points to instead of writing into the + // array (hence buffer needs to be a reference to a char *). + // + + Int64 lineOffset = + ifd->lineOffsets[(minY - ifd->minY) / ifd->linesInBuffer]; + + if (lineOffset == 0) + THROW (Iex::InputExc, "Scan line " << minY << " is missing."); + + // + // Seek to the start of the scan line in the file, + // if necessary. + // + + if (ifd->nextLineBufferMinY != minY) + ifd->is->seekg (lineOffset); + + // + // Read the data block's header. + // + + int yInFile; + + Xdr::read (*ifd->is, yInFile); + Xdr::read (*ifd->is, dataSize); + + if (yInFile != minY) + throw Iex::InputExc ("Unexpected data block y coordinate."); + + if (dataSize > (int) ifd->lineBufferSize) + throw Iex::InputExc ("Unexpected data block length."); + + // + // Read the pixel data. + // + + if (ifd->is->isMemoryMapped ()) + buffer = ifd->is->readMemoryMapped (dataSize); + else + ifd->is->read (buffer, dataSize); + + // + // Keep track of which scan line is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + if (ifd->lineOrder == INCREASING_Y) + ifd->nextLineBufferMinY = minY + ifd->linesInBuffer; + else + ifd->nextLineBufferMinY = minY - ifd->linesInBuffer; +} + + +// +// A LineBufferTask encapsulates the task uncompressing a set of +// scanlines (line buffer) and copying them into the frame buffer. +// + +class LineBufferTask : public Task +{ + public: + + LineBufferTask (TaskGroup *group, + ScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax); + + virtual ~LineBufferTask (); + + virtual void execute (); + + private: + + ScanLineInputFile::Data * _ifd; + LineBuffer * _lineBuffer; + int _scanLineMin; + int _scanLineMax; +}; + + +LineBufferTask::LineBufferTask + (TaskGroup *group, + ScanLineInputFile::Data *ifd, + LineBuffer *lineBuffer, + int scanLineMin, + int scanLineMax) +: + Task (group), + _ifd (ifd), + _lineBuffer (lineBuffer), + _scanLineMin (scanLineMin), + _scanLineMax (scanLineMax) +{ + // empty +} + + +LineBufferTask::~LineBufferTask () +{ + // + // Signal that the line buffer is now free + // + + _lineBuffer->post (); +} + + +void +LineBufferTask::execute () +{ + try + { + // + // Uncompress the data, if necessary + // + + if (_lineBuffer->uncompressedData == 0) + { + int uncompressedSize = 0; + int maxY = min (_lineBuffer->maxY, _ifd->maxY); + + for (int i = _lineBuffer->minY - _ifd->minY; + i <= maxY - _ifd->minY; + ++i) + { + uncompressedSize += (int) _ifd->bytesPerLine[i]; + } + + if (_lineBuffer->compressor && + _lineBuffer->dataSize < uncompressedSize) + { + _lineBuffer->format = _lineBuffer->compressor->format(); + + _lineBuffer->dataSize = _lineBuffer->compressor->uncompress + (_lineBuffer->buffer, _lineBuffer->dataSize, + _lineBuffer->minY, _lineBuffer->uncompressedData); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + _lineBuffer->format = Compressor::XDR; + _lineBuffer->uncompressedData = _lineBuffer->buffer; + } + } + + int yStart, yStop, dy; + + if (_ifd->lineOrder == INCREASING_Y) + { + yStart = _scanLineMin; + yStop = _scanLineMax + 1; + dy = 1; + } + else + { + yStart = _scanLineMax; + yStop = _scanLineMin - 1; + dy = -1; + } + + for (int y = yStart; y != yStop; y += dy) + { + // + // Convert one scan line's worth of pixel data back + // from the machine-independent representation, and + // store the result in the frame buffer. + // + + const char *readPtr = _lineBuffer->uncompressedData + + _ifd->offsetInLineBuffer[y - _ifd->minY]; + + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ifd->slices.size(); ++i) + { + // + // Test if scan line y of this channel contains any data + // (the scan line contains data only if y % ySampling == 0). + // + + const InSliceInfo &slice = _ifd->slices[i]; + + if (modp (y, slice.ySampling) != 0) + continue; + + // + // Find the x coordinates of the leftmost and rightmost + // sampled pixels (i.e. pixels within the data window + // for which x % xSampling == 0). + // + + int dMinX = divp (_ifd->minX, slice.xSampling); + int dMaxX = divp (_ifd->maxX, slice.xSampling); + + // + // Fill the frame buffer with pixel data. + // + + if (slice.skip) + { + // + // The file contains data for this channel, but + // the frame buffer contains no slice for this channel. + // + + skipChannel (readPtr, slice.typeInFile, dMaxX - dMinX + 1); + } + else + { + // + // The frame buffer contains a slice for this channel. + // + + char *linePtr = slice.base + + divp (y, slice.ySampling) * + slice.yStride; + + char *writePtr = linePtr + dMinX * slice.xStride; + char *endPtr = linePtr + dMaxX * slice.xStride; + + copyIntoFrameBuffer (readPtr, writePtr, endPtr, + slice.xStride, slice.fill, + slice.fillValue, _lineBuffer->format, + slice.typeInFrameBuffer, + slice.typeInFile); + } + } + } + } + catch (std::exception &e) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = e.what(); + _lineBuffer->hasException = true; + } + } + catch (...) + { + if (!_lineBuffer->hasException) + { + _lineBuffer->exception = "unrecognized exception"; + _lineBuffer->hasException = true; + } + } +} + + +LineBufferTask * +newLineBufferTask + (TaskGroup *group, + ScanLineInputFile::Data *ifd, + int number, + int scanLineMin, + int scanLineMax) +{ + // + // Wait for a line buffer to become available, fill the line + // buffer with raw data from the file if necessary, and create + // a new LineBufferTask whose execute() method will uncompress + // the contents of the buffer and copy the pixels into the + // frame buffer. + // + + LineBuffer *lineBuffer = ifd->getLineBuffer (number); + + try + { + lineBuffer->wait (); + + if (lineBuffer->number != number) + { + lineBuffer->minY = ifd->minY + number * ifd->linesInBuffer; + lineBuffer->maxY = lineBuffer->minY + ifd->linesInBuffer - 1; + + lineBuffer->number = number; + lineBuffer->uncompressedData = 0; + + readPixelData (ifd, lineBuffer->minY, + lineBuffer->buffer, + lineBuffer->dataSize); + } + } + catch (std::exception &e) + { + if (!lineBuffer->hasException) + { + lineBuffer->exception = e.what(); + lineBuffer->hasException = true; + } + lineBuffer->number = -1; + lineBuffer->post();\ + throw; + } + catch (...) + { + // + // Reading from the file caused an exception. + // Signal that the line buffer is free, and + // re-throw the exception. + // + + lineBuffer->exception = "unrecognized exception"; + lineBuffer->hasException = true; + lineBuffer->number = -1; + lineBuffer->post(); + throw; + } + + scanLineMin = max (lineBuffer->minY, scanLineMin); + scanLineMax = min (lineBuffer->maxY, scanLineMax); + + return new LineBufferTask (group, ifd, lineBuffer, + scanLineMin, scanLineMax); +} + +} // namespace + + +ScanLineInputFile::ScanLineInputFile + (const Header &header, + IStream *is, + int numThreads) +: + _data (new Data (is, numThreads)) +{ + try + { + _data->header = header; + + _data->lineOrder = _data->header.lineOrder(); + + const Box2i &dataWindow = _data->header.dataWindow(); + + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + size_t maxBytesPerLine = bytesPerLineTable (_data->header, + _data->bytesPerLine); + + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + { + _data->lineBuffers[i] = new LineBuffer (newCompressor + (_data->header.compression(), + maxBytesPerLine, + _data->header)); + } + + _data->linesInBuffer = + numLinesInBuffer (_data->lineBuffers[0]->compressor); + + _data->lineBufferSize = maxBytesPerLine * _data->linesInBuffer; + + if (!_data->is->isMemoryMapped()) + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + _data->lineBuffers[i]->buffer = new char[_data->lineBufferSize]; + + _data->nextLineBufferMinY = _data->minY - 1; + + offsetInLineBufferTable (_data->bytesPerLine, + _data->linesInBuffer, + _data->offsetInLineBuffer); + + int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y + + _data->linesInBuffer) / _data->linesInBuffer; + + _data->lineOffsets.resize (lineOffsetSize); + + readLineOffsets (*_data->is, + _data->lineOrder, + _data->lineOffsets, + _data->fileIsComplete); + } + catch (...) + { + delete _data; + throw; + } +} + + +ScanLineInputFile::~ScanLineInputFile () +{ + if (!_data->is->isMemoryMapped()) + for (size_t i = 0; i < _data->lineBuffers.size(); i++) + delete [] _data->lineBuffers[i]->buffer; + + delete _data; +} + + +const char * +ScanLineInputFile::fileName () const +{ + return _data->is->fileName(); +} + + +const Header & +ScanLineInputFile::header () const +{ + return _data->header; +} + + +int +ScanLineInputFile::version () const +{ + return _data->version; +} + + +void +ScanLineInputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + Lock lock (*_data); + + // + // Check if the new frame buffer descriptor is + // compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + ChannelList::ConstIterator i = channels.find (j.name()); + + if (i == channels.end()) + continue; + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + THROW (Iex::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of input file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + + // + // Initialize the slice table for readPixels(). + // + + vector slices; + ChannelList::ConstIterator i = channels.begin(); + + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + while (i != channels.end() && strcmp (i.name(), j.name()) < 0) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (InSliceInfo (i.channel().type, + i.channel().type, + 0, // base + 0, // xStride + 0, // yStride + i.channel().xSampling, + i.channel().ySampling, + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + bool fill = false; + + if (i == channels.end() || strcmp (i.name(), j.name()) > 0) + { + // + // Channel i is present in the frame buffer, but not in the file. + // In the frame buffer, slice j will be filled with a default value. + // + + fill = true; + } + + slices.push_back (InSliceInfo (j.slice().type, + fill? j.slice().type: + i.channel().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + j.slice().xSampling, + j.slice().ySampling, + fill, + false, // skip + j.slice().fillValue)); + + if (i != channels.end() && !fill) + ++i; + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; +} + + +const FrameBuffer & +ScanLineInputFile::frameBuffer () const +{ + Lock lock (*_data); + return _data->frameBuffer; +} + + +bool +ScanLineInputFile::isComplete () const +{ + return _data->fileIsComplete; +} + + +void +ScanLineInputFile::readPixels (int scanLine1, int scanLine2) +{ + try + { + Lock lock (*_data); + + if (_data->slices.size() == 0) + throw Iex::ArgExc ("No frame buffer specified " + "as pixel data destination."); + + int scanLineMin = min (scanLine1, scanLine2); + int scanLineMax = max (scanLine1, scanLine2); + + if (scanLineMin < _data->minY || scanLineMax > _data->maxY) + throw Iex::ArgExc ("Tried to read scan line outside " + "the image file's data window."); + + // + // We impose a numbering scheme on the lineBuffers where the first + // scanline is contained in lineBuffer 1. + // + // Determine the first and last lineBuffer numbers in this scanline + // range. We always attempt to read the scanlines in the order that + // they are stored in the file. + // + + int start, stop, dl; + + if (_data->lineOrder == INCREASING_Y) + { + start = (scanLineMin - _data->minY) / _data->linesInBuffer; + stop = (scanLineMax - _data->minY) / _data->linesInBuffer + 1; + dl = 1; + } + else + { + start = (scanLineMax - _data->minY) / _data->linesInBuffer; + stop = (scanLineMin - _data->minY) / _data->linesInBuffer - 1; + dl = -1; + } + + // + // Create a task group for all line buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + + // + // Add the line buffer tasks. + // + // The tasks will execute in the order that they are created + // because we lock the line buffers during construction and the + // constructors are called by the main thread. Hence, in order + // for a successive task to execute the previous task which + // used that line buffer must have completed already. + // + + for (int l = start; l != stop; l += dl) + { + ThreadPool::addGlobalTask (newLineBufferTask (&taskGroup, + _data, l, + scanLineMin, + scanLineMax)); + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // LineBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to ScanLineInputFile::readPixels(). + // LineBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the line buffers. + // Now we check if any line buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple line buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (int i = 0; i < _data->lineBuffers.size(); ++i) + { + LineBuffer *lineBuffer = _data->lineBuffers[i]; + + if (lineBuffer->hasException && !exception) + exception = &lineBuffer->exception; + + lineBuffer->hasException = false; + } + + if (exception) + throw Iex::IoExc (*exception); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +ScanLineInputFile::readPixels (int scanLine) +{ + readPixels (scanLine, scanLine); +} + + +void +ScanLineInputFile::rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + Lock lock (*_data); + + if (firstScanLine < _data->minY || firstScanLine > _data->maxY) + { + throw Iex::ArgExc ("Tried to read scan line outside " + "the image file's data window."); + } + + int minY = lineBufferMinY + (firstScanLine, _data->minY, _data->linesInBuffer); + + readPixelData + (_data, minY, _data->lineBuffers[0]->buffer, pixelDataSize); + + pixelData = _data->lineBuffers[0]->buffer; + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfScanLineInputFile.h b/3rdparty/openexr/IlmImf/ImfScanLineInputFile.h new file mode 100644 index 000000000..02b36e284 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfScanLineInputFile.h @@ -0,0 +1,172 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_SCAN_LINE_INPUT_FILE_H +#define INCLUDED_IMF_SCAN_LINE_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class ScanLineInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +namespace Imf { + + +class ScanLineInputFile +{ + public: + + //------------ + // Constructor + //------------ + + ScanLineInputFile (const Header &header, IStream *is, + int numThreads = globalThreadCount()); + + + //----------------------------------------- + // Destructor -- deallocates internal data + // structures, but does not close the file. + //----------------------------------------- + + virtual ~ScanLineInputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the InputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readPixels() is called. + // The current frame buffer can be changed after each call + // to readPixels(). + //----------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //--------------------------------------------------------------- + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window are + // present in the input file, or false if any pixels are missing. + // (Another program may still be busy writing the file, or file + // writing may have been aborted prematurely.) + //--------------------------------------------------------------- + + bool isComplete () const; + + + //--------------------------------------------------------------- + // Read pixel data: + // + // readPixels(s1,s2) reads all scan lines with y coordinates + // in the interval [min (s1, s2), max (s1, s2)] from the file, + // and stores them in the current frame buffer. + // + // Both s1 and s2 must be within the interval + // [header().dataWindow().min.y, header.dataWindow().max.y] + // + // The scan lines can be read from the file in random order, and + // individual scan lines may be skipped or read multiple times. + // For maximum efficiency, the scan lines should be read in the + // order in which they were written to the file. + // + // readPixels(s) calls readPixels(s,s). + // + // If threading is enabled, readPixels (s1, s2) tries to perform + // decopmression of multiple scanlines in parallel. + // + //--------------------------------------------------------------- + + void readPixels (int scanLine1, int scanLine2); + void readPixels (int scanLine); + + + //---------------------------------------------- + // Read a block of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement OutputFile::copyPixels()). + //---------------------------------------------- + + void rawPixelData (int firstScanLine, + const char *&pixelData, + int &pixelDataSize); + + struct Data; + + private: + + Data * _data; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfStandardAttributes.cpp b/3rdparty/openexr/IlmImf/ImfStandardAttributes.cpp new file mode 100644 index 000000000..baa2c1f2e --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStandardAttributes.cpp @@ -0,0 +1,118 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2003, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Optional Standard Attributes +// +//----------------------------------------------------------------------------- + +#include + + +#define IMF_STRING(name) #name + +#define IMF_STD_ATTRIBUTE_IMP(name,suffix,type) \ + \ + void \ + add##suffix (Header &header, const type &value) \ + { \ + header.insert (IMF_STRING (name), TypedAttribute (value)); \ + } \ + \ + bool \ + has##suffix (const Header &header) \ + { \ + return header.findTypedAttribute > \ + (IMF_STRING (name)) != 0; \ + } \ + \ + const TypedAttribute & \ + name##Attribute (const Header &header) \ + { \ + return header.typedAttribute > \ + (IMF_STRING (name)); \ + } \ + \ + TypedAttribute & \ + name##Attribute (Header &header) \ + { \ + return header.typedAttribute > \ + (IMF_STRING (name)); \ + } \ + \ + const type & \ + name (const Header &header) \ + { \ + return name##Attribute(header).value(); \ + } \ + \ + type & \ + name (Header &header) \ + { \ + return name##Attribute(header).value(); \ + } + + +namespace Imf { + + +IMF_STD_ATTRIBUTE_IMP (chromaticities, Chromaticities, Chromaticities) +IMF_STD_ATTRIBUTE_IMP (whiteLuminance, WhiteLuminance, float) +IMF_STD_ATTRIBUTE_IMP (adoptedNeutral, AdoptedNeutral, Imath::V2f) +IMF_STD_ATTRIBUTE_IMP (renderingTransform, RenderingTransform, std::string) +IMF_STD_ATTRIBUTE_IMP (lookModTransform, LookModTransform, std::string) +IMF_STD_ATTRIBUTE_IMP (xDensity, XDensity, float) +IMF_STD_ATTRIBUTE_IMP (owner, Owner, std::string) +IMF_STD_ATTRIBUTE_IMP (comments, Comments, std::string) +IMF_STD_ATTRIBUTE_IMP (capDate, CapDate, std::string) +IMF_STD_ATTRIBUTE_IMP (utcOffset, UtcOffset, float) +IMF_STD_ATTRIBUTE_IMP (longitude, Longitude, float) +IMF_STD_ATTRIBUTE_IMP (latitude, Latitude, float) +IMF_STD_ATTRIBUTE_IMP (altitude, Altitude, float) +IMF_STD_ATTRIBUTE_IMP (focus, Focus, float) +IMF_STD_ATTRIBUTE_IMP (expTime, ExpTime, float) +IMF_STD_ATTRIBUTE_IMP (aperture, Aperture, float) +IMF_STD_ATTRIBUTE_IMP (isoSpeed, IsoSpeed, float) +IMF_STD_ATTRIBUTE_IMP (envmap, Envmap, Envmap) +IMF_STD_ATTRIBUTE_IMP (keyCode, KeyCode, KeyCode) +IMF_STD_ATTRIBUTE_IMP (timeCode, TimeCode, TimeCode) +IMF_STD_ATTRIBUTE_IMP (wrapmodes, Wrapmodes, std::string) +IMF_STD_ATTRIBUTE_IMP (framesPerSecond, FramesPerSecond, Rational) +IMF_STD_ATTRIBUTE_IMP (multiView, MultiView, StringVector) +IMF_STD_ATTRIBUTE_IMP (worldToCamera, WorldToCamera, Imath::M44f) +IMF_STD_ATTRIBUTE_IMP (worldToNDC, WorldToNDC, Imath::M44f) + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfStandardAttributes.h b/3rdparty/openexr/IlmImf/ImfStandardAttributes.h new file mode 100644 index 000000000..38783b1bd --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStandardAttributes.h @@ -0,0 +1,343 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_STANDARD_ATTRIBUTES_H +#define INCLUDED_IMF_STANDARD_ATTRIBUTES_H + +//----------------------------------------------------------------------------- +// +// Optional Standard Attributes -- these attributes are "optional" +// because not every image file header has them, but they define a +// "standard" way to represent commonly used data in the file header. +// +// For each attribute, with name "foo", and type "T", the following +// functions are automatically generated via macros: +// +// void addFoo (Header &header, const T &value); +// bool hasFoo (const Header &header); +// const TypedAttribute & fooAttribute (const Header &header); +// TypedAttribute & fooAttribute (Header &header); +// const T & foo (const Header &Header); +// T & foo (Header &Header); +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IMF_STD_ATTRIBUTE_DEF(name,suffix,type) \ + \ + void add##suffix (Header &header, const type &v); \ + bool has##suffix (const Header &header); \ + const TypedAttribute & name##Attribute (const Header &header); \ + TypedAttribute & name##Attribute (Header &header); \ + const type & name (const Header &header); \ + type & name (Header &header); + + +namespace Imf { + +// +// chromaticities -- for RGB images, specifies the CIE (x,y) +// chromaticities of the primaries and the white point +// + +IMF_STD_ATTRIBUTE_DEF (chromaticities, Chromaticities, Chromaticities) + + +// +// whiteLuminance -- for RGB images, defines the luminance, in Nits +// (candelas per square meter) of the RGB value (1.0, 1.0, 1.0). +// +// If the chromaticities and the whiteLuminance of an RGB image are +// known, then it is possible to convert the image's pixels from RGB +// to CIE XYZ tristimulus values (see function RGBtoXYZ() in header +// file ImfChromaticities.h). +// +// + +IMF_STD_ATTRIBUTE_DEF (whiteLuminance, WhiteLuminance, float) + + +// +// adoptedNeutral -- specifies the CIE (x,y) coordinates that should +// be considered neutral during color rendering. Pixels in the image +// file whose (x,y) coordinates match the adoptedNeutral value should +// be mapped to neutral values on the display. +// + +IMF_STD_ATTRIBUTE_DEF (adoptedNeutral, AdoptedNeutral, Imath::V2f) + + +// +// renderingTransform, lookModTransform -- specify the names of the +// CTL functions that implements the intended color rendering and look +// modification transforms for this image. +// + +IMF_STD_ATTRIBUTE_DEF (renderingTransform, RenderingTransform, std::string) +IMF_STD_ATTRIBUTE_DEF (lookModTransform, LookModTransform, std::string) + + +// +// xDensity -- horizontal output density, in pixels per inch. +// The image's vertical output density is xDensity * pixelAspectRatio. +// + +IMF_STD_ATTRIBUTE_DEF (xDensity, XDensity, float) + + +// +// owner -- name of the owner of the image +// + +IMF_STD_ATTRIBUTE_DEF (owner, Owner, std::string) + + +// +// comments -- additional image information in human-readable +// form, for example a verbal description of the image +// + +IMF_STD_ATTRIBUTE_DEF (comments, Comments, std::string) + + +// +// capDate -- the date when the image was created or captured, +// in local time, and formatted as +// +// YYYY:MM:DD hh:mm:ss +// +// where YYYY is the year (4 digits, e.g. 2003), MM is the month +// (2 digits, 01, 02, ... 12), DD is the day of the month (2 digits, +// 01, 02, ... 31), hh is the hour (2 digits, 00, 01, ... 23), mm +// is the minute, and ss is the second (2 digits, 00, 01, ... 59). +// +// + +IMF_STD_ATTRIBUTE_DEF (capDate, CapDate, std::string) + + +// +// utcOffset -- offset of local time at capDate from +// Universal Coordinated Time (UTC), in seconds: +// +// UTC == local time + utcOffset +// + +IMF_STD_ATTRIBUTE_DEF (utcOffset, UtcOffset, float) + + +// +// longitude, latitude, altitude -- for images of real objects, the +// location where the image was recorded. Longitude and latitude are +// in degrees east of Greenwich and north of the equator. Altitude +// is in meters above sea level. For example, Kathmandu, Nepal is +// at longitude 85.317, latitude 27.717, altitude 1305. +// + +IMF_STD_ATTRIBUTE_DEF (longitude, Longitude, float) +IMF_STD_ATTRIBUTE_DEF (latitude, Latitude, float) +IMF_STD_ATTRIBUTE_DEF (altitude, Altitude, float) + + +// +// focus -- the camera's focus distance, in meters +// + +IMF_STD_ATTRIBUTE_DEF (focus, Focus, float) + + +// +// exposure -- exposure time, in seconds +// + +IMF_STD_ATTRIBUTE_DEF (expTime, ExpTime, float) + + +// +// aperture -- the camera's lens aperture, in f-stops (focal length +// of the lens divided by the diameter of the iris opening) +// + +IMF_STD_ATTRIBUTE_DEF (aperture, Aperture, float) + + +// +// isoSpeed -- the ISO speed of the film or image sensor +// that was used to record the image +// + +IMF_STD_ATTRIBUTE_DEF (isoSpeed, IsoSpeed, float) + + +// +// envmap -- if this attribute is present, the image represents +// an environment map. The attribute's value defines how 3D +// directions are mapped to 2D pixel locations. For details +// see header file ImfEnvmap.h +// + +IMF_STD_ATTRIBUTE_DEF (envmap, Envmap, Envmap) + + +// +// keyCode -- for motion picture film frames. Identifies film +// manufacturer, film type, film roll and frame position within +// the roll. +// + +IMF_STD_ATTRIBUTE_DEF (keyCode, KeyCode, KeyCode) + + +// +// timeCode -- time and control code +// + +IMF_STD_ATTRIBUTE_DEF (timeCode, TimeCode, TimeCode) + + +// +// wrapmodes -- determines how texture map images are extrapolated. +// If an OpenEXR file is used as a texture map for 3D rendering, +// texture coordinates (0.0, 0.0) and (1.0, 1.0) correspond to +// the upper left and lower right corners of the data window. +// If the image is mapped onto a surface with texture coordinates +// outside the zero-to-one range, then the image must be extrapolated. +// This attribute tells the renderer how to do this extrapolation. +// The attribute contains either a pair of comma-separated keywords, +// to specify separate extrapolation modes for the horizontal and +// vertical directions; or a single keyword, to specify extrapolation +// in both directions (e.g. "clamp,periodic" or "clamp"). Extra white +// space surrounding the keywords is allowed, but should be ignored +// by the renderer ("clamp, black " is equivalent to "clamp,black"). +// The keywords listed below are predefined; some renderers may support +// additional extrapolation modes: +// +// black pixels outside the zero-to-one range are black +// +// clamp texture coordinates less than 0.0 and greater +// than 1.0 are clamped to 0.0 and 1.0 respectively +// +// periodic the texture image repeats periodically +// +// mirror the texture image repeats periodically, but +// every other instance is mirrored +// + +IMF_STD_ATTRIBUTE_DEF (wrapmodes, Wrapmodes, std::string) + + +// +// framesPerSecond -- defines the nominal playback frame rate for image +// sequences, in frames per second. Every image in a sequence should +// have a framesPerSecond attribute, and the attribute value should be +// the same for all images in the sequence. If an image sequence has +// no framesPerSecond attribute, playback software should assume that +// the frame rate for the sequence is 24 frames per second. +// +// In order to allow exact representation of NTSC frame and field rates, +// framesPerSecond is stored as a rational number. A rational number is +// a pair of integers, n and d, that represents the value n/d. +// +// For the exact values of commonly used frame rates, please see header +// file ImfFramesPerSecond.h. +// + +IMF_STD_ATTRIBUTE_DEF (framesPerSecond, FramesPerSecond, Rational) + + +// +// multiView -- defines the view names for multi-view image files. +// A multi-view image contains two or more views of the same scene, +// as seen from different viewpoints, for example a left-eye and +// a right-eye view for stereo displays. The multiView attribute +// lists the names of the views in an image, and a naming convention +// identifies the channels that belong to each view. +// +// For details, please see header file ImfMultiView.h +// + +IMF_STD_ATTRIBUTE_DEF (multiView , MultiView, StringVector) + + +// +// worldToCamera -- for images generated by 3D computer graphics rendering, +// a matrix that transforms 3D points from the world to the camera coordinate +// space of the renderer. +// +// The camera coordinate space is left-handed. Its origin indicates the +// location of the camera. The positive x and y axes correspond to the +// "right" and "up" directions in the rendered image. The positive z +// axis indicates the camera's viewing direction. (Objects in front of +// the camera have positive z coordinates.) +// +// Camera coordinate space in OpenEXR is the same as in Pixar's Renderman. +// + +IMF_STD_ATTRIBUTE_DEF (worldToCamera, WorldToCamera, Imath::M44f) + + +// +// worldToNDC -- for images generated by 3D computer graphics rendering, a +// matrix that transforms 3D points from the world to the Normalized Device +// Coordinate (NDC) space of the renderer. +// +// NDC is a 2D coordinate space that corresponds to the image plane, with +// positive x and pointing to the right and y positive pointing down. The +// coordinates (0, 0) and (1, 1) correspond to the upper left and lower right +// corners of the OpenEXR display window. +// +// To transform a 3D point in word space into a 2D point in NDC space, +// multiply the 3D point by the worldToNDC matrix and discard the z +// coordinate. +// +// NDC space in OpenEXR is the same as in Pixar's Renderman. +// + +IMF_STD_ATTRIBUTE_DEF (worldToNDC, WorldToNDC, Imath::M44f) + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfStdIO.cpp b/3rdparty/openexr/IlmImf/ImfStdIO.cpp new file mode 100644 index 000000000..502841038 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStdIO.cpp @@ -0,0 +1,240 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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.67 +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR +// based on C++ standard iostreams. +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include + +using namespace std; + +namespace Imf { +namespace { + +void +clearError () +{ + errno = 0; +} + + +bool +checkError (istream &is, streamsize expected = 0) +{ + if (!is) + { + if (errno) + Iex::throwErrnoExc(); + + if (is.gcount() < expected) + { + THROW (Iex::InputExc, "Early end of file: read " << is.gcount() + << " out of " << expected << " requested bytes."); + } + return false; + } + + return true; +} + + +void +checkError (ostream &os) +{ + if (!os) + { + if (errno) + Iex::throwErrnoExc(); + + throw Iex::ErrnoExc ("File output failed."); + } +} + +} // namespace + + +StdIFStream::StdIFStream (const char fileName[]): + IStream (fileName), + _is (new ifstream (fileName, ios_base::binary)), + _deleteStream (true) +{ + if (!*_is) + { + delete _is; + Iex::throwErrnoExc(); + } +} + + +StdIFStream::StdIFStream (ifstream &is, const char fileName[]): + IStream (fileName), + _is (&is), + _deleteStream (false) +{ + // empty +} + + +StdIFStream::~StdIFStream () +{ + if (_deleteStream) + delete _is; +} + + +bool +StdIFStream::read (char c[/*n*/], int n) +{ + if (!*_is) + throw Iex::InputExc ("Unexpected end of file."); + + clearError(); + _is->read (c, n); + return checkError (*_is, n); +} + + +Int64 +StdIFStream::tellg () +{ + return std::streamoff (_is->tellg()); +} + + +void +StdIFStream::seekg (Int64 pos) +{ + _is->seekg (pos); + checkError (*_is); +} + + +void +StdIFStream::clear () +{ + _is->clear(); +} + + +StdOFStream::StdOFStream (const char fileName[]): + OStream (fileName), + _os (new ofstream (fileName, ios_base::binary)), + _deleteStream (true) +{ + if (!*_os) + { + delete _os; + Iex::throwErrnoExc(); + } +} + + +StdOFStream::StdOFStream (ofstream &os, const char fileName[]): + OStream (fileName), + _os (&os), + _deleteStream (false) +{ + // empty +} + + +StdOFStream::~StdOFStream () +{ + if (_deleteStream) + delete _os; +} + + +void +StdOFStream::write (const char c[/*n*/], int n) +{ + clearError(); + _os->write (c, n); + checkError (*_os); +} + + +Int64 +StdOFStream::tellp () +{ + return std::streamoff (_os->tellp()); +} + + +void +StdOFStream::seekp (Int64 pos) +{ + _os->seekp (pos); + checkError (*_os); +} + + +StdOSStream::StdOSStream (): OStream ("(string)") +{ + // empty +} + + +void +StdOSStream::write (const char c[/*n*/], int n) +{ + clearError(); + _os.write (c, n); + checkError (_os); +} + + +Int64 +StdOSStream::tellp () +{ + return std::streamoff (_os.tellp()); +} + + +void +StdOSStream::seekp (Int64 pos) +{ + _os.seekp (pos); + checkError (_os); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfStdIO.h b/3rdparty/openexr/IlmImf/ImfStdIO.h new file mode 100644 index 000000000..0137b45a1 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStdIO.h @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_STD_IO_H +#define INCLUDED_IMF_STD_IO_H + +//----------------------------------------------------------------------------- +// +// Low-level file input and output for OpenEXR +// based on C++ standard iostreams. +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +namespace Imf { + +//------------------------------------------- +// class StdIFStream -- an implementation of +// class IStream based on class std::ifstream +//------------------------------------------- + +class StdIFStream: public IStream +{ + public: + + //------------------------------------------------------- + // A constructor that opens the file with the given name. + // The destructor will close the file. + //------------------------------------------------------- + + StdIFStream (const char fileName[]); + + + //--------------------------------------------------------- + // A constructor that uses a std::ifstream that has already + // been opened by the caller. The StdIFStream's destructor + // will not close the std::ifstream. + //--------------------------------------------------------- + + StdIFStream (std::ifstream &is, const char fileName[]); + + + virtual ~StdIFStream (); + + virtual bool read (char c[/*n*/], int n); + virtual Int64 tellg (); + virtual void seekg (Int64 pos); + virtual void clear (); + + private: + + std::ifstream * _is; + bool _deleteStream; +}; + + +//------------------------------------------- +// class StdOFStream -- an implementation of +// class OStream based on class std::ofstream +//------------------------------------------- + +class StdOFStream: public OStream +{ + public: + + //------------------------------------------------------- + // A constructor that opens the file with the given name. + // The destructor will close the file. + //------------------------------------------------------- + + StdOFStream (const char fileName[]); + + + //--------------------------------------------------------- + // A constructor that uses a std::ofstream that has already + // been opened by the caller. The StdOFStream's destructor + // will not close the std::ofstream. + //--------------------------------------------------------- + + StdOFStream (std::ofstream &os, const char fileName[]); + + + virtual ~StdOFStream (); + + virtual void write (const char c[/*n*/], int n); + virtual Int64 tellp (); + virtual void seekp (Int64 pos); + + private: + + std::ofstream * _os; + bool _deleteStream; +}; + + +//------------------------------------------------ +// class StdOSStream -- an implementation of class +// OStream, based on class std::ostringstream +//------------------------------------------------ + +class StdOSStream: public OStream +{ + public: + + StdOSStream (); + + virtual void write (const char c[/*n*/], int n); + virtual Int64 tellp (); + virtual void seekp (Int64 pos); + + std::string str () const {return _os.str();} + + private: + + std::ostringstream _os; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfStringAttribute.cpp b/3rdparty/openexr/IlmImf/ImfStringAttribute.cpp new file mode 100644 index 000000000..6f6ca9499 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStringAttribute.cpp @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class StringAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +StringAttribute::staticTypeName () +{ + return "string"; +} + + +template <> +void +StringAttribute::writeValueTo (OStream &os, int version) const +{ + int size = _value.size(); + + for (int i = 0; i < size; i++) + Xdr::write (os, _value[i]); +} + + +template <> +void +StringAttribute::readValueFrom (IStream &is, int size, int version) +{ + _value.resize (size); + + for (int i = 0; i < size; i++) + Xdr::read (is, _value[i]); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfStringAttribute.h b/3rdparty/openexr/IlmImf/ImfStringAttribute.h new file mode 100644 index 000000000..3ce76ebb3 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStringAttribute.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_STRING_ATTRIBUTE_H +#define INCLUDED_IMF_STRING_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class StringAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute StringAttribute; +template <> const char *StringAttribute::staticTypeName (); +template <> void StringAttribute::writeValueTo (OStream &, int) const; +template <> void StringAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp b/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp new file mode 100644 index 000000000..76b21be12 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class StringAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +StringVectorAttribute::staticTypeName () +{ + return "stringvector"; +} + + +template <> +void +StringVectorAttribute::writeValueTo (OStream &os, int version) const +{ + int size = _value.size(); + + for (int i = 0; i < size; i++) + { + int strSize = _value[i].size(); + Xdr::write (os, strSize); + Xdr::write (os, &_value[i][0], strSize); + } +} + + +template <> +void +StringVectorAttribute::readValueFrom (IStream &is, int size, int version) +{ + int read = 0; + + while (read < size) + { + int strSize; + Xdr::read (is, strSize); + read += Xdr::size(); + + std::string str; + str.resize (strSize); + + Xdr::read (is, &str[0], strSize); + read += strSize; + + _value.push_back (str); + } +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.h b/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.h new file mode 100644 index 000000000..752a486a3 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2007, Weta Digital Ltd +// +// 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 Weta Digital 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 INCLUDED_IMF_STRINGVECTOR_ATTRIBUTE_H +#define INCLUDED_IMF_STRINGVECTOR_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class StringVectorAttribute +// +//----------------------------------------------------------------------------- + +#include +#include +#include + + +namespace Imf { + +typedef std::vector StringVector; +typedef TypedAttribute StringVectorAttribute; +template <> const char *StringVectorAttribute::staticTypeName (); +template <> void StringVectorAttribute::writeValueTo (OStream &, int) const; +template <> void StringVectorAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTestFile.cpp b/3rdparty/openexr/IlmImf/ImfTestFile.cpp new file mode 100644 index 000000000..1bf78729c --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTestFile.cpp @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Utility routines to test quickly if a given +// file is an OpenEXR file, and whether the +// file is scanline-based or tiled. +// +//----------------------------------------------------------------------------- + + +#include +#include +#include +#include + +namespace Imf { + + +bool +isOpenExrFile (const char fileName[], bool &tiled) +{ + try + { + StdIFStream is (fileName); + + int magic, version; + Xdr::read (is, magic); + Xdr::read (is, version); + + tiled = isTiled (version); + return magic == MAGIC; + } + catch (...) + { + tiled = false; + return false; + } +} + + +bool +isOpenExrFile (const char fileName[]) +{ + bool tiled; + return isOpenExrFile (fileName, tiled); +} + + +bool +isTiledOpenExrFile (const char fileName[]) +{ + bool exr, tiled; + exr = isOpenExrFile (fileName, tiled); + return exr && tiled; +} + + +bool +isOpenExrFile (IStream &is, bool &tiled) +{ + try + { + Int64 pos = is.tellg(); + + if (pos != 0) + is.seekg (0); + + int magic, version; + Xdr::read (is, magic); + Xdr::read (is, version); + + is.seekg (pos); + + tiled = isTiled (version); + return magic == MAGIC; + } + catch (...) + { + is.clear(); + tiled = false; + return false; + } +} + + +bool +isOpenExrFile (IStream &is) +{ + bool tiled; + return isOpenExrFile (is, tiled); +} + + +bool +isTiledOpenExrFile (IStream &is) +{ + bool exr, tiled; + exr = isOpenExrFile (is, tiled); + return exr && tiled; +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTestFile.h b/3rdparty/openexr/IlmImf/ImfTestFile.h new file mode 100644 index 000000000..d81c61a78 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTestFile.h @@ -0,0 +1,63 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TEST_FILE_H +#define INCLUDED_IMF_TEST_FILE_H + +//----------------------------------------------------------------------------- +// +// Utility routines to test quickly if a given +// file is an OpenEXR file, and whether the +// file is scanline-based or tiled. +// +//----------------------------------------------------------------------------- + + +namespace Imf { + +class IStream; + + +bool isOpenExrFile (const char fileName[], bool &isTiled); +bool isOpenExrFile (const char fileName[]); +bool isTiledOpenExrFile (const char fileName[]); +bool isOpenExrFile (IStream &is, bool &isTiled); +bool isOpenExrFile (IStream &is); +bool isTiledOpenExrFile (IStream &is); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfThreading.cpp b/3rdparty/openexr/IlmImf/ImfThreading.cpp new file mode 100644 index 000000000..80f569c2c --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfThreading.cpp @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Threading support for the IlmImf library +// +//----------------------------------------------------------------------------- + +#include "IlmThreadPool.h" + +namespace Imf { + + +int +globalThreadCount () +{ + return IlmThread::ThreadPool::globalThreadPool().numThreads(); +} + + +void +setGlobalThreadCount (int count) +{ + IlmThread::ThreadPool::globalThreadPool().setNumThreads (count); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfThreading.h b/3rdparty/openexr/IlmImf/ImfThreading.h new file mode 100644 index 000000000..50fe35e6b --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfThreading.h @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_THREADING_H +#define INCLUDED_IMF_THREADING_H + +//----------------------------------------------------------------------------- +// +// Threading support for the IlmImf library +// +// The IlmImf library uses threads to perform reading and writing +// of OpenEXR files in parallel. The thread that calls the library +// always performs the actual file IO (this is usually the main +// application thread) whereas a several worker threads perform +// data compression and decompression. The number of worker +// threads can be any non-negative value (a value of zero reverts +// to single-threaded operation). As long as there is at least +// one worker thread, file IO and compression can potentially be +// done concurrently through pinelining. If there are two or more +// worker threads, then pipelining as well as concurrent compression +// of multiple blocks can be performed. +// +// Threading in the Imf library is controllable at two granularities: +// +// * The functions in this file query and control the total number +// of worker threads, which will be created globally for the whole +// library. Regardless of how many input or output files are +// opened simultaneously, the library will use at most this number +// of worker threads to perform all work. The default number of +// global worker threads is zero (i.e. single-threaded operation; +// everything happens in the thread that calls the library). +// +// * Furthermore, it is possible to set the number of threads that +// each input or output file should keep busy. This number can +// be explicitly set for each file. The default behavior is for +// each file to try to occupy all worker threads in the library's +// thread pool. +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +//----------------------------------------------------------------------------- +// Return the number of Imf-global worker threads used for parallel +// compression and decompression of OpenEXR files. +//----------------------------------------------------------------------------- + +int globalThreadCount (); + + +//----------------------------------------------------------------------------- +// Change the number of Imf-global worker threads +//----------------------------------------------------------------------------- + +void setGlobalThreadCount (int count); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTileDescription.h b/3rdparty/openexr/IlmImf/ImfTileDescription.h new file mode 100644 index 000000000..78bcc0b5e --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTileDescription.h @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TILE_DESCRIPTION_H +#define INCLUDED_IMF_TILE_DESCRIPTION_H + +//----------------------------------------------------------------------------- +// +// class TileDescription and enum LevelMode +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +enum LevelMode +{ + ONE_LEVEL = 0, + MIPMAP_LEVELS = 1, + RIPMAP_LEVELS = 2, + + NUM_LEVELMODES // number of different level modes +}; + + +enum LevelRoundingMode +{ + ROUND_DOWN = 0, + ROUND_UP = 1, + + NUM_ROUNDINGMODES // number of different rounding modes +}; + + +class TileDescription +{ + public: + + unsigned int xSize; // size of a tile in the x dimension + unsigned int ySize; // size of a tile in the y dimension + LevelMode mode; + LevelRoundingMode roundingMode; + + TileDescription (unsigned int xs = 32, + unsigned int ys = 32, + LevelMode m = ONE_LEVEL, + LevelRoundingMode r = ROUND_DOWN) + : + xSize (xs), + ySize (ys), + mode (m), + roundingMode (r) + { + // empty + } + + bool + operator == (const TileDescription &other) const + { + return xSize == other.xSize && + ySize == other.ySize && + mode == other.mode && + roundingMode == other.roundingMode; + } +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp b/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp new file mode 100644 index 000000000..e15f10f80 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TileDescriptionAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +TileDescriptionAttribute::staticTypeName () +{ + return "tiledesc"; +} + + +template <> +void +TileDescriptionAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.xSize); + Xdr::write (os, _value.ySize); + + unsigned char tmp = _value.mode | (_value.roundingMode << 4); + Xdr::write (os, tmp); +} + + +template <> +void +TileDescriptionAttribute::readValueFrom (IStream &is, + int size, + int version) +{ + Xdr::read (is, _value.xSize); + Xdr::read (is, _value.ySize); + + unsigned char tmp; + Xdr::read (is, tmp); + _value.mode = LevelMode (tmp & 0x0f); + _value.roundingMode = LevelRoundingMode ((tmp >> 4) & 0x0f); + +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.h b/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.h new file mode 100644 index 000000000..8a7125a78 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TILE_DESCRIPTION_ATTRIBUTE_H +#define INCLUDED_IMF_TILE_DESCRIPTION_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class TileDescriptionAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + +namespace Imf { + + +typedef TypedAttribute TileDescriptionAttribute; + +template <> +const char * +TileDescriptionAttribute::staticTypeName (); + +template <> +void +TileDescriptionAttribute::writeValueTo (OStream &, int) const; + +template <> +void +TileDescriptionAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTileOffsets.cpp b/3rdparty/openexr/IlmImf/ImfTileOffsets.cpp new file mode 100644 index 000000000..b1fa29ce9 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTileOffsets.cpp @@ -0,0 +1,385 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TileOffsets +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include "Iex.h" + +namespace Imf { + + +TileOffsets::TileOffsets (LevelMode mode, + int numXLevels, int numYLevels, + const int *numXTiles, const int *numYTiles) +: + _mode (mode), + _numXLevels (numXLevels), + _numYLevels (numYLevels) +{ + switch (_mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + _offsets.resize (_numXLevels); + + for (unsigned int l = 0; l < _offsets.size(); ++l) + { + _offsets[l].resize (numYTiles[l]); + + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + { + _offsets[l][dy].resize (numXTiles[l]); + } + } + break; + + case RIPMAP_LEVELS: + + _offsets.resize (_numXLevels * _numYLevels); + + for (unsigned int ly = 0; ly < _numYLevels; ++ly) + { + for (unsigned int lx = 0; lx < _numXLevels; ++lx) + { + int l = ly * _numXLevels + lx; + _offsets[l].resize (numYTiles[ly]); + + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + { + _offsets[l][dy].resize (numXTiles[lx]); + } + } + } + break; + } +} + + +bool +TileOffsets::anyOffsetsAreInvalid () const +{ + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + if (_offsets[l][dy][dx] <= 0) + return true; + + return false; +} + + +void +TileOffsets::findTiles (IStream &is) +{ + for (unsigned int l = 0; l < _offsets.size(); ++l) + { + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + { + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + { + Int64 tileOffset = is.tellg(); + + int tileX; + Xdr::read (is, tileX); + + int tileY; + Xdr::read (is, tileY); + + int levelX; + Xdr::read (is, levelX); + + int levelY; + Xdr::read (is, levelY); + + int dataSize; + Xdr::read (is, dataSize); + + Xdr::skip (is, dataSize); + + if (!isValidTile(tileX, tileY, levelX, levelY)) + return; + + operator () (tileX, tileY, levelX, levelY) = tileOffset; + } + } + } +} + + +void +TileOffsets::reconstructFromFile (IStream &is) +{ + // + // Try to reconstruct a missing tile offset table by sequentially + // scanning through the file, and recording the offsets in the file + // of the tiles we find. + // + + Int64 position = is.tellg(); + + try + { + findTiles (is); + } + catch (...) + { + // + // Suppress all exceptions. This function is called only to + // reconstruct the tile offset table for incomplete files, + // and exceptions are likely. + // + } + + is.clear(); + is.seekg (position); +} + + +void +TileOffsets::readFrom (IStream &is, bool &complete) +{ + // + // Read in the tile offsets from the file's tile offset table + // + + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + Xdr::read (is, _offsets[l][dy][dx]); + + // + // Check if any tile offsets are invalid. + // + // Invalid offsets mean that the file is probably incomplete + // (the offset table is the last thing written to the file). + // Either some process is still busy writing the file, or + // writing the file was aborted. + // + // We should still be able to read the existing parts of the + // file. In order to do this, we have to make a sequential + // scan over the scan tile to reconstruct the tile offset + // table. + // + + if (anyOffsetsAreInvalid()) + { + complete = false; + reconstructFromFile (is); + } + else + { + complete = true; + } + +} + + +Int64 +TileOffsets::writeTo (OStream &os) const +{ + // + // Write the tile offset table to the file, and + // return the position of the start of the table + // in the file. + // + + Int64 pos = os.tellp(); + + if (pos == -1) + Iex::throwErrnoExc ("Cannot determine current file position (%T)."); + + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + Xdr::write (os, _offsets[l][dy][dx]); + + return pos; +} + + +bool +TileOffsets::isEmpty () const +{ + for (unsigned int l = 0; l < _offsets.size(); ++l) + for (unsigned int dy = 0; dy < _offsets[l].size(); ++dy) + for (unsigned int dx = 0; dx < _offsets[l][dy].size(); ++dx) + if (_offsets[l][dy][dx] != 0) + return false; + return true; +} + + +bool +TileOffsets::isValidTile (int dx, int dy, int lx, int ly) const +{ + switch (_mode) + { + case ONE_LEVEL: + + if (lx == 0 && + ly == 0 && + _offsets.size() > 0 && + _offsets[0].size() > dy && + _offsets[0][dy].size() > dx) + { + return true; + } + + break; + + case MIPMAP_LEVELS: + + if (lx < _numXLevels && + ly < _numYLevels && + _offsets.size() > lx && + _offsets[lx].size() > dy && + _offsets[lx][dy].size() > dx) + { + return true; + } + + break; + + case RIPMAP_LEVELS: + + if (lx < _numXLevels && + ly < _numYLevels && + _offsets.size() > lx + ly * _numXLevels && + _offsets[lx + ly * _numXLevels].size() > dy && + _offsets[lx + ly * _numXLevels][dy].size() > dx) + { + return true; + } + + break; + + default: + + return false; + } + + return false; +} + + +Int64 & +TileOffsets::operator () (int dx, int dy, int lx, int ly) +{ + // + // Looks up the value of the tile with tile coordinate (dx, dy) + // and level number (lx, ly) in the _offsets array, and returns + // the cooresponding offset. + // + + switch (_mode) + { + case ONE_LEVEL: + + return _offsets[0][dy][dx]; + break; + + case MIPMAP_LEVELS: + + return _offsets[lx][dy][dx]; + break; + + case RIPMAP_LEVELS: + + return _offsets[lx + ly * _numXLevels][dy][dx]; + break; + + default: + + throw Iex::ArgExc ("Unknown LevelMode format."); + } +} + + +Int64 & +TileOffsets::operator () (int dx, int dy, int l) +{ + return operator () (dx, dy, l, l); +} + + +const Int64 & +TileOffsets::operator () (int dx, int dy, int lx, int ly) const +{ + // + // Looks up the value of the tile with tile coordinate (dx, dy) + // and level number (lx, ly) in the _offsets array, and returns + // the cooresponding offset. + // + + switch (_mode) + { + case ONE_LEVEL: + + return _offsets[0][dy][dx]; + break; + + case MIPMAP_LEVELS: + + return _offsets[lx][dy][dx]; + break; + + case RIPMAP_LEVELS: + + return _offsets[lx + ly * _numXLevels][dy][dx]; + break; + + default: + + throw Iex::ArgExc ("Unknown LevelMode format."); + } +} + + +const Int64 & +TileOffsets::operator () (int dx, int dy, int l) const +{ + return operator () (dx, dy, l, l); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTileOffsets.h b/3rdparty/openexr/IlmImf/ImfTileOffsets.h new file mode 100644 index 000000000..7b2b4c2b2 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTileOffsets.h @@ -0,0 +1,107 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TILE_OFFSETS_H +#define INCLUDED_IMF_TILE_OFFSETS_H + +//----------------------------------------------------------------------------- +// +// class TileOffsets +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +namespace Imf { + +class IStream; +class OStream; + + +class TileOffsets +{ + public: + + TileOffsets (LevelMode mode = ONE_LEVEL, + int numXLevels = 0, + int numYLevels = 0, + const int *numXTiles = 0, + const int *numYTiles = 0); + + // -------- + // File I/O + // -------- + + void readFrom (IStream &is, bool &complete); + Int64 writeTo (OStream &os) const; + + + //----------------------------------------------------------- + // Test if the tileOffsets array is empty (all entries are 0) + //----------------------------------------------------------- + + bool isEmpty () const; + + + //----------------------- + // Access to the elements + //----------------------- + + Int64 & operator () (int dx, int dy, int lx, int ly); + Int64 & operator () (int dx, int dy, int l); + const Int64 & operator () (int dx, int dy, int lx, int ly) const; + const Int64 & operator () (int dx, int dy, int l) const; + + private: + + void findTiles (IStream &is); + void reconstructFromFile (IStream &is); + bool readTile (IStream &is); + bool anyOffsetsAreInvalid () const; + bool isValidTile (int dx, int dy, int lx, int ly) const; + + LevelMode _mode; + int _numXLevels; + int _numYLevels; + + std::vector > > _offsets; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTiledInputFile.cpp b/3rdparty/openexr/IlmImf/ImfTiledInputFile.cpp new file mode 100644 index 000000000..a45c3ac08 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledInputFile.cpp @@ -0,0 +1,1302 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class TiledInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include +#include +#include +#include +#include +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "ImathVec.h" +#include "Iex.h" +#include +#include +#include +#include + + +namespace Imf { + +using Imath::Box2i; +using Imath::V2i; +using std::string; +using std::vector; +using std::min; +using std::max; +using IlmThread::Mutex; +using IlmThread::Lock; +using IlmThread::Semaphore; +using IlmThread::Task; +using IlmThread::TaskGroup; +using IlmThread::ThreadPool; + +namespace { + +struct TInSliceInfo +{ + PixelType typeInFrameBuffer; + PixelType typeInFile; + char * base; + size_t xStride; + size_t yStride; + bool fill; + bool skip; + double fillValue; + int xTileCoords; + int yTileCoords; + + TInSliceInfo (PixelType typeInFrameBuffer = HALF, + PixelType typeInFile = HALF, + char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + bool fill = false, + bool skip = false, + double fillValue = 0.0, + int xTileCoords = 0, + int yTileCoords = 0); +}; + + +TInSliceInfo::TInSliceInfo (PixelType tifb, + PixelType tifl, + char *b, + size_t xs, size_t ys, + bool f, bool s, + double fv, + int xtc, + int ytc) +: + typeInFrameBuffer (tifb), + typeInFile (tifl), + base (b), + xStride (xs), + yStride (ys), + fill (f), + skip (s), + fillValue (fv), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +struct TileBuffer +{ + const char * uncompressedData; + char * buffer; + int dataSize; + Compressor * compressor; + Compressor::Format format; + int dx; + int dy; + int lx; + int ly; + bool hasException; + string exception; + + TileBuffer (Compressor * const comp); + ~TileBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + protected: + + Semaphore _sem; +}; + + +TileBuffer::TileBuffer (Compressor *comp): + uncompressedData (0), + dataSize (0), + compressor (comp), + format (defaultFormat (compressor)), + dx (-1), + dy (-1), + lx (-1), + ly (-1), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +TileBuffer::~TileBuffer () +{ + delete compressor; +} + +} // namespace + + +// +// struct TiledInputFile::Data stores things that will be +// needed between calls to readTile() +// + +struct TiledInputFile::Data: public Mutex +{ + Header header; // the image header + TileDescription tileDesc; // describes the tile layout + int version; // file's version + FrameBuffer frameBuffer; // framebuffer to write into + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + + int numXLevels; // number of x levels + int numYLevels; // number of y levels + int * numXTiles; // number of x tiles at a level + int * numYTiles; // number of y tiles at a level + + TileOffsets tileOffsets; // stores offsets in file for + // each tile + + bool fileIsComplete; // True if no tiles are missing + // in the file + + Int64 currentPosition; // file offset for current tile, + // used to prevent unnecessary + // seeking + + vector slices; // info about channels in file + IStream * is; // file stream to read from + + bool deleteStream; // should we delete the stream + // ourselves? or does someone + // else do it? + + size_t bytesPerPixel; // size of an uncompressed pixel + + size_t maxBytesPerTileLine; // combined size of a line + // over all channels + + + vector tileBuffers; // each holds a single tile + size_t tileBufferSize; // size of the tile buffers + + Data (bool deleteStream, int numThreads); + ~Data (); + + inline TileBuffer * getTileBuffer (int number); + // hash function from tile indices + // into our vector of tile buffers +}; + + +TiledInputFile::Data::Data (bool del, int numThreads): + numXTiles (0), + numYTiles (0), + is (0), + deleteStream (del) +{ + // + // We need at least one tileBuffer, but if threading is used, + // to keep n threads busy we need 2*n tileBuffers + // + + tileBuffers.resize (max (1, 2 * numThreads)); +} + + +TiledInputFile::Data::~Data () +{ + delete [] numXTiles; + delete [] numYTiles; + + if (deleteStream) + delete is; + + for (size_t i = 0; i < tileBuffers.size(); i++) + delete tileBuffers[i]; +} + + +TileBuffer* +TiledInputFile::Data::getTileBuffer (int number) +{ + return tileBuffers[number % tileBuffers.size()]; +} + + +namespace { + +void +readTileData (TiledInputFile::Data *ifd, + int dx, int dy, + int lx, int ly, + char *&buffer, + int &dataSize) +{ + // + // Read a single tile block from the file and into the array pointed + // to by buffer. If the file is memory-mapped, then we change where + // buffer points instead of writing into the array (hence buffer needs + // to be a reference to a char *). + // + + // + // Look up the location for this tile in the Index and + // seek to that position if necessary + // + + Int64 tileOffset = ifd->tileOffsets (dx, dy, lx, ly); + + if (tileOffset == 0) + { + THROW (Iex::InputExc, "Tile (" << dx << ", " << dy << ", " << + lx << ", " << ly << ") is missing."); + } + + if (ifd->currentPosition != tileOffset) + ifd->is->seekg (tileOffset); + + // + // Read the first few bytes of the tile (the header). + // Verify that the tile coordinates and the level number + // are correct. + // + + int tileXCoord, tileYCoord, levelX, levelY; + + Xdr::read (*ifd->is, tileXCoord); + Xdr::read (*ifd->is, tileYCoord); + Xdr::read (*ifd->is, levelX); + Xdr::read (*ifd->is, levelY); + Xdr::read (*ifd->is, dataSize); + + if (tileXCoord != dx) + throw Iex::InputExc ("Unexpected tile x coordinate."); + + if (tileYCoord != dy) + throw Iex::InputExc ("Unexpected tile y coordinate."); + + if (levelX != lx) + throw Iex::InputExc ("Unexpected tile x level number coordinate."); + + if (levelY != ly) + throw Iex::InputExc ("Unexpected tile y level number coordinate."); + + if (dataSize > (int) ifd->tileBufferSize) + throw Iex::InputExc ("Unexpected tile block length."); + + // + // Read the pixel data. + // + + if (ifd->is->isMemoryMapped ()) + buffer = ifd->is->readMemoryMapped (dataSize); + else + ifd->is->read (buffer, dataSize); + + // + // Keep track of which tile is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + ifd->currentPosition = tileOffset + 5 * Xdr::size() + dataSize; +} + + +void +readNextTileData (TiledInputFile::Data *ifd, + int &dx, int &dy, + int &lx, int &ly, + char * & buffer, + int &dataSize) +{ + // + // Read the next tile block from the file + // + + // + // Read the first few bytes of the tile (the header). + // + + Xdr::read (*ifd->is, dx); + Xdr::read (*ifd->is, dy); + Xdr::read (*ifd->is, lx); + Xdr::read (*ifd->is, ly); + Xdr::read (*ifd->is, dataSize); + + if (dataSize > (int) ifd->tileBufferSize) + throw Iex::InputExc ("Unexpected tile block length."); + + // + // Read the pixel data. + // + + ifd->is->read (buffer, dataSize); + + // + // Keep track of which tile is the next one in + // the file, so that we can avoid redundant seekg() + // operations (seekg() can be fairly expensive). + // + + ifd->currentPosition += 5 * Xdr::size() + dataSize; +} + + +// +// A TileBufferTask encapsulates the task of uncompressing +// a single tile and copying it into the frame buffer. +// + +class TileBufferTask : public Task +{ + public: + + TileBufferTask (TaskGroup *group, + TiledInputFile::Data *ifd, + TileBuffer *tileBuffer); + + virtual ~TileBufferTask (); + + virtual void execute (); + + private: + + TiledInputFile::Data * _ifd; + TileBuffer * _tileBuffer; +}; + + +TileBufferTask::TileBufferTask + (TaskGroup *group, + TiledInputFile::Data *ifd, + TileBuffer *tileBuffer) +: + Task (group), + _ifd (ifd), + _tileBuffer (tileBuffer) +{ + // empty +} + + +TileBufferTask::~TileBufferTask () +{ + // + // Signal that the tile buffer is now free + // + + _tileBuffer->post (); +} + + +void +TileBufferTask::execute () +{ + try + { + // + // Calculate information about the tile + // + + Box2i tileRange = Imf::dataWindowForTile (_ifd->tileDesc, + _ifd->minX, _ifd->maxX, + _ifd->minY, _ifd->maxY, + _tileBuffer->dx, + _tileBuffer->dy, + _tileBuffer->lx, + _tileBuffer->ly); + + int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; + + int numPixelsInTile = numPixelsPerScanLine * + (tileRange.max.y - tileRange.min.y + 1); + + int sizeOfTile = _ifd->bytesPerPixel * numPixelsInTile; + + + // + // Uncompress the data, if necessary + // + + if (_tileBuffer->compressor && _tileBuffer->dataSize < sizeOfTile) + { + _tileBuffer->format = _tileBuffer->compressor->format(); + + _tileBuffer->dataSize = _tileBuffer->compressor->uncompressTile + (_tileBuffer->buffer, _tileBuffer->dataSize, + tileRange, _tileBuffer->uncompressedData); + } + else + { + // + // If the line is uncompressed, it's in XDR format, + // regardless of the compressor's output format. + // + + _tileBuffer->format = Compressor::XDR; + _tileBuffer->uncompressedData = _tileBuffer->buffer; + } + + // + // Convert the tile of pixel data back from the machine-independent + // representation, and store the result in the frame buffer. + // + + const char *readPtr = _tileBuffer->uncompressedData; + // points to where we + // read from in the + // tile block + + // + // Iterate over the scan lines in the tile. + // + + for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) + { + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ifd->slices.size(); ++i) + { + const TInSliceInfo &slice = _ifd->slices[i]; + + // + // These offsets are used to facilitate both + // absolute and tile-relative pixel coordinates. + // + + int xOffset = slice.xTileCoords * tileRange.min.x; + int yOffset = slice.yTileCoords * tileRange.min.y; + + // + // Fill the frame buffer with pixel data. + // + + if (slice.skip) + { + // + // The file contains data for this channel, but + // the frame buffer contains no slice for this channel. + // + + skipChannel (readPtr, slice.typeInFile, + numPixelsPerScanLine); + } + else + { + // + // The frame buffer contains a slice for this channel. + // + + char *writePtr = slice.base + + (y - yOffset) * slice.yStride + + (tileRange.min.x - xOffset) * + slice.xStride; + + char *endPtr = writePtr + + (numPixelsPerScanLine - 1) * slice.xStride; + + copyIntoFrameBuffer (readPtr, writePtr, endPtr, + slice.xStride, + slice.fill, slice.fillValue, + _tileBuffer->format, + slice.typeInFrameBuffer, + slice.typeInFile); + } + } + } + } + catch (std::exception &e) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = e.what (); + _tileBuffer->hasException = true; + } + } + catch (...) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = "unrecognized exception"; + _tileBuffer->hasException = true; + } + } +} + + +TileBufferTask * +newTileBufferTask + (TaskGroup *group, + TiledInputFile::Data *ifd, + int number, + int dx, int dy, + int lx, int ly) +{ + // + // Wait for a tile buffer to become available, + // fill the buffer with raw data from the file, + // and create a new TileBufferTask whose execute() + // method will uncompress the tile and copy the + // tile's pixels into the frame buffer. + // + + TileBuffer *tileBuffer = ifd->getTileBuffer (number); + + try + { + tileBuffer->wait(); + + tileBuffer->dx = dx; + tileBuffer->dy = dy; + tileBuffer->lx = lx; + tileBuffer->ly = ly; + + tileBuffer->uncompressedData = 0; + + readTileData (ifd, dx, dy, lx, ly, + tileBuffer->buffer, + tileBuffer->dataSize); + } + catch (...) + { + // + // Reading from the file caused an exception. + // Signal that the tile buffer is free, and + // re-throw the exception. + // + + tileBuffer->post(); + throw; + } + + return new TileBufferTask (group, ifd, tileBuffer); +} + + +} // namespace + + +TiledInputFile::TiledInputFile (const char fileName[], int numThreads): + _data (new Data (true, numThreads)) +{ + // + // This constructor is called when a user + // explicitly wants to read a tiled file. + // + + try + { + _data->is = new StdIFStream (fileName); + _data->header.readFrom (*_data->is, _data->version); + initialize(); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +TiledInputFile::TiledInputFile (IStream &is, int numThreads): + _data (new Data (false, numThreads)) +{ + // + // This constructor is called when a user + // explicitly wants to read a tiled file. + // + + try + { + _data->is = &is; + _data->header.readFrom (*_data->is, _data->version); + initialize(); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << is.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +TiledInputFile::TiledInputFile + (const Header &header, + IStream *is, + int version, + int numThreads) +: + _data (new Data (false, numThreads)) +{ + // + // This constructor called by class Imf::InputFile + // when a user wants to just read an image file, and + // doesn't care or know if the file is tiled. + // + + _data->is = is; + _data->header = header; + _data->version = version; + initialize(); +} + + +void +TiledInputFile::initialize () +{ + if (!isTiled (_data->version)) + throw Iex::ArgExc ("Expected a tiled file but the file is not tiled."); + + _data->header.sanityCheck (true); + + _data->tileDesc = _data->header.tileDescription(); + _data->lineOrder = _data->header.lineOrder(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + // + // Precompute level and tile information to speed up utility functions + // + + precalculateTileInfo (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + _data->numXTiles, _data->numYTiles, + _data->numXLevels, _data->numYLevels); + + _data->bytesPerPixel = calculateBytesPerPixel (_data->header); + + _data->maxBytesPerTileLine = _data->bytesPerPixel * _data->tileDesc.xSize; + + _data->tileBufferSize = _data->maxBytesPerTileLine * _data->tileDesc.ySize; + + // + // Create all the TileBuffers and allocate their internal buffers + // + + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + { + _data->tileBuffers[i] = new TileBuffer (newTileCompressor + (_data->header.compression(), + _data->maxBytesPerTileLine, + _data->tileDesc.ySize, + _data->header)); + + if (!_data->is->isMemoryMapped ()) + _data->tileBuffers[i]->buffer = new char [_data->tileBufferSize]; + } + + _data->tileOffsets = TileOffsets (_data->tileDesc.mode, + _data->numXLevels, + _data->numYLevels, + _data->numXTiles, + _data->numYTiles); + + _data->tileOffsets.readFrom (*(_data->is), _data->fileIsComplete); + + _data->currentPosition = _data->is->tellg(); +} + + +TiledInputFile::~TiledInputFile () +{ + if (!_data->is->isMemoryMapped()) + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + delete [] _data->tileBuffers[i]->buffer; + + delete _data; +} + + +const char * +TiledInputFile::fileName () const +{ + return _data->is->fileName(); +} + + +const Header & +TiledInputFile::header () const +{ + return _data->header; +} + + +int +TiledInputFile::version () const +{ + return _data->version; +} + + +void +TiledInputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + Lock lock (*_data); + + // + // Set the frame buffer + // + + // + // Check if the new frame buffer descriptor is + // compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + ChannelList::ConstIterator i = channels.find (j.name()); + + if (i == channels.end()) + continue; + + if (i.channel().xSampling != j.slice().xSampling || + i.channel().ySampling != j.slice().ySampling) + THROW (Iex::ArgExc, "X and/or y subsampling factors " + "of \"" << i.name() << "\" channel " + "of input file \"" << fileName() << "\" are " + "not compatible with the frame buffer's " + "subsampling factors."); + } + + // + // Initialize the slice table for readPixels(). + // + + vector slices; + ChannelList::ConstIterator i = channels.begin(); + + for (FrameBuffer::ConstIterator j = frameBuffer.begin(); + j != frameBuffer.end(); + ++j) + { + while (i != channels.end() && strcmp (i.name(), j.name()) < 0) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (TInSliceInfo (i.channel().type, + i.channel().type, + 0, // base + 0, // xStride + 0, // yStride + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + bool fill = false; + + if (i == channels.end() || strcmp (i.name(), j.name()) > 0) + { + // + // Channel i is present in the frame buffer, but not in the file. + // In the frame buffer, slice j will be filled with a default value. + // + + fill = true; + } + + slices.push_back (TInSliceInfo (j.slice().type, + fill? j.slice().type: i.channel().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + fill, + false, // skip + j.slice().fillValue, + (j.slice().xTileCoords)? 1: 0, + (j.slice().yTileCoords)? 1: 0)); + + if (i != channels.end() && !fill) + ++i; + } + + while (i != channels.end()) + { + // + // Channel i is present in the file but not + // in the frame buffer; data for channel i + // will be skipped during readPixels(). + // + + slices.push_back (TInSliceInfo (i.channel().type, + i.channel().type, + 0, // base + 0, // xStride + 0, // yStride + false, // fill + true, // skip + 0.0)); // fillValue + ++i; + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; +} + + +const FrameBuffer & +TiledInputFile::frameBuffer () const +{ + Lock lock (*_data); + return _data->frameBuffer; +} + + +bool +TiledInputFile::isComplete () const +{ + return _data->fileIsComplete; +} + + +void +TiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int lx, int ly) +{ + // + // Read a range of tiles from the file into the framebuffer + // + + try + { + Lock lock (*_data); + + if (_data->slices.size() == 0) + throw Iex::ArgExc ("No frame buffer specified " + "as pixel data destination."); + + // + // Determine the first and last tile coordinates in both dimensions. + // We always attempt to read the range of tiles in the order that + // they are stored in the file. + // + + if (dx1 > dx2) + std::swap (dx1, dx2); + + if (dy1 > dy2) + std::swap (dy1, dy2); + + int dyStart = dy1; + int dyStop = dy2 + 1; + int dY = 1; + + if (_data->lineOrder == DECREASING_Y) + { + dyStart = dy2; + dyStop = dy1 - 1; + dY = -1; + } + + // + // Create a task group for all tile buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + int tileNumber = 0; + + for (int dy = dyStart; dy != dyStop; dy += dY) + { + for (int dx = dx1; dx <= dx2; dx++) + { + if (!isValidTile (dx, dy, lx, ly)) + THROW (Iex::ArgExc, + "Tile (" << dx << ", " << dy << ", " << + lx << "," << ly << ") is not a valid tile."); + + ThreadPool::addGlobalTask (newTileBufferTask (&taskGroup, + _data, + tileNumber++, + dx, dy, + lx, ly)); + } + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // TileBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to TiledInputFile::readTiles(). + // TileBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the tile buffers. + // Now we check if any tile buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple tile buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (int i = 0; i < _data->tileBuffers.size(); ++i) + { + TileBuffer *tileBuffer = _data->tileBuffers[i]; + + if (tileBuffer->hasException && !exception) + exception = &tileBuffer->exception; + + tileBuffer->hasException = false; + } + + if (exception) + throw Iex::IoExc (*exception); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +TiledInputFile::readTiles (int dx1, int dx2, int dy1, int dy2, int l) +{ + readTiles (dx1, dx2, dy1, dy2, l, l); +} + + +void +TiledInputFile::readTile (int dx, int dy, int lx, int ly) +{ + readTiles (dx, dx, dy, dy, lx, ly); +} + + +void +TiledInputFile::readTile (int dx, int dy, int l) +{ + readTile (dx, dy, l, l); +} + + +void +TiledInputFile::rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize) +{ + try + { + Lock lock (*_data); + + if (!isValidTile (dx, dy, lx, ly)) + throw Iex::ArgExc ("Tried to read a tile outside " + "the image file's data window."); + + TileBuffer *tileBuffer = _data->getTileBuffer (0); + + readNextTileData (_data, dx, dy, lx, ly, + tileBuffer->buffer, + pixelDataSize); + + pixelData = tileBuffer->buffer; + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error reading pixel data from image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +unsigned int +TiledInputFile::tileXSize () const +{ + return _data->tileDesc.xSize; +} + + +unsigned int +TiledInputFile::tileYSize () const +{ + return _data->tileDesc.ySize; +} + + +LevelMode +TiledInputFile::levelMode () const +{ + return _data->tileDesc.mode; +} + + +LevelRoundingMode +TiledInputFile::levelRoundingMode () const +{ + return _data->tileDesc.roundingMode; +} + + +int +TiledInputFile::numLevels () const +{ + if (levelMode() == RIPMAP_LEVELS) + THROW (Iex::LogicExc, "Error calling numLevels() on image " + "file \"" << fileName() << "\" " + "(numLevels() is not defined for files " + "with RIPMAP level mode)."); + + return _data->numXLevels; +} + + +int +TiledInputFile::numXLevels () const +{ + return _data->numXLevels; +} + + +int +TiledInputFile::numYLevels () const +{ + return _data->numYLevels; +} + + +bool +TiledInputFile::isValidLevel (int lx, int ly) const +{ + if (lx < 0 || ly < 0) + return false; + + if (levelMode() == MIPMAP_LEVELS && lx != ly) + return false; + + if (lx >= numXLevels() || ly >= numYLevels()) + return false; + + return true; +} + + +int +TiledInputFile::levelWidth (int lx) const +{ + try + { + return levelSize (_data->minX, _data->maxX, lx, + _data->tileDesc.roundingMode); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelWidth() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledInputFile::levelHeight (int ly) const +{ + try + { + return levelSize (_data->minY, _data->maxY, ly, + _data->tileDesc.roundingMode); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelHeight() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledInputFile::numXTiles (int lx) const +{ + if (lx < 0 || lx >= _data->numXLevels) + { + THROW (Iex::ArgExc, "Error calling numXTiles() on image " + "file \"" << _data->is->fileName() << "\" " + "(Argument is not in valid range)."); + + } + + return _data->numXTiles[lx]; +} + + +int +TiledInputFile::numYTiles (int ly) const +{ + if (ly < 0 || ly >= _data->numYLevels) + { + THROW (Iex::ArgExc, "Error calling numYTiles() on image " + "file \"" << _data->is->fileName() << "\" " + "(Argument is not in valid range)."); + } + + return _data->numYTiles[ly]; +} + + +Box2i +TiledInputFile::dataWindowForLevel (int l) const +{ + return dataWindowForLevel (l, l); +} + + +Box2i +TiledInputFile::dataWindowForLevel (int lx, int ly) const +{ + try + { + return Imf::dataWindowForLevel (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + lx, ly); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +Box2i +TiledInputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return dataWindowForTile (dx, dy, l, l); +} + + +Box2i +TiledInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + try + { + if (!isValidTile (dx, dy, lx, ly)) + throw Iex::ArgExc ("Arguments not in valid range."); + + return Imf::dataWindowForTile (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + dx, dy, lx, ly); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForTile() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +bool +TiledInputFile::isValidTile (int dx, int dy, int lx, int ly) const +{ + return ((lx < _data->numXLevels && lx >= 0) && + (ly < _data->numYLevels && ly >= 0) && + (dx < _data->numXTiles[lx] && dx >= 0) && + (dy < _data->numYTiles[ly] && dy >= 0)); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTiledInputFile.h b/3rdparty/openexr/IlmImf/ImfTiledInputFile.h new file mode 100644 index 000000000..13eb84f6f --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledInputFile.h @@ -0,0 +1,381 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TILED_INPUT_FILE_H +#define INCLUDED_IMF_TILED_INPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class TiledInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include "ImathBox.h" +#include +#include + +namespace Imf { + + +class TiledInputFile +{ + public: + + //-------------------------------------------------------------------- + // A constructor that opens the file with the specified name, and + // reads the file header. The constructor throws an Iex::ArgExc + // exception if the file is not tiled. + // The numThreads parameter specifies how many worker threads this + // file will try to keep busy when decompressing individual tiles. + // Destroying TiledInputFile objects constructed with this constructor + // automatically closes the corresponding files. + //-------------------------------------------------------------------- + + TiledInputFile (const char fileName[], + int numThreads = globalThreadCount ()); + + + // ---------------------------------------------------------- + // A constructor that attaches the new TiledInputFile object + // to a file that has already been opened. + // Destroying TiledInputFile objects constructed with this + // constructor does not automatically close the corresponding + // files. + // ---------------------------------------------------------- + + TiledInputFile (IStream &is, int numThreads = globalThreadCount ()); + + + //----------- + // Destructor + //----------- + + virtual ~TiledInputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //----------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledInputFile object. + // + // The current frame buffer is the destination for the pixel + // data read from the file. The current frame buffer must be + // set at least once before readTile() is called. + // The current frame buffer can be changed after each call + // to readTile(). + //----------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //------------------------------------------------------------ + // Check if the file is complete: + // + // isComplete() returns true if all pixels in the data window + // (in all levels) are present in the input file, or false if + // any pixels are missing. (Another program may still be busy + // writing the file, or file writing may have been aborted + // prematurely.) + //------------------------------------------------------------ + + bool isComplete () const; + + + //-------------------------------------------------- + // Utility functions: + //-------------------------------------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with + // MIPMAP_LEVELS files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an Iex::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + + //---------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //---------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //-------------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //-------------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional region of + // valid pixel coordinates for a level with level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------------- + + Imath::Box2i dataWindowForLevel (int l = 0) const; + Imath::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + Imath::Box2i dataWindowForTile (int dx, int dy, int l = 0) const; + + Imath::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------ + // Read pixel data: + // + // readTile(dx, dy, lx, ly) reads the tile with tile + // coordinates (dx, dy), and level number (lx, ly), + // and stores it in the current frame buffer. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readTile(dx, dy, level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It calls + // readTile(dx, dy, level, level). + // + // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow + // reading multiple tiles at once. If multi-threading is used + // the multiple tiles are read concurrently. + // + // Pixels that are outside the pixel coordinate range for the + // tile's level, are never accessed by readTile(). + // + // Attempting to access a tile that is not present in the file + // throws an InputExc exception. + // + //------------------------------------------------------------ + + void readTile (int dx, int dy, int l = 0); + void readTile (int dx, int dy, int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void readTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //-------------------------------------------------- + // Read a tile of raw pixel data from the file, + // without uncompressing it (this function is + // used to implement TiledOutputFile::copyPixels()). + //-------------------------------------------------- + + void rawTileData (int &dx, int &dy, + int &lx, int &ly, + const char *&pixelData, + int &pixelDataSize); + + struct Data; + + private: + + friend class InputFile; + + TiledInputFile (const TiledInputFile &); // not implemented + TiledInputFile & operator = (const TiledInputFile &); // not implemented + + TiledInputFile (const Header &header, IStream *is, int version, + int numThreads); + + void initialize (); + + bool isValidTile (int dx, int dy, + int lx, int ly) const; + + size_t bytesPerLineForTile (int dx, int dy, + int lx, int ly) const; + + Data * _data; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTiledMisc.cpp b/3rdparty/openexr/IlmImf/ImfTiledMisc.cpp new file mode 100644 index 000000000..7c723bb7c --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledMisc.cpp @@ -0,0 +1,301 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Miscellaneous stuff related to tiled files +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" +#include +#include + + +namespace Imf { + +using Imath::Box2i; +using Imath::V2i; + + +int +levelSize (int min, int max, int l, LevelRoundingMode rmode) +{ + if (l < 0) + throw Iex::ArgExc ("Argument not in valid range."); + + int a = max - min + 1; + int b = (1 << l); + int size = a / b; + + if (rmode == ROUND_UP && size * b < a) + size += 1; + + return std::max (size, 1); +} + + +Box2i +dataWindowForLevel (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int lx, int ly) +{ + V2i levelMin = V2i (minX, minY); + + V2i levelMax = levelMin + + V2i (levelSize (minX, maxX, lx, tileDesc.roundingMode) - 1, + levelSize (minY, maxY, ly, tileDesc.roundingMode) - 1); + + return Box2i(levelMin, levelMax); +} + + +Box2i +dataWindowForTile (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int dx, int dy, + int lx, int ly) +{ + V2i tileMin = V2i (minX + dx * tileDesc.xSize, + minY + dy * tileDesc.ySize); + + V2i tileMax = tileMin + V2i (tileDesc.xSize - 1, tileDesc.ySize - 1); + + V2i levelMax = dataWindowForLevel + (tileDesc, minX, maxX, minY, maxY, lx, ly).max; + + tileMax = V2i (std::min (tileMax[0], levelMax[0]), + std::min (tileMax[1], levelMax[1])); + + return Box2i (tileMin, tileMax); +} + + +size_t +calculateBytesPerPixel (const Header &header) +{ + const ChannelList &channels = header.channels(); + + size_t bytesPerPixel = 0; + + for (ChannelList::ConstIterator c = channels.begin(); + c != channels.end(); + ++c) + { + bytesPerPixel += pixelTypeSize (c.channel().type); + } + + return bytesPerPixel; +} + + +namespace { + +int +floorLog2 (int x) +{ + // + // For x > 0, floorLog2(y) returns floor(log(x)/log(2)). + // + + int y = 0; + + while (x > 1) + { + y += 1; + x >>= 1; + } + + return y; +} + + +int +ceilLog2 (int x) +{ + // + // For x > 0, ceilLog2(y) returns ceil(log(x)/log(2)). + // + + int y = 0; + int r = 0; + + while (x > 1) + { + if (x & 1) + r = 1; + + y += 1; + x >>= 1; + } + + return y + r; +} + + +int +roundLog2 (int x, LevelRoundingMode rmode) +{ + return (rmode == ROUND_DOWN)? floorLog2 (x): ceilLog2 (x); +} + + +int +calculateNumXLevels (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY) +{ + int num = 0; + + switch (tileDesc.mode) + { + case ONE_LEVEL: + + num = 1; + break; + + case MIPMAP_LEVELS: + + { + int w = maxX - minX + 1; + int h = maxY - minY + 1; + num = roundLog2 (std::max (w, h), tileDesc.roundingMode) + 1; + } + break; + + case RIPMAP_LEVELS: + + { + int w = maxX - minX + 1; + num = roundLog2 (w, tileDesc.roundingMode) + 1; + } + break; + + default: + + throw Iex::ArgExc ("Unknown LevelMode format."); + } + + return num; +} + + +int +calculateNumYLevels (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY) +{ + int num = 0; + + switch (tileDesc.mode) + { + case ONE_LEVEL: + + num = 1; + break; + + case MIPMAP_LEVELS: + + { + int w = maxX - minX + 1; + int h = maxY - minY + 1; + num = roundLog2 (std::max (w, h), tileDesc.roundingMode) + 1; + } + break; + + case RIPMAP_LEVELS: + + { + int h = maxY - minY + 1; + num = roundLog2 (h, tileDesc.roundingMode) + 1; + } + break; + + default: + + throw Iex::ArgExc ("Unknown LevelMode format."); + } + + return num; +} + + +void +calculateNumTiles (int *numTiles, + int numLevels, + int min, int max, + int size, + LevelRoundingMode rmode) +{ + for (int i = 0; i < numLevels; i++) + { + numTiles[i] = (levelSize (min, max, i, rmode) + size - 1) / size; + } +} + +} // namespace + + +void +precalculateTileInfo (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY, + int *&numXTiles, int *&numYTiles, + int &numXLevels, int &numYLevels) +{ + numXLevels = calculateNumXLevels(tileDesc, minX, maxX, minY, maxY); + numYLevels = calculateNumYLevels(tileDesc, minX, maxX, minY, maxY); + + numXTiles = new int[numXLevels]; + numYTiles = new int[numYLevels]; + + calculateNumTiles (numXTiles, + numXLevels, + minX, maxX, + tileDesc.xSize, + tileDesc.roundingMode); + + calculateNumTiles (numYTiles, + numYLevels, + minY, maxY, + tileDesc.ySize, + tileDesc.roundingMode); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTiledMisc.h b/3rdparty/openexr/IlmImf/ImfTiledMisc.h new file mode 100644 index 000000000..9342c6fa2 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledMisc.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TILED_MISC_H +#define INCLUDED_IMF_TILED_MISC_H + +//----------------------------------------------------------------------------- +// +// Miscellaneous stuff related to tiled files +// +//----------------------------------------------------------------------------- + +#include "ImathBox.h" +#include +#include + +namespace Imf { + +int levelSize (int min, int max, int l, LevelRoundingMode rmode); + +Imath::Box2i dataWindowForLevel (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int lx, int ly); + +Imath::Box2i dataWindowForTile (const TileDescription &tileDesc, + int minX, int maxX, + int minY, int maxY, + int dx, int dy, + int lx, int ly); + +size_t calculateBytesPerPixel (const Header &header); + +void precalculateTileInfo (const TileDescription& tileDesc, + int minX, int maxX, + int minY, int maxY, + int *&numXTiles, int *&numYTiles, + int &numXLevels, int &numYLevels); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTiledOutputFile.cpp b/3rdparty/openexr/IlmImf/ImfTiledOutputFile.cpp new file mode 100644 index 000000000..9a96ac97c --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledOutputFile.cpp @@ -0,0 +1,1692 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class TiledOutputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ImathBox.h" +#include +#include +#include +#include +#include +#include "IlmThreadPool.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadMutex.h" +#include "Iex.h" +#include +#include +#include +#include +#include + + +namespace Imf { + +using Imath::Box2i; +using Imath::V2i; +using std::string; +using std::vector; +using std::ofstream; +using std::map; +using std::min; +using std::max; +using std::swap; +using IlmThread::Mutex; +using IlmThread::Lock; +using IlmThread::Semaphore; +using IlmThread::Task; +using IlmThread::TaskGroup; +using IlmThread::ThreadPool; + +namespace { + +struct TOutSliceInfo +{ + PixelType type; + const char * base; + size_t xStride; + size_t yStride; + bool zero; + int xTileCoords; + int yTileCoords; + + TOutSliceInfo (PixelType type = HALF, + const char *base = 0, + size_t xStride = 0, + size_t yStride = 0, + bool zero = false, + int xTileCoords = 0, + int yTileCoords = 0); +}; + + +TOutSliceInfo::TOutSliceInfo (PixelType t, + const char *b, + size_t xs, size_t ys, + bool z, + int xtc, + int ytc) +: + type (t), + base (b), + xStride (xs), + yStride (ys), + zero (z), + xTileCoords (xtc), + yTileCoords (ytc) +{ + // empty +} + + +struct TileCoord +{ + int dx; + int dy; + int lx; + int ly; + + + TileCoord (int xTile = 0, int yTile = 0, + int xLevel = 0, int yLevel = 0) + : + dx (xTile), dy (yTile), + lx (xLevel), ly (yLevel) + { + // empty + } + + + bool + operator < (const TileCoord &other) const + { + return (ly < other.ly) || + (ly == other.ly && lx < other.lx) || + ((ly == other.ly && lx == other.lx) && + ((dy < other.dy) || (dy == other.dy && dx < other.dx))); + } + + + bool + operator == (const TileCoord &other) const + { + return lx == other.lx && + ly == other.ly && + dx == other.dx && + dy == other.dy; + } +}; + + +struct BufferedTile +{ + char * pixelData; + int pixelDataSize; + + BufferedTile (const char *data, int size): + pixelData (0), + pixelDataSize(size) + { + pixelData = new char[pixelDataSize]; + memcpy (pixelData, data, pixelDataSize); + } + + ~BufferedTile() + { + delete [] pixelData; + } +}; + + +typedef map TileMap; + + +struct TileBuffer +{ + Array buffer; + const char * dataPtr; + int dataSize; + Compressor * compressor; + TileCoord tileCoord; + bool hasException; + string exception; + + TileBuffer (Compressor *comp); + ~TileBuffer (); + + inline void wait () {_sem.wait();} + inline void post () {_sem.post();} + + protected: + + Semaphore _sem; +}; + + +TileBuffer::TileBuffer (Compressor *comp): + dataPtr (0), + dataSize (0), + compressor (comp), + hasException (false), + exception (), + _sem (1) +{ + // empty +} + + +TileBuffer::~TileBuffer () +{ + delete compressor; +} + + +} // namespace + + +struct TiledOutputFile::Data: public Mutex +{ + Header header; // the image header + int version; // file format version + TileDescription tileDesc; // describes the tile layout + FrameBuffer frameBuffer; // framebuffer to write into + Int64 previewPosition; + LineOrder lineOrder; // the file's lineorder + int minX; // data window's min x coord + int maxX; // data window's max x coord + int minY; // data window's min y coord + int maxY; // data window's max x coord + + int numXLevels; // number of x levels + int numYLevels; // number of y levels + int * numXTiles; // number of x tiles at a level + int * numYTiles; // number of y tiles at a level + + TileOffsets tileOffsets; // stores offsets in file for + // each tile + + Compressor::Format format; // compressor's data format + vector slices; // info about channels in file + OStream * os; // file stream to write to + bool deleteStream; + + size_t maxBytesPerTileLine; // combined size of a tile line + // over all channels + + + vector tileBuffers; + size_t tileBufferSize; // size of a tile buffer + + Int64 tileOffsetsPosition; // position of the tile index + Int64 currentPosition; // current position in the file + + TileMap tileMap; + TileCoord nextTileToWrite; + + Data (bool del, int numThreads); + ~Data (); + + inline TileBuffer * getTileBuffer (int number); + // hash function from tile + // buffer coords into our + // vector of tile buffers + + TileCoord nextTileCoord (const TileCoord &a); +}; + + +TiledOutputFile::Data::Data (bool del, int numThreads): + numXTiles(0), + numYTiles(0), + os (0), + deleteStream (del), + tileOffsetsPosition (0) +{ + // + // We need at least one tileBuffer, but if threading is used, + // to keep n threads busy we need 2*n tileBuffers + // + + tileBuffers.resize (max (1, 2 * numThreads)); +} + + +TiledOutputFile::Data::~Data () +{ + delete [] numXTiles; + delete [] numYTiles; + + if (deleteStream) + delete os; + + // + // Delete all the tile buffers, if any still happen to exist + // + + for (TileMap::iterator i = tileMap.begin(); i != tileMap.end(); ++i) + delete i->second; + + for (size_t i = 0; i < tileBuffers.size(); i++) + delete tileBuffers[i]; +} + + +TileBuffer* +TiledOutputFile::Data::getTileBuffer (int number) +{ + return tileBuffers[number % tileBuffers.size()]; +} + + +TileCoord +TiledOutputFile::Data::nextTileCoord (const TileCoord &a) +{ + TileCoord b = a; + + if (lineOrder == INCREASING_Y) + { + b.dx++; + + if (b.dx >= numXTiles[b.lx]) + { + b.dx = 0; + b.dy++; + + if (b.dy >= numYTiles[b.ly]) + { + // + // the next tile is in the next level + // + + b.dy = 0; + + switch (tileDesc.mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + b.lx++; + b.ly++; + break; + + case RIPMAP_LEVELS: + + b.lx++; + + if (b.lx >= numXLevels) + { + b.lx = 0; + b.ly++; + + #ifdef DEBUG + assert (b.ly <= numYLevels); + #endif + } + break; + } + } + } + } + else if (lineOrder == DECREASING_Y) + { + b.dx++; + + if (b.dx >= numXTiles[b.lx]) + { + b.dx = 0; + b.dy--; + + if (b.dy < 0) + { + // + // the next tile is in the next level + // + + switch (tileDesc.mode) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + b.lx++; + b.ly++; + break; + + case RIPMAP_LEVELS: + + b.lx++; + + if (b.lx >= numXLevels) + { + b.lx = 0; + b.ly++; + + #ifdef DEBUG + assert (b.ly <= numYLevels); + #endif + } + break; + } + + if (b.ly < numYLevels) + b.dy = numYTiles[b.ly] - 1; + } + } + } + + return b; +} + + +namespace { + +void +writeTileData (TiledOutputFile::Data *ofd, + int dx, int dy, + int lx, int ly, + const char pixelData[], + int pixelDataSize) +{ + // + // Store a block of pixel data in the output file, and try + // to keep track of the current writing position the file, + // without calling tellp() (tellp() can be fairly expensive). + // + + Int64 currentPosition = ofd->currentPosition; + ofd->currentPosition = 0; + + if (currentPosition == 0) + currentPosition = ofd->os->tellp(); + + ofd->tileOffsets (dx, dy, lx, ly) = currentPosition; + + #ifdef DEBUG + assert (ofd->os->tellp() == currentPosition); + #endif + + // + // Write the tile header. + // + + Xdr::write (*ofd->os, dx); + Xdr::write (*ofd->os, dy); + Xdr::write (*ofd->os, lx); + Xdr::write (*ofd->os, ly); + Xdr::write (*ofd->os, pixelDataSize); + + ofd->os->write (pixelData, pixelDataSize); + + // + // Keep current position in the file so that we can avoid + // redundant seekg() operations (seekg() can be fairly expensive). + // + + ofd->currentPosition = currentPosition + + 5 * Xdr::size() + + pixelDataSize; +} + + + +void +bufferedTileWrite (TiledOutputFile::Data *ofd, + int dx, int dy, + int lx, int ly, + const char pixelData[], + int pixelDataSize) +{ + // + // Check if a tile with coordinates (dx,dy,lx,ly) has already been written. + // + + if (ofd->tileOffsets (dx, dy, lx, ly)) + { + THROW (Iex::ArgExc, + "Attempt to write tile " + "(" << dx << ", " << dy << ", " << lx << "," << ly << ") " + "more than once."); + } + + // + // If tiles can be written in random order, then don't buffer anything. + // + + if (ofd->lineOrder == RANDOM_Y) + { + writeTileData (ofd, dx, dy, lx, ly, pixelData, pixelDataSize); + return; + } + + // + // If the tiles cannot be written in random order, then check if a + // tile with coordinates (dx,dy,lx,ly) has already been buffered. + // + + TileCoord currentTile = TileCoord(dx, dy, lx, ly); + + if (ofd->tileMap.find (currentTile) != ofd->tileMap.end()) + { + THROW (Iex::ArgExc, + "Attempt to write tile " + "(" << dx << ", " << dy << ", " << lx << "," << ly << ") " + "more than once."); + } + + // + // If all the tiles before this one have already been written to the file, + // then write this tile immediately and check if we have buffered tiles + // that can be written after this tile. + // + // Otherwise, buffer the tile so it can be written to file later. + // + + if (ofd->nextTileToWrite == currentTile) + { + writeTileData (ofd, dx, dy, lx, ly, pixelData, pixelDataSize); + ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); + + TileMap::iterator i = ofd->tileMap.find (ofd->nextTileToWrite); + + // + // Step through the tiles and write all successive buffered tiles after + // the current one. + // + + while(i != ofd->tileMap.end()) + { + // + // Write the tile, and then delete the tile's buffered data + // + + writeTileData (ofd, + i->first.dx, i->first.dy, + i->first.lx, i->first.ly, + i->second->pixelData, + i->second->pixelDataSize); + + delete i->second; + ofd->tileMap.erase (i); + + // + // Proceed to the next tile + // + + ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite); + i = ofd->tileMap.find (ofd->nextTileToWrite); + } + } + else + { + // + // Create a new BufferedTile, copy the pixelData into it, and + // insert it into the tileMap. + // + + ofd->tileMap[currentTile] = + new BufferedTile ((const char *)pixelData, pixelDataSize); + } +} + + +void +convertToXdr (TiledOutputFile::Data *ofd, + Array& tileBuffer, + int numScanLines, + int numPixelsPerScanLine) +{ + // + // Convert the contents of a TiledOutputFile's tileBuffer from the + // machine's native representation to Xdr format. This function is called + // by writeTile(), below, if the compressor wanted its input pixel data + // in the machine's native format, but then failed to compress the data + // (most compressors will expand rather than compress random input data). + // + // Note that this routine assumes that the machine's native representation + // of the pixel data has the same size as the Xdr representation. This + // makes it possible to convert the pixel data in place, without an + // intermediate temporary buffer. + // + + // + // Set these to point to the start of the tile. + // We will write to toPtr, and read from fromPtr. + // + + char *writePtr = tileBuffer; + const char *readPtr = writePtr; + + // + // Iterate over all scan lines in the tile. + // + + for (int y = 0; y < numScanLines; ++y) + { + // + // Iterate over all slices in the file. + // + + for (unsigned int i = 0; i < ofd->slices.size(); ++i) + { + const TOutSliceInfo &slice = ofd->slices[i]; + + // + // Convert the samples in place. + // + + convertInPlace (writePtr, readPtr, slice.type, + numPixelsPerScanLine); + } + } + + #ifdef DEBUG + + assert (writePtr == readPtr); + + #endif +} + + +// +// A TileBufferTask encapsulates the task of copying a tile from +// the user's framebuffer into a LineBuffer and compressing the data +// if necessary. +// + +class TileBufferTask: public Task +{ + public: + + TileBufferTask (TaskGroup *group, + TiledOutputFile::Data *ofd, + int number, + int dx, int dy, + int lx, int ly); + + virtual ~TileBufferTask (); + + virtual void execute (); + + private: + + TiledOutputFile::Data * _ofd; + TileBuffer * _tileBuffer; +}; + + +TileBufferTask::TileBufferTask + (TaskGroup *group, + TiledOutputFile::Data *ofd, + int number, + int dx, int dy, + int lx, int ly) +: + Task (group), + _ofd (ofd), + _tileBuffer (_ofd->getTileBuffer (number)) +{ + // + // Wait for the tileBuffer to become available + // + + _tileBuffer->wait (); + _tileBuffer->tileCoord = TileCoord (dx, dy, lx, ly); +} + + +TileBufferTask::~TileBufferTask () +{ + // + // Signal that the tile buffer is now free + // + + _tileBuffer->post (); +} + + +void +TileBufferTask::execute () +{ + try + { + // + // First copy the pixel data from the frame buffer + // into the tile buffer + // + // Convert one tile's worth of pixel data to + // a machine-independent representation, and store + // the result in _tileBuffer->buffer. + // + + char *writePtr = _tileBuffer->buffer; + + Box2i tileRange = Imf::dataWindowForTile (_ofd->tileDesc, + _ofd->minX, _ofd->maxX, + _ofd->minY, _ofd->maxY, + _tileBuffer->tileCoord.dx, + _tileBuffer->tileCoord.dy, + _tileBuffer->tileCoord.lx, + _tileBuffer->tileCoord.ly); + + int numScanLines = tileRange.max.y - tileRange.min.y + 1; + int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1; + + // + // Iterate over the scan lines in the tile. + // + + for (int y = tileRange.min.y; y <= tileRange.max.y; ++y) + { + // + // Iterate over all image channels. + // + + for (unsigned int i = 0; i < _ofd->slices.size(); ++i) + { + const TOutSliceInfo &slice = _ofd->slices[i]; + + // + // These offsets are used to facilitate both absolute + // and tile-relative pixel coordinates. + // + + int xOffset = slice.xTileCoords * tileRange.min.x; + int yOffset = slice.yTileCoords * tileRange.min.y; + + // + // Fill the tile buffer with pixel data. + // + + if (slice.zero) + { + // + // The frame buffer contains no data for this channel. + // Store zeroes in _data->tileBuffer. + // + + fillChannelWithZeroes (writePtr, _ofd->format, slice.type, + numPixelsPerScanLine); + } + else + { + // + // The frame buffer contains data for this channel. + // + + const char *readPtr = slice.base + + (y - yOffset) * slice.yStride + + (tileRange.min.x - xOffset) * + slice.xStride; + + const char *endPtr = readPtr + + (numPixelsPerScanLine - 1) * + slice.xStride; + + copyFromFrameBuffer (writePtr, readPtr, endPtr, + slice.xStride, _ofd->format, + slice.type); + } + } + } + + // + // Compress the contents of the tileBuffer, + // and store the compressed data in the output file. + // + + _tileBuffer->dataSize = writePtr - _tileBuffer->buffer; + _tileBuffer->dataPtr = _tileBuffer->buffer; + + if (_tileBuffer->compressor) + { + const char *compPtr; + + int compSize = _tileBuffer->compressor->compressTile + (_tileBuffer->dataPtr, + _tileBuffer->dataSize, + tileRange, compPtr); + + if (compSize < _tileBuffer->dataSize) + { + _tileBuffer->dataSize = compSize; + _tileBuffer->dataPtr = compPtr; + } + else if (_ofd->format == Compressor::NATIVE) + { + // + // The data did not shrink during compression, but + // we cannot write to the file using native format, + // so we need to convert the lineBuffer to Xdr. + // + + convertToXdr (_ofd, _tileBuffer->buffer, numScanLines, + numPixelsPerScanLine); + } + } + } + catch (std::exception &e) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = e.what (); + _tileBuffer->hasException = true; + } + } + catch (...) + { + if (!_tileBuffer->hasException) + { + _tileBuffer->exception = "unrecognized exception"; + _tileBuffer->hasException = true; + } + } +} + +} // namespace + + +TiledOutputFile::TiledOutputFile + (const char fileName[], + const Header &header, + int numThreads) +: + _data (new Data (true, numThreads)) +{ + try + { + header.sanityCheck (true); + _data->os = new StdOFStream (fileName); + initialize (header); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << fileName << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +TiledOutputFile::TiledOutputFile + (OStream &os, + const Header &header, + int numThreads) +: + _data (new Data (false, numThreads)) +{ + try + { + header.sanityCheck(true); + _data->os = &os; + initialize (header); + } + catch (Iex::BaseExc &e) + { + delete _data; + + REPLACE_EXC (e, "Cannot open image file " + "\"" << os.fileName() << "\". " << e); + throw; + } + catch (...) + { + delete _data; + throw; + } +} + + +void +TiledOutputFile::initialize (const Header &header) +{ + _data->header = header; + _data->lineOrder = _data->header.lineOrder(); + + // + // Check that the file is indeed tiled + // + + _data->tileDesc = _data->header.tileDescription(); + + // + // Save the dataWindow information + // + + const Box2i &dataWindow = _data->header.dataWindow(); + _data->minX = dataWindow.min.x; + _data->maxX = dataWindow.max.x; + _data->minY = dataWindow.min.y; + _data->maxY = dataWindow.max.y; + + // + // Precompute level and tile information to speed up utility functions + // + + precalculateTileInfo (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + _data->numXTiles, _data->numYTiles, + _data->numXLevels, _data->numYLevels); + + // + // Determine the first tile coordinate that we will be writing + // if the file is not RANDOM_Y. + // + + _data->nextTileToWrite = (_data->lineOrder == INCREASING_Y)? + TileCoord (0, 0, 0, 0): + TileCoord (0, _data->numYTiles[0] - 1, 0, 0); + + _data->maxBytesPerTileLine = + calculateBytesPerPixel (_data->header) * _data->tileDesc.xSize; + + _data->tileBufferSize = _data->maxBytesPerTileLine * _data->tileDesc.ySize; + + // + // Create all the TileBuffers and allocate their internal buffers + // + + for (size_t i = 0; i < _data->tileBuffers.size(); i++) + { + _data->tileBuffers[i] = new TileBuffer (newTileCompressor + (_data->header.compression(), + _data->maxBytesPerTileLine, + _data->tileDesc.ySize, + _data->header)); + + _data->tileBuffers[i]->buffer.resizeErase(_data->tileBufferSize); + } + + _data->format = defaultFormat (_data->tileBuffers[0]->compressor); + + _data->tileOffsets = TileOffsets (_data->tileDesc.mode, + _data->numXLevels, + _data->numYLevels, + _data->numXTiles, + _data->numYTiles); + + _data->previewPosition = _data->header.writeTo (*_data->os, true); + + _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_data->os); + _data->currentPosition = _data->os->tellp(); +} + + +TiledOutputFile::~TiledOutputFile () +{ + if (_data) + { + { + if (_data->tileOffsetsPosition > 0) + { + try + { + _data->os->seekp (_data->tileOffsetsPosition); + _data->tileOffsets.writeTo (*_data->os); + } + catch (...) + { + // + // We cannot safely throw any exceptions from here. + // This destructor may have been called because the + // stack is currently being unwound for another + // exception. + // + } + } + } + + delete _data; + } +} + + +const char * +TiledOutputFile::fileName () const +{ + return _data->os->fileName(); +} + + +const Header & +TiledOutputFile::header () const +{ + return _data->header; +} + + +void +TiledOutputFile::setFrameBuffer (const FrameBuffer &frameBuffer) +{ + Lock lock (*_data); + + // + // Check if the new frame buffer descriptor + // is compatible with the image file header. + // + + const ChannelList &channels = _data->header.channels(); + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + continue; + + if (i.channel().type != j.slice().type) + THROW (Iex::ArgExc, "Pixel type of \"" << i.name() << "\" channel " + "of output file \"" << fileName() << "\" is " + "not compatible with the frame buffer's " + "pixel type."); + + if (j.slice().xSampling != 1 || j.slice().ySampling != 1) + THROW (Iex::ArgExc, "All channels in a tiled file must have" + "sampling (1,1)."); + } + + // + // Initialize slice table for writePixels(). + // + + vector slices; + + for (ChannelList::ConstIterator i = channels.begin(); + i != channels.end(); + ++i) + { + FrameBuffer::ConstIterator j = frameBuffer.find (i.name()); + + if (j == frameBuffer.end()) + { + // + // Channel i is not present in the frame buffer. + // In the file, channel i will contain only zeroes. + // + + slices.push_back (TOutSliceInfo (i.channel().type, + 0, // base + 0, // xStride, + 0, // yStride, + true)); // zero + } + else + { + // + // Channel i is present in the frame buffer. + // + + slices.push_back (TOutSliceInfo (j.slice().type, + j.slice().base, + j.slice().xStride, + j.slice().yStride, + false, // zero + (j.slice().xTileCoords)? 1: 0, + (j.slice().yTileCoords)? 1: 0)); + } + } + + // + // Store the new frame buffer. + // + + _data->frameBuffer = frameBuffer; + _data->slices = slices; +} + + +const FrameBuffer & +TiledOutputFile::frameBuffer () const +{ + Lock lock (*_data); + return _data->frameBuffer; +} + + +void +TiledOutputFile::writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly) +{ + try + { + Lock lock (*_data); + + if (_data->slices.size() == 0) + throw Iex::ArgExc ("No frame buffer specified " + "as pixel data source."); + + if (!isValidTile (dx1, dy1, lx, ly) || !isValidTile (dx2, dy2, lx, ly)) + throw Iex::ArgExc ("Tile coordinates are invalid."); + + // + // Determine the first and last tile coordinates in both dimensions + // based on the file's lineOrder + // + + if (dx1 > dx2) + swap (dx1, dx2); + + if (dy1 > dy2) + swap (dy1, dy2); + + int dyStart = dy1; + int dyStop = dy2 + 1; + int dY = 1; + + if (_data->lineOrder == DECREASING_Y) + { + dyStart = dy2; + dyStop = dy1 - 1; + dY = -1; + } + + int numTiles = (dx2 - dx1 + 1) * (dy2 - dy1 + 1); + int numTasks = min ((int)_data->tileBuffers.size(), numTiles); + + // + // Create a task group for all tile buffer tasks. When the + // task group goes out of scope, the destructor waits until + // all tasks are complete. + // + + { + TaskGroup taskGroup; + + // + // Add in the initial compression tasks to the thread pool + // + + int nextCompBuffer = 0; + int dxComp = dx1; + int dyComp = dyStart; + + while (nextCompBuffer < numTasks) + { + ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup, + _data, + nextCompBuffer++, + dxComp, dyComp, + lx, ly)); + dxComp++; + + if (dxComp > dx2) + { + dxComp = dx1; + dyComp += dY; + } + } + + // + // Write the compressed buffers and add in more compression + // tasks until done + // + + int nextWriteBuffer = 0; + int dxWrite = dx1; + int dyWrite = dyStart; + + while (nextWriteBuffer < numTiles) + { + // + // Wait until the nextWriteBuffer is ready to be written + // + + TileBuffer* writeBuffer = + _data->getTileBuffer (nextWriteBuffer); + + writeBuffer->wait(); + + // + // Write the tilebuffer + // + + bufferedTileWrite (_data, dxWrite, dyWrite, lx, ly, + writeBuffer->dataPtr, + writeBuffer->dataSize); + + // + // Release the lock on nextWriteBuffer + // + + writeBuffer->post(); + + // + // If there are no more tileBuffers to compress, then + // only continue to write out remaining tileBuffers, + // otherwise keep adding compression tasks. + // + + if (nextCompBuffer < numTiles) + { + // + // add nextCompBuffer as a compression Task + // + + ThreadPool::addGlobalTask + (new TileBufferTask (&taskGroup, + _data, + nextCompBuffer, + dxComp, dyComp, + lx, ly)); + } + + nextWriteBuffer++; + dxWrite++; + + if (dxWrite > dx2) + { + dxWrite = dx1; + dyWrite += dY; + } + + nextCompBuffer++; + dxComp++; + + if (dxComp > dx2) + { + dxComp = dx1; + dyComp += dY; + } + } + + // + // finish all tasks + // + } + + // + // Exeption handling: + // + // TileBufferTask::execute() may have encountered exceptions, but + // those exceptions occurred in another thread, not in the thread + // that is executing this call to TiledOutputFile::writeTiles(). + // TileBufferTask::execute() has caught all exceptions and stored + // the exceptions' what() strings in the tile buffers. + // Now we check if any tile buffer contains a stored exception; if + // this is the case then we re-throw the exception in this thread. + // (It is possible that multiple tile buffers contain stored + // exceptions. We re-throw the first exception we find and + // ignore all others.) + // + + const string *exception = 0; + + for (int i = 0; i < _data->tileBuffers.size(); ++i) + { + TileBuffer *tileBuffer = _data->tileBuffers[i]; + + if (tileBuffer->hasException && !exception) + exception = &tileBuffer->exception; + + tileBuffer->hasException = false; + } + + if (exception) + throw Iex::IoExc (*exception); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Failed to write pixel data to image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +TiledOutputFile::writeTiles (int dx1, int dxMax, int dyMin, int dyMax, int l) +{ + writeTiles (dx1, dxMax, dyMin, dyMax, l, l); +} + + +void +TiledOutputFile::writeTile (int dx, int dy, int lx, int ly) +{ + writeTiles (dx, dx, dy, dy, lx, ly); +} + + +void +TiledOutputFile::writeTile (int dx, int dy, int l) +{ + writeTile(dx, dy, l, l); +} + + +void +TiledOutputFile::copyPixels (TiledInputFile &in) +{ + Lock lock (*_data); + + // + // Check if this file's and and the InputFile's + // headers are compatible. + // + + const Header &hdr = _data->header; + const Header &inHdr = in.header(); + + if (!hdr.hasTileDescription() || !inHdr.hasTileDescription()) + THROW (Iex::ArgExc, "Cannot perform a quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". The " + "output file is tiled, but the input file is not. " + "Try using OutputFile::copyPixels() instead."); + + if (!(hdr.tileDescription() == inHdr.tileDescription())) + THROW (Iex::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different tile descriptions."); + + if (!(hdr.dataWindow() == inHdr.dataWindow())) + THROW (Iex::ArgExc, "Cannot copy pixels from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\". The " + "files have different data windows."); + + if (!(hdr.lineOrder() == inHdr.lineOrder())) + THROW (Iex::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files have different line orders."); + + if (!(hdr.compression() == inHdr.compression())) + THROW (Iex::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" failed. " + "The files use different compression methods."); + + if (!(hdr.channels() == inHdr.channels())) + THROW (Iex::ArgExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << fileName() << "\" " + "failed. The files have different channel " + "lists."); + + // + // Verify that no pixel data have been written to this file yet. + // + + if (!_data->tileOffsets.isEmpty()) + THROW (Iex::LogicExc, "Quick pixel copy from image " + "file \"" << in.fileName() << "\" to image " + "file \"" << _data->os->fileName() << "\" " + "failed. \"" << fileName() << "\" " + "already contains pixel data."); + + // + // Calculate the total number of tiles in the file + // + + int numAllTiles = 0; + + switch (levelMode ()) + { + case ONE_LEVEL: + case MIPMAP_LEVELS: + + for (size_t i_l = 0; i_l < numLevels (); ++i_l) + numAllTiles += numXTiles (i_l) * numYTiles (i_l); + + break; + + case RIPMAP_LEVELS: + + for (size_t i_ly = 0; i_ly < numYLevels (); ++i_ly) + for (size_t i_lx = 0; i_lx < numXLevels (); ++i_lx) + numAllTiles += numXTiles (i_lx) * numYTiles (i_ly); + + break; + + default: + + throw Iex::ArgExc ("Unknown LevelMode format."); + } + + for (int i = 0; i < numAllTiles; ++i) + { + const char *pixelData; + int pixelDataSize; + + int dx = _data->nextTileToWrite.dx; + int dy = _data->nextTileToWrite.dy; + int lx = _data->nextTileToWrite.lx; + int ly = _data->nextTileToWrite.ly; + + in.rawTileData (dx, dy, lx, ly, pixelData, pixelDataSize); + writeTileData (_data, dx, dy, lx, ly, pixelData, pixelDataSize); + } +} + + +void +TiledOutputFile::copyPixels (InputFile &in) +{ + copyPixels (*in.tFile()); +} + + +unsigned int +TiledOutputFile::tileXSize () const +{ + return _data->tileDesc.xSize; +} + + +unsigned int +TiledOutputFile::tileYSize () const +{ + return _data->tileDesc.ySize; +} + + +LevelMode +TiledOutputFile::levelMode () const +{ + return _data->tileDesc.mode; +} + + +LevelRoundingMode +TiledOutputFile::levelRoundingMode () const +{ + return _data->tileDesc.roundingMode; +} + + +int +TiledOutputFile::numLevels () const +{ + if (levelMode() == RIPMAP_LEVELS) + THROW (Iex::LogicExc, "Error calling numLevels() on image " + "file \"" << fileName() << "\" " + "(numLevels() is not defined for RIPMAPs)."); + return _data->numXLevels; +} + + +int +TiledOutputFile::numXLevels () const +{ + return _data->numXLevels; +} + + +int +TiledOutputFile::numYLevels () const +{ + return _data->numYLevels; +} + + +bool +TiledOutputFile::isValidLevel (int lx, int ly) const +{ + if (lx < 0 || ly < 0) + return false; + + if (levelMode() == MIPMAP_LEVELS && lx != ly) + return false; + + if (lx >= numXLevels() || ly >= numYLevels()) + return false; + + return true; +} + + +int +TiledOutputFile::levelWidth (int lx) const +{ + try + { + int retVal = levelSize (_data->minX, _data->maxX, lx, + _data->tileDesc.roundingMode); + + return retVal; + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelWidth() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledOutputFile::levelHeight (int ly) const +{ + try + { + return levelSize (_data->minY, _data->maxY, ly, + _data->tileDesc.roundingMode); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling levelHeight() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +int +TiledOutputFile::numXTiles (int lx) const +{ + if (lx < 0 || lx >= _data->numXLevels) + THROW (Iex::LogicExc, "Error calling numXTiles() on image " + "file \"" << _data->os->fileName() << "\" " + "(Argument is not in valid range)."); + + return _data->numXTiles[lx]; +} + + +int +TiledOutputFile::numYTiles (int ly) const +{ + if (ly < 0 || ly >= _data->numYLevels) + THROW (Iex::LogicExc, "Error calling numXTiles() on image " + "file \"" << _data->os->fileName() << "\" " + "(Argument is not in valid range)."); + + return _data->numYTiles[ly]; +} + + +Box2i +TiledOutputFile::dataWindowForLevel (int l) const +{ + return dataWindowForLevel (l, l); +} + + +Box2i +TiledOutputFile::dataWindowForLevel (int lx, int ly) const +{ + try + { + return Imf::dataWindowForLevel (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + lx, ly); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForLevel() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +Box2i +TiledOutputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return dataWindowForTile (dx, dy, l, l); +} + + +Box2i +TiledOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + try + { + if (!isValidTile (dx, dy, lx, ly)) + throw Iex::ArgExc ("Arguments not in valid range."); + + return Imf::dataWindowForTile (_data->tileDesc, + _data->minX, _data->maxX, + _data->minY, _data->maxY, + dx, dy, + lx, ly); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Error calling dataWindowForTile() on image " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +bool +TiledOutputFile::isValidTile (int dx, int dy, int lx, int ly) const +{ + return ((lx < _data->numXLevels && lx >= 0) && + (ly < _data->numYLevels && ly >= 0) && + (dx < _data->numXTiles[lx] && dx >= 0) && + (dy < _data->numYTiles[ly] && dy >= 0)); +} + + +void +TiledOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + Lock lock (*_data); + + if (_data->previewPosition <= 0) + THROW (Iex::LogicExc, "Cannot update preview image pixels. " + "File \"" << fileName() << "\" does not " + "contain a preview image."); + + // + // Store the new pixels in the header's preview image attribute. + // + + PreviewImageAttribute &pia = + _data->header.typedAttribute ("preview"); + + PreviewImage &pi = pia.value(); + PreviewRgba *pixels = pi.pixels(); + int numPixels = pi.width() * pi.height(); + + for (int i = 0; i < numPixels; ++i) + pixels[i] = newPixels[i]; + + // + // Save the current file position, jump to the position in + // the file where the preview image starts, store the new + // preview image, and jump back to the saved file position. + // + + Int64 savedPosition = _data->os->tellp(); + + try + { + _data->os->seekp (_data->previewPosition); + pia.writeValueTo (*_data->os, _data->version); + _data->os->seekp (savedPosition); + } + catch (Iex::BaseExc &e) + { + REPLACE_EXC (e, "Cannot update preview image pixels for " + "file \"" << fileName() << "\". " << e); + throw; + } +} + + +void +TiledOutputFile::breakTile + (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c) +{ + Lock lock (*_data); + + Int64 position = _data->tileOffsets (dx, dy, lx, ly); + + if (!position) + THROW (Iex::ArgExc, + "Cannot overwrite tile " + "(" << dx << ", " << dy << ", " << lx << "," << ly << "). " + "The tile has not yet been stored in " + "file \"" << fileName() << "\"."); + + _data->currentPosition = 0; + _data->os->seekp (position + offset); + + for (int i = 0; i < length; ++i) + _data->os->write (&c, 1); +} + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTiledOutputFile.h b/3rdparty/openexr/IlmImf/ImfTiledOutputFile.h new file mode 100644 index 000000000..3b4f3ffbe --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledOutputFile.h @@ -0,0 +1,475 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TILED_OUTPUT_FILE_H +#define INCLUDED_IMF_TILED_OUTPUT_FILE_H + +//----------------------------------------------------------------------------- +// +// class TiledOutputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include "ImathBox.h" +#include +#include + +namespace Imf { + +class TiledInputFile; +class InputFile; +struct PreviewRgba; + + +class TiledOutputFile +{ + public: + + //------------------------------------------------------------------- + // A constructor that opens the file with the specified name, and + // writes the file header. The file header is also copied into the + // TiledOutputFile object, and can later be accessed via the header() + // method. + // + // Destroying TiledOutputFile constructed with this constructor + // automatically closes the corresponding files. + // + // The header must contain a TileDescriptionAttribute called "tiles". + // + // The x and y subsampling factors for all image channels must be 1; + // subsampling is not supported. + // + // Tiles can be written to the file in arbitrary order. The line + // order attribute can be used to cause the tiles to be sorted in + // the file. When the file is read later, reading the tiles in the + // same order as they are in the file tends to be significantly + // faster than reading the tiles in random order (see writeTile, + // below). + //------------------------------------------------------------------- + + TiledOutputFile (const char fileName[], + const Header &header, + int numThreads = globalThreadCount ()); + + + // ---------------------------------------------------------------- + // A constructor that attaches the new TiledOutputFile object to + // a file that has already been opened. Destroying TiledOutputFile + // objects constructed with this constructor does not automatically + // close the corresponding files. + // ---------------------------------------------------------------- + + TiledOutputFile (OStream &os, + const Header &header, + int numThreads = globalThreadCount ()); + + + //----------------------------------------------------- + // Destructor + // + // Destroying a TiledOutputFile object before all tiles + // have been written results in an incomplete file. + //----------------------------------------------------- + + virtual ~TiledOutputFile (); + + + //------------------------ + // Access to the file name + //------------------------ + + const char * fileName () const; + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + + + //------------------------------------------------------- + // Set the current frame buffer -- copies the FrameBuffer + // object into the TiledOutputFile object. + // + // The current frame buffer is the source of the pixel + // data written to the file. The current frame buffer + // must be set at least once before writeTile() is + // called. The current frame buffer can be changed + // after each call to writeTile(). + //------------------------------------------------------- + + void setFrameBuffer (const FrameBuffer &frameBuffer); + + + //----------------------------------- + // Access to the current frame buffer + //----------------------------------- + + const FrameBuffer & frameBuffer () const; + + + //------------------- + // Utility functions: + //------------------- + + //--------------------------------------------------------- + // Multiresolution mode and tile size: + // The following functions return the xSize, ySize and mode + // fields of the file header's TileDescriptionAttribute. + //--------------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + + //-------------------------------------------------------------------- + // Number of levels: + // + // numXLevels() returns the file's number of levels in x direction. + // + // if levelMode() == ONE_LEVEL: + // return value is: 1 + // + // if levelMode() == MIPMAP_LEVELS: + // return value is: rfunc (log (max (w, h)) / log (2)) + 1 + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (w) / log (2)) + 1 + // + // where + // w is the width of the image's data window, max.x - min.x + 1, + // y is the height of the image's data window, max.y - min.y + 1, + // and rfunc(x) is either floor(x), or ceil(x), depending on + // whether levelRoundingMode() returns ROUND_DOWN or ROUND_UP. + // + // numYLevels() returns the file's number of levels in y direction. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // return value is: rfunc (log (h) / log (2)) + 1 + // + // + // numLevels() is a convenience function for use with MIPMAP_LEVELS + // files. + // + // if levelMode() == ONE_LEVEL or levelMode() == MIPMAP_LEVELS: + // return value is the same as for numXLevels() + // + // if levelMode() == RIPMAP_LEVELS: + // an Iex::LogicExc exception is thrown + // + // isValidLevel(lx, ly) returns true if the file contains + // a level with level number (lx, ly), false if not. + // + //-------------------------------------------------------------------- + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + + //--------------------------------------------------------- + // Dimensions of a level: + // + // levelWidth(lx) returns the width of a level with level + // number (lx, *), where * is any number. + // + // return value is: + // max (1, rfunc (w / pow (2, lx))) + // + // + // levelHeight(ly) returns the height of a level with level + // number (*, ly), where * is any number. + // + // return value is: + // max (1, rfunc (h / pow (2, ly))) + // + //--------------------------------------------------------- + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + + //---------------------------------------------------------- + // Number of tiles: + // + // numXTiles(lx) returns the number of tiles in x direction + // that cover a level with level number (lx, *), where * is + // any number. + // + // return value is: + // (levelWidth(lx) + tileXSize() - 1) / tileXSize() + // + // + // numYTiles(ly) returns the number of tiles in y direction + // that cover a level with level number (*, ly), where * is + // any number. + // + // return value is: + // (levelHeight(ly) + tileXSize() - 1) / tileXSize() + // + //---------------------------------------------------------- + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + + //--------------------------------------------------------- + // Level pixel ranges: + // + // dataWindowForLevel(lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a level with + // level number (lx, ly) + // + // return value is a Box2i with min value: + // (dataWindow.min.x, dataWindow.min.y) + // + // and max value: + // (dataWindow.min.x + levelWidth(lx) - 1, + // dataWindow.min.y + levelHeight(ly) - 1) + // + // dataWindowForLevel(level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForLevel(level, level). + // + //--------------------------------------------------------- + + Imath::Box2i dataWindowForLevel (int l = 0) const; + Imath::Box2i dataWindowForLevel (int lx, int ly) const; + + + //------------------------------------------------------------------- + // Tile pixel ranges: + // + // dataWindowForTile(dx, dy, lx, ly) returns a 2-dimensional + // region of valid pixel coordinates for a tile with tile coordinates + // (dx,dy) and level number (lx, ly). + // + // return value is a Box2i with min value: + // (dataWindow.min.x + dx * tileXSize(), + // dataWindow.min.y + dy * tileYSize()) + // + // and max value: + // (dataWindow.min.x + (dx + 1) * tileXSize() - 1, + // dataWindow.min.y + (dy + 1) * tileYSize() - 1) + // + // dataWindowForTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVELS files. It returns + // dataWindowForTile(dx, dy, level, level). + // + //------------------------------------------------------------------- + + Imath::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + Imath::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------------ + // Write pixel data: + // + // writeTile(dx, dy, lx, ly) writes the tile with tile + // coordinates (dx, dy), and level number (lx, ly) to + // the file. + // + // dx must lie in the interval [0, numXTiles(lx) - 1] + // dy must lie in the interval [0, numYTiles(ly) - 1] + // + // lx must lie in the interval [0, numXLevels() - 1] + // ly must lie in the inverval [0, numYLevels() - 1] + // + // writeTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls + // writeTile(dx, dy, level, level). + // + // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow + // writing multiple tiles at once. If multi-threading is used + // multiple tiles are written concurrently. The tile coordinates, + // dx1, dx2 and dy1, dy2, specify inclusive ranges of tile + // coordinates. It is valid for dx1 < dx2 or dy1 < dy2; the + // tiles are always written in the order specified by the line + // order attribute. Hence, it is not possible to specify an + // "invalid" or empty tile range. + // + // Pixels that are outside the pixel coordinate range for the tile's + // level, are never accessed by writeTile(). + // + // Each tile in the file must be written exactly once. + // + // The file's line order attribute determines the order of the tiles + // in the file: + // + // INCREASING_Y In the file, the tiles for each level are stored + // in a contiguous block. The levels are ordered + // like this: + // + // (0, 0) (1, 0) ... (nx-1, 0) + // (0, 1) (1, 1) ... (nx-1, 1) + // ... + // (0,ny-1) (1,ny-1) ... (nx-1,ny-1) + // + // where nx = numXLevels(), and ny = numYLevels(). + // In an individual level, (lx, ly), the tiles + // are stored in the following order: + // + // (0, 0) (1, 0) ... (tx-1, 0) + // (0, 1) (1, 1) ... (tx-1, 1) + // ... + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // + // where tx = numXTiles(lx), + // and ty = numYTiles(ly). + // + // DECREASING_Y As for INCREASING_Y, the tiles for each level + // are stored in a contiguous block. The levels + // are ordered the same way as for INCREASING_Y, + // but within an individual level, the tiles + // are stored in this order: + // + // (0,ty-1) (1,ty-1) ... (tx-1,ty-1) + // ... + // (0, 1) (1, 1) ... (tx-1, 1) + // (0, 0) (1, 0) ... (tx-1, 0) + // + // + // RANDOM_Y The order of the calls to writeTile() determines + // the order of the tiles in the file. + // + //------------------------------------------------------------------ + + void writeTile (int dx, int dy, int l = 0); + void writeTile (int dx, int dy, int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int lx, int ly); + + void writeTiles (int dx1, int dx2, int dy1, int dy2, + int l = 0); + + + //------------------------------------------------------------------ + // Shortcut to copy all pixels from a TiledInputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the TiledInputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder", "channels", and "tiles" attributes must be the same. + //------------------------------------------------------------------ + + void copyPixels (TiledInputFile &in); + + + //------------------------------------------------------------------ + // Shortcut to copy all pixels from an InputFile into this file, + // without uncompressing and then recompressing the pixel data. + // This file's header must be compatible with the InputFile's + // header: The two header's "dataWindow", "compression", + // "lineOrder", "channels", and "tiles" attributes must be the same. + // + // To use this function, the InputFile must be tiled. + //------------------------------------------------------------------ + + void copyPixels (InputFile &in); + + + //-------------------------------------------------------------- + // Updating the preview image: + // + // updatePreviewImage() supplies a new set of pixels for the + // preview image attribute in the file's header. If the header + // does not contain a preview image, updatePreviewImage() throws + // an Iex::LogicExc. + // + // Note: updatePreviewImage() is necessary because images are + // often stored in a file incrementally, a few tiles at a time, + // while the image is being generated. Since the preview image + // is an attribute in the file's header, it gets stored in the + // file as soon as the file is opened, but we may not know what + // the preview image should look like until we have written the + // last tile of the main image. + // + //-------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba newPixels[]); + + + //------------------------------------------------------------- + // Break a tile -- for testing and debugging only: + // + // breakTile(dx,dy,lx,ly,p,n,c) introduces an error into the + // output file by writing n copies of character c, starting + // p bytes from the beginning of the tile with tile coordinates + // (dx, dy) and level number (lx, ly). + // + // Warning: Calling this function usually results in a broken + // image file. The file or parts of it may not be readable, + // or the file may contain bad data. + // + //------------------------------------------------------------- + + void breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c); + struct Data; + + private: + + TiledOutputFile (const TiledOutputFile &); // not implemented + TiledOutputFile & operator = (const TiledOutputFile &); // not implemented + + void initialize (const Header &header); + + bool isValidTile (int dx, int dy, + int lx, int ly) const; + + size_t bytesPerLineForTile (int dx, int dy, + int lx, int ly) const; + + Data * _data; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTiledRgbaFile.cpp b/3rdparty/openexr/IlmImf/ImfTiledRgbaFile.cpp new file mode 100644 index 000000000..1448fe6f4 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledRgbaFile.cpp @@ -0,0 +1,1162 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class TiledRgbaOutputFile +// class TiledRgbaInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "IlmThreadMutex.h" +#include "Iex.h" + + +namespace Imf { + +using namespace std; +using namespace Imath; +using namespace RgbaYca; +using namespace IlmThread; + +namespace { + +void +insertChannels (Header &header, + RgbaChannels rgbaChannels, + const char fileName[]) +{ + ChannelList ch; + + if (rgbaChannels & (WRITE_Y | WRITE_C)) + { + if (rgbaChannels & WRITE_Y) + { + ch.insert ("Y", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_C) + { + THROW (Iex::ArgExc, "Cannot open file \"" << fileName << "\" " + "for writing. Tiled image files do not " + "support subsampled chroma channels."); + } + } + else + { + if (rgbaChannels & WRITE_R) + ch.insert ("R", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_G) + ch.insert ("G", Channel (HALF, 1, 1)); + + if (rgbaChannels & WRITE_B) + ch.insert ("B", Channel (HALF, 1, 1)); + } + + if (rgbaChannels & WRITE_A) + ch.insert ("A", Channel (HALF, 1, 1)); + + header.channels() = ch; +} + + +RgbaChannels +rgbaChannels (const ChannelList &ch, const string &channelNamePrefix = "") +{ + int i = 0; + + if (ch.findChannel (channelNamePrefix + "R")) + i |= WRITE_R; + + if (ch.findChannel (channelNamePrefix + "G")) + i |= WRITE_G; + + if (ch.findChannel (channelNamePrefix + "B")) + i |= WRITE_B; + + if (ch.findChannel (channelNamePrefix + "A")) + i |= WRITE_A; + + if (ch.findChannel (channelNamePrefix + "Y")) + i |= WRITE_Y; + + return RgbaChannels (i); +} + + +string +prefixFromLayerName (const string &layerName, const Header &header) +{ + if (layerName.empty()) + return ""; + + if (hasMultiView (header) && multiView(header)[0] == layerName) + return ""; + + return layerName + "."; +} + + +V3f +ywFromHeader (const Header &header) +{ + Chromaticities cr; + + if (hasChromaticities (header)) + cr = chromaticities (header); + + return computeYw (cr); +} + +} // namespace + + +class TiledRgbaOutputFile::ToYa: public Mutex +{ + public: + + ToYa (TiledOutputFile &outputFile, RgbaChannels rgbaChannels); + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + void writeTile (int dx, int dy, int lx, int ly); + + private: + + TiledOutputFile & _outputFile; + bool _writeA; + unsigned int _tileXSize; + unsigned int _tileYSize; + V3f _yw; + Array2D _buf; + const Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; +}; + + +TiledRgbaOutputFile::ToYa::ToYa (TiledOutputFile &outputFile, + RgbaChannels rgbaChannels) +: + _outputFile (outputFile) +{ + _writeA = (rgbaChannels & WRITE_A)? true: false; + + const TileDescription &td = outputFile.header().tileDescription(); + + _tileXSize = td.xSize; + _tileYSize = td.ySize; + _yw = ywFromHeader (_outputFile.header()); + _buf.resizeErase (_tileYSize, _tileXSize); + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; +} + + +void +TiledRgbaOutputFile::ToYa::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +TiledRgbaOutputFile::ToYa::writeTile (int dx, int dy, int lx, int ly) +{ + if (_fbBase == 0) + { + THROW (Iex::ArgExc, "No frame buffer was specified as the " + "pixel data source for image file " + "\"" << _outputFile.fileName() << "\"."); + } + + // + // Copy the tile's RGBA pixels into _buf and convert + // them to luminance/alpha format + // + + Box2i dw = _outputFile.dataWindowForTile (dx, dy, lx, ly); + int width = dw.max.x - dw.min.x + 1; + + for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1) + { + for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1) + _buf[y1][x1] = _fbBase[x * _fbXStride + y * _fbYStride]; + + RGBAtoYCA (_yw, width, _writeA, _buf[y1], _buf[y1]); + } + + // + // Store the contents of _buf in the output file + // + + FrameBuffer fb; + + fb.insert ("Y", Slice (HALF, // type + (char *) &_buf[-dw.min.y][-dw.min.x].g, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize)); // yStride + + fb.insert ("A", Slice (HALF, // type + (char *) &_buf[-dw.min.y][-dw.min.x].a, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize)); // yStride + + _outputFile.setFrameBuffer (fb); + _outputFile.writeTile (dx, dy, lx, ly); +} + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (const char name[], + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels, name); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (name, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (header); + insertChannels (hd, rgbaChannels, os.fileName()); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (os, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (const char name[], + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + const Imath::Box2i &displayWindow, + const Imath::Box2i &dataWindow, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const Imath::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (displayWindow, + dataWindow.isEmpty()? displayWindow: dataWindow, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels, name); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (name, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + +TiledRgbaOutputFile::TiledRgbaOutputFile + (const char name[], + int width, + int height, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + RgbaChannels rgbaChannels, + float pixelAspectRatio, + const Imath::V2f screenWindowCenter, + float screenWindowWidth, + LineOrder lineOrder, + Compression compression, + int numThreads) +: + _outputFile (0), + _toYa (0) +{ + Header hd (width, + height, + pixelAspectRatio, + screenWindowCenter, + screenWindowWidth, + lineOrder, + compression); + + insertChannels (hd, rgbaChannels, name); + hd.setTileDescription (TileDescription (tileXSize, tileYSize, mode, rmode)); + _outputFile = new TiledOutputFile (name, hd, numThreads); + + if (rgbaChannels & WRITE_Y) + _toYa = new ToYa (*_outputFile, rgbaChannels); +} + + +TiledRgbaOutputFile::~TiledRgbaOutputFile () +{ + delete _outputFile; + delete _toYa; +} + + +void +TiledRgbaOutputFile::setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride) +{ + if (_toYa) + { + Lock lock (*_toYa); + _toYa->setFrameBuffer (base, xStride, yStride); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert ("R", Slice (HALF, (char *) &base[0].r, xs, ys)); + fb.insert ("G", Slice (HALF, (char *) &base[0].g, xs, ys)); + fb.insert ("B", Slice (HALF, (char *) &base[0].b, xs, ys)); + fb.insert ("A", Slice (HALF, (char *) &base[0].a, xs, ys)); + + _outputFile->setFrameBuffer (fb); + } +} + + +const Header & +TiledRgbaOutputFile::header () const +{ + return _outputFile->header(); +} + + +const FrameBuffer & +TiledRgbaOutputFile::frameBuffer () const +{ + return _outputFile->frameBuffer(); +} + + +const Imath::Box2i & +TiledRgbaOutputFile::displayWindow () const +{ + return _outputFile->header().displayWindow(); +} + + +const Imath::Box2i & +TiledRgbaOutputFile::dataWindow () const +{ + return _outputFile->header().dataWindow(); +} + + +float +TiledRgbaOutputFile::pixelAspectRatio () const +{ + return _outputFile->header().pixelAspectRatio(); +} + + +const Imath::V2f +TiledRgbaOutputFile::screenWindowCenter () const +{ + return _outputFile->header().screenWindowCenter(); +} + + +float +TiledRgbaOutputFile::screenWindowWidth () const +{ + return _outputFile->header().screenWindowWidth(); +} + + +LineOrder +TiledRgbaOutputFile::lineOrder () const +{ + return _outputFile->header().lineOrder(); +} + + +Compression +TiledRgbaOutputFile::compression () const +{ + return _outputFile->header().compression(); +} + + +RgbaChannels +TiledRgbaOutputFile::channels () const +{ + return rgbaChannels (_outputFile->header().channels()); +} + + +unsigned int +TiledRgbaOutputFile::tileXSize () const +{ + return _outputFile->tileXSize(); +} + + +unsigned int +TiledRgbaOutputFile::tileYSize () const +{ + return _outputFile->tileYSize(); +} + + +LevelMode +TiledRgbaOutputFile::levelMode () const +{ + return _outputFile->levelMode(); +} + + +LevelRoundingMode +TiledRgbaOutputFile::levelRoundingMode () const +{ + return _outputFile->levelRoundingMode(); +} + + +int +TiledRgbaOutputFile::numLevels () const +{ + return _outputFile->numLevels(); +} + + +int +TiledRgbaOutputFile::numXLevels () const +{ + return _outputFile->numXLevels(); +} + + +int +TiledRgbaOutputFile::numYLevels () const +{ + return _outputFile->numYLevels(); +} + + +bool +TiledRgbaOutputFile::isValidLevel (int lx, int ly) const +{ + return _outputFile->isValidLevel (lx, ly); +} + + +int +TiledRgbaOutputFile::levelWidth (int lx) const +{ + return _outputFile->levelWidth (lx); +} + + +int +TiledRgbaOutputFile::levelHeight (int ly) const +{ + return _outputFile->levelHeight (ly); +} + + +int +TiledRgbaOutputFile::numXTiles (int lx) const +{ + return _outputFile->numXTiles (lx); +} + + +int +TiledRgbaOutputFile::numYTiles (int ly) const +{ + return _outputFile->numYTiles (ly); +} + + +Imath::Box2i +TiledRgbaOutputFile::dataWindowForLevel (int l) const +{ + return _outputFile->dataWindowForLevel (l); +} + + +Imath::Box2i +TiledRgbaOutputFile::dataWindowForLevel (int lx, int ly) const +{ + return _outputFile->dataWindowForLevel (lx, ly); +} + + +Imath::Box2i +TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return _outputFile->dataWindowForTile (dx, dy, l); +} + + +Imath::Box2i +TiledRgbaOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + return _outputFile->dataWindowForTile (dx, dy, lx, ly); +} + + +void +TiledRgbaOutputFile::writeTile (int dx, int dy, int l) +{ + if (_toYa) + { + Lock lock (*_toYa); + _toYa->writeTile (dx, dy, l, l); + } + else + { + _outputFile->writeTile (dx, dy, l); + } +} + + +void +TiledRgbaOutputFile::writeTile (int dx, int dy, int lx, int ly) +{ + if (_toYa) + { + Lock lock (*_toYa); + _toYa->writeTile (dx, dy, lx, ly); + } + else + { + _outputFile->writeTile (dx, dy, lx, ly); + } +} + + +void +TiledRgbaOutputFile::writeTiles + (int dxMin, int dxMax, int dyMin, int dyMax, int lx, int ly) +{ + if (_toYa) + { + Lock lock (*_toYa); + + for (int dy = dyMin; dy <= dyMax; dy++) + for (int dx = dxMin; dx <= dxMax; dx++) + _toYa->writeTile (dx, dy, lx, ly); + } + else + { + _outputFile->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + } +} + +void +TiledRgbaOutputFile::writeTiles + (int dxMin, int dxMax, int dyMin, int dyMax, int l) +{ + writeTiles (dxMin, dxMax, dyMin, dyMax, l, l); +} + + +class TiledRgbaInputFile::FromYa: public Mutex +{ + public: + + FromYa (TiledInputFile &inputFile); + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix); + + void readTile (int dx, int dy, int lx, int ly); + + private: + + TiledInputFile & _inputFile; + unsigned int _tileXSize; + unsigned int _tileYSize; + V3f _yw; + Array2D _buf; + Rgba * _fbBase; + size_t _fbXStride; + size_t _fbYStride; +}; + + +TiledRgbaInputFile::FromYa::FromYa (TiledInputFile &inputFile) +: + _inputFile (inputFile) +{ + const TileDescription &td = inputFile.header().tileDescription(); + + _tileXSize = td.xSize; + _tileYSize = td.ySize; + _yw = ywFromHeader (_inputFile.header()); + _buf.resizeErase (_tileYSize, _tileXSize); + _fbBase = 0; + _fbXStride = 0; + _fbYStride = 0; +} + + +void +TiledRgbaInputFile::FromYa::setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride, + const string &channelNamePrefix) +{ + if (_fbBase == 0) +{ + FrameBuffer fb; + + fb.insert (channelNamePrefix + "Y", + Slice (HALF, // type + (char *) &_buf[0][0].g, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize, // yStride + 1, 1, // sampling + 0.0, // fillValue + true, true)); // tileCoordinates + + fb.insert (channelNamePrefix + "A", + Slice (HALF, // type + (char *) &_buf[0][0].a, // base + sizeof (Rgba), // xStride + sizeof (Rgba) * _tileXSize, // yStride + 1, 1, // sampling + 1.0, // fillValue + true, true)); // tileCoordinates + + _inputFile.setFrameBuffer (fb); + } + + _fbBase = base; + _fbXStride = xStride; + _fbYStride = yStride; +} + + +void +TiledRgbaInputFile::FromYa::readTile (int dx, int dy, int lx, int ly) +{ + if (_fbBase == 0) + { + THROW (Iex::ArgExc, "No frame buffer was specified as the " + "pixel data destination for image file " + "\"" << _inputFile.fileName() << "\"."); + } + + // + // Read the tile requested by the caller into _buf. + // + + _inputFile.readTile (dx, dy, lx, ly); + + // + // Convert the luminance/alpha pixels to RGBA + // and copy them into the caller's frame buffer. + // + + Box2i dw = _inputFile.dataWindowForTile (dx, dy, lx, ly); + int width = dw.max.x - dw.min.x + 1; + + for (int y = dw.min.y, y1 = 0; y <= dw.max.y; ++y, ++y1) + { + for (int x1 = 0; x1 < width; ++x1) + { + _buf[y1][x1].r = 0; + _buf[y1][x1].b = 0; + } + + YCAtoRGBA (_yw, width, _buf[y1], _buf[y1]); + + for (int x = dw.min.x, x1 = 0; x <= dw.max.x; ++x, ++x1) + { + _fbBase[x * _fbXStride + y * _fbYStride] = _buf[y1][x1]; + } + } +} + + +TiledRgbaInputFile::TiledRgbaInputFile (const char name[], int numThreads): + _inputFile (new TiledInputFile (name, numThreads)), + _fromYa (0), + _channelNamePrefix ("") +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::TiledRgbaInputFile (IStream &is, int numThreads): + _inputFile (new TiledInputFile (is, numThreads)), + _fromYa (0), + _channelNamePrefix ("") +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::TiledRgbaInputFile (const char name[], + const string &layerName, + int numThreads) +: + _inputFile (new TiledInputFile (name, numThreads)), + _fromYa (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::TiledRgbaInputFile (IStream &is, + const string &layerName, + int numThreads) +: + _inputFile (new TiledInputFile (is, numThreads)), + _fromYa (0), + _channelNamePrefix (prefixFromLayerName (layerName, _inputFile->header())) +{ + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); +} + + +TiledRgbaInputFile::~TiledRgbaInputFile () +{ + delete _inputFile; + delete _fromYa; +} + + +void +TiledRgbaInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + _fromYa->setFrameBuffer (base, xStride, yStride, _channelNamePrefix); + } + else + { + size_t xs = xStride * sizeof (Rgba); + size_t ys = yStride * sizeof (Rgba); + + FrameBuffer fb; + + fb.insert (_channelNamePrefix + "R", + Slice (HALF, + (char *) &base[0].r, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "G", + Slice (HALF, + (char *) &base[0].g, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "B", + Slice (HALF, + (char *) &base[0].b, + xs, ys, + 1, 1, // xSampling, ySampling + 0.0)); // fillValue + + fb.insert (_channelNamePrefix + "A", + Slice (HALF, + (char *) &base[0].a, + xs, ys, + 1, 1, // xSampling, ySampling + 1.0)); // fillValue + + _inputFile->setFrameBuffer (fb); + } +} + + +void +TiledRgbaInputFile::setLayerName (const std::string &layerName) +{ + delete _fromYa; + _fromYa = 0; + + _channelNamePrefix = prefixFromLayerName (layerName, _inputFile->header()); + + if (channels() & WRITE_Y) + _fromYa = new FromYa (*_inputFile); + + FrameBuffer fb; + _inputFile->setFrameBuffer (fb); +} + + +const Header & +TiledRgbaInputFile::header () const +{ + return _inputFile->header(); +} + + +const char * +TiledRgbaInputFile::fileName () const +{ + return _inputFile->fileName(); +} + + +const FrameBuffer & +TiledRgbaInputFile::frameBuffer () const +{ + return _inputFile->frameBuffer(); +} + + +const Imath::Box2i & +TiledRgbaInputFile::displayWindow () const +{ + return _inputFile->header().displayWindow(); +} + + +const Imath::Box2i & +TiledRgbaInputFile::dataWindow () const +{ + return _inputFile->header().dataWindow(); +} + + +float +TiledRgbaInputFile::pixelAspectRatio () const +{ + return _inputFile->header().pixelAspectRatio(); +} + + +const Imath::V2f +TiledRgbaInputFile::screenWindowCenter () const +{ + return _inputFile->header().screenWindowCenter(); +} + + +float +TiledRgbaInputFile::screenWindowWidth () const +{ + return _inputFile->header().screenWindowWidth(); +} + + +LineOrder +TiledRgbaInputFile::lineOrder () const +{ + return _inputFile->header().lineOrder(); +} + + +Compression +TiledRgbaInputFile::compression () const +{ + return _inputFile->header().compression(); +} + + +RgbaChannels +TiledRgbaInputFile::channels () const +{ + return rgbaChannels (_inputFile->header().channels(), _channelNamePrefix); +} + + +int +TiledRgbaInputFile::version () const +{ + return _inputFile->version(); +} + + +bool +TiledRgbaInputFile::isComplete () const +{ + return _inputFile->isComplete(); +} + + +unsigned int +TiledRgbaInputFile::tileXSize () const +{ + return _inputFile->tileXSize(); +} + + +unsigned int +TiledRgbaInputFile::tileYSize () const +{ + return _inputFile->tileYSize(); +} + + +LevelMode +TiledRgbaInputFile::levelMode () const +{ + return _inputFile->levelMode(); +} + + +LevelRoundingMode +TiledRgbaInputFile::levelRoundingMode () const +{ + return _inputFile->levelRoundingMode(); +} + + +int +TiledRgbaInputFile::numLevels () const +{ + return _inputFile->numLevels(); +} + + +int +TiledRgbaInputFile::numXLevels () const +{ + return _inputFile->numXLevels(); +} + + +int +TiledRgbaInputFile::numYLevels () const +{ + return _inputFile->numYLevels(); +} + + +bool +TiledRgbaInputFile::isValidLevel (int lx, int ly) const +{ + return _inputFile->isValidLevel (lx, ly); +} + + +int +TiledRgbaInputFile::levelWidth (int lx) const +{ + return _inputFile->levelWidth (lx); +} + + +int +TiledRgbaInputFile::levelHeight (int ly) const +{ + return _inputFile->levelHeight (ly); +} + + +int +TiledRgbaInputFile::numXTiles (int lx) const +{ + return _inputFile->numXTiles(lx); +} + + +int +TiledRgbaInputFile::numYTiles (int ly) const +{ + return _inputFile->numYTiles(ly); +} + + +Imath::Box2i +TiledRgbaInputFile::dataWindowForLevel (int l) const +{ + return _inputFile->dataWindowForLevel (l); +} + + +Imath::Box2i +TiledRgbaInputFile::dataWindowForLevel (int lx, int ly) const +{ + return _inputFile->dataWindowForLevel (lx, ly); +} + + +Imath::Box2i +TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int l) const +{ + return _inputFile->dataWindowForTile (dx, dy, l); +} + + +Imath::Box2i +TiledRgbaInputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const +{ + return _inputFile->dataWindowForTile (dx, dy, lx, ly); +} + + +void +TiledRgbaInputFile::readTile (int dx, int dy, int l) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + _fromYa->readTile (dx, dy, l, l); + } + else + { + _inputFile->readTile (dx, dy, l); + } +} + + +void +TiledRgbaInputFile::readTile (int dx, int dy, int lx, int ly) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + _fromYa->readTile (dx, dy, lx, ly); + } + else + { + _inputFile->readTile (dx, dy, lx, ly); + } +} + + +void +TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int lx, int ly) +{ + if (_fromYa) + { + Lock lock (*_fromYa); + + for (int dy = dyMin; dy <= dyMax; dy++) + for (int dx = dxMin; dx <= dxMax; dx++) + _fromYa->readTile (dx, dy, lx, ly); + } + else + { + _inputFile->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly); + } +} + +void +TiledRgbaInputFile::readTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int l) +{ + readTiles (dxMin, dxMax, dyMin, dyMax, l, l); +} + + +void +TiledRgbaOutputFile::updatePreviewImage (const PreviewRgba newPixels[]) +{ + _outputFile->updatePreviewImage (newPixels); +} + + +void +TiledRgbaOutputFile::breakTile (int dx, int dy, int lx, int ly, + int offset, int length, char c) +{ + _outputFile->breakTile (dx, dy, lx, ly, offset, length, c); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTiledRgbaFile.h b/3rdparty/openexr/IlmImf/ImfTiledRgbaFile.h new file mode 100644 index 000000000..5fcd22b63 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTiledRgbaFile.h @@ -0,0 +1,479 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TILED_RGBA_FILE_H +#define INCLUDED_IMF_TILED_RGBA_FILE_H + +//----------------------------------------------------------------------------- +// +// Simplified RGBA image I/O for tiled files +// +// class TiledRgbaOutputFile +// class TiledRgbaInputFile +// +//----------------------------------------------------------------------------- + +#include +#include +#include "ImathVec.h" +#include "ImathBox.h" +#include "half.h" +#include +#include +#include +#include + +namespace Imf { + +class TiledOutputFile; +class TiledInputFile; +struct PreviewRgba; + + +// +// Tiled RGBA output file. +// + +class TiledRgbaOutputFile +{ + public: + + //--------------------------------------------------- + // Constructor -- rgbaChannels, tileXSize, tileYSize, + // levelMode, and levelRoundingMode overwrite the + // channel list and tile description attribute in the + // header that is passed as an argument to the + // constructor. + //--------------------------------------------------- + + TiledRgbaOutputFile (const char name[], + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode = ROUND_DOWN, + int numThreads = globalThreadCount ()); + + + //--------------------------------------------------- + // Constructor -- like the previous one, but the new + // TiledRgbaOutputFile is attached to a file that has + // already been opened by the caller. Destroying + // TiledRgbaOutputFileObjects constructed with this + // constructor does not automatically close the + // corresponding files. + //--------------------------------------------------- + + TiledRgbaOutputFile (OStream &os, + const Header &header, + RgbaChannels rgbaChannels, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode = ROUND_DOWN, + int numThreads = globalThreadCount ()); + + + //------------------------------------------------------ + // Constructor -- header data are explicitly specified + // as function call arguments (an empty dataWindow means + // "same as displayWindow") + //------------------------------------------------------ + + TiledRgbaOutputFile (const char name[], + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode, + const Imath::Box2i &displayWindow, + const Imath::Box2i &dataWindow = Imath::Box2i(), + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const Imath::V2f screenWindowCenter = + Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = ZIP_COMPRESSION, + int numThreads = globalThreadCount ()); + + + //----------------------------------------------- + // Constructor -- like the previous one, but both + // the display window and the data window are + // Box2i (V2i (0, 0), V2i (width - 1, height -1)) + //----------------------------------------------- + + TiledRgbaOutputFile (const char name[], + int width, + int height, + int tileXSize, + int tileYSize, + LevelMode mode, + LevelRoundingMode rmode = ROUND_DOWN, + RgbaChannels rgbaChannels = WRITE_RGBA, + float pixelAspectRatio = 1, + const Imath::V2f screenWindowCenter = + Imath::V2f (0, 0), + float screenWindowWidth = 1, + LineOrder lineOrder = INCREASING_Y, + Compression compression = ZIP_COMPRESSION, + int numThreads = globalThreadCount ()); + + + virtual ~TiledRgbaOutputFile (); + + + //------------------------------------------------ + // Define a frame buffer as the pixel data source: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //------------------------------------------------ + + void setFrameBuffer (const Rgba *base, + size_t xStride, + size_t yStride); + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const Imath::Box2i & displayWindow () const; + const Imath::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const Imath::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + + + //---------------------------------------------------- + // Utility functions (same as in Imf::TiledOutputFile) + //---------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + Imath::Box2i dataWindowForLevel (int l = 0) const; + Imath::Box2i dataWindowForLevel (int lx, int ly) const; + + Imath::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + Imath::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + //------------------------------------------------------------------ + // Write pixel data: + // + // writeTile(dx, dy, lx, ly) writes the tile with tile + // coordinates (dx, dy), and level number (lx, ly) to + // the file. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // writeTile(dx, dy, level) is a convenience function + // used for ONE_LEVEL and MIPMAP_LEVEL files. It calls + // writeTile(dx, dy, level, level). + // + // The two writeTiles(dx1, dx2, dy1, dy2, ...) functions allow + // writing multiple tiles at once. If multi-threading is used + // multiple tiles are written concurrently. + // + // Pixels that are outside the pixel coordinate range for the tile's + // level, are never accessed by writeTile(). + // + // Each tile in the file must be written exactly once. + // + //------------------------------------------------------------------ + + void writeTile (int dx, int dy, int l = 0); + void writeTile (int dx, int dy, int lx, int ly); + + void writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int lx, int ly); + + void writeTiles (int dxMin, int dxMax, int dyMin, int dyMax, + int l = 0); + + + // ------------------------------------------------------------------------- + // Update the preview image (see Imf::TiledOutputFile::updatePreviewImage()) + // ------------------------------------------------------------------------- + + void updatePreviewImage (const PreviewRgba[]); + + + //------------------------------------------------ + // Break a tile -- for testing and debugging only + // (see Imf::TiledOutputFile::breakTile()) + // + // Warning: Calling this function usually results + // in a broken image file. The file or parts of + // it may not be readable, or the file may contain + // bad data. + // + //------------------------------------------------ + + void breakTile (int dx, int dy, + int lx, int ly, + int offset, + int length, + char c); + private: + + // + // Copy constructor and assignment are not implemented + // + + TiledRgbaOutputFile (const TiledRgbaOutputFile &); + TiledRgbaOutputFile & operator = (const TiledRgbaOutputFile &); + + class ToYa; + + TiledOutputFile * _outputFile; + ToYa * _toYa; +}; + + + +// +// Tiled RGBA input file +// + +class TiledRgbaInputFile +{ + public: + + //-------------------------------------------------------- + // Constructor -- opens the file with the specified name. + // Destroying TiledRgbaInputFile objects constructed with + // this constructor automatically closes the corresponding + // files. + //-------------------------------------------------------- + + TiledRgbaInputFile (const char name[], + int numThreads = globalThreadCount ()); + + + //------------------------------------------------------- + // Constructor -- attaches the new TiledRgbaInputFile + // object to a file that has already been opened by the + // caller. + // Destroying TiledRgbaInputFile objects constructed with + // this constructor does not automatically close the + // corresponding files. + //------------------------------------------------------- + + TiledRgbaInputFile (IStream &is, int numThreads = globalThreadCount ()); + + + //------------------------------------------------------------ + // Constructors -- the same as the previous two, but the names + // of the red, green, blue, alpha, and luminance channels are + // expected to be layerName.R, layerName.G, etc. + //------------------------------------------------------------ + + TiledRgbaInputFile (const char name[], + const std::string &layerName, + int numThreads = globalThreadCount()); + + TiledRgbaInputFile (IStream &is, + const std::string &layerName, + int numThreads = globalThreadCount()); + + //----------- + // Destructor + //----------- + + virtual ~TiledRgbaInputFile (); + + + //----------------------------------------------------- + // Define a frame buffer as the pixel data destination: + // Pixel (x, y) is at address + // + // base + x * xStride + y * yStride + // + //----------------------------------------------------- + + void setFrameBuffer (Rgba *base, + size_t xStride, + size_t yStride); + + //------------------------------------------------------------------- + // Switch to a different layer -- subsequent calls to readTile() + // and readTiles() will read channels layerName.R, layerName.G, etc. + // After each call to setLayerName(), setFrameBuffer() must be called + // at least once before the next call to readTile() or readTiles(). + //------------------------------------------------------------------- + + void setLayerName (const std::string &layerName); + + + //-------------------------- + // Access to the file header + //-------------------------- + + const Header & header () const; + const FrameBuffer & frameBuffer () const; + const Imath::Box2i & displayWindow () const; + const Imath::Box2i & dataWindow () const; + float pixelAspectRatio () const; + const Imath::V2f screenWindowCenter () const; + float screenWindowWidth () const; + LineOrder lineOrder () const; + Compression compression () const; + RgbaChannels channels () const; + const char * fileName () const; + bool isComplete () const; + + //---------------------------------- + // Access to the file format version + //---------------------------------- + + int version () const; + + + //--------------------------------------------------- + // Utility functions (same as in Imf::TiledInputFile) + //--------------------------------------------------- + + unsigned int tileXSize () const; + unsigned int tileYSize () const; + LevelMode levelMode () const; + LevelRoundingMode levelRoundingMode () const; + + int numLevels () const; + int numXLevels () const; + int numYLevels () const; + bool isValidLevel (int lx, int ly) const; + + int levelWidth (int lx) const; + int levelHeight (int ly) const; + + int numXTiles (int lx = 0) const; + int numYTiles (int ly = 0) const; + + Imath::Box2i dataWindowForLevel (int l = 0) const; + Imath::Box2i dataWindowForLevel (int lx, int ly) const; + + Imath::Box2i dataWindowForTile (int dx, int dy, + int l = 0) const; + + Imath::Box2i dataWindowForTile (int dx, int dy, + int lx, int ly) const; + + + //---------------------------------------------------------------- + // Read pixel data: + // + // readTile(dx, dy, lx, ly) reads the tile with tile + // coordinates (dx, dy), and level number (lx, ly), + // and stores it in the current frame buffer. + // + // dx must lie in the interval [0, numXTiles(lx)-1] + // dy must lie in the interval [0, numYTiles(ly)-1] + // + // lx must lie in the interval [0, numXLevels()-1] + // ly must lie in the inverval [0, numYLevels()-1] + // + // readTile(dx, dy, level) is a convenience function used + // for ONE_LEVEL and MIPMAP_LEVELS files. It calls + // readTile(dx, dy, level, level). + // + // The two readTiles(dx1, dx2, dy1, dy2, ...) functions allow + // reading multiple tiles at once. If multi-threading is used + // multiple tiles are read concurrently. + // + // Pixels that are outside the pixel coordinate range for the + // tile's level, are never accessed by readTile(). + // + // Attempting to access a tile that is not present in the file + // throws an InputExc exception. + // + //---------------------------------------------------------------- + + void readTile (int dx, int dy, int l = 0); + void readTile (int dx, int dy, int lx, int ly); + + void readTiles (int dxMin, int dxMax, + int dyMin, int dyMax, int lx, int ly); + + void readTiles (int dxMin, int dxMax, + int dyMin, int dyMax, int l = 0); + + private: + + // + // Copy constructor and assignment are not implemented + // + + TiledRgbaInputFile (const TiledRgbaInputFile &); + TiledRgbaInputFile & operator = (const TiledRgbaInputFile &); + + class FromYa; + + TiledInputFile * _inputFile; + FromYa * _fromYa; + std::string _channelNamePrefix; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTimeCode.cpp b/3rdparty/openexr/IlmImf/ImfTimeCode.cpp new file mode 100644 index 000000000..9b34cceca --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTimeCode.cpp @@ -0,0 +1,415 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TimeCode +// +//----------------------------------------------------------------------------- + +#include +#include "Iex.h" + +namespace Imf { + + +TimeCode::TimeCode () +{ + _time = 0; + _user = 0; +} + + +TimeCode::TimeCode + (int hours, + int minutes, + int seconds, + int frame, + bool dropFrame, + bool colorFrame, + bool fieldPhase, + bool bgf0, + bool bgf1, + bool bgf2, + int binaryGroup1, + int binaryGroup2, + int binaryGroup3, + int binaryGroup4, + int binaryGroup5, + int binaryGroup6, + int binaryGroup7, + int binaryGroup8) +{ + setHours (hours); + setMinutes (minutes); + setSeconds (seconds); + setFrame (frame); + setDropFrame (dropFrame); + setColorFrame (colorFrame); + setFieldPhase (fieldPhase); + setBgf0 (bgf0); + setBgf1 (bgf1); + setBgf2 (bgf2); + setBinaryGroup (1, binaryGroup1); + setBinaryGroup (2, binaryGroup2); + setBinaryGroup (3, binaryGroup3); + setBinaryGroup (4, binaryGroup4); + setBinaryGroup (5, binaryGroup5); + setBinaryGroup (6, binaryGroup6); + setBinaryGroup (7, binaryGroup7); + setBinaryGroup (8, binaryGroup8); +} + + +TimeCode::TimeCode + (unsigned int timeAndFlags, + unsigned int userData, + Packing packing) +{ + setTimeAndFlags (timeAndFlags, packing); + setUserData (userData); +} + + +TimeCode::TimeCode (const TimeCode &other) +{ + _time = other._time; + _user = other._user; +} + + +TimeCode & +TimeCode::operator = (const TimeCode &other) +{ + _time = other._time; + _user = other._user; + return *this; +} + + +namespace { + +unsigned int +bitField (unsigned int value, int minBit, int maxBit) +{ + int shift = minBit; + unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit); + return (value & mask) >> shift; +} + + +void +setBitField (unsigned int &value, int minBit, int maxBit, unsigned int field) +{ + int shift = minBit; + unsigned int mask = (~(~0U << (maxBit - minBit + 1)) << minBit); + value = ((value & ~mask) | ((field << shift) & mask)); +} + + +int +bcdToBinary (unsigned int bcd) +{ + return int ((bcd & 0x0f) + 10 * ((bcd >> 4) & 0x0f)); +} + + +unsigned int +binaryToBcd (int binary) +{ + int units = binary % 10; + int tens = (binary / 10) % 10; + return (unsigned int) (units | (tens << 4)); +} + + +} // namespace + + +int +TimeCode::hours () const +{ + return bcdToBinary (bitField (_time, 24, 29)); +} + + +void +TimeCode::setHours (int value) +{ + if (value < 0 || value > 23) + throw Iex::ArgExc ("Cannot set hours field in time code. " + "New value is out of range."); + + setBitField (_time, 24, 29, binaryToBcd (value)); +} + + +int +TimeCode::minutes () const +{ + return bcdToBinary (bitField (_time, 16, 22)); +} + + +void +TimeCode::setMinutes (int value) +{ + if (value < 0 || value > 59) + throw Iex::ArgExc ("Cannot set minutes field in time code. " + "New value is out of range."); + + setBitField (_time, 16, 22, binaryToBcd (value)); +} + + +int +TimeCode::seconds () const +{ + return bcdToBinary (bitField (_time, 8, 14)); +} + + +void +TimeCode::setSeconds (int value) +{ + if (value < 0 || value > 59) + throw Iex::ArgExc ("Cannot set seconds field in time code. " + "New value is out of range."); + + setBitField (_time, 8, 14, binaryToBcd (value)); +} + + +int +TimeCode::frame () const +{ + return bcdToBinary (bitField (_time, 0, 5)); +} + + +void +TimeCode::setFrame (int value) +{ + if (value < 0 || value > 59) + throw Iex::ArgExc ("Cannot set frame field in time code. " + "New value is out of range."); + + setBitField (_time, 0, 5, binaryToBcd (value)); +} + + +bool +TimeCode::dropFrame () const +{ + return bool (bitField (_time, 6, 6)); +} + + +void +TimeCode::setDropFrame (bool value) +{ + setBitField (_time, 6, 6, (unsigned int) !!value); +} + + +bool +TimeCode::colorFrame () const +{ + return bool (bitField (_time, 7, 7)); +} + + +void +TimeCode::setColorFrame (bool value) +{ + setBitField (_time, 7, 7, (unsigned int) !!value); +} + + +bool +TimeCode::fieldPhase () const +{ + return bool (bitField (_time, 15, 15)); +} + + +void +TimeCode::setFieldPhase (bool value) +{ + setBitField (_time, 15, 15, (unsigned int) !!value); +} + + +bool +TimeCode::bgf0 () const +{ + return bool (bitField (_time, 23, 23)); +} + + +void +TimeCode::setBgf0 (bool value) +{ + setBitField (_time, 23, 23, (unsigned int) !!value); +} + + +bool +TimeCode::bgf1 () const +{ + return bool (bitField (_time, 30, 30)); +} + + +void +TimeCode::setBgf1 (bool value) +{ + setBitField (_time, 30, 30, (unsigned int) !!value); +} + + +bool +TimeCode::bgf2 () const +{ + return bool (bitField (_time, 31, 31)); +} + + +void +TimeCode::setBgf2 (bool value) +{ + setBitField (_time, 31, 31, (unsigned int) !!value); +} + + +int +TimeCode::binaryGroup (int group) const +{ + if (group < 1 || group > 8) + throw Iex::ArgExc ("Cannot extract binary group from time code " + "user data. Group number is out of range."); + + int minBit = 4 * (group - 1); + int maxBit = minBit + 3; + return int (bitField (_user, minBit, maxBit)); +} + + +void +TimeCode::setBinaryGroup (int group, int value) +{ + if (group < 1 || group > 8) + throw Iex::ArgExc ("Cannot extract binary group from time code " + "user data. Group number is out of range."); + + int minBit = 4 * (group - 1); + int maxBit = minBit + 3; + setBitField (_user, minBit, maxBit, (unsigned int) value); +} + + +unsigned int +TimeCode::timeAndFlags (Packing packing) const +{ + if (packing == TV50_PACKING) + { + unsigned int t = _time; + + t &= ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31)); + + t |= ((unsigned int) bgf0() << 15); + t |= ((unsigned int) bgf2() << 23); + t |= ((unsigned int) bgf1() << 30); + t |= ((unsigned int) fieldPhase() << 31); + + return t; + } + if (packing == FILM24_PACKING) + { + return _time & ~((1 << 6) | (1 << 7)); + } + else // packing == TV60_PACKING + { + return _time; + } +} + + +void +TimeCode::setTimeAndFlags (unsigned int value, Packing packing) +{ + if (packing == TV50_PACKING) + { + _time = value & + ~((1 << 6) | (1 << 15) | (1 << 23) | (1 << 30) | (1 << 31)); + + if (value & (1 << 15)) + setBgf0 (true); + + if (value & (1 << 23)) + setBgf2 (true); + + if (value & (1 << 30)) + setBgf1 (true); + + if (value & (1 << 31)) + setFieldPhase (true); + } + else if (packing == FILM24_PACKING) + { + _time = value & ~((1 << 6) | (1 << 7)); + } + else // packing == TV60_PACKING + { + _time = value; + } +} + + +unsigned int +TimeCode::userData () const +{ + return _user; +} + + +void +TimeCode::setUserData (unsigned int value) +{ + _user = value; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTimeCode.h b/3rdparty/openexr/IlmImf/ImfTimeCode.h new file mode 100644 index 000000000..3030d4935 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTimeCode.h @@ -0,0 +1,226 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TIME_CODE_H +#define INCLUDED_IMF_TIME_CODE_H + +//----------------------------------------------------------------------------- +// +// class TimeCode +// +// A TimeCode object stores time and control codes as described +// in SMPTE standard 12M-1999. A TimeCode object contains the +// following fields: +// +// Time Address: +// +// hours integer, range 0 - 23 +// minutes integer, range 0 - 59 +// seconds integer, range 0 - 59 +// frame integer, range 0 - 29 +// +// Flags: +// +// drop frame flag boolean +// color frame flag boolean +// field/phase flag boolean +// bgf0 boolean +// bgf1 boolean +// bgf2 boolean +// +// Binary groups for user-defined data and control codes: +// +// binary group 1 integer, range 0 - 15 +// binary group 2 integer, range 0 - 15 +// ... +// binary group 8 integer, range 0 - 15 +// +// Class TimeCode contains methods to convert between the fields +// listed above and a more compact representation where the fields +// are packed into two unsigned 32-bit integers. In the packed +// integer representations, bit 0 is the least significant bit, +// and bit 31 is the most significant bit of the integer value. +// +// The time address and flags fields can be packed in three +// different ways: +// +// bits packing for packing for packing for +// 24-frame 60-field 50-field +// film television television +// +// 0 - 3 frame units frame units frame units +// 4 - 5 frame tens frame tens frame tens +// 6 unused, set to 0 drop frame flag unused, set to 0 +// 7 unused, set to 0 color frame flag color frame flag +// 8 - 11 seconds units seconds units seconds units +// 12 - 14 seconds tens seconds tens seconds tens +// 15 phase flag field/phase flag bgf0 +// 16 - 19 minutes units minutes units minutes units +// 20 - 22 minutes tens minutes tens minutes tens +// 23 bgf0 bgf0 bgf2 +// 24 - 27 hours units hours units hours units +// 28 - 29 hours tens hours tens hours tens +// 30 bgf1 bgf1 bgf1 +// 31 bgf2 bgf2 field/phase flag +// +// User-defined data and control codes are packed as follows: +// +// bits field +// +// 0 - 3 binary group 1 +// 4 - 7 binary group 2 +// 8 - 11 binary group 3 +// 12 - 15 binary group 4 +// 16 - 19 binary group 5 +// 20 - 23 binary group 6 +// 24 - 27 binary group 7 +// 28 - 31 binary group 8 +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +class TimeCode +{ + public: + + //--------------------- + // Bit packing variants + //--------------------- + + enum Packing + { + TV60_PACKING, // packing for 60-field television + TV50_PACKING, // packing for 50-field television + FILM24_PACKING // packing for 24-frame film + }; + + + //------------------------------------- + // Constructors and assignment operator + //------------------------------------- + + TimeCode (); // all fields set to 0 or false + + TimeCode (int hours, + int minutes, + int seconds, + int frame, + bool dropFrame = false, + bool colorFrame = false, + bool fieldPhase = false, + bool bgf0 = false, + bool bgf1 = false, + bool bgf2 = false, + int binaryGroup1 = 0, + int binaryGroup2 = 0, + int binaryGroup3 = 0, + int binaryGroup4 = 0, + int binaryGroup5 = 0, + int binaryGroup6 = 0, + int binaryGroup7 = 0, + int binaryGroup8 = 0); + + TimeCode (unsigned int timeAndFlags, + unsigned int userData = 0, + Packing packing = TV60_PACKING); + + TimeCode (const TimeCode &other); + + TimeCode & operator = (const TimeCode &other); + + + //---------------------------- + // Access to individual fields + //---------------------------- + + int hours () const; + void setHours (int value); + + int minutes () const; + void setMinutes (int value); + + int seconds () const; + void setSeconds (int value); + + int frame () const; + void setFrame (int value); + + bool dropFrame () const; + void setDropFrame (bool value); + + bool colorFrame () const; + void setColorFrame (bool value); + + bool fieldPhase () const; + void setFieldPhase (bool value); + + bool bgf0 () const; + void setBgf0 (bool value); + + bool bgf1 () const; + void setBgf1 (bool value); + + bool bgf2 () const; + void setBgf2 (bool value); + + int binaryGroup (int group) const; // group must be between 1 and 8 + void setBinaryGroup (int group, int value); + + + //--------------------------------- + // Access to packed representations + //--------------------------------- + + unsigned int timeAndFlags (Packing packing = TV60_PACKING) const; + + void setTimeAndFlags (unsigned int value, + Packing packing = TV60_PACKING); + + unsigned int userData () const; + + void setUserData (unsigned int value); + + private: + + unsigned int _time; + unsigned int _user; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp b/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp new file mode 100644 index 000000000..2c2088bae --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// class TimeCodeAttribute +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + + +template <> +const char * +TimeCodeAttribute::staticTypeName () +{ + return "timecode"; +} + + +template <> +void +TimeCodeAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.timeAndFlags()); + Xdr::write (os, _value.userData()); +} + + +template <> +void +TimeCodeAttribute::readValueFrom (IStream &is, int size, int version) +{ + unsigned int tmp; + + Xdr::read (is, tmp); + _value.setTimeAndFlags (tmp); + + Xdr::read (is, tmp); + _value.setUserData (tmp); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.h b/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.h new file mode 100644 index 000000000..3d548fa10 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_TIME_CODE_ATTRIBUTE_H +#define INCLUDED_IMF_TIME_CODE_ATTRIBUTE_H + + +//----------------------------------------------------------------------------- +// +// class TimeCodeAttribute +// +//----------------------------------------------------------------------------- + +#include +#include + + +namespace Imf { + + +typedef TypedAttribute TimeCodeAttribute; + +template <> +const char *TimeCodeAttribute::staticTypeName (); + +template <> +void TimeCodeAttribute::writeValueTo (OStream &, int) const; + +template <> +void TimeCodeAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfVecAttribute.cpp b/3rdparty/openexr/IlmImf/ImfVecAttribute.cpp new file mode 100644 index 000000000..7527bfdfb --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfVecAttribute.cpp @@ -0,0 +1,216 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class V2iAttribute +// class V2fAttribute +// class V2dAttribute +// class V3iAttribute +// class V3fAttribute +// class V3dAttribute +// +//----------------------------------------------------------------------------- + +#include + + +namespace Imf { + + +template <> +const char * +V2iAttribute::staticTypeName () +{ + return "v2i"; +} + + +template <> +void +V2iAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); +} + + +template <> +void +V2iAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); +} + + +template <> +const char * +V2fAttribute::staticTypeName () +{ + return "v2f"; +} + + +template <> +void +V2fAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); +} + + +template <> +void +V2fAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); +} + + +template <> +const char * +V2dAttribute::staticTypeName () +{ + return "v2d"; +} + + +template <> +void +V2dAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); +} + + +template <> +void +V2dAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); +} + + +template <> +const char * +V3iAttribute::staticTypeName () +{ + return "v3i"; +} + + +template <> +void +V3iAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); + Xdr::write (os, _value.z); +} + + +template <> +void +V3iAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); + Xdr::read (is, _value.z); +} + + +template <> +const char * +V3fAttribute::staticTypeName () +{ + return "v3f"; +} + + +template <> +void +V3fAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); + Xdr::write (os, _value.z); +} + + +template <> +void +V3fAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); + Xdr::read (is, _value.z); +} + + +template <> +const char * +V3dAttribute::staticTypeName () +{ + return "v3d"; +} + + +template <> +void +V3dAttribute::writeValueTo (OStream &os, int version) const +{ + Xdr::write (os, _value.x); + Xdr::write (os, _value.y); + Xdr::write (os, _value.z); +} + + +template <> +void +V3dAttribute::readValueFrom (IStream &is, int size, int version) +{ + Xdr::read (is, _value.x); + Xdr::read (is, _value.y); + Xdr::read (is, _value.z); +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfVecAttribute.h b/3rdparty/openexr/IlmImf/ImfVecAttribute.h new file mode 100644 index 000000000..b0b79ba2f --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfVecAttribute.h @@ -0,0 +1,101 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_VEC_ATTRIBUTE_H +#define INCLUDED_IMF_VEC_ATTRIBUTE_H + +//----------------------------------------------------------------------------- +// +// class V2iAttribute +// class V2fAttribute +// class V2dAttribute +// class V3iAttribute +// class V3fAttribute +// class V3dAttribute +// +//----------------------------------------------------------------------------- + +#include +#include "ImathVec.h" + + +namespace Imf { + + +typedef TypedAttribute V2iAttribute; +template <> const char *V2iAttribute::staticTypeName (); +template <> void V2iAttribute::writeValueTo (OStream &, int) const; +template <> void V2iAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute V2fAttribute; +template <> const char *V2fAttribute::staticTypeName (); +template <> void V2fAttribute::writeValueTo (OStream &, int) const; +template <> void V2fAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute V2dAttribute; +template <> const char *V2dAttribute::staticTypeName (); +template <> void V2dAttribute::writeValueTo (OStream &, int) const; +template <> void V2dAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute V3iAttribute; +template <> const char *V3iAttribute::staticTypeName (); +template <> void V3iAttribute::writeValueTo (OStream &, int) const; +template <> void V3iAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute V3fAttribute; +template <> const char *V3fAttribute::staticTypeName (); +template <> void V3fAttribute::writeValueTo (OStream &, int) const; +template <> void V3fAttribute::readValueFrom (IStream &, int, int); + + +typedef TypedAttribute V3dAttribute; +template <> const char *V3dAttribute::staticTypeName (); +template <> void V3dAttribute::writeValueTo (OStream &, int) const; +template <> void V3dAttribute::readValueFrom (IStream &, int, int); + + +} // namespace Imf + +// Metrowerks compiler wants the .cpp file inlined, too +#ifdef __MWERKS__ +#include +#endif + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfVersion.cpp b/3rdparty/openexr/IlmImf/ImfVersion.cpp new file mode 100644 index 000000000..3814479a5 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfVersion.cpp @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//----------------------------------------------------------------------------- +// +// Magic and version number. +// +//----------------------------------------------------------------------------- + + +#include + +namespace Imf { + + +bool +isImfMagic (const char bytes[4]) +{ + return bytes[0] == ((MAGIC >> 0) & 0x00ff) && + bytes[1] == ((MAGIC >> 8) & 0x00ff) && + bytes[2] == ((MAGIC >> 16) & 0x00ff) && + bytes[3] == ((MAGIC >> 24) & 0x00ff); +} + + +} // namespace Imf + diff --git a/3rdparty/openexr/IlmImf/ImfVersion.h b/3rdparty/openexr/IlmImf/ImfVersion.h new file mode 100644 index 000000000..34fb93b8d --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfVersion.h @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_VERSION_H +#define INCLUDED_IMF_VERSION_H + +//----------------------------------------------------------------------------- +// +// Magic and version number. +// +//----------------------------------------------------------------------------- + + +namespace Imf { + + +// +// The MAGIC number is stored in the first four bytes of every +// OpenEXR image file. This can be used to quickly test whether +// a given file is an OpenEXR image file (see isImfMagic(), below). +// + +const int MAGIC = 20000630; + + +// +// The second item in each OpenEXR image file, right after the +// magic number, is a four-byte file version identifier. Depending +// on a file's version identifier, a file reader can enable various +// backwards-compatibility switches, or it can quickly reject files +// that it cannot read. +// +// The version identifier is split into an 8-bit version number, +// and a 24-bit flags field. +// + +const int VERSION_NUMBER_FIELD = 0x000000ff; +const int VERSION_FLAGS_FIELD = 0xffffff00; + + +// +// Value that goes into VERSION_NUMBER_FIELD. +// + +const int EXR_VERSION = 2; + + +// +// Flags that can go into VERSION_FLAGS_FIELD. +// Flags can only occupy the 1 bits in VERSION_FLAGS_FIELD. +// + +const int TILED_FLAG = 0x00000200; // File is tiled + +const int LONG_NAMES_FLAG = 0x00000400; // File contains long + // attribute or channel + // names + +// +// Bitwise OR of all known flags. +// + +const int ALL_FLAGS = TILED_FLAG | LONG_NAMES_FLAG; + + +// +// Utility functions +// + +inline bool isTiled (int version) {return !!(version & TILED_FLAG);} +inline int makeTiled (int version) {return version | TILED_FLAG;} +inline int makeNotTiled (int version) {return version & ~TILED_FLAG;} +inline int getVersion (int version) {return version & VERSION_NUMBER_FIELD;} +inline int getFlags (int version) {return version & VERSION_FLAGS_FIELD;} +inline bool supportsFlags (int flags) {return !(flags & ~ALL_FLAGS);} + + +// +// Given the first four bytes of a file, returns true if the +// file is probably an OpenEXR image file, false if not. +// + +bool isImfMagic (const char bytes[4]); + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfWav.cpp b/3rdparty/openexr/IlmImf/ImfWav.cpp new file mode 100644 index 000000000..d4486d5ad --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfWav.cpp @@ -0,0 +1,390 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// 16-bit Haar Wavelet encoding and decoding +// +// The source code in this file is derived from the encoding +// and decoding routines written by Christian Rouet for his +// PIZ image file format. +// +//----------------------------------------------------------------------------- + + +#include + +namespace Imf { +namespace { + + +// +// Wavelet basis functions without modulo arithmetic; they produce +// the best compression ratios when the wavelet-transformed data are +// Huffman-encoded, but the wavelet transform works only for 14-bit +// data (untransformed data values must be less than (1 << 14)). +// + +inline void +wenc14 (unsigned short a, unsigned short b, + unsigned short &l, unsigned short &h) +{ + short as = a; + short bs = b; + + short ms = (as + bs) >> 1; + short ds = as - bs; + + l = ms; + h = ds; +} + + +inline void +wdec14 (unsigned short l, unsigned short h, + unsigned short &a, unsigned short &b) +{ + short ls = l; + short hs = h; + + int hi = hs; + int ai = ls + (hi & 1) + (hi >> 1); + + short as = ai; + short bs = ai - hi; + + a = as; + b = bs; +} + + +// +// Wavelet basis functions with modulo arithmetic; they work with full +// 16-bit data, but Huffman-encoding the wavelet-transformed data doesn't +// compress the data quite as well. +// + +const int NBITS = 16; +const int A_OFFSET = 1 << (NBITS - 1); +const int M_OFFSET = 1 << (NBITS - 1); +const int MOD_MASK = (1 << NBITS) - 1; + + +inline void +wenc16 (unsigned short a, unsigned short b, + unsigned short &l, unsigned short &h) +{ + int ao = (a + A_OFFSET) & MOD_MASK; + int m = ((ao + b) >> 1); + int d = ao - b; + + if (d < 0) + m = (m + M_OFFSET) & MOD_MASK; + + d &= MOD_MASK; + + l = m; + h = d; +} + + +inline void +wdec16 (unsigned short l, unsigned short h, + unsigned short &a, unsigned short &b) +{ + int m = l; + int d = h; + int bb = (m - (d >> 1)) & MOD_MASK; + int aa = (d + bb - A_OFFSET) & MOD_MASK; + b = bb; + a = aa; +} + +} // namespace + + +// +// 2D Wavelet encoding: +// + +void +wav2Encode + (unsigned short* in, // io: values are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx) // i : maximum in[x][y] value +{ + bool w14 = (mx < (1 << 14)); + int n = (nx > ny)? ny: nx; + int p = 1; // == 1 << level + int p2 = 2; // == 1 << (level+1) + + // + // Hierachical loop on smaller dimension n + // + + while (p2 <= n) + { + unsigned short *py = in; + unsigned short *ey = in + oy * (ny - p2); + int oy1 = oy * p; + int oy2 = oy * p2; + int ox1 = ox * p; + int ox2 = ox * p2; + unsigned short i00,i01,i10,i11; + + // + // Y loop + // + + for (; py <= ey; py += oy2) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + // + // X loop + // + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + unsigned short *p10 = px + oy1; + unsigned short *p11 = p10 + ox1; + + // + // 2D wavelet encoding + // + + if (w14) + { + wenc14 (*px, *p01, i00, i01); + wenc14 (*p10, *p11, i10, i11); + wenc14 (i00, i10, *px, *p10); + wenc14 (i01, i11, *p01, *p11); + } + else + { + wenc16 (*px, *p01, i00, i01); + wenc16 (*p10, *p11, i10, i11); + wenc16 (i00, i10, *px, *p10); + wenc16 (i01, i11, *p01, *p11); + } + } + + // + // Encode (1D) odd column (still in Y loop) + // + + if (nx & p) + { + unsigned short *p10 = px + oy1; + + if (w14) + wenc14 (*px, *p10, i00, *p10); + else + wenc16 (*px, *p10, i00, *p10); + + *px= i00; + } + } + + // + // Encode (1D) odd line (must loop in X) + // + + if (ny & p) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + + if (w14) + wenc14 (*px, *p01, i00, *p01); + else + wenc16 (*px, *p01, i00, *p01); + + *px= i00; + } + } + + // + // Next level + // + + p = p2; + p2 <<= 1; + } +} + + +// +// 2D Wavelet decoding: +// + +void +wav2Decode + (unsigned short* in, // io: values are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx) // i : maximum in[x][y] value +{ + bool w14 = (mx < (1 << 14)); + int n = (nx > ny)? ny: nx; + int p = 1; + int p2; + + // + // Search max level + // + + while (p <= n) + p <<= 1; + + p >>= 1; + p2 = p; + p >>= 1; + + // + // Hierarchical loop on smaller dimension n + // + + while (p >= 1) + { + unsigned short *py = in; + unsigned short *ey = in + oy * (ny - p2); + int oy1 = oy * p; + int oy2 = oy * p2; + int ox1 = ox * p; + int ox2 = ox * p2; + unsigned short i00,i01,i10,i11; + + // + // Y loop + // + + for (; py <= ey; py += oy2) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + // + // X loop + // + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + unsigned short *p10 = px + oy1; + unsigned short *p11 = p10 + ox1; + + // + // 2D wavelet decoding + // + + if (w14) + { + wdec14 (*px, *p10, i00, i10); + wdec14 (*p01, *p11, i01, i11); + wdec14 (i00, i01, *px, *p01); + wdec14 (i10, i11, *p10, *p11); + } + else + { + wdec16 (*px, *p10, i00, i10); + wdec16 (*p01, *p11, i01, i11); + wdec16 (i00, i01, *px, *p01); + wdec16 (i10, i11, *p10, *p11); + } + } + + // + // Decode (1D) odd column (still in Y loop) + // + + if (nx & p) + { + unsigned short *p10 = px + oy1; + + if (w14) + wdec14 (*px, *p10, i00, *p10); + else + wdec16 (*px, *p10, i00, *p10); + + *px= i00; + } + } + + // + // Decode (1D) odd line (must loop in X) + // + + if (ny & p) + { + unsigned short *px = py; + unsigned short *ex = py + ox * (nx - p2); + + for (; px <= ex; px += ox2) + { + unsigned short *p01 = px + ox1; + + if (w14) + wdec14 (*px, *p01, i00, *p01); + else + wdec16 (*px, *p01, i00, *p01); + + *px= i00; + } + } + + // + // Next level + // + + p2 = p; + p >>= 1; + } +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfWav.h b/3rdparty/openexr/IlmImf/ImfWav.h new file mode 100644 index 000000000..815d2d57c --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfWav.h @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_WAV_H +#define INCLUDED_IMF_WAV_H + +//----------------------------------------------------------------------------- +// +// 16-bit Haar Wavelet encoding and decoding +// +//----------------------------------------------------------------------------- + +namespace Imf { + + +void +wav2Encode + (unsigned short *in, // io: values in[y][x] are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx); // i : maximum in[x][y] value + +void +wav2Decode + (unsigned short *in, // io: values in[y][x] are transformed in place + int nx, // i : x size + int ox, // i : x offset + int ny, // i : y size + int oy, // i : y offset + unsigned short mx); // i : maximum in[x][y] value + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfXdr.h b/3rdparty/openexr/IlmImf/ImfXdr.h new file mode 100644 index 000000000..7992921bb --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfXdr.h @@ -0,0 +1,916 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_XDR_H +#define INCLUDED_IMF_XDR_H + +//---------------------------------------------------------------------------- +// +// Xdr -- routines to convert data between the machine's native +// format and a machine-independent external data representation: +// +// write (T &o, S v); converts a value, v, of type S +// into a machine-independent +// representation and stores the +// result in an output buffer, o. +// +// read (T &i, S &v); reads the machine-independent +// representation of a value of type +// S from input buffer i, converts +// the value into the machine's native +// representation, and stores the result +// in v. +// +// size(); returns the size, in bytes, of the +// machine-independent representation +// of an object of type S. +// +// The write() and read() routines are templates; data can be written +// to and read from any output or input buffer type T for which a helper +// class, R, exits. Class R must define a method to store a char array +// in a T, and a method to read a char array from a T: +// +// struct R +// { +// static void +// writeChars (T &o, const char c[/*n*/], int n) +// { +// ... // Write c[0], c[1] ... c[n-1] to output buffer o. +// } +// +// static void +// readChars (T &i, char c[/*n*/], int n) +// { +// ... // Read n characters from input buffer i +// // and copy them to c[0], c[1] ... c[n-1]. +// } +// }; +// +// Example - writing to and reading from iostreams: +// +// struct CharStreamIO +// { +// static void +// writeChars (ostream &os, const char c[], int n) +// { +// os.write (c, n); +// } +// +// static void +// readChars (istream &is, char c[], int n) +// { +// is.read (c, n); +// } +// }; +// +// ... +// +// Xdr::write (os, 3); +// Xdr::write (os, 5.0); +// +//---------------------------------------------------------------------------- + +#include +#include "IexMathExc.h" +#include "half.h" +#include + +namespace Imf { +namespace Xdr { + + +//------------------------------- +// Write data to an output stream +//------------------------------- + +template +void +write (T &out, bool v); + +template +void +write (T &out, char v); + +template +void +write (T &out, signed char v); + +template +void +write (T &out, unsigned char v); + +template +void +write (T &out, signed short v); + +template +void +write (T &out, unsigned short v); + +template +void +write (T &out, signed int v); + +template +void +write (T &out, unsigned int v); + +template +void +write (T &out, signed long v); + +template +void +write (T &out, unsigned long v); + +#if ULONG_MAX != 18446744073709551615LU + + template + void + write (T &out, Int64 v); + +#endif + +template +void +write (T &out, float v); + +template +void +write (T &out, double v); + +template +void +write (T &out, half v); + +template +void +write (T &out, const char v[/*n*/], int n); // fixed-size char array + +template +void +write (T &out, const char v[]); // zero-terminated string + + +//----------------------------------------- +// Append padding bytes to an output stream +//----------------------------------------- + +template +void +pad (T &out, int n); // write n padding bytes + + + +//------------------------------- +// Read data from an input stream +//------------------------------- + +template +void +read (T &in, bool &v); + +template +void +read (T &in, char &v); + +template +void +read (T &in, signed char &v); + +template +void +read (T &in, unsigned char &v); + +template +void +read (T &in, signed short &v); + +template +void +read (T &in, unsigned short &v); + +template +void +read (T &in, signed int &v); + +template +void +read (T &in, unsigned int &v); + +template +void +read (T &in, signed long &v); + +template +void +read (T &in, unsigned long &v); + +#if ULONG_MAX != 18446744073709551615LU + + template + void + read (T &in, Int64 &v); + +#endif + +template +void +read (T &in, float &v); + +template +void +read (T &in, double &v); + +template +void +read (T &in, half &v); + +template +void +read (T &in, char v[/*n*/], int n); // fixed-size char array + +template +void +read (T &in, int n, char v[/*n*/]); // zero-terminated string + + +//------------------------------------------- +// Skip over padding bytes in an input stream +//------------------------------------------- + +template +void +skip (T &in, int n); // skip n padding bytes + + + +//-------------------------------------- +// Size of the machine-independent +// representation of an object of type S +//-------------------------------------- + +template +int +size (); + + +//--------------- +// Implementation +//--------------- + +template +inline void +writeSignedChars (T &out, const signed char c[], int n) +{ + S::writeChars (out, (const char *) c, n); +} + + +template +inline void +writeUnsignedChars (T &out, const unsigned char c[], int n) +{ + S::writeChars (out, (const char *) c, n); +} + + +template +inline void +readSignedChars (T &in, signed char c[], int n) +{ + S::readChars (in, (char *) c, n); +} + + +template +inline void +readUnsignedChars (T &in, unsigned char c[], int n) +{ + S::readChars (in, (char *) c, n); +} + + +template +inline void +write (T &out, bool v) +{ + char c = !!v; + S::writeChars (out, &c, 1); +} + + +template +inline void +write (T &out, char v) +{ + S::writeChars (out, &v, 1); +} + + +template +inline void +write (T &out, signed char v) +{ + writeSignedChars (out, &v, 1); +} + + +template +inline void +write (T &out, unsigned char v) +{ + writeUnsignedChars (out, &v, 1); +} + + +template +void +write (T &out, signed short v) +{ + signed char b[2]; + + b[0] = (signed char) (v); + b[1] = (signed char) (v >> 8); + + writeSignedChars (out, b, 2); +} + + +template +void +write (T &out, unsigned short v) +{ + unsigned char b[2]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + + writeUnsignedChars (out, b, 2); +} + + +template +void +write (T &out, signed int v) +{ + signed char b[4]; + + b[0] = (signed char) (v); + b[1] = (signed char) (v >> 8); + b[2] = (signed char) (v >> 16); + b[3] = (signed char) (v >> 24); + + writeSignedChars (out, b, 4); +} + + +template +void +write (T &out, unsigned int v) +{ + unsigned char b[4]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + b[2] = (unsigned char) (v >> 16); + b[3] = (unsigned char) (v >> 24); + + writeUnsignedChars (out, b, 4); +} + + +template +void +write (T &out, signed long v) +{ + signed char b[8]; + + b[0] = (signed char) (v); + b[1] = (signed char) (v >> 8); + b[2] = (signed char) (v >> 16); + b[3] = (signed char) (v >> 24); + + #if LONG_MAX == 2147483647 + + if (v >= 0) + { + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + } + else + { + b[4] = ~0; + b[5] = ~0; + b[6] = ~0; + b[7] = ~0; + } + + #elif LONG_MAX == 9223372036854775807L + + b[4] = (signed char) (v >> 32); + b[5] = (signed char) (v >> 40); + b[6] = (signed char) (v >> 48); + b[7] = (signed char) (v >> 56); + + #else + + #error write (T &out, signed long v) not implemented + + #endif + + writeSignedChars (out, b, 8); +} + + +template +void +write (T &out, unsigned long v) +{ + unsigned char b[8]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + b[2] = (unsigned char) (v >> 16); + b[3] = (unsigned char) (v >> 24); + + #if ULONG_MAX == 4294967295U + + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + + #elif ULONG_MAX == 18446744073709551615LU + + b[4] = (unsigned char) (v >> 32); + b[5] = (unsigned char) (v >> 40); + b[6] = (unsigned char) (v >> 48); + b[7] = (unsigned char) (v >> 56); + + #else + + #error write (T &out, unsigned long v) not implemented + + #endif + + writeUnsignedChars (out, b, 8); +} + + +#if ULONG_MAX != 18446744073709551615LU + + template + void + write (T &out, Int64 v) + { + unsigned char b[8]; + + b[0] = (unsigned char) (v); + b[1] = (unsigned char) (v >> 8); + b[2] = (unsigned char) (v >> 16); + b[3] = (unsigned char) (v >> 24); + b[4] = (unsigned char) (v >> 32); + b[5] = (unsigned char) (v >> 40); + b[6] = (unsigned char) (v >> 48); + b[7] = (unsigned char) (v >> 56); + + writeUnsignedChars (out, b, 8); + } + +#endif + + +template +void +write (T &out, float v) +{ + union {unsigned int i; float f;} u; + u.f = v; + + unsigned char b[4]; + + b[0] = (unsigned char) (u.i); + b[1] = (unsigned char) (u.i >> 8); + b[2] = (unsigned char) (u.i >> 16); + b[3] = (unsigned char) (u.i >> 24); + + writeUnsignedChars (out, b, 4); +} + + +template +void +write (T &out, double v) +{ + union {Int64 i; double d;} u; + u.d = v; + + unsigned char b[8]; + + b[0] = (unsigned char) (u.i); + b[1] = (unsigned char) (u.i >> 8); + b[2] = (unsigned char) (u.i >> 16); + b[3] = (unsigned char) (u.i >> 24); + b[4] = (unsigned char) (u.i >> 32); + b[5] = (unsigned char) (u.i >> 40); + b[6] = (unsigned char) (u.i >> 48); + b[7] = (unsigned char) (u.i >> 56); + + writeUnsignedChars (out, b, 8); +} + + +template +inline void +write (T &out, half v) +{ + unsigned char b[2]; + + b[0] = (unsigned char) (v.bits()); + b[1] = (unsigned char) (v.bits() >> 8); + + writeUnsignedChars (out, b, 2); +} + + +template +inline void +write (T &out, const char v[], int n) // fixed-size char array +{ + S::writeChars (out, v, n); +} + + +template +void +write (T &out, const char v[]) // zero-terminated string +{ + while (*v) + { + S::writeChars (out, v, 1); + ++v; + } + + S::writeChars (out, v, 1); +} + + +template +void +pad (T &out, int n) // add n padding bytes +{ + for (int i = 0; i < n; i++) + { + const char c = 0; + S::writeChars (out, &c, 1); + } +} + + +template +inline void +read (T &in, bool &v) +{ + char c; + + S::readChars (in, &c, 1); + v = !!c; +} + + +template +inline void +read (T &in, char &v) +{ + S::readChars (in, &v, 1); +} + + +template +inline void +read (T &in, signed char &v) +{ + readSignedChars (in, &v, 1); +} + + +template +inline void +read (T &in, unsigned char &v) +{ + readUnsignedChars (in, &v, 1); +} + + +template +void +read (T &in, signed short &v) +{ + signed char b[2]; + + readSignedChars (in, b, 2); + + v = (b[0] & 0x00ff) | + (b[1] << 8); +} + + +template +void +read (T &in, unsigned short &v) +{ + unsigned char b[2]; + + readUnsignedChars (in, b, 2); + + v = (b[0] & 0x00ff) | + (b[1] << 8); +} + + +template +void +read (T &in, signed int &v) +{ + signed char b[4]; + + readSignedChars (in, b, 4); + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); +} + + +template +void +read (T &in, unsigned int &v) +{ + unsigned char b[4]; + + readUnsignedChars (in, b, 4); + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); +} + + +template +void +read (T &in, signed long &v) +{ + signed char b[8]; + + readSignedChars (in, b, 8); + + #if LONG_MAX == 2147483647 + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); + + if (( b[4] || b[5] || b[6] || b[7]) && + (~b[4] || ~b[5] || ~b[6] || ~b[7])) + { + throw Iex::OverflowExc ("Long int overflow - read a large " + "64-bit integer in a 32-bit process."); + } + + #elif LONG_MAX == 9223372036854775807L + + v = ((long) b[0] & 0x00000000000000ff) | + (((long) b[1] << 8) & 0x000000000000ff00) | + (((long) b[2] << 16) & 0x0000000000ff0000) | + (((long) b[3] << 24) & 0x00000000ff000000) | + (((long) b[4] << 32) & 0x000000ff00000000) | + (((long) b[5] << 40) & 0x0000ff0000000000) | + (((long) b[6] << 48) & 0x00ff000000000000) | + ((long) b[7] << 56); + + #else + + #error read (T &in, signed long &v) not implemented + + #endif +} + + +template +void +read (T &in, unsigned long &v) +{ + unsigned char b[8]; + + readUnsignedChars (in, b, 8); + + #if ULONG_MAX == 4294967295U + + v = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); + + if (b[4] || b[5] || b[6] || b[7]) + { + throw Iex::OverflowExc ("Long int overflow - read a large " + "64-bit integer in a 32-bit process."); + } + + #elif ULONG_MAX == 18446744073709551615LU + + v = ((unsigned long) b[0] & 0x00000000000000ff) | + (((unsigned long) b[1] << 8) & 0x000000000000ff00) | + (((unsigned long) b[2] << 16) & 0x0000000000ff0000) | + (((unsigned long) b[3] << 24) & 0x00000000ff000000) | + (((unsigned long) b[4] << 32) & 0x000000ff00000000) | + (((unsigned long) b[5] << 40) & 0x0000ff0000000000) | + (((unsigned long) b[6] << 48) & 0x00ff000000000000) | + ((unsigned long) b[7] << 56); + + #else + + #error read (T &in, unsigned long &v) not implemented + + #endif +} + + +#if ULONG_MAX != 18446744073709551615LU + + template + void + read (T &in, Int64 &v) + { + unsigned char b[8]; + + readUnsignedChars (in, b, 8); + + v = ((Int64) b[0] & 0x00000000000000ffLL) | + (((Int64) b[1] << 8) & 0x000000000000ff00LL) | + (((Int64) b[2] << 16) & 0x0000000000ff0000LL) | + (((Int64) b[3] << 24) & 0x00000000ff000000LL) | + (((Int64) b[4] << 32) & 0x000000ff00000000LL) | + (((Int64) b[5] << 40) & 0x0000ff0000000000LL) | + (((Int64) b[6] << 48) & 0x00ff000000000000LL) | + ((Int64) b[7] << 56); + } + +#endif + + +template +void +read (T &in, float &v) +{ + unsigned char b[4]; + + readUnsignedChars (in, b, 4); + + union {unsigned int i; float f;} u; + + u.i = (b[0] & 0x000000ff) | + ((b[1] << 8) & 0x0000ff00) | + ((b[2] << 16) & 0x00ff0000) | + (b[3] << 24); + + v = u.f; +} + + +template +void +read (T &in, double &v) +{ + unsigned char b[8]; + + readUnsignedChars (in, b, 8); + + union {Int64 i; double d;} u; + + u.i = ((Int64) b[0] & 0x00000000000000ffULL) | + (((Int64) b[1] << 8) & 0x000000000000ff00ULL) | + (((Int64) b[2] << 16) & 0x0000000000ff0000ULL) | + (((Int64) b[3] << 24) & 0x00000000ff000000ULL) | + (((Int64) b[4] << 32) & 0x000000ff00000000ULL) | + (((Int64) b[5] << 40) & 0x0000ff0000000000ULL) | + (((Int64) b[6] << 48) & 0x00ff000000000000ULL) | + ((Int64) b[7] << 56); + + v = u.d; +} + + +template +inline void +read (T &in, half &v) +{ + unsigned char b[2]; + + readUnsignedChars (in, b, 2); + + v.setBits ((b[0] & 0x00ff) | (b[1] << 8)); +} + + +template +inline void +read (T &in, char v[], int n) // fixed-size char array +{ + S::readChars (in, v, n); +} + + +template +void +read (T &in, int n, char v[]) // zero-terminated string +{ + while (n >= 0) + { + S::readChars (in, v, 1); + + if (*v == 0) + break; + + --n; + ++v; + } +} + + +template +void +skip (T &in, int n) // skip n padding bytes +{ + char c[1024]; + + while (n >= (int) sizeof (c)) + { + if (!S::readChars (in, c, sizeof (c))) + return; + + n -= sizeof (c); + } + + if (n >= 1) + S::readChars (in, c, n); +} + + +template <> inline int size () {return 1;} +template <> inline int size () {return 1;} +template <> inline int size () {return 1;} +template <> inline int size () {return 1;} +template <> inline int size () {return 2;} +template <> inline int size () {return 2;} +template <> inline int size () {return 4;} +template <> inline int size () {return 4;} +template <> inline int size () {return 8;} +template <> inline int size () {return 8;} +template <> inline int size () {return 4;} +template <> inline int size () {return 8;} +template <> inline int size () {return 2;} + + +} // namespace Xdr +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp b/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp new file mode 100644 index 000000000..80cefa1e0 --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp @@ -0,0 +1,240 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//----------------------------------------------------------------------------- +// +// class ZipCompressor +// +//----------------------------------------------------------------------------- +#define ZLIB_WINAPI + +#include +#include +#include "Iex.h" +#include + +namespace Imf { + + +ZipCompressor::ZipCompressor + (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines) +: + Compressor (hdr), + _maxScanLineSize (maxScanLineSize), + _numScanLines (numScanLines), + _tmpBuffer (0), + _outBuffer (0) +{ + size_t maxInBytes = + uiMult (maxScanLineSize, numScanLines); + + size_t maxOutBytes = + uiAdd (uiAdd (maxInBytes, + size_t (ceil (maxInBytes * 0.01))), + size_t (100)); + + _tmpBuffer = + new char [maxInBytes]; + + _outBuffer = + new char [maxOutBytes]; +} + + +ZipCompressor::~ZipCompressor () +{ + delete [] _tmpBuffer; + delete [] _outBuffer; +} + + +int +ZipCompressor::numScanLines () const +{ + return _numScanLines; +} + + +int +ZipCompressor::compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case ­- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Reorder the pixel data. + // + + { + char *t1 = _tmpBuffer; + char *t2 = _tmpBuffer + (inSize + 1) / 2; + const char *stop = inPtr + inSize; + + while (true) + { + if (inPtr < stop) + *(t1++) = *(inPtr++); + else + break; + + if (inPtr < stop) + *(t2++) = *(inPtr++); + else + break; + } + } + + // + // Predictor. + // + + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + inSize; + int p = t[-1]; + + while (t < stop) + { + int d = int (t[0]) - p + (128 + 256); + p = t[0]; + t[0] = d; + ++t; + } + } + + // + // Compress the data using zlib + // + + uLongf outSize = int(ceil(inSize * 1.01)) + 100; + + if (Z_OK != ::compress ((Bytef *)_outBuffer, &outSize, + (const Bytef *) _tmpBuffer, inSize)) + { + throw Iex::BaseExc ("Data compression (zlib) failed."); + } + + outPtr = _outBuffer; + return outSize; +} + + +int +ZipCompressor::uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr) +{ + // + // Special case ­- empty input buffer + // + + if (inSize == 0) + { + outPtr = _outBuffer; + return 0; + } + + // + // Decompress the data using zlib + // + + uLongf outSize = _maxScanLineSize * _numScanLines; + + if (Z_OK != ::uncompress ((Bytef *)_tmpBuffer, &outSize, + (const Bytef *) inPtr, inSize)) + { + throw Iex::InputExc ("Data decompression (zlib) failed."); + } + + // + // Predictor. + // + + { + unsigned char *t = (unsigned char *) _tmpBuffer + 1; + unsigned char *stop = (unsigned char *) _tmpBuffer + outSize; + + while (t < stop) + { + int d = int (t[-1]) + int (t[0]) - 128; + t[0] = d; + ++t; + } + } + + // + // Reorder the pixel data. + // + + { + const char *t1 = _tmpBuffer; + const char *t2 = _tmpBuffer + (outSize + 1) / 2; + char *s = _outBuffer; + char *stop = s + outSize; + + while (true) + { + if (s < stop) + *(s++) = *(t1++); + else + break; + + if (s < stop) + *(s++) = *(t2++); + else + break; + } + } + + outPtr = _outBuffer; + return outSize; +} + + +} // namespace Imf diff --git a/3rdparty/openexr/IlmImf/ImfZipCompressor.h b/3rdparty/openexr/IlmImf/ImfZipCompressor.h new file mode 100644 index 000000000..a5153488b --- /dev/null +++ b/3rdparty/openexr/IlmImf/ImfZipCompressor.h @@ -0,0 +1,83 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMF_ZIP_COMPRESSOR_H +#define INCLUDED_IMF_ZIP_COMPRESSOR_H + +//----------------------------------------------------------------------------- +// +// class ZipCompressor -- performs zlib-style compression +// +//----------------------------------------------------------------------------- + +#include + +namespace Imf { + + +class ZipCompressor: public Compressor +{ + public: + + ZipCompressor (const Header &hdr, + size_t maxScanLineSize, + size_t numScanLines); + + virtual ~ZipCompressor (); + + virtual int numScanLines () const; + + virtual int compress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + + virtual int uncompress (const char *inPtr, + int inSize, + int minY, + const char *&outPtr); + private: + + int _maxScanLineSize; + int _numScanLines; + char * _tmpBuffer; + char * _outBuffer; +}; + + +} // namespace Imf + +#endif diff --git a/3rdparty/openexr/IlmImf/b44ExpLogTable.cpp b/3rdparty/openexr/IlmImf/b44ExpLogTable.cpp new file mode 100644 index 000000000..24e35fbbf --- /dev/null +++ b/3rdparty/openexr/IlmImf/b44ExpLogTable.cpp @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//--------------------------------------------------------------------------- +// +// b44ExpLogTable +// +// A program to generate lookup tables for +// +// y = exp (x / 8) +// +// and +// x = 8 * log (x); +// +// where x and y are 16-bit floating-point numbers +// +// The tables are used by class B44Compressor. +// +//--------------------------------------------------------------------------- + +#include +#include +#include +#include + +using namespace std; + +//--------------------------------------------- +// Main - prints the half-to-float lookup table +//--------------------------------------------- + +int +main () +{ +#ifndef HAVE_IOS_BASE + cout.setf (ios::hex, ios::basefield); +#else + cout.setf (ios_base::hex, ios_base::basefield); +#endif + + cout << "//\n" + "// This is an automatically generated file.\n" + "// Do not edit.\n" + "//\n\n"; + + const int iMax = (1 << 16); + + cout << "const unsigned short expTable[] =\n" + "{\n" + " "; + + for (int i = 0; i < iMax; i++) + { + half h; + h.setBits (i); + + if (!h.isFinite()) + h = 0; + else if (h >= 8 * log (HALF_MAX)) + h = HALF_MAX; + else + h = exp (h / 8); + + cout << "0x" << setfill ('0') << setw (4) << h.bits() << ", "; + + if (i % 8 == 7) + { + cout << "\n"; + + if (i < iMax - 1) + cout << " "; + } + } + + cout << "};\n\n"; + + cout << "const unsigned short logTable[] =\n" + "{\n" + " "; + + for (int i = 0; i < iMax; i++) + { + half h; + h.setBits (i); + + if (!h.isFinite() || h < 0) + h = 0; + else + h = 8 * log (h); + + cout << "0x" << setfill ('0') << setw (4) << h.bits() << ", "; + + if (i % 8 == 7) + { + cout << "\n"; + + if (i < iMax - 1) + cout << " "; + } + } + + cout << "};\n"; + + return 0; +} diff --git a/3rdparty/openexr/IlmImf/b44ExpLogTable.h b/3rdparty/openexr/IlmImf/b44ExpLogTable.h new file mode 100644 index 000000000..c13d16cc9 --- /dev/null +++ b/3rdparty/openexr/IlmImf/b44ExpLogTable.h @@ -0,0 +1,16396 @@ +// +// This is an automatically generated file. +// Do not edit. +// + +const unsigned short expTable[] = +{ + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, + 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c01, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, + 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c02, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, + 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c03, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, + 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c04, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, + 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c05, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, 0x3c06, + 0x3c06, 0x3c06, 0x3c06, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, 0x3c07, + 0x3c07, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c08, + 0x3c08, 0x3c08, 0x3c08, 0x3c08, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, 0x3c09, + 0x3c09, 0x3c09, 0x3c09, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, 0x3c0a, + 0x3c0a, 0x3c0a, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, 0x3c0b, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, + 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0c, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, + 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0d, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0e, + 0x3c0e, 0x3c0e, 0x3c0e, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, 0x3c0f, + 0x3c0f, 0x3c0f, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, 0x3c10, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, + 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c11, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, + 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c12, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, + 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c13, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c14, + 0x3c14, 0x3c14, 0x3c14, 0x3c14, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, 0x3c15, + 0x3c15, 0x3c15, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, 0x3c16, + 0x3c16, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, + 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c17, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, + 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c18, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, + 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c19, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1a, + 0x3c1a, 0x3c1a, 0x3c1a, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, 0x3c1b, + 0x3c1b, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, 0x3c1c, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, + 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1d, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, + 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1e, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, 0x3c1f, + 0x3c1f, 0x3c1f, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, 0x3c20, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, + 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c21, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, + 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c22, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, + 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c23, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c24, + 0x3c24, 0x3c24, 0x3c24, 0x3c24, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, 0x3c25, + 0x3c25, 0x3c25, 0x3c25, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, 0x3c26, + 0x3c26, 0x3c26, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, 0x3c27, + 0x3c27, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, 0x3c28, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, + 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c29, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, + 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2a, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, + 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2b, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, 0x3c2c, + 0x3c2c, 0x3c2c, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, 0x3c2d, + 0x3c2d, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, 0x3c2e, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, + 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c2f, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, + 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c30, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, 0x3c31, + 0x3c31, 0x3c31, 0x3c31, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, 0x3c32, + 0x3c32, 0x3c32, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, 0x3c33, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, + 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c34, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, + 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c35, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c36, + 0x3c36, 0x3c36, 0x3c36, 0x3c36, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, 0x3c37, + 0x3c37, 0x3c37, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, 0x3c38, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, + 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c39, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, + 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3a, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3b, + 0x3c3b, 0x3c3b, 0x3c3b, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, 0x3c3c, + 0x3c3c, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, 0x3c3d, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, + 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3e, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, + 0x3c3f, 0x3c3f, 0x3c3f, 0x3c3f, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, 0x3c40, + 0x3c40, 0x3c40, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, 0x3c41, + 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, + 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, + 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c42, 0x3c43, + 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, + 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c43, 0x3c44, 0x3c44, + 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, + 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c44, 0x3c45, 0x3c45, 0x3c45, + 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c45, + 0x3c45, 0x3c45, 0x3c45, 0x3c45, 0x3c46, 0x3c46, 0x3c46, 0x3c46, + 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, 0x3c46, + 0x3c46, 0x3c46, 0x3c46, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, + 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, 0x3c47, + 0x3c47, 0x3c47, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, + 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, 0x3c48, + 0x3c48, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, + 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, 0x3c49, + 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, + 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4a, 0x3c4b, + 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, + 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4b, 0x3c4c, 0x3c4c, + 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, + 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4c, 0x3c4d, 0x3c4d, 0x3c4d, + 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, + 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4d, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, + 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4e, + 0x3c4e, 0x3c4e, 0x3c4e, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, + 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, 0x3c4f, + 0x3c4f, 0x3c4f, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, + 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, 0x3c50, + 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, + 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c51, 0x3c52, + 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, + 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c52, 0x3c53, 0x3c53, + 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, + 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c53, 0x3c54, 0x3c54, 0x3c54, + 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c54, + 0x3c54, 0x3c54, 0x3c54, 0x3c54, 0x3c55, 0x3c55, 0x3c55, 0x3c55, + 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, 0x3c55, + 0x3c55, 0x3c55, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, + 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, 0x3c56, + 0x3c56, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, + 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, 0x3c57, + 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, + 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c58, 0x3c59, + 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, + 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c59, 0x3c5a, 0x3c5a, 0x3c5a, + 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, + 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5a, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, + 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5b, + 0x3c5b, 0x3c5b, 0x3c5b, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, + 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, 0x3c5c, + 0x3c5c, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, + 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, 0x3c5d, + 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, + 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5e, 0x3c5f, + 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, + 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c5f, 0x3c60, 0x3c60, 0x3c60, + 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c60, + 0x3c60, 0x3c60, 0x3c60, 0x3c60, 0x3c61, 0x3c61, 0x3c61, 0x3c61, + 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, 0x3c61, + 0x3c61, 0x3c61, 0x3c61, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, + 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, 0x3c62, + 0x3c62, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, + 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, 0x3c63, + 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, + 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c64, 0x3c65, 0x3c65, + 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, + 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c65, 0x3c66, 0x3c66, 0x3c66, + 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c66, + 0x3c66, 0x3c66, 0x3c66, 0x3c66, 0x3c67, 0x3c67, 0x3c67, 0x3c67, + 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, 0x3c67, + 0x3c67, 0x3c67, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, + 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, 0x3c68, + 0x3c68, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, + 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c69, 0x3c6a, + 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, + 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6a, 0x3c6b, 0x3c6b, + 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, + 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6b, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, + 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6c, + 0x3c6c, 0x3c6c, 0x3c6c, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, + 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, 0x3c6d, + 0x3c6d, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, + 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6e, 0x3c6f, + 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, + 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c6f, 0x3c70, 0x3c70, + 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c70, + 0x3c70, 0x3c70, 0x3c70, 0x3c70, 0x3c71, 0x3c71, 0x3c71, 0x3c71, + 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, 0x3c71, + 0x3c71, 0x3c71, 0x3c71, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, + 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, 0x3c72, + 0x3c72, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, + 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, 0x3c73, + 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, + 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c74, 0x3c75, 0x3c75, + 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c75, + 0x3c75, 0x3c75, 0x3c75, 0x3c75, 0x3c76, 0x3c76, 0x3c76, 0x3c76, + 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, 0x3c76, + 0x3c76, 0x3c76, 0x3c76, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, + 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, 0x3c77, + 0x3c77, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, + 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c78, 0x3c79, + 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, + 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c79, 0x3c7a, 0x3c7a, + 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, + 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7a, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, + 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, 0x3c7b, + 0x3c7b, 0x3c7b, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, + 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, 0x3c7c, + 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, + 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7d, 0x3c7e, + 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, + 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7e, 0x3c7f, 0x3c7f, 0x3c7f, + 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, 0x3c7f, + 0x3c7f, 0x3c7f, 0x3c7f, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, + 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, 0x3c80, + 0x3c80, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, + 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, 0x3c81, + 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, + 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c82, 0x3c83, 0x3c83, + 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c83, + 0x3c83, 0x3c83, 0x3c83, 0x3c83, 0x3c84, 0x3c84, 0x3c84, 0x3c84, + 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, 0x3c84, + 0x3c84, 0x3c84, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, + 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, 0x3c85, + 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, + 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c86, 0x3c87, 0x3c87, + 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, + 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c87, 0x3c88, 0x3c88, 0x3c88, + 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, 0x3c88, + 0x3c88, 0x3c88, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c89, 0x3c89, + 0x3c89, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, 0x3c8a, + 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8b, 0x3c8c, + 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8c, 0x3c8d, 0x3c8d, + 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8d, 0x3c8e, 0x3c8e, 0x3c8e, + 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8e, 0x3c8f, 0x3c8f, 0x3c8f, 0x3c8f, + 0x3c8f, 0x3c8f, 0x3c8f, 0x3c90, 0x3c90, 0x3c90, 0x3c90, 0x3c90, + 0x3c90, 0x3c90, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c91, 0x3c91, + 0x3c91, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, 0x3c92, + 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c93, 0x3c94, + 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c94, 0x3c95, 0x3c95, + 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c95, 0x3c96, 0x3c96, 0x3c96, + 0x3c96, 0x3c96, 0x3c96, 0x3c96, 0x3c97, 0x3c97, 0x3c97, 0x3c97, + 0x3c97, 0x3c97, 0x3c97, 0x3c98, 0x3c98, 0x3c98, 0x3c98, 0x3c98, + 0x3c98, 0x3c98, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c99, 0x3c99, + 0x3c99, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, 0x3c9a, + 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9b, 0x3c9c, + 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9c, 0x3c9d, 0x3c9d, + 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9d, 0x3c9e, 0x3c9e, 0x3c9e, + 0x3c9e, 0x3c9e, 0x3c9e, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, 0x3c9f, + 0x3c9f, 0x3c9f, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, 0x3ca0, + 0x3ca0, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, 0x3ca1, + 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca3, + 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca3, 0x3ca4, 0x3ca4, + 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca4, 0x3ca5, 0x3ca5, 0x3ca5, + 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca5, 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca6, + 0x3ca6, 0x3ca6, 0x3ca6, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, 0x3ca7, + 0x3ca7, 0x3ca7, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, 0x3ca8, + 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x3caa, + 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3caa, 0x3cab, 0x3cab, + 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cab, 0x3cac, 0x3cac, 0x3cac, + 0x3cac, 0x3cac, 0x3cac, 0x3cac, 0x3cad, 0x3cad, 0x3cad, 0x3cad, + 0x3cad, 0x3cad, 0x3cad, 0x3cae, 0x3cae, 0x3cae, 0x3cae, 0x3cae, + 0x3cae, 0x3cae, 0x3caf, 0x3caf, 0x3caf, 0x3caf, 0x3caf, 0x3caf, + 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb0, 0x3cb1, + 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb1, 0x3cb2, 0x3cb2, + 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb2, 0x3cb3, 0x3cb3, 0x3cb3, + 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb3, 0x3cb4, 0x3cb4, 0x3cb4, 0x3cb4, + 0x3cb4, 0x3cb4, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, 0x3cb5, + 0x3cb5, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, 0x3cb6, + 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb7, 0x3cb8, + 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb8, 0x3cb9, 0x3cb9, + 0x3cb9, 0x3cb9, 0x3cb9, 0x3cb9, 0x3cba, 0x3cba, 0x3cba, 0x3cba, + 0x3cba, 0x3cba, 0x3cba, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, 0x3cbb, + 0x3cbb, 0x3cbb, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, 0x3cbc, + 0x3cbc, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbd, 0x3cbe, + 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbe, 0x3cbf, 0x3cbf, + 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cbf, 0x3cc0, 0x3cc0, 0x3cc0, + 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc0, 0x3cc1, 0x3cc1, 0x3cc1, 0x3cc1, + 0x3cc1, 0x3cc1, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, 0x3cc2, + 0x3cc2, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, 0x3cc3, + 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc4, 0x3cc5, + 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc5, 0x3cc6, 0x3cc6, 0x3cc6, + 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc6, 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc7, + 0x3cc7, 0x3cc7, 0x3cc7, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, 0x3cc8, + 0x3cc8, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, 0x3cc9, + 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3cca, 0x3ccb, + 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccb, 0x3ccc, 0x3ccc, 0x3ccc, + 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccc, 0x3ccd, 0x3ccd, 0x3ccd, 0x3ccd, + 0x3ccd, 0x3ccd, 0x3ccd, 0x3cce, 0x3cce, 0x3cce, 0x3cce, 0x3cce, + 0x3cce, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, 0x3ccf, + 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd0, 0x3cd1, + 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd1, 0x3cd2, 0x3cd2, 0x3cd2, + 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd2, 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd3, + 0x3cd3, 0x3cd3, 0x3cd3, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd4, 0x3cd4, + 0x3cd4, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, 0x3cd5, + 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd6, 0x3cd7, 0x3cd7, + 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd7, 0x3cd8, 0x3cd8, 0x3cd8, + 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd8, 0x3cd9, 0x3cd9, 0x3cd9, 0x3cd9, + 0x3cd9, 0x3cd9, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cda, 0x3cda, + 0x3cda, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdb, 0x3cdc, + 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdc, 0x3cdd, 0x3cdd, + 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cdd, 0x3cde, 0x3cde, 0x3cde, + 0x3cde, 0x3cde, 0x3cde, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, 0x3cdf, + 0x3cdf, 0x3cdf, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, 0x3ce0, + 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce1, 0x3ce2, + 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce2, 0x3ce3, 0x3ce3, 0x3ce3, + 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce3, 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce4, + 0x3ce4, 0x3ce4, 0x3ce4, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce5, 0x3ce5, + 0x3ce5, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, 0x3ce6, + 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce7, 0x3ce8, 0x3ce8, + 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce8, 0x3ce9, 0x3ce9, 0x3ce9, + 0x3ce9, 0x3ce9, 0x3ce9, 0x3cea, 0x3cea, 0x3cea, 0x3cea, 0x3cea, + 0x3cea, 0x3cea, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, 0x3ceb, + 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3cec, 0x3ced, + 0x3ced, 0x3ced, 0x3ced, 0x3ced, 0x3ced, 0x3cee, 0x3cee, 0x3cee, + 0x3cee, 0x3cee, 0x3cee, 0x3cee, 0x3cef, 0x3cef, 0x3cef, 0x3cef, + 0x3cef, 0x3cef, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, 0x3cf0, + 0x3cf0, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf1, 0x3cf2, + 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf2, 0x3cf3, 0x3cf3, + 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf3, 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf4, + 0x3cf4, 0x3cf4, 0x3cf4, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5, + 0x3cf5, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf6, 0x3cf7, + 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf7, 0x3cf8, 0x3cf8, + 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf8, 0x3cf9, 0x3cf9, 0x3cf9, 0x3cf9, + 0x3cf9, 0x3cf9, 0x3cf9, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfa, 0x3cfa, + 0x3cfa, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, 0x3cfb, + 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfc, 0x3cfd, 0x3cfd, + 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfd, 0x3cfe, 0x3cfe, 0x3cfe, 0x3cfe, + 0x3cfe, 0x3cfe, 0x3cfe, 0x3cff, 0x3cff, 0x3cff, 0x3cff, 0x3cff, + 0x3cff, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, 0x3d00, + 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d01, 0x3d02, 0x3d02, + 0x3d02, 0x3d02, 0x3d02, 0x3d02, 0x3d03, 0x3d03, 0x3d03, 0x3d03, + 0x3d03, 0x3d03, 0x3d03, 0x3d04, 0x3d04, 0x3d04, 0x3d04, 0x3d04, + 0x3d04, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, 0x3d05, + 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d06, 0x3d07, 0x3d07, + 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x3d08, 0x3d08, 0x3d08, 0x3d08, + 0x3d08, 0x3d08, 0x3d08, 0x3d09, 0x3d09, 0x3d09, 0x3d09, 0x3d09, + 0x3d09, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0a, 0x3d0b, + 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0b, 0x3d0c, 0x3d0c, + 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0c, 0x3d0d, 0x3d0d, 0x3d0d, 0x3d0d, + 0x3d0d, 0x3d0d, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, 0x3d0e, + 0x3d0e, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d0f, 0x3d10, + 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d10, 0x3d11, 0x3d11, 0x3d11, + 0x3d11, 0x3d11, 0x3d11, 0x3d11, 0x3d12, 0x3d12, 0x3d12, 0x3d12, + 0x3d12, 0x3d12, 0x3d13, 0x3d13, 0x3d13, 0x3d13, 0x3d13, 0x3d13, + 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d14, 0x3d15, + 0x3d15, 0x3d15, 0x3d15, 0x3d15, 0x3d15, 0x3d16, 0x3d16, 0x3d16, + 0x3d16, 0x3d16, 0x3d16, 0x3d17, 0x3d17, 0x3d17, 0x3d17, 0x3d17, + 0x3d17, 0x3d17, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d18, 0x3d18, + 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d19, 0x3d1a, 0x3d1a, + 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1a, 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1b, + 0x3d1b, 0x3d1b, 0x3d1b, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, 0x3d1c, + 0x3d1c, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1d, 0x3d1e, + 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1e, 0x3d1f, 0x3d1f, 0x3d1f, + 0x3d1f, 0x3d1f, 0x3d1f, 0x3d1f, 0x3d20, 0x3d20, 0x3d20, 0x3d20, + 0x3d20, 0x3d20, 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d21, 0x3d21, + 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d22, 0x3d23, 0x3d23, + 0x3d23, 0x3d23, 0x3d23, 0x3d24, 0x3d24, 0x3d24, 0x3d25, 0x3d25, + 0x3d25, 0x3d26, 0x3d26, 0x3d26, 0x3d27, 0x3d27, 0x3d27, 0x3d28, + 0x3d28, 0x3d28, 0x3d29, 0x3d29, 0x3d29, 0x3d2a, 0x3d2a, 0x3d2a, + 0x3d2b, 0x3d2b, 0x3d2b, 0x3d2c, 0x3d2c, 0x3d2c, 0x3d2d, 0x3d2d, + 0x3d2d, 0x3d2d, 0x3d2e, 0x3d2e, 0x3d2e, 0x3d2f, 0x3d2f, 0x3d2f, + 0x3d30, 0x3d30, 0x3d30, 0x3d31, 0x3d31, 0x3d31, 0x3d32, 0x3d32, + 0x3d32, 0x3d33, 0x3d33, 0x3d33, 0x3d34, 0x3d34, 0x3d34, 0x3d35, + 0x3d35, 0x3d35, 0x3d36, 0x3d36, 0x3d36, 0x3d37, 0x3d37, 0x3d37, + 0x3d38, 0x3d38, 0x3d38, 0x3d39, 0x3d39, 0x3d39, 0x3d3a, 0x3d3a, + 0x3d3a, 0x3d3a, 0x3d3b, 0x3d3b, 0x3d3b, 0x3d3c, 0x3d3c, 0x3d3c, + 0x3d3d, 0x3d3d, 0x3d3d, 0x3d3e, 0x3d3e, 0x3d3e, 0x3d3f, 0x3d3f, + 0x3d3f, 0x3d40, 0x3d40, 0x3d40, 0x3d41, 0x3d41, 0x3d41, 0x3d42, + 0x3d42, 0x3d42, 0x3d43, 0x3d43, 0x3d43, 0x3d44, 0x3d44, 0x3d44, + 0x3d45, 0x3d45, 0x3d45, 0x3d46, 0x3d46, 0x3d46, 0x3d47, 0x3d47, + 0x3d47, 0x3d48, 0x3d48, 0x3d48, 0x3d49, 0x3d49, 0x3d49, 0x3d4a, + 0x3d4a, 0x3d4a, 0x3d4b, 0x3d4b, 0x3d4b, 0x3d4c, 0x3d4c, 0x3d4c, + 0x3d4d, 0x3d4d, 0x3d4d, 0x3d4e, 0x3d4e, 0x3d4e, 0x3d4f, 0x3d4f, + 0x3d4f, 0x3d50, 0x3d50, 0x3d50, 0x3d51, 0x3d51, 0x3d51, 0x3d52, + 0x3d52, 0x3d52, 0x3d53, 0x3d53, 0x3d53, 0x3d54, 0x3d54, 0x3d54, + 0x3d55, 0x3d55, 0x3d55, 0x3d56, 0x3d56, 0x3d56, 0x3d57, 0x3d57, + 0x3d57, 0x3d58, 0x3d58, 0x3d58, 0x3d59, 0x3d59, 0x3d59, 0x3d5a, + 0x3d5a, 0x3d5a, 0x3d5b, 0x3d5b, 0x3d5b, 0x3d5c, 0x3d5c, 0x3d5c, + 0x3d5d, 0x3d5d, 0x3d5d, 0x3d5e, 0x3d5e, 0x3d5e, 0x3d5f, 0x3d5f, + 0x3d5f, 0x3d60, 0x3d60, 0x3d60, 0x3d61, 0x3d61, 0x3d61, 0x3d62, + 0x3d62, 0x3d62, 0x3d63, 0x3d63, 0x3d63, 0x3d64, 0x3d64, 0x3d64, + 0x3d65, 0x3d65, 0x3d65, 0x3d66, 0x3d66, 0x3d66, 0x3d67, 0x3d67, + 0x3d67, 0x3d68, 0x3d68, 0x3d68, 0x3d69, 0x3d69, 0x3d69, 0x3d6a, + 0x3d6a, 0x3d6a, 0x3d6b, 0x3d6b, 0x3d6b, 0x3d6c, 0x3d6c, 0x3d6c, + 0x3d6d, 0x3d6d, 0x3d6d, 0x3d6e, 0x3d6e, 0x3d6e, 0x3d6f, 0x3d6f, + 0x3d6f, 0x3d70, 0x3d70, 0x3d70, 0x3d71, 0x3d71, 0x3d72, 0x3d72, + 0x3d72, 0x3d73, 0x3d73, 0x3d73, 0x3d74, 0x3d74, 0x3d74, 0x3d75, + 0x3d75, 0x3d75, 0x3d76, 0x3d76, 0x3d76, 0x3d77, 0x3d77, 0x3d77, + 0x3d78, 0x3d78, 0x3d78, 0x3d79, 0x3d79, 0x3d79, 0x3d7a, 0x3d7a, + 0x3d7a, 0x3d7b, 0x3d7b, 0x3d7b, 0x3d7c, 0x3d7c, 0x3d7c, 0x3d7d, + 0x3d7d, 0x3d7d, 0x3d7e, 0x3d7e, 0x3d7e, 0x3d7f, 0x3d7f, 0x3d80, + 0x3d80, 0x3d80, 0x3d81, 0x3d81, 0x3d81, 0x3d82, 0x3d82, 0x3d82, + 0x3d83, 0x3d83, 0x3d83, 0x3d84, 0x3d84, 0x3d84, 0x3d85, 0x3d85, + 0x3d85, 0x3d86, 0x3d86, 0x3d86, 0x3d87, 0x3d87, 0x3d87, 0x3d88, + 0x3d88, 0x3d88, 0x3d89, 0x3d89, 0x3d8a, 0x3d8a, 0x3d8a, 0x3d8b, + 0x3d8b, 0x3d8b, 0x3d8c, 0x3d8c, 0x3d8c, 0x3d8d, 0x3d8d, 0x3d8d, + 0x3d8e, 0x3d8e, 0x3d8e, 0x3d8f, 0x3d8f, 0x3d8f, 0x3d90, 0x3d90, + 0x3d90, 0x3d91, 0x3d91, 0x3d92, 0x3d92, 0x3d92, 0x3d93, 0x3d93, + 0x3d93, 0x3d94, 0x3d94, 0x3d94, 0x3d95, 0x3d95, 0x3d95, 0x3d96, + 0x3d96, 0x3d96, 0x3d97, 0x3d97, 0x3d97, 0x3d98, 0x3d98, 0x3d98, + 0x3d99, 0x3d99, 0x3d9a, 0x3d9a, 0x3d9a, 0x3d9b, 0x3d9b, 0x3d9b, + 0x3d9c, 0x3d9c, 0x3d9c, 0x3d9d, 0x3d9d, 0x3d9d, 0x3d9e, 0x3d9e, + 0x3d9e, 0x3d9f, 0x3d9f, 0x3d9f, 0x3da0, 0x3da0, 0x3da1, 0x3da1, + 0x3da1, 0x3da2, 0x3da2, 0x3da2, 0x3da3, 0x3da3, 0x3da3, 0x3da4, + 0x3da4, 0x3da4, 0x3da5, 0x3da5, 0x3da5, 0x3da6, 0x3da6, 0x3da7, + 0x3da7, 0x3da7, 0x3da8, 0x3da8, 0x3da8, 0x3da9, 0x3da9, 0x3da9, + 0x3daa, 0x3daa, 0x3daa, 0x3dab, 0x3dab, 0x3dab, 0x3dac, 0x3dac, + 0x3dad, 0x3dad, 0x3dad, 0x3dae, 0x3dae, 0x3dae, 0x3daf, 0x3daf, + 0x3daf, 0x3db0, 0x3db0, 0x3db0, 0x3db1, 0x3db1, 0x3db2, 0x3db2, + 0x3db2, 0x3db3, 0x3db3, 0x3db3, 0x3db4, 0x3db4, 0x3db4, 0x3db5, + 0x3db5, 0x3db5, 0x3db6, 0x3db6, 0x3db7, 0x3db7, 0x3db7, 0x3db8, + 0x3db8, 0x3db8, 0x3db9, 0x3db9, 0x3db9, 0x3dba, 0x3dba, 0x3dba, + 0x3dbb, 0x3dbb, 0x3dbc, 0x3dbc, 0x3dbc, 0x3dbd, 0x3dbd, 0x3dbd, + 0x3dbe, 0x3dbe, 0x3dbe, 0x3dbf, 0x3dbf, 0x3dbf, 0x3dc0, 0x3dc0, + 0x3dc1, 0x3dc1, 0x3dc1, 0x3dc2, 0x3dc2, 0x3dc2, 0x3dc3, 0x3dc3, + 0x3dc3, 0x3dc4, 0x3dc4, 0x3dc5, 0x3dc5, 0x3dc5, 0x3dc6, 0x3dc6, + 0x3dc6, 0x3dc7, 0x3dc7, 0x3dc7, 0x3dc8, 0x3dc8, 0x3dc8, 0x3dc9, + 0x3dc9, 0x3dca, 0x3dca, 0x3dca, 0x3dcb, 0x3dcb, 0x3dcb, 0x3dcc, + 0x3dcc, 0x3dcc, 0x3dcd, 0x3dcd, 0x3dce, 0x3dce, 0x3dce, 0x3dcf, + 0x3dcf, 0x3dcf, 0x3dd0, 0x3dd0, 0x3dd0, 0x3dd1, 0x3dd1, 0x3dd2, + 0x3dd2, 0x3dd2, 0x3dd3, 0x3dd3, 0x3dd3, 0x3dd4, 0x3dd4, 0x3dd4, + 0x3dd5, 0x3dd5, 0x3dd6, 0x3dd6, 0x3dd6, 0x3dd7, 0x3dd7, 0x3dd7, + 0x3dd8, 0x3dd8, 0x3dd8, 0x3dd9, 0x3dd9, 0x3dda, 0x3dda, 0x3dda, + 0x3ddb, 0x3ddb, 0x3ddb, 0x3ddc, 0x3ddc, 0x3ddc, 0x3ddd, 0x3ddd, + 0x3dde, 0x3dde, 0x3dde, 0x3ddf, 0x3ddf, 0x3ddf, 0x3de0, 0x3de0, + 0x3de1, 0x3de1, 0x3de1, 0x3de2, 0x3de2, 0x3de2, 0x3de3, 0x3de3, + 0x3de3, 0x3de4, 0x3de4, 0x3de5, 0x3de5, 0x3de5, 0x3de6, 0x3de6, + 0x3de6, 0x3de7, 0x3de7, 0x3de8, 0x3de8, 0x3de8, 0x3de9, 0x3de9, + 0x3de9, 0x3dea, 0x3dea, 0x3dea, 0x3deb, 0x3deb, 0x3dec, 0x3dec, + 0x3dec, 0x3ded, 0x3ded, 0x3ded, 0x3dee, 0x3dee, 0x3def, 0x3def, + 0x3def, 0x3df0, 0x3df0, 0x3df0, 0x3df1, 0x3df1, 0x3df2, 0x3df2, + 0x3df2, 0x3df3, 0x3df3, 0x3df3, 0x3df4, 0x3df4, 0x3df4, 0x3df5, + 0x3df5, 0x3df6, 0x3df6, 0x3df6, 0x3df7, 0x3df7, 0x3df7, 0x3df8, + 0x3df8, 0x3df9, 0x3df9, 0x3df9, 0x3dfa, 0x3dfa, 0x3dfa, 0x3dfb, + 0x3dfb, 0x3dfc, 0x3dfc, 0x3dfc, 0x3dfd, 0x3dfd, 0x3dfd, 0x3dfe, + 0x3dfe, 0x3dff, 0x3dff, 0x3dff, 0x3e00, 0x3e00, 0x3e00, 0x3e01, + 0x3e01, 0x3e02, 0x3e02, 0x3e02, 0x3e03, 0x3e03, 0x3e03, 0x3e04, + 0x3e04, 0x3e05, 0x3e05, 0x3e05, 0x3e06, 0x3e06, 0x3e06, 0x3e07, + 0x3e07, 0x3e08, 0x3e08, 0x3e08, 0x3e09, 0x3e09, 0x3e09, 0x3e0a, + 0x3e0a, 0x3e0b, 0x3e0b, 0x3e0b, 0x3e0c, 0x3e0c, 0x3e0d, 0x3e0d, + 0x3e0d, 0x3e0e, 0x3e0e, 0x3e0e, 0x3e0f, 0x3e0f, 0x3e10, 0x3e10, + 0x3e10, 0x3e11, 0x3e11, 0x3e11, 0x3e12, 0x3e12, 0x3e13, 0x3e13, + 0x3e13, 0x3e14, 0x3e14, 0x3e14, 0x3e15, 0x3e15, 0x3e16, 0x3e16, + 0x3e16, 0x3e17, 0x3e17, 0x3e18, 0x3e18, 0x3e18, 0x3e19, 0x3e19, + 0x3e19, 0x3e1a, 0x3e1a, 0x3e1b, 0x3e1b, 0x3e1b, 0x3e1c, 0x3e1c, + 0x3e1c, 0x3e1d, 0x3e1d, 0x3e1e, 0x3e1e, 0x3e1e, 0x3e1f, 0x3e1f, + 0x3e20, 0x3e20, 0x3e20, 0x3e21, 0x3e21, 0x3e21, 0x3e22, 0x3e22, + 0x3e23, 0x3e23, 0x3e23, 0x3e24, 0x3e24, 0x3e25, 0x3e25, 0x3e25, + 0x3e26, 0x3e26, 0x3e26, 0x3e27, 0x3e27, 0x3e28, 0x3e28, 0x3e28, + 0x3e29, 0x3e29, 0x3e2a, 0x3e2a, 0x3e2a, 0x3e2b, 0x3e2b, 0x3e2b, + 0x3e2c, 0x3e2c, 0x3e2d, 0x3e2d, 0x3e2d, 0x3e2e, 0x3e2e, 0x3e2f, + 0x3e2f, 0x3e2f, 0x3e30, 0x3e30, 0x3e30, 0x3e31, 0x3e31, 0x3e32, + 0x3e32, 0x3e32, 0x3e33, 0x3e33, 0x3e34, 0x3e34, 0x3e34, 0x3e35, + 0x3e35, 0x3e35, 0x3e36, 0x3e36, 0x3e37, 0x3e37, 0x3e37, 0x3e38, + 0x3e38, 0x3e39, 0x3e39, 0x3e39, 0x3e3a, 0x3e3a, 0x3e3b, 0x3e3b, + 0x3e3b, 0x3e3c, 0x3e3c, 0x3e3c, 0x3e3d, 0x3e3d, 0x3e3e, 0x3e3e, + 0x3e3e, 0x3e3f, 0x3e3f, 0x3e40, 0x3e40, 0x3e40, 0x3e41, 0x3e41, + 0x3e42, 0x3e42, 0x3e42, 0x3e43, 0x3e43, 0x3e44, 0x3e44, 0x3e44, + 0x3e45, 0x3e45, 0x3e45, 0x3e46, 0x3e46, 0x3e47, 0x3e47, 0x3e47, + 0x3e48, 0x3e48, 0x3e49, 0x3e49, 0x3e49, 0x3e4a, 0x3e4a, 0x3e4b, + 0x3e4b, 0x3e4b, 0x3e4c, 0x3e4c, 0x3e4d, 0x3e4d, 0x3e4d, 0x3e4e, + 0x3e4e, 0x3e4f, 0x3e4f, 0x3e4f, 0x3e50, 0x3e50, 0x3e50, 0x3e51, + 0x3e51, 0x3e52, 0x3e52, 0x3e52, 0x3e53, 0x3e53, 0x3e54, 0x3e54, + 0x3e54, 0x3e55, 0x3e55, 0x3e56, 0x3e56, 0x3e56, 0x3e57, 0x3e57, + 0x3e58, 0x3e58, 0x3e58, 0x3e59, 0x3e59, 0x3e5a, 0x3e5a, 0x3e5a, + 0x3e5b, 0x3e5b, 0x3e5c, 0x3e5c, 0x3e5c, 0x3e5d, 0x3e5d, 0x3e5e, + 0x3e5e, 0x3e5e, 0x3e5f, 0x3e5f, 0x3e60, 0x3e60, 0x3e60, 0x3e61, + 0x3e61, 0x3e62, 0x3e62, 0x3e62, 0x3e63, 0x3e63, 0x3e64, 0x3e64, + 0x3e64, 0x3e65, 0x3e65, 0x3e66, 0x3e66, 0x3e66, 0x3e67, 0x3e67, + 0x3e68, 0x3e68, 0x3e68, 0x3e69, 0x3e69, 0x3e6a, 0x3e6a, 0x3e6a, + 0x3e6b, 0x3e6b, 0x3e6c, 0x3e6c, 0x3e6c, 0x3e6d, 0x3e6d, 0x3e6e, + 0x3e6e, 0x3e6e, 0x3e6f, 0x3e6f, 0x3e70, 0x3e70, 0x3e70, 0x3e71, + 0x3e71, 0x3e72, 0x3e72, 0x3e72, 0x3e73, 0x3e73, 0x3e74, 0x3e74, + 0x3e74, 0x3e75, 0x3e75, 0x3e76, 0x3e76, 0x3e76, 0x3e77, 0x3e77, + 0x3e78, 0x3e78, 0x3e78, 0x3e79, 0x3e79, 0x3e7a, 0x3e7a, 0x3e7a, + 0x3e7b, 0x3e7b, 0x3e7c, 0x3e7c, 0x3e7c, 0x3e7d, 0x3e7d, 0x3e7e, + 0x3e7e, 0x3e7f, 0x3e7f, 0x3e7f, 0x3e80, 0x3e80, 0x3e81, 0x3e81, + 0x3e81, 0x3e82, 0x3e82, 0x3e83, 0x3e83, 0x3e83, 0x3e84, 0x3e84, + 0x3e85, 0x3e85, 0x3e85, 0x3e86, 0x3e86, 0x3e87, 0x3e87, 0x3e87, + 0x3e88, 0x3e88, 0x3e89, 0x3e89, 0x3e8a, 0x3e8a, 0x3e8a, 0x3e8b, + 0x3e8b, 0x3e8c, 0x3e8c, 0x3e8c, 0x3e8d, 0x3e8d, 0x3e8e, 0x3e8e, + 0x3e8e, 0x3e8f, 0x3e8f, 0x3e90, 0x3e90, 0x3e90, 0x3e91, 0x3e91, + 0x3e92, 0x3e92, 0x3e93, 0x3e93, 0x3e93, 0x3e94, 0x3e94, 0x3e95, + 0x3e95, 0x3e95, 0x3e96, 0x3e96, 0x3e97, 0x3e97, 0x3e97, 0x3e98, + 0x3e98, 0x3e99, 0x3e9a, 0x3e9b, 0x3e9c, 0x3e9c, 0x3e9d, 0x3e9e, + 0x3e9f, 0x3ea0, 0x3ea1, 0x3ea1, 0x3ea2, 0x3ea3, 0x3ea4, 0x3ea5, + 0x3ea6, 0x3ea6, 0x3ea7, 0x3ea8, 0x3ea9, 0x3eaa, 0x3eab, 0x3eab, + 0x3eac, 0x3ead, 0x3eae, 0x3eaf, 0x3eb0, 0x3eb0, 0x3eb1, 0x3eb2, + 0x3eb3, 0x3eb4, 0x3eb5, 0x3eb5, 0x3eb6, 0x3eb7, 0x3eb8, 0x3eb9, + 0x3eba, 0x3eba, 0x3ebb, 0x3ebc, 0x3ebd, 0x3ebe, 0x3ebf, 0x3ebf, + 0x3ec0, 0x3ec1, 0x3ec2, 0x3ec3, 0x3ec4, 0x3ec5, 0x3ec5, 0x3ec6, + 0x3ec7, 0x3ec8, 0x3ec9, 0x3eca, 0x3eca, 0x3ecb, 0x3ecc, 0x3ecd, + 0x3ece, 0x3ecf, 0x3ed0, 0x3ed0, 0x3ed1, 0x3ed2, 0x3ed3, 0x3ed4, + 0x3ed5, 0x3ed6, 0x3ed6, 0x3ed7, 0x3ed8, 0x3ed9, 0x3eda, 0x3edb, + 0x3edc, 0x3edc, 0x3edd, 0x3ede, 0x3edf, 0x3ee0, 0x3ee1, 0x3ee2, + 0x3ee2, 0x3ee3, 0x3ee4, 0x3ee5, 0x3ee6, 0x3ee7, 0x3ee8, 0x3ee8, + 0x3ee9, 0x3eea, 0x3eeb, 0x3eec, 0x3eed, 0x3eee, 0x3eef, 0x3eef, + 0x3ef0, 0x3ef1, 0x3ef2, 0x3ef3, 0x3ef4, 0x3ef5, 0x3ef5, 0x3ef6, + 0x3ef7, 0x3ef8, 0x3ef9, 0x3efa, 0x3efb, 0x3efc, 0x3efc, 0x3efd, + 0x3efe, 0x3eff, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f03, 0x3f04, + 0x3f05, 0x3f06, 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0a, 0x3f0b, + 0x3f0c, 0x3f0d, 0x3f0e, 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f12, + 0x3f13, 0x3f14, 0x3f15, 0x3f16, 0x3f17, 0x3f18, 0x3f19, 0x3f19, + 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e, 0x3f1f, 0x3f20, 0x3f21, + 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, 0x3f27, 0x3f28, + 0x3f29, 0x3f2a, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, 0x3f2f, + 0x3f30, 0x3f31, 0x3f32, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, + 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3c, 0x3f3d, + 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, + 0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, + 0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f50, 0x3f51, 0x3f52, 0x3f53, + 0x3f54, 0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, + 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, + 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f66, 0x3f67, 0x3f68, 0x3f69, + 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, + 0x3f72, 0x3f73, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, 0x3f78, + 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f, 0x3f80, + 0x3f81, 0x3f82, 0x3f82, 0x3f83, 0x3f84, 0x3f85, 0x3f86, 0x3f87, + 0x3f88, 0x3f89, 0x3f8a, 0x3f8b, 0x3f8c, 0x3f8d, 0x3f8e, 0x3f8f, + 0x3f90, 0x3f91, 0x3f92, 0x3f92, 0x3f93, 0x3f94, 0x3f95, 0x3f96, + 0x3f97, 0x3f98, 0x3f99, 0x3f9a, 0x3f9b, 0x3f9c, 0x3f9d, 0x3f9e, + 0x3f9f, 0x3fa0, 0x3fa1, 0x3fa2, 0x3fa3, 0x3fa4, 0x3fa5, 0x3fa5, + 0x3fa6, 0x3fa7, 0x3fa8, 0x3fa9, 0x3faa, 0x3fab, 0x3fac, 0x3fad, + 0x3fae, 0x3faf, 0x3fb0, 0x3fb1, 0x3fb2, 0x3fb3, 0x3fb4, 0x3fb5, + 0x3fb6, 0x3fb7, 0x3fb8, 0x3fb9, 0x3fba, 0x3fbb, 0x3fbc, 0x3fbd, + 0x3fbe, 0x3fbf, 0x3fbf, 0x3fc0, 0x3fc1, 0x3fc2, 0x3fc3, 0x3fc4, + 0x3fc5, 0x3fc6, 0x3fc7, 0x3fc8, 0x3fc9, 0x3fca, 0x3fcb, 0x3fcc, + 0x3fcd, 0x3fce, 0x3fcf, 0x3fd0, 0x3fd1, 0x3fd2, 0x3fd3, 0x3fd4, + 0x3fd5, 0x3fd6, 0x3fd7, 0x3fd8, 0x3fd9, 0x3fda, 0x3fdb, 0x3fdc, + 0x3fdd, 0x3fde, 0x3fdf, 0x3fe0, 0x3fe1, 0x3fe2, 0x3fe3, 0x3fe4, + 0x3fe5, 0x3fe6, 0x3fe7, 0x3fe8, 0x3fe9, 0x3fea, 0x3feb, 0x3fec, + 0x3fed, 0x3fee, 0x3fef, 0x3ff0, 0x3ff0, 0x3ff1, 0x3ff2, 0x3ff3, + 0x3ff4, 0x3ff5, 0x3ff6, 0x3ff7, 0x3ff8, 0x3ff9, 0x3ffa, 0x3ffb, + 0x3ffc, 0x3ffd, 0x3ffe, 0x3fff, 0x4000, 0x4001, 0x4001, 0x4002, + 0x4002, 0x4003, 0x4003, 0x4004, 0x4004, 0x4005, 0x4005, 0x4006, + 0x4006, 0x4007, 0x4007, 0x4008, 0x4008, 0x4009, 0x4009, 0x400a, + 0x400a, 0x400b, 0x400b, 0x400c, 0x400c, 0x400d, 0x400d, 0x400e, + 0x400e, 0x400f, 0x400f, 0x4010, 0x4010, 0x4011, 0x4011, 0x4012, + 0x4012, 0x4013, 0x4013, 0x4014, 0x4014, 0x4015, 0x4015, 0x4016, + 0x4016, 0x4017, 0x4017, 0x4018, 0x4019, 0x4019, 0x401a, 0x401a, + 0x401b, 0x401b, 0x401c, 0x401c, 0x401d, 0x401d, 0x401e, 0x401e, + 0x401f, 0x401f, 0x4020, 0x4020, 0x4021, 0x4021, 0x4022, 0x4022, + 0x4023, 0x4023, 0x4024, 0x4024, 0x4025, 0x4025, 0x4026, 0x4026, + 0x4027, 0x4027, 0x4028, 0x4028, 0x4029, 0x402a, 0x402a, 0x402b, + 0x402b, 0x402c, 0x402c, 0x402d, 0x402d, 0x402e, 0x402e, 0x402f, + 0x402f, 0x4030, 0x4030, 0x4031, 0x4031, 0x4032, 0x4032, 0x4033, + 0x4033, 0x4034, 0x4035, 0x4035, 0x4036, 0x4036, 0x4037, 0x4037, + 0x4038, 0x4038, 0x4039, 0x4039, 0x403a, 0x403a, 0x403b, 0x403b, + 0x403c, 0x403c, 0x403d, 0x403d, 0x403e, 0x403f, 0x403f, 0x4040, + 0x4040, 0x4041, 0x4041, 0x4042, 0x4042, 0x4043, 0x4043, 0x4044, + 0x4044, 0x4045, 0x4045, 0x4046, 0x4047, 0x4047, 0x4048, 0x4048, + 0x4049, 0x4049, 0x404a, 0x404a, 0x404b, 0x404b, 0x404c, 0x404c, + 0x404d, 0x404e, 0x404e, 0x404f, 0x404f, 0x4050, 0x4050, 0x4051, + 0x4051, 0x4052, 0x4052, 0x4053, 0x4053, 0x4054, 0x4055, 0x4055, + 0x4056, 0x4056, 0x4057, 0x4057, 0x4058, 0x4058, 0x4059, 0x4059, + 0x405a, 0x405a, 0x405b, 0x405c, 0x405c, 0x405d, 0x405d, 0x405e, + 0x405e, 0x405f, 0x405f, 0x4060, 0x4060, 0x4061, 0x4062, 0x4062, + 0x4063, 0x4063, 0x4064, 0x4064, 0x4065, 0x4065, 0x4066, 0x4067, + 0x4067, 0x4068, 0x4068, 0x4069, 0x4069, 0x406a, 0x406a, 0x406b, + 0x406b, 0x406c, 0x406d, 0x406d, 0x406e, 0x406e, 0x406f, 0x406f, + 0x4070, 0x4070, 0x4071, 0x4072, 0x4072, 0x4073, 0x4073, 0x4074, + 0x4074, 0x4075, 0x4075, 0x4076, 0x4077, 0x4077, 0x4078, 0x4078, + 0x4079, 0x4079, 0x407a, 0x407b, 0x407b, 0x407c, 0x407c, 0x407d, + 0x407d, 0x407e, 0x407e, 0x407f, 0x4080, 0x4080, 0x4081, 0x4081, + 0x4082, 0x4082, 0x4083, 0x4084, 0x4084, 0x4085, 0x4085, 0x4086, + 0x4086, 0x4087, 0x4087, 0x4088, 0x4089, 0x4089, 0x408a, 0x408a, + 0x408b, 0x408b, 0x408c, 0x408d, 0x408d, 0x408e, 0x408e, 0x408f, + 0x408f, 0x4090, 0x4091, 0x4091, 0x4092, 0x4092, 0x4093, 0x4093, + 0x4094, 0x4095, 0x4095, 0x4096, 0x4096, 0x4097, 0x4097, 0x4098, + 0x4099, 0x4099, 0x409a, 0x409a, 0x409b, 0x409b, 0x409c, 0x409d, + 0x409d, 0x409e, 0x409e, 0x409f, 0x409f, 0x40a0, 0x40a1, 0x40a1, + 0x40a2, 0x40a2, 0x40a3, 0x40a4, 0x40a4, 0x40a5, 0x40a5, 0x40a6, + 0x40a6, 0x40a7, 0x40a8, 0x40a8, 0x40a9, 0x40a9, 0x40aa, 0x40ab, + 0x40ab, 0x40ac, 0x40ac, 0x40ad, 0x40ad, 0x40ae, 0x40af, 0x40af, + 0x40b0, 0x40b0, 0x40b1, 0x40b2, 0x40b2, 0x40b3, 0x40b3, 0x40b4, + 0x40b4, 0x40b5, 0x40b6, 0x40b6, 0x40b7, 0x40b7, 0x40b8, 0x40b9, + 0x40b9, 0x40ba, 0x40ba, 0x40bb, 0x40bc, 0x40bc, 0x40bd, 0x40bd, + 0x40be, 0x40bf, 0x40bf, 0x40c0, 0x40c0, 0x40c1, 0x40c1, 0x40c2, + 0x40c3, 0x40c3, 0x40c4, 0x40c4, 0x40c5, 0x40c6, 0x40c6, 0x40c7, + 0x40c7, 0x40c8, 0x40c9, 0x40c9, 0x40ca, 0x40ca, 0x40cb, 0x40cc, + 0x40cc, 0x40cd, 0x40cd, 0x40ce, 0x40cf, 0x40cf, 0x40d0, 0x40d0, + 0x40d1, 0x40d2, 0x40d2, 0x40d3, 0x40d3, 0x40d4, 0x40d5, 0x40d5, + 0x40d6, 0x40d6, 0x40d7, 0x40d8, 0x40d8, 0x40d9, 0x40d9, 0x40da, + 0x40db, 0x40db, 0x40dc, 0x40dd, 0x40dd, 0x40de, 0x40de, 0x40df, + 0x40e0, 0x40e0, 0x40e1, 0x40e1, 0x40e2, 0x40e3, 0x40e3, 0x40e4, + 0x40e4, 0x40e5, 0x40e6, 0x40e6, 0x40e7, 0x40e8, 0x40e8, 0x40e9, + 0x40e9, 0x40ea, 0x40eb, 0x40eb, 0x40ec, 0x40ec, 0x40ed, 0x40ee, + 0x40ee, 0x40ef, 0x40f0, 0x40f0, 0x40f1, 0x40f1, 0x40f2, 0x40f3, + 0x40f3, 0x40f4, 0x40f4, 0x40f5, 0x40f6, 0x40f6, 0x40f7, 0x40f8, + 0x40f8, 0x40f9, 0x40f9, 0x40fa, 0x40fb, 0x40fb, 0x40fc, 0x40fd, + 0x40fd, 0x40fe, 0x40fe, 0x40ff, 0x4100, 0x4100, 0x4101, 0x4102, + 0x4102, 0x4103, 0x4103, 0x4104, 0x4105, 0x4105, 0x4106, 0x4107, + 0x4107, 0x4108, 0x4108, 0x4109, 0x410a, 0x410a, 0x410b, 0x410c, + 0x410c, 0x410d, 0x410d, 0x410e, 0x410f, 0x410f, 0x4110, 0x4111, + 0x4111, 0x4112, 0x4113, 0x4113, 0x4114, 0x4114, 0x4115, 0x4116, + 0x4116, 0x4117, 0x4118, 0x4118, 0x4119, 0x411a, 0x411a, 0x411b, + 0x411b, 0x411c, 0x411d, 0x411d, 0x411e, 0x411f, 0x411f, 0x4120, + 0x4121, 0x4121, 0x4122, 0x4122, 0x4123, 0x4124, 0x4124, 0x4125, + 0x4126, 0x4126, 0x4127, 0x4128, 0x4128, 0x4129, 0x412a, 0x412a, + 0x412b, 0x412b, 0x412c, 0x412d, 0x412d, 0x412e, 0x412f, 0x412f, + 0x4130, 0x4131, 0x4131, 0x4132, 0x4133, 0x4133, 0x4134, 0x4135, + 0x4135, 0x4136, 0x4137, 0x4137, 0x4138, 0x4138, 0x4139, 0x413a, + 0x413a, 0x413b, 0x413c, 0x413c, 0x413d, 0x413e, 0x413e, 0x413f, + 0x4140, 0x4140, 0x4141, 0x4142, 0x4142, 0x4143, 0x4144, 0x4144, + 0x4145, 0x4146, 0x4146, 0x4147, 0x4148, 0x4148, 0x4149, 0x414a, + 0x414a, 0x414b, 0x414c, 0x414c, 0x414d, 0x414e, 0x414e, 0x414f, + 0x4150, 0x4150, 0x4151, 0x4152, 0x4152, 0x4153, 0x4154, 0x4154, + 0x4155, 0x4156, 0x4156, 0x4157, 0x4158, 0x4158, 0x4159, 0x415a, + 0x415a, 0x415b, 0x415c, 0x415c, 0x415d, 0x415e, 0x415e, 0x415f, + 0x4160, 0x4160, 0x4161, 0x4162, 0x4162, 0x4163, 0x4164, 0x4164, + 0x4165, 0x4166, 0x4166, 0x4167, 0x4168, 0x4168, 0x4169, 0x416a, + 0x416a, 0x416b, 0x416c, 0x416c, 0x416d, 0x416e, 0x416e, 0x416f, + 0x4170, 0x4171, 0x4172, 0x4174, 0x4175, 0x4177, 0x4178, 0x4179, + 0x417b, 0x417c, 0x417d, 0x417f, 0x4180, 0x4182, 0x4183, 0x4184, + 0x4186, 0x4187, 0x4188, 0x418a, 0x418b, 0x418d, 0x418e, 0x418f, + 0x4191, 0x4192, 0x4194, 0x4195, 0x4196, 0x4198, 0x4199, 0x419b, + 0x419c, 0x419d, 0x419f, 0x41a0, 0x41a2, 0x41a3, 0x41a4, 0x41a6, + 0x41a7, 0x41a9, 0x41aa, 0x41ab, 0x41ad, 0x41ae, 0x41b0, 0x41b1, + 0x41b3, 0x41b4, 0x41b5, 0x41b7, 0x41b8, 0x41ba, 0x41bb, 0x41bd, + 0x41be, 0x41bf, 0x41c1, 0x41c2, 0x41c4, 0x41c5, 0x41c7, 0x41c8, + 0x41ca, 0x41cb, 0x41cc, 0x41ce, 0x41cf, 0x41d1, 0x41d2, 0x41d4, + 0x41d5, 0x41d7, 0x41d8, 0x41da, 0x41db, 0x41dc, 0x41de, 0x41df, + 0x41e1, 0x41e2, 0x41e4, 0x41e5, 0x41e7, 0x41e8, 0x41ea, 0x41eb, + 0x41ed, 0x41ee, 0x41f0, 0x41f1, 0x41f3, 0x41f4, 0x41f6, 0x41f7, + 0x41f9, 0x41fa, 0x41fc, 0x41fd, 0x41ff, 0x4200, 0x4202, 0x4203, + 0x4205, 0x4206, 0x4208, 0x4209, 0x420b, 0x420c, 0x420e, 0x420f, + 0x4211, 0x4212, 0x4214, 0x4215, 0x4217, 0x4218, 0x421a, 0x421b, + 0x421d, 0x421e, 0x4220, 0x4221, 0x4223, 0x4224, 0x4226, 0x4228, + 0x4229, 0x422b, 0x422c, 0x422e, 0x422f, 0x4231, 0x4232, 0x4234, + 0x4235, 0x4237, 0x4239, 0x423a, 0x423c, 0x423d, 0x423f, 0x4240, + 0x4242, 0x4243, 0x4245, 0x4247, 0x4248, 0x424a, 0x424b, 0x424d, + 0x424e, 0x4250, 0x4252, 0x4253, 0x4255, 0x4256, 0x4258, 0x425a, + 0x425b, 0x425d, 0x425e, 0x4260, 0x4262, 0x4263, 0x4265, 0x4266, + 0x4268, 0x4269, 0x426b, 0x426d, 0x426e, 0x4270, 0x4272, 0x4273, + 0x4275, 0x4276, 0x4278, 0x427a, 0x427b, 0x427d, 0x427e, 0x4280, + 0x4282, 0x4283, 0x4285, 0x4287, 0x4288, 0x428a, 0x428c, 0x428d, + 0x428f, 0x4290, 0x4292, 0x4294, 0x4295, 0x4297, 0x4299, 0x429a, + 0x429c, 0x429e, 0x429f, 0x42a1, 0x42a3, 0x42a4, 0x42a6, 0x42a8, + 0x42a9, 0x42ab, 0x42ad, 0x42ae, 0x42b0, 0x42b2, 0x42b3, 0x42b5, + 0x42b7, 0x42b8, 0x42ba, 0x42bc, 0x42bd, 0x42bf, 0x42c1, 0x42c2, + 0x42c4, 0x42c6, 0x42c7, 0x42c9, 0x42cb, 0x42cd, 0x42ce, 0x42d0, + 0x42d2, 0x42d3, 0x42d5, 0x42d7, 0x42d8, 0x42da, 0x42dc, 0x42de, + 0x42df, 0x42e1, 0x42e3, 0x42e5, 0x42e6, 0x42e8, 0x42ea, 0x42eb, + 0x42ed, 0x42ef, 0x42f1, 0x42f2, 0x42f4, 0x42f6, 0x42f8, 0x42f9, + 0x42fb, 0x42fd, 0x42ff, 0x4300, 0x4302, 0x4304, 0x4306, 0x4307, + 0x4309, 0x430b, 0x430d, 0x430e, 0x4310, 0x4312, 0x4314, 0x4315, + 0x4317, 0x4319, 0x431b, 0x431d, 0x431e, 0x4320, 0x4322, 0x4324, + 0x4325, 0x4327, 0x4329, 0x432b, 0x432d, 0x432e, 0x4330, 0x4332, + 0x4334, 0x4336, 0x4337, 0x4339, 0x433b, 0x433d, 0x433f, 0x4340, + 0x4342, 0x4344, 0x4346, 0x4348, 0x434a, 0x434b, 0x434d, 0x434f, + 0x4351, 0x4353, 0x4354, 0x4356, 0x4358, 0x435a, 0x435c, 0x435e, + 0x4360, 0x4361, 0x4363, 0x4365, 0x4367, 0x4369, 0x436b, 0x436c, + 0x436e, 0x4370, 0x4372, 0x4374, 0x4376, 0x4378, 0x4379, 0x437b, + 0x437d, 0x437f, 0x4381, 0x4383, 0x4385, 0x4387, 0x4388, 0x438a, + 0x438c, 0x438e, 0x4390, 0x4392, 0x4394, 0x4396, 0x4398, 0x439a, + 0x439b, 0x439d, 0x439f, 0x43a1, 0x43a3, 0x43a5, 0x43a7, 0x43a9, + 0x43ab, 0x43ad, 0x43af, 0x43b0, 0x43b2, 0x43b4, 0x43b6, 0x43b8, + 0x43ba, 0x43bc, 0x43be, 0x43c0, 0x43c2, 0x43c4, 0x43c6, 0x43c8, + 0x43ca, 0x43cc, 0x43ce, 0x43cf, 0x43d1, 0x43d3, 0x43d5, 0x43d7, + 0x43d9, 0x43db, 0x43dd, 0x43df, 0x43e1, 0x43e3, 0x43e5, 0x43e7, + 0x43e9, 0x43eb, 0x43ed, 0x43ef, 0x43f1, 0x43f3, 0x43f5, 0x43f7, + 0x43f9, 0x43fb, 0x43fd, 0x43ff, 0x4400, 0x4401, 0x4402, 0x4403, + 0x4404, 0x4405, 0x4406, 0x4407, 0x4408, 0x4409, 0x440a, 0x440b, + 0x440d, 0x440e, 0x440f, 0x4410, 0x4411, 0x4412, 0x4413, 0x4414, + 0x4415, 0x4416, 0x4417, 0x4418, 0x4419, 0x441a, 0x441b, 0x441c, + 0x441d, 0x441e, 0x441f, 0x4420, 0x4421, 0x4422, 0x4423, 0x4424, + 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, + 0x442d, 0x442e, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, + 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, + 0x443e, 0x443f, 0x4440, 0x4441, 0x4443, 0x4444, 0x4445, 0x4446, + 0x4447, 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, + 0x444f, 0x4450, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, + 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445f, 0x4460, + 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, + 0x446a, 0x446b, 0x446c, 0x446d, 0x446e, 0x446f, 0x4470, 0x4471, + 0x4472, 0x4473, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, + 0x447b, 0x447c, 0x447e, 0x447f, 0x4480, 0x4481, 0x4482, 0x4483, + 0x4484, 0x4485, 0x4487, 0x4488, 0x4489, 0x448a, 0x448b, 0x448c, + 0x448d, 0x448f, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, 0x4495, + 0x4497, 0x4498, 0x4499, 0x449a, 0x449b, 0x449c, 0x449d, 0x449f, + 0x44a0, 0x44a1, 0x44a2, 0x44a3, 0x44a4, 0x44a6, 0x44a7, 0x44a8, + 0x44a9, 0x44aa, 0x44ab, 0x44ad, 0x44ae, 0x44af, 0x44b0, 0x44b1, + 0x44b2, 0x44b4, 0x44b5, 0x44b6, 0x44b7, 0x44b8, 0x44b9, 0x44bb, + 0x44bc, 0x44bd, 0x44be, 0x44bf, 0x44c1, 0x44c2, 0x44c3, 0x44c4, + 0x44c5, 0x44c7, 0x44c8, 0x44c9, 0x44ca, 0x44cb, 0x44cc, 0x44ce, + 0x44cf, 0x44d0, 0x44d1, 0x44d2, 0x44d4, 0x44d5, 0x44d6, 0x44d7, + 0x44d9, 0x44da, 0x44db, 0x44dc, 0x44dd, 0x44df, 0x44e0, 0x44e1, + 0x44e2, 0x44e3, 0x44e5, 0x44e6, 0x44e7, 0x44e8, 0x44ea, 0x44eb, + 0x44ec, 0x44ed, 0x44ef, 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f5, + 0x44f6, 0x44f7, 0x44f8, 0x44fa, 0x44fb, 0x44fc, 0x44fd, 0x44ff, + 0x4500, 0x4501, 0x4502, 0x4504, 0x4505, 0x4506, 0x4507, 0x4509, + 0x450a, 0x450b, 0x450c, 0x450e, 0x450f, 0x4510, 0x4512, 0x4513, + 0x4514, 0x4515, 0x4517, 0x4518, 0x4519, 0x451a, 0x451c, 0x451d, + 0x451e, 0x4520, 0x4521, 0x4522, 0x4523, 0x4525, 0x4526, 0x4527, + 0x4529, 0x452a, 0x452b, 0x452c, 0x452e, 0x452f, 0x4530, 0x4532, + 0x4533, 0x4534, 0x4536, 0x4537, 0x4538, 0x4539, 0x453b, 0x453c, + 0x453d, 0x453f, 0x4540, 0x4541, 0x4543, 0x4544, 0x4545, 0x4547, + 0x4548, 0x4549, 0x454b, 0x454c, 0x454d, 0x454e, 0x4550, 0x4551, + 0x4552, 0x4554, 0x4555, 0x4556, 0x4558, 0x4559, 0x455a, 0x455c, + 0x455d, 0x455e, 0x4560, 0x4561, 0x4563, 0x4564, 0x4565, 0x4567, + 0x4568, 0x4569, 0x456b, 0x456c, 0x456d, 0x456f, 0x4570, 0x4571, + 0x4573, 0x4574, 0x4576, 0x4577, 0x4578, 0x457a, 0x457b, 0x457c, + 0x457e, 0x457f, 0x4580, 0x4582, 0x4583, 0x4585, 0x4586, 0x4587, + 0x4589, 0x458a, 0x458c, 0x458d, 0x458e, 0x4590, 0x4591, 0x4592, + 0x4594, 0x4595, 0x4597, 0x4598, 0x4599, 0x459b, 0x459c, 0x459e, + 0x459f, 0x45a0, 0x45a2, 0x45a3, 0x45a5, 0x45a6, 0x45a8, 0x45a9, + 0x45aa, 0x45ac, 0x45ad, 0x45af, 0x45b0, 0x45b1, 0x45b3, 0x45b4, + 0x45b6, 0x45b7, 0x45b9, 0x45ba, 0x45bb, 0x45bd, 0x45be, 0x45c0, + 0x45c1, 0x45c3, 0x45c4, 0x45c6, 0x45c7, 0x45c8, 0x45ca, 0x45cb, + 0x45cd, 0x45ce, 0x45d0, 0x45d1, 0x45d3, 0x45d4, 0x45d5, 0x45d7, + 0x45d8, 0x45da, 0x45db, 0x45dd, 0x45de, 0x45e0, 0x45e1, 0x45e3, + 0x45e4, 0x45e6, 0x45e7, 0x45e9, 0x45ea, 0x45eb, 0x45ed, 0x45ee, + 0x45f0, 0x45f1, 0x45f3, 0x45f4, 0x45f6, 0x45f7, 0x45f9, 0x45fa, + 0x45fc, 0x45fd, 0x45ff, 0x4600, 0x4602, 0x4603, 0x4605, 0x4606, + 0x4608, 0x4609, 0x460b, 0x460c, 0x460e, 0x460f, 0x4611, 0x4612, + 0x4614, 0x4616, 0x4617, 0x4619, 0x461a, 0x461c, 0x461d, 0x461f, + 0x4620, 0x4622, 0x4623, 0x4625, 0x4626, 0x4628, 0x4629, 0x462b, + 0x462c, 0x462e, 0x4630, 0x4631, 0x4633, 0x4634, 0x4636, 0x4637, + 0x4639, 0x463a, 0x463c, 0x463e, 0x463f, 0x4641, 0x4642, 0x4644, + 0x4645, 0x4647, 0x4649, 0x464a, 0x464c, 0x464d, 0x464f, 0x4650, + 0x4652, 0x4654, 0x4655, 0x4657, 0x4658, 0x465a, 0x465b, 0x465d, + 0x465f, 0x4660, 0x4662, 0x4663, 0x4665, 0x4667, 0x4668, 0x466a, + 0x466b, 0x466d, 0x466f, 0x4670, 0x4672, 0x4673, 0x4675, 0x4677, + 0x4678, 0x467a, 0x467c, 0x467d, 0x467f, 0x4680, 0x4682, 0x4684, + 0x4685, 0x4687, 0x4689, 0x468a, 0x468c, 0x468e, 0x468f, 0x4691, + 0x4692, 0x4694, 0x4696, 0x4697, 0x4699, 0x469b, 0x469c, 0x469e, + 0x46a0, 0x46a1, 0x46a3, 0x46a5, 0x46a6, 0x46a8, 0x46aa, 0x46ab, + 0x46ad, 0x46af, 0x46b0, 0x46b2, 0x46b4, 0x46b5, 0x46b7, 0x46b9, + 0x46ba, 0x46bc, 0x46be, 0x46bf, 0x46c1, 0x46c3, 0x46c4, 0x46c6, + 0x46c8, 0x46ca, 0x46cb, 0x46cd, 0x46cf, 0x46d0, 0x46d2, 0x46d4, + 0x46d5, 0x46d7, 0x46d9, 0x46db, 0x46dc, 0x46de, 0x46e0, 0x46e1, + 0x46e3, 0x46e5, 0x46e7, 0x46e8, 0x46ea, 0x46ec, 0x46ee, 0x46ef, + 0x46f1, 0x46f3, 0x46f4, 0x46f6, 0x46f8, 0x46fa, 0x46fb, 0x46fd, + 0x46ff, 0x4701, 0x4702, 0x4704, 0x4706, 0x4708, 0x4709, 0x470b, + 0x470d, 0x470f, 0x4711, 0x4712, 0x4714, 0x4716, 0x4718, 0x4719, + 0x471b, 0x471d, 0x471f, 0x4720, 0x4722, 0x4724, 0x4726, 0x4728, + 0x4729, 0x472b, 0x472d, 0x472f, 0x4731, 0x4732, 0x4734, 0x4736, + 0x4738, 0x473a, 0x473b, 0x473d, 0x473f, 0x4741, 0x4743, 0x4744, + 0x4746, 0x4748, 0x474a, 0x474c, 0x474e, 0x474f, 0x4751, 0x4753, + 0x4755, 0x4757, 0x4759, 0x475a, 0x475c, 0x475e, 0x4760, 0x4762, + 0x4764, 0x4767, 0x476b, 0x476f, 0x4772, 0x4776, 0x477a, 0x477e, + 0x4781, 0x4785, 0x4789, 0x478d, 0x4790, 0x4794, 0x4798, 0x479c, + 0x47a0, 0x47a3, 0x47a7, 0x47ab, 0x47af, 0x47b3, 0x47b7, 0x47bb, + 0x47be, 0x47c2, 0x47c6, 0x47ca, 0x47ce, 0x47d2, 0x47d6, 0x47da, + 0x47de, 0x47e2, 0x47e5, 0x47e9, 0x47ed, 0x47f1, 0x47f5, 0x47f9, + 0x47fd, 0x4801, 0x4803, 0x4805, 0x4807, 0x4809, 0x480b, 0x480d, + 0x480f, 0x4811, 0x4813, 0x4815, 0x4817, 0x4819, 0x481b, 0x481d, + 0x481f, 0x4821, 0x4823, 0x4825, 0x4827, 0x4829, 0x482c, 0x482e, + 0x4830, 0x4832, 0x4834, 0x4836, 0x4838, 0x483a, 0x483c, 0x483e, + 0x4841, 0x4843, 0x4845, 0x4847, 0x4849, 0x484b, 0x484d, 0x4850, + 0x4852, 0x4854, 0x4856, 0x4858, 0x485a, 0x485d, 0x485f, 0x4861, + 0x4863, 0x4865, 0x4868, 0x486a, 0x486c, 0x486e, 0x4870, 0x4873, + 0x4875, 0x4877, 0x4879, 0x487c, 0x487e, 0x4880, 0x4882, 0x4885, + 0x4887, 0x4889, 0x488b, 0x488e, 0x4890, 0x4892, 0x4894, 0x4897, + 0x4899, 0x489b, 0x489e, 0x48a0, 0x48a2, 0x48a5, 0x48a7, 0x48a9, + 0x48ac, 0x48ae, 0x48b0, 0x48b3, 0x48b5, 0x48b7, 0x48ba, 0x48bc, + 0x48be, 0x48c1, 0x48c3, 0x48c6, 0x48c8, 0x48ca, 0x48cd, 0x48cf, + 0x48d2, 0x48d4, 0x48d6, 0x48d9, 0x48db, 0x48de, 0x48e0, 0x48e3, + 0x48e5, 0x48e7, 0x48ea, 0x48ec, 0x48ef, 0x48f1, 0x48f4, 0x48f6, + 0x48f9, 0x48fb, 0x48fe, 0x4900, 0x4903, 0x4905, 0x4908, 0x490a, + 0x490d, 0x490f, 0x4912, 0x4914, 0x4917, 0x4919, 0x491c, 0x491f, + 0x4921, 0x4924, 0x4926, 0x4929, 0x492b, 0x492e, 0x4931, 0x4933, + 0x4936, 0x4938, 0x493b, 0x493e, 0x4940, 0x4943, 0x4946, 0x4948, + 0x494b, 0x494d, 0x4950, 0x4953, 0x4955, 0x4958, 0x495b, 0x495d, + 0x4960, 0x4963, 0x4966, 0x4968, 0x496b, 0x496e, 0x4970, 0x4973, + 0x4976, 0x4979, 0x497b, 0x497e, 0x4981, 0x4984, 0x4986, 0x4989, + 0x498c, 0x498f, 0x4991, 0x4994, 0x4997, 0x499a, 0x499d, 0x499f, + 0x49a2, 0x49a5, 0x49a8, 0x49ab, 0x49ad, 0x49b0, 0x49b3, 0x49b6, + 0x49b9, 0x49bc, 0x49bf, 0x49c1, 0x49c4, 0x49c7, 0x49ca, 0x49cd, + 0x49d0, 0x49d3, 0x49d6, 0x49d9, 0x49dc, 0x49df, 0x49e1, 0x49e4, + 0x49e7, 0x49ea, 0x49ed, 0x49f0, 0x49f3, 0x49f6, 0x49f9, 0x49fc, + 0x49ff, 0x4a02, 0x4a05, 0x4a08, 0x4a0b, 0x4a0e, 0x4a11, 0x4a14, + 0x4a17, 0x4a1a, 0x4a1d, 0x4a21, 0x4a24, 0x4a27, 0x4a2a, 0x4a2d, + 0x4a30, 0x4a33, 0x4a36, 0x4a39, 0x4a3c, 0x4a3f, 0x4a43, 0x4a46, + 0x4a49, 0x4a4c, 0x4a4f, 0x4a52, 0x4a55, 0x4a59, 0x4a5c, 0x4a5f, + 0x4a62, 0x4a65, 0x4a69, 0x4a6c, 0x4a6f, 0x4a72, 0x4a75, 0x4a79, + 0x4a7c, 0x4a7f, 0x4a82, 0x4a86, 0x4a89, 0x4a8c, 0x4a8f, 0x4a93, + 0x4a96, 0x4a99, 0x4a9d, 0x4aa0, 0x4aa3, 0x4aa7, 0x4aaa, 0x4aad, + 0x4ab1, 0x4ab4, 0x4ab7, 0x4abb, 0x4abe, 0x4ac1, 0x4ac5, 0x4ac8, + 0x4acc, 0x4acf, 0x4ad2, 0x4ad6, 0x4ad9, 0x4add, 0x4ae0, 0x4ae4, + 0x4ae7, 0x4aea, 0x4aee, 0x4af1, 0x4af5, 0x4af8, 0x4afc, 0x4aff, + 0x4b03, 0x4b06, 0x4b0a, 0x4b0d, 0x4b11, 0x4b14, 0x4b18, 0x4b1c, + 0x4b1f, 0x4b23, 0x4b26, 0x4b2a, 0x4b2d, 0x4b31, 0x4b35, 0x4b38, + 0x4b3c, 0x4b3f, 0x4b43, 0x4b47, 0x4b4a, 0x4b4e, 0x4b52, 0x4b55, + 0x4b59, 0x4b5d, 0x4b60, 0x4b64, 0x4b68, 0x4b6b, 0x4b6f, 0x4b73, + 0x4b77, 0x4b7a, 0x4b7e, 0x4b82, 0x4b86, 0x4b89, 0x4b8d, 0x4b91, + 0x4b95, 0x4b98, 0x4b9c, 0x4ba0, 0x4ba4, 0x4ba8, 0x4bac, 0x4baf, + 0x4bb3, 0x4bb7, 0x4bbb, 0x4bbf, 0x4bc3, 0x4bc7, 0x4bca, 0x4bce, + 0x4bd2, 0x4bd6, 0x4bda, 0x4bde, 0x4be2, 0x4be6, 0x4bea, 0x4bee, + 0x4bf2, 0x4bf6, 0x4bfa, 0x4bfe, 0x4c01, 0x4c03, 0x4c05, 0x4c07, + 0x4c09, 0x4c0b, 0x4c0d, 0x4c0f, 0x4c11, 0x4c13, 0x4c15, 0x4c17, + 0x4c19, 0x4c1b, 0x4c1d, 0x4c1f, 0x4c21, 0x4c23, 0x4c26, 0x4c28, + 0x4c2a, 0x4c2c, 0x4c2e, 0x4c30, 0x4c32, 0x4c34, 0x4c36, 0x4c38, + 0x4c3a, 0x4c3d, 0x4c3f, 0x4c41, 0x4c43, 0x4c45, 0x4c47, 0x4c49, + 0x4c4c, 0x4c4e, 0x4c50, 0x4c52, 0x4c54, 0x4c56, 0x4c58, 0x4c5b, + 0x4c5d, 0x4c5f, 0x4c61, 0x4c63, 0x4c66, 0x4c68, 0x4c6a, 0x4c6c, + 0x4c6e, 0x4c71, 0x4c73, 0x4c75, 0x4c77, 0x4c7a, 0x4c7c, 0x4c7e, + 0x4c80, 0x4c83, 0x4c85, 0x4c87, 0x4c89, 0x4c8c, 0x4c8e, 0x4c90, + 0x4c92, 0x4c95, 0x4c97, 0x4c99, 0x4c9c, 0x4c9e, 0x4ca0, 0x4ca3, + 0x4ca5, 0x4ca7, 0x4caa, 0x4cac, 0x4cae, 0x4cb1, 0x4cb3, 0x4cb5, + 0x4cb8, 0x4cba, 0x4cbc, 0x4cbf, 0x4cc1, 0x4cc3, 0x4cc6, 0x4cc8, + 0x4ccb, 0x4ccd, 0x4ccf, 0x4cd2, 0x4cd4, 0x4cd7, 0x4cd9, 0x4cdb, + 0x4cde, 0x4ce0, 0x4ce3, 0x4ce5, 0x4ce8, 0x4cea, 0x4ced, 0x4cef, + 0x4cf2, 0x4cf4, 0x4cf6, 0x4cf9, 0x4cfb, 0x4cfe, 0x4d00, 0x4d03, + 0x4d05, 0x4d08, 0x4d0b, 0x4d0d, 0x4d10, 0x4d12, 0x4d15, 0x4d17, + 0x4d1a, 0x4d1c, 0x4d1f, 0x4d21, 0x4d24, 0x4d27, 0x4d29, 0x4d2c, + 0x4d2e, 0x4d31, 0x4d33, 0x4d36, 0x4d39, 0x4d3b, 0x4d3e, 0x4d41, + 0x4d43, 0x4d46, 0x4d48, 0x4d4b, 0x4d4e, 0x4d50, 0x4d53, 0x4d56, + 0x4d58, 0x4d5b, 0x4d5e, 0x4d60, 0x4d63, 0x4d66, 0x4d69, 0x4d6b, + 0x4d6e, 0x4d71, 0x4d73, 0x4d76, 0x4d79, 0x4d7c, 0x4d7e, 0x4d81, + 0x4d84, 0x4d87, 0x4d89, 0x4d8c, 0x4d8f, 0x4d92, 0x4d94, 0x4d97, + 0x4d9a, 0x4d9d, 0x4da0, 0x4da2, 0x4da5, 0x4da8, 0x4dab, 0x4dae, + 0x4db1, 0x4db3, 0x4db6, 0x4db9, 0x4dbc, 0x4dbf, 0x4dc2, 0x4dc5, + 0x4dc8, 0x4dca, 0x4dcd, 0x4dd0, 0x4dd3, 0x4dd6, 0x4dd9, 0x4ddc, + 0x4ddf, 0x4de2, 0x4de5, 0x4de8, 0x4deb, 0x4dee, 0x4df1, 0x4df4, + 0x4df7, 0x4dfa, 0x4dfd, 0x4e00, 0x4e03, 0x4e06, 0x4e09, 0x4e0c, + 0x4e0f, 0x4e12, 0x4e15, 0x4e18, 0x4e1b, 0x4e1e, 0x4e21, 0x4e24, + 0x4e27, 0x4e2a, 0x4e2d, 0x4e30, 0x4e33, 0x4e36, 0x4e3a, 0x4e3d, + 0x4e40, 0x4e43, 0x4e46, 0x4e49, 0x4e4c, 0x4e4f, 0x4e53, 0x4e56, + 0x4e59, 0x4e5c, 0x4e5f, 0x4e63, 0x4e66, 0x4e69, 0x4e6c, 0x4e6f, + 0x4e73, 0x4e76, 0x4e79, 0x4e7c, 0x4e80, 0x4e83, 0x4e86, 0x4e89, + 0x4e8d, 0x4e90, 0x4e93, 0x4e96, 0x4e9a, 0x4e9d, 0x4ea0, 0x4ea4, + 0x4ea7, 0x4eaa, 0x4eae, 0x4eb1, 0x4eb4, 0x4eb8, 0x4ebb, 0x4ebe, + 0x4ec2, 0x4ec5, 0x4ec9, 0x4ecc, 0x4ecf, 0x4ed3, 0x4ed6, 0x4eda, + 0x4edd, 0x4ee0, 0x4ee4, 0x4ee7, 0x4eeb, 0x4eee, 0x4ef2, 0x4ef5, + 0x4ef9, 0x4efc, 0x4f00, 0x4f03, 0x4f07, 0x4f0a, 0x4f0e, 0x4f11, + 0x4f15, 0x4f18, 0x4f1c, 0x4f1f, 0x4f23, 0x4f27, 0x4f2a, 0x4f2e, + 0x4f31, 0x4f35, 0x4f39, 0x4f3c, 0x4f40, 0x4f43, 0x4f47, 0x4f4b, + 0x4f4e, 0x4f52, 0x4f56, 0x4f59, 0x4f5d, 0x4f61, 0x4f64, 0x4f68, + 0x4f6c, 0x4f70, 0x4f73, 0x4f77, 0x4f7b, 0x4f7e, 0x4f82, 0x4f86, + 0x4f8a, 0x4f8d, 0x4f91, 0x4f95, 0x4f99, 0x4f9d, 0x4fa0, 0x4fa4, + 0x4fa8, 0x4fac, 0x4fb0, 0x4fb4, 0x4fb7, 0x4fbb, 0x4fbf, 0x4fc3, + 0x4fc7, 0x4fcb, 0x4fcf, 0x4fd3, 0x4fd7, 0x4fdb, 0x4fde, 0x4fe2, + 0x4fe6, 0x4fea, 0x4fee, 0x4ff2, 0x4ff6, 0x4ffa, 0x4ffe, 0x5001, + 0x5003, 0x5005, 0x5007, 0x5009, 0x500b, 0x500d, 0x500f, 0x5011, + 0x5013, 0x5015, 0x5017, 0x5019, 0x501b, 0x501e, 0x5020, 0x5022, + 0x5024, 0x5026, 0x5028, 0x502a, 0x502c, 0x502e, 0x5030, 0x5032, + 0x5034, 0x5036, 0x5039, 0x503b, 0x503d, 0x503f, 0x5041, 0x5043, + 0x5045, 0x5047, 0x504a, 0x504c, 0x504e, 0x5050, 0x5052, 0x5054, + 0x5057, 0x5059, 0x505b, 0x505d, 0x505f, 0x5061, 0x5064, 0x5066, + 0x5068, 0x506a, 0x506c, 0x506f, 0x5071, 0x5073, 0x5075, 0x5078, + 0x507a, 0x507c, 0x507e, 0x5081, 0x5083, 0x5085, 0x5087, 0x508a, + 0x508c, 0x508e, 0x5090, 0x5093, 0x5095, 0x5097, 0x509a, 0x509c, + 0x509e, 0x50a0, 0x50a3, 0x50a5, 0x50a7, 0x50aa, 0x50ac, 0x50ae, + 0x50b1, 0x50b3, 0x50b5, 0x50b8, 0x50ba, 0x50bd, 0x50bf, 0x50c1, + 0x50c4, 0x50c6, 0x50c8, 0x50cb, 0x50cd, 0x50d0, 0x50d2, 0x50d4, + 0x50d7, 0x50d9, 0x50dc, 0x50de, 0x50e1, 0x50e3, 0x50e6, 0x50e8, + 0x50ea, 0x50ed, 0x50ef, 0x50f2, 0x50f4, 0x50f7, 0x50f9, 0x50fc, + 0x50fe, 0x5101, 0x5103, 0x5106, 0x5108, 0x510b, 0x510d, 0x5110, + 0x5112, 0x5115, 0x5117, 0x511a, 0x511d, 0x511f, 0x5122, 0x5124, + 0x5127, 0x5129, 0x512c, 0x512f, 0x5131, 0x5134, 0x5136, 0x5139, + 0x513c, 0x513e, 0x5141, 0x5143, 0x5146, 0x5149, 0x514b, 0x514e, + 0x5151, 0x5153, 0x5156, 0x5159, 0x515b, 0x515e, 0x5161, 0x5163, + 0x5166, 0x5169, 0x516c, 0x516e, 0x5171, 0x5174, 0x5176, 0x5179, + 0x517c, 0x517f, 0x5181, 0x5184, 0x5187, 0x518a, 0x518c, 0x518f, + 0x5192, 0x5195, 0x5198, 0x519a, 0x519d, 0x51a0, 0x51a3, 0x51a6, + 0x51a8, 0x51ab, 0x51ae, 0x51b1, 0x51b4, 0x51b7, 0x51ba, 0x51bc, + 0x51bf, 0x51c2, 0x51c5, 0x51c8, 0x51cb, 0x51ce, 0x51d1, 0x51d3, + 0x51d6, 0x51d9, 0x51dc, 0x51df, 0x51e2, 0x51e5, 0x51e8, 0x51eb, + 0x51ee, 0x51f1, 0x51f4, 0x51f7, 0x51fa, 0x51fd, 0x5200, 0x5203, + 0x5206, 0x5209, 0x520c, 0x520f, 0x5212, 0x5215, 0x5218, 0x521b, + 0x521e, 0x5221, 0x5224, 0x5227, 0x522a, 0x522d, 0x5231, 0x5234, + 0x5237, 0x523a, 0x523d, 0x5240, 0x5243, 0x5246, 0x524a, 0x524d, + 0x5250, 0x5253, 0x5256, 0x5259, 0x525d, 0x5260, 0x5263, 0x5266, + 0x5269, 0x526c, 0x5270, 0x5273, 0x5276, 0x5279, 0x527d, 0x5280, + 0x5283, 0x5286, 0x528a, 0x528d, 0x5290, 0x5293, 0x5297, 0x529a, + 0x529d, 0x52a1, 0x52a4, 0x52a7, 0x52ab, 0x52ae, 0x52b1, 0x52b5, + 0x52b8, 0x52bb, 0x52bf, 0x52c2, 0x52c6, 0x52c9, 0x52cc, 0x52d0, + 0x52d3, 0x52da, 0x52e1, 0x52e8, 0x52ef, 0x52f6, 0x52fd, 0x5304, + 0x530b, 0x5312, 0x5319, 0x5320, 0x5327, 0x532e, 0x5335, 0x533d, + 0x5344, 0x534b, 0x5352, 0x535a, 0x5361, 0x5369, 0x5370, 0x5377, + 0x537f, 0x5386, 0x538e, 0x5395, 0x539d, 0x53a5, 0x53ac, 0x53b4, + 0x53bc, 0x53c4, 0x53cb, 0x53d3, 0x53db, 0x53e3, 0x53eb, 0x53f3, + 0x53fb, 0x5401, 0x5405, 0x5409, 0x540d, 0x5411, 0x5416, 0x541a, + 0x541e, 0x5422, 0x5426, 0x542a, 0x542e, 0x5433, 0x5437, 0x543b, + 0x543f, 0x5443, 0x5448, 0x544c, 0x5450, 0x5455, 0x5459, 0x545d, + 0x5462, 0x5466, 0x546a, 0x546f, 0x5473, 0x5478, 0x547c, 0x5481, + 0x5485, 0x548a, 0x548e, 0x5493, 0x5498, 0x549c, 0x54a1, 0x54a5, + 0x54aa, 0x54af, 0x54b3, 0x54b8, 0x54bd, 0x54c2, 0x54c6, 0x54cb, + 0x54d0, 0x54d5, 0x54da, 0x54de, 0x54e3, 0x54e8, 0x54ed, 0x54f2, + 0x54f7, 0x54fc, 0x5501, 0x5506, 0x550b, 0x5510, 0x5515, 0x551a, + 0x551f, 0x5525, 0x552a, 0x552f, 0x5534, 0x5539, 0x553e, 0x5544, + 0x5549, 0x554e, 0x5554, 0x5559, 0x555e, 0x5564, 0x5569, 0x556f, + 0x5574, 0x5579, 0x557f, 0x5584, 0x558a, 0x558f, 0x5595, 0x559b, + 0x55a0, 0x55a6, 0x55ac, 0x55b1, 0x55b7, 0x55bd, 0x55c2, 0x55c8, + 0x55ce, 0x55d4, 0x55da, 0x55e0, 0x55e5, 0x55eb, 0x55f1, 0x55f7, + 0x55fd, 0x5603, 0x5609, 0x560f, 0x5615, 0x561b, 0x5622, 0x5628, + 0x562e, 0x5634, 0x563a, 0x5640, 0x5647, 0x564d, 0x5653, 0x565a, + 0x5660, 0x5666, 0x566d, 0x5673, 0x567a, 0x5680, 0x5687, 0x568d, + 0x5694, 0x569a, 0x56a1, 0x56a8, 0x56ae, 0x56b5, 0x56bc, 0x56c3, + 0x56c9, 0x56d0, 0x56d7, 0x56de, 0x56e5, 0x56ec, 0x56f3, 0x56f9, + 0x5700, 0x5707, 0x570f, 0x5716, 0x571d, 0x5724, 0x572b, 0x5732, + 0x5739, 0x5741, 0x5748, 0x574f, 0x5756, 0x575e, 0x5765, 0x576d, + 0x5774, 0x577c, 0x5783, 0x578b, 0x5792, 0x579a, 0x57a1, 0x57a9, + 0x57b1, 0x57b8, 0x57c0, 0x57c8, 0x57d0, 0x57d7, 0x57df, 0x57e7, + 0x57ef, 0x57f7, 0x57ff, 0x5804, 0x5808, 0x580c, 0x5810, 0x5814, + 0x5818, 0x581c, 0x5820, 0x5824, 0x5828, 0x582c, 0x5831, 0x5835, + 0x5839, 0x583d, 0x5842, 0x5846, 0x584a, 0x584e, 0x5853, 0x5857, + 0x585b, 0x5860, 0x5864, 0x5869, 0x586d, 0x5871, 0x5876, 0x587a, + 0x587f, 0x5883, 0x5888, 0x588c, 0x5891, 0x5895, 0x589a, 0x589f, + 0x58a3, 0x58a8, 0x58ad, 0x58b1, 0x58b6, 0x58bb, 0x58bf, 0x58c4, + 0x58c9, 0x58ce, 0x58d3, 0x58d7, 0x58dc, 0x58e1, 0x58e6, 0x58eb, + 0x58f0, 0x58f5, 0x58fa, 0x58ff, 0x5904, 0x5909, 0x590e, 0x5913, + 0x5918, 0x591d, 0x5922, 0x5927, 0x592d, 0x5932, 0x5937, 0x593c, + 0x5941, 0x5947, 0x594c, 0x5951, 0x5957, 0x595c, 0x5961, 0x5967, + 0x596c, 0x5972, 0x5977, 0x597c, 0x5982, 0x5987, 0x598d, 0x5993, + 0x5998, 0x599e, 0x59a3, 0x59a9, 0x59af, 0x59b4, 0x59ba, 0x59c0, + 0x59c6, 0x59cb, 0x59d1, 0x59d7, 0x59dd, 0x59e3, 0x59e9, 0x59ef, + 0x59f5, 0x59fa, 0x5a00, 0x5a07, 0x5a0d, 0x5a13, 0x5a19, 0x5a1f, + 0x5a25, 0x5a2b, 0x5a31, 0x5a37, 0x5a3e, 0x5a44, 0x5a4a, 0x5a51, + 0x5a57, 0x5a5d, 0x5a64, 0x5a6a, 0x5a70, 0x5a77, 0x5a7d, 0x5a84, + 0x5a8a, 0x5a91, 0x5a98, 0x5a9e, 0x5aa5, 0x5aab, 0x5ab2, 0x5ab9, + 0x5ac0, 0x5ac6, 0x5acd, 0x5ad4, 0x5adb, 0x5ae2, 0x5ae8, 0x5aef, + 0x5af6, 0x5afd, 0x5b04, 0x5b0b, 0x5b12, 0x5b1a, 0x5b21, 0x5b28, + 0x5b2f, 0x5b36, 0x5b3d, 0x5b45, 0x5b4c, 0x5b53, 0x5b5b, 0x5b62, + 0x5b69, 0x5b71, 0x5b78, 0x5b80, 0x5b87, 0x5b8f, 0x5b96, 0x5b9e, + 0x5ba6, 0x5bad, 0x5bb5, 0x5bbd, 0x5bc4, 0x5bcc, 0x5bd4, 0x5bdc, + 0x5be4, 0x5bec, 0x5bf4, 0x5bfb, 0x5c02, 0x5c06, 0x5c0a, 0x5c0e, + 0x5c12, 0x5c16, 0x5c1a, 0x5c1e, 0x5c22, 0x5c26, 0x5c2b, 0x5c2f, + 0x5c33, 0x5c37, 0x5c3b, 0x5c40, 0x5c44, 0x5c48, 0x5c4c, 0x5c51, + 0x5c55, 0x5c59, 0x5c5e, 0x5c62, 0x5c67, 0x5c6b, 0x5c6f, 0x5c74, + 0x5c78, 0x5c7d, 0x5c81, 0x5c86, 0x5c8a, 0x5c8f, 0x5c93, 0x5c98, + 0x5c9d, 0x5ca1, 0x5ca6, 0x5cab, 0x5caf, 0x5cb4, 0x5cb9, 0x5cbd, + 0x5cc2, 0x5cc7, 0x5ccc, 0x5cd0, 0x5cd5, 0x5cda, 0x5cdf, 0x5ce4, + 0x5ce9, 0x5cee, 0x5cf3, 0x5cf8, 0x5cfd, 0x5d02, 0x5d07, 0x5d0c, + 0x5d11, 0x5d16, 0x5d1b, 0x5d20, 0x5d25, 0x5d2a, 0x5d2f, 0x5d35, + 0x5d3a, 0x5d3f, 0x5d44, 0x5d4a, 0x5d4f, 0x5d54, 0x5d5a, 0x5d5f, + 0x5d64, 0x5d6a, 0x5d6f, 0x5d75, 0x5d7a, 0x5d80, 0x5d85, 0x5d8b, + 0x5d90, 0x5d96, 0x5d9b, 0x5da1, 0x5da7, 0x5dac, 0x5db2, 0x5db8, + 0x5dbd, 0x5dc3, 0x5dc9, 0x5dcf, 0x5dd4, 0x5dda, 0x5de0, 0x5de6, + 0x5dec, 0x5df2, 0x5df8, 0x5dfe, 0x5e04, 0x5e0a, 0x5e10, 0x5e16, + 0x5e1c, 0x5e22, 0x5e28, 0x5e2f, 0x5e35, 0x5e3b, 0x5e41, 0x5e47, + 0x5e4e, 0x5e54, 0x5e5a, 0x5e61, 0x5e67, 0x5e6e, 0x5e74, 0x5e7a, + 0x5e81, 0x5e87, 0x5e8e, 0x5e95, 0x5e9b, 0x5ea2, 0x5ea8, 0x5eaf, + 0x5eb6, 0x5ebd, 0x5ec3, 0x5eca, 0x5ed1, 0x5ed8, 0x5edf, 0x5ee5, + 0x5eec, 0x5ef3, 0x5efa, 0x5f01, 0x5f08, 0x5f0f, 0x5f16, 0x5f1d, + 0x5f25, 0x5f2c, 0x5f33, 0x5f3a, 0x5f41, 0x5f49, 0x5f50, 0x5f57, + 0x5f5f, 0x5f66, 0x5f6d, 0x5f75, 0x5f7c, 0x5f84, 0x5f8b, 0x5f93, + 0x5f9b, 0x5fa2, 0x5faa, 0x5fb1, 0x5fb9, 0x5fc1, 0x5fc9, 0x5fd0, + 0x5fd8, 0x5fe0, 0x5fe8, 0x5ff0, 0x5ff8, 0x6000, 0x6004, 0x6008, + 0x600c, 0x6010, 0x6014, 0x6018, 0x601c, 0x6020, 0x6025, 0x6029, + 0x602d, 0x6031, 0x6035, 0x603a, 0x603e, 0x6042, 0x6046, 0x604b, + 0x604f, 0x6053, 0x6057, 0x605c, 0x6060, 0x6065, 0x6069, 0x606d, + 0x6072, 0x6076, 0x607b, 0x607f, 0x6084, 0x6088, 0x608d, 0x6091, + 0x6096, 0x609b, 0x609f, 0x60a4, 0x60a8, 0x60ad, 0x60b2, 0x60b7, + 0x60bb, 0x60c0, 0x60c5, 0x60ca, 0x60ce, 0x60d3, 0x60d8, 0x60dd, + 0x60e2, 0x60e7, 0x60eb, 0x60f0, 0x60f5, 0x60fa, 0x60ff, 0x6104, + 0x6109, 0x610e, 0x6113, 0x6119, 0x611e, 0x6123, 0x6128, 0x612d, + 0x6132, 0x6137, 0x613d, 0x6142, 0x6147, 0x614d, 0x6152, 0x6157, + 0x615d, 0x6162, 0x6167, 0x616d, 0x6172, 0x6178, 0x617d, 0x6183, + 0x6188, 0x618e, 0x6193, 0x6199, 0x619e, 0x61a4, 0x61aa, 0x61af, + 0x61b5, 0x61bb, 0x61c0, 0x61c6, 0x61cc, 0x61d2, 0x61d8, 0x61de, + 0x61e3, 0x61e9, 0x61ef, 0x61f5, 0x61fb, 0x6201, 0x6207, 0x620d, + 0x6213, 0x6219, 0x621f, 0x6226, 0x622c, 0x6232, 0x6238, 0x623e, + 0x6245, 0x624b, 0x6251, 0x6258, 0x625e, 0x6264, 0x626b, 0x6271, + 0x6278, 0x627e, 0x6285, 0x628b, 0x6292, 0x6298, 0x629f, 0x62a5, + 0x62ac, 0x62b3, 0x62ba, 0x62c0, 0x62c7, 0x62ce, 0x62d5, 0x62db, + 0x62e2, 0x62e9, 0x62f0, 0x62f7, 0x62fe, 0x6305, 0x630c, 0x6313, + 0x631a, 0x6321, 0x6329, 0x6330, 0x6337, 0x633e, 0x6345, 0x634d, + 0x6354, 0x635b, 0x6363, 0x636a, 0x6372, 0x6379, 0x6380, 0x6388, + 0x6390, 0x6397, 0x639f, 0x63a6, 0x63ae, 0x63b6, 0x63bd, 0x63c5, + 0x63cd, 0x63d5, 0x63dd, 0x63e5, 0x63ec, 0x63f4, 0x63fc, 0x6402, + 0x6406, 0x640a, 0x640e, 0x6412, 0x6416, 0x641b, 0x641f, 0x6423, + 0x6427, 0x642b, 0x642f, 0x6433, 0x6438, 0x643c, 0x6440, 0x6444, + 0x6449, 0x644d, 0x6451, 0x6456, 0x645a, 0x645e, 0x6463, 0x6467, + 0x646b, 0x6470, 0x6474, 0x6479, 0x647d, 0x6482, 0x6486, 0x648b, + 0x648f, 0x6494, 0x6499, 0x649d, 0x64a2, 0x64a6, 0x64ab, 0x64b0, + 0x64b4, 0x64b9, 0x64be, 0x64c3, 0x64c7, 0x64cc, 0x64d1, 0x64d6, + 0x64db, 0x64e0, 0x64e4, 0x64e9, 0x64ee, 0x64f3, 0x64f8, 0x64fd, + 0x6502, 0x6507, 0x650c, 0x6511, 0x6516, 0x651b, 0x6520, 0x6526, + 0x652b, 0x6530, 0x6535, 0x653a, 0x6540, 0x6545, 0x654a, 0x654f, + 0x6555, 0x655a, 0x655f, 0x6565, 0x656a, 0x6570, 0x6575, 0x657b, + 0x6580, 0x6586, 0x658b, 0x6591, 0x6596, 0x659c, 0x65a1, 0x65a7, + 0x65ad, 0x65b2, 0x65b8, 0x65be, 0x65c4, 0x65c9, 0x65cf, 0x65d5, + 0x65db, 0x65e1, 0x65e7, 0x65ed, 0x65f3, 0x65f8, 0x65fe, 0x6604, + 0x660b, 0x6611, 0x6617, 0x661d, 0x6623, 0x6629, 0x662f, 0x6635, + 0x663c, 0x6642, 0x6648, 0x664e, 0x6655, 0x665b, 0x6661, 0x6668, + 0x666e, 0x6675, 0x667b, 0x6682, 0x6688, 0x668f, 0x6695, 0x669c, + 0x66a2, 0x66a9, 0x66b0, 0x66b7, 0x66bd, 0x66c4, 0x66cb, 0x66d2, + 0x66d8, 0x66df, 0x66e6, 0x66ed, 0x66f4, 0x66fb, 0x6702, 0x6709, + 0x6710, 0x6717, 0x671e, 0x6725, 0x672d, 0x6734, 0x673b, 0x6742, + 0x6749, 0x6751, 0x6758, 0x675f, 0x6767, 0x676e, 0x6776, 0x677d, + 0x6785, 0x678c, 0x6794, 0x679b, 0x67a3, 0x67ab, 0x67b2, 0x67ba, + 0x67c2, 0x67ca, 0x67d1, 0x67d9, 0x67e1, 0x67e9, 0x67f1, 0x67f9, + 0x6800, 0x6804, 0x6808, 0x680c, 0x6811, 0x6815, 0x6819, 0x681d, + 0x6821, 0x6825, 0x6829, 0x682d, 0x6832, 0x6836, 0x683a, 0x683e, + 0x6842, 0x6847, 0x684b, 0x684f, 0x6854, 0x6858, 0x685c, 0x6861, + 0x6865, 0x6869, 0x686e, 0x6872, 0x6877, 0x687b, 0x6880, 0x6884, + 0x6889, 0x688d, 0x6892, 0x6896, 0x689b, 0x68a0, 0x68a4, 0x68a9, + 0x68ae, 0x68b2, 0x68b7, 0x68bc, 0x68c0, 0x68c5, 0x68ca, 0x68cf, + 0x68d4, 0x68d8, 0x68dd, 0x68e2, 0x68e7, 0x68ec, 0x68f1, 0x68f6, + 0x68fb, 0x6900, 0x6905, 0x690a, 0x690f, 0x6914, 0x6919, 0x691e, + 0x6923, 0x6928, 0x692e, 0x6933, 0x6938, 0x693d, 0x6943, 0x6948, + 0x694d, 0x6952, 0x6958, 0x695d, 0x6962, 0x6968, 0x696d, 0x6973, + 0x6978, 0x697e, 0x6983, 0x6989, 0x698e, 0x6994, 0x6999, 0x699f, + 0x69a5, 0x69aa, 0x69b0, 0x69b6, 0x69bb, 0x69c1, 0x69c7, 0x69cd, + 0x69d2, 0x69de, 0x69ea, 0x69f6, 0x6a02, 0x6a0e, 0x6a1a, 0x6a26, + 0x6a33, 0x6a3f, 0x6a4c, 0x6a58, 0x6a65, 0x6a72, 0x6a7f, 0x6a8c, + 0x6a99, 0x6aa6, 0x6ab4, 0x6ac1, 0x6acf, 0x6adc, 0x6aea, 0x6af8, + 0x6b06, 0x6b14, 0x6b22, 0x6b30, 0x6b3f, 0x6b4d, 0x6b5c, 0x6b6b, + 0x6b7a, 0x6b89, 0x6b98, 0x6ba7, 0x6bb7, 0x6bc6, 0x6bd6, 0x6be5, + 0x6bf5, 0x6c03, 0x6c0b, 0x6c13, 0x6c1b, 0x6c23, 0x6c2c, 0x6c34, + 0x6c3c, 0x6c45, 0x6c4d, 0x6c56, 0x6c5f, 0x6c68, 0x6c70, 0x6c79, + 0x6c82, 0x6c8b, 0x6c94, 0x6c9e, 0x6ca7, 0x6cb0, 0x6cba, 0x6cc3, + 0x6ccd, 0x6cd6, 0x6ce0, 0x6cea, 0x6cf4, 0x6cfe, 0x6d08, 0x6d12, + 0x6d1c, 0x6d26, 0x6d31, 0x6d3b, 0x6d45, 0x6d50, 0x6d5b, 0x6d65, + 0x6d70, 0x6d7b, 0x6d86, 0x6d91, 0x6d9c, 0x6da8, 0x6db3, 0x6dbf, + 0x6dca, 0x6dd6, 0x6de1, 0x6ded, 0x6df9, 0x6e05, 0x6e11, 0x6e1d, + 0x6e2a, 0x6e36, 0x6e43, 0x6e4f, 0x6e5c, 0x6e69, 0x6e75, 0x6e82, + 0x6e8f, 0x6e9d, 0x6eaa, 0x6eb7, 0x6ec5, 0x6ed2, 0x6ee0, 0x6eee, + 0x6efc, 0x6f0a, 0x6f18, 0x6f26, 0x6f34, 0x6f43, 0x6f52, 0x6f60, + 0x6f6f, 0x6f7e, 0x6f8d, 0x6f9c, 0x6fab, 0x6fbb, 0x6fca, 0x6fda, + 0x6fea, 0x6ffa, 0x7005, 0x700d, 0x7015, 0x701d, 0x7025, 0x702e, + 0x7036, 0x703f, 0x7047, 0x7050, 0x7058, 0x7061, 0x706a, 0x7073, + 0x707c, 0x7085, 0x708e, 0x7097, 0x70a0, 0x70a9, 0x70b3, 0x70bc, + 0x70c6, 0x70cf, 0x70d9, 0x70e3, 0x70ed, 0x70f6, 0x7100, 0x710a, + 0x7115, 0x711f, 0x7129, 0x7133, 0x713e, 0x7148, 0x7153, 0x715e, + 0x7168, 0x7173, 0x717e, 0x7189, 0x7194, 0x71a0, 0x71ab, 0x71b6, + 0x71c2, 0x71cd, 0x71d9, 0x71e5, 0x71f1, 0x71fc, 0x7208, 0x7215, + 0x7221, 0x722d, 0x7239, 0x7246, 0x7253, 0x725f, 0x726c, 0x7279, + 0x7286, 0x7293, 0x72a0, 0x72ae, 0x72bb, 0x72c8, 0x72d6, 0x72e4, + 0x72f2, 0x7300, 0x730e, 0x731c, 0x732a, 0x7338, 0x7347, 0x7356, + 0x7364, 0x7373, 0x7382, 0x7391, 0x73a0, 0x73b0, 0x73bf, 0x73cf, + 0x73de, 0x73ee, 0x73fe, 0x7407, 0x740f, 0x7417, 0x7420, 0x7428, + 0x7430, 0x7439, 0x7441, 0x744a, 0x7452, 0x745b, 0x7464, 0x746c, + 0x7475, 0x747e, 0x7487, 0x7490, 0x749a, 0x74a3, 0x74ac, 0x74b5, + 0x74bf, 0x74c8, 0x74d2, 0x74dc, 0x74e5, 0x74ef, 0x74f9, 0x7503, + 0x750d, 0x7517, 0x7522, 0x752c, 0x7536, 0x7541, 0x754b, 0x7556, + 0x7561, 0x756b, 0x7576, 0x7581, 0x758c, 0x7597, 0x75a3, 0x75ae, + 0x75b9, 0x75c5, 0x75d1, 0x75dc, 0x75e8, 0x75f4, 0x7600, 0x760c, + 0x7618, 0x7624, 0x7631, 0x763d, 0x7649, 0x7656, 0x7663, 0x7670, + 0x767d, 0x768a, 0x7697, 0x76a4, 0x76b1, 0x76bf, 0x76cc, 0x76da, + 0x76e8, 0x76f6, 0x7703, 0x7712, 0x7720, 0x772e, 0x773c, 0x774b, + 0x775a, 0x7768, 0x7777, 0x7786, 0x7795, 0x77a5, 0x77b4, 0x77c3, + 0x77d3, 0x77e3, 0x77f3, 0x7801, 0x7809, 0x7811, 0x781a, 0x7822, + 0x782a, 0x7832, 0x783b, 0x7843, 0x784c, 0x7855, 0x785d, 0x7866, + 0x786f, 0x7878, 0x7881, 0x788a, 0x7893, 0x789c, 0x78a5, 0x78af, + 0x78b8, 0x78c2, 0x78cb, 0x78d5, 0x78de, 0x78e8, 0x78f2, 0x78fc, + 0x7906, 0x7910, 0x791a, 0x7924, 0x792f, 0x7939, 0x7944, 0x794e, + 0x7959, 0x7964, 0x796e, 0x7979, 0x7984, 0x798f, 0x799b, 0x79a6, + 0x79b1, 0x79bd, 0x79c8, 0x79d4, 0x79df, 0x79eb, 0x79f7, 0x7a03, + 0x7a0f, 0x7a1b, 0x7a28, 0x7a34, 0x7a40, 0x7a4d, 0x7a5a, 0x7a66, + 0x7a73, 0x7a80, 0x7a8d, 0x7a9a, 0x7aa8, 0x7ab5, 0x7ac2, 0x7ad0, + 0x7ade, 0x7aeb, 0x7af9, 0x7b07, 0x7b16, 0x7b24, 0x7b32, 0x7b41, + 0x7b4f, 0x7b5e, 0x7b6d, 0x7b7b, 0x7b8a, 0x7b9a, 0x7ba9, 0x7bb8, + 0x7bc8, 0x7bd7, 0x7be7, 0x7bf7, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, 0x7bff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, 0x3c00, + 0x3c00, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, 0x3bff, + 0x3bff, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, 0x3bfe, + 0x3bfe, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, 0x3bfd, + 0x3bfd, 0x3bfd, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, 0x3bfc, + 0x3bfc, 0x3bfc, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, 0x3bfb, + 0x3bfb, 0x3bfb, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, 0x3bfa, + 0x3bfa, 0x3bfa, 0x3bfa, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, + 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf9, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf8, + 0x3bf8, 0x3bf8, 0x3bf8, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf7, + 0x3bf7, 0x3bf7, 0x3bf7, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, + 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf6, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, + 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf5, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, + 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf4, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, + 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf3, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, + 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf2, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, 0x3bf1, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, + 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bf0, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, + 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bef, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, + 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bee, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, + 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bed, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, + 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3bec, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, 0x3beb, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, 0x3bea, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, 0x3be9, + 0x3be9, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, 0x3be8, + 0x3be8, 0x3be8, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, 0x3be7, + 0x3be7, 0x3be7, 0x3be7, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be6, + 0x3be6, 0x3be6, 0x3be6, 0x3be6, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be5, + 0x3be5, 0x3be5, 0x3be5, 0x3be5, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, + 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be4, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, + 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be3, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, + 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be2, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, 0x3be1, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, 0x3be0, + 0x3be0, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, 0x3bdf, + 0x3bdf, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, 0x3bde, + 0x3bde, 0x3bde, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, 0x3bdd, + 0x3bdd, 0x3bdd, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdc, + 0x3bdc, 0x3bdc, 0x3bdc, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, + 0x3bdb, 0x3bdb, 0x3bdb, 0x3bdb, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bda, + 0x3bda, 0x3bda, 0x3bda, 0x3bda, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, + 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd9, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, + 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd8, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, + 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd7, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, + 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd6, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, + 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd5, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, 0x3bd4, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, 0x3bd3, + 0x3bd3, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, 0x3bd2, + 0x3bd2, 0x3bd2, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, 0x3bd1, + 0x3bd1, 0x3bd1, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, 0x3bd0, + 0x3bd0, 0x3bd0, 0x3bd0, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, + 0x3bcf, 0x3bcf, 0x3bcf, 0x3bcf, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, + 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bce, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, + 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcd, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, + 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcc, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, + 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bcb, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, 0x3bca, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, 0x3bc9, + 0x3bc9, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, 0x3bc8, + 0x3bc8, 0x3bc8, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc7, + 0x3bc7, 0x3bc7, 0x3bc7, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, + 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc6, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, + 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc5, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, + 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc4, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, + 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc3, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, 0x3bc2, + 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, + 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, + 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, 0x3bc1, + 0x3bc1, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, + 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, 0x3bc0, + 0x3bc0, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, + 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, 0x3bbf, + 0x3bbf, 0x3bbf, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, + 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, 0x3bbe, + 0x3bbe, 0x3bbe, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, + 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbd, + 0x3bbd, 0x3bbd, 0x3bbd, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, + 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbc, + 0x3bbc, 0x3bbc, 0x3bbc, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, + 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, + 0x3bbb, 0x3bbb, 0x3bbb, 0x3bbb, 0x3bba, 0x3bba, 0x3bba, 0x3bba, + 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bba, + 0x3bba, 0x3bba, 0x3bba, 0x3bba, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, + 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, + 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb9, 0x3bb8, 0x3bb8, 0x3bb8, + 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, + 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb8, 0x3bb7, 0x3bb7, + 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, + 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb7, 0x3bb6, 0x3bb6, + 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, + 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb6, 0x3bb5, + 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, + 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb5, 0x3bb4, + 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, + 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, 0x3bb4, + 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, + 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, 0x3bb3, + 0x3bb3, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, + 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, 0x3bb2, + 0x3bb2, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, + 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, 0x3bb1, + 0x3bb1, 0x3bb1, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, + 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, 0x3bb0, + 0x3bb0, 0x3bb0, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, + 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, 0x3baf, + 0x3baf, 0x3baf, 0x3baf, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, + 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bae, + 0x3bae, 0x3bae, 0x3bae, 0x3bae, 0x3bad, 0x3bad, 0x3bad, 0x3bad, + 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bad, + 0x3bad, 0x3bad, 0x3bad, 0x3bad, 0x3bac, 0x3bac, 0x3bac, 0x3bac, + 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, + 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bac, 0x3bab, 0x3bab, 0x3bab, + 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, + 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3bab, 0x3baa, 0x3baa, + 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, + 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3baa, 0x3ba9, + 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, + 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba9, 0x3ba8, + 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, + 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, 0x3ba8, + 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, + 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, 0x3ba7, + 0x3ba7, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, + 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, 0x3ba6, + 0x3ba6, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, + 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, 0x3ba5, + 0x3ba5, 0x3ba5, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, + 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba4, + 0x3ba4, 0x3ba4, 0x3ba4, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, + 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, + 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba3, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, + 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, + 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, + 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, + 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba1, 0x3ba0, 0x3ba0, 0x3ba0, + 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, + 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3ba0, 0x3b9f, 0x3b9f, + 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, + 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9f, 0x3b9e, + 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, + 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, 0x3b9e, + 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, + 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, 0x3b9d, + 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, + 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, 0x3b9c, + 0x3b9c, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, + 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, 0x3b9b, + 0x3b9b, 0x3b9b, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, + 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, 0x3b9a, + 0x3b9a, 0x3b9a, 0x3b9a, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, + 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b99, + 0x3b99, 0x3b99, 0x3b99, 0x3b99, 0x3b98, 0x3b98, 0x3b98, 0x3b98, + 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, + 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b98, 0x3b97, 0x3b97, 0x3b97, + 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, + 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b97, 0x3b96, 0x3b96, + 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, + 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b96, 0x3b95, 0x3b95, + 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, + 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b95, 0x3b94, + 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, + 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, 0x3b94, + 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, + 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, 0x3b93, + 0x3b93, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, + 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, 0x3b92, + 0x3b92, 0x3b92, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, + 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, 0x3b91, + 0x3b91, 0x3b91, 0x3b91, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, + 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b90, + 0x3b90, 0x3b90, 0x3b90, 0x3b90, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, + 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, + 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8f, 0x3b8e, 0x3b8e, 0x3b8e, + 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, + 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8e, 0x3b8d, 0x3b8d, + 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, + 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8d, 0x3b8c, + 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, + 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, 0x3b8c, + 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, + 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, 0x3b8b, + 0x3b8b, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, + 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, 0x3b8a, + 0x3b8a, 0x3b8a, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, + 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, 0x3b89, + 0x3b89, 0x3b89, 0x3b89, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, + 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b88, + 0x3b88, 0x3b88, 0x3b88, 0x3b88, 0x3b87, 0x3b87, 0x3b87, 0x3b87, + 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, + 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b87, 0x3b86, 0x3b86, 0x3b86, + 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, + 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b86, 0x3b85, 0x3b85, + 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, + 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b85, 0x3b84, + 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b84, + 0x3b84, 0x3b84, 0x3b84, 0x3b84, 0x3b83, 0x3b83, 0x3b83, 0x3b83, + 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b83, 0x3b82, 0x3b82, 0x3b82, + 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b82, 0x3b81, 0x3b81, 0x3b81, + 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b81, 0x3b80, 0x3b80, + 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b80, 0x3b7f, 0x3b7f, + 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7f, 0x3b7e, + 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7e, 0x3b7d, + 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, 0x3b7d, + 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, 0x3b7c, + 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, 0x3b7b, + 0x3b7b, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, 0x3b7a, + 0x3b7a, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, 0x3b79, + 0x3b79, 0x3b79, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, 0x3b78, + 0x3b78, 0x3b78, 0x3b78, 0x3b77, 0x3b77, 0x3b77, 0x3b77, 0x3b77, + 0x3b77, 0x3b77, 0x3b77, 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b76, + 0x3b76, 0x3b76, 0x3b76, 0x3b76, 0x3b75, 0x3b75, 0x3b75, 0x3b75, + 0x3b75, 0x3b75, 0x3b75, 0x3b75, 0x3b74, 0x3b74, 0x3b74, 0x3b74, + 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b74, 0x3b73, 0x3b73, 0x3b73, + 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b73, 0x3b72, 0x3b72, + 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b72, 0x3b71, 0x3b71, + 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b71, 0x3b70, + 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b70, 0x3b6f, + 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, + 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, 0x3b6e, + 0x3b6e, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, 0x3b6d, + 0x3b6d, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, 0x3b6c, + 0x3b6c, 0x3b6c, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, 0x3b6b, + 0x3b6b, 0x3b6b, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, 0x3b6a, + 0x3b6a, 0x3b6a, 0x3b6a, 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b69, + 0x3b69, 0x3b69, 0x3b69, 0x3b69, 0x3b68, 0x3b68, 0x3b68, 0x3b68, + 0x3b68, 0x3b68, 0x3b68, 0x3b68, 0x3b67, 0x3b67, 0x3b67, 0x3b67, + 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b67, 0x3b66, 0x3b66, 0x3b66, + 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b66, 0x3b65, 0x3b65, + 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b65, 0x3b64, 0x3b64, + 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b64, 0x3b63, + 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, 0x3b63, + 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, 0x3b62, + 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, 0x3b61, + 0x3b61, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, 0x3b60, + 0x3b60, 0x3b60, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, 0x3b5f, + 0x3b5f, 0x3b5f, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5e, + 0x3b5e, 0x3b5e, 0x3b5e, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, + 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5d, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, + 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5c, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, + 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5b, 0x3b5a, 0x3b5a, 0x3b5a, + 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b5a, 0x3b59, 0x3b59, + 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b59, 0x3b58, 0x3b58, + 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b58, 0x3b57, + 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, 0x3b57, + 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, 0x3b56, + 0x3b56, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, 0x3b55, + 0x3b55, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, 0x3b54, + 0x3b54, 0x3b54, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, 0x3b53, + 0x3b53, 0x3b53, 0x3b53, 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b52, + 0x3b52, 0x3b52, 0x3b52, 0x3b52, 0x3b51, 0x3b51, 0x3b51, 0x3b51, + 0x3b51, 0x3b51, 0x3b51, 0x3b51, 0x3b50, 0x3b50, 0x3b50, 0x3b50, + 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b50, 0x3b4f, 0x3b4f, 0x3b4f, + 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4f, 0x3b4e, 0x3b4e, + 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4e, 0x3b4d, + 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4d, 0x3b4c, + 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, 0x3b4c, + 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, 0x3b4b, + 0x3b4b, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, 0x3b4a, + 0x3b4a, 0x3b4a, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, 0x3b49, + 0x3b49, 0x3b49, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, 0x3b48, + 0x3b48, 0x3b48, 0x3b48, 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b47, + 0x3b47, 0x3b47, 0x3b47, 0x3b47, 0x3b46, 0x3b46, 0x3b46, 0x3b46, + 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b46, 0x3b45, 0x3b45, 0x3b45, + 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b45, 0x3b44, 0x3b44, + 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b44, 0x3b43, 0x3b43, + 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b43, 0x3b42, + 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, 0x3b42, + 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, 0x3b41, + 0x3b41, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, 0x3b40, + 0x3b40, 0x3b40, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3f, + 0x3b3f, 0x3b3f, 0x3b3f, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3e, + 0x3b3e, 0x3b3e, 0x3b3e, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, + 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3d, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, + 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3c, 0x3b3b, 0x3b3b, 0x3b3b, + 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3a, 0x3b3a, + 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b3a, 0x3b39, + 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, 0x3b39, + 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, 0x3b38, + 0x3b38, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, 0x3b37, + 0x3b37, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, 0x3b36, + 0x3b36, 0x3b36, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, 0x3b35, + 0x3b35, 0x3b35, 0x3b35, 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b34, + 0x3b34, 0x3b34, 0x3b34, 0x3b34, 0x3b33, 0x3b33, 0x3b33, 0x3b33, + 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b33, 0x3b32, 0x3b32, 0x3b32, + 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b32, 0x3b31, 0x3b31, + 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b31, 0x3b30, + 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, 0x3b30, + 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, 0x3b2f, + 0x3b2f, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, 0x3b2e, + 0x3b2e, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, 0x3b2d, + 0x3b2d, 0x3b2d, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2c, + 0x3b2c, 0x3b2c, 0x3b2c, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, + 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2b, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, + 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b2a, 0x3b29, 0x3b29, 0x3b29, + 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b29, 0x3b28, 0x3b28, + 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b28, 0x3b27, + 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, 0x3b27, + 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, 0x3b26, + 0x3b26, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, 0x3b25, + 0x3b25, 0x3b25, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, 0x3b24, + 0x3b24, 0x3b24, 0x3b24, 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b23, + 0x3b23, 0x3b23, 0x3b23, 0x3b23, 0x3b22, 0x3b22, 0x3b22, 0x3b22, + 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b22, 0x3b21, 0x3b21, 0x3b21, + 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b21, 0x3b20, 0x3b20, + 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b20, 0x3b1f, + 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, 0x3b1f, + 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, 0x3b1e, + 0x3b1e, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, 0x3b1d, + 0x3b1d, 0x3b1d, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1c, + 0x3b1c, 0x3b1c, 0x3b1c, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, + 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1b, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, + 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b1a, 0x3b19, 0x3b19, 0x3b19, + 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b19, 0x3b18, 0x3b18, + 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b18, 0x3b17, + 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, 0x3b17, + 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, 0x3b16, + 0x3b16, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, 0x3b15, + 0x3b15, 0x3b15, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x3b14, + 0x3b14, 0x3b14, 0x3b14, 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b13, + 0x3b13, 0x3b13, 0x3b13, 0x3b13, 0x3b12, 0x3b12, 0x3b12, 0x3b12, + 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b12, 0x3b11, 0x3b11, 0x3b11, + 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b11, 0x3b10, 0x3b10, + 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b10, 0x3b0f, + 0x3b0f, 0x3b0f, 0x3b0f, 0x3b0f, 0x3b0e, 0x3b0e, 0x3b0e, 0x3b0e, + 0x3b0e, 0x3b0d, 0x3b0d, 0x3b0d, 0x3b0d, 0x3b0c, 0x3b0c, 0x3b0c, + 0x3b0c, 0x3b0c, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0b, 0x3b0a, + 0x3b0a, 0x3b0a, 0x3b0a, 0x3b09, 0x3b09, 0x3b09, 0x3b09, 0x3b09, + 0x3b08, 0x3b08, 0x3b08, 0x3b08, 0x3b07, 0x3b07, 0x3b07, 0x3b07, + 0x3b07, 0x3b06, 0x3b06, 0x3b06, 0x3b06, 0x3b05, 0x3b05, 0x3b05, + 0x3b05, 0x3b05, 0x3b04, 0x3b04, 0x3b04, 0x3b04, 0x3b03, 0x3b03, + 0x3b03, 0x3b03, 0x3b03, 0x3b02, 0x3b02, 0x3b02, 0x3b02, 0x3b02, + 0x3b01, 0x3b01, 0x3b01, 0x3b01, 0x3b00, 0x3b00, 0x3b00, 0x3b00, + 0x3b00, 0x3aff, 0x3aff, 0x3aff, 0x3aff, 0x3afe, 0x3afe, 0x3afe, + 0x3afe, 0x3afe, 0x3afd, 0x3afd, 0x3afd, 0x3afd, 0x3afc, 0x3afc, + 0x3afc, 0x3afc, 0x3afc, 0x3afb, 0x3afb, 0x3afb, 0x3afb, 0x3afb, + 0x3afa, 0x3afa, 0x3afa, 0x3afa, 0x3af9, 0x3af9, 0x3af9, 0x3af9, + 0x3af9, 0x3af8, 0x3af8, 0x3af8, 0x3af8, 0x3af7, 0x3af7, 0x3af7, + 0x3af7, 0x3af7, 0x3af6, 0x3af6, 0x3af6, 0x3af6, 0x3af6, 0x3af5, + 0x3af5, 0x3af5, 0x3af5, 0x3af4, 0x3af4, 0x3af4, 0x3af4, 0x3af4, + 0x3af3, 0x3af3, 0x3af3, 0x3af3, 0x3af2, 0x3af2, 0x3af2, 0x3af2, + 0x3af2, 0x3af1, 0x3af1, 0x3af1, 0x3af1, 0x3af1, 0x3af0, 0x3af0, + 0x3af0, 0x3af0, 0x3aef, 0x3aef, 0x3aef, 0x3aef, 0x3aef, 0x3aee, + 0x3aee, 0x3aee, 0x3aee, 0x3aed, 0x3aed, 0x3aed, 0x3aed, 0x3aed, + 0x3aec, 0x3aec, 0x3aec, 0x3aec, 0x3aec, 0x3aeb, 0x3aeb, 0x3aeb, + 0x3aeb, 0x3aea, 0x3aea, 0x3aea, 0x3aea, 0x3aea, 0x3ae9, 0x3ae9, + 0x3ae9, 0x3ae9, 0x3ae9, 0x3ae8, 0x3ae8, 0x3ae8, 0x3ae8, 0x3ae7, + 0x3ae7, 0x3ae7, 0x3ae7, 0x3ae7, 0x3ae6, 0x3ae6, 0x3ae6, 0x3ae6, + 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae5, 0x3ae4, 0x3ae4, 0x3ae4, + 0x3ae4, 0x3ae4, 0x3ae3, 0x3ae3, 0x3ae3, 0x3ae3, 0x3ae2, 0x3ae2, + 0x3ae2, 0x3ae2, 0x3ae2, 0x3ae1, 0x3ae1, 0x3ae1, 0x3ae1, 0x3ae1, + 0x3ae0, 0x3ae0, 0x3ae0, 0x3ae0, 0x3adf, 0x3adf, 0x3adf, 0x3adf, + 0x3adf, 0x3ade, 0x3ade, 0x3ade, 0x3ade, 0x3ade, 0x3add, 0x3add, + 0x3add, 0x3add, 0x3adc, 0x3adc, 0x3adc, 0x3adc, 0x3adc, 0x3adb, + 0x3adb, 0x3adb, 0x3adb, 0x3adb, 0x3ada, 0x3ada, 0x3ada, 0x3ada, + 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad9, 0x3ad8, 0x3ad8, 0x3ad8, + 0x3ad8, 0x3ad8, 0x3ad7, 0x3ad7, 0x3ad7, 0x3ad7, 0x3ad6, 0x3ad6, + 0x3ad6, 0x3ad6, 0x3ad6, 0x3ad5, 0x3ad5, 0x3ad5, 0x3ad5, 0x3ad5, + 0x3ad4, 0x3ad4, 0x3ad4, 0x3ad4, 0x3ad3, 0x3ad3, 0x3ad3, 0x3ad3, + 0x3ad3, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad2, 0x3ad1, 0x3ad1, + 0x3ad1, 0x3ad1, 0x3ad0, 0x3ad0, 0x3ad0, 0x3ad0, 0x3ad0, 0x3acf, + 0x3acf, 0x3acf, 0x3acf, 0x3acf, 0x3ace, 0x3ace, 0x3ace, 0x3ace, + 0x3ace, 0x3acd, 0x3acd, 0x3acd, 0x3acd, 0x3acc, 0x3acc, 0x3acc, + 0x3acc, 0x3acc, 0x3acb, 0x3acb, 0x3acb, 0x3acb, 0x3acb, 0x3aca, + 0x3aca, 0x3aca, 0x3aca, 0x3ac9, 0x3ac9, 0x3ac9, 0x3ac9, 0x3ac9, + 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac8, 0x3ac7, 0x3ac7, 0x3ac7, + 0x3ac7, 0x3ac7, 0x3ac6, 0x3ac6, 0x3ac6, 0x3ac6, 0x3ac5, 0x3ac5, + 0x3ac5, 0x3ac5, 0x3ac5, 0x3ac4, 0x3ac4, 0x3ac4, 0x3ac4, 0x3ac4, + 0x3ac3, 0x3ac3, 0x3ac3, 0x3ac3, 0x3ac2, 0x3ac2, 0x3ac2, 0x3ac2, + 0x3ac2, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac1, 0x3ac0, 0x3ac0, + 0x3ac0, 0x3ac0, 0x3ac0, 0x3abf, 0x3abf, 0x3abf, 0x3abf, 0x3abe, + 0x3abe, 0x3abe, 0x3abe, 0x3abe, 0x3abd, 0x3abd, 0x3abd, 0x3abd, + 0x3abd, 0x3abc, 0x3abc, 0x3abc, 0x3abc, 0x3abc, 0x3abb, 0x3abb, + 0x3abb, 0x3abb, 0x3aba, 0x3aba, 0x3aba, 0x3aba, 0x3aba, 0x3ab9, + 0x3ab9, 0x3ab9, 0x3ab9, 0x3ab9, 0x3ab8, 0x3ab8, 0x3ab8, 0x3ab8, + 0x3ab8, 0x3ab7, 0x3ab7, 0x3ab7, 0x3ab7, 0x3ab6, 0x3ab6, 0x3ab6, + 0x3ab6, 0x3ab6, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab5, 0x3ab4, + 0x3ab4, 0x3ab4, 0x3ab4, 0x3ab4, 0x3ab3, 0x3ab3, 0x3ab3, 0x3ab3, + 0x3ab3, 0x3ab2, 0x3ab2, 0x3ab2, 0x3ab2, 0x3ab1, 0x3ab1, 0x3ab1, + 0x3ab1, 0x3ab1, 0x3ab0, 0x3ab0, 0x3ab0, 0x3ab0, 0x3ab0, 0x3aaf, + 0x3aaf, 0x3aaf, 0x3aaf, 0x3aaf, 0x3aae, 0x3aae, 0x3aae, 0x3aae, + 0x3aad, 0x3aad, 0x3aad, 0x3aad, 0x3aad, 0x3aac, 0x3aac, 0x3aac, + 0x3aac, 0x3aac, 0x3aab, 0x3aab, 0x3aab, 0x3aab, 0x3aab, 0x3aaa, + 0x3aaa, 0x3aaa, 0x3aaa, 0x3aaa, 0x3aa9, 0x3aa9, 0x3aa9, 0x3aa9, + 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa8, 0x3aa7, 0x3aa7, 0x3aa7, + 0x3aa7, 0x3aa7, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa6, 0x3aa5, + 0x3aa5, 0x3aa5, 0x3aa5, 0x3aa5, 0x3aa4, 0x3aa4, 0x3aa4, 0x3aa4, + 0x3aa4, 0x3aa3, 0x3aa3, 0x3aa3, 0x3aa3, 0x3aa2, 0x3aa2, 0x3aa2, + 0x3aa2, 0x3aa2, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa1, 0x3aa0, + 0x3aa0, 0x3aa0, 0x3aa0, 0x3aa0, 0x3a9f, 0x3a9f, 0x3a9f, 0x3a9f, + 0x3a9f, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9e, 0x3a9d, 0x3a9d, + 0x3a9d, 0x3a9d, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9c, 0x3a9b, + 0x3a9b, 0x3a9b, 0x3a9b, 0x3a9b, 0x3a9a, 0x3a9a, 0x3a9a, 0x3a9a, + 0x3a9a, 0x3a99, 0x3a99, 0x3a99, 0x3a99, 0x3a99, 0x3a98, 0x3a98, + 0x3a98, 0x3a98, 0x3a98, 0x3a97, 0x3a97, 0x3a97, 0x3a97, 0x3a96, + 0x3a96, 0x3a96, 0x3a96, 0x3a96, 0x3a95, 0x3a95, 0x3a95, 0x3a95, + 0x3a95, 0x3a94, 0x3a94, 0x3a94, 0x3a94, 0x3a94, 0x3a93, 0x3a93, + 0x3a93, 0x3a93, 0x3a93, 0x3a92, 0x3a92, 0x3a92, 0x3a92, 0x3a92, + 0x3a91, 0x3a91, 0x3a91, 0x3a91, 0x3a91, 0x3a90, 0x3a90, 0x3a90, + 0x3a90, 0x3a90, 0x3a8f, 0x3a8f, 0x3a8f, 0x3a8f, 0x3a8e, 0x3a8e, + 0x3a8e, 0x3a8e, 0x3a8e, 0x3a8d, 0x3a8d, 0x3a8d, 0x3a8d, 0x3a8d, + 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8c, 0x3a8b, 0x3a8b, 0x3a8b, + 0x3a8b, 0x3a8b, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a8a, 0x3a89, + 0x3a89, 0x3a89, 0x3a89, 0x3a89, 0x3a88, 0x3a88, 0x3a88, 0x3a88, + 0x3a88, 0x3a87, 0x3a87, 0x3a87, 0x3a87, 0x3a87, 0x3a86, 0x3a86, + 0x3a86, 0x3a86, 0x3a85, 0x3a85, 0x3a85, 0x3a85, 0x3a85, 0x3a84, + 0x3a84, 0x3a84, 0x3a84, 0x3a84, 0x3a83, 0x3a83, 0x3a83, 0x3a83, + 0x3a83, 0x3a82, 0x3a82, 0x3a82, 0x3a82, 0x3a82, 0x3a81, 0x3a81, + 0x3a81, 0x3a81, 0x3a81, 0x3a80, 0x3a80, 0x3a80, 0x3a80, 0x3a80, + 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7f, 0x3a7e, 0x3a7e, 0x3a7e, + 0x3a7e, 0x3a7e, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7d, 0x3a7c, + 0x3a7c, 0x3a7c, 0x3a7c, 0x3a7c, 0x3a7b, 0x3a7b, 0x3a7b, 0x3a7b, + 0x3a7b, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a7a, 0x3a79, 0x3a79, + 0x3a79, 0x3a79, 0x3a78, 0x3a78, 0x3a78, 0x3a78, 0x3a78, 0x3a77, + 0x3a77, 0x3a77, 0x3a77, 0x3a77, 0x3a76, 0x3a76, 0x3a76, 0x3a76, + 0x3a76, 0x3a75, 0x3a75, 0x3a75, 0x3a75, 0x3a75, 0x3a74, 0x3a74, + 0x3a74, 0x3a74, 0x3a74, 0x3a73, 0x3a73, 0x3a73, 0x3a73, 0x3a73, + 0x3a72, 0x3a72, 0x3a72, 0x3a72, 0x3a72, 0x3a71, 0x3a71, 0x3a71, + 0x3a71, 0x3a71, 0x3a70, 0x3a70, 0x3a70, 0x3a70, 0x3a70, 0x3a6f, + 0x3a6f, 0x3a6f, 0x3a6f, 0x3a6f, 0x3a6e, 0x3a6e, 0x3a6e, 0x3a6e, + 0x3a6e, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6d, 0x3a6c, 0x3a6c, + 0x3a6c, 0x3a6c, 0x3a6c, 0x3a6b, 0x3a6b, 0x3a6b, 0x3a6b, 0x3a6b, + 0x3a6a, 0x3a6a, 0x3a6a, 0x3a6a, 0x3a6a, 0x3a69, 0x3a69, 0x3a69, + 0x3a69, 0x3a69, 0x3a68, 0x3a68, 0x3a68, 0x3a68, 0x3a68, 0x3a67, + 0x3a67, 0x3a67, 0x3a67, 0x3a67, 0x3a66, 0x3a66, 0x3a66, 0x3a66, + 0x3a66, 0x3a65, 0x3a65, 0x3a65, 0x3a65, 0x3a65, 0x3a64, 0x3a64, + 0x3a64, 0x3a64, 0x3a64, 0x3a63, 0x3a63, 0x3a63, 0x3a63, 0x3a63, + 0x3a62, 0x3a62, 0x3a62, 0x3a62, 0x3a62, 0x3a61, 0x3a61, 0x3a61, + 0x3a61, 0x3a61, 0x3a60, 0x3a60, 0x3a60, 0x3a60, 0x3a60, 0x3a5f, + 0x3a5f, 0x3a5f, 0x3a5f, 0x3a5f, 0x3a5e, 0x3a5e, 0x3a5e, 0x3a5e, + 0x3a5e, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5d, 0x3a5c, 0x3a5c, + 0x3a5c, 0x3a5c, 0x3a5c, 0x3a5b, 0x3a5b, 0x3a5b, 0x3a5b, 0x3a5b, + 0x3a5a, 0x3a5a, 0x3a5a, 0x3a5a, 0x3a5a, 0x3a59, 0x3a59, 0x3a59, + 0x3a59, 0x3a59, 0x3a58, 0x3a58, 0x3a58, 0x3a58, 0x3a58, 0x3a57, + 0x3a57, 0x3a57, 0x3a57, 0x3a57, 0x3a56, 0x3a56, 0x3a56, 0x3a56, + 0x3a56, 0x3a55, 0x3a55, 0x3a55, 0x3a55, 0x3a55, 0x3a54, 0x3a54, + 0x3a54, 0x3a54, 0x3a54, 0x3a54, 0x3a53, 0x3a53, 0x3a53, 0x3a53, + 0x3a53, 0x3a52, 0x3a52, 0x3a52, 0x3a52, 0x3a52, 0x3a51, 0x3a51, + 0x3a51, 0x3a51, 0x3a51, 0x3a50, 0x3a50, 0x3a50, 0x3a50, 0x3a50, + 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4f, 0x3a4e, 0x3a4e, 0x3a4e, + 0x3a4e, 0x3a4e, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4d, 0x3a4c, + 0x3a4c, 0x3a4c, 0x3a4c, 0x3a4c, 0x3a4b, 0x3a4b, 0x3a4b, 0x3a4b, + 0x3a4b, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a4a, 0x3a49, 0x3a49, + 0x3a49, 0x3a49, 0x3a49, 0x3a48, 0x3a48, 0x3a48, 0x3a48, 0x3a48, + 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a47, 0x3a46, 0x3a46, + 0x3a46, 0x3a46, 0x3a46, 0x3a45, 0x3a45, 0x3a45, 0x3a45, 0x3a45, + 0x3a44, 0x3a44, 0x3a44, 0x3a44, 0x3a44, 0x3a43, 0x3a43, 0x3a43, + 0x3a43, 0x3a43, 0x3a42, 0x3a42, 0x3a42, 0x3a42, 0x3a42, 0x3a41, + 0x3a41, 0x3a41, 0x3a41, 0x3a41, 0x3a40, 0x3a40, 0x3a40, 0x3a40, + 0x3a40, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3f, 0x3a3e, 0x3a3e, + 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3e, 0x3a3d, 0x3a3d, 0x3a3d, 0x3a3d, + 0x3a3d, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3c, 0x3a3b, 0x3a3b, + 0x3a3b, 0x3a3b, 0x3a3a, 0x3a3a, 0x3a39, 0x3a39, 0x3a39, 0x3a38, + 0x3a38, 0x3a37, 0x3a37, 0x3a37, 0x3a36, 0x3a36, 0x3a36, 0x3a35, + 0x3a35, 0x3a34, 0x3a34, 0x3a34, 0x3a33, 0x3a33, 0x3a32, 0x3a32, + 0x3a32, 0x3a31, 0x3a31, 0x3a31, 0x3a30, 0x3a30, 0x3a2f, 0x3a2f, + 0x3a2f, 0x3a2e, 0x3a2e, 0x3a2d, 0x3a2d, 0x3a2d, 0x3a2c, 0x3a2c, + 0x3a2b, 0x3a2b, 0x3a2b, 0x3a2a, 0x3a2a, 0x3a2a, 0x3a29, 0x3a29, + 0x3a28, 0x3a28, 0x3a28, 0x3a27, 0x3a27, 0x3a26, 0x3a26, 0x3a26, + 0x3a25, 0x3a25, 0x3a25, 0x3a24, 0x3a24, 0x3a23, 0x3a23, 0x3a23, + 0x3a22, 0x3a22, 0x3a21, 0x3a21, 0x3a21, 0x3a20, 0x3a20, 0x3a20, + 0x3a1f, 0x3a1f, 0x3a1e, 0x3a1e, 0x3a1e, 0x3a1d, 0x3a1d, 0x3a1d, + 0x3a1c, 0x3a1c, 0x3a1b, 0x3a1b, 0x3a1b, 0x3a1a, 0x3a1a, 0x3a19, + 0x3a19, 0x3a19, 0x3a18, 0x3a18, 0x3a18, 0x3a17, 0x3a17, 0x3a16, + 0x3a16, 0x3a16, 0x3a15, 0x3a15, 0x3a15, 0x3a14, 0x3a14, 0x3a13, + 0x3a13, 0x3a13, 0x3a12, 0x3a12, 0x3a11, 0x3a11, 0x3a11, 0x3a10, + 0x3a10, 0x3a10, 0x3a0f, 0x3a0f, 0x3a0e, 0x3a0e, 0x3a0e, 0x3a0d, + 0x3a0d, 0x3a0d, 0x3a0c, 0x3a0c, 0x3a0b, 0x3a0b, 0x3a0b, 0x3a0a, + 0x3a0a, 0x3a0a, 0x3a09, 0x3a09, 0x3a08, 0x3a08, 0x3a08, 0x3a07, + 0x3a07, 0x3a07, 0x3a06, 0x3a06, 0x3a05, 0x3a05, 0x3a05, 0x3a04, + 0x3a04, 0x3a04, 0x3a03, 0x3a03, 0x3a02, 0x3a02, 0x3a02, 0x3a01, + 0x3a01, 0x3a01, 0x3a00, 0x3a00, 0x39ff, 0x39ff, 0x39ff, 0x39fe, + 0x39fe, 0x39fe, 0x39fd, 0x39fd, 0x39fc, 0x39fc, 0x39fc, 0x39fb, + 0x39fb, 0x39fb, 0x39fa, 0x39fa, 0x39f9, 0x39f9, 0x39f9, 0x39f8, + 0x39f8, 0x39f8, 0x39f7, 0x39f7, 0x39f6, 0x39f6, 0x39f6, 0x39f5, + 0x39f5, 0x39f5, 0x39f4, 0x39f4, 0x39f3, 0x39f3, 0x39f3, 0x39f2, + 0x39f2, 0x39f2, 0x39f1, 0x39f1, 0x39f0, 0x39f0, 0x39f0, 0x39ef, + 0x39ef, 0x39ef, 0x39ee, 0x39ee, 0x39ed, 0x39ed, 0x39ed, 0x39ec, + 0x39ec, 0x39ec, 0x39eb, 0x39eb, 0x39eb, 0x39ea, 0x39ea, 0x39e9, + 0x39e9, 0x39e9, 0x39e8, 0x39e8, 0x39e8, 0x39e7, 0x39e7, 0x39e6, + 0x39e6, 0x39e6, 0x39e5, 0x39e5, 0x39e5, 0x39e4, 0x39e4, 0x39e4, + 0x39e3, 0x39e3, 0x39e2, 0x39e2, 0x39e2, 0x39e1, 0x39e1, 0x39e1, + 0x39e0, 0x39e0, 0x39df, 0x39df, 0x39df, 0x39de, 0x39de, 0x39de, + 0x39dd, 0x39dd, 0x39dd, 0x39dc, 0x39dc, 0x39db, 0x39db, 0x39db, + 0x39da, 0x39da, 0x39da, 0x39d9, 0x39d9, 0x39d9, 0x39d8, 0x39d8, + 0x39d7, 0x39d7, 0x39d7, 0x39d6, 0x39d6, 0x39d6, 0x39d5, 0x39d5, + 0x39d5, 0x39d4, 0x39d4, 0x39d3, 0x39d3, 0x39d3, 0x39d2, 0x39d2, + 0x39d2, 0x39d1, 0x39d1, 0x39d1, 0x39d0, 0x39d0, 0x39cf, 0x39cf, + 0x39cf, 0x39ce, 0x39ce, 0x39ce, 0x39cd, 0x39cd, 0x39cd, 0x39cc, + 0x39cc, 0x39cb, 0x39cb, 0x39cb, 0x39ca, 0x39ca, 0x39ca, 0x39c9, + 0x39c9, 0x39c9, 0x39c8, 0x39c8, 0x39c7, 0x39c7, 0x39c7, 0x39c6, + 0x39c6, 0x39c6, 0x39c5, 0x39c5, 0x39c5, 0x39c4, 0x39c4, 0x39c3, + 0x39c3, 0x39c3, 0x39c2, 0x39c2, 0x39c2, 0x39c1, 0x39c1, 0x39c1, + 0x39c0, 0x39c0, 0x39c0, 0x39bf, 0x39bf, 0x39be, 0x39be, 0x39be, + 0x39bd, 0x39bd, 0x39bd, 0x39bc, 0x39bc, 0x39bc, 0x39bb, 0x39bb, + 0x39bb, 0x39ba, 0x39ba, 0x39b9, 0x39b9, 0x39b9, 0x39b8, 0x39b8, + 0x39b8, 0x39b7, 0x39b7, 0x39b7, 0x39b6, 0x39b6, 0x39b5, 0x39b5, + 0x39b5, 0x39b4, 0x39b4, 0x39b4, 0x39b3, 0x39b3, 0x39b3, 0x39b2, + 0x39b2, 0x39b2, 0x39b1, 0x39b1, 0x39b1, 0x39b0, 0x39b0, 0x39af, + 0x39af, 0x39af, 0x39ae, 0x39ae, 0x39ae, 0x39ad, 0x39ad, 0x39ad, + 0x39ac, 0x39ac, 0x39ac, 0x39ab, 0x39ab, 0x39aa, 0x39aa, 0x39aa, + 0x39a9, 0x39a9, 0x39a9, 0x39a8, 0x39a8, 0x39a8, 0x39a7, 0x39a7, + 0x39a7, 0x39a6, 0x39a6, 0x39a6, 0x39a5, 0x39a5, 0x39a4, 0x39a4, + 0x39a4, 0x39a3, 0x39a3, 0x39a3, 0x39a2, 0x39a2, 0x39a2, 0x39a1, + 0x39a1, 0x39a1, 0x39a0, 0x39a0, 0x39a0, 0x399f, 0x399f, 0x399e, + 0x399e, 0x399e, 0x399d, 0x399d, 0x399d, 0x399c, 0x399c, 0x399c, + 0x399b, 0x399b, 0x399b, 0x399a, 0x399a, 0x399a, 0x3999, 0x3999, + 0x3999, 0x3998, 0x3998, 0x3997, 0x3997, 0x3997, 0x3996, 0x3996, + 0x3996, 0x3995, 0x3995, 0x3995, 0x3994, 0x3994, 0x3994, 0x3993, + 0x3993, 0x3993, 0x3992, 0x3992, 0x3992, 0x3991, 0x3991, 0x3991, + 0x3990, 0x3990, 0x398f, 0x398f, 0x398f, 0x398e, 0x398e, 0x398e, + 0x398d, 0x398d, 0x398d, 0x398c, 0x398c, 0x398c, 0x398b, 0x398b, + 0x398b, 0x398a, 0x398a, 0x398a, 0x3989, 0x3989, 0x3989, 0x3988, + 0x3988, 0x3987, 0x3987, 0x3987, 0x3986, 0x3986, 0x3986, 0x3985, + 0x3985, 0x3985, 0x3984, 0x3984, 0x3984, 0x3983, 0x3983, 0x3983, + 0x3982, 0x3982, 0x3982, 0x3981, 0x3981, 0x3981, 0x3980, 0x3980, + 0x3980, 0x397f, 0x397f, 0x397f, 0x397e, 0x397e, 0x397e, 0x397d, + 0x397d, 0x397c, 0x397c, 0x397c, 0x397b, 0x397b, 0x397b, 0x397a, + 0x397a, 0x397a, 0x3979, 0x3979, 0x3979, 0x3978, 0x3978, 0x3978, + 0x3977, 0x3977, 0x3977, 0x3976, 0x3976, 0x3976, 0x3975, 0x3975, + 0x3975, 0x3974, 0x3974, 0x3974, 0x3973, 0x3973, 0x3973, 0x3972, + 0x3972, 0x3972, 0x3971, 0x3971, 0x3971, 0x3970, 0x3970, 0x3970, + 0x396f, 0x396f, 0x396e, 0x396e, 0x396e, 0x396d, 0x396d, 0x396d, + 0x396c, 0x396c, 0x396c, 0x396b, 0x396b, 0x396b, 0x396a, 0x396a, + 0x396a, 0x3969, 0x3969, 0x3969, 0x3968, 0x3968, 0x3968, 0x3967, + 0x3967, 0x3967, 0x3966, 0x3966, 0x3966, 0x3965, 0x3965, 0x3965, + 0x3964, 0x3964, 0x3964, 0x3963, 0x3963, 0x3963, 0x3962, 0x3962, + 0x3962, 0x3961, 0x3961, 0x3961, 0x3960, 0x3960, 0x3960, 0x395f, + 0x395f, 0x395f, 0x395e, 0x395e, 0x395e, 0x395d, 0x395d, 0x395d, + 0x395c, 0x395c, 0x395c, 0x395b, 0x395b, 0x395b, 0x395a, 0x395a, + 0x395a, 0x3959, 0x3959, 0x3959, 0x3958, 0x3958, 0x3958, 0x3957, + 0x3957, 0x3957, 0x3956, 0x3956, 0x3956, 0x3955, 0x3955, 0x3955, + 0x3954, 0x3954, 0x3954, 0x3953, 0x3953, 0x3953, 0x3952, 0x3952, + 0x3952, 0x3951, 0x3951, 0x3951, 0x3950, 0x3950, 0x3950, 0x394f, + 0x394f, 0x394f, 0x394e, 0x394e, 0x394e, 0x394d, 0x394d, 0x394d, + 0x394c, 0x394c, 0x394c, 0x394b, 0x394b, 0x394b, 0x394a, 0x394a, + 0x394a, 0x3949, 0x3949, 0x3949, 0x3948, 0x3948, 0x3948, 0x3947, + 0x3947, 0x3947, 0x3946, 0x3946, 0x3946, 0x3945, 0x3945, 0x3945, + 0x3944, 0x3944, 0x3944, 0x3943, 0x3943, 0x3943, 0x3942, 0x3942, + 0x3942, 0x3941, 0x3941, 0x3941, 0x3940, 0x3940, 0x3940, 0x393f, + 0x393f, 0x393f, 0x393e, 0x393e, 0x393e, 0x393d, 0x393d, 0x393d, + 0x393c, 0x393c, 0x393c, 0x393c, 0x393b, 0x393b, 0x393b, 0x393a, + 0x393a, 0x393a, 0x3939, 0x3939, 0x3939, 0x3938, 0x3938, 0x3938, + 0x3937, 0x3937, 0x3937, 0x3936, 0x3936, 0x3936, 0x3935, 0x3935, + 0x3935, 0x3934, 0x3934, 0x3934, 0x3933, 0x3933, 0x3933, 0x3932, + 0x3932, 0x3932, 0x3931, 0x3931, 0x3931, 0x3930, 0x3930, 0x3930, + 0x392f, 0x392f, 0x392f, 0x392e, 0x392e, 0x392e, 0x392e, 0x392d, + 0x392d, 0x392d, 0x392c, 0x392c, 0x392c, 0x392b, 0x392b, 0x392b, + 0x392a, 0x392a, 0x392a, 0x3929, 0x3929, 0x3929, 0x3928, 0x3928, + 0x3928, 0x3927, 0x3927, 0x3927, 0x3926, 0x3926, 0x3926, 0x3925, + 0x3925, 0x3925, 0x3924, 0x3924, 0x3924, 0x3924, 0x3923, 0x3923, + 0x3923, 0x3922, 0x3922, 0x3922, 0x3921, 0x3921, 0x3921, 0x3920, + 0x3920, 0x3920, 0x391f, 0x391f, 0x391f, 0x391e, 0x391e, 0x391e, + 0x391d, 0x391d, 0x391d, 0x391c, 0x391c, 0x391c, 0x391c, 0x391b, + 0x391b, 0x391b, 0x391a, 0x391a, 0x391a, 0x3919, 0x3919, 0x3919, + 0x3918, 0x3918, 0x3918, 0x3917, 0x3917, 0x3917, 0x3916, 0x3916, + 0x3916, 0x3915, 0x3915, 0x3915, 0x3915, 0x3914, 0x3914, 0x3914, + 0x3913, 0x3913, 0x3913, 0x3912, 0x3912, 0x3912, 0x3911, 0x3911, + 0x3911, 0x3910, 0x3910, 0x3910, 0x390f, 0x390f, 0x390f, 0x390e, + 0x390e, 0x390e, 0x390e, 0x390d, 0x390d, 0x390d, 0x390c, 0x390c, + 0x390c, 0x390b, 0x390b, 0x390b, 0x390a, 0x390a, 0x390a, 0x3909, + 0x3909, 0x3909, 0x3909, 0x3908, 0x3908, 0x3908, 0x3907, 0x3907, + 0x3907, 0x3906, 0x3906, 0x3906, 0x3905, 0x3905, 0x3905, 0x3904, + 0x3904, 0x3904, 0x3903, 0x3903, 0x3903, 0x3903, 0x3902, 0x3902, + 0x3902, 0x3901, 0x3901, 0x3901, 0x3900, 0x3900, 0x3900, 0x38ff, + 0x38ff, 0x38ff, 0x38fe, 0x38fe, 0x38fe, 0x38fe, 0x38fd, 0x38fd, + 0x38fd, 0x38fc, 0x38fc, 0x38fc, 0x38fb, 0x38fb, 0x38fb, 0x38fa, + 0x38fa, 0x38fa, 0x38f9, 0x38f9, 0x38f9, 0x38f9, 0x38f8, 0x38f8, + 0x38f8, 0x38f7, 0x38f7, 0x38f7, 0x38f6, 0x38f6, 0x38f6, 0x38f5, + 0x38f5, 0x38f5, 0x38f5, 0x38f4, 0x38f4, 0x38f4, 0x38f3, 0x38f3, + 0x38f3, 0x38f2, 0x38f2, 0x38f2, 0x38f1, 0x38f1, 0x38f1, 0x38f1, + 0x38f0, 0x38f0, 0x38f0, 0x38ef, 0x38ef, 0x38ef, 0x38ee, 0x38ee, + 0x38ee, 0x38ed, 0x38ed, 0x38ed, 0x38ed, 0x38ec, 0x38ec, 0x38ec, + 0x38eb, 0x38eb, 0x38eb, 0x38ea, 0x38ea, 0x38ea, 0x38e9, 0x38e9, + 0x38e9, 0x38e9, 0x38e8, 0x38e8, 0x38e8, 0x38e7, 0x38e7, 0x38e7, + 0x38e6, 0x38e6, 0x38e6, 0x38e5, 0x38e5, 0x38e5, 0x38e5, 0x38e4, + 0x38e4, 0x38e4, 0x38e3, 0x38e3, 0x38e3, 0x38e2, 0x38e2, 0x38e2, + 0x38e1, 0x38e1, 0x38e1, 0x38e1, 0x38e0, 0x38e0, 0x38e0, 0x38df, + 0x38df, 0x38df, 0x38de, 0x38de, 0x38de, 0x38de, 0x38dd, 0x38dd, + 0x38dd, 0x38dc, 0x38dc, 0x38dc, 0x38db, 0x38db, 0x38db, 0x38da, + 0x38da, 0x38da, 0x38d9, 0x38d8, 0x38d8, 0x38d7, 0x38d7, 0x38d6, + 0x38d5, 0x38d5, 0x38d4, 0x38d4, 0x38d3, 0x38d2, 0x38d2, 0x38d1, + 0x38d1, 0x38d0, 0x38cf, 0x38cf, 0x38ce, 0x38ce, 0x38cd, 0x38cc, + 0x38cc, 0x38cb, 0x38cb, 0x38ca, 0x38c9, 0x38c9, 0x38c8, 0x38c8, + 0x38c7, 0x38c6, 0x38c6, 0x38c5, 0x38c5, 0x38c4, 0x38c3, 0x38c3, + 0x38c2, 0x38c2, 0x38c1, 0x38c0, 0x38c0, 0x38bf, 0x38bf, 0x38be, + 0x38bd, 0x38bd, 0x38bc, 0x38bc, 0x38bb, 0x38ba, 0x38ba, 0x38b9, + 0x38b9, 0x38b8, 0x38b7, 0x38b7, 0x38b6, 0x38b6, 0x38b5, 0x38b5, + 0x38b4, 0x38b3, 0x38b3, 0x38b2, 0x38b2, 0x38b1, 0x38b0, 0x38b0, + 0x38af, 0x38af, 0x38ae, 0x38ae, 0x38ad, 0x38ac, 0x38ac, 0x38ab, + 0x38ab, 0x38aa, 0x38a9, 0x38a9, 0x38a8, 0x38a8, 0x38a7, 0x38a7, + 0x38a6, 0x38a5, 0x38a5, 0x38a4, 0x38a4, 0x38a3, 0x38a2, 0x38a2, + 0x38a1, 0x38a1, 0x38a0, 0x38a0, 0x389f, 0x389e, 0x389e, 0x389d, + 0x389d, 0x389c, 0x389c, 0x389b, 0x389a, 0x389a, 0x3899, 0x3899, + 0x3898, 0x3897, 0x3897, 0x3896, 0x3896, 0x3895, 0x3895, 0x3894, + 0x3893, 0x3893, 0x3892, 0x3892, 0x3891, 0x3891, 0x3890, 0x388f, + 0x388f, 0x388e, 0x388e, 0x388d, 0x388d, 0x388c, 0x388c, 0x388b, + 0x388a, 0x388a, 0x3889, 0x3889, 0x3888, 0x3888, 0x3887, 0x3886, + 0x3886, 0x3885, 0x3885, 0x3884, 0x3884, 0x3883, 0x3882, 0x3882, + 0x3881, 0x3881, 0x3880, 0x3880, 0x387f, 0x387f, 0x387e, 0x387d, + 0x387d, 0x387c, 0x387c, 0x387b, 0x387b, 0x387a, 0x3879, 0x3879, + 0x3878, 0x3878, 0x3877, 0x3877, 0x3876, 0x3876, 0x3875, 0x3874, + 0x3874, 0x3873, 0x3873, 0x3872, 0x3872, 0x3871, 0x3871, 0x3870, + 0x386f, 0x386f, 0x386e, 0x386e, 0x386d, 0x386d, 0x386c, 0x386c, + 0x386b, 0x386a, 0x386a, 0x3869, 0x3869, 0x3868, 0x3868, 0x3867, + 0x3867, 0x3866, 0x3866, 0x3865, 0x3864, 0x3864, 0x3863, 0x3863, + 0x3862, 0x3862, 0x3861, 0x3861, 0x3860, 0x385f, 0x385f, 0x385e, + 0x385e, 0x385d, 0x385d, 0x385c, 0x385c, 0x385b, 0x385b, 0x385a, + 0x3859, 0x3859, 0x3858, 0x3858, 0x3857, 0x3857, 0x3856, 0x3856, + 0x3855, 0x3855, 0x3854, 0x3854, 0x3853, 0x3852, 0x3852, 0x3851, + 0x3851, 0x3850, 0x3850, 0x384f, 0x384f, 0x384e, 0x384e, 0x384d, + 0x384d, 0x384c, 0x384b, 0x384b, 0x384a, 0x384a, 0x3849, 0x3849, + 0x3848, 0x3848, 0x3847, 0x3847, 0x3846, 0x3846, 0x3845, 0x3844, + 0x3844, 0x3843, 0x3843, 0x3842, 0x3842, 0x3841, 0x3841, 0x3840, + 0x3840, 0x383f, 0x383f, 0x383e, 0x383e, 0x383d, 0x383d, 0x383c, + 0x383b, 0x383b, 0x383a, 0x383a, 0x3839, 0x3839, 0x3838, 0x3838, + 0x3837, 0x3837, 0x3836, 0x3836, 0x3835, 0x3835, 0x3834, 0x3834, + 0x3833, 0x3832, 0x3832, 0x3831, 0x3831, 0x3830, 0x3830, 0x382f, + 0x382f, 0x382e, 0x382e, 0x382d, 0x382d, 0x382c, 0x382c, 0x382b, + 0x382b, 0x382a, 0x382a, 0x3829, 0x3829, 0x3828, 0x3828, 0x3827, + 0x3826, 0x3826, 0x3825, 0x3825, 0x3824, 0x3824, 0x3823, 0x3823, + 0x3822, 0x3822, 0x3821, 0x3821, 0x3820, 0x3820, 0x381f, 0x381f, + 0x381e, 0x381e, 0x381d, 0x381d, 0x381c, 0x381c, 0x381b, 0x381b, + 0x381a, 0x381a, 0x3819, 0x3819, 0x3818, 0x3818, 0x3817, 0x3817, + 0x3816, 0x3816, 0x3815, 0x3814, 0x3814, 0x3813, 0x3813, 0x3812, + 0x3812, 0x3811, 0x3811, 0x3810, 0x3810, 0x380f, 0x380f, 0x380e, + 0x380e, 0x380d, 0x380d, 0x380c, 0x380c, 0x380b, 0x380b, 0x380a, + 0x380a, 0x3809, 0x3809, 0x3808, 0x3808, 0x3807, 0x3807, 0x3806, + 0x3806, 0x3805, 0x3805, 0x3804, 0x3804, 0x3803, 0x3803, 0x3802, + 0x3802, 0x3801, 0x3801, 0x3800, 0x3800, 0x37ff, 0x37fe, 0x37fd, + 0x37fc, 0x37fb, 0x37fa, 0x37f9, 0x37f8, 0x37f7, 0x37f6, 0x37f5, + 0x37f4, 0x37f3, 0x37f2, 0x37f1, 0x37f0, 0x37ef, 0x37ee, 0x37ed, + 0x37ec, 0x37eb, 0x37ea, 0x37e9, 0x37e8, 0x37e7, 0x37e6, 0x37e5, + 0x37e4, 0x37e3, 0x37e2, 0x37e1, 0x37e0, 0x37df, 0x37de, 0x37dd, + 0x37dc, 0x37db, 0x37da, 0x37d9, 0x37d8, 0x37d7, 0x37d6, 0x37d5, + 0x37d4, 0x37d3, 0x37d2, 0x37d1, 0x37d0, 0x37cf, 0x37ce, 0x37cd, + 0x37cc, 0x37cb, 0x37ca, 0x37c9, 0x37c8, 0x37c7, 0x37c6, 0x37c5, + 0x37c4, 0x37c3, 0x37c3, 0x37c2, 0x37c1, 0x37c0, 0x37bf, 0x37be, + 0x37bd, 0x37bc, 0x37bb, 0x37ba, 0x37b9, 0x37b8, 0x37b7, 0x37b6, + 0x37b5, 0x37b4, 0x37b3, 0x37b2, 0x37b1, 0x37b0, 0x37af, 0x37ae, + 0x37ad, 0x37ac, 0x37ab, 0x37aa, 0x37a9, 0x37a8, 0x37a8, 0x37a7, + 0x37a6, 0x37a5, 0x37a4, 0x37a3, 0x37a2, 0x37a1, 0x37a0, 0x379f, + 0x379e, 0x379d, 0x379c, 0x379b, 0x379a, 0x3799, 0x3798, 0x3797, + 0x3796, 0x3795, 0x3794, 0x3794, 0x3793, 0x3792, 0x3791, 0x3790, + 0x378f, 0x378e, 0x378d, 0x378c, 0x378b, 0x378a, 0x3789, 0x3788, + 0x3787, 0x3786, 0x3785, 0x3784, 0x3784, 0x3783, 0x3782, 0x3781, + 0x3780, 0x377f, 0x377e, 0x377d, 0x377c, 0x377b, 0x377a, 0x3779, + 0x3778, 0x3777, 0x3776, 0x3775, 0x3775, 0x3774, 0x3773, 0x3772, + 0x3771, 0x3770, 0x376f, 0x376e, 0x376d, 0x376c, 0x376b, 0x376a, + 0x3769, 0x3768, 0x3768, 0x3767, 0x3766, 0x3765, 0x3764, 0x3763, + 0x3762, 0x3761, 0x3760, 0x375f, 0x375e, 0x375d, 0x375c, 0x375c, + 0x375b, 0x375a, 0x3759, 0x3758, 0x3757, 0x3756, 0x3755, 0x3754, + 0x3753, 0x3752, 0x3751, 0x3751, 0x3750, 0x374f, 0x374e, 0x374d, + 0x374c, 0x374b, 0x374a, 0x3749, 0x3748, 0x3747, 0x3747, 0x3746, + 0x3745, 0x3744, 0x3743, 0x3742, 0x3741, 0x3740, 0x373f, 0x373e, + 0x373d, 0x373d, 0x373c, 0x373b, 0x373a, 0x3739, 0x3738, 0x3737, + 0x3736, 0x3735, 0x3734, 0x3734, 0x3733, 0x3732, 0x3731, 0x3730, + 0x372f, 0x372e, 0x372d, 0x372c, 0x372b, 0x372b, 0x372a, 0x3729, + 0x3728, 0x3727, 0x3726, 0x3725, 0x3724, 0x3723, 0x3722, 0x3722, + 0x3721, 0x3720, 0x371f, 0x371e, 0x371d, 0x371c, 0x371b, 0x371a, + 0x371a, 0x3719, 0x3718, 0x3717, 0x3716, 0x3715, 0x3714, 0x3713, + 0x3713, 0x3712, 0x3711, 0x3710, 0x370f, 0x370e, 0x370d, 0x370c, + 0x370b, 0x370b, 0x370a, 0x3709, 0x3708, 0x3707, 0x3706, 0x3705, + 0x3704, 0x3704, 0x3703, 0x3702, 0x3701, 0x3700, 0x36ff, 0x36fe, + 0x36fd, 0x36fd, 0x36fc, 0x36fb, 0x36fa, 0x36f9, 0x36f8, 0x36f7, + 0x36f6, 0x36f6, 0x36f5, 0x36f4, 0x36f3, 0x36f2, 0x36f1, 0x36f0, + 0x36ef, 0x36ef, 0x36ee, 0x36ed, 0x36ec, 0x36eb, 0x36ea, 0x36e9, + 0x36e9, 0x36e8, 0x36e7, 0x36e6, 0x36e5, 0x36e4, 0x36e3, 0x36e3, + 0x36e2, 0x36e1, 0x36e0, 0x36df, 0x36de, 0x36dd, 0x36dd, 0x36dc, + 0x36db, 0x36da, 0x36d9, 0x36d8, 0x36d7, 0x36d7, 0x36d6, 0x36d5, + 0x36d4, 0x36d3, 0x36d2, 0x36d1, 0x36d1, 0x36d0, 0x36cf, 0x36ce, + 0x36cd, 0x36cc, 0x36cb, 0x36cb, 0x36ca, 0x36c9, 0x36c8, 0x36c7, + 0x36c6, 0x36c6, 0x36c5, 0x36c4, 0x36c3, 0x36c2, 0x36c1, 0x36c0, + 0x36c0, 0x36bf, 0x36be, 0x36bd, 0x36bc, 0x36bb, 0x36bb, 0x36ba, + 0x36b9, 0x36b8, 0x36b7, 0x36b6, 0x36b6, 0x36b5, 0x36b4, 0x36b3, + 0x36b2, 0x36b1, 0x36b0, 0x36b0, 0x36af, 0x36ae, 0x36ad, 0x36ac, + 0x36ab, 0x36ab, 0x36aa, 0x36a9, 0x36a8, 0x36a7, 0x36a6, 0x36a6, + 0x36a5, 0x36a4, 0x36a3, 0x36a2, 0x36a1, 0x36a1, 0x36a0, 0x369f, + 0x369e, 0x369d, 0x369d, 0x369c, 0x369b, 0x369a, 0x3699, 0x3698, + 0x3698, 0x3697, 0x3696, 0x3695, 0x3694, 0x3693, 0x3693, 0x3692, + 0x3691, 0x3690, 0x368f, 0x368f, 0x368e, 0x368d, 0x368c, 0x368b, + 0x368a, 0x368a, 0x3689, 0x3688, 0x3687, 0x3686, 0x3686, 0x3685, + 0x3684, 0x3683, 0x3682, 0x3681, 0x3681, 0x3680, 0x367f, 0x367e, + 0x367d, 0x367d, 0x367c, 0x367b, 0x367a, 0x3679, 0x3679, 0x3678, + 0x3677, 0x3676, 0x3675, 0x3675, 0x3674, 0x3673, 0x3672, 0x3671, + 0x3670, 0x3670, 0x366f, 0x366e, 0x366d, 0x366c, 0x366c, 0x366b, + 0x366a, 0x3669, 0x3668, 0x3668, 0x3667, 0x3666, 0x3665, 0x3664, + 0x3664, 0x3663, 0x3662, 0x3661, 0x3660, 0x3660, 0x365f, 0x365e, + 0x365d, 0x365c, 0x365c, 0x365b, 0x365a, 0x3659, 0x3659, 0x3658, + 0x3657, 0x3656, 0x3655, 0x3655, 0x3654, 0x3653, 0x3652, 0x3651, + 0x3651, 0x3650, 0x364f, 0x364e, 0x364d, 0x364d, 0x364c, 0x364b, + 0x364a, 0x364a, 0x3649, 0x3648, 0x3647, 0x3646, 0x3646, 0x3645, + 0x3644, 0x3643, 0x3642, 0x3642, 0x3641, 0x3640, 0x363f, 0x363f, + 0x363e, 0x363d, 0x363c, 0x363b, 0x363b, 0x363a, 0x3639, 0x3638, + 0x3638, 0x3637, 0x3636, 0x3635, 0x3634, 0x3634, 0x3633, 0x3632, + 0x3631, 0x3631, 0x3630, 0x362f, 0x362e, 0x362d, 0x362d, 0x362c, + 0x362b, 0x362a, 0x362a, 0x3629, 0x3628, 0x3627, 0x3627, 0x3626, + 0x3625, 0x3624, 0x3623, 0x3623, 0x3622, 0x3621, 0x3620, 0x3620, + 0x361f, 0x361e, 0x361d, 0x361d, 0x361c, 0x361b, 0x361a, 0x361a, + 0x3619, 0x3618, 0x3617, 0x3616, 0x3616, 0x3615, 0x3614, 0x3613, + 0x3613, 0x3612, 0x3611, 0x3610, 0x3610, 0x360f, 0x360e, 0x360d, + 0x360d, 0x360c, 0x360b, 0x360a, 0x360a, 0x3609, 0x3608, 0x3607, + 0x3607, 0x3606, 0x3605, 0x3604, 0x3604, 0x3603, 0x3602, 0x3601, + 0x3601, 0x3600, 0x35ff, 0x35fe, 0x35fe, 0x35fd, 0x35fc, 0x35fb, + 0x35fb, 0x35fa, 0x35f9, 0x35f8, 0x35f8, 0x35f7, 0x35f6, 0x35f5, + 0x35f5, 0x35f4, 0x35f3, 0x35f2, 0x35f2, 0x35f1, 0x35f0, 0x35ef, + 0x35ef, 0x35ee, 0x35ed, 0x35ec, 0x35ec, 0x35eb, 0x35ea, 0x35e9, + 0x35e9, 0x35e8, 0x35e7, 0x35e7, 0x35e6, 0x35e5, 0x35e4, 0x35e4, + 0x35e3, 0x35e1, 0x35e0, 0x35de, 0x35dd, 0x35db, 0x35da, 0x35d9, + 0x35d7, 0x35d6, 0x35d4, 0x35d3, 0x35d1, 0x35d0, 0x35ce, 0x35cd, + 0x35cb, 0x35ca, 0x35c9, 0x35c7, 0x35c6, 0x35c4, 0x35c3, 0x35c1, + 0x35c0, 0x35be, 0x35bd, 0x35bc, 0x35ba, 0x35b9, 0x35b7, 0x35b6, + 0x35b4, 0x35b3, 0x35b2, 0x35b0, 0x35af, 0x35ad, 0x35ac, 0x35ab, + 0x35a9, 0x35a8, 0x35a6, 0x35a5, 0x35a3, 0x35a2, 0x35a1, 0x359f, + 0x359e, 0x359c, 0x359b, 0x359a, 0x3598, 0x3597, 0x3595, 0x3594, + 0x3593, 0x3591, 0x3590, 0x358e, 0x358d, 0x358c, 0x358a, 0x3589, + 0x3588, 0x3586, 0x3585, 0x3583, 0x3582, 0x3581, 0x357f, 0x357e, + 0x357d, 0x357b, 0x357a, 0x3578, 0x3577, 0x3576, 0x3574, 0x3573, + 0x3572, 0x3570, 0x356f, 0x356e, 0x356c, 0x356b, 0x3569, 0x3568, + 0x3567, 0x3565, 0x3564, 0x3563, 0x3561, 0x3560, 0x355f, 0x355d, + 0x355c, 0x355b, 0x3559, 0x3558, 0x3557, 0x3555, 0x3554, 0x3553, + 0x3551, 0x3550, 0x354f, 0x354d, 0x354c, 0x354b, 0x3549, 0x3548, + 0x3547, 0x3545, 0x3544, 0x3543, 0x3541, 0x3540, 0x353f, 0x353e, + 0x353c, 0x353b, 0x353a, 0x3538, 0x3537, 0x3536, 0x3534, 0x3533, + 0x3532, 0x3530, 0x352f, 0x352e, 0x352d, 0x352b, 0x352a, 0x3529, + 0x3527, 0x3526, 0x3525, 0x3524, 0x3522, 0x3521, 0x3520, 0x351e, + 0x351d, 0x351c, 0x351b, 0x3519, 0x3518, 0x3517, 0x3516, 0x3514, + 0x3513, 0x3512, 0x3510, 0x350f, 0x350e, 0x350d, 0x350b, 0x350a, + 0x3509, 0x3508, 0x3506, 0x3505, 0x3504, 0x3503, 0x3501, 0x3500, + 0x34ff, 0x34fe, 0x34fc, 0x34fb, 0x34fa, 0x34f9, 0x34f7, 0x34f6, + 0x34f5, 0x34f4, 0x34f2, 0x34f1, 0x34f0, 0x34ef, 0x34ed, 0x34ec, + 0x34eb, 0x34ea, 0x34e9, 0x34e7, 0x34e6, 0x34e5, 0x34e4, 0x34e2, + 0x34e1, 0x34e0, 0x34df, 0x34de, 0x34dc, 0x34db, 0x34da, 0x34d9, + 0x34d7, 0x34d6, 0x34d5, 0x34d4, 0x34d3, 0x34d1, 0x34d0, 0x34cf, + 0x34ce, 0x34cd, 0x34cb, 0x34ca, 0x34c9, 0x34c8, 0x34c7, 0x34c5, + 0x34c4, 0x34c3, 0x34c2, 0x34c1, 0x34c0, 0x34be, 0x34bd, 0x34bc, + 0x34bb, 0x34ba, 0x34b8, 0x34b7, 0x34b6, 0x34b5, 0x34b4, 0x34b3, + 0x34b1, 0x34b0, 0x34af, 0x34ae, 0x34ad, 0x34ac, 0x34aa, 0x34a9, + 0x34a8, 0x34a7, 0x34a6, 0x34a5, 0x34a3, 0x34a2, 0x34a1, 0x34a0, + 0x349f, 0x349e, 0x349c, 0x349b, 0x349a, 0x3499, 0x3498, 0x3497, + 0x3496, 0x3494, 0x3493, 0x3492, 0x3491, 0x3490, 0x348f, 0x348e, + 0x348c, 0x348b, 0x348a, 0x3489, 0x3488, 0x3487, 0x3486, 0x3484, + 0x3483, 0x3482, 0x3481, 0x3480, 0x347f, 0x347e, 0x347d, 0x347b, + 0x347a, 0x3479, 0x3478, 0x3477, 0x3476, 0x3475, 0x3474, 0x3473, + 0x3471, 0x3470, 0x346f, 0x346e, 0x346d, 0x346c, 0x346b, 0x346a, + 0x3469, 0x3467, 0x3466, 0x3465, 0x3464, 0x3463, 0x3462, 0x3461, + 0x3460, 0x345f, 0x345e, 0x345d, 0x345b, 0x345a, 0x3459, 0x3458, + 0x3457, 0x3456, 0x3455, 0x3454, 0x3453, 0x3452, 0x3451, 0x3450, + 0x344e, 0x344d, 0x344c, 0x344b, 0x344a, 0x3449, 0x3448, 0x3447, + 0x3446, 0x3445, 0x3444, 0x3443, 0x3442, 0x3441, 0x343f, 0x343e, + 0x343d, 0x343c, 0x343b, 0x343a, 0x3439, 0x3438, 0x3437, 0x3436, + 0x3435, 0x3434, 0x3433, 0x3432, 0x3431, 0x3430, 0x342f, 0x342e, + 0x342d, 0x342b, 0x342a, 0x3429, 0x3428, 0x3427, 0x3426, 0x3425, + 0x3424, 0x3423, 0x3422, 0x3421, 0x3420, 0x341f, 0x341e, 0x341d, + 0x341c, 0x341b, 0x341a, 0x3419, 0x3418, 0x3417, 0x3416, 0x3415, + 0x3414, 0x3413, 0x3412, 0x3411, 0x3410, 0x340f, 0x340e, 0x340d, + 0x340c, 0x340b, 0x340a, 0x3409, 0x3408, 0x3407, 0x3406, 0x3405, + 0x3404, 0x3403, 0x3402, 0x3401, 0x33ff, 0x33fd, 0x33fb, 0x33f9, + 0x33f7, 0x33f5, 0x33f3, 0x33f1, 0x33ef, 0x33ed, 0x33eb, 0x33e9, + 0x33e7, 0x33e5, 0x33e3, 0x33e1, 0x33df, 0x33dd, 0x33db, 0x33d9, + 0x33d8, 0x33d6, 0x33d4, 0x33d2, 0x33d0, 0x33ce, 0x33cc, 0x33ca, + 0x33c8, 0x33c6, 0x33c4, 0x33c2, 0x33c0, 0x33be, 0x33bc, 0x33ba, + 0x33b8, 0x33b6, 0x33b5, 0x33b3, 0x33b1, 0x33af, 0x33ad, 0x33ab, + 0x33a9, 0x33a7, 0x33a5, 0x33a3, 0x33a1, 0x339f, 0x339e, 0x339c, + 0x339a, 0x3398, 0x3396, 0x3394, 0x3392, 0x3390, 0x338e, 0x338d, + 0x338b, 0x3389, 0x3387, 0x3385, 0x3383, 0x3381, 0x337f, 0x337d, + 0x337c, 0x337a, 0x3378, 0x3376, 0x3374, 0x3372, 0x3370, 0x336f, + 0x336d, 0x336b, 0x3369, 0x3367, 0x3365, 0x3363, 0x3362, 0x3360, + 0x335e, 0x335c, 0x335a, 0x3358, 0x3357, 0x3355, 0x3353, 0x3351, + 0x334f, 0x334d, 0x334c, 0x334a, 0x3348, 0x3346, 0x3344, 0x3342, + 0x3341, 0x333f, 0x333d, 0x333b, 0x3339, 0x3338, 0x3336, 0x3334, + 0x3332, 0x3330, 0x332f, 0x332d, 0x332b, 0x3329, 0x3327, 0x3326, + 0x3324, 0x3322, 0x3320, 0x331f, 0x331d, 0x331b, 0x3319, 0x3317, + 0x3316, 0x3314, 0x3312, 0x3310, 0x330f, 0x330d, 0x330b, 0x3309, + 0x3308, 0x3306, 0x3304, 0x3302, 0x3301, 0x32ff, 0x32fd, 0x32fb, + 0x32fa, 0x32f8, 0x32f6, 0x32f4, 0x32f3, 0x32f1, 0x32ef, 0x32ed, + 0x32ec, 0x32ea, 0x32e8, 0x32e6, 0x32e5, 0x32e3, 0x32e1, 0x32e0, + 0x32de, 0x32dc, 0x32da, 0x32d9, 0x32d7, 0x32d5, 0x32d4, 0x32d2, + 0x32d0, 0x32ce, 0x32cd, 0x32cb, 0x32c9, 0x32c8, 0x32c6, 0x32c4, + 0x32c3, 0x32c1, 0x32bf, 0x32be, 0x32bc, 0x32ba, 0x32b8, 0x32b7, + 0x32b5, 0x32b3, 0x32b2, 0x32b0, 0x32ae, 0x32ad, 0x32ab, 0x32a9, + 0x32a8, 0x32a6, 0x32a4, 0x32a3, 0x32a1, 0x329f, 0x329e, 0x329c, + 0x329b, 0x3299, 0x3297, 0x3296, 0x3294, 0x3292, 0x3291, 0x328f, + 0x328d, 0x328c, 0x328a, 0x3288, 0x3287, 0x3285, 0x3284, 0x3282, + 0x3280, 0x327f, 0x327d, 0x327b, 0x327a, 0x3278, 0x3277, 0x3275, + 0x3273, 0x3272, 0x3270, 0x326f, 0x326d, 0x326b, 0x326a, 0x3268, + 0x3267, 0x3265, 0x3263, 0x3262, 0x3260, 0x325f, 0x325d, 0x325b, + 0x325a, 0x3258, 0x3257, 0x3255, 0x3253, 0x3252, 0x3250, 0x324f, + 0x324d, 0x324c, 0x324a, 0x3248, 0x3247, 0x3245, 0x3244, 0x3242, + 0x3241, 0x323f, 0x323d, 0x323c, 0x323a, 0x3239, 0x3237, 0x3236, + 0x3234, 0x3233, 0x3231, 0x322f, 0x322e, 0x322c, 0x322b, 0x3229, + 0x3228, 0x3226, 0x3225, 0x3223, 0x3222, 0x3220, 0x321f, 0x321d, + 0x321b, 0x321a, 0x3218, 0x3217, 0x3215, 0x3214, 0x3212, 0x3211, + 0x320f, 0x320e, 0x320c, 0x320b, 0x3209, 0x3208, 0x3206, 0x3205, + 0x3203, 0x3202, 0x3200, 0x31ff, 0x31fd, 0x31fc, 0x31fa, 0x31f9, + 0x31f7, 0x31f6, 0x31f4, 0x31f3, 0x31f1, 0x31f0, 0x31ee, 0x31ed, + 0x31eb, 0x31ea, 0x31e8, 0x31e7, 0x31e5, 0x31e4, 0x31e3, 0x31e1, + 0x31e0, 0x31de, 0x31dd, 0x31db, 0x31da, 0x31d8, 0x31d7, 0x31d5, + 0x31d4, 0x31d2, 0x31d1, 0x31d0, 0x31ce, 0x31cd, 0x31cb, 0x31ca, + 0x31c8, 0x31c7, 0x31c5, 0x31c4, 0x31c2, 0x31c1, 0x31c0, 0x31be, + 0x31bd, 0x31bb, 0x31ba, 0x31b8, 0x31b7, 0x31b6, 0x31b4, 0x31b3, + 0x31b1, 0x31b0, 0x31ae, 0x31ad, 0x31ac, 0x31aa, 0x31a9, 0x31a7, + 0x31a6, 0x31a5, 0x31a3, 0x31a2, 0x31a0, 0x319f, 0x319e, 0x319c, + 0x319b, 0x3199, 0x3198, 0x3197, 0x3195, 0x3194, 0x3192, 0x3191, + 0x3190, 0x318e, 0x318d, 0x318b, 0x318a, 0x3189, 0x3187, 0x3186, + 0x3184, 0x3183, 0x3182, 0x3180, 0x317f, 0x317e, 0x317c, 0x317b, + 0x3179, 0x3178, 0x3177, 0x3175, 0x3174, 0x3173, 0x3171, 0x3170, + 0x316f, 0x316d, 0x316c, 0x316b, 0x3169, 0x3168, 0x3166, 0x3165, + 0x3164, 0x3162, 0x3161, 0x3160, 0x315e, 0x315d, 0x315c, 0x315a, + 0x3159, 0x3158, 0x3156, 0x3155, 0x3154, 0x3152, 0x3151, 0x3150, + 0x314e, 0x314d, 0x314c, 0x314a, 0x3149, 0x3148, 0x3146, 0x3145, + 0x3144, 0x3142, 0x3141, 0x3140, 0x313f, 0x313d, 0x313c, 0x313b, + 0x3139, 0x3138, 0x3137, 0x3135, 0x3134, 0x3133, 0x3131, 0x3130, + 0x312f, 0x312e, 0x312c, 0x312b, 0x312a, 0x3128, 0x3127, 0x3126, + 0x3125, 0x3123, 0x3122, 0x3121, 0x311f, 0x311e, 0x311d, 0x311c, + 0x311a, 0x3119, 0x3118, 0x3117, 0x3115, 0x3114, 0x3113, 0x3111, + 0x3110, 0x310f, 0x310e, 0x310c, 0x310b, 0x310a, 0x3109, 0x3107, + 0x3106, 0x3105, 0x3104, 0x3102, 0x3101, 0x3100, 0x30ff, 0x30fd, + 0x30fc, 0x30fb, 0x30fa, 0x30f8, 0x30f7, 0x30f6, 0x30f5, 0x30f3, + 0x30f2, 0x30f1, 0x30f0, 0x30ee, 0x30ed, 0x30ec, 0x30eb, 0x30ea, + 0x30e8, 0x30e7, 0x30e6, 0x30e5, 0x30e3, 0x30e2, 0x30e1, 0x30e0, + 0x30df, 0x30dd, 0x30dc, 0x30db, 0x30da, 0x30d8, 0x30d7, 0x30d6, + 0x30d5, 0x30d4, 0x30d2, 0x30d1, 0x30d0, 0x30cf, 0x30ce, 0x30cc, + 0x30cb, 0x30ca, 0x30c9, 0x30c8, 0x30c6, 0x30c5, 0x30c4, 0x30c3, + 0x30c2, 0x30c0, 0x30bf, 0x30be, 0x30bd, 0x30bc, 0x30bb, 0x30b9, + 0x30b8, 0x30b7, 0x30b6, 0x30b5, 0x30b3, 0x30b2, 0x30b1, 0x30b0, + 0x30af, 0x30ae, 0x30ac, 0x30ab, 0x30aa, 0x30a9, 0x30a8, 0x30a7, + 0x30a5, 0x30a4, 0x30a3, 0x30a2, 0x30a1, 0x30a0, 0x309e, 0x309d, + 0x309c, 0x309b, 0x309a, 0x3099, 0x3098, 0x3096, 0x3095, 0x3094, + 0x3093, 0x3092, 0x3091, 0x3090, 0x308e, 0x308d, 0x308c, 0x308b, + 0x308a, 0x3089, 0x3088, 0x3086, 0x3085, 0x3084, 0x3083, 0x3082, + 0x3081, 0x3080, 0x307f, 0x307d, 0x307c, 0x307b, 0x307a, 0x3079, + 0x3078, 0x3077, 0x3076, 0x3075, 0x3073, 0x3072, 0x3071, 0x3070, + 0x306f, 0x306e, 0x306d, 0x306c, 0x306b, 0x3069, 0x3068, 0x3067, + 0x3066, 0x3065, 0x3064, 0x3063, 0x3062, 0x3061, 0x3060, 0x305e, + 0x305d, 0x305c, 0x305b, 0x305a, 0x3059, 0x3058, 0x3057, 0x3056, + 0x3055, 0x3053, 0x3050, 0x304e, 0x304c, 0x304a, 0x3048, 0x3046, + 0x3043, 0x3041, 0x303f, 0x303d, 0x303b, 0x3039, 0x3037, 0x3035, + 0x3033, 0x3030, 0x302e, 0x302c, 0x302a, 0x3028, 0x3026, 0x3024, + 0x3022, 0x3020, 0x301e, 0x301c, 0x301a, 0x3018, 0x3016, 0x3014, + 0x3011, 0x300f, 0x300d, 0x300b, 0x3009, 0x3007, 0x3005, 0x3003, + 0x3001, 0x2fff, 0x2ffb, 0x2ff7, 0x2ff3, 0x2fef, 0x2feb, 0x2fe7, + 0x2fe3, 0x2fdf, 0x2fdb, 0x2fd7, 0x2fd3, 0x2fcf, 0x2fcb, 0x2fc7, + 0x2fc4, 0x2fc0, 0x2fbc, 0x2fb8, 0x2fb4, 0x2fb0, 0x2fac, 0x2fa9, + 0x2fa5, 0x2fa1, 0x2f9d, 0x2f99, 0x2f96, 0x2f92, 0x2f8e, 0x2f8a, + 0x2f86, 0x2f83, 0x2f7f, 0x2f7b, 0x2f77, 0x2f74, 0x2f70, 0x2f6c, + 0x2f69, 0x2f65, 0x2f61, 0x2f5e, 0x2f5a, 0x2f56, 0x2f52, 0x2f4f, + 0x2f4b, 0x2f48, 0x2f44, 0x2f40, 0x2f3d, 0x2f39, 0x2f35, 0x2f32, + 0x2f2e, 0x2f2b, 0x2f27, 0x2f23, 0x2f20, 0x2f1c, 0x2f19, 0x2f15, + 0x2f12, 0x2f0e, 0x2f0b, 0x2f07, 0x2f04, 0x2f00, 0x2efd, 0x2ef9, + 0x2ef6, 0x2ef2, 0x2eef, 0x2eeb, 0x2ee8, 0x2ee4, 0x2ee1, 0x2edd, + 0x2eda, 0x2ed7, 0x2ed3, 0x2ed0, 0x2ecc, 0x2ec9, 0x2ec6, 0x2ec2, + 0x2ebf, 0x2ebb, 0x2eb8, 0x2eb5, 0x2eb1, 0x2eae, 0x2eab, 0x2ea7, + 0x2ea4, 0x2ea1, 0x2e9d, 0x2e9a, 0x2e97, 0x2e94, 0x2e90, 0x2e8d, + 0x2e8a, 0x2e86, 0x2e83, 0x2e80, 0x2e7d, 0x2e79, 0x2e76, 0x2e73, + 0x2e70, 0x2e6d, 0x2e69, 0x2e66, 0x2e63, 0x2e60, 0x2e5d, 0x2e59, + 0x2e56, 0x2e53, 0x2e50, 0x2e4d, 0x2e4a, 0x2e46, 0x2e43, 0x2e40, + 0x2e3d, 0x2e3a, 0x2e37, 0x2e34, 0x2e31, 0x2e2e, 0x2e2a, 0x2e27, + 0x2e24, 0x2e21, 0x2e1e, 0x2e1b, 0x2e18, 0x2e15, 0x2e12, 0x2e0f, + 0x2e0c, 0x2e09, 0x2e06, 0x2e03, 0x2e00, 0x2dfd, 0x2dfa, 0x2df7, + 0x2df4, 0x2df1, 0x2dee, 0x2deb, 0x2de8, 0x2de5, 0x2de2, 0x2ddf, + 0x2ddc, 0x2dd9, 0x2dd6, 0x2dd4, 0x2dd1, 0x2dce, 0x2dcb, 0x2dc8, + 0x2dc5, 0x2dc2, 0x2dbf, 0x2dbc, 0x2dba, 0x2db7, 0x2db4, 0x2db1, + 0x2dae, 0x2dab, 0x2da8, 0x2da6, 0x2da3, 0x2da0, 0x2d9d, 0x2d9a, + 0x2d98, 0x2d95, 0x2d92, 0x2d8f, 0x2d8c, 0x2d8a, 0x2d87, 0x2d84, + 0x2d81, 0x2d7f, 0x2d7c, 0x2d79, 0x2d76, 0x2d74, 0x2d71, 0x2d6e, + 0x2d6c, 0x2d69, 0x2d66, 0x2d63, 0x2d61, 0x2d5e, 0x2d5b, 0x2d59, + 0x2d56, 0x2d53, 0x2d51, 0x2d4e, 0x2d4b, 0x2d49, 0x2d46, 0x2d44, + 0x2d41, 0x2d3e, 0x2d3c, 0x2d39, 0x2d36, 0x2d34, 0x2d31, 0x2d2f, + 0x2d2c, 0x2d29, 0x2d27, 0x2d24, 0x2d22, 0x2d1f, 0x2d1d, 0x2d1a, + 0x2d18, 0x2d15, 0x2d12, 0x2d10, 0x2d0d, 0x2d0b, 0x2d08, 0x2d06, + 0x2d03, 0x2d01, 0x2cfe, 0x2cfc, 0x2cf9, 0x2cf7, 0x2cf4, 0x2cf2, + 0x2cef, 0x2ced, 0x2cea, 0x2ce8, 0x2ce6, 0x2ce3, 0x2ce1, 0x2cde, + 0x2cdc, 0x2cd9, 0x2cd7, 0x2cd5, 0x2cd2, 0x2cd0, 0x2ccd, 0x2ccb, + 0x2cc9, 0x2cc6, 0x2cc4, 0x2cc1, 0x2cbf, 0x2cbd, 0x2cba, 0x2cb8, + 0x2cb6, 0x2cb3, 0x2cb1, 0x2caf, 0x2cac, 0x2caa, 0x2ca7, 0x2ca5, + 0x2ca3, 0x2ca1, 0x2c9e, 0x2c9c, 0x2c9a, 0x2c97, 0x2c95, 0x2c93, + 0x2c90, 0x2c8e, 0x2c8c, 0x2c8a, 0x2c87, 0x2c85, 0x2c83, 0x2c81, + 0x2c7e, 0x2c7c, 0x2c7a, 0x2c78, 0x2c75, 0x2c73, 0x2c71, 0x2c6f, + 0x2c6d, 0x2c6a, 0x2c68, 0x2c66, 0x2c64, 0x2c61, 0x2c5f, 0x2c5d, + 0x2c5b, 0x2c59, 0x2c57, 0x2c54, 0x2c52, 0x2c50, 0x2c4e, 0x2c4c, + 0x2c4a, 0x2c48, 0x2c45, 0x2c43, 0x2c41, 0x2c3f, 0x2c3d, 0x2c3b, + 0x2c39, 0x2c37, 0x2c34, 0x2c32, 0x2c30, 0x2c2e, 0x2c2c, 0x2c2a, + 0x2c28, 0x2c26, 0x2c24, 0x2c22, 0x2c20, 0x2c1e, 0x2c1b, 0x2c19, + 0x2c17, 0x2c15, 0x2c13, 0x2c11, 0x2c0f, 0x2c0d, 0x2c0b, 0x2c09, + 0x2c07, 0x2c05, 0x2c03, 0x2c01, 0x2bfe, 0x2bfa, 0x2bf6, 0x2bf2, + 0x2bee, 0x2bea, 0x2be6, 0x2be2, 0x2bdf, 0x2bdb, 0x2bd7, 0x2bd3, + 0x2bcf, 0x2bcb, 0x2bc7, 0x2bc3, 0x2bbf, 0x2bbb, 0x2bb8, 0x2bb4, + 0x2bb0, 0x2bac, 0x2ba8, 0x2ba4, 0x2ba1, 0x2b9d, 0x2b99, 0x2b95, + 0x2b91, 0x2b8e, 0x2b8a, 0x2b86, 0x2b82, 0x2b7f, 0x2b7b, 0x2b77, + 0x2b73, 0x2b70, 0x2b6c, 0x2b68, 0x2b64, 0x2b61, 0x2b5d, 0x2b59, + 0x2b56, 0x2b52, 0x2b4e, 0x2b4b, 0x2b47, 0x2b44, 0x2b40, 0x2b3c, + 0x2b39, 0x2b35, 0x2b31, 0x2b2e, 0x2b2a, 0x2b27, 0x2b23, 0x2b20, + 0x2b1c, 0x2b18, 0x2b15, 0x2b11, 0x2b0e, 0x2b0a, 0x2b07, 0x2b03, + 0x2b00, 0x2afc, 0x2af9, 0x2af5, 0x2af2, 0x2aee, 0x2aeb, 0x2ae7, + 0x2ae4, 0x2ae1, 0x2add, 0x2ada, 0x2ad6, 0x2ad3, 0x2acf, 0x2acc, + 0x2ac9, 0x2ac5, 0x2ac2, 0x2abe, 0x2abb, 0x2ab8, 0x2ab4, 0x2ab1, + 0x2aae, 0x2aaa, 0x2aa7, 0x2aa4, 0x2aa0, 0x2a9d, 0x2a9a, 0x2a97, + 0x2a93, 0x2a90, 0x2a8d, 0x2a89, 0x2a86, 0x2a83, 0x2a80, 0x2a7c, + 0x2a79, 0x2a76, 0x2a73, 0x2a6f, 0x2a6c, 0x2a69, 0x2a66, 0x2a63, + 0x2a5f, 0x2a5c, 0x2a59, 0x2a56, 0x2a53, 0x2a50, 0x2a4c, 0x2a49, + 0x2a46, 0x2a43, 0x2a40, 0x2a3d, 0x2a3a, 0x2a37, 0x2a33, 0x2a30, + 0x2a2d, 0x2a2a, 0x2a27, 0x2a24, 0x2a21, 0x2a1e, 0x2a1b, 0x2a18, + 0x2a15, 0x2a12, 0x2a0f, 0x2a0c, 0x2a09, 0x2a06, 0x2a03, 0x2a00, + 0x29fd, 0x29fa, 0x29f7, 0x29f4, 0x29f1, 0x29ee, 0x29eb, 0x29e8, + 0x29e5, 0x29e2, 0x29df, 0x29dc, 0x29d9, 0x29d6, 0x29d3, 0x29d0, + 0x29cd, 0x29cb, 0x29c8, 0x29c5, 0x29c2, 0x29bf, 0x29bc, 0x29b9, + 0x29b6, 0x29b4, 0x29b1, 0x29ae, 0x29ab, 0x29a8, 0x29a5, 0x29a3, + 0x29a0, 0x299d, 0x299a, 0x2997, 0x2995, 0x2992, 0x298f, 0x298c, + 0x2989, 0x2987, 0x2984, 0x2981, 0x297e, 0x297c, 0x2979, 0x2976, + 0x2973, 0x2971, 0x296e, 0x296b, 0x2969, 0x2966, 0x2963, 0x2960, + 0x295e, 0x295b, 0x2958, 0x2956, 0x2953, 0x2950, 0x294e, 0x294b, + 0x2948, 0x2946, 0x2943, 0x2941, 0x293e, 0x293b, 0x2939, 0x2936, + 0x2934, 0x2931, 0x292e, 0x292c, 0x2929, 0x2927, 0x2924, 0x2921, + 0x291f, 0x291c, 0x291a, 0x2917, 0x2915, 0x2912, 0x2910, 0x290d, + 0x290b, 0x2908, 0x2906, 0x2903, 0x2901, 0x28fe, 0x28fc, 0x28f9, + 0x28f7, 0x28f4, 0x28f2, 0x28ef, 0x28ed, 0x28ea, 0x28e8, 0x28e5, + 0x28e3, 0x28e0, 0x28de, 0x28dc, 0x28d9, 0x28d7, 0x28d4, 0x28d2, + 0x28cf, 0x28cd, 0x28cb, 0x28c8, 0x28c6, 0x28c3, 0x28c1, 0x28bf, + 0x28bc, 0x28ba, 0x28b8, 0x28b5, 0x28b3, 0x28b1, 0x28ae, 0x28ac, + 0x28aa, 0x28a7, 0x28a5, 0x28a3, 0x28a0, 0x289e, 0x289c, 0x2899, + 0x2897, 0x2895, 0x2892, 0x2890, 0x288e, 0x288c, 0x2889, 0x2887, + 0x2885, 0x2883, 0x2880, 0x287e, 0x287c, 0x287a, 0x2877, 0x2875, + 0x2873, 0x2871, 0x286e, 0x286c, 0x286a, 0x2868, 0x2866, 0x2863, + 0x2861, 0x285f, 0x285d, 0x285b, 0x2859, 0x2856, 0x2854, 0x2852, + 0x2850, 0x284e, 0x284c, 0x2849, 0x2847, 0x2845, 0x2843, 0x2841, + 0x283f, 0x283d, 0x283b, 0x2838, 0x2836, 0x2834, 0x2832, 0x2830, + 0x282e, 0x282c, 0x282a, 0x2828, 0x2826, 0x2824, 0x2821, 0x281f, + 0x281d, 0x281b, 0x2819, 0x2817, 0x2815, 0x2813, 0x2811, 0x280f, + 0x280d, 0x280b, 0x2809, 0x2807, 0x2805, 0x2803, 0x2801, 0x27fe, + 0x27fa, 0x27f6, 0x27f2, 0x27ee, 0x27ea, 0x27e6, 0x27e2, 0x27de, + 0x27da, 0x27d6, 0x27d2, 0x27ce, 0x27cb, 0x27c7, 0x27c3, 0x27bf, + 0x27bb, 0x27b7, 0x27b3, 0x27af, 0x27ac, 0x27a8, 0x27a4, 0x27a0, + 0x279c, 0x2799, 0x2795, 0x2791, 0x278d, 0x2789, 0x2786, 0x2782, + 0x277e, 0x277a, 0x2777, 0x2773, 0x276f, 0x276b, 0x2768, 0x2764, + 0x2760, 0x275d, 0x2759, 0x2755, 0x2752, 0x274e, 0x274a, 0x2747, + 0x2743, 0x273f, 0x273c, 0x2738, 0x2735, 0x2731, 0x272d, 0x272a, + 0x2726, 0x2723, 0x271f, 0x271c, 0x2718, 0x2715, 0x2711, 0x270d, + 0x270a, 0x2706, 0x2703, 0x26ff, 0x26fc, 0x26f8, 0x26f5, 0x26f1, + 0x26ee, 0x26eb, 0x26e7, 0x26e4, 0x26e0, 0x26dd, 0x26d9, 0x26d6, + 0x26d2, 0x26cf, 0x26cc, 0x26c8, 0x26c5, 0x26c2, 0x26be, 0x26bb, + 0x26b7, 0x26b4, 0x26b1, 0x26ad, 0x26aa, 0x26a7, 0x26a3, 0x26a0, + 0x269d, 0x2699, 0x2696, 0x2693, 0x2690, 0x268c, 0x2689, 0x2686, + 0x2682, 0x267f, 0x267c, 0x2679, 0x2676, 0x2672, 0x266f, 0x266c, + 0x2669, 0x2665, 0x2662, 0x265f, 0x265c, 0x2659, 0x2656, 0x2652, + 0x264f, 0x264c, 0x2649, 0x2646, 0x2643, 0x2640, 0x263c, 0x2639, + 0x2636, 0x2633, 0x2630, 0x262d, 0x262a, 0x2627, 0x2624, 0x2621, + 0x261e, 0x261a, 0x2617, 0x2614, 0x2611, 0x260e, 0x260b, 0x2608, + 0x2605, 0x2602, 0x25ff, 0x25fc, 0x25f9, 0x25f6, 0x25f3, 0x25f0, + 0x25ed, 0x25ea, 0x25e7, 0x25e4, 0x25e2, 0x25df, 0x25dc, 0x25d9, + 0x25d6, 0x25d3, 0x25d0, 0x25cd, 0x25ca, 0x25c7, 0x25c4, 0x25c2, + 0x25bf, 0x25bc, 0x25b9, 0x25b6, 0x25b3, 0x25b0, 0x25ae, 0x25ab, + 0x25a8, 0x25a5, 0x25a2, 0x259f, 0x259d, 0x259a, 0x2597, 0x2594, + 0x2591, 0x258f, 0x258c, 0x2589, 0x2586, 0x2584, 0x2581, 0x257e, + 0x257b, 0x2579, 0x2576, 0x2573, 0x2570, 0x256e, 0x256b, 0x2568, + 0x2566, 0x2563, 0x2560, 0x255e, 0x255b, 0x2558, 0x2555, 0x2553, + 0x2550, 0x254e, 0x254b, 0x2548, 0x2546, 0x2543, 0x2540, 0x253e, + 0x253b, 0x2538, 0x2536, 0x2533, 0x2531, 0x252e, 0x252b, 0x2529, + 0x2526, 0x2524, 0x2521, 0x251f, 0x251c, 0x2519, 0x2517, 0x2514, + 0x2512, 0x250f, 0x250d, 0x250a, 0x2508, 0x2505, 0x2503, 0x2500, + 0x24fe, 0x24fb, 0x24f9, 0x24f6, 0x24f4, 0x24f1, 0x24ef, 0x24ec, + 0x24ea, 0x24e7, 0x24e5, 0x24e3, 0x24e0, 0x24de, 0x24db, 0x24d9, + 0x24d6, 0x24d4, 0x24d2, 0x24cf, 0x24cd, 0x24ca, 0x24c8, 0x24c6, + 0x24c3, 0x24c1, 0x24be, 0x24bc, 0x24ba, 0x24b7, 0x24b5, 0x24b3, + 0x24b0, 0x24ac, 0x24a7, 0x24a2, 0x249e, 0x2499, 0x2495, 0x2490, + 0x248b, 0x2487, 0x2482, 0x247e, 0x2479, 0x2475, 0x2470, 0x246c, + 0x2468, 0x2463, 0x245f, 0x245a, 0x2456, 0x2452, 0x244d, 0x2449, + 0x2445, 0x2441, 0x243c, 0x2438, 0x2434, 0x2430, 0x242c, 0x2427, + 0x2423, 0x241f, 0x241b, 0x2417, 0x2413, 0x240f, 0x240b, 0x2407, + 0x2403, 0x23fd, 0x23f5, 0x23ed, 0x23e6, 0x23de, 0x23d6, 0x23ce, + 0x23c6, 0x23be, 0x23b7, 0x23af, 0x23a7, 0x23a0, 0x2398, 0x2391, + 0x2389, 0x2381, 0x237a, 0x2373, 0x236b, 0x2364, 0x235c, 0x2355, + 0x234e, 0x2346, 0x233f, 0x2338, 0x2331, 0x2329, 0x2322, 0x231b, + 0x2314, 0x230d, 0x2306, 0x22ff, 0x22f8, 0x22f1, 0x22ea, 0x22e3, + 0x22dc, 0x22d6, 0x22cf, 0x22c8, 0x22c1, 0x22ba, 0x22b4, 0x22ad, + 0x22a6, 0x22a0, 0x2299, 0x2292, 0x228c, 0x2285, 0x227f, 0x2278, + 0x2272, 0x226c, 0x2265, 0x225f, 0x2258, 0x2252, 0x224c, 0x2245, + 0x223f, 0x2239, 0x2233, 0x222d, 0x2226, 0x2220, 0x221a, 0x2214, + 0x220e, 0x2208, 0x2202, 0x21fc, 0x21f6, 0x21f0, 0x21ea, 0x21e4, + 0x21de, 0x21d8, 0x21d3, 0x21cd, 0x21c7, 0x21c1, 0x21bb, 0x21b6, + 0x21b0, 0x21aa, 0x21a5, 0x219f, 0x219a, 0x2194, 0x218e, 0x2189, + 0x2183, 0x217e, 0x2178, 0x2173, 0x216d, 0x2168, 0x2163, 0x215d, + 0x2158, 0x2153, 0x214d, 0x2148, 0x2143, 0x213d, 0x2138, 0x2133, + 0x212e, 0x2129, 0x2123, 0x211e, 0x2119, 0x2114, 0x210f, 0x210a, + 0x2105, 0x2100, 0x20fb, 0x20f6, 0x20f1, 0x20ec, 0x20e7, 0x20e2, + 0x20dd, 0x20d9, 0x20d4, 0x20cf, 0x20ca, 0x20c5, 0x20c1, 0x20bc, + 0x20b7, 0x20b2, 0x20ae, 0x20a9, 0x20a4, 0x20a0, 0x209b, 0x2097, + 0x2092, 0x208d, 0x2089, 0x2084, 0x2080, 0x207b, 0x2077, 0x2072, + 0x206e, 0x206a, 0x2065, 0x2061, 0x205c, 0x2058, 0x2054, 0x204f, + 0x204b, 0x2047, 0x2043, 0x203e, 0x203a, 0x2036, 0x2032, 0x202d, + 0x2029, 0x2025, 0x2021, 0x201d, 0x2019, 0x2015, 0x2011, 0x200d, + 0x2009, 0x2004, 0x2000, 0x1ff9, 0x1ff1, 0x1fe9, 0x1fe1, 0x1fd9, + 0x1fd1, 0x1fca, 0x1fc2, 0x1fba, 0x1fb2, 0x1fab, 0x1fa3, 0x1f9c, + 0x1f94, 0x1f8c, 0x1f85, 0x1f7d, 0x1f76, 0x1f6e, 0x1f67, 0x1f60, + 0x1f58, 0x1f51, 0x1f4a, 0x1f42, 0x1f3b, 0x1f34, 0x1f2d, 0x1f26, + 0x1f1e, 0x1f17, 0x1f10, 0x1f09, 0x1f02, 0x1efb, 0x1ef4, 0x1eed, + 0x1ee6, 0x1edf, 0x1ed9, 0x1ed2, 0x1ecb, 0x1ec4, 0x1ebd, 0x1eb7, + 0x1eb0, 0x1ea9, 0x1ea3, 0x1e9c, 0x1e95, 0x1e8f, 0x1e88, 0x1e82, + 0x1e7b, 0x1e75, 0x1e6e, 0x1e68, 0x1e62, 0x1e5b, 0x1e55, 0x1e4f, + 0x1e48, 0x1e42, 0x1e3c, 0x1e36, 0x1e2f, 0x1e29, 0x1e23, 0x1e1d, + 0x1e17, 0x1e11, 0x1e0b, 0x1e05, 0x1dff, 0x1df9, 0x1df3, 0x1ded, + 0x1de7, 0x1de1, 0x1ddb, 0x1dd5, 0x1dcf, 0x1dca, 0x1dc4, 0x1dbe, + 0x1db8, 0x1db3, 0x1dad, 0x1da7, 0x1da2, 0x1d9c, 0x1d96, 0x1d91, + 0x1d8b, 0x1d86, 0x1d80, 0x1d7b, 0x1d75, 0x1d70, 0x1d6a, 0x1d65, + 0x1d60, 0x1d5a, 0x1d55, 0x1d50, 0x1d4a, 0x1d45, 0x1d40, 0x1d3b, + 0x1d35, 0x1d30, 0x1d2b, 0x1d26, 0x1d21, 0x1d1b, 0x1d16, 0x1d11, + 0x1d0c, 0x1d07, 0x1d02, 0x1cfd, 0x1cf8, 0x1cf3, 0x1cee, 0x1ce9, + 0x1ce5, 0x1ce0, 0x1cdb, 0x1cd6, 0x1cd1, 0x1ccc, 0x1cc7, 0x1cc3, + 0x1cbe, 0x1cb9, 0x1cb5, 0x1cb0, 0x1cab, 0x1ca6, 0x1ca2, 0x1c9d, + 0x1c99, 0x1c94, 0x1c8f, 0x1c8b, 0x1c86, 0x1c82, 0x1c7d, 0x1c79, + 0x1c74, 0x1c70, 0x1c6c, 0x1c67, 0x1c63, 0x1c5e, 0x1c5a, 0x1c56, + 0x1c51, 0x1c4d, 0x1c49, 0x1c44, 0x1c40, 0x1c3c, 0x1c38, 0x1c34, + 0x1c2f, 0x1c2b, 0x1c27, 0x1c23, 0x1c1f, 0x1c1b, 0x1c17, 0x1c12, + 0x1c0e, 0x1c0a, 0x1c06, 0x1c02, 0x1bfd, 0x1bf5, 0x1bed, 0x1be5, + 0x1bdd, 0x1bd5, 0x1bcd, 0x1bc5, 0x1bbe, 0x1bb6, 0x1bae, 0x1ba7, + 0x1b9f, 0x1b97, 0x1b90, 0x1b88, 0x1b81, 0x1b79, 0x1b72, 0x1b6a, + 0x1b63, 0x1b5c, 0x1b54, 0x1b4d, 0x1b46, 0x1b3e, 0x1b37, 0x1b30, + 0x1b29, 0x1b22, 0x1b1a, 0x1b13, 0x1b0c, 0x1b05, 0x1afe, 0x1af7, + 0x1af0, 0x1ae9, 0x1ae2, 0x1adc, 0x1ad5, 0x1ace, 0x1ac7, 0x1ac0, + 0x1aba, 0x1ab3, 0x1aac, 0x1aa6, 0x1a9f, 0x1a98, 0x1a92, 0x1a8b, + 0x1a85, 0x1a7e, 0x1a78, 0x1a71, 0x1a6b, 0x1a64, 0x1a5e, 0x1a58, + 0x1a51, 0x1a4b, 0x1a45, 0x1a3f, 0x1a38, 0x1a32, 0x1a2c, 0x1a26, + 0x1a20, 0x1a19, 0x1a13, 0x1a0d, 0x1a07, 0x1a01, 0x19fb, 0x19f5, + 0x19ef, 0x19e9, 0x19e4, 0x19de, 0x19d8, 0x19d2, 0x19cc, 0x19c6, + 0x19c1, 0x19bb, 0x19b5, 0x19af, 0x19aa, 0x19a4, 0x199f, 0x1999, + 0x1993, 0x198e, 0x1988, 0x1983, 0x197d, 0x1978, 0x1972, 0x196d, + 0x1967, 0x1962, 0x195d, 0x1957, 0x1952, 0x194d, 0x1947, 0x1942, + 0x193d, 0x1938, 0x1932, 0x192d, 0x1928, 0x1923, 0x191e, 0x1919, + 0x1914, 0x190f, 0x1909, 0x1904, 0x18ff, 0x18fa, 0x18f5, 0x18f1, + 0x18ec, 0x18e7, 0x18e2, 0x18dd, 0x18d8, 0x18d3, 0x18ce, 0x18ca, + 0x18c5, 0x18c0, 0x18bb, 0x18b7, 0x18b2, 0x18ad, 0x18a9, 0x18a4, + 0x189f, 0x189b, 0x1896, 0x1891, 0x188d, 0x1888, 0x1884, 0x187f, + 0x187b, 0x1876, 0x1872, 0x186e, 0x1869, 0x1865, 0x1860, 0x185c, + 0x1858, 0x1853, 0x184f, 0x184b, 0x1846, 0x1842, 0x183e, 0x183a, + 0x1835, 0x1831, 0x182d, 0x1829, 0x1825, 0x1821, 0x181c, 0x1818, + 0x1814, 0x1810, 0x180c, 0x1808, 0x1804, 0x1800, 0x17f8, 0x17f0, + 0x17e8, 0x17e0, 0x17d8, 0x17d1, 0x17c9, 0x17c1, 0x17b9, 0x17b2, + 0x17aa, 0x17a2, 0x179b, 0x1793, 0x178c, 0x1784, 0x177d, 0x1775, + 0x176e, 0x1766, 0x175f, 0x1757, 0x1750, 0x1749, 0x1742, 0x173a, + 0x1733, 0x172c, 0x1725, 0x171e, 0x1717, 0x170f, 0x1708, 0x1701, + 0x16fa, 0x16f3, 0x16ec, 0x16e6, 0x16df, 0x16d8, 0x16d1, 0x16ca, + 0x16c3, 0x16bd, 0x16b6, 0x16af, 0x16a9, 0x16a2, 0x169b, 0x1695, + 0x168e, 0x1688, 0x1681, 0x167b, 0x1674, 0x166e, 0x1667, 0x1661, + 0x165b, 0x1654, 0x164e, 0x1648, 0x1641, 0x163b, 0x1635, 0x162f, + 0x1628, 0x1622, 0x161c, 0x1616, 0x1610, 0x160a, 0x1604, 0x15fe, + 0x15f8, 0x15f2, 0x15ec, 0x15e6, 0x15e0, 0x15da, 0x15d5, 0x15cf, + 0x15c9, 0x15c3, 0x15bd, 0x15b8, 0x15b2, 0x15ac, 0x15a7, 0x15a1, + 0x159b, 0x1596, 0x1590, 0x158b, 0x1585, 0x1580, 0x157a, 0x1575, + 0x156f, 0x156a, 0x1564, 0x155f, 0x155a, 0x1554, 0x154f, 0x154a, + 0x1544, 0x153f, 0x153a, 0x1535, 0x1530, 0x152a, 0x1525, 0x1520, + 0x151b, 0x1516, 0x1511, 0x150c, 0x1507, 0x1502, 0x14fd, 0x14f8, + 0x14f3, 0x14ee, 0x14e9, 0x14e4, 0x14df, 0x14da, 0x14d5, 0x14d1, + 0x14cc, 0x14c7, 0x14c2, 0x14bd, 0x14b9, 0x14b4, 0x14af, 0x14ab, + 0x14a6, 0x14a1, 0x149d, 0x1498, 0x1494, 0x148f, 0x148a, 0x1486, + 0x1481, 0x147d, 0x1478, 0x1474, 0x146f, 0x146b, 0x1467, 0x1462, + 0x145e, 0x145a, 0x1455, 0x1451, 0x144d, 0x1448, 0x1444, 0x1440, + 0x143b, 0x1437, 0x1433, 0x142f, 0x142b, 0x1427, 0x1422, 0x141e, + 0x141a, 0x1416, 0x1412, 0x140e, 0x140a, 0x1406, 0x1402, 0x13fc, + 0x13f4, 0x13ec, 0x13e4, 0x13dc, 0x13d4, 0x13cc, 0x13c5, 0x13bd, + 0x13b5, 0x13ad, 0x13a6, 0x139e, 0x1396, 0x138f, 0x1387, 0x1380, + 0x1378, 0x1371, 0x1369, 0x1362, 0x135b, 0x1353, 0x134c, 0x1345, + 0x133e, 0x1336, 0x132f, 0x1328, 0x1321, 0x131a, 0x1313, 0x130c, + 0x1304, 0x12fd, 0x12f7, 0x12f0, 0x12e9, 0x12e2, 0x12db, 0x12d4, + 0x12cd, 0x12c6, 0x12c0, 0x12b9, 0x12b2, 0x12ac, 0x12a5, 0x129e, + 0x1298, 0x1291, 0x128b, 0x1284, 0x127d, 0x1277, 0x1271, 0x126a, + 0x1264, 0x125d, 0x1257, 0x1251, 0x124a, 0x1244, 0x123e, 0x1238, + 0x1231, 0x122b, 0x1225, 0x121f, 0x1219, 0x1213, 0x120d, 0x1207, + 0x1201, 0x11fb, 0x11f5, 0x11ef, 0x11e9, 0x11e3, 0x11dd, 0x11d7, + 0x11d1, 0x11cc, 0x11c6, 0x11c0, 0x11ba, 0x11b5, 0x11af, 0x11a9, + 0x11a4, 0x119e, 0x1198, 0x1193, 0x118d, 0x1188, 0x1182, 0x117d, + 0x1177, 0x1172, 0x116c, 0x1167, 0x1161, 0x115c, 0x1157, 0x1151, + 0x114c, 0x1147, 0x1142, 0x113c, 0x1137, 0x1132, 0x112d, 0x1127, + 0x1122, 0x111d, 0x1118, 0x1113, 0x110e, 0x1109, 0x1104, 0x10ff, + 0x10fa, 0x10f5, 0x10f0, 0x10eb, 0x10e6, 0x10e1, 0x10dc, 0x10d8, + 0x10d3, 0x10ce, 0x10c9, 0x10c4, 0x10c0, 0x10bb, 0x10b6, 0x10b1, + 0x10ad, 0x10a8, 0x10a3, 0x109f, 0x109a, 0x1096, 0x1091, 0x108c, + 0x1088, 0x1083, 0x107f, 0x107a, 0x1076, 0x1071, 0x106d, 0x1069, + 0x1064, 0x1060, 0x105b, 0x1057, 0x1053, 0x104e, 0x104a, 0x1046, + 0x1042, 0x103d, 0x1039, 0x1035, 0x1031, 0x102d, 0x1028, 0x1024, + 0x1020, 0x101c, 0x1018, 0x1014, 0x1010, 0x100c, 0x1008, 0x1004, + 0x0fff, 0x0ff7, 0x0fef, 0x0fe7, 0x0fdf, 0x0fd8, 0x0fd0, 0x0fc8, + 0x0fc0, 0x0fb8, 0x0fb1, 0x0fa9, 0x0fa1, 0x0f9a, 0x0f92, 0x0f8b, + 0x0f83, 0x0f7c, 0x0f74, 0x0f6d, 0x0f65, 0x0f5e, 0x0f57, 0x0f4f, + 0x0f48, 0x0f41, 0x0f3a, 0x0f32, 0x0f2b, 0x0f24, 0x0f1d, 0x0f16, + 0x0f0f, 0x0f08, 0x0f01, 0x0efa, 0x0ef3, 0x0eec, 0x0ee5, 0x0ede, + 0x0ed7, 0x0ed0, 0x0ec9, 0x0ec3, 0x0ebc, 0x0eb5, 0x0eaf, 0x0ea8, + 0x0ea1, 0x0e9b, 0x0e94, 0x0e8d, 0x0e87, 0x0e80, 0x0e7a, 0x0e73, + 0x0e6d, 0x0e67, 0x0e60, 0x0e5a, 0x0e53, 0x0e4d, 0x0e47, 0x0e41, + 0x0e3a, 0x0e34, 0x0e2e, 0x0e28, 0x0e22, 0x0e1c, 0x0e15, 0x0e0f, + 0x0e09, 0x0e03, 0x0dfd, 0x0df7, 0x0df1, 0x0deb, 0x0de6, 0x0de0, + 0x0dda, 0x0dd4, 0x0dce, 0x0dc8, 0x0dc3, 0x0dbd, 0x0db7, 0x0db1, + 0x0dac, 0x0da6, 0x0da0, 0x0d9b, 0x0d95, 0x0d90, 0x0d8a, 0x0d85, + 0x0d7f, 0x0d74, 0x0d69, 0x0d5e, 0x0d54, 0x0d49, 0x0d3f, 0x0d34, + 0x0d2a, 0x0d1f, 0x0d15, 0x0d0b, 0x0d01, 0x0cf7, 0x0ced, 0x0ce3, + 0x0cda, 0x0cd0, 0x0cc6, 0x0cbd, 0x0cb3, 0x0caa, 0x0ca1, 0x0c98, + 0x0c8e, 0x0c85, 0x0c7c, 0x0c73, 0x0c6b, 0x0c62, 0x0c59, 0x0c50, + 0x0c48, 0x0c3f, 0x0c37, 0x0c2e, 0x0c26, 0x0c1e, 0x0c16, 0x0c0d, + 0x0c05, 0x0bfb, 0x0beb, 0x0bdb, 0x0bcb, 0x0bbc, 0x0bad, 0x0b9d, + 0x0b8e, 0x0b7f, 0x0b70, 0x0b61, 0x0b53, 0x0b44, 0x0b36, 0x0b27, + 0x0b19, 0x0b0b, 0x0afd, 0x0aef, 0x0ae1, 0x0ad3, 0x0ac6, 0x0ab8, + 0x0aab, 0x0a9e, 0x0a90, 0x0a83, 0x0a76, 0x0a69, 0x0a5d, 0x0a50, + 0x0a43, 0x0a37, 0x0a2b, 0x0a1e, 0x0a12, 0x0a06, 0x09fa, 0x09ee, + 0x09e2, 0x09d7, 0x09cb, 0x09bf, 0x09b4, 0x09a9, 0x099d, 0x0992, + 0x0987, 0x097c, 0x0971, 0x0966, 0x095b, 0x0951, 0x0946, 0x093c, + 0x0931, 0x0927, 0x091d, 0x0912, 0x0908, 0x08fe, 0x08f4, 0x08eb, + 0x08e1, 0x08d7, 0x08cd, 0x08c4, 0x08ba, 0x08b1, 0x08a8, 0x089e, + 0x0895, 0x088c, 0x0883, 0x087a, 0x0871, 0x0868, 0x085f, 0x0857, + 0x084e, 0x0845, 0x083d, 0x0834, 0x082c, 0x0824, 0x081c, 0x0813, + 0x080b, 0x0803, 0x07f6, 0x07e7, 0x07d7, 0x07c7, 0x07b8, 0x07a8, + 0x0799, 0x078a, 0x077b, 0x076c, 0x075d, 0x074f, 0x0740, 0x0732, + 0x0723, 0x0715, 0x0707, 0x06f9, 0x06eb, 0x06dd, 0x06d0, 0x06c2, + 0x06b4, 0x06a7, 0x069a, 0x068d, 0x0680, 0x0673, 0x0666, 0x0659, + 0x064c, 0x0640, 0x0633, 0x0627, 0x061b, 0x060f, 0x0603, 0x05f7, + 0x05eb, 0x05df, 0x05d3, 0x05c8, 0x05bc, 0x05b1, 0x05a5, 0x059a, + 0x058f, 0x0584, 0x0579, 0x056e, 0x0563, 0x0558, 0x054e, 0x0543, + 0x0539, 0x052e, 0x0524, 0x051a, 0x0510, 0x0506, 0x04fc, 0x04f2, + 0x04e8, 0x04de, 0x04d4, 0x04cb, 0x04c1, 0x04b8, 0x04ae, 0x04a5, + 0x049c, 0x0493, 0x0489, 0x0480, 0x0477, 0x046f, 0x0466, 0x045d, + 0x0454, 0x044c, 0x0443, 0x043b, 0x0432, 0x042a, 0x0421, 0x0419, + 0x0411, 0x0409, 0x0401, 0x03f9, 0x03f1, 0x03e9, 0x03e1, 0x03da, + 0x03d2, 0x03ca, 0x03c3, 0x03bb, 0x03b4, 0x03ad, 0x03a5, 0x039e, + 0x0397, 0x0390, 0x0389, 0x0381, 0x037a, 0x0374, 0x036d, 0x0366, + 0x035f, 0x0358, 0x0352, 0x034b, 0x0345, 0x033e, 0x0338, 0x0331, + 0x032b, 0x0324, 0x031e, 0x0318, 0x0312, 0x030c, 0x0306, 0x0300, + 0x02fa, 0x02f4, 0x02ee, 0x02e8, 0x02e2, 0x02dd, 0x02d7, 0x02d1, + 0x02cc, 0x02c6, 0x02c0, 0x02bb, 0x02b6, 0x02b0, 0x02ab, 0x02a5, + 0x02a0, 0x029b, 0x0296, 0x0291, 0x028c, 0x0286, 0x0281, 0x027c, + 0x0277, 0x0273, 0x026e, 0x0269, 0x0264, 0x025f, 0x025b, 0x0256, + 0x0251, 0x024d, 0x0248, 0x0243, 0x023f, 0x023a, 0x0236, 0x0232, + 0x022d, 0x0229, 0x0225, 0x0220, 0x021c, 0x0218, 0x0214, 0x0210, + 0x020b, 0x0207, 0x0203, 0x01ff, 0x01fb, 0x01f7, 0x01f4, 0x01f0, + 0x01ec, 0x01e8, 0x01e4, 0x01e0, 0x01dd, 0x01d9, 0x01d5, 0x01d2, + 0x01ce, 0x01ca, 0x01c7, 0x01c3, 0x01c0, 0x01bc, 0x01b9, 0x01b5, + 0x01b2, 0x01af, 0x01ab, 0x01a8, 0x01a5, 0x01a1, 0x019e, 0x019b, + 0x0198, 0x0195, 0x0191, 0x018e, 0x018b, 0x0188, 0x0185, 0x0182, + 0x017f, 0x017c, 0x0179, 0x0176, 0x0173, 0x0170, 0x016d, 0x016b, + 0x0168, 0x0165, 0x0162, 0x015f, 0x015d, 0x015a, 0x0157, 0x0155, + 0x0152, 0x014f, 0x014d, 0x014a, 0x0148, 0x0145, 0x0143, 0x0140, + 0x013e, 0x013b, 0x0139, 0x0136, 0x0134, 0x0131, 0x012f, 0x012d, + 0x012a, 0x0128, 0x0126, 0x0123, 0x0121, 0x011f, 0x011d, 0x011a, + 0x0118, 0x0116, 0x0114, 0x0112, 0x0110, 0x010d, 0x010b, 0x0109, + 0x0107, 0x0105, 0x0103, 0x0101, 0x00ff, 0x00fd, 0x00fb, 0x00f9, + 0x00f7, 0x00f5, 0x00f3, 0x00f2, 0x00f0, 0x00ee, 0x00ec, 0x00ea, + 0x00e8, 0x00e6, 0x00e5, 0x00e3, 0x00e1, 0x00df, 0x00de, 0x00dc, + 0x00da, 0x00d9, 0x00d7, 0x00d5, 0x00d4, 0x00d2, 0x00d0, 0x00cf, + 0x00cd, 0x00cb, 0x00ca, 0x00c8, 0x00c7, 0x00c5, 0x00c4, 0x00c2, + 0x00c1, 0x00bf, 0x00be, 0x00bc, 0x00bb, 0x00b9, 0x00b8, 0x00b6, + 0x00b5, 0x00b4, 0x00b2, 0x00b1, 0x00af, 0x00ae, 0x00ad, 0x00ab, + 0x00aa, 0x00a9, 0x00a7, 0x00a6, 0x00a5, 0x00a3, 0x00a2, 0x00a1, + 0x00a0, 0x009e, 0x009d, 0x009c, 0x009b, 0x009a, 0x0098, 0x0097, + 0x0096, 0x0095, 0x0094, 0x0093, 0x0091, 0x0090, 0x008f, 0x008e, + 0x008d, 0x008c, 0x008b, 0x008a, 0x0089, 0x0087, 0x0086, 0x0085, + 0x0084, 0x0083, 0x0082, 0x0081, 0x0080, 0x007f, 0x007e, 0x007d, + 0x007c, 0x007b, 0x007a, 0x0079, 0x0079, 0x0078, 0x0077, 0x0076, + 0x0075, 0x0074, 0x0073, 0x0072, 0x0071, 0x0070, 0x006f, 0x006f, + 0x006e, 0x006d, 0x006c, 0x006b, 0x006a, 0x006a, 0x0069, 0x0068, + 0x0067, 0x0066, 0x0065, 0x0065, 0x0064, 0x0063, 0x0062, 0x0062, + 0x0061, 0x0060, 0x005f, 0x005f, 0x005e, 0x005d, 0x005c, 0x005c, + 0x005b, 0x005a, 0x005a, 0x0059, 0x0058, 0x0057, 0x0057, 0x0056, + 0x0055, 0x0055, 0x0054, 0x0053, 0x0053, 0x0052, 0x0052, 0x0051, + 0x0050, 0x0050, 0x004f, 0x004e, 0x004e, 0x004d, 0x004d, 0x004c, + 0x004b, 0x004b, 0x004a, 0x004a, 0x0049, 0x0049, 0x0048, 0x0047, + 0x0047, 0x0046, 0x0046, 0x0045, 0x0045, 0x0044, 0x0044, 0x0043, + 0x0043, 0x0042, 0x0042, 0x0041, 0x0041, 0x0040, 0x0040, 0x003f, + 0x003f, 0x003e, 0x003e, 0x003d, 0x003d, 0x003c, 0x003c, 0x003b, + 0x003b, 0x003a, 0x003a, 0x0039, 0x0039, 0x0038, 0x0038, 0x0038, + 0x0037, 0x0037, 0x0036, 0x0036, 0x0035, 0x0035, 0x0035, 0x0034, + 0x0034, 0x0033, 0x0033, 0x0033, 0x0032, 0x0032, 0x0031, 0x0031, + 0x0031, 0x0030, 0x0030, 0x0030, 0x002f, 0x002f, 0x002e, 0x002e, + 0x002e, 0x002d, 0x002d, 0x002d, 0x002c, 0x002c, 0x002c, 0x002b, + 0x002b, 0x002b, 0x002a, 0x002a, 0x002a, 0x0029, 0x0029, 0x0029, + 0x0028, 0x0028, 0x0028, 0x0027, 0x0027, 0x0027, 0x0027, 0x0026, + 0x0026, 0x0026, 0x0025, 0x0025, 0x0025, 0x0024, 0x0024, 0x0024, + 0x0024, 0x0023, 0x0023, 0x0023, 0x0023, 0x0022, 0x0022, 0x0022, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0020, 0x0020, 0x0020, 0x0020, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001d, 0x001d, 0x001d, 0x001d, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001b, 0x001b, 0x001b, 0x001b, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001a, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0017, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, + 0x0016, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0014, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0013, 0x0013, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, + 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, + 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +const unsigned short logTable[] = +{ + 0xfc00, 0xd829, 0xd7f9, 0xd7c5, 0xd7a0, 0xd783, 0xd76c, 0xd758, + 0xd747, 0xd738, 0xd72b, 0xd71e, 0xd713, 0xd709, 0xd700, 0xd6f7, + 0xd6ee, 0xd6e7, 0xd6df, 0xd6d8, 0xd6d2, 0xd6cc, 0xd6c6, 0xd6c0, + 0xd6bb, 0xd6b5, 0xd6b0, 0xd6ab, 0xd6a7, 0xd6a2, 0xd69e, 0xd69a, + 0xd696, 0xd692, 0xd68e, 0xd68a, 0xd687, 0xd683, 0xd680, 0xd67c, + 0xd679, 0xd676, 0xd673, 0xd670, 0xd66d, 0xd66a, 0xd667, 0xd665, + 0xd662, 0xd65f, 0xd65d, 0xd65a, 0xd658, 0xd655, 0xd653, 0xd650, + 0xd64e, 0xd64c, 0xd64a, 0xd647, 0xd645, 0xd643, 0xd641, 0xd63f, + 0xd63d, 0xd63b, 0xd639, 0xd637, 0xd635, 0xd633, 0xd632, 0xd630, + 0xd62e, 0xd62c, 0xd62a, 0xd629, 0xd627, 0xd625, 0xd624, 0xd622, + 0xd620, 0xd61f, 0xd61d, 0xd61c, 0xd61a, 0xd619, 0xd617, 0xd616, + 0xd614, 0xd613, 0xd611, 0xd610, 0xd60f, 0xd60d, 0xd60c, 0xd60a, + 0xd609, 0xd608, 0xd606, 0xd605, 0xd604, 0xd603, 0xd601, 0xd600, + 0xd5ff, 0xd5fe, 0xd5fc, 0xd5fb, 0xd5fa, 0xd5f9, 0xd5f8, 0xd5f7, + 0xd5f5, 0xd5f4, 0xd5f3, 0xd5f2, 0xd5f1, 0xd5f0, 0xd5ef, 0xd5ee, + 0xd5ed, 0xd5eb, 0xd5ea, 0xd5e9, 0xd5e8, 0xd5e7, 0xd5e6, 0xd5e5, + 0xd5e4, 0xd5e3, 0xd5e2, 0xd5e1, 0xd5e0, 0xd5df, 0xd5de, 0xd5dd, + 0xd5dd, 0xd5dc, 0xd5db, 0xd5da, 0xd5d9, 0xd5d8, 0xd5d7, 0xd5d6, + 0xd5d5, 0xd5d4, 0xd5d3, 0xd5d3, 0xd5d2, 0xd5d1, 0xd5d0, 0xd5cf, + 0xd5ce, 0xd5cd, 0xd5cd, 0xd5cc, 0xd5cb, 0xd5ca, 0xd5c9, 0xd5c9, + 0xd5c8, 0xd5c7, 0xd5c6, 0xd5c5, 0xd5c5, 0xd5c4, 0xd5c3, 0xd5c2, + 0xd5c1, 0xd5c1, 0xd5c0, 0xd5bf, 0xd5be, 0xd5be, 0xd5bd, 0xd5bc, + 0xd5bc, 0xd5bb, 0xd5ba, 0xd5b9, 0xd5b9, 0xd5b8, 0xd5b7, 0xd5b7, + 0xd5b6, 0xd5b5, 0xd5b4, 0xd5b4, 0xd5b3, 0xd5b2, 0xd5b2, 0xd5b1, + 0xd5b0, 0xd5b0, 0xd5af, 0xd5ae, 0xd5ae, 0xd5ad, 0xd5ac, 0xd5ac, + 0xd5ab, 0xd5ab, 0xd5aa, 0xd5a9, 0xd5a9, 0xd5a8, 0xd5a7, 0xd5a7, + 0xd5a6, 0xd5a6, 0xd5a5, 0xd5a4, 0xd5a4, 0xd5a3, 0xd5a3, 0xd5a2, + 0xd5a1, 0xd5a1, 0xd5a0, 0xd5a0, 0xd59f, 0xd59e, 0xd59e, 0xd59d, + 0xd59d, 0xd59c, 0xd59c, 0xd59b, 0xd59a, 0xd59a, 0xd599, 0xd599, + 0xd598, 0xd598, 0xd597, 0xd597, 0xd596, 0xd595, 0xd595, 0xd594, + 0xd594, 0xd593, 0xd593, 0xd592, 0xd592, 0xd591, 0xd591, 0xd590, + 0xd590, 0xd58f, 0xd58f, 0xd58e, 0xd58e, 0xd58d, 0xd58d, 0xd58c, + 0xd58c, 0xd58b, 0xd58b, 0xd58a, 0xd58a, 0xd589, 0xd589, 0xd588, + 0xd588, 0xd587, 0xd587, 0xd586, 0xd586, 0xd585, 0xd585, 0xd584, + 0xd584, 0xd583, 0xd583, 0xd582, 0xd582, 0xd581, 0xd581, 0xd581, + 0xd580, 0xd580, 0xd57f, 0xd57f, 0xd57e, 0xd57e, 0xd57d, 0xd57d, + 0xd57c, 0xd57c, 0xd57c, 0xd57b, 0xd57b, 0xd57a, 0xd57a, 0xd579, + 0xd579, 0xd579, 0xd578, 0xd578, 0xd577, 0xd577, 0xd576, 0xd576, + 0xd576, 0xd575, 0xd575, 0xd574, 0xd574, 0xd573, 0xd573, 0xd573, + 0xd572, 0xd572, 0xd571, 0xd571, 0xd571, 0xd570, 0xd570, 0xd56f, + 0xd56f, 0xd56f, 0xd56e, 0xd56e, 0xd56d, 0xd56d, 0xd56d, 0xd56c, + 0xd56c, 0xd56b, 0xd56b, 0xd56b, 0xd56a, 0xd56a, 0xd56a, 0xd569, + 0xd569, 0xd568, 0xd568, 0xd568, 0xd567, 0xd567, 0xd566, 0xd566, + 0xd566, 0xd565, 0xd565, 0xd565, 0xd564, 0xd564, 0xd564, 0xd563, + 0xd563, 0xd562, 0xd562, 0xd562, 0xd561, 0xd561, 0xd561, 0xd560, + 0xd560, 0xd560, 0xd55f, 0xd55f, 0xd55f, 0xd55e, 0xd55e, 0xd55d, + 0xd55d, 0xd55d, 0xd55c, 0xd55c, 0xd55c, 0xd55b, 0xd55b, 0xd55b, + 0xd55a, 0xd55a, 0xd55a, 0xd559, 0xd559, 0xd559, 0xd558, 0xd558, + 0xd558, 0xd557, 0xd557, 0xd557, 0xd556, 0xd556, 0xd556, 0xd555, + 0xd555, 0xd555, 0xd554, 0xd554, 0xd554, 0xd553, 0xd553, 0xd553, + 0xd552, 0xd552, 0xd552, 0xd551, 0xd551, 0xd551, 0xd551, 0xd550, + 0xd550, 0xd550, 0xd54f, 0xd54f, 0xd54f, 0xd54e, 0xd54e, 0xd54e, + 0xd54d, 0xd54d, 0xd54d, 0xd54d, 0xd54c, 0xd54c, 0xd54c, 0xd54b, + 0xd54b, 0xd54b, 0xd54a, 0xd54a, 0xd54a, 0xd549, 0xd549, 0xd549, + 0xd549, 0xd548, 0xd548, 0xd548, 0xd547, 0xd547, 0xd547, 0xd547, + 0xd546, 0xd546, 0xd546, 0xd545, 0xd545, 0xd545, 0xd545, 0xd544, + 0xd544, 0xd544, 0xd543, 0xd543, 0xd543, 0xd543, 0xd542, 0xd542, + 0xd542, 0xd541, 0xd541, 0xd541, 0xd541, 0xd540, 0xd540, 0xd540, + 0xd53f, 0xd53f, 0xd53f, 0xd53f, 0xd53e, 0xd53e, 0xd53e, 0xd53e, + 0xd53d, 0xd53d, 0xd53d, 0xd53c, 0xd53c, 0xd53c, 0xd53c, 0xd53b, + 0xd53b, 0xd53b, 0xd53b, 0xd53a, 0xd53a, 0xd53a, 0xd53a, 0xd539, + 0xd539, 0xd539, 0xd538, 0xd538, 0xd538, 0xd538, 0xd537, 0xd537, + 0xd537, 0xd537, 0xd536, 0xd536, 0xd536, 0xd536, 0xd535, 0xd535, + 0xd535, 0xd535, 0xd534, 0xd534, 0xd534, 0xd534, 0xd533, 0xd533, + 0xd533, 0xd533, 0xd532, 0xd532, 0xd532, 0xd532, 0xd531, 0xd531, + 0xd531, 0xd531, 0xd530, 0xd530, 0xd530, 0xd530, 0xd52f, 0xd52f, + 0xd52f, 0xd52f, 0xd52e, 0xd52e, 0xd52e, 0xd52e, 0xd52d, 0xd52d, + 0xd52d, 0xd52d, 0xd52d, 0xd52c, 0xd52c, 0xd52c, 0xd52c, 0xd52b, + 0xd52b, 0xd52b, 0xd52b, 0xd52a, 0xd52a, 0xd52a, 0xd52a, 0xd529, + 0xd529, 0xd529, 0xd529, 0xd529, 0xd528, 0xd528, 0xd528, 0xd528, + 0xd527, 0xd527, 0xd527, 0xd527, 0xd526, 0xd526, 0xd526, 0xd526, + 0xd526, 0xd525, 0xd525, 0xd525, 0xd525, 0xd524, 0xd524, 0xd524, + 0xd524, 0xd524, 0xd523, 0xd523, 0xd523, 0xd523, 0xd522, 0xd522, + 0xd522, 0xd522, 0xd522, 0xd521, 0xd521, 0xd521, 0xd521, 0xd520, + 0xd520, 0xd520, 0xd520, 0xd520, 0xd51f, 0xd51f, 0xd51f, 0xd51f, + 0xd51f, 0xd51e, 0xd51e, 0xd51e, 0xd51e, 0xd51d, 0xd51d, 0xd51d, + 0xd51d, 0xd51d, 0xd51c, 0xd51c, 0xd51c, 0xd51c, 0xd51c, 0xd51b, + 0xd51b, 0xd51b, 0xd51b, 0xd51b, 0xd51a, 0xd51a, 0xd51a, 0xd51a, + 0xd51a, 0xd519, 0xd519, 0xd519, 0xd519, 0xd518, 0xd518, 0xd518, + 0xd518, 0xd518, 0xd517, 0xd517, 0xd517, 0xd517, 0xd517, 0xd516, + 0xd516, 0xd516, 0xd516, 0xd516, 0xd515, 0xd515, 0xd515, 0xd515, + 0xd515, 0xd514, 0xd514, 0xd514, 0xd514, 0xd514, 0xd514, 0xd513, + 0xd513, 0xd513, 0xd513, 0xd513, 0xd512, 0xd512, 0xd512, 0xd512, + 0xd512, 0xd511, 0xd511, 0xd511, 0xd511, 0xd511, 0xd510, 0xd510, + 0xd510, 0xd510, 0xd510, 0xd50f, 0xd50f, 0xd50f, 0xd50f, 0xd50f, + 0xd50f, 0xd50e, 0xd50e, 0xd50e, 0xd50e, 0xd50e, 0xd50d, 0xd50d, + 0xd50d, 0xd50d, 0xd50d, 0xd50c, 0xd50c, 0xd50c, 0xd50c, 0xd50c, + 0xd50c, 0xd50b, 0xd50b, 0xd50b, 0xd50b, 0xd50b, 0xd50a, 0xd50a, + 0xd50a, 0xd50a, 0xd50a, 0xd50a, 0xd509, 0xd509, 0xd509, 0xd509, + 0xd509, 0xd508, 0xd508, 0xd508, 0xd508, 0xd508, 0xd508, 0xd507, + 0xd507, 0xd507, 0xd507, 0xd507, 0xd506, 0xd506, 0xd506, 0xd506, + 0xd506, 0xd506, 0xd505, 0xd505, 0xd505, 0xd505, 0xd505, 0xd505, + 0xd504, 0xd504, 0xd504, 0xd504, 0xd504, 0xd504, 0xd503, 0xd503, + 0xd503, 0xd503, 0xd503, 0xd502, 0xd502, 0xd502, 0xd502, 0xd502, + 0xd502, 0xd501, 0xd501, 0xd501, 0xd501, 0xd501, 0xd501, 0xd500, + 0xd500, 0xd500, 0xd500, 0xd500, 0xd500, 0xd4ff, 0xd4ff, 0xd4ff, + 0xd4ff, 0xd4ff, 0xd4ff, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fe, 0xd4fe, + 0xd4fe, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fd, 0xd4fc, + 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fc, 0xd4fb, 0xd4fb, 0xd4fb, + 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fb, 0xd4fa, 0xd4fa, 0xd4fa, 0xd4fa, + 0xd4fa, 0xd4fa, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, 0xd4f9, + 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f8, 0xd4f7, 0xd4f7, + 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f7, 0xd4f6, 0xd4f6, 0xd4f6, + 0xd4f6, 0xd4f6, 0xd4f6, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, 0xd4f5, + 0xd4f5, 0xd4f5, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, 0xd4f4, + 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f3, 0xd4f2, + 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f2, 0xd4f1, 0xd4f1, + 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f1, 0xd4f0, 0xd4f0, 0xd4f0, 0xd4f0, + 0xd4f0, 0xd4f0, 0xd4f0, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, 0xd4ef, + 0xd4ef, 0xd4ef, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, 0xd4ee, + 0xd4ee, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, 0xd4ed, + 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4ec, 0xd4eb, 0xd4eb, + 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4eb, 0xd4ea, 0xd4ea, 0xd4ea, + 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4ea, 0xd4e9, 0xd4e9, 0xd4e9, + 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e9, 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e8, + 0xd4e8, 0xd4e8, 0xd4e8, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, 0xd4e7, + 0xd4e7, 0xd4e7, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, 0xd4e6, + 0xd4e6, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, 0xd4e5, + 0xd4e5, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, 0xd4e4, + 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, 0xd4e3, + 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e2, 0xd4e1, + 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e1, 0xd4e0, + 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4e0, 0xd4df, 0xd4df, + 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4df, 0xd4de, 0xd4de, + 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4de, 0xd4dd, 0xd4dd, + 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dd, 0xd4dc, 0xd4dc, + 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4dc, 0xd4db, 0xd4db, + 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4db, 0xd4da, 0xd4da, 0xd4da, + 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4da, 0xd4d9, 0xd4d9, 0xd4d9, + 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d9, 0xd4d8, 0xd4d8, + 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d8, 0xd4d7, 0xd4d7, + 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d7, 0xd4d6, 0xd4d6, + 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d6, 0xd4d5, 0xd4d5, + 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d5, 0xd4d4, 0xd4d4, + 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d4, 0xd4d3, + 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d3, 0xd4d2, + 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, 0xd4d2, + 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, 0xd4d1, + 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, 0xd4d0, + 0xd4d0, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, 0xd4cf, + 0xd4cf, 0xd4cf, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, 0xd4ce, + 0xd4ce, 0xd4ce, 0xd4ce, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cd, + 0xd4cd, 0xd4cd, 0xd4cd, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, + 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cc, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, + 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4cb, 0xd4ca, 0xd4ca, 0xd4ca, + 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4ca, 0xd4c9, 0xd4c9, + 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, 0xd4c9, + 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, 0xd4c8, + 0xd4c8, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, 0xd4c7, + 0xd4c7, 0xd4c7, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c6, + 0xd4c6, 0xd4c6, 0xd4c6, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, + 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c5, 0xd4c4, 0xd4c4, 0xd4c4, + 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c4, 0xd4c3, 0xd4c3, + 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, 0xd4c3, + 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, 0xd4c2, + 0xd4c2, 0xd4c2, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c1, + 0xd4c1, 0xd4c1, 0xd4c1, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, + 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4c0, 0xd4bf, 0xd4bf, 0xd4bf, + 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4bf, 0xd4be, + 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, 0xd4be, + 0xd4be, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bd, + 0xd4bd, 0xd4bd, 0xd4bd, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, + 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bc, 0xd4bb, 0xd4bb, 0xd4bb, + 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4bb, 0xd4ba, + 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, 0xd4ba, + 0xd4ba, 0xd4ba, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, + 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b9, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, + 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b8, 0xd4b7, + 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, 0xd4b7, + 0xd4b7, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, + 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b6, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, + 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b5, 0xd4b4, 0xd4b4, + 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, 0xd4b4, + 0xd4b4, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, + 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b3, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, + 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b2, 0xd4b1, + 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, 0xd4b1, + 0xd4b1, 0xd4b1, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, + 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4b0, 0xd4af, 0xd4af, 0xd4af, + 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, 0xd4af, + 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, + 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ae, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, + 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ad, 0xd4ac, + 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, 0xd4ac, + 0xd4ac, 0xd4ac, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, + 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4ab, 0xd4aa, 0xd4aa, + 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, 0xd4aa, + 0xd4aa, 0xd4aa, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, + 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a9, 0xd4a8, 0xd4a8, 0xd4a8, + 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, 0xd4a8, + 0xd4a8, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, + 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a7, 0xd4a6, 0xd4a6, 0xd4a6, + 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, 0xd4a6, + 0xd4a6, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, + 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a5, 0xd4a4, 0xd4a4, 0xd4a4, + 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, 0xd4a4, + 0xd4a4, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, + 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a3, 0xd4a2, 0xd4a2, + 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, 0xd4a2, + 0xd4a2, 0xd4a2, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, + 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a1, 0xd4a0, + 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, 0xd4a0, + 0xd4a0, 0xd4a0, 0xd4a0, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, + 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, 0xd49f, + 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, + 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49e, 0xd49d, 0xd49d, 0xd49d, + 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, 0xd49d, + 0xd49d, 0xd49d, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, + 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49c, 0xd49b, + 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49b, + 0xd49b, 0xd49b, 0xd49b, 0xd49b, 0xd49a, 0xd49a, 0xd49a, 0xd49a, + 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, 0xd49a, + 0xd49a, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, + 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd499, 0xd498, 0xd498, + 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, 0xd498, + 0xd498, 0xd498, 0xd498, 0xd498, 0xd497, 0xd497, 0xd497, 0xd497, + 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, 0xd497, + 0xd497, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, + 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd496, 0xd495, + 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, + 0xd495, 0xd495, 0xd495, 0xd495, 0xd495, 0xd494, 0xd494, 0xd494, + 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, 0xd494, + 0xd494, 0xd494, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, + 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, 0xd493, + 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, + 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd492, 0xd491, 0xd491, + 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, + 0xd491, 0xd491, 0xd491, 0xd491, 0xd491, 0xd490, 0xd490, 0xd490, + 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, 0xd490, + 0xd490, 0xd490, 0xd490, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, + 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, 0xd48f, + 0xd48f, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, + 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, 0xd48e, + 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, + 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48d, 0xd48c, 0xd48c, + 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, + 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48c, 0xd48b, 0xd48b, 0xd48b, + 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48b, + 0xd48b, 0xd48b, 0xd48b, 0xd48b, 0xd48a, 0xd48a, 0xd48a, 0xd48a, + 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, 0xd48a, + 0xd48a, 0xd48a, 0xd48a, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, + 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, 0xd489, + 0xd489, 0xd489, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, + 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, 0xd488, + 0xd488, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, + 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, 0xd487, + 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, + 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, 0xd486, + 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, + 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd485, 0xd484, + 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, + 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd484, 0xd483, + 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, + 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd483, 0xd482, + 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, + 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd482, 0xd481, + 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, 0xd481, + 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, 0xd480, + 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, 0xd47f, + 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, 0xd47e, + 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, 0xd47d, + 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, 0xd47c, + 0xd47c, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, 0xd47b, + 0xd47b, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, 0xd47a, + 0xd47a, 0xd47a, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, 0xd479, + 0xd479, 0xd479, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, 0xd478, + 0xd478, 0xd478, 0xd478, 0xd477, 0xd477, 0xd477, 0xd477, 0xd477, + 0xd477, 0xd477, 0xd477, 0xd476, 0xd476, 0xd476, 0xd476, 0xd476, + 0xd476, 0xd476, 0xd476, 0xd476, 0xd475, 0xd475, 0xd475, 0xd475, + 0xd475, 0xd475, 0xd475, 0xd475, 0xd475, 0xd474, 0xd474, 0xd474, + 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd474, 0xd473, 0xd473, + 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd473, 0xd472, + 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, 0xd472, + 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, 0xd471, + 0xd471, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, 0xd470, + 0xd470, 0xd470, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, 0xd46f, + 0xd46f, 0xd46f, 0xd46f, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, + 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46e, 0xd46d, 0xd46d, 0xd46d, + 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46d, 0xd46c, 0xd46c, + 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, 0xd46c, + 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, 0xd46b, + 0xd46b, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, 0xd46a, + 0xd46a, 0xd46a, 0xd46a, 0xd469, 0xd469, 0xd469, 0xd469, 0xd469, + 0xd469, 0xd469, 0xd469, 0xd469, 0xd468, 0xd468, 0xd468, 0xd468, + 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd468, 0xd467, 0xd467, + 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, 0xd467, + 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, 0xd466, + 0xd466, 0xd466, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, 0xd465, + 0xd465, 0xd465, 0xd465, 0xd465, 0xd464, 0xd464, 0xd464, 0xd464, + 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd464, 0xd463, 0xd463, + 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, 0xd463, + 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, 0xd462, + 0xd462, 0xd462, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, + 0xd461, 0xd461, 0xd461, 0xd461, 0xd461, 0xd460, 0xd460, 0xd460, + 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd460, 0xd45f, + 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, 0xd45f, + 0xd45f, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45e, + 0xd45e, 0xd45e, 0xd45e, 0xd45e, 0xd45d, 0xd45d, 0xd45d, 0xd45d, + 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45d, 0xd45c, + 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, 0xd45c, + 0xd45c, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45b, + 0xd45b, 0xd45b, 0xd45b, 0xd45b, 0xd45a, 0xd45a, 0xd45a, 0xd45a, + 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd45a, 0xd459, + 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, 0xd459, + 0xd459, 0xd459, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, + 0xd458, 0xd458, 0xd458, 0xd458, 0xd458, 0xd457, 0xd457, 0xd457, + 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, 0xd457, + 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, 0xd456, + 0xd456, 0xd456, 0xd456, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, + 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd455, 0xd454, + 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, 0xd454, + 0xd454, 0xd454, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, + 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd453, 0xd452, 0xd452, + 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, 0xd452, + 0xd452, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, + 0xd451, 0xd451, 0xd451, 0xd451, 0xd451, 0xd450, 0xd450, 0xd450, + 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, 0xd450, + 0xd450, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, + 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44f, 0xd44e, 0xd44e, 0xd44e, + 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, 0xd44e, + 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, + 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44d, 0xd44c, 0xd44c, 0xd44c, + 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, 0xd44c, + 0xd44c, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, + 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44b, 0xd44a, 0xd44a, 0xd44a, + 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, 0xd44a, + 0xd44a, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, + 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd449, 0xd448, 0xd448, + 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, + 0xd448, 0xd448, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, + 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd447, 0xd446, + 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, 0xd446, + 0xd446, 0xd446, 0xd446, 0xd446, 0xd445, 0xd445, 0xd445, 0xd445, + 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, 0xd445, + 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, + 0xd444, 0xd444, 0xd444, 0xd444, 0xd444, 0xd443, 0xd443, 0xd443, + 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, 0xd443, + 0xd443, 0xd443, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, + 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd442, 0xd441, + 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, + 0xd441, 0xd441, 0xd441, 0xd441, 0xd441, 0xd440, 0xd440, 0xd440, + 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, 0xd440, + 0xd440, 0xd440, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, + 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43f, 0xd43e, + 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, + 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43e, 0xd43d, 0xd43d, 0xd43d, + 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, 0xd43d, + 0xd43d, 0xd43d, 0xd43d, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, + 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, 0xd43c, + 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, + 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43b, 0xd43a, 0xd43a, + 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd43a, + 0xd43a, 0xd43a, 0xd43a, 0xd43a, 0xd439, 0xd439, 0xd439, 0xd439, + 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, 0xd439, + 0xd439, 0xd439, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, + 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, 0xd438, + 0xd438, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, + 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd437, 0xd436, + 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, + 0xd436, 0xd436, 0xd436, 0xd436, 0xd436, 0xd435, 0xd435, 0xd435, + 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, 0xd435, + 0xd435, 0xd435, 0xd435, 0xd435, 0xd434, 0xd434, 0xd434, 0xd434, + 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, 0xd434, + 0xd434, 0xd434, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, + 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, 0xd433, + 0xd433, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, + 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, 0xd432, + 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, + 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd431, 0xd430, + 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, + 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd430, 0xd42f, 0xd42f, + 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, + 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42f, 0xd42e, 0xd42e, 0xd42e, + 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, + 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42e, 0xd42d, 0xd42d, 0xd42d, + 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42d, + 0xd42d, 0xd42d, 0xd42d, 0xd42d, 0xd42c, 0xd42c, 0xd42c, 0xd42c, + 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42c, + 0xd42c, 0xd42c, 0xd42c, 0xd42c, 0xd42b, 0xd42b, 0xd42b, 0xd42b, + 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, 0xd42b, + 0xd42b, 0xd42b, 0xd42b, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, + 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, 0xd42a, + 0xd42a, 0xd42a, 0xd42a, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, + 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, 0xd429, + 0xd429, 0xd429, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, 0xd428, + 0xd428, 0xd428, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, 0xd427, + 0xd427, 0xd427, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, 0xd426, + 0xd426, 0xd426, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, 0xd425, + 0xd425, 0xd425, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, 0xd424, + 0xd424, 0xd424, 0xd424, 0xd423, 0xd423, 0xd423, 0xd423, 0xd423, + 0xd423, 0xd423, 0xd423, 0xd422, 0xd422, 0xd422, 0xd422, 0xd422, + 0xd422, 0xd422, 0xd422, 0xd422, 0xd421, 0xd421, 0xd421, 0xd421, + 0xd421, 0xd421, 0xd421, 0xd421, 0xd420, 0xd420, 0xd420, 0xd420, + 0xd420, 0xd420, 0xd420, 0xd420, 0xd420, 0xd41f, 0xd41f, 0xd41f, + 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41f, 0xd41e, 0xd41e, 0xd41e, + 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41e, 0xd41d, 0xd41d, + 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41d, 0xd41c, + 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, 0xd41c, + 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, 0xd41b, + 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, 0xd41a, + 0xd41a, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, 0xd419, + 0xd419, 0xd419, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, 0xd418, + 0xd418, 0xd418, 0xd418, 0xd418, 0xd417, 0xd417, 0xd417, 0xd417, + 0xd417, 0xd417, 0xd417, 0xd417, 0xd417, 0xd416, 0xd416, 0xd416, + 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd416, 0xd415, 0xd415, + 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd415, 0xd414, + 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, 0xd414, + 0xd414, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, 0xd413, + 0xd413, 0xd413, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, 0xd412, + 0xd412, 0xd412, 0xd412, 0xd412, 0xd411, 0xd411, 0xd411, 0xd411, + 0xd411, 0xd411, 0xd411, 0xd411, 0xd411, 0xd410, 0xd410, 0xd410, + 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd410, 0xd40f, + 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, 0xd40f, + 0xd40f, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, 0xd40e, + 0xd40e, 0xd40e, 0xd40e, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, + 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40d, 0xd40c, 0xd40c, 0xd40c, + 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40c, 0xd40b, + 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, 0xd40b, + 0xd40b, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, 0xd40a, + 0xd40a, 0xd40a, 0xd40a, 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, + 0xd409, 0xd409, 0xd409, 0xd409, 0xd409, 0xd408, 0xd408, 0xd408, + 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd408, 0xd407, + 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, 0xd407, + 0xd407, 0xd407, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, 0xd406, + 0xd406, 0xd406, 0xd406, 0xd406, 0xd405, 0xd405, 0xd405, 0xd405, + 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd405, 0xd404, + 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, 0xd404, + 0xd404, 0xd404, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, 0xd403, + 0xd403, 0xd403, 0xd403, 0xd403, 0xd402, 0xd402, 0xd402, 0xd402, + 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd402, 0xd401, + 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, 0xd401, + 0xd401, 0xd401, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, 0xd400, + 0xd400, 0xd400, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, 0xd3ff, + 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fe, 0xd3fd, 0xd3fd, 0xd3fd, + 0xd3fd, 0xd3fd, 0xd3fd, 0xd3fc, 0xd3fc, 0xd3fc, 0xd3fc, 0xd3fc, + 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fb, 0xd3fa, 0xd3fa, + 0xd3fa, 0xd3fa, 0xd3fa, 0xd3fa, 0xd3f9, 0xd3f9, 0xd3f9, 0xd3f9, + 0xd3f9, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f8, 0xd3f7, + 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f7, 0xd3f6, 0xd3f6, 0xd3f6, + 0xd3f6, 0xd3f6, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, 0xd3f5, + 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f4, 0xd3f3, 0xd3f3, + 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f3, 0xd3f2, 0xd3f2, 0xd3f2, 0xd3f2, + 0xd3f2, 0xd3f2, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f1, 0xd3f0, + 0xd3f0, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3f0, 0xd3ef, 0xd3ef, 0xd3ef, + 0xd3ef, 0xd3ef, 0xd3ef, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ee, 0xd3ee, + 0xd3ee, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ed, 0xd3ec, + 0xd3ec, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3ec, 0xd3eb, 0xd3eb, 0xd3eb, + 0xd3eb, 0xd3eb, 0xd3eb, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3ea, 0xd3ea, + 0xd3ea, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e9, 0xd3e8, + 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e8, 0xd3e7, 0xd3e7, 0xd3e7, + 0xd3e7, 0xd3e7, 0xd3e7, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, 0xd3e6, + 0xd3e6, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e5, 0xd3e4, + 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e4, 0xd3e3, 0xd3e3, 0xd3e3, + 0xd3e3, 0xd3e3, 0xd3e3, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, 0xd3e2, + 0xd3e2, 0xd3e2, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, 0xd3e1, + 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3e0, 0xd3df, 0xd3df, + 0xd3df, 0xd3df, 0xd3df, 0xd3df, 0xd3de, 0xd3de, 0xd3de, 0xd3de, + 0xd3de, 0xd3de, 0xd3de, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dd, 0xd3dd, + 0xd3dd, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3dc, 0xd3db, + 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3db, 0xd3da, 0xd3da, + 0xd3da, 0xd3da, 0xd3da, 0xd3da, 0xd3d9, 0xd3d9, 0xd3d9, 0xd3d9, + 0xd3d9, 0xd3d9, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, 0xd3d8, + 0xd3d8, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d7, 0xd3d6, + 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d6, 0xd3d5, 0xd3d5, + 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d5, 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d4, + 0xd3d4, 0xd3d4, 0xd3d4, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d3, 0xd3d3, + 0xd3d3, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, 0xd3d2, + 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d1, 0xd3d0, 0xd3d0, + 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3d0, 0xd3cf, 0xd3cf, 0xd3cf, + 0xd3cf, 0xd3cf, 0xd3cf, 0xd3cf, 0xd3ce, 0xd3ce, 0xd3ce, 0xd3ce, + 0xd3ce, 0xd3ce, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, 0xd3cd, + 0xd3cd, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, 0xd3cc, + 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3cb, 0xd3ca, + 0xd3ca, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3ca, 0xd3c9, 0xd3c9, 0xd3c9, + 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c9, 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c8, + 0xd3c8, 0xd3c8, 0xd3c8, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, 0xd3c7, + 0xd3c7, 0xd3c7, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, 0xd3c6, + 0xd3c6, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, 0xd3c5, + 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c4, 0xd3c3, + 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c3, 0xd3c2, 0xd3c2, + 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c2, 0xd3c1, 0xd3c1, 0xd3c1, + 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c1, 0xd3c0, 0xd3c0, 0xd3c0, 0xd3c0, + 0xd3c0, 0xd3c0, 0xd3c0, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, 0xd3bf, + 0xd3bf, 0xd3bf, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3be, 0xd3be, + 0xd3be, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, 0xd3bd, + 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bc, 0xd3bb, + 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3bb, 0xd3ba, 0xd3ba, + 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3ba, 0xd3b9, 0xd3b9, + 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b9, 0xd3b8, 0xd3b8, 0xd3b8, + 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b8, 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b7, + 0xd3b7, 0xd3b7, 0xd3b7, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b6, + 0xd3b6, 0xd3b6, 0xd3b6, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, 0xd3b5, + 0xd3b5, 0xd3b5, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, 0xd3b4, + 0xd3b4, 0xd3b4, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, 0xd3b3, + 0xd3b3, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, 0xd3b2, + 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, 0xd3b1, + 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3b0, 0xd3af, + 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3af, 0xd3ae, + 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ae, 0xd3ad, + 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ad, 0xd3ac, 0xd3ac, + 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ac, 0xd3ab, 0xd3ab, + 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3ab, 0xd3aa, 0xd3aa, 0xd3aa, + 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3aa, 0xd3a9, 0xd3a9, 0xd3a9, + 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a9, 0xd3a8, 0xd3a8, 0xd3a8, + 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a8, 0xd3a7, 0xd3a7, 0xd3a7, + 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a7, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, + 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a6, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, + 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a5, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, + 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a4, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, + 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a3, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, + 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a2, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, + 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a1, 0xd3a0, 0xd3a0, 0xd3a0, 0xd3a0, + 0xd3a0, 0xd3a0, 0xd39f, 0xd39f, 0xd39f, 0xd39f, 0xd39e, 0xd39e, + 0xd39e, 0xd39e, 0xd39d, 0xd39d, 0xd39d, 0xd39d, 0xd39c, 0xd39c, + 0xd39c, 0xd39c, 0xd39b, 0xd39b, 0xd39b, 0xd39b, 0xd39a, 0xd39a, + 0xd39a, 0xd39a, 0xd399, 0xd399, 0xd399, 0xd399, 0xd399, 0xd398, + 0xd398, 0xd398, 0xd398, 0xd397, 0xd397, 0xd397, 0xd397, 0xd396, + 0xd396, 0xd396, 0xd396, 0xd395, 0xd395, 0xd395, 0xd395, 0xd394, + 0xd394, 0xd394, 0xd394, 0xd393, 0xd393, 0xd393, 0xd393, 0xd393, + 0xd392, 0xd392, 0xd392, 0xd392, 0xd391, 0xd391, 0xd391, 0xd391, + 0xd390, 0xd390, 0xd390, 0xd390, 0xd38f, 0xd38f, 0xd38f, 0xd38f, + 0xd38f, 0xd38e, 0xd38e, 0xd38e, 0xd38e, 0xd38d, 0xd38d, 0xd38d, + 0xd38d, 0xd38c, 0xd38c, 0xd38c, 0xd38c, 0xd38b, 0xd38b, 0xd38b, + 0xd38b, 0xd38b, 0xd38a, 0xd38a, 0xd38a, 0xd38a, 0xd389, 0xd389, + 0xd389, 0xd389, 0xd389, 0xd388, 0xd388, 0xd388, 0xd388, 0xd387, + 0xd387, 0xd387, 0xd387, 0xd386, 0xd386, 0xd386, 0xd386, 0xd386, + 0xd385, 0xd385, 0xd385, 0xd385, 0xd384, 0xd384, 0xd384, 0xd384, + 0xd384, 0xd383, 0xd383, 0xd383, 0xd383, 0xd382, 0xd382, 0xd382, + 0xd382, 0xd382, 0xd381, 0xd381, 0xd381, 0xd381, 0xd380, 0xd380, + 0xd380, 0xd380, 0xd380, 0xd37f, 0xd37f, 0xd37f, 0xd37f, 0xd37e, + 0xd37e, 0xd37e, 0xd37e, 0xd37e, 0xd37d, 0xd37d, 0xd37d, 0xd37d, + 0xd37c, 0xd37c, 0xd37c, 0xd37c, 0xd37c, 0xd37b, 0xd37b, 0xd37b, + 0xd37b, 0xd37b, 0xd37a, 0xd37a, 0xd37a, 0xd37a, 0xd379, 0xd379, + 0xd379, 0xd379, 0xd379, 0xd378, 0xd378, 0xd378, 0xd378, 0xd378, + 0xd377, 0xd377, 0xd377, 0xd377, 0xd376, 0xd376, 0xd376, 0xd376, + 0xd376, 0xd375, 0xd375, 0xd375, 0xd375, 0xd375, 0xd374, 0xd374, + 0xd374, 0xd374, 0xd373, 0xd373, 0xd373, 0xd373, 0xd373, 0xd372, + 0xd372, 0xd372, 0xd372, 0xd372, 0xd371, 0xd371, 0xd371, 0xd371, + 0xd371, 0xd370, 0xd370, 0xd370, 0xd370, 0xd370, 0xd36f, 0xd36f, + 0xd36f, 0xd36f, 0xd36e, 0xd36e, 0xd36e, 0xd36e, 0xd36e, 0xd36d, + 0xd36d, 0xd36d, 0xd36d, 0xd36d, 0xd36c, 0xd36c, 0xd36c, 0xd36c, + 0xd36c, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36b, 0xd36a, 0xd36a, + 0xd36a, 0xd36a, 0xd36a, 0xd369, 0xd369, 0xd369, 0xd369, 0xd369, + 0xd368, 0xd368, 0xd368, 0xd368, 0xd368, 0xd367, 0xd367, 0xd367, + 0xd367, 0xd367, 0xd366, 0xd366, 0xd366, 0xd366, 0xd366, 0xd365, + 0xd365, 0xd365, 0xd365, 0xd365, 0xd364, 0xd364, 0xd364, 0xd364, + 0xd364, 0xd363, 0xd363, 0xd363, 0xd363, 0xd363, 0xd362, 0xd362, + 0xd362, 0xd362, 0xd362, 0xd361, 0xd361, 0xd361, 0xd361, 0xd361, + 0xd360, 0xd360, 0xd360, 0xd360, 0xd360, 0xd35f, 0xd35f, 0xd35f, + 0xd35f, 0xd35f, 0xd35f, 0xd35e, 0xd35e, 0xd35e, 0xd35e, 0xd35e, + 0xd35d, 0xd35d, 0xd35d, 0xd35d, 0xd35d, 0xd35c, 0xd35c, 0xd35c, + 0xd35c, 0xd35c, 0xd35b, 0xd35b, 0xd35b, 0xd35b, 0xd35b, 0xd35a, + 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd35a, 0xd359, 0xd359, 0xd359, + 0xd359, 0xd359, 0xd358, 0xd358, 0xd358, 0xd358, 0xd358, 0xd357, + 0xd357, 0xd357, 0xd357, 0xd357, 0xd357, 0xd356, 0xd356, 0xd356, + 0xd356, 0xd356, 0xd355, 0xd355, 0xd355, 0xd355, 0xd355, 0xd354, + 0xd354, 0xd354, 0xd354, 0xd354, 0xd354, 0xd353, 0xd353, 0xd353, + 0xd353, 0xd353, 0xd352, 0xd352, 0xd352, 0xd352, 0xd352, 0xd351, + 0xd351, 0xd351, 0xd351, 0xd351, 0xd351, 0xd350, 0xd350, 0xd350, + 0xd350, 0xd350, 0xd34f, 0xd34f, 0xd34f, 0xd34f, 0xd34f, 0xd34f, + 0xd34e, 0xd34e, 0xd34e, 0xd34e, 0xd34e, 0xd34d, 0xd34d, 0xd34d, + 0xd34d, 0xd34d, 0xd34d, 0xd34c, 0xd34c, 0xd34c, 0xd34c, 0xd34c, + 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34b, 0xd34a, 0xd34a, + 0xd34a, 0xd34a, 0xd34a, 0xd34a, 0xd349, 0xd349, 0xd349, 0xd349, + 0xd349, 0xd348, 0xd348, 0xd348, 0xd348, 0xd348, 0xd348, 0xd347, + 0xd347, 0xd347, 0xd347, 0xd347, 0xd347, 0xd346, 0xd346, 0xd346, + 0xd346, 0xd346, 0xd345, 0xd345, 0xd345, 0xd345, 0xd345, 0xd345, + 0xd344, 0xd344, 0xd344, 0xd344, 0xd344, 0xd344, 0xd343, 0xd343, + 0xd343, 0xd343, 0xd343, 0xd342, 0xd342, 0xd342, 0xd342, 0xd342, + 0xd342, 0xd341, 0xd341, 0xd341, 0xd341, 0xd341, 0xd341, 0xd340, + 0xd340, 0xd340, 0xd340, 0xd340, 0xd340, 0xd33f, 0xd33f, 0xd33f, + 0xd33f, 0xd33f, 0xd33f, 0xd33e, 0xd33e, 0xd33e, 0xd33e, 0xd33e, + 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33d, 0xd33c, 0xd33c, + 0xd33c, 0xd33c, 0xd33c, 0xd33c, 0xd33b, 0xd33b, 0xd33b, 0xd33b, + 0xd33b, 0xd33b, 0xd33a, 0xd33a, 0xd33a, 0xd33a, 0xd33a, 0xd33a, + 0xd339, 0xd339, 0xd339, 0xd339, 0xd339, 0xd339, 0xd338, 0xd338, + 0xd338, 0xd338, 0xd338, 0xd338, 0xd337, 0xd337, 0xd337, 0xd337, + 0xd337, 0xd337, 0xd336, 0xd336, 0xd336, 0xd336, 0xd336, 0xd336, + 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd335, 0xd334, 0xd334, + 0xd334, 0xd334, 0xd334, 0xd334, 0xd333, 0xd333, 0xd333, 0xd333, + 0xd333, 0xd333, 0xd332, 0xd332, 0xd332, 0xd332, 0xd332, 0xd332, + 0xd332, 0xd331, 0xd331, 0xd331, 0xd331, 0xd331, 0xd331, 0xd330, + 0xd330, 0xd330, 0xd330, 0xd330, 0xd330, 0xd32f, 0xd32f, 0xd32f, + 0xd32f, 0xd32f, 0xd32f, 0xd32e, 0xd32e, 0xd32e, 0xd32e, 0xd32e, + 0xd32e, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, 0xd32d, + 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32c, 0xd32b, 0xd32b, + 0xd32b, 0xd32b, 0xd32b, 0xd32b, 0xd32a, 0xd32a, 0xd32a, 0xd32a, + 0xd32a, 0xd32a, 0xd32a, 0xd329, 0xd329, 0xd329, 0xd329, 0xd329, + 0xd329, 0xd328, 0xd328, 0xd328, 0xd328, 0xd328, 0xd328, 0xd327, + 0xd327, 0xd327, 0xd327, 0xd327, 0xd327, 0xd327, 0xd326, 0xd326, + 0xd326, 0xd326, 0xd326, 0xd326, 0xd325, 0xd325, 0xd325, 0xd325, + 0xd325, 0xd325, 0xd325, 0xd324, 0xd324, 0xd324, 0xd324, 0xd324, + 0xd324, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, 0xd323, + 0xd322, 0xd322, 0xd322, 0xd322, 0xd322, 0xd322, 0xd321, 0xd321, + 0xd321, 0xd321, 0xd321, 0xd321, 0xd321, 0xd320, 0xd320, 0xd320, + 0xd320, 0xd320, 0xd320, 0xd31f, 0xd31f, 0xd31f, 0xd31f, 0xd31f, + 0xd31f, 0xd31f, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31e, 0xd31e, + 0xd31e, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31d, 0xd31c, + 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd31b, 0xd31b, + 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31b, 0xd31a, 0xd31a, 0xd31a, + 0xd31a, 0xd31a, 0xd31a, 0xd31a, 0xd319, 0xd319, 0xd319, 0xd319, + 0xd319, 0xd319, 0xd318, 0xd318, 0xd318, 0xd318, 0xd318, 0xd318, + 0xd318, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, 0xd317, + 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd316, 0xd315, + 0xd315, 0xd315, 0xd315, 0xd315, 0xd315, 0xd315, 0xd314, 0xd314, + 0xd314, 0xd314, 0xd314, 0xd314, 0xd314, 0xd313, 0xd313, 0xd313, + 0xd313, 0xd313, 0xd313, 0xd313, 0xd312, 0xd312, 0xd312, 0xd312, + 0xd312, 0xd312, 0xd311, 0xd311, 0xd311, 0xd311, 0xd311, 0xd311, + 0xd311, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, 0xd310, + 0xd310, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, 0xd30f, + 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30e, 0xd30d, + 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30d, 0xd30c, 0xd30c, + 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30c, 0xd30b, 0xd30b, 0xd30b, + 0xd30b, 0xd30b, 0xd30b, 0xd30b, 0xd30a, 0xd30a, 0xd30a, 0xd30a, + 0xd30a, 0xd30a, 0xd30a, 0xd309, 0xd309, 0xd309, 0xd309, 0xd309, + 0xd309, 0xd309, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, 0xd308, + 0xd308, 0xd308, 0xd307, 0xd307, 0xd307, 0xd307, 0xd307, 0xd307, + 0xd307, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, 0xd306, + 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, 0xd305, + 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd304, 0xd303, + 0xd303, 0xd303, 0xd303, 0xd303, 0xd303, 0xd303, 0xd302, 0xd302, + 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd302, 0xd301, 0xd301, + 0xd301, 0xd301, 0xd301, 0xd301, 0xd301, 0xd300, 0xd300, 0xd300, + 0xd300, 0xd300, 0xd300, 0xd300, 0xd300, 0xd2ff, 0xd2ff, 0xd2ff, + 0xd2ff, 0xd2ff, 0xd2ff, 0xd2ff, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, + 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fe, 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fd, + 0xd2fd, 0xd2fd, 0xd2fd, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fc, + 0xd2fc, 0xd2fc, 0xd2fc, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, 0xd2fb, + 0xd2fb, 0xd2fb, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, 0xd2fa, + 0xd2fa, 0xd2fa, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, 0xd2f9, + 0xd2f9, 0xd2f9, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, 0xd2f8, + 0xd2f8, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, 0xd2f7, + 0xd2f7, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, 0xd2f6, + 0xd2f6, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, 0xd2f5, + 0xd2f5, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, 0xd2f4, + 0xd2f4, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, 0xd2f3, + 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, + 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, 0xd2f1, + 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, 0xd2f0, + 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, 0xd2ef, + 0xd2ee, 0xd2ee, 0xd2ee, 0xd2ee, 0xd2ed, 0xd2ed, 0xd2ed, 0xd2ed, + 0xd2ec, 0xd2ec, 0xd2ec, 0xd2ec, 0xd2eb, 0xd2eb, 0xd2eb, 0xd2eb, + 0xd2ea, 0xd2ea, 0xd2ea, 0xd2ea, 0xd2ea, 0xd2e9, 0xd2e9, 0xd2e9, + 0xd2e9, 0xd2e8, 0xd2e8, 0xd2e8, 0xd2e8, 0xd2e7, 0xd2e7, 0xd2e7, + 0xd2e7, 0xd2e6, 0xd2e6, 0xd2e6, 0xd2e6, 0xd2e5, 0xd2e5, 0xd2e5, + 0xd2e5, 0xd2e4, 0xd2e4, 0xd2e4, 0xd2e4, 0xd2e3, 0xd2e3, 0xd2e3, + 0xd2e3, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e2, 0xd2e1, 0xd2e1, + 0xd2e1, 0xd2e1, 0xd2e0, 0xd2e0, 0xd2e0, 0xd2e0, 0xd2df, 0xd2df, + 0xd2df, 0xd2df, 0xd2de, 0xd2de, 0xd2de, 0xd2de, 0xd2de, 0xd2dd, + 0xd2dd, 0xd2dd, 0xd2dd, 0xd2dc, 0xd2dc, 0xd2dc, 0xd2dc, 0xd2db, + 0xd2db, 0xd2db, 0xd2db, 0xd2db, 0xd2da, 0xd2da, 0xd2da, 0xd2da, + 0xd2d9, 0xd2d9, 0xd2d9, 0xd2d9, 0xd2d8, 0xd2d8, 0xd2d8, 0xd2d8, + 0xd2d8, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d7, 0xd2d6, 0xd2d6, 0xd2d6, + 0xd2d6, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d5, 0xd2d4, 0xd2d4, + 0xd2d4, 0xd2d4, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d3, 0xd2d2, + 0xd2d2, 0xd2d2, 0xd2d2, 0xd2d1, 0xd2d1, 0xd2d1, 0xd2d1, 0xd2d1, + 0xd2d0, 0xd2d0, 0xd2d0, 0xd2d0, 0xd2cf, 0xd2cf, 0xd2cf, 0xd2cf, + 0xd2cf, 0xd2ce, 0xd2ce, 0xd2ce, 0xd2ce, 0xd2cd, 0xd2cd, 0xd2cd, + 0xd2cd, 0xd2cd, 0xd2cc, 0xd2cc, 0xd2cc, 0xd2cc, 0xd2cb, 0xd2cb, + 0xd2cb, 0xd2cb, 0xd2cb, 0xd2ca, 0xd2ca, 0xd2ca, 0xd2ca, 0xd2ca, + 0xd2c9, 0xd2c9, 0xd2c9, 0xd2c9, 0xd2c8, 0xd2c8, 0xd2c8, 0xd2c8, + 0xd2c8, 0xd2c7, 0xd2c7, 0xd2c7, 0xd2c7, 0xd2c6, 0xd2c6, 0xd2c6, + 0xd2c6, 0xd2c6, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c5, 0xd2c4, + 0xd2c4, 0xd2c4, 0xd2c4, 0xd2c4, 0xd2c3, 0xd2c3, 0xd2c3, 0xd2c3, + 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c2, 0xd2c1, 0xd2c1, 0xd2c1, + 0xd2c1, 0xd2c1, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2c0, 0xd2bf, + 0xd2bf, 0xd2bf, 0xd2bf, 0xd2be, 0xd2be, 0xd2be, 0xd2be, 0xd2be, + 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bd, 0xd2bc, 0xd2bc, 0xd2bc, + 0xd2bc, 0xd2bc, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2bb, 0xd2ba, + 0xd2ba, 0xd2ba, 0xd2ba, 0xd2ba, 0xd2b9, 0xd2b9, 0xd2b9, 0xd2b9, + 0xd2b9, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b8, 0xd2b7, 0xd2b7, + 0xd2b7, 0xd2b7, 0xd2b7, 0xd2b6, 0xd2b6, 0xd2b6, 0xd2b6, 0xd2b6, + 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b5, 0xd2b4, 0xd2b4, 0xd2b4, + 0xd2b4, 0xd2b4, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b3, 0xd2b2, + 0xd2b2, 0xd2b2, 0xd2b2, 0xd2b2, 0xd2b1, 0xd2b1, 0xd2b1, 0xd2b1, + 0xd2b1, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2b0, 0xd2af, 0xd2af, + 0xd2af, 0xd2af, 0xd2af, 0xd2ae, 0xd2ae, 0xd2ae, 0xd2ae, 0xd2ae, + 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ad, 0xd2ac, 0xd2ac, 0xd2ac, + 0xd2ac, 0xd2ac, 0xd2ac, 0xd2ab, 0xd2ab, 0xd2ab, 0xd2ab, 0xd2ab, + 0xd2aa, 0xd2aa, 0xd2aa, 0xd2aa, 0xd2aa, 0xd2a9, 0xd2a9, 0xd2a9, + 0xd2a9, 0xd2a9, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, 0xd2a8, + 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a7, 0xd2a6, 0xd2a6, 0xd2a6, + 0xd2a6, 0xd2a6, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a5, 0xd2a4, + 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a4, 0xd2a3, 0xd2a3, 0xd2a3, + 0xd2a3, 0xd2a3, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, 0xd2a2, + 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a1, 0xd2a0, 0xd2a0, 0xd2a0, + 0xd2a0, 0xd2a0, 0xd29f, 0xd29f, 0xd29f, 0xd29f, 0xd29f, 0xd29f, + 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29e, 0xd29d, 0xd29d, 0xd29d, + 0xd29d, 0xd29d, 0xd29d, 0xd29c, 0xd29c, 0xd29c, 0xd29c, 0xd29c, + 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29b, 0xd29a, 0xd29a, + 0xd29a, 0xd29a, 0xd29a, 0xd29a, 0xd299, 0xd299, 0xd299, 0xd299, + 0xd299, 0xd298, 0xd298, 0xd298, 0xd298, 0xd298, 0xd298, 0xd297, + 0xd297, 0xd297, 0xd297, 0xd297, 0xd296, 0xd296, 0xd296, 0xd296, + 0xd296, 0xd296, 0xd295, 0xd295, 0xd295, 0xd295, 0xd295, 0xd295, + 0xd294, 0xd294, 0xd294, 0xd294, 0xd294, 0xd293, 0xd293, 0xd293, + 0xd293, 0xd293, 0xd293, 0xd292, 0xd292, 0xd292, 0xd292, 0xd292, + 0xd292, 0xd291, 0xd291, 0xd291, 0xd291, 0xd291, 0xd291, 0xd290, + 0xd290, 0xd290, 0xd290, 0xd290, 0xd28f, 0xd28f, 0xd28f, 0xd28f, + 0xd28f, 0xd28f, 0xd28e, 0xd28e, 0xd28e, 0xd28e, 0xd28e, 0xd28e, + 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28d, 0xd28c, 0xd28c, + 0xd28c, 0xd28c, 0xd28c, 0xd28c, 0xd28b, 0xd28b, 0xd28b, 0xd28b, + 0xd28b, 0xd28b, 0xd28a, 0xd28a, 0xd28a, 0xd28a, 0xd28a, 0xd28a, + 0xd289, 0xd289, 0xd289, 0xd289, 0xd289, 0xd288, 0xd288, 0xd288, + 0xd288, 0xd288, 0xd288, 0xd287, 0xd287, 0xd287, 0xd287, 0xd287, + 0xd287, 0xd286, 0xd286, 0xd286, 0xd286, 0xd286, 0xd286, 0xd285, + 0xd285, 0xd285, 0xd285, 0xd285, 0xd285, 0xd285, 0xd284, 0xd284, + 0xd284, 0xd284, 0xd284, 0xd284, 0xd283, 0xd283, 0xd283, 0xd283, + 0xd283, 0xd283, 0xd282, 0xd282, 0xd282, 0xd282, 0xd282, 0xd282, + 0xd281, 0xd281, 0xd281, 0xd281, 0xd281, 0xd281, 0xd280, 0xd280, + 0xd280, 0xd280, 0xd280, 0xd280, 0xd27f, 0xd27f, 0xd27f, 0xd27f, + 0xd27f, 0xd27f, 0xd27e, 0xd27e, 0xd27e, 0xd27e, 0xd27e, 0xd27e, + 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27d, 0xd27c, + 0xd27c, 0xd27c, 0xd27c, 0xd27c, 0xd27c, 0xd27b, 0xd27b, 0xd27b, + 0xd27b, 0xd27b, 0xd27b, 0xd27a, 0xd27a, 0xd27a, 0xd27a, 0xd27a, + 0xd27a, 0xd27a, 0xd279, 0xd279, 0xd279, 0xd279, 0xd279, 0xd279, + 0xd278, 0xd278, 0xd278, 0xd278, 0xd278, 0xd278, 0xd277, 0xd277, + 0xd277, 0xd277, 0xd277, 0xd277, 0xd277, 0xd276, 0xd276, 0xd276, + 0xd276, 0xd276, 0xd276, 0xd275, 0xd275, 0xd275, 0xd275, 0xd275, + 0xd275, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, 0xd274, + 0xd273, 0xd273, 0xd273, 0xd273, 0xd273, 0xd273, 0xd272, 0xd272, + 0xd272, 0xd272, 0xd272, 0xd272, 0xd272, 0xd271, 0xd271, 0xd271, + 0xd271, 0xd271, 0xd271, 0xd270, 0xd270, 0xd270, 0xd270, 0xd270, + 0xd270, 0xd270, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26f, 0xd26f, + 0xd26f, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26e, 0xd26d, + 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26d, 0xd26c, 0xd26c, + 0xd26c, 0xd26c, 0xd26c, 0xd26c, 0xd26b, 0xd26b, 0xd26b, 0xd26b, + 0xd26b, 0xd26b, 0xd26b, 0xd26a, 0xd26a, 0xd26a, 0xd26a, 0xd26a, + 0xd26a, 0xd26a, 0xd269, 0xd269, 0xd269, 0xd269, 0xd269, 0xd269, + 0xd269, 0xd268, 0xd268, 0xd268, 0xd268, 0xd268, 0xd268, 0xd267, + 0xd267, 0xd267, 0xd267, 0xd267, 0xd267, 0xd267, 0xd266, 0xd266, + 0xd266, 0xd266, 0xd266, 0xd266, 0xd266, 0xd265, 0xd265, 0xd265, + 0xd265, 0xd265, 0xd265, 0xd265, 0xd264, 0xd264, 0xd264, 0xd264, + 0xd264, 0xd264, 0xd264, 0xd263, 0xd263, 0xd263, 0xd263, 0xd263, + 0xd263, 0xd263, 0xd262, 0xd262, 0xd262, 0xd262, 0xd262, 0xd262, + 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd261, 0xd260, + 0xd260, 0xd260, 0xd260, 0xd260, 0xd260, 0xd260, 0xd25f, 0xd25f, + 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25f, 0xd25e, 0xd25e, 0xd25e, + 0xd25e, 0xd25e, 0xd25e, 0xd25e, 0xd25d, 0xd25d, 0xd25d, 0xd25d, + 0xd25d, 0xd25d, 0xd25d, 0xd25c, 0xd25c, 0xd25c, 0xd25c, 0xd25c, + 0xd25c, 0xd25c, 0xd25c, 0xd25b, 0xd25b, 0xd25b, 0xd25b, 0xd25b, + 0xd25b, 0xd25b, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, 0xd25a, + 0xd25a, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, 0xd259, + 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd258, 0xd257, + 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd257, 0xd256, 0xd256, + 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd256, 0xd255, 0xd255, + 0xd255, 0xd255, 0xd255, 0xd255, 0xd255, 0xd254, 0xd254, 0xd254, + 0xd254, 0xd254, 0xd254, 0xd254, 0xd253, 0xd253, 0xd253, 0xd253, + 0xd253, 0xd253, 0xd253, 0xd253, 0xd252, 0xd252, 0xd252, 0xd252, + 0xd252, 0xd252, 0xd252, 0xd251, 0xd251, 0xd251, 0xd251, 0xd251, + 0xd251, 0xd251, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, 0xd250, + 0xd250, 0xd250, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24f, 0xd24f, + 0xd24f, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, 0xd24e, + 0xd24e, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, 0xd24d, + 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, 0xd24c, + 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24b, 0xd24a, + 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd24a, 0xd249, + 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd249, 0xd248, + 0xd248, 0xd248, 0xd248, 0xd248, 0xd248, 0xd248, 0xd247, 0xd247, + 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd247, 0xd246, 0xd246, + 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd246, 0xd245, 0xd245, + 0xd245, 0xd245, 0xd245, 0xd245, 0xd245, 0xd244, 0xd244, 0xd244, + 0xd244, 0xd244, 0xd244, 0xd244, 0xd244, 0xd243, 0xd243, 0xd243, + 0xd243, 0xd243, 0xd243, 0xd243, 0xd243, 0xd242, 0xd242, 0xd242, + 0xd242, 0xd242, 0xd242, 0xd242, 0xd242, 0xd241, 0xd241, 0xd241, + 0xd241, 0xd241, 0xd241, 0xd241, 0xd241, 0xd240, 0xd240, 0xd240, + 0xd240, 0xd240, 0xd240, 0xd240, 0xd240, 0xd23f, 0xd23f, 0xd23f, + 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23f, 0xd23e, 0xd23e, 0xd23e, + 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23e, 0xd23d, 0xd23d, 0xd23d, + 0xd23d, 0xd23d, 0xd23d, 0xd23c, 0xd23c, 0xd23c, 0xd23c, 0xd23b, + 0xd23b, 0xd23b, 0xd23b, 0xd23a, 0xd23a, 0xd23a, 0xd23a, 0xd239, + 0xd239, 0xd239, 0xd239, 0xd238, 0xd238, 0xd238, 0xd238, 0xd237, + 0xd237, 0xd237, 0xd237, 0xd236, 0xd236, 0xd236, 0xd236, 0xd235, + 0xd235, 0xd235, 0xd235, 0xd234, 0xd234, 0xd234, 0xd234, 0xd233, + 0xd233, 0xd233, 0xd233, 0xd232, 0xd232, 0xd232, 0xd232, 0xd232, + 0xd231, 0xd231, 0xd231, 0xd231, 0xd230, 0xd230, 0xd230, 0xd230, + 0xd22f, 0xd22f, 0xd22f, 0xd22f, 0xd22e, 0xd22e, 0xd22e, 0xd22e, + 0xd22d, 0xd22d, 0xd22d, 0xd22d, 0xd22d, 0xd22c, 0xd22c, 0xd22c, + 0xd22c, 0xd22b, 0xd22b, 0xd22b, 0xd22b, 0xd22a, 0xd22a, 0xd22a, + 0xd22a, 0xd22a, 0xd229, 0xd229, 0xd229, 0xd229, 0xd228, 0xd228, + 0xd228, 0xd228, 0xd227, 0xd227, 0xd227, 0xd227, 0xd227, 0xd226, + 0xd226, 0xd226, 0xd226, 0xd225, 0xd225, 0xd225, 0xd225, 0xd224, + 0xd224, 0xd224, 0xd224, 0xd224, 0xd223, 0xd223, 0xd223, 0xd223, + 0xd222, 0xd222, 0xd222, 0xd222, 0xd222, 0xd221, 0xd221, 0xd221, + 0xd221, 0xd220, 0xd220, 0xd220, 0xd220, 0xd220, 0xd21f, 0xd21f, + 0xd21f, 0xd21f, 0xd21e, 0xd21e, 0xd21e, 0xd21e, 0xd21e, 0xd21d, + 0xd21d, 0xd21d, 0xd21d, 0xd21c, 0xd21c, 0xd21c, 0xd21c, 0xd21c, + 0xd21b, 0xd21b, 0xd21b, 0xd21b, 0xd21a, 0xd21a, 0xd21a, 0xd21a, + 0xd21a, 0xd219, 0xd219, 0xd219, 0xd219, 0xd218, 0xd218, 0xd218, + 0xd218, 0xd218, 0xd217, 0xd217, 0xd217, 0xd217, 0xd217, 0xd216, + 0xd216, 0xd216, 0xd216, 0xd215, 0xd215, 0xd215, 0xd215, 0xd215, + 0xd214, 0xd214, 0xd214, 0xd214, 0xd214, 0xd213, 0xd213, 0xd213, + 0xd213, 0xd212, 0xd212, 0xd212, 0xd212, 0xd212, 0xd211, 0xd211, + 0xd211, 0xd211, 0xd211, 0xd210, 0xd210, 0xd210, 0xd210, 0xd210, + 0xd20f, 0xd20f, 0xd20f, 0xd20f, 0xd20f, 0xd20e, 0xd20e, 0xd20e, + 0xd20e, 0xd20d, 0xd20d, 0xd20d, 0xd20d, 0xd20d, 0xd20c, 0xd20c, + 0xd20c, 0xd20c, 0xd20c, 0xd20b, 0xd20b, 0xd20b, 0xd20b, 0xd20b, + 0xd20a, 0xd20a, 0xd20a, 0xd20a, 0xd20a, 0xd209, 0xd209, 0xd209, + 0xd209, 0xd209, 0xd208, 0xd208, 0xd208, 0xd208, 0xd208, 0xd207, + 0xd207, 0xd207, 0xd207, 0xd206, 0xd206, 0xd206, 0xd206, 0xd206, + 0xd205, 0xd205, 0xd205, 0xd205, 0xd205, 0xd204, 0xd204, 0xd204, + 0xd204, 0xd204, 0xd203, 0xd203, 0xd203, 0xd203, 0xd203, 0xd202, + 0xd202, 0xd202, 0xd202, 0xd202, 0xd201, 0xd201, 0xd201, 0xd201, + 0xd201, 0xd201, 0xd200, 0xd200, 0xd200, 0xd200, 0xd200, 0xd1ff, + 0xd1ff, 0xd1ff, 0xd1ff, 0xd1ff, 0xd1fe, 0xd1fe, 0xd1fe, 0xd1fe, + 0xd1fe, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fd, 0xd1fc, 0xd1fc, + 0xd1fc, 0xd1fc, 0xd1fc, 0xd1fb, 0xd1fb, 0xd1fb, 0xd1fb, 0xd1fb, + 0xd1fa, 0xd1fa, 0xd1fa, 0xd1fa, 0xd1fa, 0xd1f9, 0xd1f9, 0xd1f9, + 0xd1f9, 0xd1f9, 0xd1f9, 0xd1f8, 0xd1f8, 0xd1f8, 0xd1f8, 0xd1f8, + 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f7, 0xd1f6, 0xd1f6, 0xd1f6, + 0xd1f6, 0xd1f6, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, 0xd1f5, + 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f4, 0xd1f3, 0xd1f3, 0xd1f3, + 0xd1f3, 0xd1f3, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, 0xd1f2, + 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f1, 0xd1f0, 0xd1f0, 0xd1f0, + 0xd1f0, 0xd1f0, 0xd1f0, 0xd1ef, 0xd1ef, 0xd1ef, 0xd1ef, 0xd1ef, + 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ee, 0xd1ed, 0xd1ed, 0xd1ed, + 0xd1ed, 0xd1ed, 0xd1ed, 0xd1ec, 0xd1ec, 0xd1ec, 0xd1ec, 0xd1ec, + 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1eb, 0xd1ea, 0xd1ea, + 0xd1ea, 0xd1ea, 0xd1ea, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e9, 0xd1e9, + 0xd1e9, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e8, 0xd1e7, + 0xd1e7, 0xd1e7, 0xd1e7, 0xd1e7, 0xd1e6, 0xd1e6, 0xd1e6, 0xd1e6, + 0xd1e6, 0xd1e6, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e5, 0xd1e4, + 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e4, 0xd1e3, 0xd1e3, 0xd1e3, + 0xd1e3, 0xd1e3, 0xd1e3, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e2, 0xd1e2, + 0xd1e2, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e1, 0xd1e0, 0xd1e0, + 0xd1e0, 0xd1e0, 0xd1e0, 0xd1e0, 0xd1df, 0xd1df, 0xd1df, 0xd1df, + 0xd1df, 0xd1df, 0xd1de, 0xd1de, 0xd1de, 0xd1de, 0xd1de, 0xd1de, + 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dd, 0xd1dc, 0xd1dc, 0xd1dc, + 0xd1dc, 0xd1dc, 0xd1dc, 0xd1db, 0xd1db, 0xd1db, 0xd1db, 0xd1db, + 0xd1db, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1da, 0xd1d9, + 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d9, 0xd1d8, 0xd1d8, 0xd1d8, + 0xd1d8, 0xd1d8, 0xd1d8, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d7, 0xd1d7, + 0xd1d7, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d6, 0xd1d5, + 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d5, 0xd1d4, 0xd1d4, 0xd1d4, + 0xd1d4, 0xd1d4, 0xd1d4, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d3, 0xd1d3, + 0xd1d3, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d2, 0xd1d1, + 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d1, 0xd1d0, 0xd1d0, 0xd1d0, + 0xd1d0, 0xd1d0, 0xd1d0, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1cf, 0xd1cf, + 0xd1cf, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1ce, 0xd1cd, + 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cd, 0xd1cc, 0xd1cc, + 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cc, 0xd1cb, 0xd1cb, 0xd1cb, 0xd1cb, + 0xd1cb, 0xd1cb, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, 0xd1ca, + 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c9, 0xd1c8, + 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c8, 0xd1c7, 0xd1c7, 0xd1c7, + 0xd1c7, 0xd1c7, 0xd1c7, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, 0xd1c6, + 0xd1c6, 0xd1c6, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, 0xd1c5, + 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c4, 0xd1c3, + 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c3, 0xd1c2, 0xd1c2, 0xd1c2, + 0xd1c2, 0xd1c2, 0xd1c2, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, 0xd1c1, + 0xd1c1, 0xd1c1, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, 0xd1c0, + 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1bf, 0xd1be, + 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1be, 0xd1bd, 0xd1bd, + 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bd, 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bc, + 0xd1bc, 0xd1bc, 0xd1bc, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1bb, 0xd1bb, + 0xd1bb, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, 0xd1ba, + 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b9, 0xd1b8, + 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b8, 0xd1b7, 0xd1b7, + 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b7, 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b6, + 0xd1b6, 0xd1b6, 0xd1b6, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, 0xd1b5, + 0xd1b5, 0xd1b5, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, 0xd1b4, + 0xd1b4, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, 0xd1b3, + 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b2, 0xd1b1, 0xd1b1, + 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b1, 0xd1b0, 0xd1b0, 0xd1b0, + 0xd1b0, 0xd1b0, 0xd1b0, 0xd1b0, 0xd1af, 0xd1af, 0xd1af, 0xd1af, + 0xd1af, 0xd1af, 0xd1af, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, 0xd1ae, + 0xd1ae, 0xd1ae, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, 0xd1ad, + 0xd1ad, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, 0xd1ac, + 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1ab, 0xd1aa, + 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1aa, 0xd1a9, 0xd1a9, + 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a9, 0xd1a8, 0xd1a8, + 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a8, 0xd1a7, 0xd1a7, 0xd1a7, + 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a7, 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a6, + 0xd1a6, 0xd1a6, 0xd1a6, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, 0xd1a5, + 0xd1a5, 0xd1a5, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, 0xd1a4, + 0xd1a4, 0xd1a4, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, 0xd1a3, + 0xd1a3, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, 0xd1a2, + 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, 0xd1a1, + 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd1a0, 0xd19f, + 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19f, 0xd19e, 0xd19e, + 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19e, 0xd19d, 0xd19d, + 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19d, 0xd19c, 0xd19c, 0xd19c, + 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19c, 0xd19b, 0xd19b, 0xd19b, + 0xd19b, 0xd19b, 0xd19b, 0xd19b, 0xd19a, 0xd19a, 0xd19a, 0xd19a, + 0xd19a, 0xd19a, 0xd19a, 0xd19a, 0xd199, 0xd199, 0xd199, 0xd199, + 0xd199, 0xd199, 0xd199, 0xd199, 0xd198, 0xd198, 0xd198, 0xd198, + 0xd198, 0xd198, 0xd198, 0xd197, 0xd197, 0xd197, 0xd197, 0xd197, + 0xd197, 0xd197, 0xd197, 0xd196, 0xd196, 0xd196, 0xd196, 0xd196, + 0xd196, 0xd196, 0xd196, 0xd195, 0xd195, 0xd195, 0xd195, 0xd195, + 0xd195, 0xd195, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, 0xd194, + 0xd194, 0xd194, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, 0xd193, + 0xd193, 0xd193, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, 0xd192, + 0xd192, 0xd192, 0xd191, 0xd191, 0xd191, 0xd191, 0xd191, 0xd191, + 0xd191, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, 0xd190, + 0xd190, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, 0xd18f, + 0xd18f, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, 0xd18e, + 0xd18e, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, 0xd18d, + 0xd18d, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, 0xd18c, + 0xd18c, 0xd18b, 0xd18b, 0xd18b, 0xd18b, 0xd18a, 0xd18a, 0xd18a, + 0xd18a, 0xd189, 0xd189, 0xd189, 0xd189, 0xd188, 0xd188, 0xd188, + 0xd188, 0xd187, 0xd187, 0xd187, 0xd187, 0xd186, 0xd186, 0xd186, + 0xd186, 0xd185, 0xd185, 0xd185, 0xd185, 0xd184, 0xd184, 0xd184, + 0xd184, 0xd183, 0xd183, 0xd183, 0xd183, 0xd182, 0xd182, 0xd182, + 0xd182, 0xd182, 0xd181, 0xd181, 0xd181, 0xd181, 0xd180, 0xd180, + 0xd180, 0xd180, 0xd17f, 0xd17f, 0xd17f, 0xd17f, 0xd17e, 0xd17e, + 0xd17e, 0xd17e, 0xd17d, 0xd17d, 0xd17d, 0xd17d, 0xd17d, 0xd17c, + 0xd17c, 0xd17c, 0xd17c, 0xd17b, 0xd17b, 0xd17b, 0xd17b, 0xd17a, + 0xd17a, 0xd17a, 0xd17a, 0xd179, 0xd179, 0xd179, 0xd179, 0xd179, + 0xd178, 0xd178, 0xd178, 0xd178, 0xd177, 0xd177, 0xd177, 0xd177, + 0xd176, 0xd176, 0xd176, 0xd176, 0xd176, 0xd175, 0xd175, 0xd175, + 0xd175, 0xd174, 0xd174, 0xd174, 0xd174, 0xd173, 0xd173, 0xd173, + 0xd173, 0xd173, 0xd172, 0xd172, 0xd172, 0xd172, 0xd171, 0xd171, + 0xd171, 0xd171, 0xd171, 0xd170, 0xd170, 0xd170, 0xd170, 0xd16f, + 0xd16f, 0xd16f, 0xd16f, 0xd16f, 0xd16e, 0xd16e, 0xd16e, 0xd16e, + 0xd16d, 0xd16d, 0xd16d, 0xd16d, 0xd16d, 0xd16c, 0xd16c, 0xd16c, + 0xd16c, 0xd16b, 0xd16b, 0xd16b, 0xd16b, 0xd16b, 0xd16a, 0xd16a, + 0xd16a, 0xd16a, 0xd169, 0xd169, 0xd169, 0xd169, 0xd169, 0xd168, + 0xd168, 0xd168, 0xd168, 0xd167, 0xd167, 0xd167, 0xd167, 0xd167, + 0xd166, 0xd166, 0xd166, 0xd166, 0xd166, 0xd165, 0xd165, 0xd165, + 0xd165, 0xd164, 0xd164, 0xd164, 0xd164, 0xd164, 0xd163, 0xd163, + 0xd163, 0xd163, 0xd163, 0xd162, 0xd162, 0xd162, 0xd162, 0xd161, + 0xd161, 0xd161, 0xd161, 0xd161, 0xd160, 0xd160, 0xd160, 0xd160, + 0xd160, 0xd15f, 0xd15f, 0xd15f, 0xd15f, 0xd15f, 0xd15e, 0xd15e, + 0xd15e, 0xd15e, 0xd15d, 0xd15d, 0xd15d, 0xd15d, 0xd15d, 0xd15c, + 0xd15c, 0xd15c, 0xd15c, 0xd15c, 0xd15b, 0xd15b, 0xd15b, 0xd15b, + 0xd15b, 0xd15a, 0xd15a, 0xd15a, 0xd15a, 0xd15a, 0xd159, 0xd159, + 0xd159, 0xd159, 0xd159, 0xd158, 0xd158, 0xd158, 0xd158, 0xd157, + 0xd157, 0xd157, 0xd157, 0xd157, 0xd156, 0xd156, 0xd156, 0xd156, + 0xd156, 0xd155, 0xd155, 0xd155, 0xd155, 0xd155, 0xd154, 0xd154, + 0xd154, 0xd154, 0xd154, 0xd153, 0xd153, 0xd153, 0xd153, 0xd153, + 0xd152, 0xd152, 0xd152, 0xd152, 0xd152, 0xd151, 0xd151, 0xd151, + 0xd151, 0xd151, 0xd150, 0xd150, 0xd150, 0xd150, 0xd150, 0xd14f, + 0xd14f, 0xd14f, 0xd14f, 0xd14f, 0xd14e, 0xd14e, 0xd14e, 0xd14e, + 0xd14e, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14d, 0xd14c, + 0xd14c, 0xd14c, 0xd14c, 0xd14c, 0xd14b, 0xd14b, 0xd14b, 0xd14b, + 0xd14b, 0xd14a, 0xd14a, 0xd14a, 0xd14a, 0xd14a, 0xd149, 0xd149, + 0xd149, 0xd149, 0xd149, 0xd148, 0xd148, 0xd148, 0xd148, 0xd148, + 0xd147, 0xd147, 0xd147, 0xd147, 0xd147, 0xd147, 0xd146, 0xd146, + 0xd146, 0xd146, 0xd146, 0xd145, 0xd145, 0xd145, 0xd145, 0xd145, + 0xd144, 0xd144, 0xd144, 0xd144, 0xd144, 0xd143, 0xd143, 0xd143, + 0xd143, 0xd143, 0xd143, 0xd142, 0xd142, 0xd142, 0xd142, 0xd142, + 0xd141, 0xd141, 0xd141, 0xd141, 0xd141, 0xd140, 0xd140, 0xd140, + 0xd140, 0xd140, 0xd140, 0xd13f, 0xd13f, 0xd13f, 0xd13f, 0xd13f, + 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13e, 0xd13d, 0xd13d, + 0xd13d, 0xd13d, 0xd13d, 0xd13c, 0xd13c, 0xd13c, 0xd13c, 0xd13c, + 0xd13c, 0xd13b, 0xd13b, 0xd13b, 0xd13b, 0xd13b, 0xd13a, 0xd13a, + 0xd13a, 0xd13a, 0xd13a, 0xd139, 0xd139, 0xd139, 0xd139, 0xd139, + 0xd139, 0xd138, 0xd138, 0xd138, 0xd138, 0xd138, 0xd138, 0xd137, + 0xd137, 0xd137, 0xd137, 0xd137, 0xd136, 0xd136, 0xd136, 0xd136, + 0xd136, 0xd136, 0xd135, 0xd135, 0xd135, 0xd135, 0xd135, 0xd134, + 0xd134, 0xd134, 0xd134, 0xd134, 0xd134, 0xd133, 0xd133, 0xd133, + 0xd133, 0xd133, 0xd133, 0xd132, 0xd132, 0xd132, 0xd132, 0xd132, + 0xd131, 0xd131, 0xd131, 0xd131, 0xd131, 0xd131, 0xd130, 0xd130, + 0xd130, 0xd130, 0xd130, 0xd130, 0xd12f, 0xd12f, 0xd12f, 0xd12f, + 0xd12f, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12e, 0xd12d, + 0xd12d, 0xd12d, 0xd12d, 0xd12d, 0xd12d, 0xd12c, 0xd12c, 0xd12c, + 0xd12c, 0xd12c, 0xd12c, 0xd12b, 0xd12b, 0xd12b, 0xd12b, 0xd12b, + 0xd12b, 0xd12a, 0xd12a, 0xd12a, 0xd12a, 0xd12a, 0xd129, 0xd129, + 0xd129, 0xd129, 0xd129, 0xd129, 0xd128, 0xd128, 0xd128, 0xd128, + 0xd128, 0xd128, 0xd127, 0xd127, 0xd127, 0xd127, 0xd127, 0xd127, + 0xd126, 0xd126, 0xd126, 0xd126, 0xd126, 0xd126, 0xd125, 0xd125, + 0xd125, 0xd125, 0xd125, 0xd125, 0xd124, 0xd124, 0xd124, 0xd124, + 0xd124, 0xd124, 0xd123, 0xd123, 0xd123, 0xd123, 0xd123, 0xd123, + 0xd122, 0xd122, 0xd122, 0xd122, 0xd122, 0xd122, 0xd121, 0xd121, + 0xd121, 0xd121, 0xd121, 0xd121, 0xd120, 0xd120, 0xd120, 0xd120, + 0xd120, 0xd120, 0xd11f, 0xd11f, 0xd11f, 0xd11f, 0xd11f, 0xd11f, + 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11e, 0xd11d, + 0xd11d, 0xd11d, 0xd11d, 0xd11d, 0xd11d, 0xd11c, 0xd11c, 0xd11c, + 0xd11c, 0xd11c, 0xd11c, 0xd11b, 0xd11b, 0xd11b, 0xd11b, 0xd11b, + 0xd11b, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd11a, 0xd119, + 0xd119, 0xd119, 0xd119, 0xd119, 0xd119, 0xd119, 0xd118, 0xd118, + 0xd118, 0xd118, 0xd118, 0xd118, 0xd117, 0xd117, 0xd117, 0xd117, + 0xd117, 0xd117, 0xd116, 0xd116, 0xd116, 0xd116, 0xd116, 0xd116, + 0xd116, 0xd115, 0xd115, 0xd115, 0xd115, 0xd115, 0xd115, 0xd114, + 0xd114, 0xd114, 0xd114, 0xd114, 0xd114, 0xd113, 0xd113, 0xd113, + 0xd113, 0xd113, 0xd113, 0xd113, 0xd112, 0xd112, 0xd112, 0xd112, + 0xd112, 0xd112, 0xd111, 0xd111, 0xd111, 0xd111, 0xd111, 0xd111, + 0xd111, 0xd110, 0xd110, 0xd110, 0xd110, 0xd110, 0xd110, 0xd10f, + 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10f, 0xd10e, 0xd10e, + 0xd10e, 0xd10e, 0xd10e, 0xd10e, 0xd10d, 0xd10d, 0xd10d, 0xd10d, + 0xd10d, 0xd10d, 0xd10d, 0xd10c, 0xd10c, 0xd10c, 0xd10c, 0xd10c, + 0xd10c, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, 0xd10b, + 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd10a, 0xd109, 0xd109, + 0xd109, 0xd109, 0xd109, 0xd109, 0xd109, 0xd108, 0xd108, 0xd108, + 0xd108, 0xd108, 0xd108, 0xd108, 0xd107, 0xd107, 0xd107, 0xd107, + 0xd107, 0xd107, 0xd107, 0xd106, 0xd106, 0xd106, 0xd106, 0xd106, + 0xd106, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, 0xd105, + 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd104, 0xd103, + 0xd103, 0xd103, 0xd103, 0xd103, 0xd103, 0xd103, 0xd102, 0xd102, + 0xd102, 0xd102, 0xd102, 0xd102, 0xd101, 0xd101, 0xd101, 0xd101, + 0xd101, 0xd101, 0xd101, 0xd100, 0xd100, 0xd100, 0xd100, 0xd100, + 0xd100, 0xd100, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, 0xd0ff, + 0xd0ff, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, 0xd0fe, + 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fd, 0xd0fc, + 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fc, 0xd0fb, 0xd0fb, + 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fb, 0xd0fa, 0xd0fa, 0xd0fa, + 0xd0fa, 0xd0fa, 0xd0fa, 0xd0fa, 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f9, + 0xd0f9, 0xd0f9, 0xd0f9, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, 0xd0f8, + 0xd0f8, 0xd0f8, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, 0xd0f7, + 0xd0f7, 0xd0f7, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, 0xd0f6, + 0xd0f6, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, 0xd0f5, + 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f4, 0xd0f3, + 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f3, 0xd0f2, 0xd0f2, + 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f2, 0xd0f1, 0xd0f1, + 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f1, 0xd0f0, 0xd0f0, 0xd0f0, + 0xd0f0, 0xd0f0, 0xd0f0, 0xd0f0, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, + 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ef, 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ee, + 0xd0ee, 0xd0ee, 0xd0ee, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ed, + 0xd0ed, 0xd0ed, 0xd0ed, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, 0xd0ec, + 0xd0ec, 0xd0ec, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, 0xd0eb, + 0xd0eb, 0xd0eb, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, 0xd0ea, + 0xd0ea, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, 0xd0e9, + 0xd0e9, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, 0xd0e8, + 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, 0xd0e7, + 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e6, 0xd0e5, + 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e5, 0xd0e4, + 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e4, 0xd0e3, + 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e3, 0xd0e2, + 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e2, 0xd0e1, 0xd0e1, + 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e1, 0xd0e0, 0xd0e0, + 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0e0, 0xd0df, 0xd0df, + 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0df, 0xd0de, 0xd0de, + 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0de, 0xd0dd, 0xd0dd, + 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dd, 0xd0dc, 0xd0dc, + 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0dc, 0xd0db, 0xd0db, 0xd0db, + 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0db, 0xd0da, 0xd0da, 0xd0da, + 0xd0da, 0xd0da, 0xd0da, 0xd0d9, 0xd0d9, 0xd0d9, 0xd0d9, 0xd0d8, + 0xd0d8, 0xd0d8, 0xd0d8, 0xd0d7, 0xd0d7, 0xd0d7, 0xd0d7, 0xd0d6, + 0xd0d6, 0xd0d6, 0xd0d6, 0xd0d5, 0xd0d5, 0xd0d5, 0xd0d5, 0xd0d4, + 0xd0d4, 0xd0d4, 0xd0d4, 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d2, + 0xd0d2, 0xd0d2, 0xd0d2, 0xd0d2, 0xd0d1, 0xd0d1, 0xd0d1, 0xd0d1, + 0xd0d0, 0xd0d0, 0xd0d0, 0xd0d0, 0xd0cf, 0xd0cf, 0xd0cf, 0xd0cf, + 0xd0ce, 0xd0ce, 0xd0ce, 0xd0ce, 0xd0cd, 0xd0cd, 0xd0cd, 0xd0cd, + 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cc, 0xd0cb, 0xd0cb, 0xd0cb, + 0xd0cb, 0xd0ca, 0xd0ca, 0xd0ca, 0xd0ca, 0xd0c9, 0xd0c9, 0xd0c9, + 0xd0c9, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c8, 0xd0c7, 0xd0c7, + 0xd0c7, 0xd0c7, 0xd0c6, 0xd0c6, 0xd0c6, 0xd0c6, 0xd0c5, 0xd0c5, + 0xd0c5, 0xd0c5, 0xd0c5, 0xd0c4, 0xd0c4, 0xd0c4, 0xd0c4, 0xd0c3, + 0xd0c3, 0xd0c3, 0xd0c3, 0xd0c2, 0xd0c2, 0xd0c2, 0xd0c2, 0xd0c2, + 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c0, 0xd0c0, 0xd0c0, 0xd0c0, + 0xd0c0, 0xd0bf, 0xd0bf, 0xd0bf, 0xd0bf, 0xd0be, 0xd0be, 0xd0be, + 0xd0be, 0xd0be, 0xd0bd, 0xd0bd, 0xd0bd, 0xd0bd, 0xd0bc, 0xd0bc, + 0xd0bc, 0xd0bc, 0xd0bc, 0xd0bb, 0xd0bb, 0xd0bb, 0xd0bb, 0xd0ba, + 0xd0ba, 0xd0ba, 0xd0ba, 0xd0ba, 0xd0b9, 0xd0b9, 0xd0b9, 0xd0b9, + 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b8, 0xd0b7, 0xd0b7, 0xd0b7, + 0xd0b7, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b6, 0xd0b5, 0xd0b5, + 0xd0b5, 0xd0b5, 0xd0b5, 0xd0b4, 0xd0b4, 0xd0b4, 0xd0b4, 0xd0b3, + 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b3, 0xd0b2, 0xd0b2, 0xd0b2, 0xd0b2, + 0xd0b2, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b1, 0xd0b0, 0xd0b0, 0xd0b0, + 0xd0b0, 0xd0b0, 0xd0af, 0xd0af, 0xd0af, 0xd0af, 0xd0af, 0xd0ae, + 0xd0ae, 0xd0ae, 0xd0ae, 0xd0ad, 0xd0ad, 0xd0ad, 0xd0ad, 0xd0ad, + 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ac, 0xd0ab, 0xd0ab, 0xd0ab, + 0xd0ab, 0xd0ab, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0aa, 0xd0a9, + 0xd0a9, 0xd0a9, 0xd0a9, 0xd0a9, 0xd0a8, 0xd0a8, 0xd0a8, 0xd0a8, + 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a7, 0xd0a6, 0xd0a6, 0xd0a6, + 0xd0a6, 0xd0a6, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a5, 0xd0a4, + 0xd0a4, 0xd0a4, 0xd0a4, 0xd0a4, 0xd0a3, 0xd0a3, 0xd0a3, 0xd0a3, + 0xd0a3, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a2, 0xd0a1, 0xd0a1, + 0xd0a1, 0xd0a1, 0xd0a1, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, + 0xd09f, 0xd09f, 0xd09f, 0xd09f, 0xd09f, 0xd09e, 0xd09e, 0xd09e, + 0xd09e, 0xd09e, 0xd09d, 0xd09d, 0xd09d, 0xd09d, 0xd09d, 0xd09c, + 0xd09c, 0xd09c, 0xd09c, 0xd09c, 0xd09b, 0xd09b, 0xd09b, 0xd09b, + 0xd09b, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd09a, 0xd099, + 0xd099, 0xd099, 0xd099, 0xd099, 0xd098, 0xd098, 0xd098, 0xd098, + 0xd098, 0xd097, 0xd097, 0xd097, 0xd097, 0xd097, 0xd096, 0xd096, + 0xd096, 0xd096, 0xd096, 0xd095, 0xd095, 0xd095, 0xd095, 0xd095, + 0xd095, 0xd094, 0xd094, 0xd094, 0xd094, 0xd094, 0xd093, 0xd093, + 0xd093, 0xd093, 0xd093, 0xd092, 0xd092, 0xd092, 0xd092, 0xd092, + 0xd091, 0xd091, 0xd091, 0xd091, 0xd091, 0xd091, 0xd090, 0xd090, + 0xd090, 0xd090, 0xd090, 0xd08f, 0xd08f, 0xd08f, 0xd08f, 0xd08f, + 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08e, 0xd08d, 0xd08d, + 0xd08d, 0xd08d, 0xd08d, 0xd08c, 0xd08c, 0xd08c, 0xd08c, 0xd08c, + 0xd08c, 0xd08b, 0xd08b, 0xd08b, 0xd08b, 0xd08b, 0xd08a, 0xd08a, + 0xd08a, 0xd08a, 0xd08a, 0xd08a, 0xd089, 0xd089, 0xd089, 0xd089, + 0xd089, 0xd088, 0xd088, 0xd088, 0xd088, 0xd088, 0xd088, 0xd087, + 0xd087, 0xd087, 0xd087, 0xd087, 0xd086, 0xd086, 0xd086, 0xd086, + 0xd086, 0xd086, 0xd085, 0xd085, 0xd085, 0xd085, 0xd085, 0xd084, + 0xd084, 0xd084, 0xd084, 0xd084, 0xd084, 0xd083, 0xd083, 0xd083, + 0xd083, 0xd083, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, 0xd082, + 0xd081, 0xd081, 0xd081, 0xd081, 0xd081, 0xd081, 0xd080, 0xd080, + 0xd080, 0xd080, 0xd080, 0xd07f, 0xd07f, 0xd07f, 0xd07f, 0xd07f, + 0xd07f, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07e, 0xd07d, + 0xd07d, 0xd07d, 0xd07d, 0xd07d, 0xd07d, 0xd07c, 0xd07c, 0xd07c, + 0xd07c, 0xd07c, 0xd07b, 0xd07b, 0xd07b, 0xd07b, 0xd07b, 0xd07b, + 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd07a, 0xd079, 0xd079, + 0xd079, 0xd079, 0xd079, 0xd079, 0xd078, 0xd078, 0xd078, 0xd078, + 0xd078, 0xd078, 0xd077, 0xd077, 0xd077, 0xd077, 0xd077, 0xd077, + 0xd076, 0xd076, 0xd076, 0xd076, 0xd076, 0xd076, 0xd075, 0xd075, + 0xd075, 0xd075, 0xd075, 0xd074, 0xd074, 0xd074, 0xd074, 0xd074, + 0xd074, 0xd073, 0xd073, 0xd073, 0xd073, 0xd073, 0xd073, 0xd072, + 0xd072, 0xd072, 0xd072, 0xd072, 0xd072, 0xd071, 0xd071, 0xd071, + 0xd071, 0xd071, 0xd071, 0xd070, 0xd070, 0xd070, 0xd070, 0xd070, + 0xd070, 0xd070, 0xd06f, 0xd06f, 0xd06f, 0xd06f, 0xd06f, 0xd06f, + 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06e, 0xd06d, 0xd06d, + 0xd06d, 0xd06d, 0xd06d, 0xd06d, 0xd06c, 0xd06c, 0xd06c, 0xd06c, + 0xd06c, 0xd06c, 0xd06b, 0xd06b, 0xd06b, 0xd06b, 0xd06b, 0xd06b, + 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd06a, 0xd069, 0xd069, + 0xd069, 0xd069, 0xd069, 0xd069, 0xd069, 0xd068, 0xd068, 0xd068, + 0xd068, 0xd068, 0xd068, 0xd067, 0xd067, 0xd067, 0xd067, 0xd067, + 0xd067, 0xd066, 0xd066, 0xd066, 0xd066, 0xd066, 0xd066, 0xd065, + 0xd065, 0xd065, 0xd065, 0xd065, 0xd065, 0xd065, 0xd064, 0xd064, + 0xd064, 0xd064, 0xd064, 0xd064, 0xd063, 0xd063, 0xd063, 0xd063, + 0xd063, 0xd063, 0xd062, 0xd062, 0xd062, 0xd062, 0xd062, 0xd062, + 0xd062, 0xd061, 0xd061, 0xd061, 0xd061, 0xd061, 0xd061, 0xd060, + 0xd060, 0xd060, 0xd060, 0xd060, 0xd060, 0xd060, 0xd05f, 0xd05f, + 0xd05f, 0xd05f, 0xd05f, 0xd05f, 0xd05e, 0xd05e, 0xd05e, 0xd05e, + 0xd05e, 0xd05e, 0xd05e, 0xd05d, 0xd05d, 0xd05d, 0xd05d, 0xd05d, + 0xd05d, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, 0xd05c, + 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05b, 0xd05a, 0xd05a, + 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd05a, 0xd059, 0xd059, 0xd059, + 0xd059, 0xd059, 0xd059, 0xd059, 0xd058, 0xd058, 0xd058, 0xd058, + 0xd058, 0xd058, 0xd057, 0xd057, 0xd057, 0xd057, 0xd057, 0xd057, + 0xd057, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, 0xd056, + 0xd055, 0xd055, 0xd055, 0xd055, 0xd055, 0xd055, 0xd054, 0xd054, + 0xd054, 0xd054, 0xd054, 0xd054, 0xd054, 0xd053, 0xd053, 0xd053, + 0xd053, 0xd053, 0xd053, 0xd053, 0xd052, 0xd052, 0xd052, 0xd052, + 0xd052, 0xd052, 0xd052, 0xd051, 0xd051, 0xd051, 0xd051, 0xd051, + 0xd051, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, 0xd050, + 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04f, 0xd04e, + 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04e, 0xd04d, 0xd04d, + 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04d, 0xd04c, 0xd04c, 0xd04c, + 0xd04c, 0xd04c, 0xd04c, 0xd04c, 0xd04b, 0xd04b, 0xd04b, 0xd04b, + 0xd04b, 0xd04b, 0xd04b, 0xd04a, 0xd04a, 0xd04a, 0xd04a, 0xd04a, + 0xd04a, 0xd04a, 0xd049, 0xd049, 0xd049, 0xd049, 0xd049, 0xd049, + 0xd049, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, 0xd048, + 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd047, 0xd046, + 0xd046, 0xd046, 0xd046, 0xd046, 0xd046, 0xd046, 0xd045, 0xd045, + 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd045, 0xd044, 0xd044, + 0xd044, 0xd044, 0xd044, 0xd044, 0xd044, 0xd043, 0xd043, 0xd043, + 0xd043, 0xd043, 0xd043, 0xd043, 0xd042, 0xd042, 0xd042, 0xd042, + 0xd042, 0xd042, 0xd042, 0xd041, 0xd041, 0xd041, 0xd041, 0xd041, + 0xd041, 0xd041, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, + 0xd040, 0xd040, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03f, 0xd03f, + 0xd03f, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, 0xd03e, + 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, 0xd03d, + 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03c, 0xd03b, + 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03b, 0xd03a, + 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd03a, 0xd039, 0xd039, + 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd039, 0xd038, 0xd038, + 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd037, 0xd037, 0xd037, + 0xd037, 0xd037, 0xd037, 0xd037, 0xd037, 0xd036, 0xd036, 0xd036, + 0xd036, 0xd036, 0xd036, 0xd036, 0xd035, 0xd035, 0xd035, 0xd035, + 0xd035, 0xd035, 0xd035, 0xd035, 0xd034, 0xd034, 0xd034, 0xd034, + 0xd034, 0xd034, 0xd034, 0xd034, 0xd033, 0xd033, 0xd033, 0xd033, + 0xd033, 0xd033, 0xd033, 0xd032, 0xd032, 0xd032, 0xd032, 0xd032, + 0xd032, 0xd032, 0xd032, 0xd031, 0xd031, 0xd031, 0xd031, 0xd031, + 0xd031, 0xd031, 0xd031, 0xd030, 0xd030, 0xd030, 0xd030, 0xd030, + 0xd030, 0xd030, 0xd030, 0xd02f, 0xd02f, 0xd02f, 0xd02f, 0xd02f, + 0xd02f, 0xd02f, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, 0xd02e, + 0xd02e, 0xd02e, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, + 0xd02d, 0xd02d, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, 0xd02c, + 0xd02c, 0xd02c, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, 0xd02b, + 0xd02b, 0xd02b, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, 0xd02a, + 0xd02a, 0xd02a, 0xd029, 0xd029, 0xd029, 0xd029, 0xd029, 0xd029, + 0xd029, 0xd028, 0xd028, 0xd028, 0xd028, 0xd027, 0xd027, 0xd027, + 0xd027, 0xd026, 0xd026, 0xd026, 0xd026, 0xd025, 0xd025, 0xd025, + 0xd025, 0xd024, 0xd024, 0xd024, 0xd024, 0xd023, 0xd023, 0xd023, + 0xd023, 0xd022, 0xd022, 0xd022, 0xd022, 0xd022, 0xd021, 0xd021, + 0xd021, 0xd021, 0xd020, 0xd020, 0xd020, 0xd020, 0xd01f, 0xd01f, + 0xd01f, 0xd01f, 0xd01e, 0xd01e, 0xd01e, 0xd01e, 0xd01d, 0xd01d, + 0xd01d, 0xd01d, 0xd01c, 0xd01c, 0xd01c, 0xd01c, 0xd01c, 0xd01b, + 0xd01b, 0xd01b, 0xd01b, 0xd01a, 0xd01a, 0xd01a, 0xd01a, 0xd019, + 0xd019, 0xd019, 0xd019, 0xd018, 0xd018, 0xd018, 0xd018, 0xd018, + 0xd017, 0xd017, 0xd017, 0xd017, 0xd016, 0xd016, 0xd016, 0xd016, + 0xd015, 0xd015, 0xd015, 0xd015, 0xd014, 0xd014, 0xd014, 0xd014, + 0xd014, 0xd013, 0xd013, 0xd013, 0xd013, 0xd012, 0xd012, 0xd012, + 0xd012, 0xd012, 0xd011, 0xd011, 0xd011, 0xd011, 0xd010, 0xd010, + 0xd010, 0xd010, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00f, 0xd00e, + 0xd00e, 0xd00e, 0xd00e, 0xd00d, 0xd00d, 0xd00d, 0xd00d, 0xd00d, + 0xd00c, 0xd00c, 0xd00c, 0xd00c, 0xd00b, 0xd00b, 0xd00b, 0xd00b, + 0xd00b, 0xd00a, 0xd00a, 0xd00a, 0xd00a, 0xd009, 0xd009, 0xd009, + 0xd009, 0xd009, 0xd008, 0xd008, 0xd008, 0xd008, 0xd007, 0xd007, + 0xd007, 0xd007, 0xd007, 0xd006, 0xd006, 0xd006, 0xd006, 0xd005, + 0xd005, 0xd005, 0xd005, 0xd005, 0xd004, 0xd004, 0xd004, 0xd004, + 0xd004, 0xd003, 0xd003, 0xd003, 0xd003, 0xd002, 0xd002, 0xd002, + 0xd002, 0xd002, 0xd001, 0xd001, 0xd001, 0xd001, 0xd000, 0xd000, + 0xd000, 0xd000, 0xcfff, 0xcfff, 0xcffe, 0xcffe, 0xcffe, 0xcffd, + 0xcffd, 0xcffc, 0xcffc, 0xcffb, 0xcffb, 0xcffb, 0xcffa, 0xcffa, + 0xcff9, 0xcff9, 0xcff9, 0xcff8, 0xcff8, 0xcff7, 0xcff7, 0xcff6, + 0xcff6, 0xcff6, 0xcff5, 0xcff5, 0xcff4, 0xcff4, 0xcff3, 0xcff3, + 0xcff3, 0xcff2, 0xcff2, 0xcff1, 0xcff1, 0xcff1, 0xcff0, 0xcff0, + 0xcfef, 0xcfef, 0xcfef, 0xcfee, 0xcfee, 0xcfed, 0xcfed, 0xcfec, + 0xcfec, 0xcfec, 0xcfeb, 0xcfeb, 0xcfea, 0xcfea, 0xcfea, 0xcfe9, + 0xcfe9, 0xcfe8, 0xcfe8, 0xcfe8, 0xcfe7, 0xcfe7, 0xcfe6, 0xcfe6, + 0xcfe6, 0xcfe5, 0xcfe5, 0xcfe4, 0xcfe4, 0xcfe4, 0xcfe3, 0xcfe3, + 0xcfe2, 0xcfe2, 0xcfe2, 0xcfe1, 0xcfe1, 0xcfe0, 0xcfe0, 0xcfdf, + 0xcfdf, 0xcfdf, 0xcfde, 0xcfde, 0xcfde, 0xcfdd, 0xcfdd, 0xcfdc, + 0xcfdc, 0xcfdc, 0xcfdb, 0xcfdb, 0xcfda, 0xcfda, 0xcfda, 0xcfd9, + 0xcfd9, 0xcfd8, 0xcfd8, 0xcfd8, 0xcfd7, 0xcfd7, 0xcfd6, 0xcfd6, + 0xcfd6, 0xcfd5, 0xcfd5, 0xcfd4, 0xcfd4, 0xcfd4, 0xcfd3, 0xcfd3, + 0xcfd2, 0xcfd2, 0xcfd2, 0xcfd1, 0xcfd1, 0xcfd1, 0xcfd0, 0xcfd0, + 0xcfcf, 0xcfcf, 0xcfcf, 0xcfce, 0xcfce, 0xcfcd, 0xcfcd, 0xcfcd, + 0xcfcc, 0xcfcc, 0xcfcb, 0xcfcb, 0xcfcb, 0xcfca, 0xcfca, 0xcfca, + 0xcfc9, 0xcfc9, 0xcfc8, 0xcfc8, 0xcfc8, 0xcfc7, 0xcfc7, 0xcfc6, + 0xcfc6, 0xcfc6, 0xcfc5, 0xcfc5, 0xcfc5, 0xcfc4, 0xcfc4, 0xcfc3, + 0xcfc3, 0xcfc3, 0xcfc2, 0xcfc2, 0xcfc2, 0xcfc1, 0xcfc1, 0xcfc0, + 0xcfc0, 0xcfc0, 0xcfbf, 0xcfbf, 0xcfbf, 0xcfbe, 0xcfbe, 0xcfbd, + 0xcfbd, 0xcfbd, 0xcfbc, 0xcfbc, 0xcfbc, 0xcfbb, 0xcfbb, 0xcfba, + 0xcfba, 0xcfba, 0xcfb9, 0xcfb9, 0xcfb9, 0xcfb8, 0xcfb8, 0xcfb7, + 0xcfb7, 0xcfb7, 0xcfb6, 0xcfb6, 0xcfb6, 0xcfb5, 0xcfb5, 0xcfb5, + 0xcfb4, 0xcfb4, 0xcfb3, 0xcfb3, 0xcfb3, 0xcfb2, 0xcfb2, 0xcfb2, + 0xcfb1, 0xcfb1, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfaf, 0xcfaf, 0xcfaf, + 0xcfae, 0xcfae, 0xcfae, 0xcfad, 0xcfad, 0xcfac, 0xcfac, 0xcfac, + 0xcfab, 0xcfab, 0xcfab, 0xcfaa, 0xcfaa, 0xcfaa, 0xcfa9, 0xcfa9, + 0xcfa9, 0xcfa8, 0xcfa8, 0xcfa7, 0xcfa7, 0xcfa7, 0xcfa6, 0xcfa6, + 0xcfa6, 0xcfa5, 0xcfa5, 0xcfa5, 0xcfa4, 0xcfa4, 0xcfa4, 0xcfa3, + 0xcfa3, 0xcfa2, 0xcfa2, 0xcfa2, 0xcfa1, 0xcfa1, 0xcfa1, 0xcfa0, + 0xcfa0, 0xcfa0, 0xcf9f, 0xcf9f, 0xcf9f, 0xcf9e, 0xcf9e, 0xcf9d, + 0xcf9d, 0xcf9d, 0xcf9c, 0xcf9c, 0xcf9c, 0xcf9b, 0xcf9b, 0xcf9b, + 0xcf9a, 0xcf9a, 0xcf9a, 0xcf99, 0xcf99, 0xcf99, 0xcf98, 0xcf98, + 0xcf98, 0xcf97, 0xcf97, 0xcf96, 0xcf96, 0xcf96, 0xcf95, 0xcf95, + 0xcf95, 0xcf94, 0xcf94, 0xcf94, 0xcf93, 0xcf93, 0xcf93, 0xcf92, + 0xcf92, 0xcf92, 0xcf91, 0xcf91, 0xcf91, 0xcf90, 0xcf90, 0xcf90, + 0xcf8f, 0xcf8f, 0xcf8f, 0xcf8e, 0xcf8e, 0xcf8e, 0xcf8d, 0xcf8d, + 0xcf8d, 0xcf8c, 0xcf8c, 0xcf8c, 0xcf8b, 0xcf8b, 0xcf8a, 0xcf8a, + 0xcf8a, 0xcf89, 0xcf89, 0xcf89, 0xcf88, 0xcf88, 0xcf88, 0xcf87, + 0xcf87, 0xcf87, 0xcf86, 0xcf86, 0xcf86, 0xcf85, 0xcf85, 0xcf85, + 0xcf84, 0xcf84, 0xcf84, 0xcf83, 0xcf83, 0xcf83, 0xcf82, 0xcf82, + 0xcf82, 0xcf81, 0xcf81, 0xcf81, 0xcf80, 0xcf80, 0xcf80, 0xcf7f, + 0xcf7f, 0xcf7f, 0xcf7e, 0xcf7e, 0xcf7e, 0xcf7d, 0xcf7d, 0xcf7d, + 0xcf7c, 0xcf7c, 0xcf7c, 0xcf7b, 0xcf7b, 0xcf7b, 0xcf7a, 0xcf7a, + 0xcf7a, 0xcf79, 0xcf79, 0xcf79, 0xcf79, 0xcf78, 0xcf78, 0xcf78, + 0xcf77, 0xcf77, 0xcf77, 0xcf76, 0xcf76, 0xcf76, 0xcf75, 0xcf75, + 0xcf75, 0xcf74, 0xcf74, 0xcf74, 0xcf73, 0xcf73, 0xcf73, 0xcf72, + 0xcf72, 0xcf72, 0xcf71, 0xcf71, 0xcf71, 0xcf70, 0xcf70, 0xcf70, + 0xcf6f, 0xcf6f, 0xcf6f, 0xcf6e, 0xcf6e, 0xcf6e, 0xcf6d, 0xcf6d, + 0xcf6d, 0xcf6d, 0xcf6c, 0xcf6c, 0xcf6c, 0xcf6b, 0xcf6b, 0xcf6b, + 0xcf6a, 0xcf6a, 0xcf6a, 0xcf69, 0xcf69, 0xcf69, 0xcf68, 0xcf68, + 0xcf68, 0xcf67, 0xcf67, 0xcf67, 0xcf66, 0xcf66, 0xcf66, 0xcf66, + 0xcf65, 0xcf65, 0xcf65, 0xcf64, 0xcf64, 0xcf64, 0xcf63, 0xcf63, + 0xcf63, 0xcf62, 0xcf62, 0xcf62, 0xcf61, 0xcf61, 0xcf61, 0xcf61, + 0xcf60, 0xcf60, 0xcf60, 0xcf5f, 0xcf5f, 0xcf5f, 0xcf5e, 0xcf5e, + 0xcf5e, 0xcf5d, 0xcf5d, 0xcf5d, 0xcf5c, 0xcf5c, 0xcf5c, 0xcf5c, + 0xcf5b, 0xcf5b, 0xcf5b, 0xcf5a, 0xcf5a, 0xcf5a, 0xcf59, 0xcf59, + 0xcf59, 0xcf58, 0xcf58, 0xcf58, 0xcf58, 0xcf57, 0xcf57, 0xcf57, + 0xcf56, 0xcf56, 0xcf56, 0xcf55, 0xcf55, 0xcf55, 0xcf54, 0xcf54, + 0xcf54, 0xcf54, 0xcf53, 0xcf53, 0xcf53, 0xcf52, 0xcf52, 0xcf52, + 0xcf51, 0xcf51, 0xcf51, 0xcf51, 0xcf50, 0xcf50, 0xcf50, 0xcf4f, + 0xcf4f, 0xcf4f, 0xcf4e, 0xcf4e, 0xcf4e, 0xcf4e, 0xcf4d, 0xcf4d, + 0xcf4d, 0xcf4c, 0xcf4c, 0xcf4c, 0xcf4b, 0xcf4b, 0xcf4b, 0xcf4b, + 0xcf4a, 0xcf4a, 0xcf4a, 0xcf49, 0xcf49, 0xcf49, 0xcf48, 0xcf48, + 0xcf48, 0xcf48, 0xcf47, 0xcf47, 0xcf47, 0xcf46, 0xcf46, 0xcf46, + 0xcf45, 0xcf45, 0xcf45, 0xcf45, 0xcf44, 0xcf44, 0xcf44, 0xcf43, + 0xcf43, 0xcf43, 0xcf42, 0xcf42, 0xcf42, 0xcf42, 0xcf41, 0xcf41, + 0xcf41, 0xcf40, 0xcf40, 0xcf40, 0xcf40, 0xcf3f, 0xcf3f, 0xcf3f, + 0xcf3e, 0xcf3e, 0xcf3e, 0xcf3e, 0xcf3d, 0xcf3d, 0xcf3d, 0xcf3c, + 0xcf3c, 0xcf3c, 0xcf3b, 0xcf3b, 0xcf3b, 0xcf3b, 0xcf3a, 0xcf3a, + 0xcf3a, 0xcf39, 0xcf39, 0xcf39, 0xcf39, 0xcf38, 0xcf38, 0xcf38, + 0xcf37, 0xcf37, 0xcf37, 0xcf37, 0xcf36, 0xcf36, 0xcf36, 0xcf35, + 0xcf35, 0xcf35, 0xcf35, 0xcf34, 0xcf34, 0xcf34, 0xcf33, 0xcf33, + 0xcf33, 0xcf33, 0xcf32, 0xcf32, 0xcf32, 0xcf31, 0xcf31, 0xcf31, + 0xcf31, 0xcf30, 0xcf30, 0xcf30, 0xcf2f, 0xcf2f, 0xcf2f, 0xcf2f, + 0xcf2e, 0xcf2e, 0xcf2e, 0xcf2d, 0xcf2d, 0xcf2d, 0xcf2d, 0xcf2c, + 0xcf2c, 0xcf2c, 0xcf2b, 0xcf2b, 0xcf2b, 0xcf2b, 0xcf2a, 0xcf2a, + 0xcf2a, 0xcf29, 0xcf29, 0xcf29, 0xcf29, 0xcf28, 0xcf28, 0xcf28, + 0xcf28, 0xcf27, 0xcf27, 0xcf27, 0xcf26, 0xcf26, 0xcf26, 0xcf26, + 0xcf25, 0xcf25, 0xcf25, 0xcf24, 0xcf24, 0xcf24, 0xcf24, 0xcf23, + 0xcf23, 0xcf23, 0xcf23, 0xcf22, 0xcf22, 0xcf22, 0xcf21, 0xcf21, + 0xcf21, 0xcf21, 0xcf20, 0xcf20, 0xcf20, 0xcf1f, 0xcf1f, 0xcf1f, + 0xcf1f, 0xcf1e, 0xcf1e, 0xcf1e, 0xcf1e, 0xcf1d, 0xcf1d, 0xcf1d, + 0xcf1c, 0xcf1c, 0xcf1c, 0xcf1c, 0xcf1b, 0xcf1b, 0xcf1b, 0xcf1b, + 0xcf1a, 0xcf1a, 0xcf1a, 0xcf19, 0xcf19, 0xcf19, 0xcf19, 0xcf18, + 0xcf18, 0xcf18, 0xcf18, 0xcf17, 0xcf17, 0xcf17, 0xcf16, 0xcf16, + 0xcf16, 0xcf16, 0xcf15, 0xcf15, 0xcf15, 0xcf15, 0xcf14, 0xcf14, + 0xcf14, 0xcf14, 0xcf13, 0xcf13, 0xcf13, 0xcf12, 0xcf12, 0xcf12, + 0xcf12, 0xcf11, 0xcf11, 0xcf11, 0xcf11, 0xcf10, 0xcf10, 0xcf10, + 0xcf10, 0xcf0f, 0xcf0f, 0xcf0f, 0xcf0e, 0xcf0e, 0xcf0e, 0xcf0e, + 0xcf0d, 0xcf0d, 0xcf0d, 0xcf0d, 0xcf0c, 0xcf0c, 0xcf0c, 0xcf0c, + 0xcf0b, 0xcf0b, 0xcf0b, 0xcf0a, 0xcf0a, 0xcf0a, 0xcf0a, 0xcf09, + 0xcf09, 0xcf09, 0xcf09, 0xcf08, 0xcf08, 0xcf08, 0xcf08, 0xcf07, + 0xcf07, 0xcf07, 0xcf07, 0xcf06, 0xcf06, 0xcf06, 0xcf05, 0xcf05, + 0xcf05, 0xcf05, 0xcf04, 0xcf04, 0xcf04, 0xcf04, 0xcf03, 0xcf03, + 0xcf03, 0xcf03, 0xcf02, 0xcf02, 0xcf02, 0xcf02, 0xcf01, 0xcf01, + 0xcf01, 0xcf01, 0xcf00, 0xcf00, 0xcf00, 0xceff, 0xceff, 0xceff, + 0xceff, 0xcefe, 0xcefe, 0xcefe, 0xcefe, 0xcefd, 0xcefd, 0xcefd, + 0xcefd, 0xcefc, 0xcefc, 0xcefc, 0xcefc, 0xcefb, 0xcefb, 0xcefb, + 0xcefb, 0xcefa, 0xcefa, 0xcefa, 0xcefa, 0xcef9, 0xcef9, 0xcef9, + 0xcef9, 0xcef8, 0xcef8, 0xcef8, 0xcef8, 0xcef7, 0xcef7, 0xcef7, + 0xcef7, 0xcef6, 0xcef6, 0xcef6, 0xcef6, 0xcef5, 0xcef5, 0xcef5, + 0xcef4, 0xcef4, 0xcef4, 0xcef4, 0xcef3, 0xcef3, 0xcef3, 0xcef3, + 0xcef2, 0xcef2, 0xcef2, 0xcef2, 0xcef1, 0xcef1, 0xcef1, 0xcef1, + 0xcef0, 0xcef0, 0xcef0, 0xcef0, 0xceef, 0xceef, 0xceef, 0xceef, + 0xceee, 0xceee, 0xceed, 0xceed, 0xceec, 0xceec, 0xceeb, 0xceeb, + 0xceea, 0xceea, 0xcee9, 0xcee9, 0xcee8, 0xcee8, 0xcee8, 0xcee7, + 0xcee7, 0xcee6, 0xcee6, 0xcee5, 0xcee5, 0xcee4, 0xcee4, 0xcee3, + 0xcee3, 0xcee2, 0xcee2, 0xcee1, 0xcee1, 0xcee0, 0xcee0, 0xcedf, + 0xcedf, 0xcede, 0xcede, 0xcedd, 0xcedd, 0xcedc, 0xcedc, 0xcedb, + 0xcedb, 0xceda, 0xceda, 0xced9, 0xced9, 0xced8, 0xced8, 0xced7, + 0xced7, 0xced7, 0xced6, 0xced6, 0xced5, 0xced5, 0xced4, 0xced4, + 0xced3, 0xced3, 0xced2, 0xced2, 0xced1, 0xced1, 0xced0, 0xced0, + 0xcecf, 0xcecf, 0xcece, 0xcece, 0xcece, 0xcecd, 0xcecd, 0xcecc, + 0xcecc, 0xcecb, 0xcecb, 0xceca, 0xceca, 0xcec9, 0xcec9, 0xcec8, + 0xcec8, 0xcec7, 0xcec7, 0xcec7, 0xcec6, 0xcec6, 0xcec5, 0xcec5, + 0xcec4, 0xcec4, 0xcec3, 0xcec3, 0xcec2, 0xcec2, 0xcec1, 0xcec1, + 0xcec1, 0xcec0, 0xcec0, 0xcebf, 0xcebf, 0xcebe, 0xcebe, 0xcebd, + 0xcebd, 0xcebc, 0xcebc, 0xcebc, 0xcebb, 0xcebb, 0xceba, 0xceba, + 0xceb9, 0xceb9, 0xceb8, 0xceb8, 0xceb8, 0xceb7, 0xceb7, 0xceb6, + 0xceb6, 0xceb5, 0xceb5, 0xceb4, 0xceb4, 0xceb3, 0xceb3, 0xceb3, + 0xceb2, 0xceb2, 0xceb1, 0xceb1, 0xceb0, 0xceb0, 0xceaf, 0xceaf, + 0xceaf, 0xceae, 0xceae, 0xcead, 0xcead, 0xceac, 0xceac, 0xceac, + 0xceab, 0xceab, 0xceaa, 0xceaa, 0xcea9, 0xcea9, 0xcea8, 0xcea8, + 0xcea8, 0xcea7, 0xcea7, 0xcea6, 0xcea6, 0xcea5, 0xcea5, 0xcea5, + 0xcea4, 0xcea4, 0xcea3, 0xcea3, 0xcea2, 0xcea2, 0xcea2, 0xcea1, + 0xcea1, 0xcea0, 0xcea0, 0xce9f, 0xce9f, 0xce9f, 0xce9e, 0xce9e, + 0xce9d, 0xce9d, 0xce9c, 0xce9c, 0xce9c, 0xce9b, 0xce9b, 0xce9a, + 0xce9a, 0xce99, 0xce99, 0xce99, 0xce98, 0xce98, 0xce97, 0xce97, + 0xce96, 0xce96, 0xce96, 0xce95, 0xce95, 0xce94, 0xce94, 0xce94, + 0xce93, 0xce93, 0xce92, 0xce92, 0xce91, 0xce91, 0xce91, 0xce90, + 0xce90, 0xce8f, 0xce8f, 0xce8f, 0xce8e, 0xce8e, 0xce8d, 0xce8d, + 0xce8c, 0xce8c, 0xce8c, 0xce8b, 0xce8b, 0xce8a, 0xce8a, 0xce8a, + 0xce89, 0xce89, 0xce88, 0xce88, 0xce88, 0xce87, 0xce87, 0xce86, + 0xce86, 0xce85, 0xce85, 0xce85, 0xce84, 0xce84, 0xce83, 0xce83, + 0xce83, 0xce82, 0xce82, 0xce81, 0xce81, 0xce81, 0xce80, 0xce80, + 0xce7f, 0xce7f, 0xce7f, 0xce7e, 0xce7e, 0xce7d, 0xce7d, 0xce7d, + 0xce7c, 0xce7c, 0xce7b, 0xce7b, 0xce7b, 0xce7a, 0xce7a, 0xce79, + 0xce79, 0xce79, 0xce78, 0xce78, 0xce77, 0xce77, 0xce77, 0xce76, + 0xce76, 0xce75, 0xce75, 0xce75, 0xce74, 0xce74, 0xce73, 0xce73, + 0xce73, 0xce72, 0xce72, 0xce72, 0xce71, 0xce71, 0xce70, 0xce70, + 0xce70, 0xce6f, 0xce6f, 0xce6e, 0xce6e, 0xce6e, 0xce6d, 0xce6d, + 0xce6c, 0xce6c, 0xce6c, 0xce6b, 0xce6b, 0xce6b, 0xce6a, 0xce6a, + 0xce69, 0xce69, 0xce69, 0xce68, 0xce68, 0xce67, 0xce67, 0xce67, + 0xce66, 0xce66, 0xce66, 0xce65, 0xce65, 0xce64, 0xce64, 0xce64, + 0xce63, 0xce63, 0xce62, 0xce62, 0xce62, 0xce61, 0xce61, 0xce61, + 0xce60, 0xce60, 0xce5f, 0xce5f, 0xce5f, 0xce5e, 0xce5e, 0xce5e, + 0xce5d, 0xce5d, 0xce5c, 0xce5c, 0xce5c, 0xce5b, 0xce5b, 0xce5b, + 0xce5a, 0xce5a, 0xce59, 0xce59, 0xce59, 0xce58, 0xce58, 0xce58, + 0xce57, 0xce57, 0xce56, 0xce56, 0xce56, 0xce55, 0xce55, 0xce55, + 0xce54, 0xce54, 0xce53, 0xce53, 0xce53, 0xce52, 0xce52, 0xce52, + 0xce51, 0xce51, 0xce51, 0xce50, 0xce50, 0xce4f, 0xce4f, 0xce4f, + 0xce4e, 0xce4e, 0xce4e, 0xce4d, 0xce4d, 0xce4d, 0xce4c, 0xce4c, + 0xce4b, 0xce4b, 0xce4b, 0xce4a, 0xce4a, 0xce4a, 0xce49, 0xce49, + 0xce49, 0xce48, 0xce48, 0xce47, 0xce47, 0xce47, 0xce46, 0xce46, + 0xce46, 0xce45, 0xce45, 0xce45, 0xce44, 0xce44, 0xce43, 0xce43, + 0xce43, 0xce42, 0xce42, 0xce42, 0xce41, 0xce41, 0xce41, 0xce40, + 0xce40, 0xce40, 0xce3f, 0xce3f, 0xce3e, 0xce3e, 0xce3e, 0xce3d, + 0xce3d, 0xce3d, 0xce3c, 0xce3c, 0xce3c, 0xce3b, 0xce3b, 0xce3b, + 0xce3a, 0xce3a, 0xce3a, 0xce39, 0xce39, 0xce38, 0xce38, 0xce38, + 0xce37, 0xce37, 0xce37, 0xce36, 0xce36, 0xce36, 0xce35, 0xce35, + 0xce35, 0xce34, 0xce34, 0xce34, 0xce33, 0xce33, 0xce33, 0xce32, + 0xce32, 0xce32, 0xce31, 0xce31, 0xce30, 0xce30, 0xce30, 0xce2f, + 0xce2f, 0xce2f, 0xce2e, 0xce2e, 0xce2e, 0xce2d, 0xce2d, 0xce2d, + 0xce2c, 0xce2c, 0xce2c, 0xce2b, 0xce2b, 0xce2b, 0xce2a, 0xce2a, + 0xce2a, 0xce29, 0xce29, 0xce29, 0xce28, 0xce28, 0xce28, 0xce27, + 0xce27, 0xce27, 0xce26, 0xce26, 0xce26, 0xce25, 0xce25, 0xce25, + 0xce24, 0xce24, 0xce24, 0xce23, 0xce23, 0xce23, 0xce22, 0xce22, + 0xce22, 0xce21, 0xce21, 0xce21, 0xce20, 0xce20, 0xce20, 0xce1f, + 0xce1f, 0xce1f, 0xce1e, 0xce1e, 0xce1e, 0xce1d, 0xce1d, 0xce1d, + 0xce1c, 0xce1c, 0xce1c, 0xce1b, 0xce1b, 0xce1b, 0xce1a, 0xce1a, + 0xce1a, 0xce19, 0xce19, 0xce19, 0xce18, 0xce18, 0xce18, 0xce17, + 0xce17, 0xce17, 0xce16, 0xce16, 0xce16, 0xce15, 0xce15, 0xce15, + 0xce14, 0xce14, 0xce14, 0xce13, 0xce13, 0xce13, 0xce12, 0xce12, + 0xce12, 0xce11, 0xce11, 0xce11, 0xce10, 0xce10, 0xce10, 0xce0f, + 0xce0f, 0xce0f, 0xce0e, 0xce0e, 0xce0e, 0xce0d, 0xce0d, 0xce0d, + 0xce0d, 0xce0c, 0xce0c, 0xce0c, 0xce0b, 0xce0b, 0xce0b, 0xce0a, + 0xce0a, 0xce0a, 0xce09, 0xce09, 0xce09, 0xce08, 0xce08, 0xce08, + 0xce07, 0xce07, 0xce07, 0xce06, 0xce06, 0xce06, 0xce05, 0xce05, + 0xce05, 0xce05, 0xce04, 0xce04, 0xce04, 0xce03, 0xce03, 0xce03, + 0xce02, 0xce02, 0xce02, 0xce01, 0xce01, 0xce01, 0xce00, 0xce00, + 0xce00, 0xce00, 0xcdff, 0xcdff, 0xcdff, 0xcdfe, 0xcdfe, 0xcdfe, + 0xcdfd, 0xcdfd, 0xcdfd, 0xcdfc, 0xcdfc, 0xcdfc, 0xcdfb, 0xcdfb, + 0xcdfb, 0xcdfb, 0xcdfa, 0xcdfa, 0xcdfa, 0xcdf9, 0xcdf9, 0xcdf9, + 0xcdf8, 0xcdf8, 0xcdf8, 0xcdf7, 0xcdf7, 0xcdf7, 0xcdf6, 0xcdf6, + 0xcdf6, 0xcdf6, 0xcdf5, 0xcdf5, 0xcdf5, 0xcdf4, 0xcdf4, 0xcdf4, + 0xcdf3, 0xcdf3, 0xcdf3, 0xcdf3, 0xcdf2, 0xcdf2, 0xcdf2, 0xcdf1, + 0xcdf1, 0xcdf1, 0xcdf0, 0xcdf0, 0xcdf0, 0xcdef, 0xcdef, 0xcdef, + 0xcdef, 0xcdee, 0xcdee, 0xcdee, 0xcded, 0xcded, 0xcded, 0xcdec, + 0xcdec, 0xcdec, 0xcdec, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdea, 0xcdea, + 0xcdea, 0xcde9, 0xcde9, 0xcde9, 0xcde9, 0xcde8, 0xcde8, 0xcde8, + 0xcde7, 0xcde7, 0xcde7, 0xcde6, 0xcde6, 0xcde6, 0xcde6, 0xcde5, + 0xcde5, 0xcde5, 0xcde4, 0xcde4, 0xcde4, 0xcde3, 0xcde3, 0xcde3, + 0xcde3, 0xcde2, 0xcde2, 0xcde2, 0xcde1, 0xcde1, 0xcde1, 0xcde0, + 0xcde0, 0xcde0, 0xcde0, 0xcddf, 0xcddf, 0xcddf, 0xcdde, 0xcdde, + 0xcdde, 0xcdde, 0xcddd, 0xcddd, 0xcddd, 0xcddc, 0xcddc, 0xcddc, + 0xcddb, 0xcddb, 0xcddb, 0xcddb, 0xcdda, 0xcdda, 0xcdda, 0xcdd9, + 0xcdd9, 0xcdd9, 0xcdd9, 0xcdd8, 0xcdd8, 0xcdd8, 0xcdd7, 0xcdd7, + 0xcdd7, 0xcdd7, 0xcdd6, 0xcdd6, 0xcdd6, 0xcdd5, 0xcdd5, 0xcdd5, + 0xcdd5, 0xcdd4, 0xcdd4, 0xcdd4, 0xcdd3, 0xcdd3, 0xcdd3, 0xcdd3, + 0xcdd2, 0xcdd2, 0xcdd2, 0xcdd1, 0xcdd1, 0xcdd1, 0xcdd1, 0xcdd0, + 0xcdd0, 0xcdd0, 0xcdcf, 0xcdcf, 0xcdcf, 0xcdcf, 0xcdce, 0xcdce, + 0xcdce, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcd, 0xcdcc, 0xcdcc, 0xcdcc, + 0xcdcb, 0xcdcb, 0xcdcb, 0xcdcb, 0xcdca, 0xcdca, 0xcdca, 0xcdc9, + 0xcdc9, 0xcdc9, 0xcdc9, 0xcdc8, 0xcdc8, 0xcdc8, 0xcdc7, 0xcdc7, + 0xcdc7, 0xcdc7, 0xcdc6, 0xcdc6, 0xcdc6, 0xcdc5, 0xcdc5, 0xcdc5, + 0xcdc5, 0xcdc4, 0xcdc4, 0xcdc4, 0xcdc4, 0xcdc3, 0xcdc3, 0xcdc3, + 0xcdc2, 0xcdc2, 0xcdc2, 0xcdc2, 0xcdc1, 0xcdc1, 0xcdc1, 0xcdc0, + 0xcdc0, 0xcdc0, 0xcdc0, 0xcdbf, 0xcdbf, 0xcdbf, 0xcdbf, 0xcdbe, + 0xcdbe, 0xcdbe, 0xcdbd, 0xcdbd, 0xcdbd, 0xcdbd, 0xcdbc, 0xcdbc, + 0xcdbc, 0xcdbb, 0xcdbb, 0xcdbb, 0xcdbb, 0xcdba, 0xcdba, 0xcdba, + 0xcdba, 0xcdb9, 0xcdb9, 0xcdb9, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, + 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb7, 0xcdb6, 0xcdb6, 0xcdb6, 0xcdb5, + 0xcdb5, 0xcdb5, 0xcdb5, 0xcdb4, 0xcdb4, 0xcdb4, 0xcdb4, 0xcdb3, + 0xcdb3, 0xcdb3, 0xcdb3, 0xcdb2, 0xcdb2, 0xcdb2, 0xcdb1, 0xcdb1, + 0xcdb1, 0xcdb1, 0xcdb0, 0xcdb0, 0xcdb0, 0xcdb0, 0xcdaf, 0xcdaf, + 0xcdaf, 0xcdae, 0xcdae, 0xcdae, 0xcdae, 0xcdad, 0xcdad, 0xcdad, + 0xcdad, 0xcdac, 0xcdac, 0xcdac, 0xcdac, 0xcdab, 0xcdab, 0xcdab, + 0xcdaa, 0xcdaa, 0xcdaa, 0xcdaa, 0xcda9, 0xcda9, 0xcda9, 0xcda9, + 0xcda8, 0xcda8, 0xcda8, 0xcda8, 0xcda7, 0xcda7, 0xcda7, 0xcda7, + 0xcda6, 0xcda6, 0xcda6, 0xcda5, 0xcda5, 0xcda5, 0xcda5, 0xcda4, + 0xcda4, 0xcda4, 0xcda4, 0xcda3, 0xcda3, 0xcda3, 0xcda3, 0xcda2, + 0xcda2, 0xcda2, 0xcda2, 0xcda1, 0xcda1, 0xcda1, 0xcda0, 0xcda0, + 0xcda0, 0xcda0, 0xcd9f, 0xcd9f, 0xcd9f, 0xcd9f, 0xcd9e, 0xcd9e, + 0xcd9e, 0xcd9e, 0xcd9d, 0xcd9d, 0xcd9d, 0xcd9d, 0xcd9c, 0xcd9c, + 0xcd9c, 0xcd9c, 0xcd9b, 0xcd9b, 0xcd9b, 0xcd9b, 0xcd9a, 0xcd9a, + 0xcd9a, 0xcd9a, 0xcd99, 0xcd99, 0xcd99, 0xcd98, 0xcd98, 0xcd98, + 0xcd98, 0xcd97, 0xcd97, 0xcd97, 0xcd97, 0xcd96, 0xcd96, 0xcd96, + 0xcd96, 0xcd95, 0xcd95, 0xcd95, 0xcd95, 0xcd94, 0xcd94, 0xcd94, + 0xcd94, 0xcd93, 0xcd93, 0xcd93, 0xcd93, 0xcd92, 0xcd92, 0xcd92, + 0xcd92, 0xcd91, 0xcd91, 0xcd91, 0xcd91, 0xcd90, 0xcd90, 0xcd90, + 0xcd90, 0xcd8f, 0xcd8f, 0xcd8f, 0xcd8f, 0xcd8e, 0xcd8e, 0xcd8e, + 0xcd8e, 0xcd8d, 0xcd8d, 0xcd8d, 0xcd8d, 0xcd8c, 0xcd8c, 0xcd8c, + 0xcd8c, 0xcd8b, 0xcd8b, 0xcd8a, 0xcd8a, 0xcd89, 0xcd89, 0xcd88, + 0xcd88, 0xcd87, 0xcd87, 0xcd86, 0xcd86, 0xcd85, 0xcd85, 0xcd84, + 0xcd84, 0xcd83, 0xcd83, 0xcd82, 0xcd82, 0xcd81, 0xcd81, 0xcd80, + 0xcd80, 0xcd7f, 0xcd7f, 0xcd7e, 0xcd7e, 0xcd7d, 0xcd7d, 0xcd7c, + 0xcd7c, 0xcd7b, 0xcd7b, 0xcd7a, 0xcd7a, 0xcd79, 0xcd79, 0xcd78, + 0xcd78, 0xcd77, 0xcd77, 0xcd77, 0xcd76, 0xcd76, 0xcd75, 0xcd75, + 0xcd74, 0xcd74, 0xcd73, 0xcd73, 0xcd72, 0xcd72, 0xcd71, 0xcd71, + 0xcd70, 0xcd70, 0xcd6f, 0xcd6f, 0xcd6e, 0xcd6e, 0xcd6d, 0xcd6d, + 0xcd6d, 0xcd6c, 0xcd6c, 0xcd6b, 0xcd6b, 0xcd6a, 0xcd6a, 0xcd69, + 0xcd69, 0xcd68, 0xcd68, 0xcd67, 0xcd67, 0xcd66, 0xcd66, 0xcd66, + 0xcd65, 0xcd65, 0xcd64, 0xcd64, 0xcd63, 0xcd63, 0xcd62, 0xcd62, + 0xcd61, 0xcd61, 0xcd60, 0xcd60, 0xcd60, 0xcd5f, 0xcd5f, 0xcd5e, + 0xcd5e, 0xcd5d, 0xcd5d, 0xcd5c, 0xcd5c, 0xcd5b, 0xcd5b, 0xcd5a, + 0xcd5a, 0xcd5a, 0xcd59, 0xcd59, 0xcd58, 0xcd58, 0xcd57, 0xcd57, + 0xcd56, 0xcd56, 0xcd56, 0xcd55, 0xcd55, 0xcd54, 0xcd54, 0xcd53, + 0xcd53, 0xcd52, 0xcd52, 0xcd51, 0xcd51, 0xcd51, 0xcd50, 0xcd50, + 0xcd4f, 0xcd4f, 0xcd4e, 0xcd4e, 0xcd4d, 0xcd4d, 0xcd4d, 0xcd4c, + 0xcd4c, 0xcd4b, 0xcd4b, 0xcd4a, 0xcd4a, 0xcd4a, 0xcd49, 0xcd49, + 0xcd48, 0xcd48, 0xcd47, 0xcd47, 0xcd46, 0xcd46, 0xcd46, 0xcd45, + 0xcd45, 0xcd44, 0xcd44, 0xcd43, 0xcd43, 0xcd43, 0xcd42, 0xcd42, + 0xcd41, 0xcd41, 0xcd40, 0xcd40, 0xcd40, 0xcd3f, 0xcd3f, 0xcd3e, + 0xcd3e, 0xcd3d, 0xcd3d, 0xcd3c, 0xcd3c, 0xcd3c, 0xcd3b, 0xcd3b, + 0xcd3a, 0xcd3a, 0xcd3a, 0xcd39, 0xcd39, 0xcd38, 0xcd38, 0xcd37, + 0xcd37, 0xcd37, 0xcd36, 0xcd36, 0xcd35, 0xcd35, 0xcd34, 0xcd34, + 0xcd34, 0xcd33, 0xcd33, 0xcd32, 0xcd32, 0xcd31, 0xcd31, 0xcd31, + 0xcd30, 0xcd30, 0xcd2f, 0xcd2f, 0xcd2f, 0xcd2e, 0xcd2e, 0xcd2d, + 0xcd2d, 0xcd2c, 0xcd2c, 0xcd2c, 0xcd2b, 0xcd2b, 0xcd2a, 0xcd2a, + 0xcd2a, 0xcd29, 0xcd29, 0xcd28, 0xcd28, 0xcd28, 0xcd27, 0xcd27, + 0xcd26, 0xcd26, 0xcd25, 0xcd25, 0xcd25, 0xcd24, 0xcd24, 0xcd23, + 0xcd23, 0xcd23, 0xcd22, 0xcd22, 0xcd21, 0xcd21, 0xcd21, 0xcd20, + 0xcd20, 0xcd1f, 0xcd1f, 0xcd1f, 0xcd1e, 0xcd1e, 0xcd1d, 0xcd1d, + 0xcd1d, 0xcd1c, 0xcd1c, 0xcd1b, 0xcd1b, 0xcd1b, 0xcd1a, 0xcd1a, + 0xcd19, 0xcd19, 0xcd19, 0xcd18, 0xcd18, 0xcd17, 0xcd17, 0xcd17, + 0xcd16, 0xcd16, 0xcd15, 0xcd15, 0xcd15, 0xcd14, 0xcd14, 0xcd13, + 0xcd13, 0xcd13, 0xcd12, 0xcd12, 0xcd11, 0xcd11, 0xcd11, 0xcd10, + 0xcd10, 0xcd0f, 0xcd0f, 0xcd0f, 0xcd0e, 0xcd0e, 0xcd0d, 0xcd0d, + 0xcd0d, 0xcd0c, 0xcd0c, 0xcd0c, 0xcd0b, 0xcd0b, 0xcd0a, 0xcd0a, + 0xcd0a, 0xcd09, 0xcd09, 0xcd08, 0xcd08, 0xcd08, 0xcd07, 0xcd07, + 0xcd06, 0xcd06, 0xcd06, 0xcd05, 0xcd05, 0xcd05, 0xcd04, 0xcd04, + 0xcd03, 0xcd03, 0xcd03, 0xcd02, 0xcd02, 0xcd01, 0xcd01, 0xcd01, + 0xcd00, 0xcd00, 0xcd00, 0xccff, 0xccff, 0xccfe, 0xccfe, 0xccfe, + 0xccfd, 0xccfd, 0xccfd, 0xccfc, 0xccfc, 0xccfb, 0xccfb, 0xccfb, + 0xccfa, 0xccfa, 0xccfa, 0xccf9, 0xccf9, 0xccf8, 0xccf8, 0xccf8, + 0xccf7, 0xccf7, 0xccf7, 0xccf6, 0xccf6, 0xccf5, 0xccf5, 0xccf5, + 0xccf4, 0xccf4, 0xccf4, 0xccf3, 0xccf3, 0xccf2, 0xccf2, 0xccf2, + 0xccf1, 0xccf1, 0xccf1, 0xccf0, 0xccf0, 0xccef, 0xccef, 0xccef, + 0xccee, 0xccee, 0xccee, 0xcced, 0xcced, 0xcced, 0xccec, 0xccec, + 0xcceb, 0xcceb, 0xcceb, 0xccea, 0xccea, 0xccea, 0xcce9, 0xcce9, + 0xcce9, 0xcce8, 0xcce8, 0xcce7, 0xcce7, 0xcce7, 0xcce6, 0xcce6, + 0xcce6, 0xcce5, 0xcce5, 0xcce5, 0xcce4, 0xcce4, 0xcce3, 0xcce3, + 0xcce3, 0xcce2, 0xcce2, 0xcce2, 0xcce1, 0xcce1, 0xcce1, 0xcce0, + 0xcce0, 0xcce0, 0xccdf, 0xccdf, 0xccde, 0xccde, 0xccde, 0xccdd, + 0xccdd, 0xccdd, 0xccdc, 0xccdc, 0xccdc, 0xccdb, 0xccdb, 0xccdb, + 0xccda, 0xccda, 0xccd9, 0xccd9, 0xccd9, 0xccd8, 0xccd8, 0xccd8, + 0xccd7, 0xccd7, 0xccd7, 0xccd6, 0xccd6, 0xccd6, 0xccd5, 0xccd5, + 0xccd5, 0xccd4, 0xccd4, 0xccd3, 0xccd3, 0xccd3, 0xccd2, 0xccd2, + 0xccd2, 0xccd1, 0xccd1, 0xccd1, 0xccd0, 0xccd0, 0xccd0, 0xcccf, + 0xcccf, 0xcccf, 0xccce, 0xccce, 0xccce, 0xcccd, 0xcccd, 0xcccd, + 0xcccc, 0xcccc, 0xcccc, 0xcccb, 0xcccb, 0xcccb, 0xccca, 0xccca, + 0xccc9, 0xccc9, 0xccc9, 0xccc8, 0xccc8, 0xccc8, 0xccc7, 0xccc7, + 0xccc7, 0xccc6, 0xccc6, 0xccc6, 0xccc5, 0xccc5, 0xccc5, 0xccc4, + 0xccc4, 0xccc4, 0xccc3, 0xccc3, 0xccc3, 0xccc2, 0xccc2, 0xccc2, + 0xccc1, 0xccc1, 0xccc1, 0xccc0, 0xccc0, 0xccc0, 0xccbf, 0xccbf, + 0xccbf, 0xccbe, 0xccbe, 0xccbe, 0xccbd, 0xccbd, 0xccbd, 0xccbc, + 0xccbc, 0xccbc, 0xccbb, 0xccbb, 0xccbb, 0xccba, 0xccba, 0xccba, + 0xccb9, 0xccb9, 0xccb9, 0xccb8, 0xccb8, 0xccb8, 0xccb7, 0xccb7, + 0xccb7, 0xccb6, 0xccb6, 0xccb6, 0xccb5, 0xccb5, 0xccb5, 0xccb4, + 0xccb4, 0xccb4, 0xccb3, 0xccb3, 0xccb3, 0xccb2, 0xccb2, 0xccb2, + 0xccb1, 0xccb1, 0xccb1, 0xccb0, 0xccb0, 0xccb0, 0xccaf, 0xccaf, + 0xccaf, 0xccae, 0xccae, 0xccae, 0xccae, 0xccad, 0xccad, 0xccad, + 0xccac, 0xccac, 0xccac, 0xccab, 0xccab, 0xccab, 0xccaa, 0xccaa, + 0xccaa, 0xcca9, 0xcca9, 0xcca9, 0xcca8, 0xcca8, 0xcca8, 0xcca7, + 0xcca7, 0xcca7, 0xcca6, 0xcca6, 0xcca6, 0xcca5, 0xcca5, 0xcca5, + 0xcca5, 0xcca4, 0xcca4, 0xcca4, 0xcca3, 0xcca3, 0xcca3, 0xcca2, + 0xcca2, 0xcca2, 0xcca1, 0xcca1, 0xcca1, 0xcca0, 0xcca0, 0xcca0, + 0xcc9f, 0xcc9f, 0xcc9f, 0xcc9e, 0xcc9e, 0xcc9e, 0xcc9e, 0xcc9d, + 0xcc9d, 0xcc9d, 0xcc9c, 0xcc9c, 0xcc9c, 0xcc9b, 0xcc9b, 0xcc9b, + 0xcc9a, 0xcc9a, 0xcc9a, 0xcc99, 0xcc99, 0xcc99, 0xcc99, 0xcc98, + 0xcc98, 0xcc98, 0xcc97, 0xcc97, 0xcc97, 0xcc96, 0xcc96, 0xcc96, + 0xcc95, 0xcc95, 0xcc95, 0xcc95, 0xcc94, 0xcc94, 0xcc94, 0xcc93, + 0xcc93, 0xcc93, 0xcc92, 0xcc92, 0xcc92, 0xcc91, 0xcc91, 0xcc91, + 0xcc91, 0xcc90, 0xcc90, 0xcc90, 0xcc8f, 0xcc8f, 0xcc8f, 0xcc8e, + 0xcc8e, 0xcc8e, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8d, 0xcc8c, 0xcc8c, + 0xcc8c, 0xcc8b, 0xcc8b, 0xcc8b, 0xcc8a, 0xcc8a, 0xcc8a, 0xcc8a, + 0xcc89, 0xcc89, 0xcc89, 0xcc88, 0xcc88, 0xcc88, 0xcc87, 0xcc87, + 0xcc87, 0xcc87, 0xcc86, 0xcc86, 0xcc86, 0xcc85, 0xcc85, 0xcc85, + 0xcc84, 0xcc84, 0xcc84, 0xcc84, 0xcc83, 0xcc83, 0xcc83, 0xcc82, + 0xcc82, 0xcc82, 0xcc81, 0xcc81, 0xcc81, 0xcc81, 0xcc80, 0xcc80, + 0xcc80, 0xcc7f, 0xcc7f, 0xcc7f, 0xcc7e, 0xcc7e, 0xcc7e, 0xcc7e, + 0xcc7d, 0xcc7d, 0xcc7d, 0xcc7c, 0xcc7c, 0xcc7c, 0xcc7c, 0xcc7b, + 0xcc7b, 0xcc7b, 0xcc7a, 0xcc7a, 0xcc7a, 0xcc79, 0xcc79, 0xcc79, + 0xcc79, 0xcc78, 0xcc78, 0xcc78, 0xcc77, 0xcc77, 0xcc77, 0xcc77, + 0xcc76, 0xcc76, 0xcc76, 0xcc75, 0xcc75, 0xcc75, 0xcc75, 0xcc74, + 0xcc74, 0xcc74, 0xcc73, 0xcc73, 0xcc73, 0xcc72, 0xcc72, 0xcc72, + 0xcc72, 0xcc71, 0xcc71, 0xcc71, 0xcc70, 0xcc70, 0xcc70, 0xcc70, + 0xcc6f, 0xcc6f, 0xcc6f, 0xcc6e, 0xcc6e, 0xcc6e, 0xcc6e, 0xcc6d, + 0xcc6d, 0xcc6d, 0xcc6c, 0xcc6c, 0xcc6c, 0xcc6c, 0xcc6b, 0xcc6b, + 0xcc6b, 0xcc6a, 0xcc6a, 0xcc6a, 0xcc6a, 0xcc69, 0xcc69, 0xcc69, + 0xcc68, 0xcc68, 0xcc68, 0xcc68, 0xcc67, 0xcc67, 0xcc67, 0xcc67, + 0xcc66, 0xcc66, 0xcc66, 0xcc65, 0xcc65, 0xcc65, 0xcc65, 0xcc64, + 0xcc64, 0xcc64, 0xcc63, 0xcc63, 0xcc63, 0xcc63, 0xcc62, 0xcc62, + 0xcc62, 0xcc61, 0xcc61, 0xcc61, 0xcc61, 0xcc60, 0xcc60, 0xcc60, + 0xcc60, 0xcc5f, 0xcc5f, 0xcc5f, 0xcc5e, 0xcc5e, 0xcc5e, 0xcc5e, + 0xcc5d, 0xcc5d, 0xcc5d, 0xcc5c, 0xcc5c, 0xcc5c, 0xcc5c, 0xcc5b, + 0xcc5b, 0xcc5b, 0xcc5b, 0xcc5a, 0xcc5a, 0xcc5a, 0xcc59, 0xcc59, + 0xcc59, 0xcc59, 0xcc58, 0xcc58, 0xcc58, 0xcc58, 0xcc57, 0xcc57, + 0xcc57, 0xcc56, 0xcc56, 0xcc56, 0xcc56, 0xcc55, 0xcc55, 0xcc55, + 0xcc54, 0xcc54, 0xcc54, 0xcc54, 0xcc53, 0xcc53, 0xcc53, 0xcc53, + 0xcc52, 0xcc52, 0xcc52, 0xcc52, 0xcc51, 0xcc51, 0xcc51, 0xcc50, + 0xcc50, 0xcc50, 0xcc50, 0xcc4f, 0xcc4f, 0xcc4f, 0xcc4f, 0xcc4e, + 0xcc4e, 0xcc4e, 0xcc4d, 0xcc4d, 0xcc4d, 0xcc4d, 0xcc4c, 0xcc4c, + 0xcc4c, 0xcc4c, 0xcc4b, 0xcc4b, 0xcc4b, 0xcc4b, 0xcc4a, 0xcc4a, + 0xcc4a, 0xcc49, 0xcc49, 0xcc49, 0xcc49, 0xcc48, 0xcc48, 0xcc48, + 0xcc48, 0xcc47, 0xcc47, 0xcc47, 0xcc47, 0xcc46, 0xcc46, 0xcc46, + 0xcc45, 0xcc45, 0xcc45, 0xcc45, 0xcc44, 0xcc44, 0xcc44, 0xcc44, + 0xcc43, 0xcc43, 0xcc43, 0xcc43, 0xcc42, 0xcc42, 0xcc42, 0xcc42, + 0xcc41, 0xcc41, 0xcc41, 0xcc40, 0xcc40, 0xcc40, 0xcc40, 0xcc3f, + 0xcc3f, 0xcc3f, 0xcc3f, 0xcc3e, 0xcc3e, 0xcc3e, 0xcc3e, 0xcc3d, + 0xcc3d, 0xcc3d, 0xcc3d, 0xcc3c, 0xcc3c, 0xcc3c, 0xcc3c, 0xcc3b, + 0xcc3b, 0xcc3b, 0xcc3a, 0xcc3a, 0xcc3a, 0xcc3a, 0xcc39, 0xcc39, + 0xcc39, 0xcc39, 0xcc38, 0xcc38, 0xcc38, 0xcc38, 0xcc37, 0xcc37, + 0xcc37, 0xcc37, 0xcc36, 0xcc36, 0xcc36, 0xcc36, 0xcc35, 0xcc35, + 0xcc35, 0xcc35, 0xcc34, 0xcc34, 0xcc34, 0xcc34, 0xcc33, 0xcc33, + 0xcc33, 0xcc33, 0xcc32, 0xcc32, 0xcc32, 0xcc31, 0xcc31, 0xcc31, + 0xcc31, 0xcc30, 0xcc30, 0xcc30, 0xcc30, 0xcc2f, 0xcc2f, 0xcc2f, + 0xcc2f, 0xcc2e, 0xcc2e, 0xcc2e, 0xcc2e, 0xcc2d, 0xcc2d, 0xcc2d, + 0xcc2d, 0xcc2c, 0xcc2c, 0xcc2c, 0xcc2c, 0xcc2b, 0xcc2b, 0xcc2b, + 0xcc2b, 0xcc2a, 0xcc2a, 0xcc2a, 0xcc2a, 0xcc29, 0xcc29, 0xcc29, + 0xcc29, 0xcc28, 0xcc28, 0xcc27, 0xcc27, 0xcc26, 0xcc26, 0xcc25, + 0xcc25, 0xcc24, 0xcc24, 0xcc23, 0xcc23, 0xcc22, 0xcc22, 0xcc21, + 0xcc21, 0xcc20, 0xcc20, 0xcc1f, 0xcc1f, 0xcc1e, 0xcc1e, 0xcc1d, + 0xcc1d, 0xcc1c, 0xcc1c, 0xcc1b, 0xcc1b, 0xcc1a, 0xcc1a, 0xcc19, + 0xcc19, 0xcc18, 0xcc18, 0xcc17, 0xcc17, 0xcc17, 0xcc16, 0xcc16, + 0xcc15, 0xcc15, 0xcc14, 0xcc14, 0xcc13, 0xcc13, 0xcc12, 0xcc12, + 0xcc11, 0xcc11, 0xcc10, 0xcc10, 0xcc0f, 0xcc0f, 0xcc0e, 0xcc0e, + 0xcc0d, 0xcc0d, 0xcc0c, 0xcc0c, 0xcc0c, 0xcc0b, 0xcc0b, 0xcc0a, + 0xcc0a, 0xcc09, 0xcc09, 0xcc08, 0xcc08, 0xcc07, 0xcc07, 0xcc06, + 0xcc06, 0xcc05, 0xcc05, 0xcc04, 0xcc04, 0xcc04, 0xcc03, 0xcc03, + 0xcc02, 0xcc02, 0xcc01, 0xcc01, 0xcc00, 0xcc00, 0xcbff, 0xcbfe, + 0xcbfd, 0xcbfc, 0xcbfb, 0xcbfa, 0xcbf9, 0xcbf8, 0xcbf7, 0xcbf6, + 0xcbf6, 0xcbf5, 0xcbf4, 0xcbf3, 0xcbf2, 0xcbf1, 0xcbf0, 0xcbef, + 0xcbee, 0xcbed, 0xcbec, 0xcbec, 0xcbeb, 0xcbea, 0xcbe9, 0xcbe8, + 0xcbe7, 0xcbe6, 0xcbe5, 0xcbe4, 0xcbe3, 0xcbe3, 0xcbe2, 0xcbe1, + 0xcbe0, 0xcbdf, 0xcbde, 0xcbdd, 0xcbdc, 0xcbdb, 0xcbdb, 0xcbda, + 0xcbd9, 0xcbd8, 0xcbd7, 0xcbd6, 0xcbd5, 0xcbd4, 0xcbd3, 0xcbd3, + 0xcbd2, 0xcbd1, 0xcbd0, 0xcbcf, 0xcbce, 0xcbcd, 0xcbcc, 0xcbcb, + 0xcbcb, 0xcbca, 0xcbc9, 0xcbc8, 0xcbc7, 0xcbc6, 0xcbc5, 0xcbc4, + 0xcbc4, 0xcbc3, 0xcbc2, 0xcbc1, 0xcbc0, 0xcbbf, 0xcbbe, 0xcbbe, + 0xcbbd, 0xcbbc, 0xcbbb, 0xcbba, 0xcbb9, 0xcbb8, 0xcbb8, 0xcbb7, + 0xcbb6, 0xcbb5, 0xcbb4, 0xcbb3, 0xcbb2, 0xcbb1, 0xcbb1, 0xcbb0, + 0xcbaf, 0xcbae, 0xcbad, 0xcbac, 0xcbac, 0xcbab, 0xcbaa, 0xcba9, + 0xcba8, 0xcba7, 0xcba6, 0xcba6, 0xcba5, 0xcba4, 0xcba3, 0xcba2, + 0xcba1, 0xcba1, 0xcba0, 0xcb9f, 0xcb9e, 0xcb9d, 0xcb9c, 0xcb9b, + 0xcb9b, 0xcb9a, 0xcb99, 0xcb98, 0xcb97, 0xcb96, 0xcb96, 0xcb95, + 0xcb94, 0xcb93, 0xcb92, 0xcb91, 0xcb91, 0xcb90, 0xcb8f, 0xcb8e, + 0xcb8d, 0xcb8d, 0xcb8c, 0xcb8b, 0xcb8a, 0xcb89, 0xcb88, 0xcb88, + 0xcb87, 0xcb86, 0xcb85, 0xcb84, 0xcb83, 0xcb83, 0xcb82, 0xcb81, + 0xcb80, 0xcb7f, 0xcb7f, 0xcb7e, 0xcb7d, 0xcb7c, 0xcb7b, 0xcb7b, + 0xcb7a, 0xcb79, 0xcb78, 0xcb77, 0xcb76, 0xcb76, 0xcb75, 0xcb74, + 0xcb73, 0xcb72, 0xcb72, 0xcb71, 0xcb70, 0xcb6f, 0xcb6e, 0xcb6e, + 0xcb6d, 0xcb6c, 0xcb6b, 0xcb6a, 0xcb6a, 0xcb69, 0xcb68, 0xcb67, + 0xcb66, 0xcb66, 0xcb65, 0xcb64, 0xcb63, 0xcb63, 0xcb62, 0xcb61, + 0xcb60, 0xcb5f, 0xcb5f, 0xcb5e, 0xcb5d, 0xcb5c, 0xcb5b, 0xcb5b, + 0xcb5a, 0xcb59, 0xcb58, 0xcb57, 0xcb57, 0xcb56, 0xcb55, 0xcb54, + 0xcb54, 0xcb53, 0xcb52, 0xcb51, 0xcb50, 0xcb50, 0xcb4f, 0xcb4e, + 0xcb4d, 0xcb4d, 0xcb4c, 0xcb4b, 0xcb4a, 0xcb49, 0xcb49, 0xcb48, + 0xcb47, 0xcb46, 0xcb46, 0xcb45, 0xcb44, 0xcb43, 0xcb43, 0xcb42, + 0xcb41, 0xcb40, 0xcb3f, 0xcb3f, 0xcb3e, 0xcb3d, 0xcb3c, 0xcb3c, + 0xcb3b, 0xcb3a, 0xcb39, 0xcb39, 0xcb38, 0xcb37, 0xcb36, 0xcb36, + 0xcb35, 0xcb34, 0xcb33, 0xcb33, 0xcb32, 0xcb31, 0xcb30, 0xcb30, + 0xcb2f, 0xcb2e, 0xcb2d, 0xcb2d, 0xcb2c, 0xcb2b, 0xcb2a, 0xcb2a, + 0xcb29, 0xcb28, 0xcb27, 0xcb27, 0xcb26, 0xcb25, 0xcb24, 0xcb24, + 0xcb23, 0xcb22, 0xcb21, 0xcb21, 0xcb20, 0xcb1f, 0xcb1e, 0xcb1e, + 0xcb1d, 0xcb1c, 0xcb1b, 0xcb1b, 0xcb1a, 0xcb19, 0xcb18, 0xcb18, + 0xcb17, 0xcb16, 0xcb15, 0xcb15, 0xcb14, 0xcb13, 0xcb13, 0xcb12, + 0xcb11, 0xcb10, 0xcb10, 0xcb0f, 0xcb0e, 0xcb0d, 0xcb0d, 0xcb0c, + 0xcb0b, 0xcb0b, 0xcb0a, 0xcb09, 0xcb08, 0xcb08, 0xcb07, 0xcb06, + 0xcb05, 0xcb05, 0xcb04, 0xcb03, 0xcb03, 0xcb02, 0xcb01, 0xcb00, + 0xcb00, 0xcaff, 0xcafe, 0xcafe, 0xcafd, 0xcafc, 0xcafb, 0xcafb, + 0xcafa, 0xcaf9, 0xcaf9, 0xcaf8, 0xcaf7, 0xcaf6, 0xcaf6, 0xcaf5, + 0xcaf4, 0xcaf4, 0xcaf3, 0xcaf2, 0xcaf1, 0xcaf1, 0xcaf0, 0xcaef, + 0xcaef, 0xcaee, 0xcaed, 0xcaec, 0xcaec, 0xcaeb, 0xcaea, 0xcaea, + 0xcae9, 0xcae8, 0xcae8, 0xcae7, 0xcae6, 0xcae5, 0xcae5, 0xcae4, + 0xcae3, 0xcae3, 0xcae2, 0xcae1, 0xcae1, 0xcae0, 0xcadf, 0xcade, + 0xcade, 0xcadd, 0xcadc, 0xcadc, 0xcadb, 0xcada, 0xcada, 0xcad9, + 0xcad8, 0xcad7, 0xcad7, 0xcad6, 0xcad5, 0xcad5, 0xcad4, 0xcad3, + 0xcad3, 0xcad2, 0xcad1, 0xcad1, 0xcad0, 0xcacf, 0xcacf, 0xcace, + 0xcacd, 0xcacc, 0xcacc, 0xcacb, 0xcaca, 0xcaca, 0xcac9, 0xcac8, + 0xcac8, 0xcac7, 0xcac6, 0xcac6, 0xcac5, 0xcac4, 0xcac4, 0xcac3, + 0xcac2, 0xcac2, 0xcac1, 0xcac0, 0xcac0, 0xcabf, 0xcabe, 0xcabe, + 0xcabd, 0xcabc, 0xcabc, 0xcabb, 0xcaba, 0xcaba, 0xcab9, 0xcab8, + 0xcab7, 0xcab7, 0xcab6, 0xcab5, 0xcab5, 0xcab4, 0xcab3, 0xcab3, + 0xcab2, 0xcab1, 0xcab1, 0xcab0, 0xcaaf, 0xcaaf, 0xcaae, 0xcaad, + 0xcaad, 0xcaac, 0xcaac, 0xcaab, 0xcaaa, 0xcaaa, 0xcaa9, 0xcaa8, + 0xcaa8, 0xcaa7, 0xcaa6, 0xcaa6, 0xcaa5, 0xcaa4, 0xcaa4, 0xcaa3, + 0xcaa2, 0xcaa2, 0xcaa1, 0xcaa0, 0xcaa0, 0xca9f, 0xca9e, 0xca9e, + 0xca9d, 0xca9c, 0xca9c, 0xca9b, 0xca9a, 0xca9a, 0xca99, 0xca98, + 0xca98, 0xca97, 0xca97, 0xca96, 0xca95, 0xca95, 0xca94, 0xca93, + 0xca93, 0xca92, 0xca91, 0xca91, 0xca90, 0xca8f, 0xca8f, 0xca8e, + 0xca8d, 0xca8d, 0xca8c, 0xca8c, 0xca8b, 0xca8a, 0xca8a, 0xca89, + 0xca88, 0xca88, 0xca87, 0xca86, 0xca86, 0xca85, 0xca85, 0xca84, + 0xca83, 0xca83, 0xca82, 0xca81, 0xca81, 0xca80, 0xca7f, 0xca7f, + 0xca7e, 0xca7e, 0xca7d, 0xca7c, 0xca7c, 0xca7b, 0xca7a, 0xca7a, + 0xca79, 0xca78, 0xca78, 0xca77, 0xca77, 0xca76, 0xca75, 0xca75, + 0xca74, 0xca73, 0xca73, 0xca72, 0xca72, 0xca71, 0xca70, 0xca70, + 0xca6f, 0xca6e, 0xca6e, 0xca6d, 0xca6d, 0xca6c, 0xca6b, 0xca6b, + 0xca6a, 0xca69, 0xca69, 0xca68, 0xca68, 0xca67, 0xca66, 0xca66, + 0xca65, 0xca65, 0xca64, 0xca63, 0xca63, 0xca62, 0xca61, 0xca61, + 0xca60, 0xca60, 0xca5f, 0xca5e, 0xca5e, 0xca5d, 0xca5d, 0xca5c, + 0xca5b, 0xca5b, 0xca5a, 0xca59, 0xca59, 0xca58, 0xca58, 0xca57, + 0xca56, 0xca56, 0xca55, 0xca55, 0xca54, 0xca53, 0xca53, 0xca52, + 0xca52, 0xca51, 0xca50, 0xca50, 0xca4f, 0xca4e, 0xca4e, 0xca4d, + 0xca4d, 0xca4c, 0xca4b, 0xca4b, 0xca4a, 0xca4a, 0xca49, 0xca48, + 0xca48, 0xca47, 0xca47, 0xca46, 0xca45, 0xca45, 0xca44, 0xca44, + 0xca43, 0xca42, 0xca42, 0xca41, 0xca41, 0xca40, 0xca3f, 0xca3f, + 0xca3e, 0xca3e, 0xca3d, 0xca3d, 0xca3c, 0xca3b, 0xca3b, 0xca3a, + 0xca3a, 0xca39, 0xca38, 0xca38, 0xca37, 0xca37, 0xca36, 0xca35, + 0xca35, 0xca34, 0xca34, 0xca33, 0xca32, 0xca32, 0xca31, 0xca31, + 0xca30, 0xca30, 0xca2f, 0xca2e, 0xca2e, 0xca2d, 0xca2d, 0xca2c, + 0xca2b, 0xca2b, 0xca2a, 0xca2a, 0xca29, 0xca28, 0xca28, 0xca27, + 0xca27, 0xca26, 0xca26, 0xca25, 0xca24, 0xca24, 0xca23, 0xca23, + 0xca22, 0xca22, 0xca21, 0xca20, 0xca20, 0xca1f, 0xca1f, 0xca1e, + 0xca1d, 0xca1d, 0xca1c, 0xca1c, 0xca1b, 0xca1b, 0xca1a, 0xca19, + 0xca19, 0xca18, 0xca18, 0xca17, 0xca17, 0xca16, 0xca15, 0xca15, + 0xca14, 0xca14, 0xca13, 0xca13, 0xca12, 0xca11, 0xca11, 0xca10, + 0xca10, 0xca0f, 0xca0f, 0xca0e, 0xca0d, 0xca0d, 0xca0c, 0xca0c, + 0xca0b, 0xca0b, 0xca0a, 0xca0a, 0xca09, 0xca08, 0xca08, 0xca07, + 0xca07, 0xca06, 0xca06, 0xca05, 0xca04, 0xca04, 0xca03, 0xca03, + 0xca02, 0xca02, 0xca01, 0xca00, 0xca00, 0xc9ff, 0xc9ff, 0xc9fe, + 0xc9fe, 0xc9fd, 0xc9fd, 0xc9fc, 0xc9fb, 0xc9fb, 0xc9fa, 0xc9fa, + 0xc9f9, 0xc9f9, 0xc9f8, 0xc9f8, 0xc9f7, 0xc9f6, 0xc9f6, 0xc9f5, + 0xc9f5, 0xc9f4, 0xc9f4, 0xc9f3, 0xc9f3, 0xc9f2, 0xc9f1, 0xc9f1, + 0xc9f0, 0xc9f0, 0xc9ef, 0xc9ef, 0xc9ee, 0xc9ee, 0xc9ed, 0xc9ed, + 0xc9ec, 0xc9eb, 0xc9eb, 0xc9ea, 0xc9ea, 0xc9e9, 0xc9e9, 0xc9e8, + 0xc9e8, 0xc9e7, 0xc9e6, 0xc9e6, 0xc9e5, 0xc9e5, 0xc9e4, 0xc9e4, + 0xc9e3, 0xc9e3, 0xc9e2, 0xc9e2, 0xc9e1, 0xc9e0, 0xc9e0, 0xc9df, + 0xc9df, 0xc9de, 0xc9de, 0xc9dd, 0xc9dd, 0xc9dc, 0xc9dc, 0xc9db, + 0xc9db, 0xc9da, 0xc9d9, 0xc9d9, 0xc9d8, 0xc9d8, 0xc9d7, 0xc9d7, + 0xc9d6, 0xc9d6, 0xc9d5, 0xc9d5, 0xc9d4, 0xc9d4, 0xc9d3, 0xc9d2, + 0xc9d2, 0xc9d1, 0xc9d1, 0xc9d0, 0xc9d0, 0xc9cf, 0xc9cf, 0xc9ce, + 0xc9ce, 0xc9cd, 0xc9cd, 0xc9cc, 0xc9cc, 0xc9cb, 0xc9ca, 0xc9ca, + 0xc9c9, 0xc9c9, 0xc9c8, 0xc9c8, 0xc9c7, 0xc9c7, 0xc9c6, 0xc9c6, + 0xc9c5, 0xc9c5, 0xc9c4, 0xc9c4, 0xc9c3, 0xc9c3, 0xc9c2, 0xc9c1, + 0xc9c1, 0xc9c0, 0xc9c0, 0xc9bf, 0xc9bf, 0xc9be, 0xc9be, 0xc9bd, + 0xc9bd, 0xc9bc, 0xc9bc, 0xc9bb, 0xc9bb, 0xc9ba, 0xc9ba, 0xc9b9, + 0xc9b9, 0xc9b8, 0xc9b7, 0xc9b7, 0xc9b6, 0xc9b6, 0xc9b5, 0xc9b5, + 0xc9b4, 0xc9b4, 0xc9b3, 0xc9b3, 0xc9b2, 0xc9b2, 0xc9b1, 0xc9b1, + 0xc9b0, 0xc9b0, 0xc9af, 0xc9af, 0xc9ae, 0xc9ae, 0xc9ad, 0xc9ad, + 0xc9ac, 0xc9ac, 0xc9ab, 0xc9ab, 0xc9aa, 0xc9a9, 0xc9a9, 0xc9a8, + 0xc9a8, 0xc9a7, 0xc9a7, 0xc9a6, 0xc9a6, 0xc9a5, 0xc9a5, 0xc9a4, + 0xc9a4, 0xc9a3, 0xc9a3, 0xc9a2, 0xc9a2, 0xc9a1, 0xc9a1, 0xc9a0, + 0xc9a0, 0xc99f, 0xc99f, 0xc99e, 0xc99e, 0xc99d, 0xc99d, 0xc99c, + 0xc99c, 0xc99b, 0xc99b, 0xc99a, 0xc99a, 0xc999, 0xc999, 0xc998, + 0xc998, 0xc997, 0xc997, 0xc996, 0xc996, 0xc995, 0xc995, 0xc994, + 0xc994, 0xc993, 0xc993, 0xc992, 0xc992, 0xc991, 0xc991, 0xc990, + 0xc990, 0xc98f, 0xc98f, 0xc98e, 0xc98e, 0xc98d, 0xc98d, 0xc98c, + 0xc98c, 0xc98b, 0xc98a, 0xc989, 0xc988, 0xc987, 0xc986, 0xc985, + 0xc984, 0xc983, 0xc982, 0xc981, 0xc980, 0xc97f, 0xc97e, 0xc97d, + 0xc97c, 0xc97b, 0xc97a, 0xc979, 0xc978, 0xc977, 0xc976, 0xc975, + 0xc974, 0xc973, 0xc972, 0xc971, 0xc970, 0xc96f, 0xc96e, 0xc96d, + 0xc96c, 0xc96b, 0xc96a, 0xc969, 0xc968, 0xc967, 0xc966, 0xc965, + 0xc964, 0xc963, 0xc962, 0xc961, 0xc960, 0xc960, 0xc95f, 0xc95e, + 0xc95d, 0xc95c, 0xc95b, 0xc95a, 0xc959, 0xc958, 0xc957, 0xc956, + 0xc955, 0xc954, 0xc953, 0xc952, 0xc951, 0xc950, 0xc94f, 0xc94e, + 0xc94d, 0xc94d, 0xc94c, 0xc94b, 0xc94a, 0xc949, 0xc948, 0xc947, + 0xc946, 0xc945, 0xc944, 0xc943, 0xc942, 0xc941, 0xc940, 0xc93f, + 0xc93f, 0xc93e, 0xc93d, 0xc93c, 0xc93b, 0xc93a, 0xc939, 0xc938, + 0xc937, 0xc936, 0xc935, 0xc934, 0xc933, 0xc933, 0xc932, 0xc931, + 0xc930, 0xc92f, 0xc92e, 0xc92d, 0xc92c, 0xc92b, 0xc92a, 0xc929, + 0xc929, 0xc928, 0xc927, 0xc926, 0xc925, 0xc924, 0xc923, 0xc922, + 0xc921, 0xc920, 0xc91f, 0xc91f, 0xc91e, 0xc91d, 0xc91c, 0xc91b, + 0xc91a, 0xc919, 0xc918, 0xc917, 0xc917, 0xc916, 0xc915, 0xc914, + 0xc913, 0xc912, 0xc911, 0xc910, 0xc90f, 0xc90f, 0xc90e, 0xc90d, + 0xc90c, 0xc90b, 0xc90a, 0xc909, 0xc908, 0xc907, 0xc907, 0xc906, + 0xc905, 0xc904, 0xc903, 0xc902, 0xc901, 0xc900, 0xc900, 0xc8ff, + 0xc8fe, 0xc8fd, 0xc8fc, 0xc8fb, 0xc8fa, 0xc8f9, 0xc8f9, 0xc8f8, + 0xc8f7, 0xc8f6, 0xc8f5, 0xc8f4, 0xc8f3, 0xc8f3, 0xc8f2, 0xc8f1, + 0xc8f0, 0xc8ef, 0xc8ee, 0xc8ed, 0xc8ed, 0xc8ec, 0xc8eb, 0xc8ea, + 0xc8e9, 0xc8e8, 0xc8e7, 0xc8e7, 0xc8e6, 0xc8e5, 0xc8e4, 0xc8e3, + 0xc8e2, 0xc8e2, 0xc8e1, 0xc8e0, 0xc8df, 0xc8de, 0xc8dd, 0xc8dc, + 0xc8dc, 0xc8db, 0xc8da, 0xc8d9, 0xc8d8, 0xc8d7, 0xc8d7, 0xc8d6, + 0xc8d5, 0xc8d4, 0xc8d3, 0xc8d2, 0xc8d2, 0xc8d1, 0xc8d0, 0xc8cf, + 0xc8ce, 0xc8cd, 0xc8cd, 0xc8cc, 0xc8cb, 0xc8ca, 0xc8c9, 0xc8c8, + 0xc8c8, 0xc8c7, 0xc8c6, 0xc8c5, 0xc8c4, 0xc8c3, 0xc8c3, 0xc8c2, + 0xc8c1, 0xc8c0, 0xc8bf, 0xc8bf, 0xc8be, 0xc8bd, 0xc8bc, 0xc8bb, + 0xc8ba, 0xc8ba, 0xc8b9, 0xc8b8, 0xc8b7, 0xc8b6, 0xc8b6, 0xc8b5, + 0xc8b4, 0xc8b3, 0xc8b2, 0xc8b2, 0xc8b1, 0xc8b0, 0xc8af, 0xc8ae, + 0xc8ad, 0xc8ad, 0xc8ac, 0xc8ab, 0xc8aa, 0xc8a9, 0xc8a9, 0xc8a8, + 0xc8a7, 0xc8a6, 0xc8a5, 0xc8a5, 0xc8a4, 0xc8a3, 0xc8a2, 0xc8a1, + 0xc8a1, 0xc8a0, 0xc89f, 0xc89e, 0xc89e, 0xc89d, 0xc89c, 0xc89b, + 0xc89a, 0xc89a, 0xc899, 0xc898, 0xc897, 0xc896, 0xc896, 0xc895, + 0xc894, 0xc893, 0xc892, 0xc892, 0xc891, 0xc890, 0xc88f, 0xc88f, + 0xc88e, 0xc88d, 0xc88c, 0xc88b, 0xc88b, 0xc88a, 0xc889, 0xc888, + 0xc888, 0xc887, 0xc886, 0xc885, 0xc884, 0xc884, 0xc883, 0xc882, + 0xc881, 0xc881, 0xc880, 0xc87f, 0xc87e, 0xc87e, 0xc87d, 0xc87c, + 0xc87b, 0xc87a, 0xc87a, 0xc879, 0xc878, 0xc877, 0xc877, 0xc876, + 0xc875, 0xc874, 0xc874, 0xc873, 0xc872, 0xc871, 0xc871, 0xc870, + 0xc86f, 0xc86e, 0xc86e, 0xc86d, 0xc86c, 0xc86b, 0xc86a, 0xc86a, + 0xc869, 0xc868, 0xc867, 0xc867, 0xc866, 0xc865, 0xc864, 0xc864, + 0xc863, 0xc862, 0xc861, 0xc861, 0xc860, 0xc85f, 0xc85e, 0xc85e, + 0xc85d, 0xc85c, 0xc85c, 0xc85b, 0xc85a, 0xc859, 0xc859, 0xc858, + 0xc857, 0xc856, 0xc856, 0xc855, 0xc854, 0xc853, 0xc853, 0xc852, + 0xc851, 0xc850, 0xc850, 0xc84f, 0xc84e, 0xc84e, 0xc84d, 0xc84c, + 0xc84b, 0xc84b, 0xc84a, 0xc849, 0xc848, 0xc848, 0xc847, 0xc846, + 0xc845, 0xc845, 0xc844, 0xc843, 0xc843, 0xc842, 0xc841, 0xc840, + 0xc840, 0xc83f, 0xc83e, 0xc83d, 0xc83d, 0xc83c, 0xc83b, 0xc83b, + 0xc83a, 0xc839, 0xc838, 0xc838, 0xc837, 0xc836, 0xc836, 0xc835, + 0xc834, 0xc833, 0xc833, 0xc832, 0xc831, 0xc831, 0xc830, 0xc82f, + 0xc82e, 0xc82e, 0xc82d, 0xc82c, 0xc82c, 0xc82b, 0xc82a, 0xc829, + 0xc829, 0xc828, 0xc827, 0xc827, 0xc826, 0xc825, 0xc825, 0xc824, + 0xc823, 0xc822, 0xc822, 0xc821, 0xc820, 0xc820, 0xc81f, 0xc81e, + 0xc81e, 0xc81d, 0xc81c, 0xc81b, 0xc81b, 0xc81a, 0xc819, 0xc819, + 0xc818, 0xc817, 0xc817, 0xc816, 0xc815, 0xc814, 0xc814, 0xc813, + 0xc812, 0xc812, 0xc811, 0xc810, 0xc810, 0xc80f, 0xc80e, 0xc80e, + 0xc80d, 0xc80c, 0xc80c, 0xc80b, 0xc80a, 0xc809, 0xc809, 0xc808, + 0xc807, 0xc807, 0xc806, 0xc805, 0xc805, 0xc804, 0xc803, 0xc803, + 0xc802, 0xc801, 0xc801, 0xc800, 0xc7fe, 0xc7fd, 0xc7fc, 0xc7fa, + 0xc7f9, 0xc7f8, 0xc7f6, 0xc7f5, 0xc7f4, 0xc7f2, 0xc7f1, 0xc7f0, + 0xc7ee, 0xc7ed, 0xc7eb, 0xc7ea, 0xc7e9, 0xc7e7, 0xc7e6, 0xc7e5, + 0xc7e3, 0xc7e2, 0xc7e1, 0xc7df, 0xc7de, 0xc7dd, 0xc7db, 0xc7da, + 0xc7d9, 0xc7d7, 0xc7d6, 0xc7d5, 0xc7d3, 0xc7d2, 0xc7d1, 0xc7cf, + 0xc7ce, 0xc7cd, 0xc7cb, 0xc7ca, 0xc7c9, 0xc7c7, 0xc7c6, 0xc7c5, + 0xc7c4, 0xc7c2, 0xc7c1, 0xc7c0, 0xc7be, 0xc7bd, 0xc7bc, 0xc7ba, + 0xc7b9, 0xc7b8, 0xc7b6, 0xc7b5, 0xc7b4, 0xc7b2, 0xc7b1, 0xc7b0, + 0xc7af, 0xc7ad, 0xc7ac, 0xc7ab, 0xc7a9, 0xc7a8, 0xc7a7, 0xc7a5, + 0xc7a4, 0xc7a3, 0xc7a1, 0xc7a0, 0xc79f, 0xc79e, 0xc79c, 0xc79b, + 0xc79a, 0xc798, 0xc797, 0xc796, 0xc795, 0xc793, 0xc792, 0xc791, + 0xc78f, 0xc78e, 0xc78d, 0xc78c, 0xc78a, 0xc789, 0xc788, 0xc786, + 0xc785, 0xc784, 0xc783, 0xc781, 0xc780, 0xc77f, 0xc77d, 0xc77c, + 0xc77b, 0xc77a, 0xc778, 0xc777, 0xc776, 0xc775, 0xc773, 0xc772, + 0xc771, 0xc76f, 0xc76e, 0xc76d, 0xc76c, 0xc76a, 0xc769, 0xc768, + 0xc767, 0xc765, 0xc764, 0xc763, 0xc762, 0xc760, 0xc75f, 0xc75e, + 0xc75d, 0xc75b, 0xc75a, 0xc759, 0xc758, 0xc756, 0xc755, 0xc754, + 0xc753, 0xc751, 0xc750, 0xc74f, 0xc74e, 0xc74c, 0xc74b, 0xc74a, + 0xc749, 0xc747, 0xc746, 0xc745, 0xc744, 0xc742, 0xc741, 0xc740, + 0xc73f, 0xc73d, 0xc73c, 0xc73b, 0xc73a, 0xc739, 0xc737, 0xc736, + 0xc735, 0xc734, 0xc732, 0xc731, 0xc730, 0xc72f, 0xc72d, 0xc72c, + 0xc72b, 0xc72a, 0xc729, 0xc727, 0xc726, 0xc725, 0xc724, 0xc722, + 0xc721, 0xc720, 0xc71f, 0xc71e, 0xc71c, 0xc71b, 0xc71a, 0xc719, + 0xc717, 0xc716, 0xc715, 0xc714, 0xc713, 0xc711, 0xc710, 0xc70f, + 0xc70e, 0xc70d, 0xc70b, 0xc70a, 0xc709, 0xc708, 0xc707, 0xc705, + 0xc704, 0xc703, 0xc702, 0xc701, 0xc6ff, 0xc6fe, 0xc6fd, 0xc6fc, + 0xc6fb, 0xc6f9, 0xc6f8, 0xc6f7, 0xc6f6, 0xc6f5, 0xc6f3, 0xc6f2, + 0xc6f1, 0xc6f0, 0xc6ef, 0xc6ed, 0xc6ec, 0xc6eb, 0xc6ea, 0xc6e9, + 0xc6e8, 0xc6e6, 0xc6e5, 0xc6e4, 0xc6e3, 0xc6e2, 0xc6e0, 0xc6df, + 0xc6de, 0xc6dd, 0xc6dc, 0xc6db, 0xc6d9, 0xc6d8, 0xc6d7, 0xc6d6, + 0xc6d5, 0xc6d3, 0xc6d2, 0xc6d1, 0xc6d0, 0xc6cf, 0xc6ce, 0xc6cc, + 0xc6cb, 0xc6ca, 0xc6c9, 0xc6c8, 0xc6c7, 0xc6c5, 0xc6c4, 0xc6c3, + 0xc6c2, 0xc6c1, 0xc6c0, 0xc6be, 0xc6bd, 0xc6bc, 0xc6bb, 0xc6ba, + 0xc6b9, 0xc6b7, 0xc6b6, 0xc6b5, 0xc6b4, 0xc6b3, 0xc6b2, 0xc6b1, + 0xc6af, 0xc6ae, 0xc6ad, 0xc6ac, 0xc6ab, 0xc6aa, 0xc6a8, 0xc6a7, + 0xc6a6, 0xc6a5, 0xc6a4, 0xc6a3, 0xc6a2, 0xc6a0, 0xc69f, 0xc69e, + 0xc69d, 0xc69c, 0xc69b, 0xc69a, 0xc698, 0xc697, 0xc696, 0xc695, + 0xc694, 0xc693, 0xc692, 0xc691, 0xc68f, 0xc68e, 0xc68d, 0xc68c, + 0xc68b, 0xc68a, 0xc689, 0xc687, 0xc686, 0xc685, 0xc684, 0xc683, + 0xc682, 0xc681, 0xc680, 0xc67e, 0xc67d, 0xc67c, 0xc67b, 0xc67a, + 0xc679, 0xc678, 0xc677, 0xc675, 0xc674, 0xc673, 0xc672, 0xc671, + 0xc670, 0xc66f, 0xc66e, 0xc66c, 0xc66b, 0xc66a, 0xc669, 0xc668, + 0xc667, 0xc666, 0xc665, 0xc664, 0xc662, 0xc661, 0xc660, 0xc65f, + 0xc65e, 0xc65d, 0xc65c, 0xc65b, 0xc65a, 0xc658, 0xc657, 0xc656, + 0xc655, 0xc654, 0xc653, 0xc652, 0xc651, 0xc650, 0xc64f, 0xc64d, + 0xc64c, 0xc64b, 0xc64a, 0xc649, 0xc648, 0xc647, 0xc646, 0xc645, + 0xc644, 0xc642, 0xc641, 0xc640, 0xc63f, 0xc63e, 0xc63d, 0xc63c, + 0xc63b, 0xc63a, 0xc639, 0xc638, 0xc637, 0xc635, 0xc634, 0xc633, + 0xc632, 0xc631, 0xc630, 0xc62f, 0xc62e, 0xc62d, 0xc62c, 0xc62b, + 0xc62a, 0xc628, 0xc627, 0xc626, 0xc625, 0xc624, 0xc623, 0xc622, + 0xc621, 0xc620, 0xc61f, 0xc61e, 0xc61d, 0xc61c, 0xc61a, 0xc619, + 0xc618, 0xc617, 0xc616, 0xc615, 0xc614, 0xc613, 0xc612, 0xc611, + 0xc610, 0xc60f, 0xc60e, 0xc60d, 0xc60b, 0xc60a, 0xc609, 0xc608, + 0xc607, 0xc606, 0xc605, 0xc604, 0xc603, 0xc602, 0xc601, 0xc600, + 0xc5ff, 0xc5fe, 0xc5fd, 0xc5fc, 0xc5fb, 0xc5f9, 0xc5f8, 0xc5f7, + 0xc5f6, 0xc5f5, 0xc5f4, 0xc5f3, 0xc5f2, 0xc5f1, 0xc5f0, 0xc5ef, + 0xc5ee, 0xc5ed, 0xc5ec, 0xc5eb, 0xc5ea, 0xc5e9, 0xc5e8, 0xc5e7, + 0xc5e6, 0xc5e4, 0xc5e3, 0xc5e2, 0xc5e1, 0xc5e0, 0xc5df, 0xc5de, + 0xc5dd, 0xc5dc, 0xc5db, 0xc5da, 0xc5d9, 0xc5d8, 0xc5d7, 0xc5d6, + 0xc5d5, 0xc5d4, 0xc5d3, 0xc5d2, 0xc5d1, 0xc5d0, 0xc5cf, 0xc5ce, + 0xc5cd, 0xc5cc, 0xc5cb, 0xc5c9, 0xc5c8, 0xc5c7, 0xc5c6, 0xc5c5, + 0xc5c4, 0xc5c3, 0xc5c2, 0xc5c1, 0xc5c0, 0xc5bf, 0xc5be, 0xc5bd, + 0xc5bc, 0xc5bb, 0xc5ba, 0xc5b9, 0xc5b8, 0xc5b7, 0xc5b6, 0xc5b5, + 0xc5b4, 0xc5b3, 0xc5b2, 0xc5b1, 0xc5b0, 0xc5af, 0xc5ae, 0xc5ad, + 0xc5ac, 0xc5ab, 0xc5aa, 0xc5a9, 0xc5a8, 0xc5a7, 0xc5a6, 0xc5a5, + 0xc5a4, 0xc5a3, 0xc5a2, 0xc5a1, 0xc5a0, 0xc59f, 0xc59e, 0xc59d, + 0xc59c, 0xc59b, 0xc59a, 0xc599, 0xc598, 0xc597, 0xc596, 0xc595, + 0xc594, 0xc593, 0xc592, 0xc591, 0xc590, 0xc58f, 0xc58e, 0xc58d, + 0xc58c, 0xc58a, 0xc588, 0xc586, 0xc584, 0xc582, 0xc580, 0xc57e, + 0xc57c, 0xc57a, 0xc578, 0xc576, 0xc574, 0xc572, 0xc570, 0xc56e, + 0xc56c, 0xc56a, 0xc568, 0xc566, 0xc564, 0xc562, 0xc560, 0xc55e, + 0xc55c, 0xc55a, 0xc558, 0xc556, 0xc554, 0xc552, 0xc550, 0xc54e, + 0xc54d, 0xc54b, 0xc549, 0xc547, 0xc545, 0xc543, 0xc541, 0xc53f, + 0xc53d, 0xc53b, 0xc539, 0xc537, 0xc535, 0xc533, 0xc532, 0xc530, + 0xc52e, 0xc52c, 0xc52a, 0xc528, 0xc526, 0xc524, 0xc522, 0xc520, + 0xc51f, 0xc51d, 0xc51b, 0xc519, 0xc517, 0xc515, 0xc513, 0xc511, + 0xc50f, 0xc50e, 0xc50c, 0xc50a, 0xc508, 0xc506, 0xc504, 0xc502, + 0xc500, 0xc4ff, 0xc4fd, 0xc4fb, 0xc4f9, 0xc4f7, 0xc4f5, 0xc4f3, + 0xc4f2, 0xc4f0, 0xc4ee, 0xc4ec, 0xc4ea, 0xc4e8, 0xc4e6, 0xc4e5, + 0xc4e3, 0xc4e1, 0xc4df, 0xc4dd, 0xc4db, 0xc4da, 0xc4d8, 0xc4d6, + 0xc4d4, 0xc4d2, 0xc4d0, 0xc4cf, 0xc4cd, 0xc4cb, 0xc4c9, 0xc4c7, + 0xc4c5, 0xc4c4, 0xc4c2, 0xc4c0, 0xc4be, 0xc4bc, 0xc4bb, 0xc4b9, + 0xc4b7, 0xc4b5, 0xc4b3, 0xc4b2, 0xc4b0, 0xc4ae, 0xc4ac, 0xc4aa, + 0xc4a9, 0xc4a7, 0xc4a5, 0xc4a3, 0xc4a1, 0xc4a0, 0xc49e, 0xc49c, + 0xc49a, 0xc499, 0xc497, 0xc495, 0xc493, 0xc491, 0xc490, 0xc48e, + 0xc48c, 0xc48a, 0xc489, 0xc487, 0xc485, 0xc483, 0xc482, 0xc480, + 0xc47e, 0xc47c, 0xc47b, 0xc479, 0xc477, 0xc475, 0xc474, 0xc472, + 0xc470, 0xc46e, 0xc46d, 0xc46b, 0xc469, 0xc467, 0xc466, 0xc464, + 0xc462, 0xc461, 0xc45f, 0xc45d, 0xc45b, 0xc45a, 0xc458, 0xc456, + 0xc454, 0xc453, 0xc451, 0xc44f, 0xc44e, 0xc44c, 0xc44a, 0xc448, + 0xc447, 0xc445, 0xc443, 0xc442, 0xc440, 0xc43e, 0xc43d, 0xc43b, + 0xc439, 0xc437, 0xc436, 0xc434, 0xc432, 0xc431, 0xc42f, 0xc42d, + 0xc42c, 0xc42a, 0xc428, 0xc427, 0xc425, 0xc423, 0xc422, 0xc420, + 0xc41e, 0xc41d, 0xc41b, 0xc419, 0xc418, 0xc416, 0xc414, 0xc413, + 0xc411, 0xc40f, 0xc40e, 0xc40c, 0xc40a, 0xc409, 0xc407, 0xc405, + 0xc404, 0xc402, 0xc400, 0xc3fd, 0xc3fa, 0xc3f7, 0xc3f3, 0xc3f0, + 0xc3ed, 0xc3ea, 0xc3e6, 0xc3e3, 0xc3e0, 0xc3dc, 0xc3d9, 0xc3d6, + 0xc3d3, 0xc3cf, 0xc3cc, 0xc3c9, 0xc3c6, 0xc3c2, 0xc3bf, 0xc3bc, + 0xc3b9, 0xc3b5, 0xc3b2, 0xc3af, 0xc3ac, 0xc3a8, 0xc3a5, 0xc3a2, + 0xc39f, 0xc39c, 0xc398, 0xc395, 0xc392, 0xc38f, 0xc38c, 0xc388, + 0xc385, 0xc382, 0xc37f, 0xc37c, 0xc378, 0xc375, 0xc372, 0xc36f, + 0xc36c, 0xc368, 0xc365, 0xc362, 0xc35f, 0xc35c, 0xc359, 0xc355, + 0xc352, 0xc34f, 0xc34c, 0xc349, 0xc346, 0xc342, 0xc33f, 0xc33c, + 0xc339, 0xc336, 0xc333, 0xc330, 0xc32d, 0xc329, 0xc326, 0xc323, + 0xc320, 0xc31d, 0xc31a, 0xc317, 0xc314, 0xc310, 0xc30d, 0xc30a, + 0xc307, 0xc304, 0xc301, 0xc2fe, 0xc2fb, 0xc2f8, 0xc2f5, 0xc2f1, + 0xc2ee, 0xc2eb, 0xc2e8, 0xc2e5, 0xc2e2, 0xc2df, 0xc2dc, 0xc2d9, + 0xc2d6, 0xc2d3, 0xc2d0, 0xc2cd, 0xc2c9, 0xc2c6, 0xc2c3, 0xc2c0, + 0xc2bd, 0xc2ba, 0xc2b7, 0xc2b4, 0xc2b1, 0xc2ae, 0xc2ab, 0xc2a8, + 0xc2a5, 0xc2a2, 0xc29f, 0xc29c, 0xc299, 0xc296, 0xc293, 0xc290, + 0xc28d, 0xc28a, 0xc287, 0xc284, 0xc281, 0xc27e, 0xc27b, 0xc278, + 0xc275, 0xc272, 0xc26f, 0xc26c, 0xc269, 0xc266, 0xc263, 0xc260, + 0xc25d, 0xc25a, 0xc257, 0xc254, 0xc251, 0xc24e, 0xc24b, 0xc248, + 0xc245, 0xc242, 0xc23f, 0xc23c, 0xc239, 0xc236, 0xc233, 0xc230, + 0xc22e, 0xc22b, 0xc228, 0xc225, 0xc222, 0xc21f, 0xc21c, 0xc219, + 0xc216, 0xc213, 0xc210, 0xc20d, 0xc20a, 0xc207, 0xc205, 0xc202, + 0xc1ff, 0xc1fc, 0xc1f9, 0xc1f6, 0xc1f3, 0xc1f0, 0xc1ed, 0xc1ea, + 0xc1e8, 0xc1e5, 0xc1e2, 0xc1df, 0xc1dc, 0xc1d9, 0xc1d6, 0xc1d3, + 0xc1d0, 0xc1ce, 0xc1cb, 0xc1c8, 0xc1c5, 0xc1c2, 0xc1bf, 0xc1bc, + 0xc1ba, 0xc1b7, 0xc1b4, 0xc1b1, 0xc1ae, 0xc1ab, 0xc1a8, 0xc1a6, + 0xc1a3, 0xc1a0, 0xc19d, 0xc19a, 0xc197, 0xc194, 0xc192, 0xc18f, + 0xc18c, 0xc189, 0xc186, 0xc184, 0xc181, 0xc17e, 0xc17b, 0xc178, + 0xc175, 0xc173, 0xc170, 0xc16d, 0xc16a, 0xc167, 0xc165, 0xc162, + 0xc15f, 0xc15c, 0xc159, 0xc157, 0xc154, 0xc151, 0xc14e, 0xc14b, + 0xc149, 0xc146, 0xc143, 0xc140, 0xc13e, 0xc13b, 0xc138, 0xc135, + 0xc132, 0xc130, 0xc12d, 0xc12a, 0xc127, 0xc125, 0xc122, 0xc11f, + 0xc11c, 0xc11a, 0xc117, 0xc114, 0xc111, 0xc10f, 0xc10c, 0xc109, + 0xc106, 0xc104, 0xc101, 0xc0fe, 0xc0fb, 0xc0f9, 0xc0f6, 0xc0f3, + 0xc0f1, 0xc0ee, 0xc0eb, 0xc0e8, 0xc0e6, 0xc0e3, 0xc0e0, 0xc0de, + 0xc0db, 0xc0d8, 0xc0d5, 0xc0d3, 0xc0d0, 0xc0cd, 0xc0cb, 0xc0c8, + 0xc0c5, 0xc0c3, 0xc0c0, 0xc0bd, 0xc0ba, 0xc0b8, 0xc0b5, 0xc0b2, + 0xc0b0, 0xc0ad, 0xc0aa, 0xc0a8, 0xc0a5, 0xc0a2, 0xc0a0, 0xc09d, + 0xc09a, 0xc098, 0xc095, 0xc092, 0xc090, 0xc08d, 0xc08a, 0xc088, + 0xc085, 0xc082, 0xc080, 0xc07d, 0xc07a, 0xc078, 0xc075, 0xc073, + 0xc070, 0xc06d, 0xc06b, 0xc068, 0xc065, 0xc063, 0xc060, 0xc05d, + 0xc05b, 0xc058, 0xc056, 0xc053, 0xc050, 0xc04e, 0xc04b, 0xc049, + 0xc046, 0xc043, 0xc041, 0xc03e, 0xc03b, 0xc039, 0xc036, 0xc034, + 0xc031, 0xc02e, 0xc02c, 0xc029, 0xc027, 0xc024, 0xc021, 0xc01f, + 0xc01c, 0xc01a, 0xc017, 0xc015, 0xc012, 0xc00f, 0xc00d, 0xc00a, + 0xc008, 0xc005, 0xc003, 0xc000, 0xbffb, 0xbff6, 0xbff1, 0xbfeb, + 0xbfe6, 0xbfe1, 0xbfdc, 0xbfd7, 0xbfd2, 0xbfcd, 0xbfc8, 0xbfc3, + 0xbfbd, 0xbfb8, 0xbfb3, 0xbfae, 0xbfa9, 0xbfa4, 0xbf9f, 0xbf9a, + 0xbf95, 0xbf90, 0xbf8b, 0xbf86, 0xbf81, 0xbf7b, 0xbf76, 0xbf71, + 0xbf6c, 0xbf67, 0xbf62, 0xbf5d, 0xbf58, 0xbf53, 0xbf4e, 0xbf49, + 0xbf44, 0xbf3f, 0xbf3a, 0xbf35, 0xbf30, 0xbf2b, 0xbf26, 0xbf21, + 0xbf1c, 0xbf17, 0xbf12, 0xbf0d, 0xbf08, 0xbf03, 0xbefe, 0xbef9, + 0xbef4, 0xbeef, 0xbeea, 0xbee5, 0xbee0, 0xbedb, 0xbed6, 0xbed1, + 0xbecc, 0xbec8, 0xbec3, 0xbebe, 0xbeb9, 0xbeb4, 0xbeaf, 0xbeaa, + 0xbea5, 0xbea0, 0xbe9b, 0xbe96, 0xbe91, 0xbe8c, 0xbe87, 0xbe83, + 0xbe7e, 0xbe79, 0xbe74, 0xbe6f, 0xbe6a, 0xbe65, 0xbe60, 0xbe5b, + 0xbe57, 0xbe52, 0xbe4d, 0xbe48, 0xbe43, 0xbe3e, 0xbe39, 0xbe35, + 0xbe30, 0xbe2b, 0xbe26, 0xbe21, 0xbe1c, 0xbe17, 0xbe13, 0xbe0e, + 0xbe09, 0xbe04, 0xbdff, 0xbdfa, 0xbdf6, 0xbdf1, 0xbdec, 0xbde7, + 0xbde2, 0xbdde, 0xbdd9, 0xbdd4, 0xbdcf, 0xbdca, 0xbdc6, 0xbdc1, + 0xbdbc, 0xbdb7, 0xbdb2, 0xbdae, 0xbda9, 0xbda4, 0xbd9f, 0xbd9b, + 0xbd96, 0xbd91, 0xbd8c, 0xbd88, 0xbd83, 0xbd7e, 0xbd79, 0xbd75, + 0xbd70, 0xbd6b, 0xbd66, 0xbd62, 0xbd5d, 0xbd58, 0xbd53, 0xbd4f, + 0xbd4a, 0xbd45, 0xbd41, 0xbd3c, 0xbd37, 0xbd32, 0xbd2e, 0xbd29, + 0xbd24, 0xbd20, 0xbd1b, 0xbd16, 0xbd12, 0xbd0d, 0xbd08, 0xbd03, + 0xbcff, 0xbcfa, 0xbcf5, 0xbcf1, 0xbcec, 0xbce7, 0xbce3, 0xbcde, + 0xbcd9, 0xbcd5, 0xbcd0, 0xbccc, 0xbcc7, 0xbcc2, 0xbcbe, 0xbcb9, + 0xbcb4, 0xbcb0, 0xbcab, 0xbca6, 0xbca2, 0xbc9d, 0xbc99, 0xbc94, + 0xbc8f, 0xbc8b, 0xbc86, 0xbc82, 0xbc7d, 0xbc78, 0xbc74, 0xbc6f, + 0xbc6b, 0xbc66, 0xbc61, 0xbc5d, 0xbc58, 0xbc54, 0xbc4f, 0xbc4a, + 0xbc46, 0xbc41, 0xbc3d, 0xbc38, 0xbc34, 0xbc2f, 0xbc2b, 0xbc26, + 0xbc21, 0xbc1d, 0xbc18, 0xbc14, 0xbc0f, 0xbc0b, 0xbc06, 0xbc02, + 0xbbfa, 0xbbf1, 0xbbe8, 0xbbdf, 0xbbd6, 0xbbcd, 0xbbc4, 0xbbbb, + 0xbbb2, 0xbba9, 0xbba0, 0xbb97, 0xbb8e, 0xbb85, 0xbb7c, 0xbb73, + 0xbb6a, 0xbb61, 0xbb58, 0xbb4f, 0xbb46, 0xbb3d, 0xbb34, 0xbb2b, + 0xbb22, 0xbb19, 0xbb10, 0xbb07, 0xbafe, 0xbaf5, 0xbaed, 0xbae4, + 0xbadb, 0xbad2, 0xbac9, 0xbac0, 0xbab7, 0xbaae, 0xbaa5, 0xba9c, + 0xba94, 0xba8b, 0xba82, 0xba79, 0xba70, 0xba67, 0xba5f, 0xba56, + 0xba4d, 0xba44, 0xba3b, 0xba32, 0xba2a, 0xba21, 0xba18, 0xba0f, + 0xba06, 0xb9fe, 0xb9f5, 0xb9ec, 0xb9e3, 0xb9da, 0xb9d2, 0xb9c9, + 0xb9c0, 0xb9b7, 0xb9af, 0xb9a6, 0xb99d, 0xb995, 0xb98c, 0xb983, + 0xb97a, 0xb972, 0xb969, 0xb960, 0xb958, 0xb94f, 0xb946, 0xb93d, + 0xb935, 0xb92c, 0xb923, 0xb91b, 0xb912, 0xb909, 0xb901, 0xb8f8, + 0xb8ef, 0xb8e7, 0xb8de, 0xb8d6, 0xb8cd, 0xb8c4, 0xb8bc, 0xb8b3, + 0xb8ab, 0xb8a2, 0xb899, 0xb891, 0xb888, 0xb880, 0xb877, 0xb86e, + 0xb866, 0xb85d, 0xb855, 0xb84c, 0xb844, 0xb83b, 0xb832, 0xb82a, + 0xb821, 0xb819, 0xb810, 0xb808, 0xb7ff, 0xb7ee, 0xb7dd, 0xb7cc, + 0xb7bb, 0xb7aa, 0xb799, 0xb788, 0xb777, 0xb766, 0xb755, 0xb744, + 0xb733, 0xb722, 0xb711, 0xb700, 0xb6ef, 0xb6de, 0xb6cd, 0xb6bd, + 0xb6ac, 0xb69b, 0xb68a, 0xb679, 0xb668, 0xb658, 0xb647, 0xb636, + 0xb625, 0xb614, 0xb604, 0xb5f3, 0xb5e2, 0xb5d1, 0xb5c1, 0xb5b0, + 0xb59f, 0xb58e, 0xb57e, 0xb56d, 0xb55c, 0xb54c, 0xb53b, 0xb52a, + 0xb51a, 0xb509, 0xb4f8, 0xb4e8, 0xb4d7, 0xb4c7, 0xb4b6, 0xb4a5, + 0xb495, 0xb484, 0xb474, 0xb463, 0xb452, 0xb442, 0xb431, 0xb421, + 0xb410, 0xb400, 0xb3df, 0xb3be, 0xb39d, 0xb37c, 0xb35b, 0xb33a, + 0xb319, 0xb2f8, 0xb2d7, 0xb2b6, 0xb295, 0xb275, 0xb254, 0xb233, + 0xb212, 0xb1f2, 0xb1d1, 0xb1b0, 0xb18f, 0xb16f, 0xb14e, 0xb12d, + 0xb10d, 0xb0ec, 0xb0cb, 0xb0ab, 0xb08a, 0xb06a, 0xb049, 0xb029, + 0xb008, 0xafcf, 0xaf8e, 0xaf4d, 0xaf0c, 0xaecb, 0xae8b, 0xae4a, + 0xae09, 0xadc8, 0xad88, 0xad47, 0xad06, 0xacc6, 0xac85, 0xac45, + 0xac04, 0xab87, 0xab06, 0xaa85, 0xaa05, 0xa984, 0xa903, 0xa883, + 0xa802, 0xa703, 0xa602, 0xa502, 0xa401, 0xa201, 0xa001, 0x9c00, + 0x0000, 0x1fff, 0x23fe, 0x25fe, 0x27fc, 0x28fd, 0x29fc, 0x2afa, + 0x2bf8, 0x2c7b, 0x2cfa, 0x2d78, 0x2df7, 0x2e76, 0x2ef4, 0x2f72, + 0x2ff0, 0x3037, 0x3076, 0x30b5, 0x30f4, 0x3132, 0x3171, 0x31b0, + 0x31ee, 0x322d, 0x326b, 0x32aa, 0x32e8, 0x3326, 0x3364, 0x33a3, + 0x33e1, 0x340f, 0x342e, 0x344d, 0x346c, 0x348b, 0x34aa, 0x34c9, + 0x34e8, 0x3506, 0x3525, 0x3544, 0x3563, 0x3581, 0x35a0, 0x35bf, + 0x35dd, 0x35fc, 0x361a, 0x3639, 0x3657, 0x3676, 0x3694, 0x36b2, + 0x36d1, 0x36ef, 0x370d, 0x372c, 0x374a, 0x3768, 0x3786, 0x37a4, + 0x37c3, 0x37e1, 0x37ff, 0x380e, 0x381d, 0x382c, 0x383b, 0x384a, + 0x3859, 0x3868, 0x3877, 0x3886, 0x3895, 0x38a4, 0x38b3, 0x38c2, + 0x38d0, 0x38df, 0x38ee, 0x38fd, 0x390c, 0x391a, 0x3929, 0x3938, + 0x3947, 0x3955, 0x3964, 0x3973, 0x3982, 0x3990, 0x399f, 0x39ae, + 0x39bc, 0x39cb, 0x39d9, 0x39e8, 0x39f7, 0x3a05, 0x3a14, 0x3a22, + 0x3a31, 0x3a3f, 0x3a4e, 0x3a5c, 0x3a6b, 0x3a79, 0x3a88, 0x3a96, + 0x3aa5, 0x3ab3, 0x3ac1, 0x3ad0, 0x3ade, 0x3aed, 0x3afb, 0x3b09, + 0x3b18, 0x3b26, 0x3b34, 0x3b42, 0x3b51, 0x3b5f, 0x3b6d, 0x3b7c, + 0x3b8a, 0x3b98, 0x3ba6, 0x3bb4, 0x3bc3, 0x3bd1, 0x3bdf, 0x3bed, + 0x3bfb, 0x3c05, 0x3c0c, 0x3c13, 0x3c1a, 0x3c21, 0x3c28, 0x3c2f, + 0x3c36, 0x3c3d, 0x3c44, 0x3c4b, 0x3c52, 0x3c59, 0x3c60, 0x3c67, + 0x3c6e, 0x3c75, 0x3c7c, 0x3c83, 0x3c8a, 0x3c91, 0x3c97, 0x3c9e, + 0x3ca5, 0x3cac, 0x3cb3, 0x3cba, 0x3cc1, 0x3cc8, 0x3ccf, 0x3cd6, + 0x3cdc, 0x3ce3, 0x3cea, 0x3cf1, 0x3cf8, 0x3cff, 0x3d06, 0x3d0c, + 0x3d13, 0x3d1a, 0x3d21, 0x3d28, 0x3d2f, 0x3d35, 0x3d3c, 0x3d43, + 0x3d4a, 0x3d51, 0x3d57, 0x3d5e, 0x3d65, 0x3d6c, 0x3d72, 0x3d79, + 0x3d80, 0x3d87, 0x3d8d, 0x3d94, 0x3d9b, 0x3da1, 0x3da8, 0x3daf, + 0x3db6, 0x3dbc, 0x3dc3, 0x3dca, 0x3dd0, 0x3dd7, 0x3dde, 0x3de4, + 0x3deb, 0x3df2, 0x3df8, 0x3dff, 0x3e05, 0x3e0c, 0x3e13, 0x3e19, + 0x3e20, 0x3e27, 0x3e2d, 0x3e34, 0x3e3a, 0x3e41, 0x3e47, 0x3e4e, + 0x3e55, 0x3e5b, 0x3e62, 0x3e68, 0x3e6f, 0x3e75, 0x3e7c, 0x3e82, + 0x3e89, 0x3e8f, 0x3e96, 0x3e9c, 0x3ea3, 0x3ea9, 0x3eb0, 0x3eb6, + 0x3ebd, 0x3ec3, 0x3eca, 0x3ed0, 0x3ed7, 0x3edd, 0x3ee4, 0x3eea, + 0x3ef1, 0x3ef7, 0x3efe, 0x3f04, 0x3f0a, 0x3f11, 0x3f17, 0x3f1e, + 0x3f24, 0x3f2a, 0x3f31, 0x3f37, 0x3f3e, 0x3f44, 0x3f4a, 0x3f51, + 0x3f57, 0x3f5d, 0x3f64, 0x3f6a, 0x3f70, 0x3f77, 0x3f7d, 0x3f83, + 0x3f8a, 0x3f90, 0x3f96, 0x3f9d, 0x3fa3, 0x3fa9, 0x3fb0, 0x3fb6, + 0x3fbc, 0x3fc2, 0x3fc9, 0x3fcf, 0x3fd5, 0x3fdc, 0x3fe2, 0x3fe8, + 0x3fee, 0x3ff5, 0x3ffb, 0x4000, 0x4004, 0x4007, 0x400a, 0x400d, + 0x4010, 0x4013, 0x4016, 0x4019, 0x401c, 0x4020, 0x4023, 0x4026, + 0x4029, 0x402c, 0x402f, 0x4032, 0x4035, 0x4038, 0x403b, 0x403e, + 0x4041, 0x4044, 0x4048, 0x404b, 0x404e, 0x4051, 0x4054, 0x4057, + 0x405a, 0x405d, 0x4060, 0x4063, 0x4066, 0x4069, 0x406c, 0x406f, + 0x4072, 0x4075, 0x4078, 0x407b, 0x407e, 0x4081, 0x4084, 0x4087, + 0x408a, 0x408d, 0x4090, 0x4093, 0x4096, 0x4099, 0x409c, 0x409f, + 0x40a2, 0x40a5, 0x40a8, 0x40ab, 0x40ae, 0x40b1, 0x40b4, 0x40b7, + 0x40ba, 0x40bd, 0x40c0, 0x40c3, 0x40c6, 0x40c9, 0x40cc, 0x40cf, + 0x40d2, 0x40d5, 0x40d8, 0x40db, 0x40de, 0x40e1, 0x40e4, 0x40e7, + 0x40ea, 0x40ed, 0x40ef, 0x40f2, 0x40f5, 0x40f8, 0x40fb, 0x40fe, + 0x4101, 0x4104, 0x4107, 0x410a, 0x410d, 0x4110, 0x4113, 0x4115, + 0x4118, 0x411b, 0x411e, 0x4121, 0x4124, 0x4127, 0x412a, 0x412d, + 0x4130, 0x4132, 0x4135, 0x4138, 0x413b, 0x413e, 0x4141, 0x4144, + 0x4147, 0x414a, 0x414c, 0x414f, 0x4152, 0x4155, 0x4158, 0x415b, + 0x415e, 0x4160, 0x4163, 0x4166, 0x4169, 0x416c, 0x416f, 0x4172, + 0x4174, 0x4177, 0x417a, 0x417d, 0x4180, 0x4183, 0x4185, 0x4188, + 0x418b, 0x418e, 0x4191, 0x4194, 0x4196, 0x4199, 0x419c, 0x419f, + 0x41a2, 0x41a5, 0x41a7, 0x41aa, 0x41ad, 0x41b0, 0x41b3, 0x41b5, + 0x41b8, 0x41bb, 0x41be, 0x41c1, 0x41c3, 0x41c6, 0x41c9, 0x41cc, + 0x41ce, 0x41d1, 0x41d4, 0x41d7, 0x41da, 0x41dc, 0x41df, 0x41e2, + 0x41e5, 0x41e7, 0x41ea, 0x41ed, 0x41f0, 0x41f2, 0x41f5, 0x41f8, + 0x41fb, 0x41fd, 0x4200, 0x4203, 0x4206, 0x4208, 0x420b, 0x420e, + 0x4211, 0x4213, 0x4216, 0x4219, 0x421c, 0x421e, 0x4221, 0x4224, + 0x4227, 0x4229, 0x422c, 0x422f, 0x4231, 0x4234, 0x4237, 0x423a, + 0x423c, 0x423f, 0x4242, 0x4244, 0x4247, 0x424a, 0x424d, 0x424f, + 0x4252, 0x4255, 0x4257, 0x425a, 0x425d, 0x425f, 0x4262, 0x4265, + 0x4267, 0x426a, 0x426d, 0x426f, 0x4272, 0x4275, 0x4277, 0x427a, + 0x427d, 0x427f, 0x4282, 0x4285, 0x4287, 0x428a, 0x428d, 0x428f, + 0x4292, 0x4295, 0x4297, 0x429a, 0x429d, 0x429f, 0x42a2, 0x42a5, + 0x42a7, 0x42aa, 0x42ad, 0x42af, 0x42b2, 0x42b4, 0x42b7, 0x42ba, + 0x42bc, 0x42bf, 0x42c2, 0x42c4, 0x42c7, 0x42c9, 0x42cc, 0x42cf, + 0x42d1, 0x42d4, 0x42d6, 0x42d9, 0x42dc, 0x42de, 0x42e1, 0x42e3, + 0x42e6, 0x42e9, 0x42eb, 0x42ee, 0x42f0, 0x42f3, 0x42f6, 0x42f8, + 0x42fb, 0x42fd, 0x4300, 0x4303, 0x4305, 0x4308, 0x430a, 0x430d, + 0x430f, 0x4312, 0x4315, 0x4317, 0x431a, 0x431c, 0x431f, 0x4321, + 0x4324, 0x4327, 0x4329, 0x432c, 0x432e, 0x4331, 0x4333, 0x4336, + 0x4338, 0x433b, 0x433e, 0x4340, 0x4343, 0x4345, 0x4348, 0x434a, + 0x434d, 0x434f, 0x4352, 0x4354, 0x4357, 0x4359, 0x435c, 0x435e, + 0x4361, 0x4363, 0x4366, 0x4369, 0x436b, 0x436e, 0x4370, 0x4373, + 0x4375, 0x4378, 0x437a, 0x437d, 0x437f, 0x4382, 0x4384, 0x4387, + 0x4389, 0x438c, 0x438e, 0x4391, 0x4393, 0x4396, 0x4398, 0x439b, + 0x439d, 0x43a0, 0x43a2, 0x43a5, 0x43a7, 0x43a9, 0x43ac, 0x43ae, + 0x43b1, 0x43b3, 0x43b6, 0x43b8, 0x43bb, 0x43bd, 0x43c0, 0x43c2, + 0x43c5, 0x43c7, 0x43ca, 0x43cc, 0x43ce, 0x43d1, 0x43d3, 0x43d6, + 0x43d8, 0x43db, 0x43dd, 0x43e0, 0x43e2, 0x43e5, 0x43e7, 0x43e9, + 0x43ec, 0x43ee, 0x43f1, 0x43f3, 0x43f6, 0x43f8, 0x43fa, 0x43fd, + 0x43ff, 0x4401, 0x4402, 0x4403, 0x4404, 0x4406, 0x4407, 0x4408, + 0x4409, 0x440b, 0x440c, 0x440d, 0x440e, 0x440f, 0x4411, 0x4412, + 0x4413, 0x4414, 0x4415, 0x4417, 0x4418, 0x4419, 0x441a, 0x441b, + 0x441d, 0x441e, 0x441f, 0x4420, 0x4421, 0x4423, 0x4424, 0x4425, + 0x4426, 0x4427, 0x4428, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, + 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4436, 0x4437, 0x4438, + 0x4439, 0x443a, 0x443b, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, + 0x4442, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x444a, 0x444b, + 0x444c, 0x444d, 0x444e, 0x444f, 0x4451, 0x4452, 0x4453, 0x4454, + 0x4455, 0x4456, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, + 0x445e, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4467, + 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446f, 0x4470, + 0x4471, 0x4472, 0x4473, 0x4474, 0x4476, 0x4477, 0x4478, 0x4479, + 0x447a, 0x447b, 0x447c, 0x447e, 0x447f, 0x4480, 0x4481, 0x4482, + 0x4483, 0x4484, 0x4485, 0x4487, 0x4488, 0x4489, 0x448a, 0x448b, + 0x448c, 0x448d, 0x448f, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, + 0x4495, 0x4496, 0x4498, 0x4499, 0x449a, 0x449b, 0x449c, 0x449d, + 0x449e, 0x449f, 0x44a1, 0x44a2, 0x44a3, 0x44a4, 0x44a5, 0x44a6, + 0x44a7, 0x44a8, 0x44aa, 0x44ab, 0x44ac, 0x44ad, 0x44ae, 0x44af, + 0x44b0, 0x44b1, 0x44b2, 0x44b4, 0x44b5, 0x44b6, 0x44b7, 0x44b8, + 0x44b9, 0x44ba, 0x44bb, 0x44bc, 0x44be, 0x44bf, 0x44c0, 0x44c1, + 0x44c2, 0x44c3, 0x44c4, 0x44c5, 0x44c6, 0x44c7, 0x44c9, 0x44ca, + 0x44cb, 0x44cc, 0x44cd, 0x44ce, 0x44cf, 0x44d0, 0x44d1, 0x44d2, + 0x44d4, 0x44d5, 0x44d6, 0x44d7, 0x44d8, 0x44d9, 0x44da, 0x44db, + 0x44dc, 0x44dd, 0x44de, 0x44e0, 0x44e1, 0x44e2, 0x44e3, 0x44e4, + 0x44e5, 0x44e6, 0x44e7, 0x44e8, 0x44e9, 0x44ea, 0x44eb, 0x44ed, + 0x44ee, 0x44ef, 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f4, 0x44f5, + 0x44f6, 0x44f7, 0x44f8, 0x44f9, 0x44fb, 0x44fc, 0x44fd, 0x44fe, + 0x44ff, 0x4500, 0x4501, 0x4502, 0x4503, 0x4504, 0x4505, 0x4506, + 0x4507, 0x4508, 0x450a, 0x450b, 0x450c, 0x450d, 0x450e, 0x450f, + 0x4510, 0x4511, 0x4512, 0x4513, 0x4514, 0x4515, 0x4516, 0x4517, + 0x4518, 0x4519, 0x451b, 0x451c, 0x451d, 0x451e, 0x451f, 0x4520, + 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, + 0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x4530, 0x4531, + 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, + 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540, 0x4541, + 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x454a, + 0x454b, 0x454c, 0x454d, 0x454e, 0x454f, 0x4550, 0x4551, 0x4552, + 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455a, + 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560, 0x4561, 0x4562, + 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456a, + 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570, 0x4571, 0x4572, + 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457a, + 0x457c, 0x457d, 0x457e, 0x457f, 0x4580, 0x4581, 0x4582, 0x4583, + 0x4584, 0x4585, 0x4586, 0x4587, 0x4588, 0x4589, 0x458a, 0x458b, + 0x458c, 0x458e, 0x4590, 0x4592, 0x4594, 0x4596, 0x4598, 0x459a, + 0x459c, 0x459d, 0x459f, 0x45a1, 0x45a3, 0x45a5, 0x45a7, 0x45a9, + 0x45ab, 0x45ad, 0x45af, 0x45b1, 0x45b3, 0x45b5, 0x45b7, 0x45b9, + 0x45bb, 0x45bd, 0x45bf, 0x45c1, 0x45c3, 0x45c5, 0x45c7, 0x45c9, + 0x45cb, 0x45cd, 0x45ce, 0x45d0, 0x45d2, 0x45d4, 0x45d6, 0x45d8, + 0x45da, 0x45dc, 0x45de, 0x45e0, 0x45e2, 0x45e4, 0x45e6, 0x45e7, + 0x45e9, 0x45eb, 0x45ed, 0x45ef, 0x45f1, 0x45f3, 0x45f5, 0x45f7, + 0x45f9, 0x45fb, 0x45fc, 0x45fe, 0x4600, 0x4602, 0x4604, 0x4606, + 0x4608, 0x460a, 0x460b, 0x460d, 0x460f, 0x4611, 0x4613, 0x4615, + 0x4617, 0x4619, 0x461a, 0x461c, 0x461e, 0x4620, 0x4622, 0x4624, + 0x4626, 0x4627, 0x4629, 0x462b, 0x462d, 0x462f, 0x4631, 0x4633, + 0x4634, 0x4636, 0x4638, 0x463a, 0x463c, 0x463e, 0x463f, 0x4641, + 0x4643, 0x4645, 0x4647, 0x4649, 0x464a, 0x464c, 0x464e, 0x4650, + 0x4652, 0x4653, 0x4655, 0x4657, 0x4659, 0x465b, 0x465d, 0x465e, + 0x4660, 0x4662, 0x4664, 0x4666, 0x4667, 0x4669, 0x466b, 0x466d, + 0x466f, 0x4670, 0x4672, 0x4674, 0x4676, 0x4677, 0x4679, 0x467b, + 0x467d, 0x467f, 0x4680, 0x4682, 0x4684, 0x4686, 0x4687, 0x4689, + 0x468b, 0x468d, 0x468e, 0x4690, 0x4692, 0x4694, 0x4696, 0x4697, + 0x4699, 0x469b, 0x469d, 0x469e, 0x46a0, 0x46a2, 0x46a4, 0x46a5, + 0x46a7, 0x46a9, 0x46aa, 0x46ac, 0x46ae, 0x46b0, 0x46b1, 0x46b3, + 0x46b5, 0x46b7, 0x46b8, 0x46ba, 0x46bc, 0x46be, 0x46bf, 0x46c1, + 0x46c3, 0x46c4, 0x46c6, 0x46c8, 0x46ca, 0x46cb, 0x46cd, 0x46cf, + 0x46d0, 0x46d2, 0x46d4, 0x46d6, 0x46d7, 0x46d9, 0x46db, 0x46dc, + 0x46de, 0x46e0, 0x46e1, 0x46e3, 0x46e5, 0x46e6, 0x46e8, 0x46ea, + 0x46ec, 0x46ed, 0x46ef, 0x46f1, 0x46f2, 0x46f4, 0x46f6, 0x46f7, + 0x46f9, 0x46fb, 0x46fc, 0x46fe, 0x4700, 0x4701, 0x4703, 0x4705, + 0x4706, 0x4708, 0x470a, 0x470b, 0x470d, 0x470f, 0x4710, 0x4712, + 0x4714, 0x4715, 0x4717, 0x4718, 0x471a, 0x471c, 0x471d, 0x471f, + 0x4721, 0x4722, 0x4724, 0x4726, 0x4727, 0x4729, 0x472b, 0x472c, + 0x472e, 0x472f, 0x4731, 0x4733, 0x4734, 0x4736, 0x4738, 0x4739, + 0x473b, 0x473c, 0x473e, 0x4740, 0x4741, 0x4743, 0x4745, 0x4746, + 0x4748, 0x4749, 0x474b, 0x474d, 0x474e, 0x4750, 0x4751, 0x4753, + 0x4755, 0x4756, 0x4758, 0x4759, 0x475b, 0x475d, 0x475e, 0x4760, + 0x4761, 0x4763, 0x4765, 0x4766, 0x4768, 0x4769, 0x476b, 0x476c, + 0x476e, 0x4770, 0x4771, 0x4773, 0x4774, 0x4776, 0x4777, 0x4779, + 0x477b, 0x477c, 0x477e, 0x477f, 0x4781, 0x4782, 0x4784, 0x4786, + 0x4787, 0x4789, 0x478a, 0x478c, 0x478d, 0x478f, 0x4790, 0x4792, + 0x4794, 0x4795, 0x4797, 0x4798, 0x479a, 0x479b, 0x479d, 0x479e, + 0x47a0, 0x47a2, 0x47a3, 0x47a5, 0x47a6, 0x47a8, 0x47a9, 0x47ab, + 0x47ac, 0x47ae, 0x47af, 0x47b1, 0x47b2, 0x47b4, 0x47b5, 0x47b7, + 0x47b8, 0x47ba, 0x47bc, 0x47bd, 0x47bf, 0x47c0, 0x47c2, 0x47c3, + 0x47c5, 0x47c6, 0x47c8, 0x47c9, 0x47cb, 0x47cc, 0x47ce, 0x47cf, + 0x47d1, 0x47d2, 0x47d4, 0x47d5, 0x47d7, 0x47d8, 0x47da, 0x47db, + 0x47dd, 0x47de, 0x47e0, 0x47e1, 0x47e3, 0x47e4, 0x47e6, 0x47e7, + 0x47e9, 0x47ea, 0x47ec, 0x47ed, 0x47ef, 0x47f0, 0x47f2, 0x47f3, + 0x47f5, 0x47f6, 0x47f8, 0x47f9, 0x47fa, 0x47fc, 0x47fd, 0x47ff, + 0x4800, 0x4801, 0x4802, 0x4802, 0x4803, 0x4804, 0x4805, 0x4805, + 0x4806, 0x4807, 0x4808, 0x4808, 0x4809, 0x480a, 0x480a, 0x480b, + 0x480c, 0x480d, 0x480d, 0x480e, 0x480f, 0x4810, 0x4810, 0x4811, + 0x4812, 0x4812, 0x4813, 0x4814, 0x4815, 0x4815, 0x4816, 0x4817, + 0x4817, 0x4818, 0x4819, 0x481a, 0x481a, 0x481b, 0x481c, 0x481c, + 0x481d, 0x481e, 0x481f, 0x481f, 0x4820, 0x4821, 0x4821, 0x4822, + 0x4823, 0x4824, 0x4824, 0x4825, 0x4826, 0x4826, 0x4827, 0x4828, + 0x4829, 0x4829, 0x482a, 0x482b, 0x482b, 0x482c, 0x482d, 0x482e, + 0x482e, 0x482f, 0x4830, 0x4830, 0x4831, 0x4832, 0x4832, 0x4833, + 0x4834, 0x4835, 0x4835, 0x4836, 0x4837, 0x4837, 0x4838, 0x4839, + 0x4839, 0x483a, 0x483b, 0x483b, 0x483c, 0x483d, 0x483e, 0x483e, + 0x483f, 0x4840, 0x4840, 0x4841, 0x4842, 0x4842, 0x4843, 0x4844, + 0x4844, 0x4845, 0x4846, 0x4847, 0x4847, 0x4848, 0x4849, 0x4849, + 0x484a, 0x484b, 0x484b, 0x484c, 0x484d, 0x484d, 0x484e, 0x484f, + 0x484f, 0x4850, 0x4851, 0x4851, 0x4852, 0x4853, 0x4853, 0x4854, + 0x4855, 0x4856, 0x4856, 0x4857, 0x4858, 0x4858, 0x4859, 0x485a, + 0x485a, 0x485b, 0x485c, 0x485c, 0x485d, 0x485e, 0x485e, 0x485f, + 0x4860, 0x4860, 0x4861, 0x4862, 0x4862, 0x4863, 0x4864, 0x4864, + 0x4865, 0x4866, 0x4866, 0x4867, 0x4868, 0x4868, 0x4869, 0x486a, + 0x486a, 0x486b, 0x486c, 0x486c, 0x486d, 0x486e, 0x486e, 0x486f, + 0x4870, 0x4870, 0x4871, 0x4872, 0x4872, 0x4873, 0x4874, 0x4874, + 0x4875, 0x4876, 0x4876, 0x4877, 0x4877, 0x4878, 0x4879, 0x4879, + 0x487a, 0x487b, 0x487b, 0x487c, 0x487d, 0x487d, 0x487e, 0x487f, + 0x487f, 0x4880, 0x4881, 0x4881, 0x4882, 0x4883, 0x4883, 0x4884, + 0x4884, 0x4885, 0x4886, 0x4886, 0x4887, 0x4888, 0x4888, 0x4889, + 0x488a, 0x488a, 0x488b, 0x488c, 0x488c, 0x488d, 0x488d, 0x488e, + 0x488f, 0x488f, 0x4890, 0x4891, 0x4891, 0x4892, 0x4893, 0x4893, + 0x4894, 0x4895, 0x4895, 0x4896, 0x4896, 0x4897, 0x4898, 0x4898, + 0x4899, 0x489a, 0x489a, 0x489b, 0x489c, 0x489c, 0x489d, 0x489d, + 0x489e, 0x489f, 0x489f, 0x48a0, 0x48a1, 0x48a1, 0x48a2, 0x48a2, + 0x48a3, 0x48a4, 0x48a4, 0x48a5, 0x48a6, 0x48a6, 0x48a7, 0x48a7, + 0x48a8, 0x48a9, 0x48a9, 0x48aa, 0x48ab, 0x48ab, 0x48ac, 0x48ac, + 0x48ad, 0x48ae, 0x48ae, 0x48af, 0x48b0, 0x48b0, 0x48b1, 0x48b1, + 0x48b2, 0x48b3, 0x48b3, 0x48b4, 0x48b4, 0x48b5, 0x48b6, 0x48b6, + 0x48b7, 0x48b8, 0x48b8, 0x48b9, 0x48b9, 0x48ba, 0x48bb, 0x48bb, + 0x48bc, 0x48bc, 0x48bd, 0x48be, 0x48be, 0x48bf, 0x48c0, 0x48c0, + 0x48c1, 0x48c1, 0x48c2, 0x48c3, 0x48c3, 0x48c4, 0x48c4, 0x48c5, + 0x48c6, 0x48c6, 0x48c7, 0x48c7, 0x48c8, 0x48c9, 0x48c9, 0x48ca, + 0x48ca, 0x48cb, 0x48cc, 0x48cc, 0x48cd, 0x48cd, 0x48ce, 0x48cf, + 0x48cf, 0x48d0, 0x48d0, 0x48d1, 0x48d2, 0x48d2, 0x48d3, 0x48d3, + 0x48d4, 0x48d5, 0x48d5, 0x48d6, 0x48d6, 0x48d7, 0x48d8, 0x48d8, + 0x48d9, 0x48d9, 0x48da, 0x48db, 0x48db, 0x48dc, 0x48dc, 0x48dd, + 0x48de, 0x48de, 0x48df, 0x48df, 0x48e0, 0x48e1, 0x48e1, 0x48e2, + 0x48e2, 0x48e3, 0x48e3, 0x48e4, 0x48e5, 0x48e5, 0x48e6, 0x48e6, + 0x48e7, 0x48e8, 0x48e8, 0x48e9, 0x48e9, 0x48ea, 0x48eb, 0x48eb, + 0x48ec, 0x48ec, 0x48ed, 0x48ed, 0x48ee, 0x48ef, 0x48ef, 0x48f0, + 0x48f0, 0x48f1, 0x48f2, 0x48f2, 0x48f3, 0x48f3, 0x48f4, 0x48f4, + 0x48f5, 0x48f6, 0x48f6, 0x48f7, 0x48f7, 0x48f8, 0x48f8, 0x48f9, + 0x48fa, 0x48fa, 0x48fb, 0x48fb, 0x48fc, 0x48fd, 0x48fd, 0x48fe, + 0x48fe, 0x48ff, 0x48ff, 0x4900, 0x4901, 0x4901, 0x4902, 0x4902, + 0x4903, 0x4903, 0x4904, 0x4905, 0x4905, 0x4906, 0x4906, 0x4907, + 0x4907, 0x4908, 0x4909, 0x4909, 0x490a, 0x490a, 0x490b, 0x490b, + 0x490c, 0x490c, 0x490d, 0x490e, 0x490e, 0x490f, 0x490f, 0x4910, + 0x4910, 0x4911, 0x4912, 0x4912, 0x4913, 0x4913, 0x4914, 0x4914, + 0x4915, 0x4916, 0x4916, 0x4917, 0x4917, 0x4918, 0x4918, 0x4919, + 0x4919, 0x491a, 0x491b, 0x491b, 0x491c, 0x491c, 0x491d, 0x491d, + 0x491e, 0x491e, 0x491f, 0x4920, 0x4920, 0x4921, 0x4921, 0x4922, + 0x4922, 0x4923, 0x4923, 0x4924, 0x4925, 0x4925, 0x4926, 0x4926, + 0x4927, 0x4927, 0x4928, 0x4928, 0x4929, 0x492a, 0x492a, 0x492b, + 0x492b, 0x492c, 0x492c, 0x492d, 0x492d, 0x492e, 0x492e, 0x492f, + 0x4930, 0x4930, 0x4931, 0x4931, 0x4932, 0x4932, 0x4933, 0x4933, + 0x4934, 0x4934, 0x4935, 0x4936, 0x4936, 0x4937, 0x4937, 0x4938, + 0x4938, 0x4939, 0x4939, 0x493a, 0x493a, 0x493b, 0x493c, 0x493c, + 0x493d, 0x493d, 0x493e, 0x493e, 0x493f, 0x493f, 0x4940, 0x4940, + 0x4941, 0x4941, 0x4942, 0x4943, 0x4943, 0x4944, 0x4944, 0x4945, + 0x4945, 0x4946, 0x4946, 0x4947, 0x4947, 0x4948, 0x4948, 0x4949, + 0x4949, 0x494a, 0x494b, 0x494b, 0x494c, 0x494c, 0x494d, 0x494d, + 0x494e, 0x494e, 0x494f, 0x494f, 0x4950, 0x4950, 0x4951, 0x4951, + 0x4952, 0x4953, 0x4953, 0x4954, 0x4954, 0x4955, 0x4955, 0x4956, + 0x4956, 0x4957, 0x4957, 0x4958, 0x4958, 0x4959, 0x4959, 0x495a, + 0x495a, 0x495b, 0x495b, 0x495c, 0x495d, 0x495d, 0x495e, 0x495e, + 0x495f, 0x495f, 0x4960, 0x4960, 0x4961, 0x4961, 0x4962, 0x4962, + 0x4963, 0x4963, 0x4964, 0x4964, 0x4965, 0x4965, 0x4966, 0x4966, + 0x4967, 0x4967, 0x4968, 0x4968, 0x4969, 0x496a, 0x496a, 0x496b, + 0x496b, 0x496c, 0x496c, 0x496d, 0x496d, 0x496e, 0x496e, 0x496f, + 0x496f, 0x4970, 0x4970, 0x4971, 0x4971, 0x4972, 0x4972, 0x4973, + 0x4973, 0x4974, 0x4974, 0x4975, 0x4975, 0x4976, 0x4976, 0x4977, + 0x4977, 0x4978, 0x4978, 0x4979, 0x4979, 0x497a, 0x497a, 0x497b, + 0x497b, 0x497c, 0x497c, 0x497d, 0x497d, 0x497e, 0x497e, 0x497f, + 0x497f, 0x4980, 0x4981, 0x4981, 0x4982, 0x4982, 0x4983, 0x4983, + 0x4984, 0x4984, 0x4985, 0x4985, 0x4986, 0x4986, 0x4987, 0x4987, + 0x4988, 0x4988, 0x4989, 0x4989, 0x498a, 0x498a, 0x498b, 0x498b, + 0x498c, 0x498d, 0x498e, 0x498f, 0x4990, 0x4991, 0x4992, 0x4993, + 0x4994, 0x4995, 0x4996, 0x4997, 0x4997, 0x4998, 0x4999, 0x499a, + 0x499b, 0x499c, 0x499d, 0x499e, 0x499f, 0x49a0, 0x49a1, 0x49a2, + 0x49a3, 0x49a4, 0x49a5, 0x49a6, 0x49a7, 0x49a8, 0x49a9, 0x49aa, + 0x49ab, 0x49ac, 0x49ad, 0x49ae, 0x49af, 0x49b0, 0x49b1, 0x49b2, + 0x49b3, 0x49b4, 0x49b5, 0x49b6, 0x49b7, 0x49b8, 0x49b9, 0x49ba, + 0x49ba, 0x49bb, 0x49bc, 0x49bd, 0x49be, 0x49bf, 0x49c0, 0x49c1, + 0x49c2, 0x49c3, 0x49c4, 0x49c5, 0x49c6, 0x49c7, 0x49c8, 0x49c9, + 0x49ca, 0x49cb, 0x49cc, 0x49cc, 0x49cd, 0x49ce, 0x49cf, 0x49d0, + 0x49d1, 0x49d2, 0x49d3, 0x49d4, 0x49d5, 0x49d6, 0x49d7, 0x49d8, + 0x49d9, 0x49da, 0x49da, 0x49db, 0x49dc, 0x49dd, 0x49de, 0x49df, + 0x49e0, 0x49e1, 0x49e2, 0x49e3, 0x49e4, 0x49e5, 0x49e5, 0x49e6, + 0x49e7, 0x49e8, 0x49e9, 0x49ea, 0x49eb, 0x49ec, 0x49ed, 0x49ee, + 0x49ef, 0x49f0, 0x49f0, 0x49f1, 0x49f2, 0x49f3, 0x49f4, 0x49f5, + 0x49f6, 0x49f7, 0x49f8, 0x49f9, 0x49f9, 0x49fa, 0x49fb, 0x49fc, + 0x49fd, 0x49fe, 0x49ff, 0x4a00, 0x4a01, 0x4a02, 0x4a02, 0x4a03, + 0x4a04, 0x4a05, 0x4a06, 0x4a07, 0x4a08, 0x4a09, 0x4a09, 0x4a0a, + 0x4a0b, 0x4a0c, 0x4a0d, 0x4a0e, 0x4a0f, 0x4a10, 0x4a11, 0x4a11, + 0x4a12, 0x4a13, 0x4a14, 0x4a15, 0x4a16, 0x4a17, 0x4a18, 0x4a18, + 0x4a19, 0x4a1a, 0x4a1b, 0x4a1c, 0x4a1d, 0x4a1e, 0x4a1f, 0x4a1f, + 0x4a20, 0x4a21, 0x4a22, 0x4a23, 0x4a24, 0x4a25, 0x4a25, 0x4a26, + 0x4a27, 0x4a28, 0x4a29, 0x4a2a, 0x4a2b, 0x4a2b, 0x4a2c, 0x4a2d, + 0x4a2e, 0x4a2f, 0x4a30, 0x4a31, 0x4a31, 0x4a32, 0x4a33, 0x4a34, + 0x4a35, 0x4a36, 0x4a36, 0x4a37, 0x4a38, 0x4a39, 0x4a3a, 0x4a3b, + 0x4a3c, 0x4a3c, 0x4a3d, 0x4a3e, 0x4a3f, 0x4a40, 0x4a41, 0x4a41, + 0x4a42, 0x4a43, 0x4a44, 0x4a45, 0x4a46, 0x4a46, 0x4a47, 0x4a48, + 0x4a49, 0x4a4a, 0x4a4b, 0x4a4b, 0x4a4c, 0x4a4d, 0x4a4e, 0x4a4f, + 0x4a50, 0x4a50, 0x4a51, 0x4a52, 0x4a53, 0x4a54, 0x4a54, 0x4a55, + 0x4a56, 0x4a57, 0x4a58, 0x4a59, 0x4a59, 0x4a5a, 0x4a5b, 0x4a5c, + 0x4a5d, 0x4a5d, 0x4a5e, 0x4a5f, 0x4a60, 0x4a61, 0x4a62, 0x4a62, + 0x4a63, 0x4a64, 0x4a65, 0x4a66, 0x4a66, 0x4a67, 0x4a68, 0x4a69, + 0x4a6a, 0x4a6a, 0x4a6b, 0x4a6c, 0x4a6d, 0x4a6e, 0x4a6e, 0x4a6f, + 0x4a70, 0x4a71, 0x4a72, 0x4a72, 0x4a73, 0x4a74, 0x4a75, 0x4a76, + 0x4a76, 0x4a77, 0x4a78, 0x4a79, 0x4a7a, 0x4a7a, 0x4a7b, 0x4a7c, + 0x4a7d, 0x4a7e, 0x4a7e, 0x4a7f, 0x4a80, 0x4a81, 0x4a82, 0x4a82, + 0x4a83, 0x4a84, 0x4a85, 0x4a85, 0x4a86, 0x4a87, 0x4a88, 0x4a89, + 0x4a89, 0x4a8a, 0x4a8b, 0x4a8c, 0x4a8c, 0x4a8d, 0x4a8e, 0x4a8f, + 0x4a90, 0x4a90, 0x4a91, 0x4a92, 0x4a93, 0x4a93, 0x4a94, 0x4a95, + 0x4a96, 0x4a97, 0x4a97, 0x4a98, 0x4a99, 0x4a9a, 0x4a9a, 0x4a9b, + 0x4a9c, 0x4a9d, 0x4a9d, 0x4a9e, 0x4a9f, 0x4aa0, 0x4aa1, 0x4aa1, + 0x4aa2, 0x4aa3, 0x4aa4, 0x4aa4, 0x4aa5, 0x4aa6, 0x4aa7, 0x4aa7, + 0x4aa8, 0x4aa9, 0x4aaa, 0x4aaa, 0x4aab, 0x4aac, 0x4aad, 0x4aad, + 0x4aae, 0x4aaf, 0x4ab0, 0x4ab0, 0x4ab1, 0x4ab2, 0x4ab3, 0x4ab3, + 0x4ab4, 0x4ab5, 0x4ab6, 0x4ab6, 0x4ab7, 0x4ab8, 0x4ab9, 0x4ab9, + 0x4aba, 0x4abb, 0x4abc, 0x4abc, 0x4abd, 0x4abe, 0x4abf, 0x4abf, + 0x4ac0, 0x4ac1, 0x4ac2, 0x4ac2, 0x4ac3, 0x4ac4, 0x4ac4, 0x4ac5, + 0x4ac6, 0x4ac7, 0x4ac7, 0x4ac8, 0x4ac9, 0x4aca, 0x4aca, 0x4acb, + 0x4acc, 0x4acd, 0x4acd, 0x4ace, 0x4acf, 0x4acf, 0x4ad0, 0x4ad1, + 0x4ad2, 0x4ad2, 0x4ad3, 0x4ad4, 0x4ad5, 0x4ad5, 0x4ad6, 0x4ad7, + 0x4ad7, 0x4ad8, 0x4ad9, 0x4ada, 0x4ada, 0x4adb, 0x4adc, 0x4add, + 0x4add, 0x4ade, 0x4adf, 0x4adf, 0x4ae0, 0x4ae1, 0x4ae2, 0x4ae2, + 0x4ae3, 0x4ae4, 0x4ae4, 0x4ae5, 0x4ae6, 0x4ae7, 0x4ae7, 0x4ae8, + 0x4ae9, 0x4ae9, 0x4aea, 0x4aeb, 0x4aec, 0x4aec, 0x4aed, 0x4aee, + 0x4aee, 0x4aef, 0x4af0, 0x4af0, 0x4af1, 0x4af2, 0x4af3, 0x4af3, + 0x4af4, 0x4af5, 0x4af5, 0x4af6, 0x4af7, 0x4af7, 0x4af8, 0x4af9, + 0x4afa, 0x4afa, 0x4afb, 0x4afc, 0x4afc, 0x4afd, 0x4afe, 0x4afe, + 0x4aff, 0x4b00, 0x4b01, 0x4b01, 0x4b02, 0x4b03, 0x4b03, 0x4b04, + 0x4b05, 0x4b05, 0x4b06, 0x4b07, 0x4b07, 0x4b08, 0x4b09, 0x4b0a, + 0x4b0a, 0x4b0b, 0x4b0c, 0x4b0c, 0x4b0d, 0x4b0e, 0x4b0e, 0x4b0f, + 0x4b10, 0x4b10, 0x4b11, 0x4b12, 0x4b12, 0x4b13, 0x4b14, 0x4b15, + 0x4b15, 0x4b16, 0x4b17, 0x4b17, 0x4b18, 0x4b19, 0x4b19, 0x4b1a, + 0x4b1b, 0x4b1b, 0x4b1c, 0x4b1d, 0x4b1d, 0x4b1e, 0x4b1f, 0x4b1f, + 0x4b20, 0x4b21, 0x4b21, 0x4b22, 0x4b23, 0x4b23, 0x4b24, 0x4b25, + 0x4b25, 0x4b26, 0x4b27, 0x4b27, 0x4b28, 0x4b29, 0x4b29, 0x4b2a, + 0x4b2b, 0x4b2b, 0x4b2c, 0x4b2d, 0x4b2d, 0x4b2e, 0x4b2f, 0x4b2f, + 0x4b30, 0x4b31, 0x4b31, 0x4b32, 0x4b33, 0x4b33, 0x4b34, 0x4b35, + 0x4b35, 0x4b36, 0x4b37, 0x4b37, 0x4b38, 0x4b39, 0x4b39, 0x4b3a, + 0x4b3b, 0x4b3b, 0x4b3c, 0x4b3d, 0x4b3d, 0x4b3e, 0x4b3f, 0x4b3f, + 0x4b40, 0x4b41, 0x4b41, 0x4b42, 0x4b42, 0x4b43, 0x4b44, 0x4b44, + 0x4b45, 0x4b46, 0x4b46, 0x4b47, 0x4b48, 0x4b48, 0x4b49, 0x4b4a, + 0x4b4a, 0x4b4b, 0x4b4c, 0x4b4c, 0x4b4d, 0x4b4d, 0x4b4e, 0x4b4f, + 0x4b4f, 0x4b50, 0x4b51, 0x4b51, 0x4b52, 0x4b53, 0x4b53, 0x4b54, + 0x4b55, 0x4b55, 0x4b56, 0x4b56, 0x4b57, 0x4b58, 0x4b58, 0x4b59, + 0x4b5a, 0x4b5a, 0x4b5b, 0x4b5c, 0x4b5c, 0x4b5d, 0x4b5d, 0x4b5e, + 0x4b5f, 0x4b5f, 0x4b60, 0x4b61, 0x4b61, 0x4b62, 0x4b63, 0x4b63, + 0x4b64, 0x4b64, 0x4b65, 0x4b66, 0x4b66, 0x4b67, 0x4b68, 0x4b68, + 0x4b69, 0x4b69, 0x4b6a, 0x4b6b, 0x4b6b, 0x4b6c, 0x4b6d, 0x4b6d, + 0x4b6e, 0x4b6e, 0x4b6f, 0x4b70, 0x4b70, 0x4b71, 0x4b72, 0x4b72, + 0x4b73, 0x4b73, 0x4b74, 0x4b75, 0x4b75, 0x4b76, 0x4b77, 0x4b77, + 0x4b78, 0x4b78, 0x4b79, 0x4b7a, 0x4b7a, 0x4b7b, 0x4b7b, 0x4b7c, + 0x4b7d, 0x4b7d, 0x4b7e, 0x4b7f, 0x4b7f, 0x4b80, 0x4b80, 0x4b81, + 0x4b82, 0x4b82, 0x4b83, 0x4b83, 0x4b84, 0x4b85, 0x4b85, 0x4b86, + 0x4b87, 0x4b87, 0x4b88, 0x4b88, 0x4b89, 0x4b8a, 0x4b8a, 0x4b8b, + 0x4b8b, 0x4b8c, 0x4b8d, 0x4b8d, 0x4b8e, 0x4b8e, 0x4b8f, 0x4b90, + 0x4b90, 0x4b91, 0x4b91, 0x4b92, 0x4b93, 0x4b93, 0x4b94, 0x4b94, + 0x4b95, 0x4b96, 0x4b96, 0x4b97, 0x4b97, 0x4b98, 0x4b99, 0x4b99, + 0x4b9a, 0x4b9a, 0x4b9b, 0x4b9c, 0x4b9c, 0x4b9d, 0x4b9d, 0x4b9e, + 0x4b9f, 0x4b9f, 0x4ba0, 0x4ba0, 0x4ba1, 0x4ba2, 0x4ba2, 0x4ba3, + 0x4ba3, 0x4ba4, 0x4ba5, 0x4ba5, 0x4ba6, 0x4ba6, 0x4ba7, 0x4ba8, + 0x4ba8, 0x4ba9, 0x4ba9, 0x4baa, 0x4baa, 0x4bab, 0x4bac, 0x4bac, + 0x4bad, 0x4bad, 0x4bae, 0x4baf, 0x4baf, 0x4bb0, 0x4bb0, 0x4bb1, + 0x4bb1, 0x4bb2, 0x4bb3, 0x4bb3, 0x4bb4, 0x4bb4, 0x4bb5, 0x4bb6, + 0x4bb6, 0x4bb7, 0x4bb7, 0x4bb8, 0x4bb8, 0x4bb9, 0x4bba, 0x4bba, + 0x4bbb, 0x4bbb, 0x4bbc, 0x4bbd, 0x4bbd, 0x4bbe, 0x4bbe, 0x4bbf, + 0x4bbf, 0x4bc0, 0x4bc1, 0x4bc1, 0x4bc2, 0x4bc2, 0x4bc3, 0x4bc3, + 0x4bc4, 0x4bc5, 0x4bc5, 0x4bc6, 0x4bc6, 0x4bc7, 0x4bc7, 0x4bc8, + 0x4bc9, 0x4bc9, 0x4bca, 0x4bca, 0x4bcb, 0x4bcb, 0x4bcc, 0x4bcd, + 0x4bcd, 0x4bce, 0x4bce, 0x4bcf, 0x4bcf, 0x4bd0, 0x4bd1, 0x4bd1, + 0x4bd2, 0x4bd2, 0x4bd3, 0x4bd3, 0x4bd4, 0x4bd5, 0x4bd5, 0x4bd6, + 0x4bd6, 0x4bd7, 0x4bd7, 0x4bd8, 0x4bd8, 0x4bd9, 0x4bda, 0x4bda, + 0x4bdb, 0x4bdb, 0x4bdc, 0x4bdc, 0x4bdd, 0x4bde, 0x4bde, 0x4bdf, + 0x4bdf, 0x4be0, 0x4be0, 0x4be1, 0x4be1, 0x4be2, 0x4be3, 0x4be3, + 0x4be4, 0x4be4, 0x4be5, 0x4be5, 0x4be6, 0x4be6, 0x4be7, 0x4be8, + 0x4be8, 0x4be9, 0x4be9, 0x4bea, 0x4bea, 0x4beb, 0x4beb, 0x4bec, + 0x4bed, 0x4bed, 0x4bee, 0x4bee, 0x4bef, 0x4bef, 0x4bf0, 0x4bf0, + 0x4bf1, 0x4bf1, 0x4bf2, 0x4bf3, 0x4bf3, 0x4bf4, 0x4bf4, 0x4bf5, + 0x4bf5, 0x4bf6, 0x4bf6, 0x4bf7, 0x4bf8, 0x4bf8, 0x4bf9, 0x4bf9, + 0x4bfa, 0x4bfa, 0x4bfb, 0x4bfb, 0x4bfc, 0x4bfc, 0x4bfd, 0x4bfe, + 0x4bfe, 0x4bff, 0x4bff, 0x4c00, 0x4c00, 0x4c00, 0x4c01, 0x4c01, + 0x4c01, 0x4c01, 0x4c02, 0x4c02, 0x4c02, 0x4c03, 0x4c03, 0x4c03, + 0x4c03, 0x4c04, 0x4c04, 0x4c04, 0x4c04, 0x4c05, 0x4c05, 0x4c05, + 0x4c05, 0x4c06, 0x4c06, 0x4c06, 0x4c07, 0x4c07, 0x4c07, 0x4c07, + 0x4c08, 0x4c08, 0x4c08, 0x4c08, 0x4c09, 0x4c09, 0x4c09, 0x4c09, + 0x4c0a, 0x4c0a, 0x4c0a, 0x4c0b, 0x4c0b, 0x4c0b, 0x4c0b, 0x4c0c, + 0x4c0c, 0x4c0c, 0x4c0c, 0x4c0d, 0x4c0d, 0x4c0d, 0x4c0d, 0x4c0e, + 0x4c0e, 0x4c0e, 0x4c0f, 0x4c0f, 0x4c0f, 0x4c0f, 0x4c10, 0x4c10, + 0x4c10, 0x4c10, 0x4c11, 0x4c11, 0x4c11, 0x4c11, 0x4c12, 0x4c12, + 0x4c12, 0x4c12, 0x4c13, 0x4c13, 0x4c13, 0x4c13, 0x4c14, 0x4c14, + 0x4c14, 0x4c15, 0x4c15, 0x4c15, 0x4c15, 0x4c16, 0x4c16, 0x4c16, + 0x4c16, 0x4c17, 0x4c17, 0x4c17, 0x4c17, 0x4c18, 0x4c18, 0x4c18, + 0x4c18, 0x4c19, 0x4c19, 0x4c19, 0x4c19, 0x4c1a, 0x4c1a, 0x4c1a, + 0x4c1a, 0x4c1b, 0x4c1b, 0x4c1b, 0x4c1c, 0x4c1c, 0x4c1c, 0x4c1c, + 0x4c1d, 0x4c1d, 0x4c1d, 0x4c1d, 0x4c1e, 0x4c1e, 0x4c1e, 0x4c1e, + 0x4c1f, 0x4c1f, 0x4c1f, 0x4c1f, 0x4c20, 0x4c20, 0x4c20, 0x4c20, + 0x4c21, 0x4c21, 0x4c21, 0x4c21, 0x4c22, 0x4c22, 0x4c22, 0x4c22, + 0x4c23, 0x4c23, 0x4c23, 0x4c23, 0x4c24, 0x4c24, 0x4c24, 0x4c24, + 0x4c25, 0x4c25, 0x4c25, 0x4c25, 0x4c26, 0x4c26, 0x4c26, 0x4c26, + 0x4c27, 0x4c27, 0x4c27, 0x4c27, 0x4c28, 0x4c28, 0x4c28, 0x4c28, + 0x4c29, 0x4c29, 0x4c2a, 0x4c2a, 0x4c2b, 0x4c2b, 0x4c2c, 0x4c2c, + 0x4c2d, 0x4c2d, 0x4c2e, 0x4c2e, 0x4c2f, 0x4c2f, 0x4c30, 0x4c30, + 0x4c31, 0x4c31, 0x4c32, 0x4c32, 0x4c33, 0x4c33, 0x4c34, 0x4c34, + 0x4c35, 0x4c35, 0x4c36, 0x4c36, 0x4c36, 0x4c37, 0x4c37, 0x4c38, + 0x4c38, 0x4c39, 0x4c39, 0x4c3a, 0x4c3a, 0x4c3b, 0x4c3b, 0x4c3c, + 0x4c3c, 0x4c3d, 0x4c3d, 0x4c3e, 0x4c3e, 0x4c3f, 0x4c3f, 0x4c40, + 0x4c40, 0x4c41, 0x4c41, 0x4c42, 0x4c42, 0x4c43, 0x4c43, 0x4c43, + 0x4c44, 0x4c44, 0x4c45, 0x4c45, 0x4c46, 0x4c46, 0x4c47, 0x4c47, + 0x4c48, 0x4c48, 0x4c49, 0x4c49, 0x4c4a, 0x4c4a, 0x4c4b, 0x4c4b, + 0x4c4b, 0x4c4c, 0x4c4c, 0x4c4d, 0x4c4d, 0x4c4e, 0x4c4e, 0x4c4f, + 0x4c4f, 0x4c50, 0x4c50, 0x4c51, 0x4c51, 0x4c52, 0x4c52, 0x4c52, + 0x4c53, 0x4c53, 0x4c54, 0x4c54, 0x4c55, 0x4c55, 0x4c56, 0x4c56, + 0x4c57, 0x4c57, 0x4c57, 0x4c58, 0x4c58, 0x4c59, 0x4c59, 0x4c5a, + 0x4c5a, 0x4c5b, 0x4c5b, 0x4c5c, 0x4c5c, 0x4c5c, 0x4c5d, 0x4c5d, + 0x4c5e, 0x4c5e, 0x4c5f, 0x4c5f, 0x4c60, 0x4c60, 0x4c61, 0x4c61, + 0x4c61, 0x4c62, 0x4c62, 0x4c63, 0x4c63, 0x4c64, 0x4c64, 0x4c65, + 0x4c65, 0x4c65, 0x4c66, 0x4c66, 0x4c67, 0x4c67, 0x4c68, 0x4c68, + 0x4c69, 0x4c69, 0x4c69, 0x4c6a, 0x4c6a, 0x4c6b, 0x4c6b, 0x4c6c, + 0x4c6c, 0x4c6c, 0x4c6d, 0x4c6d, 0x4c6e, 0x4c6e, 0x4c6f, 0x4c6f, + 0x4c70, 0x4c70, 0x4c70, 0x4c71, 0x4c71, 0x4c72, 0x4c72, 0x4c73, + 0x4c73, 0x4c73, 0x4c74, 0x4c74, 0x4c75, 0x4c75, 0x4c76, 0x4c76, + 0x4c76, 0x4c77, 0x4c77, 0x4c78, 0x4c78, 0x4c79, 0x4c79, 0x4c79, + 0x4c7a, 0x4c7a, 0x4c7b, 0x4c7b, 0x4c7c, 0x4c7c, 0x4c7c, 0x4c7d, + 0x4c7d, 0x4c7e, 0x4c7e, 0x4c7f, 0x4c7f, 0x4c7f, 0x4c80, 0x4c80, + 0x4c81, 0x4c81, 0x4c82, 0x4c82, 0x4c82, 0x4c83, 0x4c83, 0x4c84, + 0x4c84, 0x4c84, 0x4c85, 0x4c85, 0x4c86, 0x4c86, 0x4c87, 0x4c87, + 0x4c87, 0x4c88, 0x4c88, 0x4c89, 0x4c89, 0x4c89, 0x4c8a, 0x4c8a, + 0x4c8b, 0x4c8b, 0x4c8b, 0x4c8c, 0x4c8c, 0x4c8d, 0x4c8d, 0x4c8e, + 0x4c8e, 0x4c8e, 0x4c8f, 0x4c8f, 0x4c90, 0x4c90, 0x4c90, 0x4c91, + 0x4c91, 0x4c92, 0x4c92, 0x4c92, 0x4c93, 0x4c93, 0x4c94, 0x4c94, + 0x4c94, 0x4c95, 0x4c95, 0x4c96, 0x4c96, 0x4c97, 0x4c97, 0x4c97, + 0x4c98, 0x4c98, 0x4c99, 0x4c99, 0x4c99, 0x4c9a, 0x4c9a, 0x4c9b, + 0x4c9b, 0x4c9b, 0x4c9c, 0x4c9c, 0x4c9d, 0x4c9d, 0x4c9d, 0x4c9e, + 0x4c9e, 0x4c9f, 0x4c9f, 0x4c9f, 0x4ca0, 0x4ca0, 0x4ca0, 0x4ca1, + 0x4ca1, 0x4ca2, 0x4ca2, 0x4ca2, 0x4ca3, 0x4ca3, 0x4ca4, 0x4ca4, + 0x4ca4, 0x4ca5, 0x4ca5, 0x4ca6, 0x4ca6, 0x4ca6, 0x4ca7, 0x4ca7, + 0x4ca8, 0x4ca8, 0x4ca8, 0x4ca9, 0x4ca9, 0x4caa, 0x4caa, 0x4caa, + 0x4cab, 0x4cab, 0x4cab, 0x4cac, 0x4cac, 0x4cad, 0x4cad, 0x4cad, + 0x4cae, 0x4cae, 0x4caf, 0x4caf, 0x4caf, 0x4cb0, 0x4cb0, 0x4cb0, + 0x4cb1, 0x4cb1, 0x4cb2, 0x4cb2, 0x4cb2, 0x4cb3, 0x4cb3, 0x4cb4, + 0x4cb4, 0x4cb4, 0x4cb5, 0x4cb5, 0x4cb5, 0x4cb6, 0x4cb6, 0x4cb7, + 0x4cb7, 0x4cb7, 0x4cb8, 0x4cb8, 0x4cb8, 0x4cb9, 0x4cb9, 0x4cba, + 0x4cba, 0x4cba, 0x4cbb, 0x4cbb, 0x4cbb, 0x4cbc, 0x4cbc, 0x4cbd, + 0x4cbd, 0x4cbd, 0x4cbe, 0x4cbe, 0x4cbe, 0x4cbf, 0x4cbf, 0x4cc0, + 0x4cc0, 0x4cc0, 0x4cc1, 0x4cc1, 0x4cc1, 0x4cc2, 0x4cc2, 0x4cc3, + 0x4cc3, 0x4cc3, 0x4cc4, 0x4cc4, 0x4cc4, 0x4cc5, 0x4cc5, 0x4cc6, + 0x4cc6, 0x4cc6, 0x4cc7, 0x4cc7, 0x4cc7, 0x4cc8, 0x4cc8, 0x4cc8, + 0x4cc9, 0x4cc9, 0x4cca, 0x4cca, 0x4cca, 0x4ccb, 0x4ccb, 0x4ccb, + 0x4ccc, 0x4ccc, 0x4ccc, 0x4ccd, 0x4ccd, 0x4cce, 0x4cce, 0x4cce, + 0x4ccf, 0x4ccf, 0x4ccf, 0x4cd0, 0x4cd0, 0x4cd0, 0x4cd1, 0x4cd1, + 0x4cd2, 0x4cd2, 0x4cd2, 0x4cd3, 0x4cd3, 0x4cd3, 0x4cd4, 0x4cd4, + 0x4cd4, 0x4cd5, 0x4cd5, 0x4cd5, 0x4cd6, 0x4cd6, 0x4cd7, 0x4cd7, + 0x4cd7, 0x4cd8, 0x4cd8, 0x4cd8, 0x4cd9, 0x4cd9, 0x4cd9, 0x4cda, + 0x4cda, 0x4cda, 0x4cdb, 0x4cdb, 0x4cdb, 0x4cdc, 0x4cdc, 0x4cdd, + 0x4cdd, 0x4cdd, 0x4cde, 0x4cde, 0x4cde, 0x4cdf, 0x4cdf, 0x4cdf, + 0x4ce0, 0x4ce0, 0x4ce0, 0x4ce1, 0x4ce1, 0x4ce1, 0x4ce2, 0x4ce2, + 0x4ce2, 0x4ce3, 0x4ce3, 0x4ce4, 0x4ce4, 0x4ce4, 0x4ce5, 0x4ce5, + 0x4ce5, 0x4ce6, 0x4ce6, 0x4ce6, 0x4ce7, 0x4ce7, 0x4ce7, 0x4ce8, + 0x4ce8, 0x4ce8, 0x4ce9, 0x4ce9, 0x4ce9, 0x4cea, 0x4cea, 0x4cea, + 0x4ceb, 0x4ceb, 0x4ceb, 0x4cec, 0x4cec, 0x4cec, 0x4ced, 0x4ced, + 0x4ced, 0x4cee, 0x4cee, 0x4cef, 0x4cef, 0x4cef, 0x4cf0, 0x4cf0, + 0x4cf0, 0x4cf1, 0x4cf1, 0x4cf1, 0x4cf2, 0x4cf2, 0x4cf2, 0x4cf3, + 0x4cf3, 0x4cf3, 0x4cf4, 0x4cf4, 0x4cf4, 0x4cf5, 0x4cf5, 0x4cf5, + 0x4cf6, 0x4cf6, 0x4cf6, 0x4cf7, 0x4cf7, 0x4cf7, 0x4cf8, 0x4cf8, + 0x4cf8, 0x4cf9, 0x4cf9, 0x4cf9, 0x4cfa, 0x4cfa, 0x4cfa, 0x4cfb, + 0x4cfb, 0x4cfb, 0x4cfc, 0x4cfc, 0x4cfc, 0x4cfd, 0x4cfd, 0x4cfd, + 0x4cfe, 0x4cfe, 0x4cfe, 0x4cff, 0x4cff, 0x4cff, 0x4d00, 0x4d00, + 0x4d00, 0x4d01, 0x4d01, 0x4d01, 0x4d02, 0x4d02, 0x4d02, 0x4d03, + 0x4d03, 0x4d03, 0x4d03, 0x4d04, 0x4d04, 0x4d04, 0x4d05, 0x4d05, + 0x4d05, 0x4d06, 0x4d06, 0x4d06, 0x4d07, 0x4d07, 0x4d07, 0x4d08, + 0x4d08, 0x4d08, 0x4d09, 0x4d09, 0x4d09, 0x4d0a, 0x4d0a, 0x4d0a, + 0x4d0b, 0x4d0b, 0x4d0b, 0x4d0c, 0x4d0c, 0x4d0c, 0x4d0d, 0x4d0d, + 0x4d0d, 0x4d0d, 0x4d0e, 0x4d0e, 0x4d0e, 0x4d0f, 0x4d0f, 0x4d0f, + 0x4d10, 0x4d10, 0x4d10, 0x4d11, 0x4d11, 0x4d11, 0x4d12, 0x4d12, + 0x4d12, 0x4d13, 0x4d13, 0x4d13, 0x4d14, 0x4d14, 0x4d14, 0x4d14, + 0x4d15, 0x4d15, 0x4d15, 0x4d16, 0x4d16, 0x4d16, 0x4d17, 0x4d17, + 0x4d17, 0x4d18, 0x4d18, 0x4d18, 0x4d19, 0x4d19, 0x4d19, 0x4d1a, + 0x4d1a, 0x4d1a, 0x4d1a, 0x4d1b, 0x4d1b, 0x4d1b, 0x4d1c, 0x4d1c, + 0x4d1c, 0x4d1d, 0x4d1d, 0x4d1d, 0x4d1e, 0x4d1e, 0x4d1e, 0x4d1e, + 0x4d1f, 0x4d1f, 0x4d1f, 0x4d20, 0x4d20, 0x4d20, 0x4d21, 0x4d21, + 0x4d21, 0x4d22, 0x4d22, 0x4d22, 0x4d22, 0x4d23, 0x4d23, 0x4d23, + 0x4d24, 0x4d24, 0x4d24, 0x4d25, 0x4d25, 0x4d25, 0x4d26, 0x4d26, + 0x4d26, 0x4d26, 0x4d27, 0x4d27, 0x4d27, 0x4d28, 0x4d28, 0x4d28, + 0x4d29, 0x4d29, 0x4d29, 0x4d29, 0x4d2a, 0x4d2a, 0x4d2a, 0x4d2b, + 0x4d2b, 0x4d2b, 0x4d2c, 0x4d2c, 0x4d2c, 0x4d2d, 0x4d2d, 0x4d2d, + 0x4d2d, 0x4d2e, 0x4d2e, 0x4d2e, 0x4d2f, 0x4d2f, 0x4d2f, 0x4d30, + 0x4d30, 0x4d30, 0x4d30, 0x4d31, 0x4d31, 0x4d31, 0x4d32, 0x4d32, + 0x4d32, 0x4d32, 0x4d33, 0x4d33, 0x4d33, 0x4d34, 0x4d34, 0x4d34, + 0x4d35, 0x4d35, 0x4d35, 0x4d35, 0x4d36, 0x4d36, 0x4d36, 0x4d37, + 0x4d37, 0x4d37, 0x4d38, 0x4d38, 0x4d38, 0x4d38, 0x4d39, 0x4d39, + 0x4d39, 0x4d3a, 0x4d3a, 0x4d3a, 0x4d3a, 0x4d3b, 0x4d3b, 0x4d3b, + 0x4d3c, 0x4d3c, 0x4d3c, 0x4d3d, 0x4d3d, 0x4d3d, 0x4d3d, 0x4d3e, + 0x4d3e, 0x4d3e, 0x4d3f, 0x4d3f, 0x4d3f, 0x4d3f, 0x4d40, 0x4d40, + 0x4d40, 0x4d41, 0x4d41, 0x4d41, 0x4d41, 0x4d42, 0x4d42, 0x4d42, + 0x4d43, 0x4d43, 0x4d43, 0x4d43, 0x4d44, 0x4d44, 0x4d44, 0x4d45, + 0x4d45, 0x4d45, 0x4d45, 0x4d46, 0x4d46, 0x4d46, 0x4d47, 0x4d47, + 0x4d47, 0x4d47, 0x4d48, 0x4d48, 0x4d48, 0x4d49, 0x4d49, 0x4d49, + 0x4d49, 0x4d4a, 0x4d4a, 0x4d4a, 0x4d4b, 0x4d4b, 0x4d4b, 0x4d4b, + 0x4d4c, 0x4d4c, 0x4d4c, 0x4d4d, 0x4d4d, 0x4d4d, 0x4d4d, 0x4d4e, + 0x4d4e, 0x4d4e, 0x4d4f, 0x4d4f, 0x4d4f, 0x4d4f, 0x4d50, 0x4d50, + 0x4d50, 0x4d51, 0x4d51, 0x4d51, 0x4d51, 0x4d52, 0x4d52, 0x4d52, + 0x4d53, 0x4d53, 0x4d53, 0x4d53, 0x4d54, 0x4d54, 0x4d54, 0x4d54, + 0x4d55, 0x4d55, 0x4d55, 0x4d56, 0x4d56, 0x4d56, 0x4d56, 0x4d57, + 0x4d57, 0x4d57, 0x4d58, 0x4d58, 0x4d58, 0x4d58, 0x4d59, 0x4d59, + 0x4d59, 0x4d59, 0x4d5a, 0x4d5a, 0x4d5a, 0x4d5b, 0x4d5b, 0x4d5b, + 0x4d5b, 0x4d5c, 0x4d5c, 0x4d5c, 0x4d5c, 0x4d5d, 0x4d5d, 0x4d5d, + 0x4d5e, 0x4d5e, 0x4d5e, 0x4d5e, 0x4d5f, 0x4d5f, 0x4d5f, 0x4d5f, + 0x4d60, 0x4d60, 0x4d60, 0x4d61, 0x4d61, 0x4d61, 0x4d61, 0x4d62, + 0x4d62, 0x4d62, 0x4d62, 0x4d63, 0x4d63, 0x4d63, 0x4d64, 0x4d64, + 0x4d64, 0x4d64, 0x4d65, 0x4d65, 0x4d65, 0x4d65, 0x4d66, 0x4d66, + 0x4d66, 0x4d67, 0x4d67, 0x4d67, 0x4d67, 0x4d68, 0x4d68, 0x4d68, + 0x4d68, 0x4d69, 0x4d69, 0x4d69, 0x4d69, 0x4d6a, 0x4d6a, 0x4d6a, + 0x4d6b, 0x4d6b, 0x4d6b, 0x4d6b, 0x4d6c, 0x4d6c, 0x4d6c, 0x4d6c, + 0x4d6d, 0x4d6d, 0x4d6d, 0x4d6d, 0x4d6e, 0x4d6e, 0x4d6e, 0x4d6f, + 0x4d6f, 0x4d6f, 0x4d6f, 0x4d70, 0x4d70, 0x4d70, 0x4d70, 0x4d71, + 0x4d71, 0x4d71, 0x4d71, 0x4d72, 0x4d72, 0x4d72, 0x4d72, 0x4d73, + 0x4d73, 0x4d73, 0x4d74, 0x4d74, 0x4d74, 0x4d74, 0x4d75, 0x4d75, + 0x4d75, 0x4d75, 0x4d76, 0x4d76, 0x4d76, 0x4d76, 0x4d77, 0x4d77, + 0x4d77, 0x4d77, 0x4d78, 0x4d78, 0x4d78, 0x4d78, 0x4d79, 0x4d79, + 0x4d79, 0x4d7a, 0x4d7a, 0x4d7a, 0x4d7a, 0x4d7b, 0x4d7b, 0x4d7b, + 0x4d7b, 0x4d7c, 0x4d7c, 0x4d7c, 0x4d7c, 0x4d7d, 0x4d7d, 0x4d7d, + 0x4d7d, 0x4d7e, 0x4d7e, 0x4d7e, 0x4d7e, 0x4d7f, 0x4d7f, 0x4d7f, + 0x4d7f, 0x4d80, 0x4d80, 0x4d80, 0x4d80, 0x4d81, 0x4d81, 0x4d81, + 0x4d81, 0x4d82, 0x4d82, 0x4d82, 0x4d82, 0x4d83, 0x4d83, 0x4d83, + 0x4d84, 0x4d84, 0x4d84, 0x4d84, 0x4d85, 0x4d85, 0x4d85, 0x4d85, + 0x4d86, 0x4d86, 0x4d86, 0x4d86, 0x4d87, 0x4d87, 0x4d87, 0x4d87, + 0x4d88, 0x4d88, 0x4d88, 0x4d88, 0x4d89, 0x4d89, 0x4d89, 0x4d89, + 0x4d8a, 0x4d8a, 0x4d8a, 0x4d8a, 0x4d8b, 0x4d8b, 0x4d8b, 0x4d8b, + 0x4d8c, 0x4d8c, 0x4d8d, 0x4d8d, 0x4d8e, 0x4d8e, 0x4d8f, 0x4d8f, + 0x4d90, 0x4d90, 0x4d91, 0x4d91, 0x4d92, 0x4d92, 0x4d93, 0x4d93, + 0x4d94, 0x4d94, 0x4d94, 0x4d95, 0x4d95, 0x4d96, 0x4d96, 0x4d97, + 0x4d97, 0x4d98, 0x4d98, 0x4d99, 0x4d99, 0x4d9a, 0x4d9a, 0x4d9b, + 0x4d9b, 0x4d9c, 0x4d9c, 0x4d9d, 0x4d9d, 0x4d9e, 0x4d9e, 0x4d9f, + 0x4d9f, 0x4da0, 0x4da0, 0x4da1, 0x4da1, 0x4da2, 0x4da2, 0x4da3, + 0x4da3, 0x4da3, 0x4da4, 0x4da4, 0x4da5, 0x4da5, 0x4da6, 0x4da6, + 0x4da7, 0x4da7, 0x4da8, 0x4da8, 0x4da9, 0x4da9, 0x4daa, 0x4daa, + 0x4dab, 0x4dab, 0x4dac, 0x4dac, 0x4dac, 0x4dad, 0x4dad, 0x4dae, + 0x4dae, 0x4daf, 0x4daf, 0x4db0, 0x4db0, 0x4db1, 0x4db1, 0x4db2, + 0x4db2, 0x4db3, 0x4db3, 0x4db3, 0x4db4, 0x4db4, 0x4db5, 0x4db5, + 0x4db6, 0x4db6, 0x4db7, 0x4db7, 0x4db8, 0x4db8, 0x4db9, 0x4db9, + 0x4db9, 0x4dba, 0x4dba, 0x4dbb, 0x4dbb, 0x4dbc, 0x4dbc, 0x4dbd, + 0x4dbd, 0x4dbe, 0x4dbe, 0x4dbe, 0x4dbf, 0x4dbf, 0x4dc0, 0x4dc0, + 0x4dc1, 0x4dc1, 0x4dc2, 0x4dc2, 0x4dc3, 0x4dc3, 0x4dc3, 0x4dc4, + 0x4dc4, 0x4dc5, 0x4dc5, 0x4dc6, 0x4dc6, 0x4dc7, 0x4dc7, 0x4dc7, + 0x4dc8, 0x4dc8, 0x4dc9, 0x4dc9, 0x4dca, 0x4dca, 0x4dcb, 0x4dcb, + 0x4dcb, 0x4dcc, 0x4dcc, 0x4dcd, 0x4dcd, 0x4dce, 0x4dce, 0x4dce, + 0x4dcf, 0x4dcf, 0x4dd0, 0x4dd0, 0x4dd1, 0x4dd1, 0x4dd2, 0x4dd2, + 0x4dd2, 0x4dd3, 0x4dd3, 0x4dd4, 0x4dd4, 0x4dd5, 0x4dd5, 0x4dd5, + 0x4dd6, 0x4dd6, 0x4dd7, 0x4dd7, 0x4dd8, 0x4dd8, 0x4dd8, 0x4dd9, + 0x4dd9, 0x4dda, 0x4dda, 0x4ddb, 0x4ddb, 0x4ddb, 0x4ddc, 0x4ddc, + 0x4ddd, 0x4ddd, 0x4dde, 0x4dde, 0x4dde, 0x4ddf, 0x4ddf, 0x4de0, + 0x4de0, 0x4de1, 0x4de1, 0x4de1, 0x4de2, 0x4de2, 0x4de3, 0x4de3, + 0x4de4, 0x4de4, 0x4de4, 0x4de5, 0x4de5, 0x4de6, 0x4de6, 0x4de6, + 0x4de7, 0x4de7, 0x4de8, 0x4de8, 0x4de9, 0x4de9, 0x4de9, 0x4dea, + 0x4dea, 0x4deb, 0x4deb, 0x4deb, 0x4dec, 0x4dec, 0x4ded, 0x4ded, + 0x4dee, 0x4dee, 0x4dee, 0x4def, 0x4def, 0x4df0, 0x4df0, 0x4df0, + 0x4df1, 0x4df1, 0x4df2, 0x4df2, 0x4df2, 0x4df3, 0x4df3, 0x4df4, + 0x4df4, 0x4df5, 0x4df5, 0x4df5, 0x4df6, 0x4df6, 0x4df7, 0x4df7, + 0x4df7, 0x4df8, 0x4df8, 0x4df9, 0x4df9, 0x4df9, 0x4dfa, 0x4dfa, + 0x4dfb, 0x4dfb, 0x4dfb, 0x4dfc, 0x4dfc, 0x4dfd, 0x4dfd, 0x4dfd, + 0x4dfe, 0x4dfe, 0x4dff, 0x4dff, 0x4dff, 0x4e00, 0x4e00, 0x4e01, + 0x4e01, 0x4e01, 0x4e02, 0x4e02, 0x4e03, 0x4e03, 0x4e03, 0x4e04, + 0x4e04, 0x4e05, 0x4e05, 0x4e05, 0x4e06, 0x4e06, 0x4e07, 0x4e07, + 0x4e07, 0x4e08, 0x4e08, 0x4e09, 0x4e09, 0x4e09, 0x4e0a, 0x4e0a, + 0x4e0a, 0x4e0b, 0x4e0b, 0x4e0c, 0x4e0c, 0x4e0c, 0x4e0d, 0x4e0d, + 0x4e0e, 0x4e0e, 0x4e0e, 0x4e0f, 0x4e0f, 0x4e10, 0x4e10, 0x4e10, + 0x4e11, 0x4e11, 0x4e11, 0x4e12, 0x4e12, 0x4e13, 0x4e13, 0x4e13, + 0x4e14, 0x4e14, 0x4e15, 0x4e15, 0x4e15, 0x4e16, 0x4e16, 0x4e16, + 0x4e17, 0x4e17, 0x4e18, 0x4e18, 0x4e18, 0x4e19, 0x4e19, 0x4e19, + 0x4e1a, 0x4e1a, 0x4e1b, 0x4e1b, 0x4e1b, 0x4e1c, 0x4e1c, 0x4e1c, + 0x4e1d, 0x4e1d, 0x4e1e, 0x4e1e, 0x4e1e, 0x4e1f, 0x4e1f, 0x4e1f, + 0x4e20, 0x4e20, 0x4e21, 0x4e21, 0x4e21, 0x4e22, 0x4e22, 0x4e22, + 0x4e23, 0x4e23, 0x4e24, 0x4e24, 0x4e24, 0x4e25, 0x4e25, 0x4e25, + 0x4e26, 0x4e26, 0x4e27, 0x4e27, 0x4e27, 0x4e28, 0x4e28, 0x4e28, + 0x4e29, 0x4e29, 0x4e29, 0x4e2a, 0x4e2a, 0x4e2b, 0x4e2b, 0x4e2b, + 0x4e2c, 0x4e2c, 0x4e2c, 0x4e2d, 0x4e2d, 0x4e2e, 0x4e2e, 0x4e2e, + 0x4e2f, 0x4e2f, 0x4e2f, 0x4e30, 0x4e30, 0x4e30, 0x4e31, 0x4e31, + 0x4e32, 0x4e32, 0x4e32, 0x4e33, 0x4e33, 0x4e33, 0x4e34, 0x4e34, + 0x4e34, 0x4e35, 0x4e35, 0x4e35, 0x4e36, 0x4e36, 0x4e37, 0x4e37, + 0x4e37, 0x4e38, 0x4e38, 0x4e38, 0x4e39, 0x4e39, 0x4e39, 0x4e3a, + 0x4e3a, 0x4e3a, 0x4e3b, 0x4e3b, 0x4e3c, 0x4e3c, 0x4e3c, 0x4e3d, + 0x4e3d, 0x4e3d, 0x4e3e, 0x4e3e, 0x4e3e, 0x4e3f, 0x4e3f, 0x4e3f, + 0x4e40, 0x4e40, 0x4e40, 0x4e41, 0x4e41, 0x4e42, 0x4e42, 0x4e42, + 0x4e43, 0x4e43, 0x4e43, 0x4e44, 0x4e44, 0x4e44, 0x4e45, 0x4e45, + 0x4e45, 0x4e46, 0x4e46, 0x4e46, 0x4e47, 0x4e47, 0x4e47, 0x4e48, + 0x4e48, 0x4e48, 0x4e49, 0x4e49, 0x4e4a, 0x4e4a, 0x4e4a, 0x4e4b, + 0x4e4b, 0x4e4b, 0x4e4c, 0x4e4c, 0x4e4c, 0x4e4d, 0x4e4d, 0x4e4d, + 0x4e4e, 0x4e4e, 0x4e4e, 0x4e4f, 0x4e4f, 0x4e4f, 0x4e50, 0x4e50, + 0x4e50, 0x4e51, 0x4e51, 0x4e51, 0x4e52, 0x4e52, 0x4e52, 0x4e53, + 0x4e53, 0x4e53, 0x4e54, 0x4e54, 0x4e54, 0x4e55, 0x4e55, 0x4e55, + 0x4e56, 0x4e56, 0x4e56, 0x4e57, 0x4e57, 0x4e57, 0x4e58, 0x4e58, + 0x4e58, 0x4e59, 0x4e59, 0x4e59, 0x4e5a, 0x4e5a, 0x4e5a, 0x4e5b, + 0x4e5b, 0x4e5b, 0x4e5c, 0x4e5c, 0x4e5c, 0x4e5d, 0x4e5d, 0x4e5d, + 0x4e5e, 0x4e5e, 0x4e5e, 0x4e5f, 0x4e5f, 0x4e5f, 0x4e60, 0x4e60, + 0x4e60, 0x4e61, 0x4e61, 0x4e61, 0x4e62, 0x4e62, 0x4e62, 0x4e63, + 0x4e63, 0x4e63, 0x4e64, 0x4e64, 0x4e64, 0x4e65, 0x4e65, 0x4e65, + 0x4e66, 0x4e66, 0x4e66, 0x4e67, 0x4e67, 0x4e67, 0x4e68, 0x4e68, + 0x4e68, 0x4e69, 0x4e69, 0x4e69, 0x4e6a, 0x4e6a, 0x4e6a, 0x4e6b, + 0x4e6b, 0x4e6b, 0x4e6c, 0x4e6c, 0x4e6c, 0x4e6d, 0x4e6d, 0x4e6d, + 0x4e6d, 0x4e6e, 0x4e6e, 0x4e6e, 0x4e6f, 0x4e6f, 0x4e6f, 0x4e70, + 0x4e70, 0x4e70, 0x4e71, 0x4e71, 0x4e71, 0x4e72, 0x4e72, 0x4e72, + 0x4e73, 0x4e73, 0x4e73, 0x4e74, 0x4e74, 0x4e74, 0x4e75, 0x4e75, + 0x4e75, 0x4e75, 0x4e76, 0x4e76, 0x4e76, 0x4e77, 0x4e77, 0x4e77, + 0x4e78, 0x4e78, 0x4e78, 0x4e79, 0x4e79, 0x4e79, 0x4e7a, 0x4e7a, + 0x4e7a, 0x4e7b, 0x4e7b, 0x4e7b, 0x4e7b, 0x4e7c, 0x4e7c, 0x4e7c, + 0x4e7d, 0x4e7d, 0x4e7d, 0x4e7e, 0x4e7e, 0x4e7e, 0x4e7f, 0x4e7f, + 0x4e7f, 0x4e80, 0x4e80, 0x4e80, 0x4e80, 0x4e81, 0x4e81, 0x4e81, + 0x4e82, 0x4e82, 0x4e82, 0x4e83, 0x4e83, 0x4e83, 0x4e84, 0x4e84, + 0x4e84, 0x4e84, 0x4e85, 0x4e85, 0x4e85, 0x4e86, 0x4e86, 0x4e86, + 0x4e87, 0x4e87, 0x4e87, 0x4e88, 0x4e88, 0x4e88, 0x4e88, 0x4e89, + 0x4e89, 0x4e89, 0x4e8a, 0x4e8a, 0x4e8a, 0x4e8b, 0x4e8b, 0x4e8b, + 0x4e8b, 0x4e8c, 0x4e8c, 0x4e8c, 0x4e8d, 0x4e8d, 0x4e8d, 0x4e8e, + 0x4e8e, 0x4e8e, 0x4e8f, 0x4e8f, 0x4e8f, 0x4e8f, 0x4e90, 0x4e90, + 0x4e90, 0x4e91, 0x4e91, 0x4e91, 0x4e92, 0x4e92, 0x4e92, 0x4e92, + 0x4e93, 0x4e93, 0x4e93, 0x4e94, 0x4e94, 0x4e94, 0x4e94, 0x4e95, + 0x4e95, 0x4e95, 0x4e96, 0x4e96, 0x4e96, 0x4e97, 0x4e97, 0x4e97, + 0x4e97, 0x4e98, 0x4e98, 0x4e98, 0x4e99, 0x4e99, 0x4e99, 0x4e9a, + 0x4e9a, 0x4e9a, 0x4e9a, 0x4e9b, 0x4e9b, 0x4e9b, 0x4e9c, 0x4e9c, + 0x4e9c, 0x4e9c, 0x4e9d, 0x4e9d, 0x4e9d, 0x4e9e, 0x4e9e, 0x4e9e, + 0x4e9f, 0x4e9f, 0x4e9f, 0x4e9f, 0x4ea0, 0x4ea0, 0x4ea0, 0x4ea1, + 0x4ea1, 0x4ea1, 0x4ea1, 0x4ea2, 0x4ea2, 0x4ea2, 0x4ea3, 0x4ea3, + 0x4ea3, 0x4ea3, 0x4ea4, 0x4ea4, 0x4ea4, 0x4ea5, 0x4ea5, 0x4ea5, + 0x4ea5, 0x4ea6, 0x4ea6, 0x4ea6, 0x4ea7, 0x4ea7, 0x4ea7, 0x4ea8, + 0x4ea8, 0x4ea8, 0x4ea8, 0x4ea9, 0x4ea9, 0x4ea9, 0x4eaa, 0x4eaa, + 0x4eaa, 0x4eaa, 0x4eab, 0x4eab, 0x4eab, 0x4eac, 0x4eac, 0x4eac, + 0x4eac, 0x4ead, 0x4ead, 0x4ead, 0x4eae, 0x4eae, 0x4eae, 0x4eae, + 0x4eaf, 0x4eaf, 0x4eaf, 0x4eaf, 0x4eb0, 0x4eb0, 0x4eb0, 0x4eb1, + 0x4eb1, 0x4eb1, 0x4eb1, 0x4eb2, 0x4eb2, 0x4eb2, 0x4eb3, 0x4eb3, + 0x4eb3, 0x4eb3, 0x4eb4, 0x4eb4, 0x4eb4, 0x4eb5, 0x4eb5, 0x4eb5, + 0x4eb5, 0x4eb6, 0x4eb6, 0x4eb6, 0x4eb7, 0x4eb7, 0x4eb7, 0x4eb7, + 0x4eb8, 0x4eb8, 0x4eb8, 0x4eb8, 0x4eb9, 0x4eb9, 0x4eb9, 0x4eba, + 0x4eba, 0x4eba, 0x4eba, 0x4ebb, 0x4ebb, 0x4ebb, 0x4ebc, 0x4ebc, + 0x4ebc, 0x4ebc, 0x4ebd, 0x4ebd, 0x4ebd, 0x4ebd, 0x4ebe, 0x4ebe, + 0x4ebe, 0x4ebf, 0x4ebf, 0x4ebf, 0x4ebf, 0x4ec0, 0x4ec0, 0x4ec0, + 0x4ec0, 0x4ec1, 0x4ec1, 0x4ec1, 0x4ec2, 0x4ec2, 0x4ec2, 0x4ec2, + 0x4ec3, 0x4ec3, 0x4ec3, 0x4ec3, 0x4ec4, 0x4ec4, 0x4ec4, 0x4ec5, + 0x4ec5, 0x4ec5, 0x4ec5, 0x4ec6, 0x4ec6, 0x4ec6, 0x4ec6, 0x4ec7, + 0x4ec7, 0x4ec7, 0x4ec8, 0x4ec8, 0x4ec8, 0x4ec8, 0x4ec9, 0x4ec9, + 0x4ec9, 0x4ec9, 0x4eca, 0x4eca, 0x4eca, 0x4eca, 0x4ecb, 0x4ecb, + 0x4ecb, 0x4ecc, 0x4ecc, 0x4ecc, 0x4ecc, 0x4ecd, 0x4ecd, 0x4ecd, + 0x4ecd, 0x4ece, 0x4ece, 0x4ece, 0x4ece, 0x4ecf, 0x4ecf, 0x4ecf, + 0x4ed0, 0x4ed0, 0x4ed0, 0x4ed0, 0x4ed1, 0x4ed1, 0x4ed1, 0x4ed1, + 0x4ed2, 0x4ed2, 0x4ed2, 0x4ed2, 0x4ed3, 0x4ed3, 0x4ed3, 0x4ed4, + 0x4ed4, 0x4ed4, 0x4ed4, 0x4ed5, 0x4ed5, 0x4ed5, 0x4ed5, 0x4ed6, + 0x4ed6, 0x4ed6, 0x4ed6, 0x4ed7, 0x4ed7, 0x4ed7, 0x4ed7, 0x4ed8, + 0x4ed8, 0x4ed8, 0x4ed8, 0x4ed9, 0x4ed9, 0x4ed9, 0x4eda, 0x4eda, + 0x4eda, 0x4eda, 0x4edb, 0x4edb, 0x4edb, 0x4edb, 0x4edc, 0x4edc, + 0x4edc, 0x4edc, 0x4edd, 0x4edd, 0x4edd, 0x4edd, 0x4ede, 0x4ede, + 0x4ede, 0x4ede, 0x4edf, 0x4edf, 0x4edf, 0x4edf, 0x4ee0, 0x4ee0, + 0x4ee0, 0x4ee1, 0x4ee1, 0x4ee1, 0x4ee1, 0x4ee2, 0x4ee2, 0x4ee2, + 0x4ee2, 0x4ee3, 0x4ee3, 0x4ee3, 0x4ee3, 0x4ee4, 0x4ee4, 0x4ee4, + 0x4ee4, 0x4ee5, 0x4ee5, 0x4ee5, 0x4ee5, 0x4ee6, 0x4ee6, 0x4ee6, + 0x4ee6, 0x4ee7, 0x4ee7, 0x4ee7, 0x4ee7, 0x4ee8, 0x4ee8, 0x4ee8, + 0x4ee8, 0x4ee9, 0x4ee9, 0x4ee9, 0x4ee9, 0x4eea, 0x4eea, 0x4eea, + 0x4eea, 0x4eeb, 0x4eeb, 0x4eeb, 0x4eeb, 0x4eec, 0x4eec, 0x4eec, + 0x4eec, 0x4eed, 0x4eed, 0x4eed, 0x4eed, 0x4eee, 0x4eee, 0x4eee, + 0x4eee, 0x4eef, 0x4eef, 0x4ef0, 0x4ef0, 0x4ef1, 0x4ef1, 0x4ef2, + 0x4ef2, 0x4ef3, 0x4ef3, 0x4ef4, 0x4ef4, 0x4ef5, 0x4ef5, 0x4ef6, + 0x4ef6, 0x4ef7, 0x4ef7, 0x4ef8, 0x4ef8, 0x4ef9, 0x4ef9, 0x4efa, + 0x4efa, 0x4efb, 0x4efb, 0x4efc, 0x4efc, 0x4efd, 0x4efd, 0x4efe, + 0x4efe, 0x4eff, 0x4eff, 0x4f00, 0x4f00, 0x4f01, 0x4f01, 0x4f02, + 0x4f02, 0x4f03, 0x4f03, 0x4f04, 0x4f04, 0x4f04, 0x4f05, 0x4f05, + 0x4f06, 0x4f06, 0x4f07, 0x4f07, 0x4f08, 0x4f08, 0x4f09, 0x4f09, + 0x4f0a, 0x4f0a, 0x4f0b, 0x4f0b, 0x4f0c, 0x4f0c, 0x4f0d, 0x4f0d, + 0x4f0d, 0x4f0e, 0x4f0e, 0x4f0f, 0x4f0f, 0x4f10, 0x4f10, 0x4f11, + 0x4f11, 0x4f12, 0x4f12, 0x4f13, 0x4f13, 0x4f14, 0x4f14, 0x4f15, + 0x4f15, 0x4f15, 0x4f16, 0x4f16, 0x4f17, 0x4f17, 0x4f18, 0x4f18, + 0x4f19, 0x4f19, 0x4f1a, 0x4f1a, 0x4f1b, 0x4f1b, 0x4f1b, 0x4f1c, + 0x4f1c, 0x4f1d, 0x4f1d, 0x4f1e, 0x4f1e, 0x4f1f, 0x4f1f, 0x4f20, + 0x4f20, 0x4f20, 0x4f21, 0x4f21, 0x4f22, 0x4f22, 0x4f23, 0x4f23, + 0x4f24, 0x4f24, 0x4f25, 0x4f25, 0x4f25, 0x4f26, 0x4f26, 0x4f27, + 0x4f27, 0x4f28, 0x4f28, 0x4f29, 0x4f29, 0x4f29, 0x4f2a, 0x4f2a, + 0x4f2b, 0x4f2b, 0x4f2c, 0x4f2c, 0x4f2d, 0x4f2d, 0x4f2d, 0x4f2e, + 0x4f2e, 0x4f2f, 0x4f2f, 0x4f30, 0x4f30, 0x4f31, 0x4f31, 0x4f31, + 0x4f32, 0x4f32, 0x4f33, 0x4f33, 0x4f34, 0x4f34, 0x4f34, 0x4f35, + 0x4f35, 0x4f36, 0x4f36, 0x4f37, 0x4f37, 0x4f37, 0x4f38, 0x4f38, + 0x4f39, 0x4f39, 0x4f3a, 0x4f3a, 0x4f3b, 0x4f3b, 0x4f3b, 0x4f3c, + 0x4f3c, 0x4f3d, 0x4f3d, 0x4f3e, 0x4f3e, 0x4f3e, 0x4f3f, 0x4f3f, + 0x4f40, 0x4f40, 0x4f41, 0x4f41, 0x4f41, 0x4f42, 0x4f42, 0x4f43, + 0x4f43, 0x4f43, 0x4f44, 0x4f44, 0x4f45, 0x4f45, 0x4f46, 0x4f46, + 0x4f46, 0x4f47, 0x4f47, 0x4f48, 0x4f48, 0x4f49, 0x4f49, 0x4f49, + 0x4f4a, 0x4f4a, 0x4f4b, 0x4f4b, 0x4f4b, 0x4f4c, 0x4f4c, 0x4f4d, + 0x4f4d, 0x4f4e, 0x4f4e, 0x4f4e, 0x4f4f, 0x4f4f, 0x4f50, 0x4f50, + 0x4f50, 0x4f51, 0x4f51, 0x4f52, 0x4f52, 0x4f53, 0x4f53, 0x4f53, + 0x4f54, 0x4f54, 0x4f55, 0x4f55, 0x4f55, 0x4f56, 0x4f56, 0x4f57, + 0x4f57, 0x4f57, 0x4f58, 0x4f58, 0x4f59, 0x4f59, 0x4f59, 0x4f5a, + 0x4f5a, 0x4f5b, 0x4f5b, 0x4f5b, 0x4f5c, 0x4f5c, 0x4f5d, 0x4f5d, + 0x4f5d, 0x4f5e, 0x4f5e, 0x4f5f, 0x4f5f, 0x4f60, 0x4f60, 0x4f60, + 0x4f61, 0x4f61, 0x4f62, 0x4f62, 0x4f62, 0x4f63, 0x4f63, 0x4f63, + 0x4f64, 0x4f64, 0x4f65, 0x4f65, 0x4f65, 0x4f66, 0x4f66, 0x4f67, + 0x4f67, 0x4f67, 0x4f68, 0x4f68, 0x4f69, 0x4f69, 0x4f69, 0x4f6a, + 0x4f6a, 0x4f6b, 0x4f6b, 0x4f6b, 0x4f6c, 0x4f6c, 0x4f6d, 0x4f6d, + 0x4f6d, 0x4f6e, 0x4f6e, 0x4f6f, 0x4f6f, 0x4f6f, 0x4f70, 0x4f70, + 0x4f70, 0x4f71, 0x4f71, 0x4f72, 0x4f72, 0x4f72, 0x4f73, 0x4f73, + 0x4f74, 0x4f74, 0x4f74, 0x4f75, 0x4f75, 0x4f75, 0x4f76, 0x4f76, + 0x4f77, 0x4f77, 0x4f77, 0x4f78, 0x4f78, 0x4f79, 0x4f79, 0x4f79, + 0x4f7a, 0x4f7a, 0x4f7a, 0x4f7b, 0x4f7b, 0x4f7c, 0x4f7c, 0x4f7c, + 0x4f7d, 0x4f7d, 0x4f7d, 0x4f7e, 0x4f7e, 0x4f7f, 0x4f7f, 0x4f7f, + 0x4f80, 0x4f80, 0x4f80, 0x4f81, 0x4f81, 0x4f82, 0x4f82, 0x4f82, + 0x4f83, 0x4f83, 0x4f83, 0x4f84, 0x4f84, 0x4f85, 0x4f85, 0x4f85, + 0x4f86, 0x4f86, 0x4f86, 0x4f87, 0x4f87, 0x4f88, 0x4f88, 0x4f88, + 0x4f89, 0x4f89, 0x4f89, 0x4f8a, 0x4f8a, 0x4f8b, 0x4f8b, 0x4f8b, + 0x4f8c, 0x4f8c, 0x4f8c, 0x4f8d, 0x4f8d, 0x4f8d, 0x4f8e, 0x4f8e, + 0x4f8f, 0x4f8f, 0x4f8f, 0x4f90, 0x4f90, 0x4f90, 0x4f91, 0x4f91, + 0x4f92, 0x4f92, 0x4f92, 0x4f93, 0x4f93, 0x4f93, 0x4f94, 0x4f94, + 0x4f94, 0x4f95, 0x4f95, 0x4f95, 0x4f96, 0x4f96, 0x4f97, 0x4f97, + 0x4f97, 0x4f98, 0x4f98, 0x4f98, 0x4f99, 0x4f99, 0x4f99, 0x4f9a, + 0x4f9a, 0x4f9b, 0x4f9b, 0x4f9b, 0x4f9c, 0x4f9c, 0x4f9c, 0x4f9d, + 0x4f9d, 0x4f9d, 0x4f9e, 0x4f9e, 0x4f9e, 0x4f9f, 0x4f9f, 0x4f9f, + 0x4fa0, 0x4fa0, 0x4fa1, 0x4fa1, 0x4fa1, 0x4fa2, 0x4fa2, 0x4fa2, + 0x4fa3, 0x4fa3, 0x4fa3, 0x4fa4, 0x4fa4, 0x4fa4, 0x4fa5, 0x4fa5, + 0x4fa5, 0x4fa6, 0x4fa6, 0x4fa7, 0x4fa7, 0x4fa7, 0x4fa8, 0x4fa8, + 0x4fa8, 0x4fa9, 0x4fa9, 0x4fa9, 0x4faa, 0x4faa, 0x4faa, 0x4fab, + 0x4fab, 0x4fab, 0x4fac, 0x4fac, 0x4fac, 0x4fad, 0x4fad, 0x4fad, + 0x4fae, 0x4fae, 0x4fae, 0x4faf, 0x4faf, 0x4fb0, 0x4fb0, 0x4fb0, + 0x4fb1, 0x4fb1, 0x4fb1, 0x4fb2, 0x4fb2, 0x4fb2, 0x4fb3, 0x4fb3, + 0x4fb3, 0x4fb4, 0x4fb4, 0x4fb4, 0x4fb5, 0x4fb5, 0x4fb5, 0x4fb6, + 0x4fb6, 0x4fb6, 0x4fb7, 0x4fb7, 0x4fb7, 0x4fb8, 0x4fb8, 0x4fb8, + 0x4fb9, 0x4fb9, 0x4fb9, 0x4fba, 0x4fba, 0x4fba, 0x4fbb, 0x4fbb, + 0x4fbb, 0x4fbc, 0x4fbc, 0x4fbc, 0x4fbd, 0x4fbd, 0x4fbd, 0x4fbe, + 0x4fbe, 0x4fbe, 0x4fbf, 0x4fbf, 0x4fbf, 0x4fc0, 0x4fc0, 0x4fc0, + 0x4fc1, 0x4fc1, 0x4fc1, 0x4fc2, 0x4fc2, 0x4fc2, 0x4fc3, 0x4fc3, + 0x4fc3, 0x4fc4, 0x4fc4, 0x4fc4, 0x4fc5, 0x4fc5, 0x4fc5, 0x4fc6, + 0x4fc6, 0x4fc6, 0x4fc7, 0x4fc7, 0x4fc7, 0x4fc8, 0x4fc8, 0x4fc8, + 0x4fc9, 0x4fc9, 0x4fc9, 0x4fca, 0x4fca, 0x4fca, 0x4fcb, 0x4fcb, + 0x4fcb, 0x4fcc, 0x4fcc, 0x4fcc, 0x4fcd, 0x4fcd, 0x4fcd, 0x4fcd, + 0x4fce, 0x4fce, 0x4fce, 0x4fcf, 0x4fcf, 0x4fcf, 0x4fd0, 0x4fd0, + 0x4fd0, 0x4fd1, 0x4fd1, 0x4fd1, 0x4fd2, 0x4fd2, 0x4fd2, 0x4fd3, + 0x4fd3, 0x4fd3, 0x4fd4, 0x4fd4, 0x4fd4, 0x4fd5, 0x4fd5, 0x4fd5, + 0x4fd6, 0x4fd6, 0x4fd6, 0x4fd6, 0x4fd7, 0x4fd7, 0x4fd7, 0x4fd8, + 0x4fd8, 0x4fd8, 0x4fd9, 0x4fd9, 0x4fd9, 0x4fda, 0x4fda, 0x4fda, + 0x4fdb, 0x4fdb, 0x4fdb, 0x4fdc, 0x4fdc, 0x4fdc, 0x4fdc, 0x4fdd, + 0x4fdd, 0x4fdd, 0x4fde, 0x4fde, 0x4fde, 0x4fdf, 0x4fdf, 0x4fdf, + 0x4fe0, 0x4fe0, 0x4fe0, 0x4fe1, 0x4fe1, 0x4fe1, 0x4fe1, 0x4fe2, + 0x4fe2, 0x4fe2, 0x4fe3, 0x4fe3, 0x4fe3, 0x4fe4, 0x4fe4, 0x4fe4, + 0x4fe5, 0x4fe5, 0x4fe5, 0x4fe5, 0x4fe6, 0x4fe6, 0x4fe6, 0x4fe7, + 0x4fe7, 0x4fe7, 0x4fe8, 0x4fe8, 0x4fe8, 0x4fe9, 0x4fe9, 0x4fe9, + 0x4fe9, 0x4fea, 0x4fea, 0x4fea, 0x4feb, 0x4feb, 0x4feb, 0x4fec, + 0x4fec, 0x4fec, 0x4fed, 0x4fed, 0x4fed, 0x4fed, 0x4fee, 0x4fee, + 0x4fee, 0x4fef, 0x4fef, 0x4fef, 0x4ff0, 0x4ff0, 0x4ff0, 0x4ff0, + 0x4ff1, 0x4ff1, 0x4ff1, 0x4ff2, 0x4ff2, 0x4ff2, 0x4ff3, 0x4ff3, + 0x4ff3, 0x4ff3, 0x4ff4, 0x4ff4, 0x4ff4, 0x4ff5, 0x4ff5, 0x4ff5, + 0x4ff6, 0x4ff6, 0x4ff6, 0x4ff6, 0x4ff7, 0x4ff7, 0x4ff7, 0x4ff8, + 0x4ff8, 0x4ff8, 0x4ff9, 0x4ff9, 0x4ff9, 0x4ff9, 0x4ffa, 0x4ffa, + 0x4ffa, 0x4ffb, 0x4ffb, 0x4ffb, 0x4ffc, 0x4ffc, 0x4ffc, 0x4ffc, + 0x4ffd, 0x4ffd, 0x4ffd, 0x4ffe, 0x4ffe, 0x4ffe, 0x4ffe, 0x4fff, + 0x4fff, 0x4fff, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5001, + 0x5001, 0x5001, 0x5001, 0x5001, 0x5001, 0x5001, 0x5002, 0x5002, + 0x5002, 0x5002, 0x5002, 0x5002, 0x5002, 0x5003, 0x5003, 0x5003, + 0x5003, 0x5003, 0x5003, 0x5003, 0x5004, 0x5004, 0x5004, 0x5004, + 0x5004, 0x5004, 0x5004, 0x5005, 0x5005, 0x5005, 0x5005, 0x5005, + 0x5005, 0x5005, 0x5006, 0x5006, 0x5006, 0x5006, 0x5006, 0x5006, + 0x5006, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, 0x5007, + 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5008, 0x5009, + 0x5009, 0x5009, 0x5009, 0x5009, 0x5009, 0x5009, 0x500a, 0x500a, + 0x500a, 0x500a, 0x500a, 0x500a, 0x500a, 0x500b, 0x500b, 0x500b, + 0x500b, 0x500b, 0x500b, 0x500b, 0x500c, 0x500c, 0x500c, 0x500c, + 0x500c, 0x500c, 0x500c, 0x500d, 0x500d, 0x500d, 0x500d, 0x500d, + 0x500d, 0x500d, 0x500e, 0x500e, 0x500e, 0x500e, 0x500e, 0x500e, + 0x500e, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, 0x500f, + 0x500f, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, 0x5010, + 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5011, 0x5012, + 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5012, 0x5013, + 0x5013, 0x5013, 0x5013, 0x5013, 0x5013, 0x5013, 0x5014, 0x5014, + 0x5014, 0x5014, 0x5014, 0x5014, 0x5014, 0x5015, 0x5015, 0x5015, + 0x5015, 0x5015, 0x5015, 0x5015, 0x5015, 0x5016, 0x5016, 0x5016, + 0x5016, 0x5016, 0x5016, 0x5016, 0x5017, 0x5017, 0x5017, 0x5017, + 0x5017, 0x5017, 0x5017, 0x5017, 0x5018, 0x5018, 0x5018, 0x5018, + 0x5018, 0x5018, 0x5018, 0x5019, 0x5019, 0x5019, 0x5019, 0x5019, + 0x5019, 0x5019, 0x5019, 0x501a, 0x501a, 0x501a, 0x501a, 0x501a, + 0x501a, 0x501a, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, 0x501b, + 0x501b, 0x501b, 0x501c, 0x501c, 0x501c, 0x501c, 0x501c, 0x501c, + 0x501c, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, 0x501d, + 0x501d, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, 0x501e, + 0x501e, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, 0x501f, + 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, 0x5020, + 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, 0x5021, + 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, 0x5022, + 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, 0x5023, + 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5024, 0x5025, + 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5025, 0x5026, + 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5026, 0x5027, + 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5027, 0x5028, + 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5028, 0x5029, + 0x5029, 0x5029, 0x5029, 0x5029, 0x502a, 0x502a, 0x502a, 0x502a, + 0x502b, 0x502b, 0x502b, 0x502b, 0x502c, 0x502c, 0x502c, 0x502c, + 0x502d, 0x502d, 0x502d, 0x502d, 0x502e, 0x502e, 0x502e, 0x502e, + 0x502f, 0x502f, 0x502f, 0x502f, 0x5030, 0x5030, 0x5030, 0x5030, + 0x5031, 0x5031, 0x5031, 0x5031, 0x5032, 0x5032, 0x5032, 0x5032, + 0x5032, 0x5033, 0x5033, 0x5033, 0x5033, 0x5034, 0x5034, 0x5034, + 0x5034, 0x5035, 0x5035, 0x5035, 0x5035, 0x5036, 0x5036, 0x5036, + 0x5036, 0x5037, 0x5037, 0x5037, 0x5037, 0x5037, 0x5038, 0x5038, + 0x5038, 0x5038, 0x5039, 0x5039, 0x5039, 0x5039, 0x503a, 0x503a, + 0x503a, 0x503a, 0x503b, 0x503b, 0x503b, 0x503b, 0x503b, 0x503c, + 0x503c, 0x503c, 0x503c, 0x503d, 0x503d, 0x503d, 0x503d, 0x503e, + 0x503e, 0x503e, 0x503e, 0x503e, 0x503f, 0x503f, 0x503f, 0x503f, + 0x5040, 0x5040, 0x5040, 0x5040, 0x5041, 0x5041, 0x5041, 0x5041, + 0x5041, 0x5042, 0x5042, 0x5042, 0x5042, 0x5043, 0x5043, 0x5043, + 0x5043, 0x5043, 0x5044, 0x5044, 0x5044, 0x5044, 0x5045, 0x5045, + 0x5045, 0x5045, 0x5045, 0x5046, 0x5046, 0x5046, 0x5046, 0x5047, + 0x5047, 0x5047, 0x5047, 0x5047, 0x5048, 0x5048, 0x5048, 0x5048, + 0x5049, 0x5049, 0x5049, 0x5049, 0x5049, 0x504a, 0x504a, 0x504a, + 0x504a, 0x504b, 0x504b, 0x504b, 0x504b, 0x504b, 0x504c, 0x504c, + 0x504c, 0x504c, 0x504d, 0x504d, 0x504d, 0x504d, 0x504d, 0x504e, + 0x504e, 0x504e, 0x504e, 0x504e, 0x504f, 0x504f, 0x504f, 0x504f, + 0x5050, 0x5050, 0x5050, 0x5050, 0x5050, 0x5051, 0x5051, 0x5051, + 0x5051, 0x5051, 0x5052, 0x5052, 0x5052, 0x5052, 0x5053, 0x5053, + 0x5053, 0x5053, 0x5053, 0x5054, 0x5054, 0x5054, 0x5054, 0x5054, + 0x5055, 0x5055, 0x5055, 0x5055, 0x5056, 0x5056, 0x5056, 0x5056, + 0x5056, 0x5057, 0x5057, 0x5057, 0x5057, 0x5057, 0x5058, 0x5058, + 0x5058, 0x5058, 0x5058, 0x5059, 0x5059, 0x5059, 0x5059, 0x5059, + 0x505a, 0x505a, 0x505a, 0x505a, 0x505a, 0x505b, 0x505b, 0x505b, + 0x505b, 0x505c, 0x505c, 0x505c, 0x505c, 0x505c, 0x505d, 0x505d, + 0x505d, 0x505d, 0x505d, 0x505e, 0x505e, 0x505e, 0x505e, 0x505e, + 0x505f, 0x505f, 0x505f, 0x505f, 0x505f, 0x5060, 0x5060, 0x5060, + 0x5060, 0x5060, 0x5061, 0x5061, 0x5061, 0x5061, 0x5061, 0x5062, + 0x5062, 0x5062, 0x5062, 0x5062, 0x5063, 0x5063, 0x5063, 0x5063, + 0x5063, 0x5064, 0x5064, 0x5064, 0x5064, 0x5064, 0x5065, 0x5065, + 0x5065, 0x5065, 0x5065, 0x5066, 0x5066, 0x5066, 0x5066, 0x5066, + 0x5067, 0x5067, 0x5067, 0x5067, 0x5067, 0x5068, 0x5068, 0x5068, + 0x5068, 0x5068, 0x5069, 0x5069, 0x5069, 0x5069, 0x5069, 0x5069, + 0x506a, 0x506a, 0x506a, 0x506a, 0x506a, 0x506b, 0x506b, 0x506b, + 0x506b, 0x506b, 0x506c, 0x506c, 0x506c, 0x506c, 0x506c, 0x506d, + 0x506d, 0x506d, 0x506d, 0x506d, 0x506e, 0x506e, 0x506e, 0x506e, + 0x506e, 0x506e, 0x506f, 0x506f, 0x506f, 0x506f, 0x506f, 0x5070, + 0x5070, 0x5070, 0x5070, 0x5070, 0x5071, 0x5071, 0x5071, 0x5071, + 0x5071, 0x5072, 0x5072, 0x5072, 0x5072, 0x5072, 0x5072, 0x5073, + 0x5073, 0x5073, 0x5073, 0x5073, 0x5074, 0x5074, 0x5074, 0x5074, + 0x5074, 0x5074, 0x5075, 0x5075, 0x5075, 0x5075, 0x5075, 0x5076, + 0x5076, 0x5076, 0x5076, 0x5076, 0x5077, 0x5077, 0x5077, 0x5077, + 0x5077, 0x5077, 0x5078, 0x5078, 0x5078, 0x5078, 0x5078, 0x5079, + 0x5079, 0x5079, 0x5079, 0x5079, 0x5079, 0x507a, 0x507a, 0x507a, + 0x507a, 0x507a, 0x507b, 0x507b, 0x507b, 0x507b, 0x507b, 0x507b, + 0x507c, 0x507c, 0x507c, 0x507c, 0x507c, 0x507d, 0x507d, 0x507d, + 0x507d, 0x507d, 0x507d, 0x507e, 0x507e, 0x507e, 0x507e, 0x507e, + 0x507f, 0x507f, 0x507f, 0x507f, 0x507f, 0x507f, 0x5080, 0x5080, + 0x5080, 0x5080, 0x5080, 0x5080, 0x5081, 0x5081, 0x5081, 0x5081, + 0x5081, 0x5082, 0x5082, 0x5082, 0x5082, 0x5082, 0x5082, 0x5083, + 0x5083, 0x5083, 0x5083, 0x5083, 0x5083, 0x5084, 0x5084, 0x5084, + 0x5084, 0x5084, 0x5085, 0x5085, 0x5085, 0x5085, 0x5085, 0x5085, + 0x5086, 0x5086, 0x5086, 0x5086, 0x5086, 0x5086, 0x5087, 0x5087, + 0x5087, 0x5087, 0x5087, 0x5087, 0x5088, 0x5088, 0x5088, 0x5088, + 0x5088, 0x5089, 0x5089, 0x5089, 0x5089, 0x5089, 0x5089, 0x508a, + 0x508a, 0x508a, 0x508a, 0x508a, 0x508a, 0x508b, 0x508b, 0x508b, + 0x508b, 0x508b, 0x508b, 0x508c, 0x508c, 0x508c, 0x508c, 0x508c, + 0x508c, 0x508d, 0x508d, 0x508d, 0x508d, 0x508d, 0x508d, 0x508e, + 0x508e, 0x508e, 0x508e, 0x508e, 0x508e, 0x508f, 0x508f, 0x508f, + 0x508f, 0x508f, 0x508f, 0x5090, 0x5090, 0x5090, 0x5090, 0x5090, + 0x5090, 0x5091, 0x5091, 0x5091, 0x5091, 0x5091, 0x5091, 0x5092, + 0x5092, 0x5092, 0x5092, 0x5092, 0x5092, 0x5093, 0x5093, 0x5093, + 0x5093, 0x5093, 0x5093, 0x5094, 0x5094, 0x5094, 0x5094, 0x5094, + 0x5094, 0x5095, 0x5095, 0x5095, 0x5095, 0x5095, 0x5095, 0x5096, + 0x5096, 0x5096, 0x5096, 0x5096, 0x5096, 0x5097, 0x5097, 0x5097, + 0x5097, 0x5097, 0x5097, 0x5098, 0x5098, 0x5098, 0x5098, 0x5098, + 0x5098, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, 0x5099, + 0x509a, 0x509a, 0x509a, 0x509a, 0x509a, 0x509a, 0x509b, 0x509b, + 0x509b, 0x509b, 0x509b, 0x509b, 0x509c, 0x509c, 0x509c, 0x509c, + 0x509c, 0x509c, 0x509d, 0x509d, 0x509d, 0x509d, 0x509d, 0x509d, + 0x509d, 0x509e, 0x509e, 0x509e, 0x509e, 0x509e, 0x509e, 0x509f, + 0x509f, 0x509f, 0x509f, 0x509f, 0x509f, 0x50a0, 0x50a0, 0x50a0, + 0x50a0, 0x50a0, 0x50a0, 0x50a0, 0x50a1, 0x50a1, 0x50a1, 0x50a1, + 0x50a1, 0x50a1, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a2, 0x50a2, + 0x50a2, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a3, 0x50a4, + 0x50a4, 0x50a4, 0x50a4, 0x50a4, 0x50a4, 0x50a5, 0x50a5, 0x50a5, + 0x50a5, 0x50a5, 0x50a5, 0x50a5, 0x50a6, 0x50a6, 0x50a6, 0x50a6, + 0x50a6, 0x50a6, 0x50a6, 0x50a7, 0x50a7, 0x50a7, 0x50a7, 0x50a7, + 0x50a7, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, 0x50a8, + 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50a9, 0x50aa, 0x50aa, + 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50aa, 0x50ab, 0x50ab, 0x50ab, + 0x50ab, 0x50ab, 0x50ab, 0x50ab, 0x50ac, 0x50ac, 0x50ac, 0x50ac, + 0x50ac, 0x50ac, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ad, 0x50ad, + 0x50ad, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, 0x50ae, + 0x50af, 0x50af, 0x50af, 0x50af, 0x50af, 0x50af, 0x50b0, 0x50b0, + 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b0, 0x50b1, 0x50b1, 0x50b1, + 0x50b1, 0x50b1, 0x50b1, 0x50b1, 0x50b2, 0x50b2, 0x50b2, 0x50b2, + 0x50b2, 0x50b2, 0x50b2, 0x50b3, 0x50b3, 0x50b3, 0x50b3, 0x50b3, + 0x50b3, 0x50b3, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b4, 0x50b4, + 0x50b4, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, 0x50b5, + 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b6, 0x50b7, 0x50b7, + 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b7, 0x50b8, 0x50b8, 0x50b8, + 0x50b8, 0x50b8, 0x50b8, 0x50b8, 0x50b9, 0x50b9, 0x50b9, 0x50b9, + 0x50b9, 0x50b9, 0x50b9, 0x50ba, 0x50ba, 0x50ba, 0x50ba, 0x50ba, + 0x50ba, 0x50ba, 0x50ba, 0x50bb, 0x50bb, 0x50bb, 0x50bb, 0x50bb, + 0x50bb, 0x50bb, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bc, 0x50bc, + 0x50bc, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, 0x50bd, + 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50be, 0x50bf, + 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50bf, 0x50c0, 0x50c0, + 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c0, 0x50c1, 0x50c1, 0x50c1, + 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c1, 0x50c2, 0x50c2, 0x50c2, + 0x50c2, 0x50c2, 0x50c2, 0x50c2, 0x50c3, 0x50c3, 0x50c3, 0x50c3, + 0x50c3, 0x50c3, 0x50c3, 0x50c4, 0x50c4, 0x50c4, 0x50c4, 0x50c4, + 0x50c4, 0x50c4, 0x50c4, 0x50c5, 0x50c5, 0x50c5, 0x50c5, 0x50c5, + 0x50c5, 0x50c5, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c6, 0x50c6, + 0x50c6, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, 0x50c7, + 0x50c7, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, 0x50c8, + 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, 0x50c9, + 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50ca, 0x50cb, + 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cb, 0x50cc, + 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cc, 0x50cd, 0x50cd, + 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50cd, 0x50ce, 0x50ce, + 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50ce, 0x50cf, 0x50cf, + 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50cf, 0x50d0, 0x50d0, 0x50d0, + 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d0, 0x50d1, 0x50d1, 0x50d1, + 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d1, 0x50d2, 0x50d2, 0x50d2, + 0x50d2, 0x50d2, 0x50d2, 0x50d2, 0x50d3, 0x50d3, 0x50d3, 0x50d3, + 0x50d3, 0x50d3, 0x50d3, 0x50d3, 0x50d4, 0x50d4, 0x50d4, 0x50d4, + 0x50d4, 0x50d4, 0x50d4, 0x50d4, 0x50d5, 0x50d5, 0x50d5, 0x50d5, + 0x50d5, 0x50d5, 0x50d5, 0x50d5, 0x50d6, 0x50d6, 0x50d6, 0x50d6, + 0x50d6, 0x50d6, 0x50d6, 0x50d6, 0x50d7, 0x50d7, 0x50d7, 0x50d7, + 0x50d7, 0x50d7, 0x50d7, 0x50d7, 0x50d8, 0x50d8, 0x50d8, 0x50d8, + 0x50d8, 0x50d8, 0x50d8, 0x50d8, 0x50d9, 0x50d9, 0x50d9, 0x50d9, + 0x50d9, 0x50d9, 0x50d9, 0x50d9, 0x50da, 0x50da, 0x50da, 0x50da, + 0x50da, 0x50da, 0x50db, 0x50db, 0x50db, 0x50db, 0x50dc, 0x50dc, + 0x50dc, 0x50dc, 0x50dd, 0x50dd, 0x50dd, 0x50dd, 0x50de, 0x50de, + 0x50de, 0x50de, 0x50df, 0x50df, 0x50df, 0x50df, 0x50e0, 0x50e0, + 0x50e0, 0x50e0, 0x50e1, 0x50e1, 0x50e1, 0x50e1, 0x50e2, 0x50e2, + 0x50e2, 0x50e2, 0x50e2, 0x50e3, 0x50e3, 0x50e3, 0x50e3, 0x50e4, + 0x50e4, 0x50e4, 0x50e4, 0x50e5, 0x50e5, 0x50e5, 0x50e5, 0x50e6, + 0x50e6, 0x50e6, 0x50e6, 0x50e7, 0x50e7, 0x50e7, 0x50e7, 0x50e8, + 0x50e8, 0x50e8, 0x50e8, 0x50e8, 0x50e9, 0x50e9, 0x50e9, 0x50e9, + 0x50ea, 0x50ea, 0x50ea, 0x50ea, 0x50eb, 0x50eb, 0x50eb, 0x50eb, + 0x50ec, 0x50ec, 0x50ec, 0x50ec, 0x50ec, 0x50ed, 0x50ed, 0x50ed, + 0x50ed, 0x50ee, 0x50ee, 0x50ee, 0x50ee, 0x50ef, 0x50ef, 0x50ef, + 0x50ef, 0x50ef, 0x50f0, 0x50f0, 0x50f0, 0x50f0, 0x50f1, 0x50f1, + 0x50f1, 0x50f1, 0x50f2, 0x50f2, 0x50f2, 0x50f2, 0x50f2, 0x50f3, + 0x50f3, 0x50f3, 0x50f3, 0x50f4, 0x50f4, 0x50f4, 0x50f4, 0x50f4, + 0x50f5, 0x50f5, 0x50f5, 0x50f5, 0x50f6, 0x50f6, 0x50f6, 0x50f6, + 0x50f6, 0x50f7, 0x50f7, 0x50f7, 0x50f7, 0x50f8, 0x50f8, 0x50f8, + 0x50f8, 0x50f8, 0x50f9, 0x50f9, 0x50f9, 0x50f9, 0x50fa, 0x50fa, + 0x50fa, 0x50fa, 0x50fa, 0x50fb, 0x50fb, 0x50fb, 0x50fb, 0x50fc, + 0x50fc, 0x50fc, 0x50fc, 0x50fc, 0x50fd, 0x50fd, 0x50fd, 0x50fd, + 0x50fe, 0x50fe, 0x50fe, 0x50fe, 0x50fe, 0x50ff, 0x50ff, 0x50ff, + 0x50ff, 0x5100, 0x5100, 0x5100, 0x5100, 0x5100, 0x5101, 0x5101, + 0x5101, 0x5101, 0x5101, 0x5102, 0x5102, 0x5102, 0x5102, 0x5103, + 0x5103, 0x5103, 0x5103, 0x5103, 0x5104, 0x5104, 0x5104, 0x5104, + 0x5104, 0x5105, 0x5105, 0x5105, 0x5105, 0x5105, 0x5106, 0x5106, + 0x5106, 0x5106, 0x5107, 0x5107, 0x5107, 0x5107, 0x5107, 0x5108, + 0x5108, 0x5108, 0x5108, 0x5108, 0x5109, 0x5109, 0x5109, 0x5109, + 0x5109, 0x510a, 0x510a, 0x510a, 0x510a, 0x510a, 0x510b, 0x510b, + 0x510b, 0x510b, 0x510c, 0x510c, 0x510c, 0x510c, 0x510c, 0x510d, + 0x510d, 0x510d, 0x510d, 0x510d, 0x510e, 0x510e, 0x510e, 0x510e, + 0x510e, 0x510f, 0x510f, 0x510f, 0x510f, 0x510f, 0x5110, 0x5110, + 0x5110, 0x5110, 0x5110, 0x5111, 0x5111, 0x5111, 0x5111, 0x5111, + 0x5112, 0x5112, 0x5112, 0x5112, 0x5112, 0x5113, 0x5113, 0x5113, + 0x5113, 0x5113, 0x5114, 0x5114, 0x5114, 0x5114, 0x5114, 0x5115, + 0x5115, 0x5115, 0x5115, 0x5115, 0x5116, 0x5116, 0x5116, 0x5116, + 0x5116, 0x5117, 0x5117, 0x5117, 0x5117, 0x5117, 0x5118, 0x5118, + 0x5118, 0x5118, 0x5118, 0x5119, 0x5119, 0x5119, 0x5119, 0x5119, + 0x511a, 0x511a, 0x511a, 0x511a, 0x511a, 0x511b, 0x511b, 0x511b, + 0x511b, 0x511b, 0x511c, 0x511c, 0x511c, 0x511c, 0x511c, 0x511c, + 0x511d, 0x511d, 0x511d, 0x511d, 0x511d, 0x511e, 0x511e, 0x511e, + 0x511e, 0x511e, 0x511f, 0x511f, 0x511f, 0x511f, 0x511f, 0x5120, + 0x5120, 0x5120, 0x5120, 0x5120, 0x5120, 0x5121, 0x5121, 0x5121, + 0x5121, 0x5121, 0x5122, 0x5122, 0x5122, 0x5122, 0x5122, 0x5123, + 0x5123, 0x5123, 0x5123, 0x5123, 0x5124, 0x5124, 0x5124, 0x5124, + 0x5124, 0x5124, 0x5125, 0x5125, 0x5125, 0x5125, 0x5125, 0x5126, + 0x5126, 0x5126, 0x5126, 0x5126, 0x5127, 0x5127, 0x5127, 0x5127, + 0x5127, 0x5127, 0x5128, 0x5128, 0x5128, 0x5128, 0x5128, 0x5129, + 0x5129, 0x5129, 0x5129, 0x5129, 0x5129, 0x512a, 0x512a, 0x512a, + 0x512a, 0x512a, 0x512b, 0x512b, 0x512b, 0x512b, 0x512b, 0x512b, + 0x512c, 0x512c, 0x512c, 0x512c, 0x512c, 0x512d, 0x512d, 0x512d, + 0x512d, 0x512d, 0x512d, 0x512e, 0x512e, 0x512e, 0x512e, 0x512e, + 0x512f, 0x512f, 0x512f, 0x512f, 0x512f, 0x512f, 0x5130, 0x5130, + 0x5130, 0x5130, 0x5130, 0x5131, 0x5131, 0x5131, 0x5131, 0x5131, + 0x5131, 0x5132, 0x5132, 0x5132, 0x5132, 0x5132, 0x5132, 0x5133, + 0x5133, 0x5133, 0x5133, 0x5133, 0x5134, 0x5134, 0x5134, 0x5134, + 0x5134, 0x5134, 0x5135, 0x5135, 0x5135, 0x5135, 0x5135, 0x5135, + 0x5136, 0x5136, 0x5136, 0x5136, 0x5136, 0x5137, 0x5137, 0x5137, + 0x5137, 0x5137, 0x5137, 0x5138, 0x5138, 0x5138, 0x5138, 0x5138, + 0x5138, 0x5139, 0x5139, 0x5139, 0x5139, 0x5139, 0x5139, 0x513a, + 0x513a, 0x513a, 0x513a, 0x513a, 0x513a, 0x513b, 0x513b, 0x513b, + 0x513b, 0x513b, 0x513c, 0x513c, 0x513c, 0x513c, 0x513c, 0x513c, + 0x513d, 0x513d, 0x513d, 0x513d, 0x513d, 0x513d, 0x513e, 0x513e, + 0x513e, 0x513e, 0x513e, 0x513e, 0x513f, 0x513f, 0x513f, 0x513f, + 0x513f, 0x513f, 0x5140, 0x5140, 0x5140, 0x5140, 0x5140, 0x5140, + 0x5141, 0x5141, 0x5141, 0x5141, 0x5141, 0x5141, 0x5142, 0x5142, + 0x5142, 0x5142, 0x5142, 0x5142, 0x5143, 0x5143, 0x5143, 0x5143, + 0x5143, 0x5143, 0x5144, 0x5144, 0x5144, 0x5144, 0x5144, 0x5144, + 0x5145, 0x5145, 0x5145, 0x5145, 0x5145, 0x5145, 0x5146, 0x5146, + 0x5146, 0x5146, 0x5146, 0x5146, 0x5147, 0x5147, 0x5147, 0x5147, + 0x5147, 0x5147, 0x5148, 0x5148, 0x5148, 0x5148, 0x5148, 0x5148, + 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x5149, 0x514a, + 0x514a, 0x514a, 0x514a, 0x514a, 0x514a, 0x514b, 0x514b, 0x514b, + 0x514b, 0x514b, 0x514b, 0x514c, 0x514c, 0x514c, 0x514c, 0x514c, + 0x514c, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, 0x514d, + 0x514e, 0x514e, 0x514e, 0x514e, 0x514e, 0x514e, 0x514f, 0x514f, + 0x514f, 0x514f, 0x514f, 0x514f, 0x5150, 0x5150, 0x5150, 0x5150, + 0x5150, 0x5150, 0x5150, 0x5151, 0x5151, 0x5151, 0x5151, 0x5151, + 0x5151, 0x5152, 0x5152, 0x5152, 0x5152, 0x5152, 0x5152, 0x5153, + 0x5153, 0x5153, 0x5153, 0x5153, 0x5153, 0x5153, 0x5154, 0x5154, + 0x5154, 0x5154, 0x5154, 0x5154, 0x5155, 0x5155, 0x5155, 0x5155, + 0x5155, 0x5155, 0x5155, 0x5156, 0x5156, 0x5156, 0x5156, 0x5156, + 0x5156, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, 0x5157, + 0x5158, 0x5158, 0x5158, 0x5158, 0x5158, 0x5158, 0x5159, 0x5159, + 0x5159, 0x5159, 0x5159, 0x5159, 0x5159, 0x515a, 0x515a, 0x515a, + 0x515a, 0x515a, 0x515a, 0x515b, 0x515b, 0x515b, 0x515b, 0x515b, + 0x515b, 0x515b, 0x515c, 0x515c, 0x515c, 0x515c, 0x515c, 0x515c, + 0x515c, 0x515d, 0x515d, 0x515d, 0x515d, 0x515d, 0x515d, 0x515e, + 0x515e, 0x515e, 0x515e, 0x515e, 0x515e, 0x515e, 0x515f, 0x515f, + 0x515f, 0x515f, 0x515f, 0x515f, 0x515f, 0x5160, 0x5160, 0x5160, + 0x5160, 0x5160, 0x5160, 0x5161, 0x5161, 0x5161, 0x5161, 0x5161, + 0x5161, 0x5161, 0x5162, 0x5162, 0x5162, 0x5162, 0x5162, 0x5162, + 0x5162, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, 0x5163, + 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5164, 0x5165, + 0x5165, 0x5165, 0x5165, 0x5165, 0x5165, 0x5165, 0x5166, 0x5166, + 0x5166, 0x5166, 0x5166, 0x5166, 0x5167, 0x5167, 0x5167, 0x5167, + 0x5167, 0x5167, 0x5167, 0x5168, 0x5168, 0x5168, 0x5168, 0x5168, + 0x5168, 0x5168, 0x5169, 0x5169, 0x5169, 0x5169, 0x5169, 0x5169, + 0x5169, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, 0x516a, + 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516b, 0x516c, + 0x516c, 0x516c, 0x516c, 0x516c, 0x516c, 0x516c, 0x516d, 0x516d, + 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516d, 0x516e, 0x516e, + 0x516e, 0x516e, 0x516e, 0x516e, 0x516e, 0x516f, 0x516f, 0x516f, + 0x516f, 0x516f, 0x516f, 0x516f, 0x5170, 0x5170, 0x5170, 0x5170, + 0x5170, 0x5170, 0x5170, 0x5171, 0x5171, 0x5171, 0x5171, 0x5171, + 0x5171, 0x5171, 0x5172, 0x5172, 0x5172, 0x5172, 0x5172, 0x5172, + 0x5172, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, 0x5173, + 0x5173, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, 0x5174, + 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5175, 0x5176, + 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5176, 0x5177, + 0x5177, 0x5177, 0x5177, 0x5177, 0x5177, 0x5177, 0x5178, 0x5178, + 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5178, 0x5179, 0x5179, + 0x5179, 0x5179, 0x5179, 0x5179, 0x5179, 0x517a, 0x517a, 0x517a, + 0x517a, 0x517a, 0x517a, 0x517a, 0x517b, 0x517b, 0x517b, 0x517b, + 0x517b, 0x517b, 0x517b, 0x517b, 0x517c, 0x517c, 0x517c, 0x517c, + 0x517c, 0x517c, 0x517c, 0x517d, 0x517d, 0x517d, 0x517d, 0x517d, + 0x517d, 0x517d, 0x517d, 0x517e, 0x517e, 0x517e, 0x517e, 0x517e, + 0x517e, 0x517e, 0x517e, 0x517f, 0x517f, 0x517f, 0x517f, 0x517f, + 0x517f, 0x517f, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, 0x5180, + 0x5180, 0x5180, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, 0x5181, + 0x5181, 0x5181, 0x5182, 0x5182, 0x5182, 0x5182, 0x5182, 0x5182, + 0x5182, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, 0x5183, + 0x5183, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, 0x5184, + 0x5184, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, 0x5185, + 0x5185, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, 0x5186, + 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, 0x5187, + 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, 0x5188, + 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, 0x5189, + 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, 0x518a, + 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, 0x518b, + 0x518c, 0x518c, 0x518c, 0x518c, 0x518d, 0x518d, 0x518d, 0x518d, + 0x518e, 0x518e, 0x518e, 0x518e, 0x518f, 0x518f, 0x518f, 0x518f, + 0x5190, 0x5190, 0x5190, 0x5190, 0x5191, 0x5191, 0x5191, 0x5191, + 0x5191, 0x5192, 0x5192, 0x5192, 0x5192, 0x5193, 0x5193, 0x5193, + 0x5193, 0x5194, 0x5194, 0x5194, 0x5194, 0x5195, 0x5195, 0x5195, + 0x5195, 0x5196, 0x5196, 0x5196, 0x5196, 0x5197, 0x5197, 0x5197, + 0x5197, 0x5198, 0x5198, 0x5198, 0x5198, 0x5198, 0x5199, 0x5199, + 0x5199, 0x5199, 0x519a, 0x519a, 0x519a, 0x519a, 0x519b, 0x519b, + 0x519b, 0x519b, 0x519c, 0x519c, 0x519c, 0x519c, 0x519c, 0x519d, + 0x519d, 0x519d, 0x519d, 0x519e, 0x519e, 0x519e, 0x519e, 0x519f, + 0x519f, 0x519f, 0x519f, 0x51a0, 0x51a0, 0x51a0, 0x51a0, 0x51a0, + 0x51a1, 0x51a1, 0x51a1, 0x51a1, 0x51a2, 0x51a2, 0x51a2, 0x51a2, + 0x51a3, 0x51a3, 0x51a3, 0x51a3, 0x51a3, 0x51a4, 0x51a4, 0x51a4, + 0x51a4, 0x51a5, 0x51a5, 0x51a5, 0x51a5, 0x51a5, 0x51a6, 0x51a6, + 0x51a6, 0x51a6, 0x51a7, 0x51a7, 0x51a7, 0x51a7, 0x51a7, 0x51a8, + 0x51a8, 0x51a8, 0x51a8, 0x51a9, 0x51a9, 0x51a9, 0x51a9, 0x51a9, + 0x51aa, 0x51aa, 0x51aa, 0x51aa, 0x51ab, 0x51ab, 0x51ab, 0x51ab, + 0x51ab, 0x51ac, 0x51ac, 0x51ac, 0x51ac, 0x51ad, 0x51ad, 0x51ad, + 0x51ad, 0x51ad, 0x51ae, 0x51ae, 0x51ae, 0x51ae, 0x51af, 0x51af, + 0x51af, 0x51af, 0x51af, 0x51b0, 0x51b0, 0x51b0, 0x51b0, 0x51b1, + 0x51b1, 0x51b1, 0x51b1, 0x51b1, 0x51b2, 0x51b2, 0x51b2, 0x51b2, + 0x51b2, 0x51b3, 0x51b3, 0x51b3, 0x51b3, 0x51b4, 0x51b4, 0x51b4, + 0x51b4, 0x51b4, 0x51b5, 0x51b5, 0x51b5, 0x51b5, 0x51b5, 0x51b6, + 0x51b6, 0x51b6, 0x51b6, 0x51b7, 0x51b7, 0x51b7, 0x51b7, 0x51b7, + 0x51b8, 0x51b8, 0x51b8, 0x51b8, 0x51b8, 0x51b9, 0x51b9, 0x51b9, + 0x51b9, 0x51b9, 0x51ba, 0x51ba, 0x51ba, 0x51ba, 0x51ba, 0x51bb, + 0x51bb, 0x51bb, 0x51bb, 0x51bc, 0x51bc, 0x51bc, 0x51bc, 0x51bc, + 0x51bd, 0x51bd, 0x51bd, 0x51bd, 0x51bd, 0x51be, 0x51be, 0x51be, + 0x51be, 0x51be, 0x51bf, 0x51bf, 0x51bf, 0x51bf, 0x51bf, 0x51c0, + 0x51c0, 0x51c0, 0x51c0, 0x51c0, 0x51c1, 0x51c1, 0x51c1, 0x51c1, + 0x51c1, 0x51c2, 0x51c2, 0x51c2, 0x51c2, 0x51c2, 0x51c3, 0x51c3, + 0x51c3, 0x51c3, 0x51c3, 0x51c4, 0x51c4, 0x51c4, 0x51c4, 0x51c4, + 0x51c5, 0x51c5, 0x51c5, 0x51c5, 0x51c5, 0x51c6, 0x51c6, 0x51c6, + 0x51c6, 0x51c6, 0x51c7, 0x51c7, 0x51c7, 0x51c7, 0x51c7, 0x51c8, + 0x51c8, 0x51c8, 0x51c8, 0x51c8, 0x51c9, 0x51c9, 0x51c9, 0x51c9, + 0x51c9, 0x51ca, 0x51ca, 0x51ca, 0x51ca, 0x51ca, 0x51cb, 0x51cb, + 0x51cb, 0x51cb, 0x51cb, 0x51cc, 0x51cc, 0x51cc, 0x51cc, 0x51cc, + 0x51cd, 0x51cd, 0x51cd, 0x51cd, 0x51cd, 0x51ce, 0x51ce, 0x51ce, + 0x51ce, 0x51ce, 0x51ce, 0x51cf, 0x51cf, 0x51cf, 0x51cf, 0x51cf, + 0x51d0, 0x51d0, 0x51d0, 0x51d0, 0x51d0, 0x51d1, 0x51d1, 0x51d1, + 0x51d1, 0x51d1, 0x51d2, 0x51d2, 0x51d2, 0x51d2, 0x51d2, 0x51d3, + 0x51d3, 0x51d3, 0x51d3, 0x51d3, 0x51d3, 0x51d4, 0x51d4, 0x51d4, + 0x51d4, 0x51d4, 0x51d5, 0x51d5, 0x51d5, 0x51d5, 0x51d5, 0x51d6, + 0x51d6, 0x51d6, 0x51d6, 0x51d6, 0x51d6, 0x51d7, 0x51d7, 0x51d7, + 0x51d7, 0x51d7, 0x51d8, 0x51d8, 0x51d8, 0x51d8, 0x51d8, 0x51d9, + 0x51d9, 0x51d9, 0x51d9, 0x51d9, 0x51d9, 0x51da, 0x51da, 0x51da, + 0x51da, 0x51da, 0x51db, 0x51db, 0x51db, 0x51db, 0x51db, 0x51db, + 0x51dc, 0x51dc, 0x51dc, 0x51dc, 0x51dc, 0x51dd, 0x51dd, 0x51dd, + 0x51dd, 0x51dd, 0x51dd, 0x51de, 0x51de, 0x51de, 0x51de, 0x51de, + 0x51df, 0x51df, 0x51df, 0x51df, 0x51df, 0x51df, 0x51e0, 0x51e0, + 0x51e0, 0x51e0, 0x51e0, 0x51e1, 0x51e1, 0x51e1, 0x51e1, 0x51e1, + 0x51e1, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e2, 0x51e3, + 0x51e3, 0x51e3, 0x51e3, 0x51e3, 0x51e4, 0x51e4, 0x51e4, 0x51e4, + 0x51e4, 0x51e4, 0x51e5, 0x51e5, 0x51e5, 0x51e5, 0x51e5, 0x51e5, + 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e7, 0x51e7, 0x51e7, + 0x51e7, 0x51e7, 0x51e7, 0x51e8, 0x51e8, 0x51e8, 0x51e8, 0x51e8, + 0x51e8, 0x51e9, 0x51e9, 0x51e9, 0x51e9, 0x51e9, 0x51ea, 0x51ea, + 0x51ea, 0x51ea, 0x51ea, 0x51ea, 0x51eb, 0x51eb, 0x51eb, 0x51eb, + 0x51eb, 0x51eb, 0x51ec, 0x51ec, 0x51ec, 0x51ec, 0x51ec, 0x51ec, + 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ed, 0x51ee, 0x51ee, + 0x51ee, 0x51ee, 0x51ee, 0x51ee, 0x51ef, 0x51ef, 0x51ef, 0x51ef, + 0x51ef, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f0, 0x51f1, + 0x51f1, 0x51f1, 0x51f1, 0x51f1, 0x51f1, 0x51f2, 0x51f2, 0x51f2, + 0x51f2, 0x51f2, 0x51f2, 0x51f3, 0x51f3, 0x51f3, 0x51f3, 0x51f3, + 0x51f3, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f4, 0x51f5, + 0x51f5, 0x51f5, 0x51f5, 0x51f5, 0x51f5, 0x51f6, 0x51f6, 0x51f6, + 0x51f6, 0x51f6, 0x51f6, 0x51f7, 0x51f7, 0x51f7, 0x51f7, 0x51f7, + 0x51f7, 0x51f7, 0x51f8, 0x51f8, 0x51f8, 0x51f8, 0x51f8, 0x51f8, + 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51f9, 0x51fa, 0x51fa, + 0x51fa, 0x51fa, 0x51fa, 0x51fa, 0x51fb, 0x51fb, 0x51fb, 0x51fb, + 0x51fb, 0x51fb, 0x51fc, 0x51fc, 0x51fc, 0x51fc, 0x51fc, 0x51fc, + 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fd, 0x51fe, + 0x51fe, 0x51fe, 0x51fe, 0x51fe, 0x51fe, 0x51ff, 0x51ff, 0x51ff, + 0x51ff, 0x51ff, 0x51ff, 0x5200, 0x5200, 0x5200, 0x5200, 0x5200, + 0x5200, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, 0x5201, + 0x5202, 0x5202, 0x5202, 0x5202, 0x5202, 0x5202, 0x5203, 0x5203, + 0x5203, 0x5203, 0x5203, 0x5203, 0x5204, 0x5204, 0x5204, 0x5204, + 0x5204, 0x5204, 0x5204, 0x5205, 0x5205, 0x5205, 0x5205, 0x5205, + 0x5205, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, 0x5206, + 0x5207, 0x5207, 0x5207, 0x5207, 0x5207, 0x5207, 0x5208, 0x5208, + 0x5208, 0x5208, 0x5208, 0x5208, 0x5208, 0x5209, 0x5209, 0x5209, + 0x5209, 0x5209, 0x5209, 0x520a, 0x520a, 0x520a, 0x520a, 0x520a, + 0x520a, 0x520a, 0x520b, 0x520b, 0x520b, 0x520b, 0x520b, 0x520b, + 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520c, 0x520d, + 0x520d, 0x520d, 0x520d, 0x520d, 0x520d, 0x520d, 0x520e, 0x520e, + 0x520e, 0x520e, 0x520e, 0x520e, 0x520f, 0x520f, 0x520f, 0x520f, + 0x520f, 0x520f, 0x520f, 0x5210, 0x5210, 0x5210, 0x5210, 0x5210, + 0x5210, 0x5210, 0x5211, 0x5211, 0x5211, 0x5211, 0x5211, 0x5211, + 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5212, 0x5213, + 0x5213, 0x5213, 0x5213, 0x5213, 0x5213, 0x5213, 0x5214, 0x5214, + 0x5214, 0x5214, 0x5214, 0x5214, 0x5214, 0x5215, 0x5215, 0x5215, + 0x5215, 0x5215, 0x5215, 0x5215, 0x5216, 0x5216, 0x5216, 0x5216, + 0x5216, 0x5216, 0x5217, 0x5217, 0x5217, 0x5217, 0x5217, 0x5217, + 0x5217, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, 0x5218, + 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x5219, 0x521a, + 0x521a, 0x521a, 0x521a, 0x521a, 0x521a, 0x521a, 0x521b, 0x521b, + 0x521b, 0x521b, 0x521b, 0x521b, 0x521b, 0x521c, 0x521c, 0x521c, + 0x521c, 0x521c, 0x521c, 0x521c, 0x521d, 0x521d, 0x521d, 0x521d, + 0x521d, 0x521d, 0x521d, 0x521e, 0x521e, 0x521e, 0x521e, 0x521e, + 0x521e, 0x521e, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, 0x521f, + 0x521f, 0x521f, 0x5220, 0x5220, 0x5220, 0x5220, 0x5220, 0x5220, + 0x5220, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, 0x5221, + 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5222, 0x5223, + 0x5223, 0x5223, 0x5223, 0x5223, 0x5223, 0x5223, 0x5224, 0x5224, + 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5224, 0x5225, 0x5225, + 0x5225, 0x5225, 0x5225, 0x5225, 0x5225, 0x5226, 0x5226, 0x5226, + 0x5226, 0x5226, 0x5226, 0x5226, 0x5227, 0x5227, 0x5227, 0x5227, + 0x5227, 0x5227, 0x5227, 0x5228, 0x5228, 0x5228, 0x5228, 0x5228, + 0x5228, 0x5228, 0x5228, 0x5229, 0x5229, 0x5229, 0x5229, 0x5229, + 0x5229, 0x5229, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, 0x522a, + 0x522a, 0x522a, 0x522b, 0x522b, 0x522b, 0x522b, 0x522b, 0x522b, + 0x522b, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, 0x522c, + 0x522c, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, 0x522d, + 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, 0x522e, + 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x522f, 0x5230, + 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5230, 0x5231, + 0x5231, 0x5231, 0x5231, 0x5231, 0x5231, 0x5231, 0x5232, 0x5232, + 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5232, 0x5233, 0x5233, + 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5233, 0x5234, 0x5234, + 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5234, 0x5235, 0x5235, + 0x5235, 0x5235, 0x5235, 0x5235, 0x5235, 0x5236, 0x5236, 0x5236, + 0x5236, 0x5236, 0x5236, 0x5236, 0x5236, 0x5237, 0x5237, 0x5237, + 0x5237, 0x5237, 0x5237, 0x5237, 0x5237, 0x5238, 0x5238, 0x5238, + 0x5238, 0x5238, 0x5238, 0x5238, 0x5238, 0x5239, 0x5239, 0x5239, + 0x5239, 0x5239, 0x5239, 0x5239, 0x5239, 0x523a, 0x523a, 0x523a, + 0x523a, 0x523a, 0x523a, 0x523a, 0x523a, 0x523b, 0x523b, 0x523b, + 0x523b, 0x523b, 0x523b, 0x523b, 0x523c, 0x523c, 0x523c, 0x523c, + 0x523c, 0x523c, 0x523c, 0x523c, 0x523d, 0x523d, 0x523d, 0x523d, + 0x523d, 0x523d, 0x523e, 0x523e, 0x523e, 0x523e, 0x523f, 0x523f, + 0x523f, 0x523f, 0x523f, 0x5240, 0x5240, 0x5240, 0x5240, 0x5241, + 0x5241, 0x5241, 0x5241, 0x5242, 0x5242, 0x5242, 0x5242, 0x5243, + 0x5243, 0x5243, 0x5243, 0x5244, 0x5244, 0x5244, 0x5244, 0x5245, + 0x5245, 0x5245, 0x5245, 0x5246, 0x5246, 0x5246, 0x5246, 0x5247, + 0x5247, 0x5247, 0x5247, 0x5248, 0x5248, 0x5248, 0x5248, 0x5248, + 0x5249, 0x5249, 0x5249, 0x5249, 0x524a, 0x524a, 0x524a, 0x524a, + 0x524b, 0x524b, 0x524b, 0x524b, 0x524c, 0x524c, 0x524c, 0x524c, + 0x524d, 0x524d, 0x524d, 0x524d, 0x524d, 0x524e, 0x524e, 0x524e, + 0x524e, 0x524f, 0x524f, 0x524f, 0x524f, 0x5250, 0x5250, 0x5250, + 0x5250, 0x5251, 0x5251, 0x5251, 0x5251, 0x5251, 0x5252, 0x5252, + 0x5252, 0x5252, 0x5253, 0x5253, 0x5253, 0x5253, 0x5253, 0x5254, + 0x5254, 0x5254, 0x5254, 0x5255, 0x5255, 0x5255, 0x5255, 0x5256, + 0x5256, 0x5256, 0x5256, 0x5256, 0x5257, 0x5257, 0x5257, 0x5257, + 0x5258, 0x5258, 0x5258, 0x5258, 0x5258, 0x5259, 0x5259, 0x5259, + 0x5259, 0x525a, 0x525a, 0x525a, 0x525a, 0x525a, 0x525b, 0x525b, + 0x525b, 0x525b, 0x525c, 0x525c, 0x525c, 0x525c, 0x525c, 0x525d, + 0x525d, 0x525d, 0x525d, 0x525e, 0x525e, 0x525e, 0x525e, 0x525e, + 0x525f, 0x525f, 0x525f, 0x525f, 0x5260, 0x5260, 0x5260, 0x5260, + 0x5260, 0x5261, 0x5261, 0x5261, 0x5261, 0x5262, 0x5262, 0x5262, + 0x5262, 0x5262, 0x5263, 0x5263, 0x5263, 0x5263, 0x5263, 0x5264, + 0x5264, 0x5264, 0x5264, 0x5265, 0x5265, 0x5265, 0x5265, 0x5265, + 0x5266, 0x5266, 0x5266, 0x5266, 0x5266, 0x5267, 0x5267, 0x5267, + 0x5267, 0x5268, 0x5268, 0x5268, 0x5268, 0x5268, 0x5269, 0x5269, + 0x5269, 0x5269, 0x5269, 0x526a, 0x526a, 0x526a, 0x526a, 0x526a, + 0x526b, 0x526b, 0x526b, 0x526b, 0x526c, 0x526c, 0x526c, 0x526c, + 0x526c, 0x526d, 0x526d, 0x526d, 0x526d, 0x526d, 0x526e, 0x526e, + 0x526e, 0x526e, 0x526e, 0x526f, 0x526f, 0x526f, 0x526f, 0x526f, + 0x5270, 0x5270, 0x5270, 0x5270, 0x5270, 0x5271, 0x5271, 0x5271, + 0x5271, 0x5271, 0x5272, 0x5272, 0x5272, 0x5272, 0x5273, 0x5273, + 0x5273, 0x5273, 0x5273, 0x5274, 0x5274, 0x5274, 0x5274, 0x5274, + 0x5275, 0x5275, 0x5275, 0x5275, 0x5275, 0x5276, 0x5276, 0x5276, + 0x5276, 0x5276, 0x5277, 0x5277, 0x5277, 0x5277, 0x5277, 0x5278, + 0x5278, 0x5278, 0x5278, 0x5278, 0x5279, 0x5279, 0x5279, 0x5279, + 0x5279, 0x527a, 0x527a, 0x527a, 0x527a, 0x527a, 0x527a, 0x527b, + 0x527b, 0x527b, 0x527b, 0x527b, 0x527c, 0x527c, 0x527c, 0x527c, + 0x527c, 0x527d, 0x527d, 0x527d, 0x527d, 0x527d, 0x527e, 0x527e, + 0x527e, 0x527e, 0x527e, 0x527f, 0x527f, 0x527f, 0x527f, 0x527f, + 0x5280, 0x5280, 0x5280, 0x5280, 0x5280, 0x5281, 0x5281, 0x5281, + 0x5281, 0x5281, 0x5281, 0x5282, 0x5282, 0x5282, 0x5282, 0x5282, + 0x5283, 0x5283, 0x5283, 0x5283, 0x5283, 0x5284, 0x5284, 0x5284, + 0x5284, 0x5284, 0x5285, 0x5285, 0x5285, 0x5285, 0x5285, 0x5285, + 0x5286, 0x5286, 0x5286, 0x5286, 0x5286, 0x5287, 0x5287, 0x5287, + 0x5287, 0x5287, 0x5288, 0x5288, 0x5288, 0x5288, 0x5288, 0x5288, + 0x5289, 0x5289, 0x5289, 0x5289, 0x5289, 0x528a, 0x528a, 0x528a, + 0x528a, 0x528a, 0x528b, 0x528b, 0x528b, 0x528b, 0x528b, 0x528b, + 0x528c, 0x528c, 0x528c, 0x528c, 0x528c, 0x528d, 0x528d, 0x528d, + 0x528d, 0x528d, 0x528d, 0x528e, 0x528e, 0x528e, 0x528e, 0x528e, + 0x528f, 0x528f, 0x528f, 0x528f, 0x528f, 0x528f, 0x5290, 0x5290, + 0x5290, 0x5290, 0x5290, 0x5291, 0x5291, 0x5291, 0x5291, 0x5291, + 0x5291, 0x5292, 0x5292, 0x5292, 0x5292, 0x5292, 0x5293, 0x5293, + 0x5293, 0x5293, 0x5293, 0x5293, 0x5294, 0x5294, 0x5294, 0x5294, + 0x5294, 0x5294, 0x5295, 0x5295, 0x5295, 0x5295, 0x5295, 0x5296, + 0x5296, 0x5296, 0x5296, 0x5296, 0x5296, 0x5297, 0x5297, 0x5297, + 0x5297, 0x5297, 0x5297, 0x5298, 0x5298, 0x5298, 0x5298, 0x5298, + 0x5299, 0x5299, 0x5299, 0x5299, 0x5299, 0x5299, 0x529a, 0x529a, + 0x529a, 0x529a, 0x529a, 0x529a, 0x529b, 0x529b, 0x529b, 0x529b, + 0x529b, 0x529b, 0x529c, 0x529c, 0x529c, 0x529c, 0x529c, 0x529d, + 0x529d, 0x529d, 0x529d, 0x529d, 0x529d, 0x529e, 0x529e, 0x529e, + 0x529e, 0x529e, 0x529e, 0x529f, 0x529f, 0x529f, 0x529f, 0x529f, + 0x529f, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a0, 0x52a1, + 0x52a1, 0x52a1, 0x52a1, 0x52a1, 0x52a1, 0x52a2, 0x52a2, 0x52a2, + 0x52a2, 0x52a2, 0x52a2, 0x52a3, 0x52a3, 0x52a3, 0x52a3, 0x52a3, + 0x52a3, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a4, 0x52a5, + 0x52a5, 0x52a5, 0x52a5, 0x52a5, 0x52a5, 0x52a6, 0x52a6, 0x52a6, + 0x52a6, 0x52a6, 0x52a6, 0x52a7, 0x52a7, 0x52a7, 0x52a7, 0x52a7, + 0x52a7, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a8, 0x52a9, + 0x52a9, 0x52a9, 0x52a9, 0x52a9, 0x52a9, 0x52aa, 0x52aa, 0x52aa, + 0x52aa, 0x52aa, 0x52aa, 0x52ab, 0x52ab, 0x52ab, 0x52ab, 0x52ab, + 0x52ab, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ac, 0x52ad, + 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ad, 0x52ae, 0x52ae, + 0x52ae, 0x52ae, 0x52ae, 0x52ae, 0x52af, 0x52af, 0x52af, 0x52af, + 0x52af, 0x52af, 0x52b0, 0x52b0, 0x52b0, 0x52b0, 0x52b0, 0x52b0, + 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b1, 0x52b2, + 0x52b2, 0x52b2, 0x52b2, 0x52b2, 0x52b2, 0x52b3, 0x52b3, 0x52b3, + 0x52b3, 0x52b3, 0x52b3, 0x52b4, 0x52b4, 0x52b4, 0x52b4, 0x52b4, + 0x52b4, 0x52b4, 0x52b5, 0x52b5, 0x52b5, 0x52b5, 0x52b5, 0x52b5, + 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b6, 0x52b7, 0x52b7, + 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b7, 0x52b8, 0x52b8, 0x52b8, + 0x52b8, 0x52b8, 0x52b8, 0x52b9, 0x52b9, 0x52b9, 0x52b9, 0x52b9, + 0x52b9, 0x52b9, 0x52ba, 0x52ba, 0x52ba, 0x52ba, 0x52ba, 0x52ba, + 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bb, 0x52bc, + 0x52bc, 0x52bc, 0x52bc, 0x52bc, 0x52bc, 0x52bd, 0x52bd, 0x52bd, + 0x52bd, 0x52bd, 0x52bd, 0x52bd, 0x52be, 0x52be, 0x52be, 0x52be, + 0x52be, 0x52be, 0x52be, 0x52bf, 0x52bf, 0x52bf, 0x52bf, 0x52bf, + 0x52bf, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, 0x52c0, + 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c1, 0x52c2, + 0x52c2, 0x52c2, 0x52c2, 0x52c2, 0x52c2, 0x52c3, 0x52c3, 0x52c3, + 0x52c3, 0x52c3, 0x52c3, 0x52c3, 0x52c4, 0x52c4, 0x52c4, 0x52c4, + 0x52c4, 0x52c4, 0x52c4, 0x52c5, 0x52c5, 0x52c5, 0x52c5, 0x52c5, + 0x52c5, 0x52c5, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c6, 0x52c6, + 0x52c6, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c7, 0x52c8, + 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c8, 0x52c9, 0x52c9, + 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52c9, 0x52ca, 0x52ca, 0x52ca, + 0x52ca, 0x52ca, 0x52ca, 0x52ca, 0x52cb, 0x52cb, 0x52cb, 0x52cb, + 0x52cb, 0x52cb, 0x52cb, 0x52cc, 0x52cc, 0x52cc, 0x52cc, 0x52cc, + 0x52cc, 0x52cc, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52cd, 0x52cd, + 0x52cd, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, 0x52ce, + 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52cf, 0x52d0, + 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d0, 0x52d1, 0x52d1, + 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d1, 0x52d2, 0x52d2, 0x52d2, + 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d2, 0x52d3, 0x52d3, 0x52d3, + 0x52d3, 0x52d3, 0x52d3, 0x52d3, 0x52d4, 0x52d4, 0x52d4, 0x52d4, + 0x52d4, 0x52d4, 0x52d4, 0x52d5, 0x52d5, 0x52d5, 0x52d5, 0x52d5, + 0x52d5, 0x52d5, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, 0x52d6, + 0x52d6, 0x52d6, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d7, 0x52d7, + 0x52d7, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, 0x52d8, + 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, 0x52d9, + 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52da, 0x52db, + 0x52db, 0x52db, 0x52db, 0x52db, 0x52db, 0x52db, 0x52dc, 0x52dc, + 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dc, 0x52dd, 0x52dd, + 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52dd, 0x52de, 0x52de, 0x52de, + 0x52de, 0x52de, 0x52de, 0x52de, 0x52de, 0x52df, 0x52df, 0x52df, + 0x52df, 0x52df, 0x52df, 0x52df, 0x52e0, 0x52e0, 0x52e0, 0x52e0, + 0x52e0, 0x52e0, 0x52e0, 0x52e0, 0x52e1, 0x52e1, 0x52e1, 0x52e1, + 0x52e1, 0x52e1, 0x52e1, 0x52e2, 0x52e2, 0x52e2, 0x52e2, 0x52e2, + 0x52e2, 0x52e2, 0x52e2, 0x52e3, 0x52e3, 0x52e3, 0x52e3, 0x52e3, + 0x52e3, 0x52e3, 0x52e3, 0x52e4, 0x52e4, 0x52e4, 0x52e4, 0x52e4, + 0x52e4, 0x52e4, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, 0x52e5, + 0x52e5, 0x52e5, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, 0x52e6, + 0x52e6, 0x52e6, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, 0x52e7, + 0x52e7, 0x52e7, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e8, 0x52e8, + 0x52e8, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, 0x52e9, + 0x52e9, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, 0x52ea, + 0x52ea, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, 0x52eb, + 0x52eb, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, 0x52ec, + 0x52ec, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, 0x52ed, + 0x52ed, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, 0x52ee, + 0x52ee, 0x52ef, 0x52ef, 0x52ef, 0x52ef, 0x52f0, 0x52f0, 0x52f0, + 0x52f0, 0x52f1, 0x52f1, 0x52f1, 0x52f1, 0x52f2, 0x52f2, 0x52f2, + 0x52f2, 0x52f3, 0x52f3, 0x52f3, 0x52f3, 0x52f4, 0x52f4, 0x52f4, + 0x52f4, 0x52f5, 0x52f5, 0x52f5, 0x52f5, 0x52f6, 0x52f6, 0x52f6, + 0x52f6, 0x52f7, 0x52f7, 0x52f7, 0x52f7, 0x52f8, 0x52f8, 0x52f8, + 0x52f8, 0x52f9, 0x52f9, 0x52f9, 0x52f9, 0x52f9, 0x52fa, 0x52fa, + 0x52fa, 0x52fa, 0x52fb, 0x52fb, 0x52fb, 0x52fb, 0x52fc, 0x52fc, + 0x52fc, 0x52fc, 0x52fd, 0x52fd, 0x52fd, 0x52fd, 0x52fe, 0x52fe, + 0x52fe, 0x52fe, 0x52fe, 0x52ff, 0x52ff, 0x52ff, 0x52ff, 0x5300, + 0x5300, 0x5300, 0x5300, 0x5301, 0x5301, 0x5301, 0x5301, 0x5301, + 0x5302, 0x5302, 0x5302, 0x5302, 0x5303, 0x5303, 0x5303, 0x5303, + 0x5304, 0x5304, 0x5304, 0x5304, 0x5304, 0x5305, 0x5305, 0x5305, + 0x5305, 0x5306, 0x5306, 0x5306, 0x5306, 0x5307, 0x5307, 0x5307, + 0x5307, 0x5307, 0x5308, 0x5308, 0x5308, 0x5308, 0x5309, 0x5309, + 0x5309, 0x5309, 0x5309, 0x530a, 0x530a, 0x530a, 0x530a, 0x530b, + 0x530b, 0x530b, 0x530b, 0x530b, 0x530c, 0x530c, 0x530c, 0x530c, + 0x530d, 0x530d, 0x530d, 0x530d, 0x530d, 0x530e, 0x530e, 0x530e, + 0x530e, 0x530f, 0x530f, 0x530f, 0x530f, 0x530f, 0x5310, 0x5310, + 0x5310, 0x5310, 0x5311, 0x5311, 0x5311, 0x5311, 0x5311, 0x5312, + 0x5312, 0x5312, 0x5312, 0x5313, 0x5313, 0x5313, 0x5313, 0x5313, + 0x5314, 0x5314, 0x5314, 0x5314, 0x5314, 0x5315, 0x5315, 0x5315, + 0x5315, 0x5316, 0x5316, 0x5316, 0x5316, 0x5316, 0x5317, 0x5317, + 0x5317, 0x5317, 0x5317, 0x5318, 0x5318, 0x5318, 0x5318, 0x5319, + 0x5319, 0x5319, 0x5319, 0x5319, 0x531a, 0x531a, 0x531a, 0x531a, + 0x531a, 0x531b, 0x531b, 0x531b, 0x531b, 0x531c, 0x531c, 0x531c, + 0x531c, 0x531c, 0x531d, 0x531d, 0x531d, 0x531d, 0x531d, 0x531e, + 0x531e, 0x531e, 0x531e, 0x531e, 0x531f, 0x531f, 0x531f, 0x531f, + 0x531f, 0x5320, 0x5320, 0x5320, 0x5320, 0x5320, 0x5321, 0x5321, + 0x5321, 0x5321, 0x5322, 0x5322, 0x5322, 0x5322, 0x5322, 0x5323, + 0x5323, 0x5323, 0x5323, 0x5323, 0x5324, 0x5324, 0x5324, 0x5324, + 0x5324, 0x5325, 0x5325, 0x5325, 0x5325, 0x5325, 0x5326, 0x5326, + 0x5326, 0x5326, 0x5326, 0x5327, 0x5327, 0x5327, 0x5327, 0x5327, + 0x5328, 0x5328, 0x5328, 0x5328, 0x5328, 0x5329, 0x5329, 0x5329, + 0x5329, 0x5329, 0x532a, 0x532a, 0x532a, 0x532a, 0x532a, 0x532b, + 0x532b, 0x532b, 0x532b, 0x532b, 0x532c, 0x532c, 0x532c, 0x532c, + 0x532c, 0x532d, 0x532d, 0x532d, 0x532d, 0x532d, 0x532e, 0x532e, + 0x532e, 0x532e, 0x532e, 0x532e, 0x532f, 0x532f, 0x532f, 0x532f, + 0x532f, 0x5330, 0x5330, 0x5330, 0x5330, 0x5330, 0x5331, 0x5331, + 0x5331, 0x5331, 0x5331, 0x5332, 0x5332, 0x5332, 0x5332, 0x5332, + 0x5333, 0x5333, 0x5333, 0x5333, 0x5333, 0x5333, 0x5334, 0x5334, + 0x5334, 0x5334, 0x5334, 0x5335, 0x5335, 0x5335, 0x5335, 0x5335, + 0x5336, 0x5336, 0x5336, 0x5336, 0x5336, 0x5337, 0x5337, 0x5337, + 0x5337, 0x5337, 0x5337, 0x5338, 0x5338, 0x5338, 0x5338, 0x5338, + 0x5339, 0x5339, 0x5339, 0x5339, 0x5339, 0x533a, 0x533a, 0x533a, + 0x533a, 0x533a, 0x533a, 0x533b, 0x533b, 0x533b, 0x533b, 0x533b, + 0x533c, 0x533c, 0x533c, 0x533c, 0x533c, 0x533d, 0x533d, 0x533d, + 0x533d, 0x533d, 0x533d, 0x533e, 0x533e, 0x533e, 0x533e, 0x533e, + 0x533f, 0x533f, 0x533f, 0x533f, 0x533f, 0x533f, 0x5340, 0x5340, + 0x5340, 0x5340, 0x5340, 0x5341, 0x5341, 0x5341, 0x5341, 0x5341, + 0x5341, 0x5342, 0x5342, 0x5342, 0x5342, 0x5342, 0x5343, 0x5343, + 0x5343, 0x5343, 0x5343, 0x5343, 0x5344, 0x5344, 0x5344, 0x5344, + 0x5344, 0x5344, 0x5345, 0x5345, 0x5345, 0x5345, 0x5345, 0x5346, + 0x5346, 0x5346, 0x5346, 0x5346, 0x5346, 0x5347, 0x5347, 0x5347, + 0x5347, 0x5347, 0x5348, 0x5348, 0x5348, 0x5348, 0x5348, 0x5348, + 0x5349, 0x5349, 0x5349, 0x5349, 0x5349, 0x5349, 0x534a, 0x534a, + 0x534a, 0x534a, 0x534a, 0x534a, 0x534b, 0x534b, 0x534b, 0x534b, + 0x534b, 0x534c, 0x534c, 0x534c, 0x534c, 0x534c, 0x534c, 0x534d, + 0x534d, 0x534d, 0x534d, 0x534d, 0x534d, 0x534e, 0x534e, 0x534e, + 0x534e, 0x534e, 0x534e, 0x534f, 0x534f, 0x534f, 0x534f, 0x534f, + 0x5350, 0x5350, 0x5350, 0x5350, 0x5350, 0x5350, 0x5351, 0x5351, + 0x5351, 0x5351, 0x5351, 0x5351, 0x5352, 0x5352, 0x5352, 0x5352, + 0x5352, 0x5352, 0x5353, 0x5353, 0x5353, 0x5353, 0x5353, 0x5353, + 0x5354, 0x5354, 0x5354, 0x5354, 0x5354, 0x5354, 0x5355, 0x5355, + 0x5355, 0x5355, 0x5355, 0x5355, 0x5356, 0x5356, 0x5356, 0x5356, + 0x5356, 0x5356, 0x5357, 0x5357, 0x5357, 0x5357, 0x5357, 0x5357, + 0x5358, 0x5358, 0x5358, 0x5358, 0x5358, 0x5358, 0x5359, 0x5359, + 0x5359, 0x5359, 0x5359, 0x5359, 0x535a, 0x535a, 0x535a, 0x535a, + 0x535a, 0x535a, 0x535b, 0x535b, 0x535b, 0x535b, 0x535b, 0x535b, + 0x535c, 0x535c, 0x535c, 0x535c, 0x535c, 0x535c, 0x535d, 0x535d, + 0x535d, 0x535d, 0x535d, 0x535d, 0x535d, 0x535e, 0x535e, 0x535e, + 0x535e, 0x535e, 0x535e, 0x535f, 0x535f, 0x535f, 0x535f, 0x535f, + 0x535f, 0x5360, 0x5360, 0x5360, 0x5360, 0x5360, 0x5360, 0x5361, + 0x5361, 0x5361, 0x5361, 0x5361, 0x5361, 0x5362, 0x5362, 0x5362, + 0x5362, 0x5362, 0x5362, 0x5362, 0x5363, 0x5363, 0x5363, 0x5363, + 0x5363, 0x5363, 0x5364, 0x5364, 0x5364, 0x5364, 0x5364, 0x5364, + 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5365, 0x5366, + 0x5366, 0x5366, 0x5366, 0x5366, 0x5366, 0x5367, 0x5367, 0x5367, + 0x5367, 0x5367, 0x5367, 0x5367, 0x5368, 0x5368, 0x5368, 0x5368, + 0x5368, 0x5368, 0x5369, 0x5369, 0x5369, 0x5369, 0x5369, 0x5369, + 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536a, 0x536b, + 0x536b, 0x536b, 0x536b, 0x536b, 0x536b, 0x536c, 0x536c, 0x536c, + 0x536c, 0x536c, 0x536c, 0x536c, 0x536d, 0x536d, 0x536d, 0x536d, + 0x536d, 0x536d, 0x536e, 0x536e, 0x536e, 0x536e, 0x536e, 0x536e, + 0x536e, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, 0x536f, + 0x5370, 0x5370, 0x5370, 0x5370, 0x5370, 0x5370, 0x5371, 0x5371, + 0x5371, 0x5371, 0x5371, 0x5371, 0x5371, 0x5372, 0x5372, 0x5372, + 0x5372, 0x5372, 0x5372, 0x5372, 0x5373, 0x5373, 0x5373, 0x5373, + 0x5373, 0x5373, 0x5374, 0x5374, 0x5374, 0x5374, 0x5374, 0x5374, + 0x5374, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, 0x5375, + 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5376, 0x5377, + 0x5377, 0x5377, 0x5377, 0x5377, 0x5377, 0x5378, 0x5378, 0x5378, + 0x5378, 0x5378, 0x5378, 0x5378, 0x5379, 0x5379, 0x5379, 0x5379, + 0x5379, 0x5379, 0x5379, 0x537a, 0x537a, 0x537a, 0x537a, 0x537a, + 0x537a, 0x537a, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, + 0x537b, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, 0x537c, + 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537d, 0x537e, + 0x537e, 0x537e, 0x537e, 0x537e, 0x537e, 0x537e, 0x537f, 0x537f, + 0x537f, 0x537f, 0x537f, 0x537f, 0x537f, 0x5380, 0x5380, 0x5380, + 0x5380, 0x5380, 0x5380, 0x5380, 0x5381, 0x5381, 0x5381, 0x5381, + 0x5381, 0x5381, 0x5381, 0x5382, 0x5382, 0x5382, 0x5382, 0x5382, + 0x5382, 0x5382, 0x5383, 0x5383, 0x5383, 0x5383, 0x5383, 0x5383, + 0x5383, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, 0x5384, + 0x5384, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, 0x5385, + 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5386, 0x5387, + 0x5387, 0x5387, 0x5387, 0x5387, 0x5387, 0x5387, 0x5388, 0x5388, + 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5388, 0x5389, 0x5389, + 0x5389, 0x5389, 0x5389, 0x5389, 0x5389, 0x538a, 0x538a, 0x538a, + 0x538a, 0x538a, 0x538a, 0x538a, 0x538b, 0x538b, 0x538b, 0x538b, + 0x538b, 0x538b, 0x538b, 0x538b, 0x538c, 0x538c, 0x538c, 0x538c, + 0x538c, 0x538c, 0x538c, 0x538d, 0x538d, 0x538d, 0x538d, 0x538d, + 0x538d, 0x538d, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, 0x538e, + 0x538e, 0x538e, 0x538f, 0x538f, 0x538f, 0x538f, 0x538f, 0x538f, + 0x538f, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, 0x5390, + 0x5390, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, 0x5391, + 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, 0x5392, + 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, 0x5393, + 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5394, 0x5395, + 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5395, 0x5396, + 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5396, 0x5397, + 0x5397, 0x5397, 0x5397, 0x5397, 0x5397, 0x5397, 0x5398, 0x5398, + 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5398, 0x5399, 0x5399, + 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x5399, 0x539a, 0x539a, + 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539a, 0x539b, 0x539b, + 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539b, 0x539c, 0x539c, + 0x539c, 0x539c, 0x539c, 0x539c, 0x539c, 0x539d, 0x539d, 0x539d, + 0x539d, 0x539d, 0x539d, 0x539d, 0x539d, 0x539e, 0x539e, 0x539e, + 0x539e, 0x539e, 0x539e, 0x539e, 0x539e, 0x539f, 0x539f, 0x539f, + 0x539f, 0x539f, 0x539f, 0x539f, 0x539f, 0x53a0, 0x53a0, 0x53a0, + 0x53a0, 0x53a0, 0x53a0, 0x53a1, 0x53a1, 0x53a1, 0x53a1, 0x53a2, + 0x53a2, 0x53a2, 0x53a2, 0x53a3, 0x53a3, 0x53a3, 0x53a3, 0x53a4, + 0x53a4, 0x53a4, 0x53a4, 0x53a5, 0x53a5, 0x53a5, 0x53a5, 0x53a6, + 0x53a6, 0x53a6, 0x53a6, 0x53a7, 0x53a7, 0x53a7, 0x53a7, 0x53a8, + 0x53a8, 0x53a8, 0x53a8, 0x53a9, 0x53a9, 0x53a9, 0x53a9, 0x53a9, + 0x53aa, 0x53aa, 0x53aa, 0x53aa, 0x53ab, 0x53ab, 0x53ab, 0x53ab, + 0x53ac, 0x53ac, 0x53ac, 0x53ac, 0x53ad, 0x53ad, 0x53ad, 0x53ad, + 0x53ae, 0x53ae, 0x53ae, 0x53ae, 0x53ae, 0x53af, 0x53af, 0x53af, + 0x53af, 0x53b0, 0x53b0, 0x53b0, 0x53b0, 0x53b1, 0x53b1, 0x53b1, + 0x53b1, 0x53b2, 0x53b2, 0x53b2, 0x53b2, 0x53b2, 0x53b3, 0x53b3, + 0x53b3, 0x53b3, 0x53b4, 0x53b4, 0x53b4, 0x53b4, 0x53b5, 0x53b5, + 0x53b5, 0x53b5, 0x53b5, 0x53b6, 0x53b6, 0x53b6, 0x53b6, 0x53b7, + 0x53b7, 0x53b7, 0x53b7, 0x53b8, 0x53b8, 0x53b8, 0x53b8, 0x53b8, + 0x53b9, 0x53b9, 0x53b9, 0x53b9, 0x53ba, 0x53ba, 0x53ba, 0x53ba, + 0x53ba, 0x53bb, 0x53bb, 0x53bb, 0x53bb, 0x53bc, 0x53bc, 0x53bc, + 0x53bc, 0x53bc, 0x53bd, 0x53bd, 0x53bd, 0x53bd, 0x53be, 0x53be, + 0x53be, 0x53be, 0x53be, 0x53bf, 0x53bf, 0x53bf, 0x53bf, 0x53c0, + 0x53c0, 0x53c0, 0x53c0, 0x53c0, 0x53c1, 0x53c1, 0x53c1, 0x53c1, + 0x53c2, 0x53c2, 0x53c2, 0x53c2, 0x53c2, 0x53c3, 0x53c3, 0x53c3, + 0x53c3, 0x53c4, 0x53c4, 0x53c4, 0x53c4, 0x53c4, 0x53c5, 0x53c5, + 0x53c5, 0x53c5, 0x53c6, 0x53c6, 0x53c6, 0x53c6, 0x53c6, 0x53c7, + 0x53c7, 0x53c7, 0x53c7, 0x53c7, 0x53c8, 0x53c8, 0x53c8, 0x53c8, + 0x53c9, 0x53c9, 0x53c9, 0x53c9, 0x53c9, 0x53ca, 0x53ca, 0x53ca, + 0x53ca, 0x53ca, 0x53cb, 0x53cb, 0x53cb, 0x53cb, 0x53cb, 0x53cc, + 0x53cc, 0x53cc, 0x53cc, 0x53cd, 0x53cd, 0x53cd, 0x53cd, 0x53cd, + 0x53ce, 0x53ce, 0x53ce, 0x53ce, 0x53ce, 0x53cf, 0x53cf, 0x53cf, + 0x53cf, 0x53cf, 0x53d0, 0x53d0, 0x53d0, 0x53d0, 0x53d0, 0x53d1, + 0x53d1, 0x53d1, 0x53d1, 0x53d2, 0x53d2, 0x53d2, 0x53d2, 0x53d2, + 0x53d3, 0x53d3, 0x53d3, 0x53d3, 0x53d3, 0x53d4, 0x53d4, 0x53d4, + 0x53d4, 0x53d4, 0x53d5, 0x53d5, 0x53d5, 0x53d5, 0x53d5, 0x53d6, + 0x53d6, 0x53d6, 0x53d6, 0x53d6, 0x53d7, 0x53d7, 0x53d7, 0x53d7, + 0x53d7, 0x53d8, 0x53d8, 0x53d8, 0x53d8, 0x53d8, 0x53d9, 0x53d9, + 0x53d9, 0x53d9, 0x53d9, 0x53da, 0x53da, 0x53da, 0x53da, 0x53da, + 0x53db, 0x53db, 0x53db, 0x53db, 0x53db, 0x53dc, 0x53dc, 0x53dc, + 0x53dc, 0x53dc, 0x53dd, 0x53dd, 0x53dd, 0x53dd, 0x53dd, 0x53de, + 0x53de, 0x53de, 0x53de, 0x53de, 0x53df, 0x53df, 0x53df, 0x53df, + 0x53df, 0x53e0, 0x53e0, 0x53e0, 0x53e0, 0x53e0, 0x53e1, 0x53e1, + 0x53e1, 0x53e1, 0x53e1, 0x53e1, 0x53e2, 0x53e2, 0x53e2, 0x53e2, + 0x53e2, 0x53e3, 0x53e3, 0x53e3, 0x53e3, 0x53e3, 0x53e4, 0x53e4, + 0x53e4, 0x53e4, 0x53e4, 0x53e5, 0x53e5, 0x53e5, 0x53e5, 0x53e5, + 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e6, 0x53e7, 0x53e7, + 0x53e7, 0x53e7, 0x53e7, 0x53e8, 0x53e8, 0x53e8, 0x53e8, 0x53e8, + 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53e9, 0x53ea, 0x53ea, + 0x53ea, 0x53ea, 0x53ea, 0x53eb, 0x53eb, 0x53eb, 0x53eb, 0x53eb, + 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ec, 0x53ed, 0x53ed, + 0x53ed, 0x53ed, 0x53ed, 0x53ee, 0x53ee, 0x53ee, 0x53ee, 0x53ee, + 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53ef, 0x53f0, 0x53f0, + 0x53f0, 0x53f0, 0x53f0, 0x53f1, 0x53f1, 0x53f1, 0x53f1, 0x53f1, + 0x53f1, 0x53f2, 0x53f2, 0x53f2, 0x53f2, 0x53f2, 0x53f3, 0x53f3, + 0x53f3, 0x53f3, 0x53f3, 0x53f3, 0x53f4, 0x53f4, 0x53f4, 0x53f4, + 0x53f4, 0x53f4, 0x53f5, 0x53f5, 0x53f5, 0x53f5, 0x53f5, 0x53f6, + 0x53f6, 0x53f6, 0x53f6, 0x53f6, 0x53f6, 0x53f7, 0x53f7, 0x53f7, + 0x53f7, 0x53f7, 0x53f8, 0x53f8, 0x53f8, 0x53f8, 0x53f8, 0x53f8, + 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53f9, 0x53fa, 0x53fa, + 0x53fa, 0x53fa, 0x53fa, 0x53fb, 0x53fb, 0x53fb, 0x53fb, 0x53fb, + 0x53fb, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fc, 0x53fd, + 0x53fd, 0x53fd, 0x53fd, 0x53fd, 0x53fe, 0x53fe, 0x53fe, 0x53fe, + 0x53fe, 0x53fe, 0x53ff, 0x53ff, 0x53ff, 0x53ff, 0x53ff, 0x53ff, + 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, 0x5400, + 0x5400, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, + 0x5401, 0x5401, 0x5401, 0x5401, 0x5401, 0x5402, 0x5402, 0x5402, + 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, 0x5402, + 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, 0x5403, + 0x5403, 0x5403, 0x5403, 0x5403, 0x5404, 0x5404, 0x5404, 0x5404, + 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, 0x5404, + 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, 0x5405, + 0x5405, 0x5405, 0x5405, 0x5405, 0x5406, 0x5406, 0x5406, 0x5406, + 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, 0x5406, + 0x5406, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, + 0x5407, 0x5407, 0x5407, 0x5407, 0x5407, 0x5408, 0x5408, 0x5408, + 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, 0x5408, + 0x5408, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, + 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x5409, 0x540a, 0x540a, + 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, 0x540a, + 0x540a, 0x540a, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, + 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540b, 0x540c, + 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, 0x540c, + 0x540c, 0x540c, 0x540c, 0x540c, 0x540d, 0x540d, 0x540d, 0x540d, + 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, 0x540d, + 0x540d, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, + 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540e, 0x540f, 0x540f, + 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, 0x540f, + 0x540f, 0x540f, 0x540f, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, + 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, 0x5410, + 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, + 0x5411, 0x5411, 0x5411, 0x5411, 0x5411, 0x5412, 0x5412, 0x5412, + 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, 0x5412, + 0x5412, 0x5412, 0x5412, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, + 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, 0x5413, + 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, + 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5414, 0x5415, 0x5415, + 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, 0x5415, + 0x5415, 0x5415, 0x5415, 0x5415, 0x5416, 0x5416, 0x5416, 0x5416, + 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, 0x5416, + 0x5416, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, + 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5417, 0x5418, + 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, + 0x5418, 0x5418, 0x5418, 0x5418, 0x5418, 0x5419, 0x5419, 0x5419, + 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, 0x5419, + 0x5419, 0x5419, 0x5419, 0x5419, 0x541a, 0x541a, 0x541a, 0x541a, + 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, 0x541a, + 0x541a, 0x541a, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, + 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, 0x541b, + 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, + 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541c, 0x541d, + 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, + 0x541d, 0x541d, 0x541d, 0x541d, 0x541d, 0x541e, 0x541e, 0x541e, + 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, 0x541e, + 0x541e, 0x541e, 0x541e, 0x541e, 0x541f, 0x541f, 0x541f, 0x541f, + 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, 0x541f, + 0x541f, 0x541f, 0x541f, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, + 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, 0x5420, + 0x5420, 0x5420, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, + 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, 0x5421, + 0x5421, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, + 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, 0x5422, + 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, + 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5423, 0x5424, + 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, + 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5424, 0x5425, + 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, + 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5425, 0x5426, 0x5426, + 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, + 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5426, 0x5427, 0x5427, + 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, + 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5427, 0x5428, 0x5428, + 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, + 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5428, 0x5429, 0x5429, + 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x5429, 0x542a, + 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542a, 0x542b, + 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542b, 0x542c, + 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, 0x542c, + 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, 0x542d, + 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, 0x542e, + 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, 0x542f, + 0x542f, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, 0x5430, + 0x5430, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, 0x5431, + 0x5431, 0x5431, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, 0x5432, + 0x5432, 0x5432, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, 0x5433, + 0x5433, 0x5433, 0x5433, 0x5434, 0x5434, 0x5434, 0x5434, 0x5434, + 0x5434, 0x5434, 0x5434, 0x5434, 0x5435, 0x5435, 0x5435, 0x5435, + 0x5435, 0x5435, 0x5435, 0x5435, 0x5436, 0x5436, 0x5436, 0x5436, + 0x5436, 0x5436, 0x5436, 0x5436, 0x5436, 0x5437, 0x5437, 0x5437, + 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5437, 0x5438, 0x5438, + 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5438, 0x5439, + 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, 0x5439, + 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, 0x543a, + 0x543a, 0x543a, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, 0x543b, + 0x543b, 0x543b, 0x543b, 0x543c, 0x543c, 0x543c, 0x543c, 0x543c, + 0x543c, 0x543c, 0x543c, 0x543c, 0x543d, 0x543d, 0x543d, 0x543d, + 0x543d, 0x543d, 0x543d, 0x543d, 0x543d, 0x543e, 0x543e, 0x543e, + 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543e, 0x543f, + 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, 0x543f, + 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, 0x5440, + 0x5440, 0x5440, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, 0x5441, + 0x5441, 0x5441, 0x5441, 0x5441, 0x5442, 0x5442, 0x5442, 0x5442, + 0x5442, 0x5442, 0x5442, 0x5442, 0x5442, 0x5443, 0x5443, 0x5443, + 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5443, 0x5444, + 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, 0x5444, + 0x5444, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, 0x5445, + 0x5445, 0x5445, 0x5445, 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, + 0x5446, 0x5446, 0x5446, 0x5446, 0x5446, 0x5447, 0x5447, 0x5447, + 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5447, 0x5448, + 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, 0x5448, + 0x5448, 0x5448, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, 0x5449, + 0x5449, 0x5449, 0x5449, 0x5449, 0x544a, 0x544a, 0x544a, 0x544a, + 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544a, 0x544b, 0x544b, + 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, 0x544b, + 0x544b, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, 0x544c, + 0x544c, 0x544c, 0x544c, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, + 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544d, 0x544e, 0x544e, + 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, 0x544e, + 0x544e, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, 0x544f, + 0x544f, 0x544f, 0x544f, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, + 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5450, 0x5451, 0x5451, + 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, 0x5451, + 0x5451, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, 0x5452, + 0x5452, 0x5452, 0x5452, 0x5452, 0x5453, 0x5453, 0x5453, 0x5453, + 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5453, 0x5454, + 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, 0x5454, + 0x5454, 0x5454, 0x5454, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, + 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5455, 0x5456, 0x5456, + 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, 0x5456, + 0x5456, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, + 0x5457, 0x5457, 0x5457, 0x5457, 0x5457, 0x5458, 0x5458, 0x5458, + 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, 0x5458, + 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, 0x5459, + 0x5459, 0x5459, 0x5459, 0x5459, 0x545a, 0x545a, 0x545a, 0x545a, + 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, 0x545a, + 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, 0x545b, + 0x545b, 0x545b, 0x545b, 0x545b, 0x545c, 0x545c, 0x545c, 0x545c, + 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, 0x545c, + 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, 0x545d, + 0x545d, 0x545d, 0x545d, 0x545d, 0x545e, 0x545e, 0x545e, 0x545e, + 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, 0x545e, + 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, 0x545f, + 0x545f, 0x545f, 0x545f, 0x545f, 0x5460, 0x5460, 0x5460, 0x5460, + 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, 0x5460, + 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, + 0x5461, 0x5461, 0x5461, 0x5461, 0x5461, 0x5462, 0x5462, 0x5462, + 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, 0x5462, + 0x5462, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, + 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5463, 0x5464, 0x5464, + 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, 0x5464, + 0x5464, 0x5464, 0x5464, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, + 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5465, 0x5466, + 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, 0x5466, + 0x5466, 0x5466, 0x5466, 0x5466, 0x5467, 0x5467, 0x5467, 0x5467, + 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, 0x5467, + 0x5467, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, + 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5468, 0x5469, 0x5469, + 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, 0x5469, + 0x5469, 0x5469, 0x5469, 0x5469, 0x546a, 0x546a, 0x546a, 0x546a, + 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, 0x546a, + 0x546a, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, + 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546b, 0x546c, 0x546c, + 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, 0x546c, + 0x546c, 0x546c, 0x546c, 0x546c, 0x546d, 0x546d, 0x546d, 0x546d, + 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, 0x546d, + 0x546d, 0x546d, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, + 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546e, 0x546f, + 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, + 0x546f, 0x546f, 0x546f, 0x546f, 0x546f, 0x5470, 0x5470, 0x5470, + 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, 0x5470, + 0x5470, 0x5470, 0x5470, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, + 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, 0x5471, + 0x5471, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, + 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5472, 0x5473, + 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, + 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5473, 0x5474, 0x5474, + 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, 0x5474, + 0x5474, 0x5474, 0x5474, 0x5474, 0x5475, 0x5475, 0x5475, 0x5475, + 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, 0x5475, + 0x5475, 0x5475, 0x5475, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, + 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, 0x5476, + 0x5476, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, + 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, 0x5477, + 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, + 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5478, 0x5479, + 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, + 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x5479, 0x547a, 0x547a, + 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, + 0x547a, 0x547a, 0x547a, 0x547a, 0x547a, 0x547b, 0x547b, 0x547b, + 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, 0x547b, + 0x547b, 0x547b, 0x547b, 0x547b, 0x547c, 0x547c, 0x547c, 0x547c, + 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, 0x547c, + 0x547c, 0x547c, 0x547c, 0x547c, 0x547d, 0x547d, 0x547d, 0x547d, + 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, 0x547d, + 0x547d, 0x547d, 0x547d, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, + 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, 0x547e, + 0x547e, 0x547e, 0x547e, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, + 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, 0x547f, + 0x547f, 0x547f, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, + 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, 0x5480, + 0x5480, 0x5480, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, + 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, 0x5481, + 0x5481, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, 0x5482, + 0x5482, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, 0x5483, + 0x5483, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, 0x5484, + 0x5484, 0x5484, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, 0x5485, + 0x5485, 0x5485, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, 0x5486, + 0x5486, 0x5486, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, 0x5487, + 0x5487, 0x5487, 0x5487, 0x5488, 0x5488, 0x5488, 0x5488, 0x5488, + 0x5488, 0x5488, 0x5488, 0x5489, 0x5489, 0x5489, 0x5489, 0x5489, + 0x5489, 0x5489, 0x5489, 0x548a, 0x548a, 0x548a, 0x548a, 0x548a, + 0x548a, 0x548a, 0x548a, 0x548a, 0x548b, 0x548b, 0x548b, 0x548b, + 0x548b, 0x548b, 0x548b, 0x548b, 0x548b, 0x548c, 0x548c, 0x548c, + 0x548c, 0x548c, 0x548c, 0x548c, 0x548c, 0x548d, 0x548d, 0x548d, + 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548d, 0x548e, 0x548e, + 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548e, 0x548f, + 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, 0x548f, + 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, 0x5490, + 0x5490, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, 0x5491, + 0x5491, 0x5491, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, 0x5492, + 0x5492, 0x5492, 0x5492, 0x5493, 0x5493, 0x5493, 0x5493, 0x5493, + 0x5493, 0x5493, 0x5493, 0x5493, 0x5494, 0x5494, 0x5494, 0x5494, + 0x5494, 0x5494, 0x5494, 0x5494, 0x5494, 0x5495, 0x5495, 0x5495, + 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5495, 0x5496, + 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, 0x5496, + 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, 0x5497, + 0x5497, 0x5497, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, 0x5498, + 0x5498, 0x5498, 0x5498, 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, + 0x5499, 0x5499, 0x5499, 0x5499, 0x5499, 0x549a, 0x549a, 0x549a, + 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549a, 0x549b, 0x549b, + 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, 0x549b, + 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, 0x549c, + 0x549c, 0x549c, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, 0x549d, + 0x549d, 0x549d, 0x549d, 0x549d, 0x549e, 0x549e, 0x549e, 0x549e, + 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549e, 0x549f, 0x549f, + 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, 0x549f, + 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, 0x54a0, + 0x54a0, 0x54a0, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a1, + 0x54a1, 0x54a1, 0x54a1, 0x54a1, 0x54a2, 0x54a2, 0x54a2, 0x54a2, + 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a2, 0x54a3, + 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, 0x54a3, + 0x54a3, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a4, + 0x54a4, 0x54a4, 0x54a4, 0x54a4, 0x54a5, 0x54a5, 0x54a5, 0x54a5, + 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a5, 0x54a6, 0x54a6, + 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, 0x54a6, + 0x54a6, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a7, + 0x54a7, 0x54a7, 0x54a7, 0x54a7, 0x54a8, 0x54a8, 0x54a8, 0x54a8, + 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a8, 0x54a9, 0x54a9, + 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, 0x54a9, + 0x54a9, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54aa, + 0x54aa, 0x54aa, 0x54aa, 0x54aa, 0x54ab, 0x54ab, 0x54ab, 0x54ab, + 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ab, 0x54ac, + 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, 0x54ac, + 0x54ac, 0x54ac, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, + 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ad, 0x54ae, 0x54ae, + 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, 0x54ae, + 0x54ae, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, 0x54af, + 0x54af, 0x54af, 0x54af, 0x54af, 0x54b0, 0x54b0, 0x54b0, 0x54b0, + 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, 0x54b0, + 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b1, + 0x54b1, 0x54b1, 0x54b1, 0x54b1, 0x54b2, 0x54b2, 0x54b2, 0x54b2, + 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b2, 0x54b3, + 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, 0x54b3, + 0x54b3, 0x54b3, 0x54b3, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, + 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b4, 0x54b5, + 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, 0x54b5, + 0x54b5, 0x54b5, 0x54b5, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, + 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b6, 0x54b7, + 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, 0x54b7, + 0x54b7, 0x54b7, 0x54b7, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, + 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b8, 0x54b9, + 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54b9, + 0x54b9, 0x54b9, 0x54b9, 0x54b9, 0x54ba, 0x54ba, 0x54ba, 0x54ba, + 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, 0x54ba, + 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, + 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bb, 0x54bc, 0x54bc, 0x54bc, + 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, 0x54bc, + 0x54bc, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, + 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54bd, 0x54be, 0x54be, + 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, 0x54be, + 0x54be, 0x54be, 0x54be, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, + 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, 0x54bf, + 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, + 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c0, 0x54c1, 0x54c1, 0x54c1, + 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, 0x54c1, + 0x54c1, 0x54c1, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, + 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c2, 0x54c3, + 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, + 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c3, 0x54c4, 0x54c4, 0x54c4, + 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, 0x54c4, + 0x54c4, 0x54c4, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, + 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, 0x54c5, + 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, + 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c6, 0x54c7, 0x54c7, 0x54c7, + 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, 0x54c7, + 0x54c7, 0x54c7, 0x54c7, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, + 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, 0x54c8, + 0x54c8, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, + 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54c9, 0x54ca, + 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, + 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54ca, 0x54cb, 0x54cb, 0x54cb, + 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, 0x54cb, + 0x54cb, 0x54cb, 0x54cb, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, + 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, 0x54cc, + 0x54cc, 0x54cc, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, + 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, 0x54cd, + 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, + 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54ce, 0x54cf, + 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, + 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54cf, 0x54d0, 0x54d0, 0x54d0, + 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d0, + 0x54d0, 0x54d0, 0x54d0, 0x54d0, 0x54d1, 0x54d1, 0x54d1, 0x54d1, + 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, 0x54d1, + 0x54d1, 0x54d1, 0x54d1, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, + 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, 0x54d2, + 0x54d2, 0x54d2, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, + 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, 0x54d3, + 0x54d3, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, + 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, 0x54d4, + 0x54d4, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, + 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, 0x54d5, + 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, + 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d6, 0x54d7, + 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, + 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d7, 0x54d8, + 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, + 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d8, 0x54d9, + 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, + 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54d9, 0x54da, + 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, 0x54da, + 0x54da, 0x54da, 0x54da, 0x54da, 0x54db, 0x54db, 0x54db, 0x54db, + 0x54db, 0x54db, 0x54db, 0x54db, 0x54dc, 0x54dc, 0x54dc, 0x54dc, + 0x54dc, 0x54dc, 0x54dc, 0x54dc, 0x54dd, 0x54dd, 0x54dd, 0x54dd, + 0x54dd, 0x54dd, 0x54dd, 0x54dd, 0x54de, 0x54de, 0x54de, 0x54de, + 0x54de, 0x54de, 0x54de, 0x54de, 0x54df, 0x54df, 0x54df, 0x54df, + 0x54df, 0x54df, 0x54df, 0x54df, 0x54e0, 0x54e0, 0x54e0, 0x54e0, + 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e0, 0x54e1, 0x54e1, 0x54e1, + 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e1, 0x54e2, 0x54e2, 0x54e2, + 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e2, 0x54e3, 0x54e3, + 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e3, 0x54e4, 0x54e4, + 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e4, 0x54e5, + 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, 0x54e5, + 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, 0x54e6, + 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, 0x54e7, + 0x54e7, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, 0x54e8, + 0x54e8, 0x54e8, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, 0x54e9, + 0x54e9, 0x54e9, 0x54e9, 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54ea, + 0x54ea, 0x54ea, 0x54ea, 0x54ea, 0x54eb, 0x54eb, 0x54eb, 0x54eb, + 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54eb, 0x54ec, 0x54ec, 0x54ec, + 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ec, 0x54ed, + 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, 0x54ed, + 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, 0x54ee, + 0x54ee, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, 0x54ef, + 0x54ef, 0x54ef, 0x54ef, 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f0, + 0x54f0, 0x54f0, 0x54f0, 0x54f0, 0x54f1, 0x54f1, 0x54f1, 0x54f1, + 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f1, 0x54f2, 0x54f2, + 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f2, 0x54f3, + 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, 0x54f3, + 0x54f3, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, 0x54f4, + 0x54f4, 0x54f4, 0x54f4, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, + 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f5, 0x54f6, 0x54f6, 0x54f6, + 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f6, 0x54f7, + 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, 0x54f7, + 0x54f7, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, 0x54f8, + 0x54f8, 0x54f8, 0x54f8, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, + 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54f9, 0x54fa, 0x54fa, 0x54fa, + 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fa, 0x54fb, + 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, 0x54fb, + 0x54fb, 0x54fb, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fc, + 0x54fc, 0x54fc, 0x54fc, 0x54fc, 0x54fd, 0x54fd, 0x54fd, 0x54fd, + 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fd, 0x54fe, + 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, 0x54fe, + 0x54fe, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x54ff, + 0x54ff, 0x54ff, 0x54ff, 0x54ff, 0x5500, 0x5500, 0x5500, 0x5500, + 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5500, 0x5501, + 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, 0x5501, + 0x5501, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, 0x5502, + 0x5502, 0x5502, 0x5502, 0x5502, 0x5503, 0x5503, 0x5503, 0x5503, + 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5503, 0x5504, + 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, 0x5504, + 0x5504, 0x5504, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, + 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5505, 0x5506, 0x5506, + 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, 0x5506, + 0x5506, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, 0x5507, + 0x5507, 0x5507, 0x5507, 0x5507, 0x5508, 0x5508, 0x5508, 0x5508, + 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, 0x5508, + 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, 0x5509, + 0x5509, 0x5509, 0x5509, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, + 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550a, 0x550b, + 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, 0x550b, + 0x550b, 0x550b, 0x550b, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, + 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550c, 0x550d, 0x550d, + 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, 0x550d, + 0x550d, 0x550d, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, + 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550e, 0x550f, 0x550f, + 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, 0x550f, + 0x550f, 0x550f, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, + 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5510, 0x5511, + 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, 0x5511, + 0x5511, 0x5511, 0x5511, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, + 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5512, 0x5513, + 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, 0x5513, + 0x5513, 0x5513, 0x5513, 0x5513, 0x5514, 0x5514, 0x5514, 0x5514, + 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, 0x5514, + 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, + 0x5515, 0x5515, 0x5515, 0x5515, 0x5515, 0x5516, 0x5516, 0x5516, + 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, 0x5516, + 0x5516, 0x5516, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, + 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5517, 0x5518, + 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, 0x5518, + 0x5518, 0x5518, 0x5518, 0x5518, 0x5519, 0x5519, 0x5519, 0x5519, + 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, 0x5519, + 0x5519, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, + 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551a, 0x551b, 0x551b, + 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, 0x551b, + 0x551b, 0x551b, 0x551b, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, + 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, 0x551c, + 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, + 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551d, 0x551e, 0x551e, + 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, 0x551e, + 0x551e, 0x551e, 0x551e, 0x551e, 0x551f, 0x551f, 0x551f, 0x551f, + 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, 0x551f, + 0x551f, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, + 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5520, 0x5521, + 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, + 0x5521, 0x5521, 0x5521, 0x5521, 0x5521, 0x5522, 0x5522, 0x5522, + 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, 0x5522, + 0x5522, 0x5522, 0x5522, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, + 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, 0x5523, + 0x5523, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, + 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5524, 0x5525, + 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, + 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5525, 0x5526, 0x5526, + 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, 0x5526, + 0x5526, 0x5526, 0x5526, 0x5526, 0x5527, 0x5527, 0x5527, 0x5527, + 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, 0x5527, + 0x5527, 0x5527, 0x5527, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, + 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, 0x5528, + 0x5528, 0x5528, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, + 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, 0x5529, + 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, + 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552a, 0x552b, + 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, + 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552b, 0x552c, 0x552c, + 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, + 0x552c, 0x552c, 0x552c, 0x552c, 0x552c, 0x552d, 0x552d, 0x552d, + 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, + 0x552d, 0x552d, 0x552d, 0x552d, 0x552d, 0x552e, 0x552e, 0x552e, + 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, 0x552e, + 0x552e, 0x552e, 0x552e, 0x552e, 0x552f, 0x552f, 0x552f, 0x552f, + 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, 0x552f, + 0x552f, 0x552f, 0x552f, 0x552f, 0x5530, 0x5530, 0x5530, 0x5530, + 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, 0x5530, + 0x5530, 0x5530, 0x5530, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, + 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, 0x5531, + 0x5531, 0x5531, 0x5531, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, + 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, 0x5532, + 0x5532, 0x5532, 0x5532, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, + 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5533, 0x5534, 0x5534, + 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5534, 0x5535, 0x5535, + 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5535, 0x5536, 0x5536, + 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5536, 0x5537, 0x5537, + 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5537, 0x5538, 0x5538, + 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5538, 0x5539, + 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x5539, 0x553a, + 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, 0x553a, + 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, 0x553b, + 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, 0x553c, + 0x553c, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, 0x553d, + 0x553d, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, 0x553e, + 0x553e, 0x553e, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, 0x553f, + 0x553f, 0x553f, 0x553f, 0x5540, 0x5540, 0x5540, 0x5540, 0x5540, + 0x5540, 0x5540, 0x5540, 0x5540, 0x5541, 0x5541, 0x5541, 0x5541, + 0x5541, 0x5541, 0x5541, 0x5541, 0x5541, 0x5542, 0x5542, 0x5542, + 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5542, 0x5543, 0x5543, + 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5543, 0x5544, + 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, 0x5544, + 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, 0x5545, + 0x5545, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, 0x5546, + 0x5546, 0x5546, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, 0x5547, + 0x5547, 0x5547, 0x5547, 0x5547, 0x5548, 0x5548, 0x5548, 0x5548, + 0x5548, 0x5548, 0x5548, 0x5548, 0x5548, 0x5549, 0x5549, 0x5549, + 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x5549, 0x554a, + 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, 0x554a, + 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, 0x554b, + 0x554b, 0x554b, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, 0x554c, + 0x554c, 0x554c, 0x554c, 0x554c, 0x554d, 0x554d, 0x554d, 0x554d, + 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554d, 0x554e, 0x554e, + 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554e, 0x554f, + 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, 0x554f, + 0x554f, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, 0x5550, + 0x5550, 0x5550, 0x5550, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, + 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5551, 0x5552, 0x5552, + 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, 0x5552, + 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, 0x5553, + 0x5553, 0x5553, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, 0x5554, + 0x5554, 0x5554, 0x5554, 0x5554, 0x5555, 0x5555, 0x5555, 0x5555, + 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5556, + 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, 0x5556, + 0x5556, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, 0x5557, + 0x5557, 0x5557, 0x5557, 0x5557, 0x5558, 0x5558, 0x5558, 0x5558, + 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5558, 0x5559, + 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, 0x5559, + 0x5559, 0x5559, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, 0x555a, + 0x555a, 0x555a, 0x555a, 0x555a, 0x555b, 0x555b, 0x555b, 0x555b, + 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555b, 0x555c, + 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, 0x555c, + 0x555c, 0x555c, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, + 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555d, 0x555e, 0x555e, + 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, 0x555e, + 0x555e, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, 0x555f, + 0x555f, 0x555f, 0x555f, 0x555f, 0x5560, 0x5560, 0x5560, 0x5560, + 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5560, 0x5561, + 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, 0x5561, + 0x5561, 0x5561, 0x5561, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, + 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5562, 0x5563, 0x5563, + 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, 0x5563, + 0x5563, 0x5563, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, + 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5564, 0x5565, 0x5565, + 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, 0x5565, + 0x5565, 0x5565, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, + 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5566, 0x5567, 0x5567, + 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, 0x5567, + 0x5567, 0x5567, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, + 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5568, 0x5569, 0x5569, + 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, 0x5569, + 0x5569, 0x5569, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, + 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556a, 0x556b, 0x556b, + 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, 0x556b, + 0x556b, 0x556b, 0x556b, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, + 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556c, 0x556d, + 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, 0x556d, + 0x556d, 0x556d, 0x556d, 0x556d, 0x556e, 0x556e, 0x556e, 0x556e, + 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, 0x556e, + 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, + 0x556f, 0x556f, 0x556f, 0x556f, 0x556f, 0x5570, 0x5570, 0x5570, + 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, 0x5570, + 0x5570, 0x5570, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, + 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5571, 0x5572, + 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, 0x5572, + 0x5572, 0x5572, 0x5572, 0x5572, 0x5573, 0x5573, 0x5573, 0x5573, + 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, 0x5573, + 0x5573, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, + 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5574, 0x5575, + 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, 0x5575, + 0x5575, 0x5575, 0x5575, 0x5575, 0x5576, 0x5576, 0x5576, 0x5576, + 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, 0x5576, + 0x5576, 0x5576, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, + 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5577, 0x5578, + 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, + 0x5578, 0x5578, 0x5578, 0x5578, 0x5578, 0x5579, 0x5579, 0x5579, + 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, 0x5579, + 0x5579, 0x5579, 0x5579, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, + 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, 0x557a, + 0x557a, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, + 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557b, 0x557c, + 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, + 0x557c, 0x557c, 0x557c, 0x557c, 0x557c, 0x557d, 0x557d, 0x557d, + 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, 0x557d, + 0x557d, 0x557d, 0x557d, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, + 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, 0x557e, + 0x557e, 0x557e, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, + 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, 0x557f, + 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, + 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5580, 0x5581, + 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, + 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5581, 0x5582, 0x5582, + 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, 0x5582, + 0x5582, 0x5582, 0x5582, 0x5582, 0x5583, 0x5583, 0x5583, 0x5583, + 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, 0x5583, + 0x5583, 0x5583, 0x5583, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, + 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, 0x5584, + 0x5584, 0x5584, 0x5584, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, + 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, 0x5585, + 0x5585, 0x5585, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, + 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, 0x5586, + 0x5586, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, + 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, 0x5587, + 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, + 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, 0x5588, + 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, + 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, 0x5589, + 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, + 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, 0x558a, + 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, + 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558b, 0x558c, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfc00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; diff --git a/3rdparty/openexr/IlmThread/IlmThread.cpp b/3rdparty/openexr/IlmThread/IlmThread.cpp new file mode 100644 index 000000000..fdcf66552 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThread.cpp @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Thread -- dummy implementation for +// platforms that do not support threading +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if !defined (_WIN32) && !defined(_WIN64) && !(HAVE_PTHREAD) + +#include "IlmThread.h" +#include "Iex.h" + +namespace IlmThread { + + +bool +supportsThreads () +{ + return false; +} + + +Thread::Thread () +{ + throw Iex::NoImplExc ("Threads not supported on this platform."); +} + + +Thread::~Thread () +{ + throw Iex::NoImplExc ("Threads not supported on this platform."); +} + + +void +Thread::start () +{ + throw Iex::NoImplExc ("Threads not supported on this platform."); +} + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThread.h b/3rdparty/openexr/IlmThread/IlmThread.h new file mode 100644 index 000000000..e5ca5959a --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThread.h @@ -0,0 +1,151 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_ILM_THREAD_H +#define INCLUDED_ILM_THREAD_H + +//----------------------------------------------------------------------------- +// +// class Thread +// +// Class Thread is a portable interface to a system-dependent thread +// primitive. In order to make a thread actually do something useful, +// you must derive a subclass from class Thread and implement the +// run() function. If the operating system supports threading then +// the run() function will be executed int a new thread. +// +// The actual creation of the thread is done by the start() routine +// which then calls the run() function. In general the start() +// routine should be called from the constructor of the derived class. +// +// The base-class thread destructor will join/destroy the thread. +// +// IMPORTANT: Due to the mechanisms that encapsulate the low-level +// threading primitives in a C++ class there is a race condition +// with code resembling the following: +// +// { +// WorkerThread myThread; +// } // myThread goes out of scope, is destroyed +// // and the thread is joined +// +// The race is between the parent thread joining the child thread +// in the destructor of myThread, and the run() function in the +// child thread. If the destructor gets executed first then run() +// will be called with an invalid "this" pointer. +// +// This issue can be fixed by using a Semaphore to keep track of +// whether the run() function has already been called. You can +// include a Semaphore member variable within your derived class +// which you post() on in the run() function, and wait() on in the +// destructor before the thread is joined. Alternatively you could +// do something like this: +// +// Semaphore runStarted; +// +// void WorkerThread::run () +// { +// runStarted.post() +// // do some work +// ... +// } +// +// { +// WorkerThread myThread; +// runStarted.wait (); // ensure that we have started +// // the run function +// } // myThread goes out of scope, is destroyed +// // and the thread is joined +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if defined _WIN32 || defined _WIN64 + #ifdef NOMINMAX + #undef NOMINMAX + #endif + #define NOMINMAX + #include + #include +#elif HAVE_PTHREAD + #include +#endif + +#if defined(OPENEXR_DLL) && !defined(ZENO_STATIC) + #ifdef ILMTHREAD_EXPORTS + #define ILMTHREAD_EXPORT __declspec(dllexport) + #else + #define ILMTHREAD_EXPORT __declspec(dllimport) + #endif +#else + #define ILMTHREAD_EXPORT +#endif + +namespace IlmThread { + +// +// Query function to determine if the current platform supports +// threads AND this library was compiled with threading enabled. +// + +ILMTHREAD_EXPORT bool supportsThreads (); + + +class ILMTHREAD_EXPORT Thread +{ + public: + + Thread (); + virtual ~Thread (); + + void start (); + virtual void run () = 0; + + private: + + #if defined _WIN32 || defined _WIN64 + HANDLE _thread; + #elif HAVE_PTHREAD + pthread_t _thread; + #endif + + void operator = (const Thread& t); // not implemented + Thread (const Thread& t); // not implemented +}; + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadMutex.cpp b/3rdparty/openexr/IlmThread/IlmThreadMutex.cpp new file mode 100644 index 000000000..dfca7f10d --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadMutex.cpp @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Mutex, class Lock -- dummy implementation +// for platforms that do not support threading +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if !defined (_WIN32) && !(_WIN64) && !(HAVE_PTHREAD) + +#include "IlmThreadMutex.h" + +namespace IlmThread { + + +Mutex::Mutex () {} +Mutex::~Mutex () {} +void Mutex::lock () const {} +void Mutex::unlock () const {} + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadMutex.h b/3rdparty/openexr/IlmThread/IlmThreadMutex.h new file mode 100644 index 000000000..354282b26 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadMutex.h @@ -0,0 +1,158 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_ILM_THREAD_MUTEX_H +#define INCLUDED_ILM_THREAD_MUTEX_H + +//----------------------------------------------------------------------------- +// +// class Mutex, class Lock +// +// Class Mutex is a wrapper for a system-dependent mutual exclusion +// mechanism. Actual locking and unlocking of a Mutex object must +// be performed using an instance of a Lock (defined below). +// +// Class lock provides safe locking and unlocking of mutexes even in +// the presence of C++ exceptions. Constructing a Lock object locks +// the mutex; destroying the Lock unlocks the mutex. +// +// Lock objects are not themselves thread-safe. You should never +// share a Lock object among multiple threads. +// +// Typical usage: +// +// Mutex mtx; // Create a Mutex object that is visible +// //to multiple threads +// +// ... // create some threads +// +// // Then, within each thread, construct a critical section like so: +// +// { +// Lock lock (mtx); // Lock constructor locks the mutex +// ... // do some computation on shared data +// } // leaving the block unlocks the mutex +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if defined _WIN32 || defined _WIN64 + #ifdef NOMINMAX + #undef NOMINMAX + #endif + #define NOMINMAX + #include +#elif HAVE_PTHREAD + #include +#endif + +namespace IlmThread { + +class Lock; + + +class Mutex +{ + public: + + Mutex (); + virtual ~Mutex (); + + private: + + void lock () const; + void unlock () const; + + #if defined _WIN32 || defined _WIN64 + mutable CRITICAL_SECTION _mutex; + #elif HAVE_PTHREAD + mutable pthread_mutex_t _mutex; + #endif + + void operator = (const Mutex& M); // not implemented + Mutex (const Mutex& M); // not implemented + + friend class Lock; +}; + + +class Lock +{ + public: + + Lock (const Mutex& m, bool autoLock = true): + _mutex (m), + _locked (false) + { + if (autoLock) + { + _mutex.lock(); + _locked = true; + } + } + + ~Lock () + { + if (_locked) + _mutex.unlock(); + } + + void acquire () + { + _mutex.lock(); + _locked = true; + } + + void release () + { + _mutex.unlock(); + _locked = false; + } + + bool locked () + { + return _locked; + } + + private: + + const Mutex & _mutex; + bool _locked; +}; + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadMutexPosix.cpp b/3rdparty/openexr/IlmThread/IlmThreadMutexPosix.cpp new file mode 100644 index 000000000..5f72c105e --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadMutexPosix.cpp @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Mutex -- implementation for +// platforms that support Posix threads +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if HAVE_PTHREAD + +#include "IlmThreadMutex.h" +#include "Iex.h" +#include + +namespace IlmThread { + + +Mutex::Mutex () +{ + if (int error = ::pthread_mutex_init (&_mutex, 0)) + Iex::throwErrnoExc ("Cannot initialize mutex (%T).", error); +} + + +Mutex::~Mutex () +{ + int error = ::pthread_mutex_destroy (&_mutex); + assert (error == 0); +} + + +void +Mutex::lock () const +{ + if (int error = ::pthread_mutex_lock (&_mutex)) + Iex::throwErrnoExc ("Cannot lock mutex (%T).", error); +} + + +void +Mutex::unlock () const +{ + if (int error = ::pthread_mutex_unlock (&_mutex)) + Iex::throwErrnoExc ("Cannot unlock mutex (%T).", error); +} + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadMutexWin32.cpp b/3rdparty/openexr/IlmThread/IlmThreadMutexWin32.cpp new file mode 100644 index 000000000..1a34c7e13 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadMutexWin32.cpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Mutex -- implementation for Windows +// +//----------------------------------------------------------------------------- + +#include "IlmThreadMutex.h" +#include "Iex.h" + +namespace IlmThread { + + +Mutex::Mutex () +{ + ::InitializeCriticalSection (&_mutex); +} + + +Mutex::~Mutex () +{ + ::DeleteCriticalSection (&_mutex); +} + + +void +Mutex::lock () const +{ + ::EnterCriticalSection (&_mutex); +} + + +void +Mutex::unlock () const +{ + ::LeaveCriticalSection (&_mutex); +} + + +} // namespace IlmThread diff --git a/3rdparty/openexr/IlmThread/IlmThreadPool.cpp b/3rdparty/openexr/IlmThread/IlmThreadPool.cpp new file mode 100644 index 000000000..68f2d03c0 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadPool.cpp @@ -0,0 +1,456 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Task, class ThreadPool, class TaskGroup +// +//----------------------------------------------------------------------------- + +#include "IlmThread.h" +#include "IlmThreadMutex.h" +#include "IlmThreadSemaphore.h" +#include "IlmThreadPool.h" +#include "Iex.h" +#include + +using namespace std; + +namespace IlmThread { +namespace { + +class WorkerThread: public Thread +{ + public: + + WorkerThread (ThreadPool::Data* data); + + virtual void run (); + + private: + + ThreadPool::Data * _data; +}; + +} //namespace + + +struct TaskGroup::Data +{ + Data (); + ~Data (); + + void addTask () ; + void removeTask (); + + Semaphore isEmpty; // used to signal that the taskgroup is empty + int numPending; // number of pending tasks to still execute +}; + + +struct ThreadPool::Data +{ + Data (); + ~Data(); + + void finish (); + bool stopped () const; + void stop (); + + Semaphore taskSemaphore; // threads wait on this for ready tasks + Mutex taskMutex; // mutual exclusion for the tasks list + list tasks; // the list of tasks to execute + size_t numTasks; // fast access to list size + // (list::size() can be O(n)) + + Semaphore threadSemaphore; // signaled when a thread starts executing + Mutex threadMutex; // mutual exclusion for threads list + list threads; // the list of all threads + size_t numThreads; // fast access to list size + + bool stopping; // flag indicating whether to stop threads + Mutex stopMutex; // mutual exclusion for stopping flag +}; + + + +// +// class WorkerThread +// + +WorkerThread::WorkerThread (ThreadPool::Data* data): + _data (data) +{ + start(); +} + + +void +WorkerThread::run () +{ + // + // Signal that the thread has started executing + // + + _data->threadSemaphore.post(); + + while (true) + { + // + // Wait for a task to become available + // + + _data->taskSemaphore.wait(); + + { + Lock taskLock (_data->taskMutex); + + // + // If there is a task pending, pop off the next task in the FIFO + // + + if (_data->numTasks > 0) + { + Task* task = _data->tasks.front(); + TaskGroup* taskGroup = task->group(); + _data->tasks.pop_front(); + _data->numTasks--; + + taskLock.release(); + task->execute(); + taskLock.acquire(); + + delete task; + taskGroup->_data->removeTask(); + } + else if (_data->stopped()) + { + break; + } + } + } +} + + +// +// struct TaskGroup::Data +// + +TaskGroup::Data::Data (): isEmpty (1), numPending (0) +{ + // empty +} + + +TaskGroup::Data::~Data () +{ + // + // A TaskGroup acts like an "inverted" semaphore: if the count + // is above 0 then waiting on the taskgroup will block. This + // destructor waits until the taskgroup is empty before returning. + // + + isEmpty.wait (); +} + + +void +TaskGroup::Data::addTask () +{ + // + // Any access to the taskgroup is protected by a mutex that is + // held by the threadpool. Therefore it is safe to access + // numPending before we wait on the semaphore. + // + + if (numPending++ == 0) + isEmpty.wait (); +} + + +void +TaskGroup::Data::removeTask () +{ + if (--numPending == 0) + isEmpty.post (); +} + + +// +// struct ThreadPool::Data +// + +ThreadPool::Data::Data (): numTasks (0), numThreads (0), stopping (false) +{ + // empty +} + + +ThreadPool::Data::~Data() +{ + Lock lock (threadMutex); + finish (); +} + + +void +ThreadPool::Data::finish () +{ + stop(); + + // + // Signal enough times to allow all threads to stop. + // + // Wait until all threads have started their run functions. + // If we do not wait before we destroy the threads then it's + // possible that the threads have not yet called their run + // functions. + // If this happens then the run function will be called off + // of an invalid object and we will crash, most likely with + // an error like: "pure virtual method called" + // + + for (size_t i = 0; i < numThreads; i++) + { + taskSemaphore.post(); + threadSemaphore.wait(); + } + + // + // Join all the threads + // + + for (list::iterator i = threads.begin(); + i != threads.end(); + ++i) + { + delete (*i); + } + + Lock lock1 (taskMutex); + Lock lock2 (stopMutex); + threads.clear(); + tasks.clear(); + numThreads = 0; + numTasks = 0; + stopping = false; +} + + +bool +ThreadPool::Data::stopped () const +{ + Lock lock (stopMutex); + return stopping; +} + + +void +ThreadPool::Data::stop () +{ + Lock lock (stopMutex); + stopping = true; +} + + +// +// class Task +// + +Task::Task (TaskGroup* g): _group(g) +{ + // empty +} + + +Task::~Task() +{ + // empty +} + + +TaskGroup* +Task::group () +{ + return _group; +} + + +TaskGroup::TaskGroup (): + _data (new Data()) +{ + // empty +} + + +TaskGroup::~TaskGroup () +{ + delete _data; +} + + +// +// class ThreadPool +// + +ThreadPool::ThreadPool (unsigned nthreads): + _data (new Data()) +{ + setNumThreads (nthreads); +} + + +ThreadPool::~ThreadPool () +{ + delete _data; +} + + +int +ThreadPool::numThreads () const +{ + Lock lock (_data->threadMutex); + return _data->numThreads; +} + + +void +ThreadPool::setNumThreads (int count) +{ + if (count < 0) + throw Iex::ArgExc ("Attempt to set the number of threads " + "in a thread pool to a negative value."); + + // + // Lock access to thread list and size + // + + Lock lock (_data->threadMutex); + + if ((size_t)count > _data->numThreads) + { + // + // Add more threads + // + + while (_data->numThreads < (size_t)count) + { + _data->threads.push_back (new WorkerThread (_data)); + _data->numThreads++; + } + } + else if ((size_t)count < _data->numThreads) + { + // + // Wait until all existing threads are finished processing, + // then delete all threads. + // + + _data->finish (); + + // + // Add in new threads + // + + while (_data->numThreads < (size_t)count) + { + _data->threads.push_back (new WorkerThread (_data)); + _data->numThreads++; + } + } +} + + +void +ThreadPool::addTask (Task* task) +{ + // + // Lock the threads, needed to access numThreads + // + + Lock lock (_data->threadMutex); + + if (_data->numThreads == 0) + { + task->execute (); + delete task; + } + else + { + // + // Get exclusive access to the tasks queue + // + + { + Lock taskLock (_data->taskMutex); + + // + // Push the new task into the FIFO + // + + _data->tasks.push_back (task); + _data->numTasks++; + task->group()->_data->addTask(); + } + + // + // Signal that we have a new task to process + // + + _data->taskSemaphore.post (); + } +} + + +ThreadPool& +ThreadPool::globalThreadPool () +{ + // + // The global thread pool + // + + static ThreadPool gThreadPool (0); + + return gThreadPool; +} + + +void +ThreadPool::addGlobalTask (Task* task) +{ + globalThreadPool().addTask (task); +} + + +} // namespace IlmThread diff --git a/3rdparty/openexr/IlmThread/IlmThreadPool.h b/3rdparty/openexr/IlmThread/IlmThreadPool.h new file mode 100644 index 000000000..7ea91d30e --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadPool.h @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_ILM_THREAD_POOL_H +#define INCLUDED_ILM_THREAD_POOL_H + +//----------------------------------------------------------------------------- +// +// class Task, class ThreadPool, class TaskGroup +// +// Class ThreadPool manages a set of worker threads and accepts +// tasks for processing. Tasks added to the thread pool are +// executed concurrently by the worker threads. +// +// Class Thread provides an abstract interface for a task which +// a ThreadPool works on. Derived classes need to implement the +// execute() function which performs the actual task. +// +// Class TaskTroup allows synchronization on the completion of a set +// of tasks. Every task that is added to a ThreadPool belongs to a +// single TaskGroup. The destructor of the TaskGroup waits for all +// tasks in the group to finish. +// +// Note: if you plan to use the ThreadPool interface in your own +// applications note that the implementation of the ThreadPool calls +// operator delete on tasks as they complete. If you define a custom +// operator new for your tasks, for instance to use a custom heap, +// then you must also write an appropriate operator delete. +// +//----------------------------------------------------------------------------- + +namespace IlmThread { + +class TaskGroup; +class Task; + + +class ThreadPool +{ + public: + + //------------------------------------------------------- + // Constructor -- creates numThreads worker threads which + // wait until a task is available. + //------------------------------------------------------- + + ThreadPool (unsigned numThreads = 0); + + + //----------------------------------------------------------- + // Destructor -- waits for all tasks to complete, joins all + // the threads to the calling thread, and then destroys them. + //----------------------------------------------------------- + + virtual ~ThreadPool (); + + + //-------------------------------------------------------- + // Query and set the number of worker threads in the pool. + // + // Warning: never call setNumThreads from within a worker + // thread as this will almost certainly cause a deadlock + // or crash. + //-------------------------------------------------------- + + int numThreads () const; + void setNumThreads (int count); + + + //------------------------------------------------------------ + // Add a task for processing. The ThreadPool can handle any + // number of tasks regardless of the number of worker threads. + // The tasks are first added onto a queue, and are executed + // by threads as they become available, in FIFO order. + //------------------------------------------------------------ + + void addTask (Task* task); + + + //------------------------------------------- + // Access functions for the global threadpool + //------------------------------------------- + + static ThreadPool& globalThreadPool (); + static void addGlobalTask (Task* task); + + struct Data; + + protected: + + Data * _data; +}; + + +class Task +{ + public: + + Task (TaskGroup* g); + virtual ~Task (); + + virtual void execute () = 0; + TaskGroup * group(); + + protected: + + TaskGroup * _group; +}; + + +class TaskGroup +{ + public: + + TaskGroup(); + ~TaskGroup(); + + struct Data; + Data* const _data; +}; + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadPosix.cpp b/3rdparty/openexr/IlmThread/IlmThreadPosix.cpp new file mode 100644 index 000000000..1fe74f76f --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadPosix.cpp @@ -0,0 +1,98 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Thread -- implementation for +// platforms that support Posix threads +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if HAVE_PTHREAD + +#include "IlmThread.h" +#include "Iex.h" +#include + +extern "C" +{ + typedef void * (* Start) (void *); +} + +namespace IlmThread { + + +bool +supportsThreads () +{ + return true; +} + +namespace { + +void +threadLoop (void * t) +{ + return (reinterpret_cast(t))->run(); +} + +} // namespace + + +Thread::Thread () +{ + // empty +} + + +Thread::~Thread () +{ + int error = ::pthread_join (_thread, 0); + assert (error == 0); +} + + +void +Thread::start () +{ + if (int error = ::pthread_create (&_thread, 0, Start (threadLoop), this)) + Iex::throwErrnoExc ("Cannot create new thread (%T).", error); +} + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadSemaphore.cpp b/3rdparty/openexr/IlmThread/IlmThreadSemaphore.cpp new file mode 100644 index 000000000..2daef6454 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadSemaphore.cpp @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Semaphore -- dummy implementation for +// for platforms that do not support threading +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if !defined (_WIN32) && !(_WIN64) && !(HAVE_PTHREAD) +#include "IlmThreadSemaphore.h" + +namespace IlmThread { + + +Semaphore::Semaphore (unsigned int value) {} +Semaphore::~Semaphore () {} +void Semaphore::wait () {} +bool Semaphore::tryWait () {return true;} +void Semaphore::post () {} +int Semaphore::value () const {return 0;} + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadSemaphore.h b/3rdparty/openexr/IlmThread/IlmThreadSemaphore.h new file mode 100644 index 000000000..a9ba60a12 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadSemaphore.h @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_ILM_THREAD_SEMAPHORE_H +#define INCLUDED_ILM_THREAD_SEMAPHORE_H + +//----------------------------------------------------------------------------- +// +// class Semaphore -- a wrapper class for +// system-dependent counting semaphores +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if defined _WIN32 || defined _WIN64 + #ifdef NOMINMAX + #undef NOMINMAX + #endif + #define NOMINMAX + #include +#elif HAVE_PTHREAD && !HAVE_POSIX_SEMAPHORES + #include +#elif HAVE_PTHREAD && HAVE_POSIX_SEMAPHORES + #include +#endif + +namespace IlmThread { + + +class Semaphore +{ + public: + + Semaphore (unsigned int value = 0); + virtual ~Semaphore(); + + void wait(); + bool tryWait(); + void post(); + int value() const; + + private: + + #if defined _WIN32 || defined _WIN64 + + mutable HANDLE _semaphore; + + #elif HAVE_PTHREAD && !HAVE_POSIX_SEMAPHORES + + // + // If the platform has Posix threads but no semapohores, + // then we implement them ourselves using condition variables + // + + struct sema_t + { + unsigned int count; + unsigned long numWaiting; + pthread_mutex_t mutex; + pthread_cond_t nonZero; + }; + + mutable sema_t _semaphore; + + #elif HAVE_PTHREAD && HAVE_POSIX_SEMAPHORES + + mutable sem_t _semaphore; + + #endif + + void operator = (const Semaphore& s); // not implemented + Semaphore (const Semaphore& s); // not implemented +}; + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadSemaphorePosix.cpp b/3rdparty/openexr/IlmThread/IlmThreadSemaphorePosix.cpp new file mode 100644 index 000000000..b5e206eba --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadSemaphorePosix.cpp @@ -0,0 +1,103 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Semaphore -- implementation for platforms +// that support Posix threads and Posix semaphores +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if HAVE_PTHREAD && HAVE_POSIX_SEMAPHORES + +#include "IlmThreadSemaphore.h" +#include "Iex.h" +#include + +namespace IlmThread { + + +Semaphore::Semaphore (unsigned int value) +{ + if (::sem_init (&_semaphore, 0, value)) + Iex::throwErrnoExc ("Cannot initialize semaphore (%T)."); +} + + +Semaphore::~Semaphore () +{ + int error = ::sem_destroy (&_semaphore); + assert (error == 0); +} + + +void +Semaphore::wait () +{ + ::sem_wait (&_semaphore); +} + + +bool +Semaphore::tryWait () +{ + return sem_trywait (&_semaphore) == 0; +} + + +void +Semaphore::post () +{ + if (::sem_post (&_semaphore)) + Iex::throwErrnoExc ("Post operation on semaphore failed (%T)."); +} + + +int +Semaphore::value () const +{ + int value; + + if (::sem_getvalue (&_semaphore, &value)) + Iex::throwErrnoExc ("Cannot read semaphore value (%T)."); + + return value; +} + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadSemaphorePosixCompat.cpp b/3rdparty/openexr/IlmThread/IlmThreadSemaphorePosixCompat.cpp new file mode 100644 index 000000000..33f2a5b11 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadSemaphorePosixCompat.cpp @@ -0,0 +1,155 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Semaphore -- implementation for for platforms that do +// support Posix threads but do not support Posix semaphores, +// for example, OS X +// +//----------------------------------------------------------------------------- + +#include "IlmBaseConfig.h" + +#if HAVE_PTHREAD && !HAVE_POSIX_SEMAPHORES + +#include "IlmThreadSemaphore.h" +#include "Iex.h" +#include + +namespace IlmThread { + + +Semaphore::Semaphore (unsigned int value) +{ + if (int error = ::pthread_mutex_init (&_semaphore.mutex, 0)) + Iex::throwErrnoExc ("Cannot initialize mutex (%T).", error); + + if (int error = ::pthread_cond_init (&_semaphore.nonZero, 0)) + Iex::throwErrnoExc ("Cannot initialize condition variable (%T).", + error); + + _semaphore.count = value; + _semaphore.numWaiting = 0; +} + + +Semaphore::~Semaphore () +{ + int error = ::pthread_cond_destroy (&_semaphore.nonZero); + assert (error == 0); + error = ::pthread_mutex_destroy (&_semaphore.mutex); + assert (error == 0); +} + + +void +Semaphore::wait () +{ + ::pthread_mutex_lock (&_semaphore.mutex); + + _semaphore.numWaiting++; + + while (_semaphore.count == 0) + { + if (int error = ::pthread_cond_wait (&_semaphore.nonZero, + &_semaphore.mutex)) + { + ::pthread_mutex_unlock (&_semaphore.mutex); + + Iex::throwErrnoExc ("Cannot wait on condition variable (%T).", + error); + } + } + + _semaphore.numWaiting--; + _semaphore.count--; + + ::pthread_mutex_unlock (&_semaphore.mutex); +} + + +bool +Semaphore::tryWait () +{ + ::pthread_mutex_lock (&_semaphore.mutex); + + if (_semaphore.count == 0) + { + ::pthread_mutex_unlock (&_semaphore.mutex); + return false; + } + else + { + _semaphore.count--; + ::pthread_mutex_unlock (&_semaphore.mutex); + return true; + } +} + + +void +Semaphore::post () +{ + ::pthread_mutex_lock (&_semaphore.mutex); + + if (_semaphore.numWaiting > 0) + { + if (int error = ::pthread_cond_signal (&_semaphore.nonZero)) + { + ::pthread_mutex_unlock (&_semaphore.mutex); + + Iex::throwErrnoExc ("Cannot signal condition variable (%T).", + error); + } + } + + _semaphore.count++; + ::pthread_mutex_unlock (&_semaphore.mutex); +} + + +int +Semaphore::value () const +{ + ::pthread_mutex_lock (&_semaphore.mutex); + int value = _semaphore.count; + ::pthread_mutex_unlock (&_semaphore.mutex); + return value; +} + + +} // namespace IlmThread + +#endif diff --git a/3rdparty/openexr/IlmThread/IlmThreadSemaphoreWin32.cpp b/3rdparty/openexr/IlmThread/IlmThreadSemaphoreWin32.cpp new file mode 100644 index 000000000..19cd625ba --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadSemaphoreWin32.cpp @@ -0,0 +1,146 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Semaphore -- implementation for Windows +// +//----------------------------------------------------------------------------- + +#include "IlmThreadSemaphore.h" +#include "Iex.h" +#include +#include +#include + +namespace IlmThread { + +using namespace Iex; + +namespace { + +std::string +errorString () +{ + LPSTR messageBuffer; + DWORD bufferLength; + std::string message; + + // + // Call FormatMessage() to allow for message + // text to be acquired from the system. + // + + if (bufferLength = FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_FROM_SYSTEM, + 0, + GetLastError (), + MAKELANGID (LANG_NEUTRAL, + SUBLANG_DEFAULT), + (LPSTR) &messageBuffer, + 0, + NULL)) + { + message = messageBuffer; + LocalFree (messageBuffer); + } + + return message; +} + +} // namespace + + +Semaphore::Semaphore (unsigned int value) +{ + if ((_semaphore = ::CreateSemaphore (0, value, 0x7fffffff, 0)) == 0) + { + THROW (LogicExc, "Could not create semaphore " + "(" << errorString() << ")."); + } +} + + +Semaphore::~Semaphore() +{ + bool ok = ::CloseHandle (_semaphore) != FALSE; + assert (ok); +} + + +void +Semaphore::wait() +{ + if (::WaitForSingleObject (_semaphore, INFINITE) != WAIT_OBJECT_0) + { + THROW (LogicExc, "Could not wait on semaphore " + "(" << errorString() << ")."); + } +} + + +bool +Semaphore::tryWait() +{ + return ::WaitForSingleObject (_semaphore, 0) == WAIT_OBJECT_0; +} + + +void +Semaphore::post() +{ + if (!::ReleaseSemaphore (_semaphore, 1, 0)) + { + THROW (LogicExc, "Could not post on semaphore " + "(" << errorString() << ")."); + } +} + + +int +Semaphore::value() const +{ + LONG v = -1; + + if (!::ReleaseSemaphore (_semaphore, 0, &v) || v < 0) + { + THROW (LogicExc, "Could not get value of semaphore " + "(" << errorString () << ")."); + } + + return v; +} + +} // namespace IlmThread diff --git a/3rdparty/openexr/IlmThread/IlmThreadWin32.cpp b/3rdparty/openexr/IlmThread/IlmThreadWin32.cpp new file mode 100644 index 000000000..cd54759c2 --- /dev/null +++ b/3rdparty/openexr/IlmThread/IlmThreadWin32.cpp @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2005, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// class Thread -- implementation for Windows +// +//----------------------------------------------------------------------------- + + +#include "IlmThread.h" +#include "Iex.h" +#include +#include + +namespace IlmThread { + + +bool +supportsThreads () +{ + return true; +} + +namespace { + +unsigned __stdcall +threadLoop (void * t) +{ + reinterpret_cast(t)->run(); + _endthreadex (0); + return 0; +} + +} // namespace + + +Thread::Thread () +{ + // empty +} + + +Thread::~Thread () +{ + DWORD status = ::WaitForSingleObject (_thread, INFINITE); + assert (status == WAIT_OBJECT_0); + bool ok = ::CloseHandle (_thread) != FALSE; + assert (ok); +} + + +void +Thread::start () +{ + unsigned id; + _thread = (HANDLE)::_beginthreadex (0, 0, &threadLoop, this, 0, &id); + + if (_thread == 0) + Iex::throwErrnoExc ("Cannot create new thread (%T)."); +} + + +} // namespace IlmThread diff --git a/3rdparty/openexr/Imath/ImathBox.cpp b/3rdparty/openexr/Imath/ImathBox.cpp new file mode 100644 index 000000000..07bddfd3b --- /dev/null +++ b/3rdparty/openexr/Imath/ImathBox.cpp @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + +#include "ImathBox.h" + +// this file is necessary for template instantiation on windows diff --git a/3rdparty/openexr/Imath/ImathBox.h b/3rdparty/openexr/Imath/ImathBox.h new file mode 100644 index 000000000..7dc4eb782 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathBox.h @@ -0,0 +1,850 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHBOX_H +#define INCLUDED_IMATHBOX_H + +//------------------------------------------------------------------- +// +// class Imath::Box +// -------------------------------- +// +// This class imposes the following requirements on its +// parameter class: +// +// 1) The class T must implement these operators: +// + - < > <= >= = +// with the signature (T,T) and the expected +// return values for a numeric type. +// +// 2) The class T must implement operator= +// with the signature (T,float and/or double) +// +// 3) The class T must have a constructor which takes +// a float (and/or double) for use in initializing the box. +// +// 4) The class T must have a function T::dimensions() +// which returns the number of dimensions in the class +// (since its assumed its a vector) -- preferably, this +// returns a constant expression. +// +//------------------------------------------------------------------- + +#include "ImathVec.h" + +namespace Imath { + + +template +class Box +{ + public: + + //------------------------- + // Data Members are public + //------------------------- + + T min; + T max; + + //----------------------------------------------------- + // Constructors - an "empty" box is created by default + //----------------------------------------------------- + + Box (); + Box (const T &point); + Box (const T &minT, const T &maxT); + + //-------------------- + // Operators: ==, != + //-------------------- + + bool operator == (const Box &src) const; + bool operator != (const Box &src) const; + + //------------------ + // Box manipulation + //------------------ + + void makeEmpty (); + void extendBy (const T &point); + void extendBy (const Box &box); + void makeInfinite (); + + //--------------------------------------------------- + // Query functions - these compute results each time + //--------------------------------------------------- + + T size () const; + T center () const; + bool intersects (const T &point) const; + bool intersects (const Box &box) const; + + unsigned int majorAxis () const; + + //---------------- + // Classification + //---------------- + + bool isEmpty () const; + bool hasVolume () const; + bool isInfinite () const; +}; + + +//-------------------- +// Convenient typedefs +//-------------------- + +typedef Box Box2s; +typedef Box Box2i; +typedef Box Box2f; +typedef Box Box2d; +typedef Box Box3s; +typedef Box Box3i; +typedef Box Box3f; +typedef Box Box3d; + + +//---------------- +// Implementation + + +template +inline Box::Box() +{ + makeEmpty(); +} + + +template +inline Box::Box (const T &point) +{ + min = point; + max = point; +} + + +template +inline Box::Box (const T &minT, const T &maxT) +{ + min = minT; + max = maxT; +} + + +template +inline bool +Box::operator == (const Box &src) const +{ + return (min == src.min && max == src.max); +} + + +template +inline bool +Box::operator != (const Box &src) const +{ + return (min != src.min || max != src.max); +} + + +template +inline void Box::makeEmpty() +{ + min = T(T::baseTypeMax()); + max = T(T::baseTypeMin()); +} + +template +inline void Box::makeInfinite() +{ + min = T(T::baseTypeMin()); + max = T(T::baseTypeMax()); +} + + +template +inline void +Box::extendBy(const T &point) +{ + for (unsigned int i = 0; i < min.dimensions(); i++) + { + if (point[i] < min[i]) + min[i] = point[i]; + + if (point[i] > max[i]) + max[i] = point[i]; + } +} + + +template +inline void +Box::extendBy(const Box &box) +{ + for (unsigned int i = 0; i < min.dimensions(); i++) + { + if (box.min[i] < min[i]) + min[i] = box.min[i]; + + if (box.max[i] > max[i]) + max[i] = box.max[i]; + } +} + + +template +inline bool +Box::intersects(const T &point) const +{ + for (unsigned int i = 0; i < min.dimensions(); i++) + { + if (point[i] < min[i] || point[i] > max[i]) + return false; + } + + return true; +} + + +template +inline bool +Box::intersects(const Box &box) const +{ + for (unsigned int i = 0; i < min.dimensions(); i++) + { + if (box.max[i] < min[i] || box.min[i] > max[i]) + return false; + } + + return true; +} + + +template +inline T +Box::size() const +{ + if (isEmpty()) + return T (0); + + return max - min; +} + + +template +inline T +Box::center() const +{ + return (max + min) / 2; +} + + +template +inline bool +Box::isEmpty() const +{ + for (unsigned int i = 0; i < min.dimensions(); i++) + { + if (max[i] < min[i]) + return true; + } + + return false; +} + +template +inline bool +Box::isInfinite() const +{ + for (unsigned int i = 0; i < min.dimensions(); i++) + { + if (min[i] != T::baseTypeMin() || max[i] != T::baseTypeMax()) + return false; + } + + return true; +} + + +template +inline bool +Box::hasVolume() const +{ + for (unsigned int i = 0; i < min.dimensions(); i++) + { + if (max[i] <= min[i]) + return false; + } + + return true; +} + + +template +inline unsigned int +Box::majorAxis() const +{ + unsigned int major = 0; + T s = size(); + + for (unsigned int i = 1; i < min.dimensions(); i++) + { + if (s[i] > s[major]) + major = i; + } + + return major; +} + +//------------------------------------------------------------------- +// +// Partial class specializations for Imath::Vec2 and Imath::Vec3 +// +//------------------------------------------------------------------- + +template class Box; + +template +class Box > +{ + public: + + //------------------------- + // Data Members are public + //------------------------- + + Vec2 min; + Vec2 max; + + //----------------------------------------------------- + // Constructors - an "empty" box is created by default + //----------------------------------------------------- + + Box(); + Box (const Vec2 &point); + Box (const Vec2 &minT, const Vec2 &maxT); + + //-------------------- + // Operators: ==, != + //-------------------- + + bool operator == (const Box > &src) const; + bool operator != (const Box > &src) const; + + //------------------ + // Box manipulation + //------------------ + + void makeEmpty(); + void extendBy (const Vec2 &point); + void extendBy (const Box > &box); + void makeInfinite(); + + //--------------------------------------------------- + // Query functions - these compute results each time + //--------------------------------------------------- + + Vec2 size() const; + Vec2 center() const; + bool intersects (const Vec2 &point) const; + bool intersects (const Box > &box) const; + + unsigned int majorAxis() const; + + //---------------- + // Classification + //---------------- + + bool isEmpty() const; + bool hasVolume() const; + bool isInfinite() const; +}; + + +//---------------- +// Implementation + +template +inline Box >::Box() +{ + makeEmpty(); +} + + +template +inline Box >::Box (const Vec2 &point) +{ + min = point; + max = point; +} + + +template +inline Box >::Box (const Vec2 &minT, const Vec2 &maxT) +{ + min = minT; + max = maxT; +} + + +template +inline bool +Box >::operator == (const Box > &src) const +{ + return (min == src.min && max == src.max); +} + + +template +inline bool +Box >::operator != (const Box > &src) const +{ + return (min != src.min || max != src.max); +} + + +template +inline void Box >::makeEmpty() +{ + min = Vec2(Vec2::baseTypeMax()); + max = Vec2(Vec2::baseTypeMin()); +} + +template +inline void Box >::makeInfinite() +{ + min = Vec2(Vec2::baseTypeMin()); + max = Vec2(Vec2::baseTypeMax()); +} + + +template +inline void +Box >::extendBy (const Vec2 &point) +{ + if (point[0] < min[0]) + min[0] = point[0]; + + if (point[0] > max[0]) + max[0] = point[0]; + + if (point[1] < min[1]) + min[1] = point[1]; + + if (point[1] > max[1]) + max[1] = point[1]; +} + + +template +inline void +Box >::extendBy (const Box > &box) +{ + if (box.min[0] < min[0]) + min[0] = box.min[0]; + + if (box.max[0] > max[0]) + max[0] = box.max[0]; + + if (box.min[1] < min[1]) + min[1] = box.min[1]; + + if (box.max[1] > max[1]) + max[1] = box.max[1]; +} + + +template +inline bool +Box >::intersects (const Vec2 &point) const +{ + if (point[0] < min[0] || point[0] > max[0] || + point[1] < min[1] || point[1] > max[1]) + return false; + + return true; +} + + +template +inline bool +Box >::intersects (const Box > &box) const +{ + if (box.max[0] < min[0] || box.min[0] > max[0] || + box.max[1] < min[1] || box.min[1] > max[1]) + return false; + + return true; +} + + +template +inline Vec2 +Box >::size() const +{ + if (isEmpty()) + return Vec2 (0); + + return max - min; +} + + +template +inline Vec2 +Box >::center() const +{ + return (max + min) / 2; +} + + +template +inline bool +Box >::isEmpty() const +{ + if (max[0] < min[0] || + max[1] < min[1]) + return true; + + return false; +} + +template +inline bool +Box > ::isInfinite() const +{ + if (min[0] != limits::min() || max[0] != limits::max() || + min[1] != limits::min() || max[1] != limits::max()) + return false; + + return true; +} + + +template +inline bool +Box >::hasVolume() const +{ + if (max[0] <= min[0] || + max[1] <= min[1]) + return false; + + return true; +} + + +template +inline unsigned int +Box >::majorAxis() const +{ + unsigned int major = 0; + Vec2 s = size(); + + if (s[1] > s[major]) + major = 1; + + return major; +} + + +template +class Box > +{ + public: + + //------------------------- + // Data Members are public + //------------------------- + + Vec3 min; + Vec3 max; + + //----------------------------------------------------- + // Constructors - an "empty" box is created by default + //----------------------------------------------------- + + Box(); + Box (const Vec3 &point); + Box (const Vec3 &minT, const Vec3 &maxT); + + //-------------------- + // Operators: ==, != + //-------------------- + + bool operator == (const Box > &src) const; + bool operator != (const Box > &src) const; + + //------------------ + // Box manipulation + //------------------ + + void makeEmpty(); + void extendBy (const Vec3 &point); + void extendBy (const Box > &box); + void makeInfinite (); + + //--------------------------------------------------- + // Query functions - these compute results each time + //--------------------------------------------------- + + Vec3 size() const; + Vec3 center() const; + bool intersects (const Vec3 &point) const; + bool intersects (const Box > &box) const; + + unsigned int majorAxis() const; + + //---------------- + // Classification + //---------------- + + bool isEmpty() const; + bool hasVolume() const; + bool isInfinite() const; +}; + + +//---------------- +// Implementation + + +template +inline Box >::Box() +{ + makeEmpty(); +} + + +template +inline Box >::Box (const Vec3 &point) +{ + min = point; + max = point; +} + + +template +inline Box >::Box (const Vec3 &minT, const Vec3 &maxT) +{ + min = minT; + max = maxT; +} + + +template +inline bool +Box >::operator == (const Box > &src) const +{ + return (min == src.min && max == src.max); +} + + +template +inline bool +Box >::operator != (const Box > &src) const +{ + return (min != src.min || max != src.max); +} + + +template +inline void Box >::makeEmpty() +{ + min = Vec3(Vec3::baseTypeMax()); + max = Vec3(Vec3::baseTypeMin()); +} + +template +inline void Box >::makeInfinite() +{ + min = Vec3(Vec3::baseTypeMin()); + max = Vec3(Vec3::baseTypeMax()); +} + + +template +inline void +Box >::extendBy (const Vec3 &point) +{ + if (point[0] < min[0]) + min[0] = point[0]; + + if (point[0] > max[0]) + max[0] = point[0]; + + if (point[1] < min[1]) + min[1] = point[1]; + + if (point[1] > max[1]) + max[1] = point[1]; + + if (point[2] < min[2]) + min[2] = point[2]; + + if (point[2] > max[2]) + max[2] = point[2]; +} + + +template +inline void +Box >::extendBy (const Box > &box) +{ + if (box.min[0] < min[0]) + min[0] = box.min[0]; + + if (box.max[0] > max[0]) + max[0] = box.max[0]; + + if (box.min[1] < min[1]) + min[1] = box.min[1]; + + if (box.max[1] > max[1]) + max[1] = box.max[1]; + + if (box.min[2] < min[2]) + min[2] = box.min[2]; + + if (box.max[2] > max[2]) + max[2] = box.max[2]; +} + + +template +inline bool +Box >::intersects (const Vec3 &point) const +{ + if (point[0] < min[0] || point[0] > max[0] || + point[1] < min[1] || point[1] > max[1] || + point[2] < min[2] || point[2] > max[2]) + return false; + + return true; +} + + +template +inline bool +Box >::intersects (const Box > &box) const +{ + if (box.max[0] < min[0] || box.min[0] > max[0] || + box.max[1] < min[1] || box.min[1] > max[1] || + box.max[2] < min[2] || box.min[2] > max[2]) + return false; + + return true; +} + + +template +inline Vec3 +Box >::size() const +{ + if (isEmpty()) + return Vec3 (0); + + return max - min; +} + + +template +inline Vec3 +Box >::center() const +{ + return (max + min) / 2; +} + + +template +inline bool +Box >::isEmpty() const +{ + if (max[0] < min[0] || + max[1] < min[1] || + max[2] < min[2]) + return true; + + return false; +} + +template +inline bool +Box >::isInfinite() const +{ + if (min[0] != limits::min() || max[0] != limits::max() || + min[1] != limits::min() || max[1] != limits::max() || + min[2] != limits::min() || max[2] != limits::max()) + return false; + + return true; +} + + +template +inline bool +Box >::hasVolume() const +{ + if (max[0] <= min[0] || + max[1] <= min[1] || + max[2] <= min[2]) + return false; + + return true; +} + + +template +inline unsigned int +Box >::majorAxis() const +{ + unsigned int major = 0; + Vec3 s = size(); + + if (s[1] > s[major]) + major = 1; + + if (s[2] > s[major]) + major = 2; + + return major; +} + + + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathBoxAlgo.h b/3rdparty/openexr/Imath/ImathBoxAlgo.h new file mode 100644 index 000000000..3d6e4e0c6 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathBoxAlgo.h @@ -0,0 +1,1015 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2010, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHBOXALGO_H +#define INCLUDED_IMATHBOXALGO_H + + +//--------------------------------------------------------------------------- +// +// This file contains algorithms applied to or in conjunction +// with bounding boxes (Imath::Box). These algorithms require +// more headers to compile. The assumption made is that these +// functions are called much less often than the basic box +// functions or these functions require more support classes. +// +// Contains: +// +// T clip(const T& in, const Box& box) +// +// Vec3 closestPointOnBox(const Vec3&, const Box>& ) +// +// Vec3 closestPointInBox(const Vec3&, const Box>& ) +// +// Box< Vec3 > transform(const Box>&, const Matrix44&) +// Box< Vec3 > affineTransform(const Box>&, const Matrix44&) +// +// void transform(const Box>&, const Matrix44&, Box>&) +// void affineTransform(const Box>&, +// const Matrix44&, +// Box>&) +// +// bool findEntryAndExitPoints(const Line &line, +// const Box< Vec3 > &box, +// Vec3 &enterPoint, +// Vec3 &exitPoint) +// +// bool intersects(const Box> &box, +// const Line3 &ray, +// Vec3 intersectionPoint) +// +// bool intersects(const Box> &box, const Line3 &ray) +// +//--------------------------------------------------------------------------- + +#include "ImathBox.h" +#include "ImathMatrix.h" +#include "ImathLineAlgo.h" +#include "ImathPlane.h" + +namespace Imath { + + +template +inline T +clip (const T &p, const Box &box) +{ + // + // Clip the coordinates of a point, p, against a box. + // The result, q, is the closest point to p that is inside the box. + // + + T q; + + for (int i = 0; i < int (box.min.dimensions()); i++) + { + if (p[i] < box.min[i]) + q[i] = box.min[i]; + else if (p[i] > box.max[i]) + q[i] = box.max[i]; + else + q[i] = p[i]; + } + + return q; +} + + +template +inline T +closestPointInBox (const T &p, const Box &box) +{ + return clip (p, box); +} + + +template +Vec3 +closestPointOnBox (const Vec3 &p, const Box< Vec3 > &box) +{ + // + // Find the point, q, on the surface of + // the box, that is closest to point p. + // + // If the box is empty, return p. + // + + if (box.isEmpty()) + return p; + + Vec3 q = closestPointInBox (p, box); + + if (q == p) + { + Vec3 d1 = p - box.min; + Vec3 d2 = box.max - p; + + Vec3 d ((d1.x < d2.x)? d1.x: d2.x, + (d1.y < d2.y)? d1.y: d2.y, + (d1.z < d2.z)? d1.z: d2.z); + + if (d.x < d.y && d.x < d.z) + { + q.x = (d1.x < d2.x)? box.min.x: box.max.x; + } + else if (d.y < d.z) + { + q.y = (d1.y < d2.y)? box.min.y: box.max.y; + } + else + { + q.z = (d1.z < d2.z)? box.min.z: box.max.z; + } + } + + return q; +} + + +template +Box< Vec3 > +transform (const Box< Vec3 > &box, const Matrix44 &m) +{ + // + // Transform a 3D box by a matrix, and compute a new box that + // tightly encloses the transformed box. + // + // If m is an affine transform, then we use James Arvo's fast + // method as described in "Graphics Gems", Academic Press, 1990, + // pp. 548-550. + // + + // + // A transformed empty box is still empty, and a transformed infinite box + // is still infinite + // + + if (box.isEmpty() || box.isInfinite()) + return box; + + // + // If the last column of m is (0 0 0 1) then m is an affine + // transform, and we use the fast Graphics Gems trick. + // + + if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1) + { + Box< Vec3 > newBox; + + for (int i = 0; i < 3; i++) + { + newBox.min[i] = newBox.max[i] = (S) m[3][i]; + + for (int j = 0; j < 3; j++) + { + S a, b; + + a = (S) m[j][i] * box.min[j]; + b = (S) m[j][i] * box.max[j]; + + if (a < b) + { + newBox.min[i] += a; + newBox.max[i] += b; + } + else + { + newBox.min[i] += b; + newBox.max[i] += a; + } + } + } + + return newBox; + } + + // + // M is a projection matrix. Do things the naive way: + // Transform the eight corners of the box, and find an + // axis-parallel box that encloses the transformed corners. + // + + Vec3 points[8]; + + points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0]; + points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0]; + + points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1]; + points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1]; + + points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2]; + points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2]; + + Box< Vec3 > newBox; + + for (int i = 0; i < 8; i++) + newBox.extendBy (points[i] * m); + + return newBox; +} + +template +void +transform (const Box< Vec3 > &box, + const Matrix44 &m, + Box< Vec3 > &result) +{ + // + // Transform a 3D box by a matrix, and compute a new box that + // tightly encloses the transformed box. + // + // If m is an affine transform, then we use James Arvo's fast + // method as described in "Graphics Gems", Academic Press, 1990, + // pp. 548-550. + // + + // + // A transformed empty box is still empty, and a transformed infinite + // box is still infinite + // + + if (box.isEmpty() || box.isInfinite()) + { + return; + } + + // + // If the last column of m is (0 0 0 1) then m is an affine + // transform, and we use the fast Graphics Gems trick. + // + + if (m[0][3] == 0 && m[1][3] == 0 && m[2][3] == 0 && m[3][3] == 1) + { + for (int i = 0; i < 3; i++) + { + result.min[i] = result.max[i] = (S) m[3][i]; + + for (int j = 0; j < 3; j++) + { + S a, b; + + a = (S) m[j][i] * box.min[j]; + b = (S) m[j][i] * box.max[j]; + + if (a < b) + { + result.min[i] += a; + result.max[i] += b; + } + else + { + result.min[i] += b; + result.max[i] += a; + } + } + } + + return; + } + + // + // M is a projection matrix. Do things the naive way: + // Transform the eight corners of the box, and find an + // axis-parallel box that encloses the transformed corners. + // + + Vec3 points[8]; + + points[0][0] = points[1][0] = points[2][0] = points[3][0] = box.min[0]; + points[4][0] = points[5][0] = points[6][0] = points[7][0] = box.max[0]; + + points[0][1] = points[1][1] = points[4][1] = points[5][1] = box.min[1]; + points[2][1] = points[3][1] = points[6][1] = points[7][1] = box.max[1]; + + points[0][2] = points[2][2] = points[4][2] = points[6][2] = box.min[2]; + points[1][2] = points[3][2] = points[5][2] = points[7][2] = box.max[2]; + + for (int i = 0; i < 8; i++) + result.extendBy (points[i] * m); +} + + +template +Box< Vec3 > +affineTransform (const Box< Vec3 > &box, const Matrix44 &m) +{ + // + // Transform a 3D box by a matrix whose rightmost column + // is (0 0 0 1), and compute a new box that tightly encloses + // the transformed box. + // + // As in the transform() function, above, we use James Arvo's + // fast method. + // + + if (box.isEmpty() || box.isInfinite()) + { + // + // A transformed empty or infinite box is still empty or infinite + // + + return box; + } + + Box< Vec3 > newBox; + + for (int i = 0; i < 3; i++) + { + newBox.min[i] = newBox.max[i] = (S) m[3][i]; + + for (int j = 0; j < 3; j++) + { + S a, b; + + a = (S) m[j][i] * box.min[j]; + b = (S) m[j][i] * box.max[j]; + + if (a < b) + { + newBox.min[i] += a; + newBox.max[i] += b; + } + else + { + newBox.min[i] += b; + newBox.max[i] += a; + } + } + } + + return newBox; +} + +template +void +affineTransform (const Box< Vec3 > &box, + const Matrix44 &m, + Box > &result) +{ + // + // Transform a 3D box by a matrix whose rightmost column + // is (0 0 0 1), and compute a new box that tightly encloses + // the transformed box. + // + // As in the transform() function, above, we use James Arvo's + // fast method. + // + + if (box.isEmpty()) + { + // + // A transformed empty box is still empty + // + result.makeEmpty(); + return; + } + + if (box.isInfinite()) + { + // + // A transformed infinite box is still infinite + // + result.makeInfinite(); + return; + } + + for (int i = 0; i < 3; i++) + { + result.min[i] = result.max[i] = (S) m[3][i]; + + for (int j = 0; j < 3; j++) + { + S a, b; + + a = (S) m[j][i] * box.min[j]; + b = (S) m[j][i] * box.max[j]; + + if (a < b) + { + result.min[i] += a; + result.max[i] += b; + } + else + { + result.min[i] += b; + result.max[i] += a; + } + } + } +} + + +template +bool +findEntryAndExitPoints (const Line3 &r, + const Box > &b, + Vec3 &entry, + Vec3 &exit) +{ + // + // Compute the points where a ray, r, enters and exits a box, b: + // + // findEntryAndExitPoints() returns + // + // - true if the ray starts inside the box or if the + // ray starts outside and intersects the box + // + // - false otherwise (that is, if the ray does not + // intersect the box) + // + // The entry and exit points are + // + // - points on two of the faces of the box when + // findEntryAndExitPoints() returns true + // (The entry end exit points may be on either + // side of the ray's origin) + // + // - undefined when findEntryAndExitPoints() + // returns false + // + + if (b.isEmpty()) + { + // + // No ray intersects an empty box + // + + return false; + } + + // + // The following description assumes that the ray's origin is outside + // the box, but the code below works even if the origin is inside the + // box: + // + // Between one and three "frontfacing" sides of the box are oriented + // towards the ray's origin, and between one and three "backfacing" + // sides are oriented away from the ray's origin. + // We intersect the ray with the planes that contain the sides of the + // box, and compare the distances between the ray's origin and the + // ray-plane intersections. The ray intersects the box if the most + // distant frontfacing intersection is nearer than the nearest + // backfacing intersection. If the ray does intersect the box, then + // the most distant frontfacing ray-plane intersection is the entry + // point and the nearest backfacing ray-plane intersection is the + // exit point. + // + + const T TMAX = limits::max(); + + T tFrontMax = -TMAX; + T tBackMin = TMAX; + + // + // Minimum and maximum X sides. + // + + if (r.dir.x >= 0) + { + T d1 = b.max.x - r.pos.x; + T d2 = b.min.x - r.pos.x; + + if (r.dir.x > 1 || + (abs (d1) < TMAX * r.dir.x && + abs (d2) < TMAX * r.dir.x)) + { + T t1 = d1 / r.dir.x; + T t2 = d2 / r.dir.x; + + if (tBackMin > t1) + { + tBackMin = t1; + + exit.x = b.max.x; + exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); + exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); + } + + if (tFrontMax < t2) + { + tFrontMax = t2; + + entry.x = b.min.x; + entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); + entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); + } + } + else if (r.pos.x < b.min.x || r.pos.x > b.max.x) + { + return false; + } + } + else // r.dir.x < 0 + { + T d1 = b.min.x - r.pos.x; + T d2 = b.max.x - r.pos.x; + + if (r.dir.x < -1 || + (abs (d1) < -TMAX * r.dir.x && + abs (d2) < -TMAX * r.dir.x)) + { + T t1 = d1 / r.dir.x; + T t2 = d2 / r.dir.x; + + if (tBackMin > t1) + { + tBackMin = t1; + + exit.x = b.min.x; + exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); + exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); + } + + if (tFrontMax < t2) + { + tFrontMax = t2; + + entry.x = b.max.x; + entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); + entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); + } + } + else if (r.pos.x < b.min.x || r.pos.x > b.max.x) + { + return false; + } + } + + // + // Minimum and maximum Y sides. + // + + if (r.dir.y >= 0) + { + T d1 = b.max.y - r.pos.y; + T d2 = b.min.y - r.pos.y; + + if (r.dir.y > 1 || + (abs (d1) < TMAX * r.dir.y && + abs (d2) < TMAX * r.dir.y)) + { + T t1 = d1 / r.dir.y; + T t2 = d2 / r.dir.y; + + if (tBackMin > t1) + { + tBackMin = t1; + + exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); + exit.y = b.max.y; + exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); + } + + if (tFrontMax < t2) + { + tFrontMax = t2; + + entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); + entry.y = b.min.y; + entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); + } + } + else if (r.pos.y < b.min.y || r.pos.y > b.max.y) + { + return false; + } + } + else // r.dir.y < 0 + { + T d1 = b.min.y - r.pos.y; + T d2 = b.max.y - r.pos.y; + + if (r.dir.y < -1 || + (abs (d1) < -TMAX * r.dir.y && + abs (d2) < -TMAX * r.dir.y)) + { + T t1 = d1 / r.dir.y; + T t2 = d2 / r.dir.y; + + if (tBackMin > t1) + { + tBackMin = t1; + + exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); + exit.y = b.min.y; + exit.z = clamp (r.pos.z + t1 * r.dir.z, b.min.z, b.max.z); + } + + if (tFrontMax < t2) + { + tFrontMax = t2; + + entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); + entry.y = b.max.y; + entry.z = clamp (r.pos.z + t2 * r.dir.z, b.min.z, b.max.z); + } + } + else if (r.pos.y < b.min.y || r.pos.y > b.max.y) + { + return false; + } + } + + // + // Minimum and maximum Z sides. + // + + if (r.dir.z >= 0) + { + T d1 = b.max.z - r.pos.z; + T d2 = b.min.z - r.pos.z; + + if (r.dir.z > 1 || + (abs (d1) < TMAX * r.dir.z && + abs (d2) < TMAX * r.dir.z)) + { + T t1 = d1 / r.dir.z; + T t2 = d2 / r.dir.z; + + if (tBackMin > t1) + { + tBackMin = t1; + + exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); + exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); + exit.z = b.max.z; + } + + if (tFrontMax < t2) + { + tFrontMax = t2; + + entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); + entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); + entry.z = b.min.z; + } + } + else if (r.pos.z < b.min.z || r.pos.z > b.max.z) + { + return false; + } + } + else // r.dir.z < 0 + { + T d1 = b.min.z - r.pos.z; + T d2 = b.max.z - r.pos.z; + + if (r.dir.z < -1 || + (abs (d1) < -TMAX * r.dir.z && + abs (d2) < -TMAX * r.dir.z)) + { + T t1 = d1 / r.dir.z; + T t2 = d2 / r.dir.z; + + if (tBackMin > t1) + { + tBackMin = t1; + + exit.x = clamp (r.pos.x + t1 * r.dir.x, b.min.x, b.max.x); + exit.y = clamp (r.pos.y + t1 * r.dir.y, b.min.y, b.max.y); + exit.z = b.min.z; + } + + if (tFrontMax < t2) + { + tFrontMax = t2; + + entry.x = clamp (r.pos.x + t2 * r.dir.x, b.min.x, b.max.x); + entry.y = clamp (r.pos.y + t2 * r.dir.y, b.min.y, b.max.y); + entry.z = b.max.z; + } + } + else if (r.pos.z < b.min.z || r.pos.z > b.max.z) + { + return false; + } + } + + return tFrontMax <= tBackMin; +} + + +template +bool +intersects (const Box< Vec3 > &b, const Line3 &r, Vec3 &ip) +{ + // + // Intersect a ray, r, with a box, b, and compute the intersection + // point, ip: + // + // intersect() returns + // + // - true if the ray starts inside the box or if the + // ray starts outside and intersects the box + // + // - false if the ray starts outside the box and intersects it, + // but the intersection is behind the ray's origin. + // + // - false if the ray starts outside and does not intersect it + // + // The intersection point is + // + // - the ray's origin if the ray starts inside the box + // + // - a point on one of the faces of the box if the ray + // starts outside the box + // + // - undefined when intersect() returns false + // + + if (b.isEmpty()) + { + // + // No ray intersects an empty box + // + + return false; + } + + if (b.intersects (r.pos)) + { + // + // The ray starts inside the box + // + + ip = r.pos; + return true; + } + + // + // The ray starts outside the box. Between one and three "frontfacing" + // sides of the box are oriented towards the ray, and between one and + // three "backfacing" sides are oriented away from the ray. + // We intersect the ray with the planes that contain the sides of the + // box, and compare the distances between ray's origin and the ray-plane + // intersections. + // The ray intersects the box if the most distant frontfacing intersection + // is nearer than the nearest backfacing intersection. If the ray does + // intersect the box, then the most distant frontfacing ray-plane + // intersection is the ray-box intersection. + // + + const T TMAX = limits::max(); + + T tFrontMax = -1; + T tBackMin = TMAX; + + // + // Minimum and maximum X sides. + // + + if (r.dir.x > 0) + { + if (r.pos.x > b.max.x) + return false; + + T d = b.max.x - r.pos.x; + + if (r.dir.x > 1 || d < TMAX * r.dir.x) + { + T t = d / r.dir.x; + + if (tBackMin > t) + tBackMin = t; + } + + if (r.pos.x <= b.min.x) + { + T d = b.min.x - r.pos.x; + T t = (r.dir.x > 1 || d < TMAX * r.dir.x)? d / r.dir.x: TMAX; + + if (tFrontMax < t) + { + tFrontMax = t; + + ip.x = b.min.x; + ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); + ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); + } + } + } + else if (r.dir.x < 0) + { + if (r.pos.x < b.min.x) + return false; + + T d = b.min.x - r.pos.x; + + if (r.dir.x < -1 || d > TMAX * r.dir.x) + { + T t = d / r.dir.x; + + if (tBackMin > t) + tBackMin = t; + } + + if (r.pos.x >= b.max.x) + { + T d = b.max.x - r.pos.x; + T t = (r.dir.x < -1 || d > TMAX * r.dir.x)? d / r.dir.x: TMAX; + + if (tFrontMax < t) + { + tFrontMax = t; + + ip.x = b.max.x; + ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); + ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); + } + } + } + else // r.dir.x == 0 + { + if (r.pos.x < b.min.x || r.pos.x > b.max.x) + return false; + } + + // + // Minimum and maximum Y sides. + // + + if (r.dir.y > 0) + { + if (r.pos.y > b.max.y) + return false; + + T d = b.max.y - r.pos.y; + + if (r.dir.y > 1 || d < TMAX * r.dir.y) + { + T t = d / r.dir.y; + + if (tBackMin > t) + tBackMin = t; + } + + if (r.pos.y <= b.min.y) + { + T d = b.min.y - r.pos.y; + T t = (r.dir.y > 1 || d < TMAX * r.dir.y)? d / r.dir.y: TMAX; + + if (tFrontMax < t) + { + tFrontMax = t; + + ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); + ip.y = b.min.y; + ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); + } + } + } + else if (r.dir.y < 0) + { + if (r.pos.y < b.min.y) + return false; + + T d = b.min.y - r.pos.y; + + if (r.dir.y < -1 || d > TMAX * r.dir.y) + { + T t = d / r.dir.y; + + if (tBackMin > t) + tBackMin = t; + } + + if (r.pos.y >= b.max.y) + { + T d = b.max.y - r.pos.y; + T t = (r.dir.y < -1 || d > TMAX * r.dir.y)? d / r.dir.y: TMAX; + + if (tFrontMax < t) + { + tFrontMax = t; + + ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); + ip.y = b.max.y; + ip.z = clamp (r.pos.z + t * r.dir.z, b.min.z, b.max.z); + } + } + } + else // r.dir.y == 0 + { + if (r.pos.y < b.min.y || r.pos.y > b.max.y) + return false; + } + + // + // Minimum and maximum Z sides. + // + + if (r.dir.z > 0) + { + if (r.pos.z > b.max.z) + return false; + + T d = b.max.z - r.pos.z; + + if (r.dir.z > 1 || d < TMAX * r.dir.z) + { + T t = d / r.dir.z; + + if (tBackMin > t) + tBackMin = t; + } + + if (r.pos.z <= b.min.z) + { + T d = b.min.z - r.pos.z; + T t = (r.dir.z > 1 || d < TMAX * r.dir.z)? d / r.dir.z: TMAX; + + if (tFrontMax < t) + { + tFrontMax = t; + + ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); + ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); + ip.z = b.min.z; + } + } + } + else if (r.dir.z < 0) + { + if (r.pos.z < b.min.z) + return false; + + T d = b.min.z - r.pos.z; + + if (r.dir.z < -1 || d > TMAX * r.dir.z) + { + T t = d / r.dir.z; + + if (tBackMin > t) + tBackMin = t; + } + + if (r.pos.z >= b.max.z) + { + T d = b.max.z - r.pos.z; + T t = (r.dir.z < -1 || d > TMAX * r.dir.z)? d / r.dir.z: TMAX; + + if (tFrontMax < t) + { + tFrontMax = t; + + ip.x = clamp (r.pos.x + t * r.dir.x, b.min.x, b.max.x); + ip.y = clamp (r.pos.y + t * r.dir.y, b.min.y, b.max.y); + ip.z = b.max.z; + } + } + } + else // r.dir.z == 0 + { + if (r.pos.z < b.min.z || r.pos.z > b.max.z) + return false; + } + + return tFrontMax <= tBackMin; +} + + +template +bool +intersects (const Box< Vec3 > &box, const Line3 &ray) +{ + Vec3 ignored; + return intersects (box, ray, ignored); +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathColor.h b/3rdparty/openexr/Imath/ImathColor.h new file mode 100644 index 000000000..605f10b59 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathColor.h @@ -0,0 +1,734 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHCOLOR_H +#define INCLUDED_IMATHCOLOR_H + +//---------------------------------------------------- +// +// A three and four component color class template. +// +//---------------------------------------------------- + +#include "ImathVec.h" +#include "half.h" + +namespace Imath { + + +template +class Color3: public Vec3 +{ + public: + + //------------- + // Constructors + //------------- + + Color3 (); // no initialization + explicit Color3 (T a); // (a a a) + Color3 (T a, T b, T c); // (a b c) + + + //--------------------------------- + // Copy constructors and assignment + //--------------------------------- + + Color3 (const Color3 &c); + template Color3 (const Vec3 &v); + + const Color3 & operator = (const Color3 &c); + + + //------------------------ + // Component-wise addition + //------------------------ + + const Color3 & operator += (const Color3 &c); + Color3 operator + (const Color3 &c) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Color3 & operator -= (const Color3 &c); + Color3 operator - (const Color3 &c) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Color3 operator - () const; + const Color3 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Color3 & operator *= (const Color3 &c); + const Color3 & operator *= (T a); + Color3 operator * (const Color3 &c) const; + Color3 operator * (T a) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Color3 & operator /= (const Color3 &c); + const Color3 & operator /= (T a); + Color3 operator / (const Color3 &c) const; + Color3 operator / (T a) const; +}; + +template class Color4 +{ + public: + + //------------------- + // Access to elements + //------------------- + + T r, g, b, a; + + T & operator [] (int i); + const T & operator [] (int i) const; + + + //------------- + // Constructors + //------------- + + Color4 (); // no initialization + explicit Color4 (T a); // (a a a a) + Color4 (T a, T b, T c, T d); // (a b c d) + + + //--------------------------------- + // Copy constructors and assignment + //--------------------------------- + + Color4 (const Color4 &v); + template Color4 (const Color4 &v); + + const Color4 & operator = (const Color4 &v); + + + //---------------------- + // Compatibility with Sb + //---------------------- + + template + void setValue (S a, S b, S c, S d); + + template + void setValue (const Color4 &v); + + template + void getValue (S &a, S &b, S &c, S &d) const; + + template + void getValue (Color4 &v) const; + + T * getValue(); + const T * getValue() const; + + + //--------- + // Equality + //--------- + + template + bool operator == (const Color4 &v) const; + + template + bool operator != (const Color4 &v) const; + + + //------------------------ + // Component-wise addition + //------------------------ + + const Color4 & operator += (const Color4 &v); + Color4 operator + (const Color4 &v) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Color4 & operator -= (const Color4 &v); + Color4 operator - (const Color4 &v) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Color4 operator - () const; + const Color4 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Color4 & operator *= (const Color4 &v); + const Color4 & operator *= (T a); + Color4 operator * (const Color4 &v) const; + Color4 operator * (T a) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Color4 & operator /= (const Color4 &v); + const Color4 & operator /= (T a); + Color4 operator / (const Color4 &v) const; + Color4 operator / (T a) const; + + + //---------------------------------------------------------- + // Number of dimensions, i.e. number of elements in a Color4 + //---------------------------------------------------------- + + static unsigned int dimensions() {return 4;} + + + //------------------------------------------------- + // Limitations of type T (see also class limits) + //------------------------------------------------- + + static T baseTypeMin() {return limits::min();} + static T baseTypeMax() {return limits::max();} + static T baseTypeSmallest() {return limits::smallest();} + static T baseTypeEpsilon() {return limits::epsilon();} + + + //-------------------------------------------------------------- + // Base type -- in templates, which accept a parameter, V, which + // could be a Color4, you can refer to T as + // V::BaseType + //-------------------------------------------------------------- + + typedef T BaseType; +}; + +//-------------- +// Stream output +//-------------- + +template +std::ostream & operator << (std::ostream &s, const Color4 &v); + +//---------------------------------------------------- +// Reverse multiplication: S * Color4 +//---------------------------------------------------- + +template Color4 operator * (S a, const Color4 &v); + +//------------------------- +// Typedefs for convenience +//------------------------- + +typedef Color3 Color3f; +typedef Color3 Color3h; +typedef Color3 Color3c; +typedef Color3 C3h; +typedef Color3 C3f; +typedef Color3 C3c; +typedef Color4 Color4f; +typedef Color4 Color4h; +typedef Color4 Color4c; +typedef Color4 C4f; +typedef Color4 C4h; +typedef Color4 C4c; +typedef unsigned int PackedColor; + + +//------------------------- +// Implementation of Color3 +//------------------------- + +template +inline +Color3::Color3 (): Vec3 () +{ + // empty +} + +template +inline +Color3::Color3 (T a): Vec3 (a) +{ + // empty +} + +template +inline +Color3::Color3 (T a, T b, T c): Vec3 (a, b, c) +{ + // empty +} + +template +inline +Color3::Color3 (const Color3 &c): Vec3 (c) +{ + // empty +} + +template +template +inline +Color3::Color3 (const Vec3 &v): Vec3 (v) +{ + //empty +} + +template +inline const Color3 & +Color3::operator = (const Color3 &c) +{ + *((Vec3 *) this) = c; + return *this; +} + +template +inline const Color3 & +Color3::operator += (const Color3 &c) +{ + *((Vec3 *) this) += c; + return *this; +} + +template +inline Color3 +Color3::operator + (const Color3 &c) const +{ + return Color3 (*(Vec3 *)this + (const Vec3 &)c); +} + +template +inline const Color3 & +Color3::operator -= (const Color3 &c) +{ + *((Vec3 *) this) -= c; + return *this; +} + +template +inline Color3 +Color3::operator - (const Color3 &c) const +{ + return Color3 (*(Vec3 *)this - (const Vec3 &)c); +} + +template +inline Color3 +Color3::operator - () const +{ + return Color3 (-(*(Vec3 *)this)); +} + +template +inline const Color3 & +Color3::negate () +{ + ((Vec3 *) this)->negate(); + return *this; +} + +template +inline const Color3 & +Color3::operator *= (const Color3 &c) +{ + *((Vec3 *) this) *= c; + return *this; +} + +template +inline const Color3 & +Color3::operator *= (T a) +{ + *((Vec3 *) this) *= a; + return *this; +} + +template +inline Color3 +Color3::operator * (const Color3 &c) const +{ + return Color3 (*(Vec3 *)this * (const Vec3 &)c); +} + +template +inline Color3 +Color3::operator * (T a) const +{ + return Color3 (*(Vec3 *)this * a); +} + +template +inline const Color3 & +Color3::operator /= (const Color3 &c) +{ + *((Vec3 *) this) /= c; + return *this; +} + +template +inline const Color3 & +Color3::operator /= (T a) +{ + *((Vec3 *) this) /= a; + return *this; +} + +template +inline Color3 +Color3::operator / (const Color3 &c) const +{ + return Color3 (*(Vec3 *)this / (const Vec3 &)c); +} + +template +inline Color3 +Color3::operator / (T a) const +{ + return Color3 (*(Vec3 *)this / a); +} + +//----------------------- +// Implementation of Color4 +//----------------------- + +template +inline T & +Color4::operator [] (int i) +{ + return (&r)[i]; +} + +template +inline const T & +Color4::operator [] (int i) const +{ + return (&r)[i]; +} + +template +inline +Color4::Color4 () +{ + // empty +} + +template +inline +Color4::Color4 (T x) +{ + r = g = b = a = x; +} + +template +inline +Color4::Color4 (T x, T y, T z, T w) +{ + r = x; + g = y; + b = z; + a = w; +} + +template +inline +Color4::Color4 (const Color4 &v) +{ + r = v.r; + g = v.g; + b = v.b; + a = v.a; +} + +template +template +inline +Color4::Color4 (const Color4 &v) +{ + r = T (v.r); + g = T (v.g); + b = T (v.b); + a = T (v.a); +} + +template +inline const Color4 & +Color4::operator = (const Color4 &v) +{ + r = v.r; + g = v.g; + b = v.b; + a = v.a; + return *this; +} + +template +template +inline void +Color4::setValue (S x, S y, S z, S w) +{ + r = T (x); + g = T (y); + b = T (z); + a = T (w); +} + +template +template +inline void +Color4::setValue (const Color4 &v) +{ + r = T (v.r); + g = T (v.g); + b = T (v.b); + a = T (v.a); +} + +template +template +inline void +Color4::getValue (S &x, S &y, S &z, S &w) const +{ + x = S (r); + y = S (g); + z = S (b); + w = S (a); +} + +template +template +inline void +Color4::getValue (Color4 &v) const +{ + v.r = S (r); + v.g = S (g); + v.b = S (b); + v.a = S (a); +} + +template +inline T * +Color4::getValue() +{ + return (T *) &r; +} + +template +inline const T * +Color4::getValue() const +{ + return (const T *) &r; +} + +template +template +inline bool +Color4::operator == (const Color4 &v) const +{ + return r == v.r && g == v.g && b == v.b && a == v.a; +} + +template +template +inline bool +Color4::operator != (const Color4 &v) const +{ + return r != v.r || g != v.g || b != v.b || a != v.a; +} + +template +inline const Color4 & +Color4::operator += (const Color4 &v) +{ + r += v.r; + g += v.g; + b += v.b; + a += v.a; + return *this; +} + +template +inline Color4 +Color4::operator + (const Color4 &v) const +{ + return Color4 (r + v.r, g + v.g, b + v.b, a + v.a); +} + +template +inline const Color4 & +Color4::operator -= (const Color4 &v) +{ + r -= v.r; + g -= v.g; + b -= v.b; + a -= v.a; + return *this; +} + +template +inline Color4 +Color4::operator - (const Color4 &v) const +{ + return Color4 (r - v.r, g - v.g, b - v.b, a - v.a); +} + +template +inline Color4 +Color4::operator - () const +{ + return Color4 (-r, -g, -b, -a); +} + +template +inline const Color4 & +Color4::negate () +{ + r = -r; + g = -g; + b = -b; + a = -a; + return *this; +} + +template +inline const Color4 & +Color4::operator *= (const Color4 &v) +{ + r *= v.r; + g *= v.g; + b *= v.b; + a *= v.a; + return *this; +} + +template +inline const Color4 & +Color4::operator *= (T x) +{ + r *= x; + g *= x; + b *= x; + a *= x; + return *this; +} + +template +inline Color4 +Color4::operator * (const Color4 &v) const +{ + return Color4 (r * v.r, g * v.g, b * v.b, a * v.a); +} + +template +inline Color4 +Color4::operator * (T x) const +{ + return Color4 (r * x, g * x, b * x, a * x); +} + +template +inline const Color4 & +Color4::operator /= (const Color4 &v) +{ + r /= v.r; + g /= v.g; + b /= v.b; + a /= v.a; + return *this; +} + +template +inline const Color4 & +Color4::operator /= (T x) +{ + r /= x; + g /= x; + b /= x; + a /= x; + return *this; +} + +template +inline Color4 +Color4::operator / (const Color4 &v) const +{ + return Color4 (r / v.r, g / v.g, b / v.b, a / v.a); +} + +template +inline Color4 +Color4::operator / (T x) const +{ + return Color4 (r / x, g / x, b / x, a / x); +} + + +template +std::ostream & +operator << (std::ostream &s, const Color4 &v) +{ + return s << '(' << v.r << ' ' << v.g << ' ' << v.b << ' ' << v.a << ')'; +} + +//----------------------------------------- +// Implementation of reverse multiplication +//----------------------------------------- + +template +inline Color4 +operator * (S x, const Color4 &v) +{ + return Color4 (x * v.r, x * v.g, x * v.b, x * v.a); +} + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathColorAlgo.cpp b/3rdparty/openexr/Imath/ImathColorAlgo.cpp new file mode 100644 index 000000000..c6246801e --- /dev/null +++ b/3rdparty/openexr/Imath/ImathColorAlgo.cpp @@ -0,0 +1,178 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + +//---------------------------------------------------------------------------- +// +// Implementation of non-template items declared in ImathColorAlgo.h +// +//---------------------------------------------------------------------------- + +#include "ImathColorAlgo.h" + +namespace Imath { + + +Vec3 +hsv2rgb_d(const Vec3 &hsv) +{ + double hue = hsv.x; + double sat = hsv.y; + double val = hsv.z; + + double x = 0.0, y = 0.0, z = 0.0; + + if (hue == 1) hue = 0; + else hue *= 6; + + int i = int(Math::floor(hue)); + double f = hue-i; + double p = val*(1-sat); + double q = val*(1-(sat*f)); + double t = val*(1-(sat*(1-f))); + + switch (i) + { + case 0: x = val; y = t; z = p; break; + case 1: x = q; y = val; z = p; break; + case 2: x = p; y = val; z = t; break; + case 3: x = p; y = q; z = val; break; + case 4: x = t; y = p; z = val; break; + case 5: x = val; y = p; z = q; break; + } + + return Vec3(x,y,z); +} + + +Color4 +hsv2rgb_d(const Color4 &hsv) +{ + double hue = hsv.r; + double sat = hsv.g; + double val = hsv.b; + + double r = 0.0, g = 0.0, b = 0.0; + + if (hue == 1) hue = 0; + else hue *= 6; + + int i = int(Math::floor(hue)); + double f = hue-i; + double p = val*(1-sat); + double q = val*(1-(sat*f)); + double t = val*(1-(sat*(1-f))); + + switch (i) + { + case 0: r = val; g = t; b = p; break; + case 1: r = q; g = val; b = p; break; + case 2: r = p; g = val; b = t; break; + case 3: r = p; g = q; b = val; break; + case 4: r = t; g = p; b = val; break; + case 5: r = val; g = p; b = q; break; + } + + return Color4(r,g,b,hsv.a); +} + + + +Vec3 +rgb2hsv_d(const Vec3 &c) +{ + const double &x = c.x; + const double &y = c.y; + const double &z = c.z; + + double max = (x > y) ? ((x > z) ? x : z) : ((y > z) ? y : z); + double min = (x < y) ? ((x < z) ? x : z) : ((y < z) ? y : z); + double range = max - min; + double val = max; + double sat = 0; + double hue = 0; + + if (max != 0) sat = range/max; + + if (sat != 0) + { + double h; + + if (x == max) h = (y - z) / range; + else if (y == max) h = 2 + (z - x) / range; + else h = 4 + (x - y) / range; + + hue = h/6.; + + if (hue < 0.) + hue += 1.0; + } + return Vec3(hue,sat,val); +} + + +Color4 +rgb2hsv_d(const Color4 &c) +{ + const double &r = c.r; + const double &g = c.g; + const double &b = c.b; + + double max = (r > g) ? ((r > b) ? r : b) : ((g > b) ? g : b); + double min = (r < g) ? ((r < b) ? r : b) : ((g < b) ? g : b); + double range = max - min; + double val = max; + double sat = 0; + double hue = 0; + + if (max != 0) sat = range/max; + + if (sat != 0) + { + double h; + + if (r == max) h = (g - b) / range; + else if (g == max) h = 2 + (b - r) / range; + else h = 4 + (r - g) / range; + + hue = h/6.; + + if (hue < 0.) + hue += 1.0; + } + return Color4(hue,sat,val,c.a); +} + + +} // namespace Imath diff --git a/3rdparty/openexr/Imath/ImathColorAlgo.h b/3rdparty/openexr/Imath/ImathColorAlgo.h new file mode 100644 index 000000000..68703a177 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathColorAlgo.h @@ -0,0 +1,256 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHCOLORALGO_H +#define INCLUDED_IMATHCOLORALGO_H + + +#include "ImathColor.h" +#include "ImathMath.h" +#include "ImathLimits.h" + +namespace Imath { + + +// +// Non-templated helper routines for color conversion. +// These routines eliminate type warnings under g++. +// + +Vec3 hsv2rgb_d(const Vec3 &hsv); + +Color4 hsv2rgb_d(const Color4 &hsv); + + +Vec3 rgb2hsv_d(const Vec3 &rgb); + +Color4 rgb2hsv_d(const Color4 &rgb); + + +// +// Color conversion functions and general color algorithms +// +// hsv2rgb(), rgb2hsv(), rgb2packed(), packed2rgb() +// see each funtion definition for details. +// + +template +Vec3 +hsv2rgb(const Vec3 &hsv) +{ + if ( limits::isIntegral() ) + { + Vec3 v = Vec3(hsv.x / double(limits::max()), + hsv.y / double(limits::max()), + hsv.z / double(limits::max())); + Vec3 c = hsv2rgb_d(v); + return Vec3((T) (c.x * limits::max()), + (T) (c.y * limits::max()), + (T) (c.z * limits::max())); + } + else + { + Vec3 v = Vec3(hsv.x, hsv.y, hsv.z); + Vec3 c = hsv2rgb_d(v); + return Vec3((T) c.x, (T) c.y, (T) c.z); + } +} + + +template +Color4 +hsv2rgb(const Color4 &hsv) +{ + if ( limits::isIntegral() ) + { + Color4 v = Color4(hsv.r / float(limits::max()), + hsv.g / float(limits::max()), + hsv.b / float(limits::max()), + hsv.a / float(limits::max())); + Color4 c = hsv2rgb_d(v); + return Color4((T) (c.r * limits::max()), + (T) (c.g * limits::max()), + (T) (c.b * limits::max()), + (T) (c.a * limits::max())); + } + else + { + Color4 v = Color4(hsv.r, hsv.g, hsv.b, hsv.a); + Color4 c = hsv2rgb_d(v); + return Color4((T) c.r, (T) c.g, (T) c.b, (T) c.a); + } +} + + +template +Vec3 +rgb2hsv(const Vec3 &rgb) +{ + if ( limits::isIntegral() ) + { + Vec3 v = Vec3(rgb.x / double(limits::max()), + rgb.y / double(limits::max()), + rgb.z / double(limits::max())); + Vec3 c = rgb2hsv_d(v); + return Vec3((T) (c.x * limits::max()), + (T) (c.y * limits::max()), + (T) (c.z * limits::max())); + } + else + { + Vec3 v = Vec3(rgb.x, rgb.y, rgb.z); + Vec3 c = rgb2hsv_d(v); + return Vec3((T) c.x, (T) c.y, (T) c.z); + } +} + + +template +Color4 +rgb2hsv(const Color4 &rgb) +{ + if ( limits::isIntegral() ) + { + Color4 v = Color4(rgb.r / float(limits::max()), + rgb.g / float(limits::max()), + rgb.b / float(limits::max()), + rgb.a / float(limits::max())); + Color4 c = rgb2hsv_d(v); + return Color4((T) (c.r * limits::max()), + (T) (c.g * limits::max()), + (T) (c.b * limits::max()), + (T) (c.a * limits::max())); + } + else + { + Color4 v = Color4(rgb.r, rgb.g, rgb.b, rgb.a); + Color4 c = rgb2hsv_d(v); + return Color4((T) c.r, (T) c.g, (T) c.b, (T) c.a); + } +} + +template +PackedColor +rgb2packed(const Vec3 &c) +{ + if ( limits::isIntegral() ) + { + float x = c.x / float(limits::max()); + float y = c.y / float(limits::max()); + float z = c.z / float(limits::max()); + return rgb2packed( V3f(x,y,z) ); + } + else + { + return ( (PackedColor) (c.x * 255) | + (((PackedColor) (c.y * 255)) << 8) | + (((PackedColor) (c.z * 255)) << 16) | 0xFF000000 ); + } +} + +template +PackedColor +rgb2packed(const Color4 &c) +{ + if ( limits::isIntegral() ) + { + float r = c.r / float(limits::max()); + float g = c.g / float(limits::max()); + float b = c.b / float(limits::max()); + float a = c.a / float(limits::max()); + return rgb2packed( C4f(r,g,b,a) ); + } + else + { + return ( (PackedColor) (c.r * 255) | + (((PackedColor) (c.g * 255)) << 8) | + (((PackedColor) (c.b * 255)) << 16) | + (((PackedColor) (c.a * 255)) << 24)); + } +} + +// +// This guy can't return the result because the template +// parameter would not be in the function signiture. So instead, +// its passed in as an argument. +// + +template +void +packed2rgb(PackedColor packed, Vec3 &out) +{ + if ( limits::isIntegral() ) + { + T f = limits::max() / ((PackedColor)0xFF); + out.x = (packed & 0xFF) * f; + out.y = ((packed & 0xFF00) >> 8) * f; + out.z = ((packed & 0xFF0000) >> 16) * f; + } + else + { + T f = T(1) / T(255); + out.x = (packed & 0xFF) * f; + out.y = ((packed & 0xFF00) >> 8) * f; + out.z = ((packed & 0xFF0000) >> 16) * f; + } +} + +template +void +packed2rgb(PackedColor packed, Color4 &out) +{ + if ( limits::isIntegral() ) + { + T f = limits::max() / ((PackedColor)0xFF); + out.r = (packed & 0xFF) * f; + out.g = ((packed & 0xFF00) >> 8) * f; + out.b = ((packed & 0xFF0000) >> 16) * f; + out.a = ((packed & 0xFF000000) >> 24) * f; + } + else + { + T f = T(1) / T(255); + out.r = (packed & 0xFF) * f; + out.g = ((packed & 0xFF00) >> 8) * f; + out.b = ((packed & 0xFF0000) >> 16) * f; + out.a = ((packed & 0xFF000000) >> 24) * f; + } +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathEuler.h b/3rdparty/openexr/Imath/ImathEuler.h new file mode 100644 index 000000000..c81b5eb74 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathEuler.h @@ -0,0 +1,924 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHEULER_H +#define INCLUDED_IMATHEULER_H + +//---------------------------------------------------------------------- +// +// template class Euler +// +// This class represents euler angle orientations. The class +// inherits from Vec3 to it can be freely cast. The additional +// information is the euler priorities rep. This class is +// essentially a rip off of Ken Shoemake's GemsIV code. It has +// been modified minimally to make it more understandable, but +// hardly enough to make it easy to grok completely. +// +// There are 24 possible combonations of Euler angle +// representations of which 12 are common in CG and you will +// probably only use 6 of these which in this scheme are the +// non-relative-non-repeating types. +// +// The representations can be partitioned according to two +// criteria: +// +// 1) Are the angles measured relative to a set of fixed axis +// or relative to each other (the latter being what happens +// when rotation matrices are multiplied together and is +// almost ubiquitous in the cg community) +// +// 2) Is one of the rotations repeated (ala XYX rotation) +// +// When you construct a given representation from scratch you +// must order the angles according to their priorities. So, the +// easiest is a softimage or aerospace (yaw/pitch/roll) ordering +// of ZYX. +// +// float x_rot = 1; +// float y_rot = 2; +// float z_rot = 3; +// +// Eulerf angles(z_rot, y_rot, x_rot, Eulerf::ZYX); +// -or- +// Eulerf angles( V3f(z_rot,y_rot,z_rot), Eulerf::ZYX ); +// +// If instead, the order was YXZ for instance you would have to +// do this: +// +// float x_rot = 1; +// float y_rot = 2; +// float z_rot = 3; +// +// Eulerf angles(y_rot, x_rot, z_rot, Eulerf::YXZ); +// -or- +// Eulerf angles( V3f(y_rot,x_rot,z_rot), Eulerf::YXZ ); +// +// Notice how the order you put the angles into the three slots +// should correspond to the enum (YXZ) ordering. The input angle +// vector is called the "ijk" vector -- not an "xyz" vector. The +// ijk vector order is the same as the enum. If you treat the +// Euler<> as a Vec<> (which it inherts from) you will find the +// angles are ordered in the same way, i.e.: +// +// V3f v = angles; +// // v.x == y_rot, v.y == x_rot, v.z == z_rot +// +// If you just want the x, y, and z angles stored in a vector in +// that order, you can do this: +// +// V3f v = angles.toXYZVector() +// // v.x == x_rot, v.y == y_rot, v.z == z_rot +// +// If you want to set the Euler with an XYZVector use the +// optional layout argument: +// +// Eulerf angles(x_rot, y_rot, z_rot, +// Eulerf::YXZ, +// Eulerf::XYZLayout); +// +// This is the same as: +// +// Eulerf angles(y_rot, x_rot, z_rot, Eulerf::YXZ); +// +// Note that this won't do anything intelligent if you have a +// repeated axis in the euler angles (e.g. XYX) +// +// If you need to use the "relative" versions of these, you will +// need to use the "r" enums. +// +// The units of the rotation angles are assumed to be radians. +// +//---------------------------------------------------------------------- + + +#include "ImathMath.h" +#include "ImathVec.h" +#include "ImathQuat.h" +#include "ImathMatrix.h" +#include "ImathLimits.h" +#include + +namespace Imath { + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +// Disable MS VC++ warnings about conversion from double to float +#pragma warning(disable:4244) +#endif + +template +class Euler : public Vec3 +{ + public: + + using Vec3::x; + using Vec3::y; + using Vec3::z; + + enum Order + { + // + // All 24 possible orderings + // + + XYZ = 0x0101, // "usual" orderings + XZY = 0x0001, + YZX = 0x1101, + YXZ = 0x1001, + ZXY = 0x2101, + ZYX = 0x2001, + + XZX = 0x0011, // first axis repeated + XYX = 0x0111, + YXY = 0x1011, + YZY = 0x1111, + ZYZ = 0x2011, + ZXZ = 0x2111, + + XYZr = 0x2000, // relative orderings -- not common + XZYr = 0x2100, + YZXr = 0x1000, + YXZr = 0x1100, + ZXYr = 0x0000, + ZYXr = 0x0100, + + XZXr = 0x2110, // relative first axis repeated + XYXr = 0x2010, + YXYr = 0x1110, + YZYr = 0x1010, + ZYZr = 0x0110, + ZXZr = 0x0010, + // |||| + // VVVV + // Legend: ABCD + // A -> Initial Axis (0==x, 1==y, 2==z) + // B -> Parity Even (1==true) + // C -> Initial Repeated (1==true) + // D -> Frame Static (1==true) + // + + Legal = XYZ | XZY | YZX | YXZ | ZXY | ZYX | + XZX | XYX | YXY | YZY | ZYZ | ZXZ | + XYZr| XZYr| YZXr| YXZr| ZXYr| ZYXr| + XZXr| XYXr| YXYr| YZYr| ZYZr| ZXZr, + + Min = 0x0000, + Max = 0x2111, + Default = XYZ + }; + + enum Axis { X = 0, Y = 1, Z = 2 }; + + enum InputLayout { XYZLayout, IJKLayout }; + + //-------------------------------------------------------------------- + // Constructors -- all default to ZYX non-relative ala softimage + // (where there is no argument to specify it) + // + // The Euler-from-matrix constructors assume that the matrix does + // not include shear or non-uniform scaling, but the constructors + // do not examine the matrix to verify this assumption. If necessary, + // you can adjust the matrix by calling the removeScalingAndShear() + // function, defined in ImathMatrixAlgo.h. + //-------------------------------------------------------------------- + + Euler(); + Euler(const Euler&); + Euler(Order p); + Euler(const Vec3 &v, Order o = Default, InputLayout l = IJKLayout); + Euler(T i, T j, T k, Order o = Default, InputLayout l = IJKLayout); + Euler(const Euler &euler, Order newp); + Euler(const Matrix33 &, Order o = Default); + Euler(const Matrix44 &, Order o = Default); + + //--------------------------------- + // Algebraic functions/ Operators + //--------------------------------- + + const Euler& operator= (const Euler&); + const Euler& operator= (const Vec3&); + + //-------------------------------------------------------- + // Set the euler value + // This does NOT convert the angles, but setXYZVector() + // does reorder the input vector. + //-------------------------------------------------------- + + static bool legal(Order); + + void setXYZVector(const Vec3 &); + + Order order() const; + void setOrder(Order); + + void set(Axis initial, + bool relative, + bool parityEven, + bool firstRepeats); + + //------------------------------------------------------------ + // Conversions, toXYZVector() reorders the angles so that + // the X rotation comes first, followed by the Y and Z + // in cases like XYX ordering, the repeated angle will be + // in the "z" component + // + // The Euler-from-matrix extract() functions assume that the + // matrix does not include shear or non-uniform scaling, but + // the extract() functions do not examine the matrix to verify + // this assumption. If necessary, you can adjust the matrix + // by calling the removeScalingAndShear() function, defined + // in ImathMatrixAlgo.h. + //------------------------------------------------------------ + + void extract(const Matrix33&); + void extract(const Matrix44&); + void extract(const Quat&); + + Matrix33 toMatrix33() const; + Matrix44 toMatrix44() const; + Quat toQuat() const; + Vec3 toXYZVector() const; + + //--------------------------------------------------- + // Use this function to unpack angles from ijk form + //--------------------------------------------------- + + void angleOrder(int &i, int &j, int &k) const; + + //--------------------------------------------------- + // Use this function to determine mapping from xyz to ijk + // - reshuffles the xyz to match the order + //--------------------------------------------------- + + void angleMapping(int &i, int &j, int &k) const; + + //---------------------------------------------------------------------- + // + // Utility methods for getting continuous rotations. None of these + // methods change the orientation given by its inputs (or at least + // that is the intent). + // + // angleMod() converts an angle to its equivalent in [-PI, PI] + // + // simpleXYZRotation() adjusts xyzRot so that its components differ + // from targetXyzRot by no more than +-PI + // + // nearestRotation() adjusts xyzRot so that its components differ + // from targetXyzRot by as little as possible. + // Note that xyz here really means ijk, because + // the order must be provided. + // + // makeNear() adjusts "this" Euler so that its components differ + // from target by as little as possible. This method + // might not make sense for Eulers with different order + // and it probably doesn't work for repeated axis and + // relative orderings (TODO). + // + //----------------------------------------------------------------------- + + static float angleMod (T angle); + static void simpleXYZRotation (Vec3 &xyzRot, + const Vec3 &targetXyzRot); + static void nearestRotation (Vec3 &xyzRot, + const Vec3 &targetXyzRot, + Order order = XYZ); + + void makeNear (const Euler &target); + + bool frameStatic() const { return _frameStatic; } + bool initialRepeated() const { return _initialRepeated; } + bool parityEven() const { return _parityEven; } + Axis initialAxis() const { return _initialAxis; } + + protected: + + bool _frameStatic : 1; // relative or static rotations + bool _initialRepeated : 1; // init axis repeated as last + bool _parityEven : 1; // "parity of axis permutation" +#if defined _WIN32 || defined _WIN64 + Axis _initialAxis ; // First axis of rotation +#else + Axis _initialAxis : 2; // First axis of rotation +#endif +}; + + +//-------------------- +// Convenient typedefs +//-------------------- + +typedef Euler Eulerf; +typedef Euler Eulerd; + + +//--------------- +// Implementation +//--------------- + +template +inline void + Euler::angleOrder(int &i, int &j, int &k) const +{ + i = _initialAxis; + j = _parityEven ? (i+1)%3 : (i > 0 ? i-1 : 2); + k = _parityEven ? (i > 0 ? i-1 : 2) : (i+1)%3; +} + +template +inline void + Euler::angleMapping(int &i, int &j, int &k) const +{ + int m[3]; + + m[_initialAxis] = 0; + m[(_initialAxis+1) % 3] = _parityEven ? 1 : 2; + m[(_initialAxis+2) % 3] = _parityEven ? 2 : 1; + i = m[0]; + j = m[1]; + k = m[2]; +} + +template +inline void +Euler::setXYZVector(const Vec3 &v) +{ + int i,j,k; + angleMapping(i,j,k); + (*this)[i] = v.x; + (*this)[j] = v.y; + (*this)[k] = v.z; +} + +template +inline Vec3 +Euler::toXYZVector() const +{ + int i,j,k; + angleMapping(i,j,k); + return Vec3((*this)[i],(*this)[j],(*this)[k]); +} + + +template +Euler::Euler() : + Vec3(0,0,0), + _frameStatic(true), + _initialRepeated(false), + _parityEven(true), + _initialAxis(X) +{} + +template +Euler::Euler(typename Euler::Order p) : + Vec3(0,0,0), + _frameStatic(true), + _initialRepeated(false), + _parityEven(true), + _initialAxis(X) +{ + setOrder(p); +} + +template +inline Euler::Euler( const Vec3 &v, + typename Euler::Order p, + typename Euler::InputLayout l ) +{ + setOrder(p); + if ( l == XYZLayout ) setXYZVector(v); + else { x = v.x; y = v.y; z = v.z; } +} + +template +inline Euler::Euler(const Euler &euler) +{ + operator=(euler); +} + +template +inline Euler::Euler(const Euler &euler,Order p) +{ + setOrder(p); + Matrix33 M = euler.toMatrix33(); + extract(M); +} + +template +inline Euler::Euler( T xi, T yi, T zi, + typename Euler::Order p, + typename Euler::InputLayout l) +{ + setOrder(p); + if ( l == XYZLayout ) setXYZVector(Vec3(xi,yi,zi)); + else { x = xi; y = yi; z = zi; } +} + +template +inline Euler::Euler( const Matrix33 &M, typename Euler::Order p ) +{ + setOrder(p); + extract(M); +} + +template +inline Euler::Euler( const Matrix44 &M, typename Euler::Order p ) +{ + setOrder(p); + extract(M); +} + +template +inline void Euler::extract(const Quat &q) +{ + extract(q.toMatrix33()); +} + +template +void Euler::extract(const Matrix33 &M) +{ + int i,j,k; + angleOrder(i,j,k); + + if (_initialRepeated) + { + // + // Extract the first angle, x. + // + + x = Math::atan2 (M[j][i], M[k][i]); + + // + // Remove the x rotation from M, so that the remaining + // rotation, N, is only around two axes, and gimbal lock + // cannot occur. + // + + Vec3 r (0, 0, 0); + r[i] = (_parityEven? -x: x); + + Matrix44 N; + N.rotate (r); + + N = N * Matrix44 (M[0][0], M[0][1], M[0][2], 0, + M[1][0], M[1][1], M[1][2], 0, + M[2][0], M[2][1], M[2][2], 0, + 0, 0, 0, 1); + // + // Extract the other two angles, y and z, from N. + // + + T sy = Math::sqrt (N[j][i]*N[j][i] + N[k][i]*N[k][i]); + y = Math::atan2 (sy, N[i][i]); + z = Math::atan2 (N[j][k], N[j][j]); + } + else + { + // + // Extract the first angle, x. + // + + x = Math::atan2 (M[j][k], M[k][k]); + + // + // Remove the x rotation from M, so that the remaining + // rotation, N, is only around two axes, and gimbal lock + // cannot occur. + // + + Vec3 r (0, 0, 0); + r[i] = (_parityEven? -x: x); + + Matrix44 N; + N.rotate (r); + + N = N * Matrix44 (M[0][0], M[0][1], M[0][2], 0, + M[1][0], M[1][1], M[1][2], 0, + M[2][0], M[2][1], M[2][2], 0, + 0, 0, 0, 1); + // + // Extract the other two angles, y and z, from N. + // + + T cy = Math::sqrt (N[i][i]*N[i][i] + N[i][j]*N[i][j]); + y = Math::atan2 (-N[i][k], cy); + z = Math::atan2 (-N[j][i], N[j][j]); + } + + if (!_parityEven) + *this *= -1; + + if (!_frameStatic) + { + T t = x; + x = z; + z = t; + } +} + +template +void Euler::extract(const Matrix44 &M) +{ + int i,j,k; + angleOrder(i,j,k); + + if (_initialRepeated) + { + // + // Extract the first angle, x. + // + + x = Math::atan2 (M[j][i], M[k][i]); + + // + // Remove the x rotation from M, so that the remaining + // rotation, N, is only around two axes, and gimbal lock + // cannot occur. + // + + Vec3 r (0, 0, 0); + r[i] = (_parityEven? -x: x); + + Matrix44 N; + N.rotate (r); + N = N * M; + + // + // Extract the other two angles, y and z, from N. + // + + T sy = Math::sqrt (N[j][i]*N[j][i] + N[k][i]*N[k][i]); + y = Math::atan2 (sy, N[i][i]); + z = Math::atan2 (N[j][k], N[j][j]); + } + else + { + // + // Extract the first angle, x. + // + + x = Math::atan2 (M[j][k], M[k][k]); + + // + // Remove the x rotation from M, so that the remaining + // rotation, N, is only around two axes, and gimbal lock + // cannot occur. + // + + Vec3 r (0, 0, 0); + r[i] = (_parityEven? -x: x); + + Matrix44 N; + N.rotate (r); + N = N * M; + + // + // Extract the other two angles, y and z, from N. + // + + T cy = Math::sqrt (N[i][i]*N[i][i] + N[i][j]*N[i][j]); + y = Math::atan2 (-N[i][k], cy); + z = Math::atan2 (-N[j][i], N[j][j]); + } + + if (!_parityEven) + *this *= -1; + + if (!_frameStatic) + { + T t = x; + x = z; + z = t; + } +} + +template +Matrix33 Euler::toMatrix33() const +{ + int i,j,k; + angleOrder(i,j,k); + + Vec3 angles; + + if ( _frameStatic ) angles = (*this); + else angles = Vec3(z,y,x); + + if ( !_parityEven ) angles *= -1.0; + + T ci = Math::cos(angles.x); + T cj = Math::cos(angles.y); + T ch = Math::cos(angles.z); + T si = Math::sin(angles.x); + T sj = Math::sin(angles.y); + T sh = Math::sin(angles.z); + + T cc = ci*ch; + T cs = ci*sh; + T sc = si*ch; + T ss = si*sh; + + Matrix33 M; + + if ( _initialRepeated ) + { + M[i][i] = cj; M[j][i] = sj*si; M[k][i] = sj*ci; + M[i][j] = sj*sh; M[j][j] = -cj*ss+cc; M[k][j] = -cj*cs-sc; + M[i][k] = -sj*ch; M[j][k] = cj*sc+cs; M[k][k] = cj*cc-ss; + } + else + { + M[i][i] = cj*ch; M[j][i] = sj*sc-cs; M[k][i] = sj*cc+ss; + M[i][j] = cj*sh; M[j][j] = sj*ss+cc; M[k][j] = sj*cs-sc; + M[i][k] = -sj; M[j][k] = cj*si; M[k][k] = cj*ci; + } + + return M; +} + +template +Matrix44 Euler::toMatrix44() const +{ + int i,j,k; + angleOrder(i,j,k); + + Vec3 angles; + + if ( _frameStatic ) angles = (*this); + else angles = Vec3(z,y,x); + + if ( !_parityEven ) angles *= -1.0; + + T ci = Math::cos(angles.x); + T cj = Math::cos(angles.y); + T ch = Math::cos(angles.z); + T si = Math::sin(angles.x); + T sj = Math::sin(angles.y); + T sh = Math::sin(angles.z); + + T cc = ci*ch; + T cs = ci*sh; + T sc = si*ch; + T ss = si*sh; + + Matrix44 M; + + if ( _initialRepeated ) + { + M[i][i] = cj; M[j][i] = sj*si; M[k][i] = sj*ci; + M[i][j] = sj*sh; M[j][j] = -cj*ss+cc; M[k][j] = -cj*cs-sc; + M[i][k] = -sj*ch; M[j][k] = cj*sc+cs; M[k][k] = cj*cc-ss; + } + else + { + M[i][i] = cj*ch; M[j][i] = sj*sc-cs; M[k][i] = sj*cc+ss; + M[i][j] = cj*sh; M[j][j] = sj*ss+cc; M[k][j] = sj*cs-sc; + M[i][k] = -sj; M[j][k] = cj*si; M[k][k] = cj*ci; + } + + return M; +} + +template +Quat Euler::toQuat() const +{ + Vec3 angles; + int i,j,k; + angleOrder(i,j,k); + + if ( _frameStatic ) angles = (*this); + else angles = Vec3(z,y,x); + + if ( !_parityEven ) angles.y = -angles.y; + + T ti = angles.x*0.5; + T tj = angles.y*0.5; + T th = angles.z*0.5; + T ci = Math::cos(ti); + T cj = Math::cos(tj); + T ch = Math::cos(th); + T si = Math::sin(ti); + T sj = Math::sin(tj); + T sh = Math::sin(th); + T cc = ci*ch; + T cs = ci*sh; + T sc = si*ch; + T ss = si*sh; + + T parity = _parityEven ? 1.0 : -1.0; + + Quat q; + Vec3 a; + + if ( _initialRepeated ) + { + a[i] = cj*(cs + sc); + a[j] = sj*(cc + ss) * parity, + a[k] = sj*(cs - sc); + q.r = cj*(cc - ss); + } + else + { + a[i] = cj*sc - sj*cs, + a[j] = (cj*ss + sj*cc) * parity, + a[k] = cj*cs - sj*sc; + q.r = cj*cc + sj*ss; + } + + q.v = a; + + return q; +} + +template +inline bool +Euler::legal(typename Euler::Order order) +{ + return (order & ~Legal) ? false : true; +} + +template +typename Euler::Order +Euler::order() const +{ + int foo = (_initialAxis == Z ? 0x2000 : (_initialAxis == Y ? 0x1000 : 0)); + + if (_parityEven) foo |= 0x0100; + if (_initialRepeated) foo |= 0x0010; + if (_frameStatic) foo++; + + return (Order)foo; +} + +template +inline void Euler::setOrder(typename Euler::Order p) +{ + set( p & 0x2000 ? Z : (p & 0x1000 ? Y : X), // initial axis + !(p & 0x1), // static? + !!(p & 0x100), // permutation even? + !!(p & 0x10)); // initial repeats? +} + +template +void Euler::set(typename Euler::Axis axis, + bool relative, + bool parityEven, + bool firstRepeats) +{ + _initialAxis = axis; + _frameStatic = !relative; + _parityEven = parityEven; + _initialRepeated = firstRepeats; +} + +template +const Euler& Euler::operator= (const Euler &euler) +{ + x = euler.x; + y = euler.y; + z = euler.z; + _initialAxis = euler._initialAxis; + _frameStatic = euler._frameStatic; + _parityEven = euler._parityEven; + _initialRepeated = euler._initialRepeated; + return *this; +} + +template +const Euler& Euler::operator= (const Vec3 &v) +{ + x = v.x; + y = v.y; + z = v.z; + return *this; +} + +template +std::ostream& operator << (std::ostream &o, const Euler &euler) +{ + char a[3] = { 'X', 'Y', 'Z' }; + + const char* r = euler.frameStatic() ? "" : "r"; + int i,j,k; + euler.angleOrder(i,j,k); + + if ( euler.initialRepeated() ) k = i; + + return o << "(" + << euler.x << " " + << euler.y << " " + << euler.z << " " + << a[i] << a[j] << a[k] << r << ")"; +} + +template +float +Euler::angleMod (T angle) +{ + angle = fmod(T (angle), T (2 * M_PI)); + + if (angle < -M_PI) angle += 2 * M_PI; + if (angle > +M_PI) angle -= 2 * M_PI; + + return angle; +} + +template +void +Euler::simpleXYZRotation (Vec3 &xyzRot, const Vec3 &targetXyzRot) +{ + Vec3 d = xyzRot - targetXyzRot; + xyzRot[0] = targetXyzRot[0] + angleMod(d[0]); + xyzRot[1] = targetXyzRot[1] + angleMod(d[1]); + xyzRot[2] = targetXyzRot[2] + angleMod(d[2]); +} + +template +void +Euler::nearestRotation (Vec3 &xyzRot, const Vec3 &targetXyzRot, + Order order) +{ + int i,j,k; + Euler e (0,0,0, order); + e.angleOrder(i,j,k); + + simpleXYZRotation(xyzRot, targetXyzRot); + + Vec3 otherXyzRot; + otherXyzRot[i] = M_PI+xyzRot[i]; + otherXyzRot[j] = M_PI-xyzRot[j]; + otherXyzRot[k] = M_PI+xyzRot[k]; + + simpleXYZRotation(otherXyzRot, targetXyzRot); + + Vec3 d = xyzRot - targetXyzRot; + Vec3 od = otherXyzRot - targetXyzRot; + T dMag = d.dot(d); + T odMag = od.dot(od); + + if (odMag < dMag) + { + xyzRot = otherXyzRot; + } +} + +template +void +Euler::makeNear (const Euler &target) +{ + Vec3 xyzRot = toXYZVector(); + Vec3 targetXyz; + if (order() != target.order()) + { + Euler targetSameOrder = Euler(target, order()); + targetXyz = targetSameOrder.toXYZVector(); + } + else + { + targetXyz = target.toXYZVector(); + } + + nearestRotation(xyzRot, targetXyz, order()); + + setXYZVector(xyzRot); +} + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +#pragma warning(default:4244) +#endif + +} // namespace Imath + + +#endif diff --git a/3rdparty/openexr/Imath/ImathExc.h b/3rdparty/openexr/Imath/ImathExc.h new file mode 100644 index 000000000..43781c504 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathExc.h @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHEXC_H +#define INCLUDED_IMATHEXC_H + + +//----------------------------------------------- +// +// Imath library-specific exceptions +// +//----------------------------------------------- + +#include "IexBaseExc.h" + +namespace Imath { + + +DEFINE_EXC (NullVecExc, ::Iex::MathExc) // Attempt to normalize + // null vector + +DEFINE_EXC (InfPointExc, ::Iex::MathExc) // Attempt to normalize + // a point at infinity + +DEFINE_EXC (NullQuatExc, ::Iex::MathExc) // Attempt to normalize + // null quaternion + +DEFINE_EXC (SingMatrixExc, ::Iex::MathExc) // Attempt to invert + // singular matrix + +DEFINE_EXC (ZeroScaleExc, ::Iex::MathExc) // Attempt to remove zero + // scaling from matrix + +DEFINE_EXC (IntVecNormalizeExc, ::Iex::MathExc) // Attempt to normalize + // a vector of whose elements + // are an integer type + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathFrame.h b/3rdparty/openexr/Imath/ImathFrame.h new file mode 100644 index 000000000..72912312e --- /dev/null +++ b/3rdparty/openexr/Imath/ImathFrame.h @@ -0,0 +1,190 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHFRAME_H +#define INCLUDED_IMATHFRAME_H + +namespace Imath { + +template class Vec3; +template class Matrix44; + +// +// These methods compute a set of reference frames, defined by their +// transformation matrix, along a curve. It is designed so that the +// array of points and the array of matrices used to fetch these routines +// don't need to be ordered as the curve. +// +// A typical usage would be : +// +// m[0] = Imath::firstFrame( p[0], p[1], p[2] ); +// for( int i = 1; i < n - 1; i++ ) +// { +// m[i] = Imath::nextFrame( m[i-1], p[i-1], p[i], t[i-1], t[i] ); +// } +// m[n-1] = Imath::lastFrame( m[n-2], p[n-2], p[n-1] ); +// +// See Graphics Gems I for the underlying algorithm. +// + +template Matrix44 firstFrame( const Vec3&, // First point + const Vec3&, // Second point + const Vec3& ); // Third point + +template Matrix44 nextFrame( const Matrix44&, // Previous matrix + const Vec3&, // Previous point + const Vec3&, // Current point + Vec3&, // Previous tangent + Vec3& ); // Current tangent + +template Matrix44 lastFrame( const Matrix44&, // Previous matrix + const Vec3&, // Previous point + const Vec3& ); // Last point + +// +// firstFrame - Compute the first reference frame along a curve. +// +// This function returns the transformation matrix to the reference frame +// defined by the three points 'pi', 'pj' and 'pk'. Note that if the two +// vectors and are colinears, an arbitrary twist value will +// be choosen. +// +// Throw 'NullVecExc' if 'pi' and 'pj' are equals. +// + +template Matrix44 firstFrame +( + const Vec3& pi, // First point + const Vec3& pj, // Second point + const Vec3& pk ) // Third point +{ + Vec3 t = pj - pi; t.normalizeExc(); + + Vec3 n = t.cross( pk - pi ); n.normalize(); + if( n.length() == 0.0f ) + { + int i = fabs( t[0] ) < fabs( t[1] ) ? 0 : 1; + if( fabs( t[2] ) < fabs( t[i] )) i = 2; + + Vec3 v( 0.0, 0.0, 0.0 ); v[i] = 1.0; + n = t.cross( v ); n.normalize(); + } + + Vec3 b = t.cross( n ); + + Matrix44 M; + + M[0][0] = t[0]; M[0][1] = t[1]; M[0][2] = t[2]; M[0][3] = 0.0, + M[1][0] = n[0]; M[1][1] = n[1]; M[1][2] = n[2]; M[1][3] = 0.0, + M[2][0] = b[0]; M[2][1] = b[1]; M[2][2] = b[2]; M[2][3] = 0.0, + M[3][0] = pi[0]; M[3][1] = pi[1]; M[3][2] = pi[2]; M[3][3] = 1.0; + + return M; +} + +// +// nextFrame - Compute the next reference frame along a curve. +// +// This function returns the transformation matrix to the next reference +// frame defined by the previously computed transformation matrix and the +// new point and tangent vector along the curve. +// + +template Matrix44 nextFrame +( + const Matrix44& Mi, // Previous matrix + const Vec3& pi, // Previous point + const Vec3& pj, // Current point + Vec3& ti, // Previous tangent vector + Vec3& tj ) // Current tangent vector +{ + Vec3 a(0.0, 0.0, 0.0); // Rotation axis. + T r = 0.0; // Rotation angle. + + if( ti.length() != 0.0 && tj.length() != 0.0 ) + { + ti.normalize(); tj.normalize(); + T dot = ti.dot( tj ); + + // + // This is *really* necessary : + // + + if( dot > 1.0 ) dot = 1.0; + else if( dot < -1.0 ) dot = -1.0; + + r = acosf( dot ); + a = ti.cross( tj ); + } + + if( a.length() != 0.0 && r != 0.0 ) + { + Matrix44 R; R.setAxisAngle( a, r ); + Matrix44 Tj; Tj.translate( pj ); + Matrix44 Ti; Ti.translate( -pi ); + + return Mi * Ti * R * Tj; + } + else + { + Matrix44 Tr; Tr.translate( pj - pi ); + + return Mi * Tr; + } +} + +// +// lastFrame - Compute the last reference frame along a curve. +// +// This function returns the transformation matrix to the last reference +// frame defined by the previously computed transformation matrix and the +// last point along the curve. +// + +template Matrix44 lastFrame +( + const Matrix44& Mi, // Previous matrix + const Vec3& pi, // Previous point + const Vec3& pj ) // Last point +{ + Matrix44 Tr; Tr.translate( pj - pi ); + + return Mi * Tr; +} + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathFrustum.h b/3rdparty/openexr/Imath/ImathFrustum.h new file mode 100644 index 000000000..ac4934659 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathFrustum.h @@ -0,0 +1,739 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHFRUSTUM_H +#define INCLUDED_IMATHFRUSTUM_H + + +#include "ImathVec.h" +#include "ImathPlane.h" +#include "ImathLine.h" +#include "ImathMatrix.h" +#include "ImathLimits.h" +#include "ImathFun.h" +#include "IexMathExc.h" + +namespace Imath { + +// +// template class Frustum +// +// The frustum is always located with the eye point at the +// origin facing down -Z. This makes the Frustum class +// compatable with OpenGL (or anything that assumes a camera +// looks down -Z, hence with a right-handed coordinate system) +// but not with RenderMan which assumes the camera looks down +// +Z. Additional functions are provided for conversion from +// and from various camera coordinate spaces. +// +// nearPlane/farPlane: near/far are keywords used by Microsoft's +// compiler, so we use nearPlane/farPlane instead to avoid +// issues. + + +template +class Frustum +{ + public: + Frustum(); + Frustum(const Frustum &); + Frustum(T nearPlane, T farPlane, T left, T right, T top, T bottom, bool ortho=false); + Frustum(T nearPlane, T farPlane, T fovx, T fovy, T aspect); + virtual ~Frustum(); + + //-------------------- + // Assignment operator + //-------------------- + + const Frustum &operator = (const Frustum &); + + //-------------------- + // Operators: ==, != + //-------------------- + + bool operator == (const Frustum &src) const; + bool operator != (const Frustum &src) const; + + //-------------------------------------------------------- + // Set functions change the entire state of the Frustum + //-------------------------------------------------------- + + void set(T nearPlane, T farPlane, + T left, T right, + T top, T bottom, + bool ortho=false); + + void set(T nearPlane, T farPlane, T fovx, T fovy, T aspect); + + //------------------------------------------------------ + // These functions modify an already valid frustum state + //------------------------------------------------------ + + void modifyNearAndFar(T nearPlane, T farPlane); + void setOrthographic(bool); + + //-------------- + // Access + //-------------- + + bool orthographic() const { return _orthographic; } + T nearPlane() const { return _nearPlane; } + T hither() const { return _nearPlane; } + T farPlane() const { return _farPlane; } + T yon() const { return _farPlane; } + T left() const { return _left; } + T right() const { return _right; } + T bottom() const { return _bottom; } + T top() const { return _top; } + + //----------------------------------------------------------------------- + // Sets the planes in p to be the six bounding planes of the frustum, in + // the following order: top, right, bottom, left, near, far. + // Note that the planes have normals that point out of the frustum. + // The version of this routine that takes a matrix applies that matrix + // to transform the frustum before setting the planes. + //----------------------------------------------------------------------- + + void planes(Plane3 p[6]); + void planes(Plane3 p[6], const Matrix44 &M); + + //---------------------- + // Derived Quantities + //---------------------- + + T fovx() const; + T fovy() const; + T aspect() const; + Matrix44 projectionMatrix() const; + bool degenerate() const; + + //----------------------------------------------------------------------- + // Takes a rectangle in the screen space (i.e., -1 <= left <= right <= 1 + // and -1 <= bottom <= top <= 1) of this Frustum, and returns a new + // Frustum whose near clipping-plane window is that rectangle in local + // space. + //----------------------------------------------------------------------- + + Frustum window(T left, T right, T top, T bottom) const; + + //---------------------------------------------------------- + // Projection is in screen space / Conversion from Z-Buffer + //---------------------------------------------------------- + + Line3 projectScreenToRay( const Vec2 & ) const; + Vec2 projectPointToScreen( const Vec3 & ) const; + + T ZToDepth(long zval, long min, long max) const; + T normalizedZToDepth(T zval) const; + long DepthToZ(T depth, long zmin, long zmax) const; + + T worldRadius(const Vec3 &p, T radius) const; + T screenRadius(const Vec3 &p, T radius) const; + + + protected: + + Vec2 screenToLocal( const Vec2 & ) const; + Vec2 localToScreen( const Vec2 & ) const; + + protected: + T _nearPlane; + T _farPlane; + T _left; + T _right; + T _top; + T _bottom; + bool _orthographic; +}; + + +template +inline Frustum::Frustum() +{ + set(T (0.1), + T (1000.0), + T (-1.0), + T (1.0), + T (1.0), + T (-1.0), + false); +} + +template +inline Frustum::Frustum(const Frustum &f) +{ + *this = f; +} + +template +inline Frustum::Frustum(T n, T f, T l, T r, T t, T b, bool o) +{ + set(n,f,l,r,t,b,o); +} + +template +inline Frustum::Frustum(T nearPlane, T farPlane, T fovx, T fovy, T aspect) +{ + set(nearPlane,farPlane,fovx,fovy,aspect); +} + +template +Frustum::~Frustum() +{ +} + +template +const Frustum & +Frustum::operator = (const Frustum &f) +{ + _nearPlane = f._nearPlane; + _farPlane = f._farPlane; + _left = f._left; + _right = f._right; + _top = f._top; + _bottom = f._bottom; + _orthographic = f._orthographic; + + return *this; +} + +template +bool +Frustum::operator == (const Frustum &src) const +{ + return + _nearPlane == src._nearPlane && + _farPlane == src._farPlane && + _left == src._left && + _right == src._right && + _top == src._top && + _bottom == src._bottom && + _orthographic == src._orthographic; +} + +template +inline bool +Frustum::operator != (const Frustum &src) const +{ + return !operator== (src); +} + +template +void Frustum::set(T n, T f, T l, T r, T t, T b, bool o) +{ + _nearPlane = n; + _farPlane = f; + _left = l; + _right = r; + _bottom = b; + _top = t; + _orthographic = o; +} + +template +void Frustum::modifyNearAndFar(T n, T f) +{ + if ( _orthographic ) + { + _nearPlane = n; + } + else + { + Line3 lowerLeft( Vec3(0,0,0), Vec3(_left,_bottom,-_nearPlane) ); + Line3 upperRight( Vec3(0,0,0), Vec3(_right,_top,-_nearPlane) ); + Plane3 nearPlane( Vec3(0,0,-1), n ); + + Vec3 ll,ur; + nearPlane.intersect(lowerLeft,ll); + nearPlane.intersect(upperRight,ur); + + _left = ll.x; + _right = ur.x; + _top = ur.y; + _bottom = ll.y; + _nearPlane = n; + _farPlane = f; + } + + _farPlane = f; +} + +template +void Frustum::setOrthographic(bool ortho) +{ + _orthographic = ortho; +} + +template +void Frustum::set(T nearPlane, T farPlane, T fovx, T fovy, T aspect) +{ + if (fovx != 0 && fovy != 0) + throw Iex::ArgExc ("fovx and fovy cannot both be non-zero."); + + const T two = static_cast(2); + + if (fovx != 0) + { + _right = nearPlane * Math::tan(fovx / two); + _left = -_right; + _top = ((_right - _left) / aspect) / two; + _bottom = -_top; + } + else + { + _top = nearPlane * Math::tan(fovy / two); + _bottom = -_top; + _right = (_top - _bottom) * aspect / two; + _left = -_right; + } + _nearPlane = nearPlane; + _farPlane = farPlane; + _orthographic = false; +} + +template +T Frustum::fovx() const +{ + return Math::atan2(_right,_nearPlane) - Math::atan2(_left,_nearPlane); +} + +template +T Frustum::fovy() const +{ + return Math::atan2(_top,_nearPlane) - Math::atan2(_bottom,_nearPlane); +} + +template +T Frustum::aspect() const +{ + T rightMinusLeft = _right-_left; + T topMinusBottom = _top-_bottom; + + if (abs(topMinusBottom) < 1 && + abs(rightMinusLeft) > limits::max() * abs(topMinusBottom)) + { + throw Iex::DivzeroExc ("Bad viewing frustum: " + "aspect ratio cannot be computed."); + } + + return rightMinusLeft / topMinusBottom; +} + +template +Matrix44 Frustum::projectionMatrix() const +{ + T rightPlusLeft = _right+_left; + T rightMinusLeft = _right-_left; + + T topPlusBottom = _top+_bottom; + T topMinusBottom = _top-_bottom; + + T farPlusNear = _farPlane+_nearPlane; + T farMinusNear = _farPlane-_nearPlane; + + if ((abs(rightMinusLeft) < 1 && + abs(rightPlusLeft) > limits::max() * abs(rightMinusLeft)) || + (abs(topMinusBottom) < 1 && + abs(topPlusBottom) > limits::max() * abs(topMinusBottom)) || + (abs(farMinusNear) < 1 && + abs(farPlusNear) > limits::max() * abs(farMinusNear))) + { + throw Iex::DivzeroExc ("Bad viewing frustum: " + "projection matrix cannot be computed."); + } + + if ( _orthographic ) + { + T tx = -rightPlusLeft / rightMinusLeft; + T ty = -topPlusBottom / topMinusBottom; + T tz = -farPlusNear / farMinusNear; + + if ((abs(rightMinusLeft) < 1 && + 2 > limits::max() * abs(rightMinusLeft)) || + (abs(topMinusBottom) < 1 && + 2 > limits::max() * abs(topMinusBottom)) || + (abs(farMinusNear) < 1 && + 2 > limits::max() * abs(farMinusNear))) + { + throw Iex::DivzeroExc ("Bad viewing frustum: " + "projection matrix cannot be computed."); + } + + T A = 2 / rightMinusLeft; + T B = 2 / topMinusBottom; + T C = -2 / farMinusNear; + + return Matrix44( A, 0, 0, 0, + 0, B, 0, 0, + 0, 0, C, 0, + tx, ty, tz, 1.f ); + } + else + { + T A = rightPlusLeft / rightMinusLeft; + T B = topPlusBottom / topMinusBottom; + T C = -farPlusNear / farMinusNear; + + T farTimesNear = -2 * _farPlane * _nearPlane; + if (abs(farMinusNear) < 1 && + abs(farTimesNear) > limits::max() * abs(farMinusNear)) + { + throw Iex::DivzeroExc ("Bad viewing frustum: " + "projection matrix cannot be computed."); + } + + T D = farTimesNear / farMinusNear; + + T twoTimesNear = 2 * _nearPlane; + + if ((abs(rightMinusLeft) < 1 && + abs(twoTimesNear) > limits::max() * abs(rightMinusLeft)) || + (abs(topMinusBottom) < 1 && + abs(twoTimesNear) > limits::max() * abs(topMinusBottom))) + { + throw Iex::DivzeroExc ("Bad viewing frustum: " + "projection matrix cannot be computed."); + } + + T E = twoTimesNear / rightMinusLeft; + T F = twoTimesNear / topMinusBottom; + + return Matrix44( E, 0, 0, 0, + 0, F, 0, 0, + A, B, C, -1, + 0, 0, D, 0 ); + } +} + +template +bool Frustum::degenerate() const +{ + return (_nearPlane == _farPlane) || + (_left == _right) || + (_top == _bottom); +} + +template +Frustum Frustum::window(T l, T r, T t, T b) const +{ + // move it to 0->1 space + + Vec2 bl = screenToLocal( Vec2(l,b) ); + Vec2 tr = screenToLocal( Vec2(r,t) ); + + return Frustum(_nearPlane, _farPlane, bl.x, tr.x, tr.y, bl.y, _orthographic); +} + + +template +Vec2 Frustum::screenToLocal(const Vec2 &s) const +{ + return Vec2( _left + (_right-_left) * (1.f+s.x) / 2.f, + _bottom + (_top-_bottom) * (1.f+s.y) / 2.f ); +} + +template +Vec2 Frustum::localToScreen(const Vec2 &p) const +{ + T leftPlusRight = _left - T (2) * p.x + _right; + T leftMinusRight = _left-_right; + T bottomPlusTop = _bottom - T (2) * p.y + _top; + T bottomMinusTop = _bottom-_top; + + if ((abs(leftMinusRight) < T (1) && + abs(leftPlusRight) > limits::max() * abs(leftMinusRight)) || + (abs(bottomMinusTop) < T (1) && + abs(bottomPlusTop) > limits::max() * abs(bottomMinusTop))) + { + throw Iex::DivzeroExc + ("Bad viewing frustum: " + "local-to-screen transformation cannot be computed"); + } + + return Vec2( leftPlusRight / leftMinusRight, + bottomPlusTop / bottomMinusTop ); +} + +template +Line3 Frustum::projectScreenToRay(const Vec2 &p) const +{ + Vec2 point = screenToLocal(p); + if (orthographic()) + return Line3( Vec3(point.x,point.y, 0.0), + Vec3(point.x,point.y,-_nearPlane)); + else + return Line3( Vec3(0, 0, 0), Vec3(point.x,point.y,-_nearPlane)); +} + +template +Vec2 Frustum::projectPointToScreen(const Vec3 &point) const +{ + if (orthographic() || point.z == T (0)) + return localToScreen( Vec2( point.x, point.y ) ); + else + return localToScreen( Vec2( point.x * _nearPlane / -point.z, + point.y * _nearPlane / -point.z ) ); +} + +template +T Frustum::ZToDepth(long zval,long zmin,long zmax) const +{ + int zdiff = zmax - zmin; + + if (zdiff == 0) + { + throw Iex::DivzeroExc + ("Bad call to Frustum::ZToDepth: zmax == zmin"); + } + + if ( zval > zmax+1 ) zval -= zdiff; + + T fzval = (T(zval) - T(zmin)) / T(zdiff); + return normalizedZToDepth(fzval); +} + +template +T Frustum::normalizedZToDepth(T zval) const +{ + T Zp = zval * 2.0 - 1; + + if ( _orthographic ) + { + return -(Zp*(_farPlane-_nearPlane) + (_farPlane+_nearPlane))/2; + } + else + { + T farTimesNear = 2 * _farPlane * _nearPlane; + T farMinusNear = Zp * (_farPlane - _nearPlane) - _farPlane - _nearPlane; + + if (abs(farMinusNear) < 1 && + abs(farTimesNear) > limits::max() * abs(farMinusNear)) + { + throw Iex::DivzeroExc + ("Frustum::normalizedZToDepth cannot be computed. The " + "near and far clipping planes of the viewing frustum " + "may be too close to each other"); + } + + return farTimesNear / farMinusNear; + } +} + +template +long Frustum::DepthToZ(T depth,long zmin,long zmax) const +{ + long zdiff = zmax - zmin; + T farMinusNear = _farPlane-_nearPlane; + + if ( _orthographic ) + { + T farPlusNear = 2*depth + _farPlane + _nearPlane; + + if (abs(farMinusNear) < 1 && + abs(farPlusNear) > limits::max() * abs(farMinusNear)) + { + throw Iex::DivzeroExc + ("Bad viewing frustum: near and far clipping planes " + "are too close to each other"); + } + + T Zp = -farPlusNear/farMinusNear; + return long(0.5*(Zp+1)*zdiff) + zmin; + } + else + { + // Perspective + + T farTimesNear = 2*_farPlane*_nearPlane; + if (abs(depth) < 1 && + abs(farTimesNear) > limits::max() * abs(depth)) + { + throw Iex::DivzeroExc + ("Bad call to DepthToZ function: value of `depth' " + "is too small"); + } + + T farPlusNear = farTimesNear/depth + _farPlane + _nearPlane; + if (abs(farMinusNear) < 1 && + abs(farPlusNear) > limits::max() * abs(farMinusNear)) + { + throw Iex::DivzeroExc + ("Bad viewing frustum: near and far clipping planes " + "are too close to each other"); + } + + T Zp = farPlusNear/farMinusNear; + return long(0.5*(Zp+1)*zdiff) + zmin; + } +} + +template +T Frustum::screenRadius(const Vec3 &p, T radius) const +{ + // Derivation: + // Consider X-Z plane. + // X coord of projection of p = xp = p.x * (-_nearPlane / p.z) + // Let q be p + (radius, 0, 0). + // X coord of projection of q = xq = (p.x - radius) * (-_nearPlane / p.z) + // X coord of projection of segment from p to q = r = xp - xq + // = radius * (-_nearPlane / p.z) + // A similar analysis holds in the Y-Z plane. + // So r is the quantity we want to return. + + if (abs(p.z) > 1 || abs(-_nearPlane) < limits::max() * abs(p.z)) + { + return radius * (-_nearPlane / p.z); + } + else + { + throw Iex::DivzeroExc + ("Bad call to Frustum::screenRadius: the magnitude of `p' " + "is too small"); + } + + return radius * (-_nearPlane / p.z); +} + +template +T Frustum::worldRadius(const Vec3 &p, T radius) const +{ + if (abs(-_nearPlane) > 1 || abs(p.z) < limits::max() * abs(-_nearPlane)) + { + return radius * (p.z / -_nearPlane); + } + else + { + throw Iex::DivzeroExc + ("Bad viewing frustum: the near clipping plane is too " + "close to zero"); + } +} + +template +void Frustum::planes(Plane3 p[6]) +{ + // + // Plane order: Top, Right, Bottom, Left, Near, Far. + // Normals point outwards. + // + + if (! _orthographic) + { + Vec3 a( _left, _bottom, -_nearPlane); + Vec3 b( _left, _top, -_nearPlane); + Vec3 c( _right, _top, -_nearPlane); + Vec3 d( _right, _bottom, -_nearPlane); + Vec3 o(0,0,0); + + p[0].set( o, c, b ); + p[1].set( o, d, c ); + p[2].set( o, a, d ); + p[3].set( o, b, a ); + } + else + { + p[0].set( Vec3( 0, 1, 0), _top ); + p[1].set( Vec3( 1, 0, 0), _right ); + p[2].set( Vec3( 0,-1, 0),-_bottom ); + p[3].set( Vec3(-1, 0, 0),-_left ); + } + p[4].set( Vec3(0, 0, 1), -_nearPlane ); + p[5].set( Vec3(0, 0,-1), _farPlane ); +} + + +template +void Frustum::planes(Plane3 p[6], const Matrix44 &M) +{ + // + // Plane order: Top, Right, Bottom, Left, Near, Far. + // Normals point outwards. + // + + Vec3 a = Vec3( _left, _bottom, -_nearPlane) * M; + Vec3 b = Vec3( _left, _top, -_nearPlane) * M; + Vec3 c = Vec3( _right, _top, -_nearPlane) * M; + Vec3 d = Vec3( _right, _bottom, -_nearPlane) * M; + if (! _orthographic) + { + double s = _farPlane / double(_nearPlane); + T farLeft = (T) (s * _left); + T farRight = (T) (s * _right); + T farTop = (T) (s * _top); + T farBottom = (T) (s * _bottom); + Vec3 e = Vec3( farLeft, farBottom, -_farPlane) * M; + Vec3 f = Vec3( farLeft, farTop, -_farPlane) * M; + Vec3 g = Vec3( farRight, farTop, -_farPlane) * M; + Vec3 o = Vec3(0,0,0) * M; + p[0].set( o, c, b ); + p[1].set( o, d, c ); + p[2].set( o, a, d ); + p[3].set( o, b, a ); + p[4].set( a, d, c ); + p[5].set( e, f, g ); + } + else + { + Vec3 e = Vec3( _left, _bottom, -_farPlane) * M; + Vec3 f = Vec3( _left, _top, -_farPlane) * M; + Vec3 g = Vec3( _right, _top, -_farPlane) * M; + Vec3 h = Vec3( _right, _bottom, -_farPlane) * M; + p[0].set( c, g, f ); + p[1].set( d, h, g ); + p[2].set( a, e, h ); + p[3].set( b, f, e ); + p[4].set( a, d, c ); + p[5].set( e, f, g ); + } +} + +typedef Frustum Frustumf; +typedef Frustum Frustumd; + + +} // namespace Imath + + +#if defined _WIN32 || defined _WIN64 + #ifdef _redef_near + #define near + #endif + #ifdef _redef_far + #define far + #endif +#endif + +#endif diff --git a/3rdparty/openexr/Imath/ImathFrustumTest.h b/3rdparty/openexr/Imath/ImathFrustumTest.h new file mode 100644 index 000000000..a726efce6 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathFrustumTest.h @@ -0,0 +1,410 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2011, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHFRUSTUMTEST_H +#define INCLUDED_IMATHFRUSTUMTEST_H + +//------------------------------------------------------------------------- +// +// This file contains algorithms applied to or in conjunction with +// Frustum visibility testing (Imath::Frustum). +// +// Methods for frustum-based rejection of primitives are contained here. +// +//------------------------------------------------------------------------- + +#include "ImathFrustum.h" +#include "ImathBox.h" +#include "ImathSphere.h" +#include "ImathMatrix.h" +#include "ImathVec.h" + +namespace Imath { + +///////////////////////////////////////////////////////////////// +// FrustumTest +// +// template class FrustumTest +// +// This is a helper class, designed to accelerate the case +// where many tests are made against the same frustum. +// That's a really common case. +// +// The acceleration is achieved by pre-computing the planes of +// the frustum, along with the ablsolute values of the plane normals. +// + + + +////////////////////////////////////////////////////////////////// +// How to use this +// +// Given that you already have: +// Imath::Frustum myFrustum +// IMath::Matrix44 myCameraWorldMatrix +// +// First, make a frustum test object: +// FrustumTest myFrustumTest(myFrustum, myCameraWorldMatrix) +// +// Whenever the camera or frustum changes, call: +// myFrustumTest.setFrustum(myFrustum, myCameraWorldMatrix) +// +// For each object you want to test for visibility, call: +// myFrustumTest.isVisible(myBox) +// myFrustumTest.isVisible(mySphere) +// myFrustumTest.isVisible(myVec3) +// myFrustumTest.completelyContains(myBox) +// myFrustumTest.completelyContains(mySphere) +// + + + + +////////////////////////////////////////////////////////////////// +// Explanation of how it works +// +// +// We store six world-space Frustum planes (nx, ny, nz, offset) +// +// Points: To test a Vec3 for visibility, test it against each plane +// using the normal (v dot n - offset) method. (the result is exact) +// +// BBoxes: To test an axis-aligned bbox, test the center against each plane +// using the normal (v dot n - offset) method, but offset by the +// box extents dot the abs of the plane normal. (the result is NOT +// exact, but will not return false-negatives.) +// +// Spheres: To test a sphere, test the center against each plane +// using the normal (v dot n - offset) method, but offset by the +// sphere's radius. (the result is NOT exact, but will not return +// false-negatives.) +// +// +// SPECIAL NOTE: "Where are the dot products?" +// Actual dot products are currently slow for most SIMD architectures. +// In order to keep this code optimization-ready, the dot products +// are all performed using vector adds and multipies. +// +// In order to do this, the plane equations are stored in "transpose" +// form, with the X components grouped into an X vector, etc. +// + + +template +class FrustumTest +{ +public: + FrustumTest() + { + Frustum frust; + Matrix44 cameraMat; + cameraMat.makeIdentity(); + setFrustum(frust, cameraMat); + } + FrustumTest(Frustum &frustum, const Matrix44 &cameraMat) + { + setFrustum(frustum, cameraMat); + } + + //////////////////////////////////////////////////////////////////// + // setFrustum() + // This updates the frustum test with a new frustum and matrix. + // This should usually be called just once per frame. + void setFrustum(Frustum &frustum, const Matrix44 &cameraMat); + + //////////////////////////////////////////////////////////////////// + // isVisible() + // Check to see if shapes are visible. + bool isVisible(const Sphere3 &sphere) const; + bool isVisible(const Box > &box) const; + bool isVisible(const Vec3 &vec) const; + + //////////////////////////////////////////////////////////////////// + // completelyContains() + // Check to see if shapes are entirely contained. + bool completelyContains(const Sphere3 &sphere) const; + bool completelyContains(const Box > &box) const; + + // These next items are kept primarily for debugging tools. + // It's useful for drawing the culling environment, and also + // for getting an "outside view" of the culling frustum. + Imath::Matrix44 cameraMat() const {return cameraMatrix;} + Imath::Frustum currentFrustum() const {return currFrustum;} + +protected: + // To understand why the planes are stored this way, see + // the SPECIAL NOTE above. + Vec3 planeNormX[2]; // The X compunents from 6 plane equations + Vec3 planeNormY[2]; // The Y compunents from 6 plane equations + Vec3 planeNormZ[2]; // The Z compunents from 6 plane equations + + Vec3 planeOffsetVec[2]; // The distance offsets from 6 plane equations + + // The absolute values are stored to assist with bounding box tests. + Vec3 planeNormAbsX[2]; // The abs(X) compunents from 6 plane equations + Vec3 planeNormAbsY[2]; // The abs(X) compunents from 6 plane equations + Vec3 planeNormAbsZ[2]; // The abs(X) compunents from 6 plane equations + + // These are kept primarily for debugging tools. + Frustum currFrustum; + Matrix44 cameraMatrix; +}; + + +//////////////////////////////////////////////////////////////////// +// setFrustum() +// This should usually only be called once per frame, or however +// often the camera moves. +template +void FrustumTest::setFrustum(Frustum &frustum, + const Matrix44 &cameraMat) +{ + Plane3 frustumPlanes[6]; + frustum.planes(frustumPlanes, cameraMat); + + // Here's where we effectively transpose the plane equations. + // We stuff all six X's into the two planeNormX vectors, etc. + for (int i = 0; i < 2; ++i) + { + int index = i * 3; + + planeNormX[i] = Vec3(frustumPlanes[index + 0].normal.x, + frustumPlanes[index + 1].normal.x, + frustumPlanes[index + 2].normal.x); + planeNormY[i] = Vec3(frustumPlanes[index + 0].normal.y, + frustumPlanes[index + 1].normal.y, + frustumPlanes[index + 2].normal.y); + planeNormZ[i] = Vec3(frustumPlanes[index + 0].normal.z, + frustumPlanes[index + 1].normal.z, + frustumPlanes[index + 2].normal.z); + + planeNormAbsX[i] = Vec3(Imath::abs(planeNormX[i].x), + Imath::abs(planeNormX[i].y), + Imath::abs(planeNormX[i].z)); + planeNormAbsY[i] = Vec3(Imath::abs(planeNormY[i].x), + Imath::abs(planeNormY[i].y), + Imath::abs(planeNormY[i].z)); + planeNormAbsZ[i] = Vec3(Imath::abs(planeNormZ[i].x), + Imath::abs(planeNormZ[i].y), + Imath::abs(planeNormZ[i].z)); + + planeOffsetVec[i] = Vec3(frustumPlanes[index + 0].distance, + frustumPlanes[index + 1].distance, + frustumPlanes[index + 2].distance); + } + currFrustum = frustum; + cameraMatrix = cameraMat; +} + + +//////////////////////////////////////////////////////////////////// +// isVisible(Sphere) +// Returns true if any part of the sphere is inside +// the frustum. +// The result MAY return close false-positives, but not false-negatives. +// +template +bool FrustumTest::isVisible(const Sphere3 &sphere) const +{ + Vec3 center = sphere.center; + Vec3 radiusVec = Vec3(sphere.radius, sphere.radius, sphere.radius); + + // This is a vertical dot-product on three vectors at once. + Vec3 d0 = planeNormX[0] * center.x + + planeNormY[0] * center.y + + planeNormZ[0] * center.z + - radiusVec + - planeOffsetVec[0]; + + if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) + return false; + + Vec3 d1 = planeNormX[1] * center.x + + planeNormY[1] * center.y + + planeNormZ[1] * center.z + - radiusVec + - planeOffsetVec[1]; + + if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) + return false; + + return true; +} + +//////////////////////////////////////////////////////////////////// +// completelyContains(Sphere) +// Returns true if every part of the sphere is inside +// the frustum. +// The result MAY return close false-negatives, but not false-positives. +// +template +bool FrustumTest::completelyContains(const Sphere3 &sphere) const +{ + Vec3 center = sphere.center; + Vec3 radiusVec = Vec3(sphere.radius, sphere.radius, sphere.radius); + + // This is a vertical dot-product on three vectors at once. + Vec3 d0 = planeNormX[0] * center.x + + planeNormY[0] * center.y + + planeNormZ[0] * center.z + + radiusVec + - planeOffsetVec[0]; + + if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) + return false; + + Vec3 d1 = planeNormX[1] * center.x + + planeNormY[1] * center.y + + planeNormZ[1] * center.z + + radiusVec + - planeOffsetVec[1]; + + if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) + return false; + + return true; +} + +//////////////////////////////////////////////////////////////////// +// isVisible(Box) +// Returns true if any part of the axis-aligned box +// is inside the frustum. +// The result MAY return close false-positives, but not false-negatives. +// +template +bool FrustumTest::isVisible(const Box > &box) const +{ + Vec3 center = (box.min + box.max) / 2; + Vec3 extent = (box.max - center); + + // This is a vertical dot-product on three vectors at once. + Vec3 d0 = planeNormX[0] * center.x + + planeNormY[0] * center.y + + planeNormZ[0] * center.z + - planeNormAbsX[0] * extent.x + - planeNormAbsY[0] * extent.y + - planeNormAbsZ[0] * extent.z + - planeOffsetVec[0]; + + if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) + return false; + + Vec3 d1 = planeNormX[1] * center.x + + planeNormY[1] * center.y + + planeNormZ[1] * center.z + - planeNormAbsX[1] * extent.x + - planeNormAbsY[1] * extent.y + - planeNormAbsZ[1] * extent.z + - planeOffsetVec[1]; + + if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) + return false; + + return true; +} + +//////////////////////////////////////////////////////////////////// +// completelyContains(Box) +// Returns true if every part of the axis-aligned box +// is inside the frustum. +// The result MAY return close false-negatives, but not false-positives. +// +template +bool FrustumTest::completelyContains(const Box > &box) const +{ + Vec3 center = (box.min + box.max) / 2; + Vec3 extent = (box.max - center); + + // This is a vertical dot-product on three vectors at once. + Vec3 d0 = planeNormX[0] * center.x + + planeNormY[0] * center.y + + planeNormZ[0] * center.z + + planeNormAbsX[0] * extent.x + + planeNormAbsY[0] * extent.y + + planeNormAbsZ[0] * extent.z + - planeOffsetVec[0]; + + if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) + return false; + + Vec3 d1 = planeNormX[1] * center.x + + planeNormY[1] * center.y + + planeNormZ[1] * center.z + + planeNormAbsX[1] * extent.x + + planeNormAbsY[1] * extent.y + + planeNormAbsZ[1] * extent.z + - planeOffsetVec[1]; + + if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) + return false; + + return true; +} + + +//////////////////////////////////////////////////////////////////// +// isVisible(Vec3) +// Returns true if the point is inside the frustum. +// +template +bool FrustumTest::isVisible(const Vec3 &vec) const +{ + // This is a vertical dot-product on three vectors at once. + Vec3 d0 = (planeNormX[0] * vec.x) + + (planeNormY[0] * vec.y) + + (planeNormZ[0] * vec.z) + - planeOffsetVec[0]; + + if (d0.x >= 0 || d0.y >= 0 || d0.z >= 0) + return false; + + Vec3 d1 = (planeNormX[1] * vec.x) + + (planeNormY[1] * vec.y) + + (planeNormZ[1] * vec.z) + - planeOffsetVec[1]; + + if (d1.x >= 0 || d1.y >= 0 || d1.z >= 0) + return false; + + return true; +} + + +typedef FrustumTest FrustumTestf; +typedef FrustumTest FrustumTestd; + +} //namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathFun.cpp b/3rdparty/openexr/Imath/ImathFun.cpp new file mode 100644 index 000000000..defab9361 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathFun.cpp @@ -0,0 +1,181 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic nor the names of +// its contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////// + + +#include "ImathFun.h" + +namespace Imath { + + +float +succf (float f) +{ + union {float f; int i;} u; + u.f = f; + + if ((u.i & 0x7f800000) == 0x7f800000) + { + // Nan or infinity; don't change value. + } + else if (u.i == 0x00000000 || u.i == 0x80000000) + { + // Plus or minus zero. + + u.i = 0x00000001; + } + else if (u.i > 0) + { + // Positive float, normalized or denormalized. + // Incrementing the largest positive float + // produces +infinity. + + ++u.i; + } + else + { + // Negative normalized or denormalized float. + + --u.i; + } + + return u.f; +} + + +float +predf (float f) +{ + union {float f; int i;} u; + u.f = f; + + if ((u.i & 0x7f800000) == 0x7f800000) + { + // Nan or infinity; don't change value. + } + else if (u.i == 0x00000000 || u.i == 0x80000000) + { + // Plus or minus zero. + + u.i = 0x80000001; + } + else if (u.i > 0) + { + // Positive float, normalized or denormalized. + + --u.i; + } + else + { + // Negative normalized or denormalized float. + // Decrementing the largest negative float + // produces -infinity. + + ++u.i; + } + + return u.f; +} + + +double +succd (double d) +{ + union {double d; Int64 i;} u; + u.d = d; + + if ((u.i & 0x7ff0000000000000LL) == 0x7ff0000000000000LL) + { + // Nan or infinity; don't change value. + } + else if (u.i == 0x0000000000000000LL || u.i == 0x8000000000000000LL) + { + // Plus or minus zero. + + u.i = 0x0000000000000001LL; + } + else if (u.i > 0) + { + // Positive double, normalized or denormalized. + // Incrementing the largest positive double + // produces +infinity. + + ++u.i; + } + else + { + // Negative normalized or denormalized double. + + --u.i; + } + + return u.d; +} + + +double +predd (double d) +{ + union {double d; Int64 i;} u; + u.d = d; + + if ((u.i & 0x7ff0000000000000LL) == 0x7ff0000000000000LL) + { + // Nan or infinity; don't change value. + } + else if (u.i == 0x0000000000000000LL || u.i == 0x8000000000000000LL) + { + // Plus or minus zero. + + u.i = 0x8000000000000001LL; + } + else if (u.i > 0) + { + // Positive double, normalized or denormalized. + + --u.i; + } + else + { + // Negative normalized or denormalized double. + // Decrementing the largest negative double + // produces -infinity. + + ++u.i; + } + + return u.d; +} + + +} // namespace Imath diff --git a/3rdparty/openexr/Imath/ImathFun.h b/3rdparty/openexr/Imath/ImathFun.h new file mode 100644 index 000000000..0baf4ff22 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathFun.h @@ -0,0 +1,267 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHFUN_H +#define INCLUDED_IMATHFUN_H + +//----------------------------------------------------------------------------- +// +// Miscellaneous utility functions +// +//----------------------------------------------------------------------------- + +#include "ImathLimits.h" +#include "ImathInt64.h" + +namespace Imath { + +template +inline T +abs (T a) +{ + return (a > T(0)) ? a : -a; +} + + +template +inline int +sign (T a) +{ + return (a > T(0))? 1 : ((a < T(0)) ? -1 : 0); +} + + +template +inline T +lerp (T a, T b, Q t) +{ + return (T) (a * (1 - t) + b * t); +} + + +template +inline T +ulerp (T a, T b, Q t) +{ + return (T) ((a > b)? (a - (a - b) * t): (a + (b - a) * t)); +} + + +template +inline T +lerpfactor(T m, T a, T b) +{ + // + // Return how far m is between a and b, that is return t such that + // if: + // t = lerpfactor(m, a, b); + // then: + // m = lerp(a, b, t); + // + // If a==b, return 0. + // + + T d = b - a; + T n = m - a; + + if (abs(d) > T(1) || abs(n) < limits::max() * abs(d)) + return n / d; + + return T(0); +} + + +template +inline T +clamp (T a, T l, T h) +{ + return (a < l)? l : ((a > h)? h : a); +} + + +template +inline int +cmp (T a, T b) +{ + return Imath::sign (a - b); +} + + +template +inline int +cmpt (T a, T b, T t) +{ + return (Imath::abs (a - b) <= t)? 0 : cmp (a, b); +} + + +template +inline bool +iszero (T a, T t) +{ + return (Imath::abs (a) <= t) ? 1 : 0; +} + + +template +inline bool +equal (T1 a, T2 b, T3 t) +{ + return Imath::abs (a - b) <= t; +} + +template +inline int +floor (T x) +{ + return (x >= 0)? int (x): -(int (-x) + (-x > int (-x))); +} + + +template +inline int +ceil (T x) +{ + return -floor (-x); +} + +template +inline int +trunc (T x) +{ + return (x >= 0) ? int(x) : -int(-x); +} + + +// +// Integer division and remainder where the +// remainder of x/y has the same sign as x: +// +// divs(x,y) == (abs(x) / abs(y)) * (sign(x) * sign(y)) +// mods(x,y) == x - y * divs(x,y) +// + +inline int +divs (int x, int y) +{ + return (x >= 0)? ((y >= 0)? ( x / y): -( x / -y)): + ((y >= 0)? -(-x / y): (-x / -y)); +} + + +inline int +mods (int x, int y) +{ + return (x >= 0)? ((y >= 0)? ( x % y): ( x % -y)): + ((y >= 0)? -(-x % y): -(-x % -y)); +} + + +// +// Integer division and remainder where the +// remainder of x/y is always positive: +// +// divp(x,y) == floor (double(x) / double (y)) +// modp(x,y) == x - y * divp(x,y) +// + +inline int +divp (int x, int y) +{ + return (x >= 0)? ((y >= 0)? ( x / y): -( x / -y)): + ((y >= 0)? -((y-1-x) / y): ((-y-1-x) / -y)); +} + + +inline int +modp (int x, int y) +{ + return x - y * divp (x, y); +} + +//---------------------------------------------------------- +// Successor and predecessor for floating-point numbers: +// +// succf(f) returns float(f+e), where e is the smallest +// positive number such that float(f+e) != f. +// +// predf(f) returns float(f-e), where e is the smallest +// positive number such that float(f-e) != f. +// +// succd(d) returns double(d+e), where e is the smallest +// positive number such that double(d+e) != d. +// +// predd(d) returns double(d-e), where e is the smallest +// positive number such that double(d-e) != d. +// +// Exceptions: If the input value is an infinity or a nan, +// succf(), predf(), succd(), and predd() all +// return the input value without changing it. +// +//---------------------------------------------------------- + +float succf (float f); +float predf (float f); + +double succd (double d); +double predd (double d); + +// +// Return true if the number is not a NaN or Infinity. +// + +inline bool +finitef (float f) +{ + union {float f; int i;} u; + u.f = f; + + return (u.i & 0x7f800000) != 0x7f800000; +} + +inline bool +finited (double d) +{ + union {double d; Int64 i;} u; + u.d = d; + + return (u.i & 0x7ff0000000000000LL) != 0x7ff0000000000000LL; +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathGL.h b/3rdparty/openexr/Imath/ImathGL.h new file mode 100644 index 000000000..36be0fdc5 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathGL.h @@ -0,0 +1,159 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHGL_H +#define INCLUDED_IMATHGL_H + +#include + +#include "ImathVec.h" +#include "ImathMatrix.h" +#include "IexMathExc.h" +#include "ImathFun.h" + +inline void glVertex ( const Imath::V3f &v ) { glVertex3f(v.x,v.y,v.z); } +inline void glVertex ( const Imath::V2f &v ) { glVertex2f(v.x,v.y); } +inline void glNormal ( const Imath::V3f &n ) { glNormal3f(n.x,n.y,n.z); } +inline void glColor ( const Imath::V3f &c ) { glColor3f(c.x,c.y,c.z); } +inline void glTranslate ( const Imath::V3f &t ) { glTranslatef(t.x,t.y,t.z); } + +inline void glTexCoord( const Imath::V2f &t ) +{ + glTexCoord2f(t.x,t.y); +} + +inline void glDisableTexture() +{ + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + + glActiveTexture(GL_TEXTURE0); +} + +namespace { + +const float GL_FLOAT_MAX = 1.8e+19; // sqrt (FLT_MAX) + +inline bool +badFloat (float f) +{ + return !Imath::finitef (f) || f < - GL_FLOAT_MAX || f > GL_FLOAT_MAX; +} + +} // namespace + +inline void +throwBadMatrix (const Imath::M44f& m) +{ + if (badFloat (m[0][0]) || + badFloat (m[0][1]) || + badFloat (m[0][2]) || + badFloat (m[0][3]) || + badFloat (m[1][0]) || + badFloat (m[1][1]) || + badFloat (m[1][2]) || + badFloat (m[1][3]) || + badFloat (m[2][0]) || + badFloat (m[2][1]) || + badFloat (m[2][2]) || + badFloat (m[2][3]) || + badFloat (m[3][0]) || + badFloat (m[3][1]) || + badFloat (m[3][2]) || + badFloat (m[3][3])) + throw Iex::OverflowExc ("GL matrix overflow"); +} + +inline void +glMultMatrix( const Imath::M44f& m ) +{ + throwBadMatrix (m); + glMultMatrixf( (GLfloat*)m[0] ); +} + +inline void +glMultMatrix( const Imath::M44f* m ) +{ + throwBadMatrix (*m); + glMultMatrixf( (GLfloat*)(*m)[0] ); +} + +inline void +glLoadMatrix( const Imath::M44f& m ) +{ + throwBadMatrix (m); + glLoadMatrixf( (GLfloat*)m[0] ); +} + +inline void +glLoadMatrix( const Imath::M44f* m ) +{ + throwBadMatrix (*m); + glLoadMatrixf( (GLfloat*)(*m)[0] ); +} + + +namespace Imath { + +// +// Class objects that push/pop the GL state. These objects assist with +// proper cleanup of the state when exceptions are thrown. +// + +class GLPushMatrix { + public: + + GLPushMatrix () { glPushMatrix(); } + ~GLPushMatrix() { glPopMatrix(); } +}; + +class GLPushAttrib { + public: + + GLPushAttrib (GLbitfield mask) { glPushAttrib (mask); } + ~GLPushAttrib() { glPopAttrib(); } +}; + +class GLBegin { + public: + + GLBegin (GLenum mode) { glBegin (mode); } + ~GLBegin() { glEnd(); } +}; + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathGLU.h b/3rdparty/openexr/Imath/ImathGLU.h new file mode 100644 index 000000000..e43d560d1 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathGLU.h @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHGLU_H +#define INCLUDED_IMATHGLU_H + +#include +#include + +#include "ImathVec.h" + +inline +void +gluLookAt(const Imath::V3f &pos, const Imath::V3f &interest, const Imath::V3f &up) +{ + gluLookAt(pos.x, pos.y, pos.z, + interest.x, interest.y, interest.z, + up.x, up.y, up.z); +} + +#endif diff --git a/3rdparty/openexr/Imath/ImathHalfLimits.h b/3rdparty/openexr/Imath/ImathHalfLimits.h new file mode 100644 index 000000000..2170f94a9 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathHalfLimits.h @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHHALFLIMITS_H +#define INCLUDED_IMATHHALFLIMITS_H + +//-------------------------------------------------- +// +// Imath-style limits for class half. +// +//-------------------------------------------------- + +#include "ImathLimits.h" +#include "half.h" + +namespace Imath { + + +template <> +struct limits +{ + static float min() {return -HALF_MAX;} + static float max() {return HALF_MAX;} + static float smallest() {return HALF_MIN;} + static float epsilon() {return HALF_EPSILON;} + static bool isIntegral() {return false;} + static bool isSigned() {return true;} +}; + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathInt64.h b/3rdparty/openexr/Imath/ImathInt64.h new file mode 100644 index 000000000..71ee4ec55 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathInt64.h @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATH_INT64_H +#define INCLUDED_IMATH_INT64_H + +//---------------------------------------------------------------------------- +// +// Int64 -- unsigned 64-bit integers +// +//---------------------------------------------------------------------------- + +#include + +namespace Imath { + + +#if (defined _WIN32 || defined _WIN64) && _MSC_VER >= 1300 + typedef unsigned __int64 Int64; +#elif ULONG_MAX == 18446744073709551615LU + typedef long unsigned int Int64; +#else + typedef long long unsigned int Int64; +#endif + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathInterval.h b/3rdparty/openexr/Imath/ImathInterval.h new file mode 100644 index 000000000..2d9d7d37b --- /dev/null +++ b/3rdparty/openexr/Imath/ImathInterval.h @@ -0,0 +1,224 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHINTERVAL_H +#define INCLUDED_IMATHINTERVAL_H + + +//------------------------------------------------------------------- +// +// class Imath::Interval +// -------------------------------- +// +// An Interval has a min and a max and some miscellaneous +// functions. It is basically a Box that allows T to be +// a scalar. +// +//------------------------------------------------------------------- + +#include "ImathVec.h" + +namespace Imath { + + +template +class Interval +{ + public: + + //------------------------- + // Data Members are public + //------------------------- + + T min; + T max; + + //----------------------------------------------------- + // Constructors - an "empty" Interval is created by default + //----------------------------------------------------- + + Interval(); + Interval(const T& point); + Interval(const T& minT, const T& maxT); + + //-------------------------------- + // Operators: we get != from STL + //-------------------------------- + + bool operator == (const Interval &src) const; + + //------------------ + // Interval manipulation + //------------------ + + void makeEmpty(); + void extendBy(const T& point); + void extendBy(const Interval& interval); + + //--------------------------------------------------- + // Query functions - these compute results each time + //--------------------------------------------------- + + T size() const; + T center() const; + bool intersects(const T &point) const; + bool intersects(const Interval &interval) const; + + //---------------- + // Classification + //---------------- + + bool hasVolume() const; + bool isEmpty() const; +}; + + +//-------------------- +// Convenient typedefs +//-------------------- + + +typedef Interval Intervalf; +typedef Interval Intervald; +typedef Interval Intervals; +typedef Interval Intervali; + +//---------------- +// Implementation +//---------------- + + +template +inline Interval::Interval() +{ + makeEmpty(); +} + +template +inline Interval::Interval(const T& point) +{ + min = point; + max = point; +} + +template +inline Interval::Interval(const T& minV, const T& maxV) +{ + min = minV; + max = maxV; +} + +template +inline bool +Interval::operator == (const Interval &src) const +{ + return (min == src.min && max == src.max); +} + +template +inline void +Interval::makeEmpty() +{ + min = limits::max(); + max = limits::min(); +} + +template +inline void +Interval::extendBy(const T& point) +{ + if ( point < min ) + min = point; + + if ( point > max ) + max = point; +} + +template +inline void +Interval::extendBy(const Interval& interval) +{ + if ( interval.min < min ) + min = interval.min; + + if ( interval.max > max ) + max = interval.max; +} + +template +inline bool +Interval::intersects(const T& point) const +{ + return point >= min && point <= max; +} + +template +inline bool +Interval::intersects(const Interval& interval) const +{ + return interval.max >= min && interval.min <= max; +} + +template +inline T +Interval::size() const +{ + return max-min; +} + +template +inline T +Interval::center() const +{ + return (max+min)/2; +} + +template +inline bool +Interval::isEmpty() const +{ + return max < min; +} + +template +inline bool Interval::hasVolume() const +{ + return max > min; +} + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathLimits.h b/3rdparty/openexr/Imath/ImathLimits.h new file mode 100644 index 000000000..6ba74f612 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathLimits.h @@ -0,0 +1,267 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHLIMITS_H +#define INCLUDED_IMATHLIMITS_H + +//---------------------------------------------------------------- +// +// Limitations of the basic C++ numerical data types +// +//---------------------------------------------------------------- + +#include +#include + +//------------------------------------------ +// In Windows, min and max are macros. Yay. +//------------------------------------------ + +#if defined _WIN32 || defined _WIN64 + #ifdef min + #undef min + #endif + #ifdef max + #undef max + #endif +#endif + +namespace Imath { + + +//----------------------------------------------------------------- +// +// Template class limits returns information about the limits +// of numerical data type T: +// +// min() largest possible negative value of type T +// +// max() largest possible positive value of type T +// +// smallest() smallest possible positive value of type T +// (for float and double: smallest normalized +// positive value) +// +// epsilon() smallest possible e of type T, for which +// 1 + e != 1 +// +// isIntegral() returns true if T is an integral type +// +// isSigned() returns true if T is signed +// +// Class limits is useful to implement template classes or +// functions which depend on the limits of a numerical type +// which is not known in advance; for example: +// +// template max (T x[], int n) +// { +// T m = limits::min(); +// +// for (int i = 0; i < n; i++) +// if (m < x[i]) +// m = x[i]; +// +// return m; +// } +// +// Class limits has been implemented for the following types: +// +// char, signed char, unsigned char +// short, unsigned short +// int, unsigned int +// long, unsigned long +// float +// double +// long double +// +// Class limits has only static member functions, all of which +// are implemented as inlines. No objects of type limits are +// ever created. +// +//----------------------------------------------------------------- + + +template struct limits +{ + static T min(); + static T max(); + static T smallest(); + static T epsilon(); + static bool isIntegral(); + static bool isSigned(); +}; + + +//--------------- +// Implementation +//--------------- + +template <> +struct limits +{ + static char min() {return CHAR_MIN;} + static char max() {return CHAR_MAX;} + static char smallest() {return 1;} + static char epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return (char) ~0 < 0;} +}; + +template <> +struct limits +{ + static signed char min() {return SCHAR_MIN;} + static signed char max() {return SCHAR_MAX;} + static signed char smallest() {return 1;} + static signed char epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return true;} +}; + +template <> +struct limits +{ + static unsigned char min() {return 0;} + static unsigned char max() {return UCHAR_MAX;} + static unsigned char smallest() {return 1;} + static unsigned char epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return false;} +}; + +template <> +struct limits +{ + static short min() {return SHRT_MIN;} + static short max() {return SHRT_MAX;} + static short smallest() {return 1;} + static short epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return true;} +}; + +template <> +struct limits +{ + static unsigned short min() {return 0;} + static unsigned short max() {return USHRT_MAX;} + static unsigned short smallest() {return 1;} + static unsigned short epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return false;} +}; + +template <> +struct limits +{ + static int min() {return INT_MIN;} + static int max() {return INT_MAX;} + static int smallest() {return 1;} + static int epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return true;} +}; + +template <> +struct limits +{ + static unsigned int min() {return 0;} + static unsigned int max() {return UINT_MAX;} + static unsigned int smallest() {return 1;} + static unsigned int epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return false;} +}; + +template <> +struct limits +{ + static long min() {return LONG_MIN;} + static long max() {return LONG_MAX;} + static long smallest() {return 1;} + static long epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return true;} +}; + +template <> +struct limits +{ + static unsigned long min() {return 0;} + static unsigned long max() {return ULONG_MAX;} + static unsigned long smallest() {return 1;} + static unsigned long epsilon() {return 1;} + static bool isIntegral() {return true;} + static bool isSigned() {return false;} +}; + +template <> +struct limits +{ + static float min() {return -FLT_MAX;} + static float max() {return FLT_MAX;} + static float smallest() {return FLT_MIN;} + static float epsilon() {return FLT_EPSILON;} + static bool isIntegral() {return false;} + static bool isSigned() {return true;} +}; + +template <> +struct limits +{ + static double min() {return -DBL_MAX;} + static double max() {return DBL_MAX;} + static double smallest() {return DBL_MIN;} + static double epsilon() {return DBL_EPSILON;} + static bool isIntegral() {return false;} + static bool isSigned() {return true;} +}; + +template <> +struct limits +{ + static long double min() {return -LDBL_MAX;} + static long double max() {return LDBL_MAX;} + static long double smallest() {return LDBL_MIN;} + static long double epsilon() {return LDBL_EPSILON;} + static bool isIntegral() {return false;} + static bool isSigned() {return true;} +}; + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathLine.h b/3rdparty/openexr/Imath/ImathLine.h new file mode 100644 index 000000000..601fc6f97 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathLine.h @@ -0,0 +1,184 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHLINE_H +#define INCLUDED_IMATHLINE_H + +//------------------------------------- +// +// A 3D line class template +// +//------------------------------------- + +#include "ImathVec.h" +#include "ImathLimits.h" +#include "ImathMatrix.h" + +namespace Imath { + + +template +class Line3 +{ + public: + + Vec3 pos; + Vec3 dir; + + //------------------------------------------------------------- + // Constructors - default is normalized units along direction + //------------------------------------------------------------- + + Line3() {} + Line3(const Vec3& point1, const Vec3& point2); + + //------------------ + // State Query/Set + //------------------ + + void set(const Vec3& point1, + const Vec3& point2); + + //------- + // F(t) + //------- + + Vec3 operator() (T parameter) const; + + //--------- + // Query + //--------- + + T distanceTo(const Vec3& point) const; + T distanceTo(const Line3& line) const; + Vec3 closestPointTo(const Vec3& point) const; + Vec3 closestPointTo(const Line3& line) const; +}; + + +//-------------------- +// Convenient typedefs +//-------------------- + +typedef Line3 Line3f; +typedef Line3 Line3d; + + +//--------------- +// Implementation +//--------------- + +template +inline Line3::Line3(const Vec3 &p0, const Vec3 &p1) +{ + set(p0,p1); +} + +template +inline void Line3::set(const Vec3 &p0, const Vec3 &p1) +{ + pos = p0; dir = p1-p0; + dir.normalize(); +} + +template +inline Vec3 Line3::operator()(T parameter) const +{ + return pos + dir * parameter; +} + +template +inline T Line3::distanceTo(const Vec3& point) const +{ + return (closestPointTo(point)-point).length(); +} + +template +inline Vec3 Line3::closestPointTo(const Vec3& point) const +{ + return ((point - pos) ^ dir) * dir + pos; +} + +template +inline T Line3::distanceTo(const Line3& line) const +{ + T d = (dir % line.dir) ^ (line.pos - pos); + return (d >= 0)? d: -d; +} + +template +inline Vec3 +Line3::closestPointTo(const Line3& line) const +{ + // Assumes the lines are normalized + + Vec3 posLpos = pos - line.pos ; + T c = dir ^ posLpos; + T a = line.dir ^ dir; + T f = line.dir ^ posLpos ; + T num = c - a * f; + + T denom = a*a - 1; + + T absDenom = ((denom >= 0)? denom: -denom); + + if (absDenom < 1) + { + T absNum = ((num >= 0)? num: -num); + + if (absNum >= absDenom * limits::max()) + return pos; + } + + return pos + dir * (num / denom); +} + +template +std::ostream& operator<< (std::ostream &o, const Line3 &line) +{ + return o << "(" << line.pos << ", " << line.dir << ")"; +} + +template +inline Line3 operator * (const Line3 &line, const Matrix44 &M) +{ + return Line3( line.pos * M, (line.pos + line.dir) * M ); +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathLineAlgo.h b/3rdparty/openexr/Imath/ImathLineAlgo.h new file mode 100644 index 000000000..41855c9b0 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathLineAlgo.h @@ -0,0 +1,287 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHLINEALGO_H +#define INCLUDED_IMATHLINEALGO_H + +//------------------------------------------------------------------ +// +// This file contains algorithms applied to or in conjunction +// with lines (Imath::Line). These algorithms may require +// more headers to compile. The assumption made is that these +// functions are called much less often than the basic line +// functions or these functions require more support classes +// +// Contains: +// +// bool closestPoints(const Line& line1, +// const Line& line2, +// Vec3& point1, +// Vec3& point2) +// +// bool intersect( const Line3 &line, +// const Vec3 &v0, +// const Vec3 &v1, +// const Vec3 &v2, +// Vec3 &pt, +// Vec3 &barycentric, +// bool &front) +// +// V3f +// closestVertex(const Vec3 &v0, +// const Vec3 &v1, +// const Vec3 &v2, +// const Line3 &l) +// +// V3f +// rotatePoint(const Vec3 p, Line3 l, float angle) +// +//------------------------------------------------------------------ + +#include "ImathLine.h" +#include "ImathVecAlgo.h" +#include "ImathFun.h" + +namespace Imath { + + +template +bool +closestPoints + (const Line3& line1, + const Line3& line2, + Vec3& point1, + Vec3& point2) +{ + // + // Compute point1 and point2 such that point1 is on line1, point2 + // is on line2 and the distance between point1 and point2 is minimal. + // This function returns true if point1 and point2 can be computed, + // or false if line1 and line2 are parallel or nearly parallel. + // This function assumes that line1.dir and line2.dir are normalized. + // + + Vec3 w = line1.pos - line2.pos; + T d1w = line1.dir ^ w; + T d2w = line2.dir ^ w; + T d1d2 = line1.dir ^ line2.dir; + T n1 = d1d2 * d2w - d1w; + T n2 = d2w - d1d2 * d1w; + T d = 1 - d1d2 * d1d2; + T absD = abs (d); + + if ((absD > 1) || + (abs (n1) < limits::max() * absD && + abs (n2) < limits::max() * absD)) + { + point1 = line1 (n1 / d); + point2 = line2 (n2 / d); + return true; + } + else + { + return false; + } +} + + +template +bool +intersect + (const Line3 &line, + const Vec3 &v0, + const Vec3 &v1, + const Vec3 &v2, + Vec3 &pt, + Vec3 &barycentric, + bool &front) +{ + // + // Given a line and a triangle (v0, v1, v2), the intersect() function + // finds the intersection of the line and the plane that contains the + // triangle. + // + // If the intersection point cannot be computed, either because the + // line and the triangle's plane are nearly parallel or because the + // triangle's area is very small, intersect() returns false. + // + // If the intersection point is outside the triangle, intersect + // returns false. + // + // If the intersection point, pt, is inside the triangle, intersect() + // computes a front-facing flag and the barycentric coordinates of + // the intersection point, and returns true. + // + // The front-facing flag is true if the dot product of the triangle's + // normal, (v2-v1)%(v1-v0), and the line's direction is negative. + // + // The barycentric coordinates have the following property: + // + // pt = v0 * barycentric.x + v1 * barycentric.y + v2 * barycentric.z + // + + Vec3 edge0 = v1 - v0; + Vec3 edge1 = v2 - v1; + Vec3 normal = edge1 % edge0; + + T l = normal.length(); + + if (l != 0) + normal /= l; + else + return false; // zero-area triangle + + // + // d is the distance of line.pos from the plane that contains the triangle. + // The intersection point is at line.pos + (d/nd) * line.dir. + // + + T d = normal ^ (v0 - line.pos); + T nd = normal ^ line.dir; + + if (abs (nd) > 1 || abs (d) < limits::max() * abs (nd)) + pt = line (d / nd); + else + return false; // line and plane are nearly parallel + + // + // Compute the barycentric coordinates of the intersection point. + // The intersection is inside the triangle if all three barycentric + // coordinates are between zero and one. + // + + { + Vec3 en = edge0.normalized(); + Vec3 a = pt - v0; + Vec3 b = v2 - v0; + Vec3 c = (a - en * (en ^ a)); + Vec3 d = (b - en * (en ^ b)); + T e = c ^ d; + T f = d ^ d; + + if (e >= 0 && e <= f) + barycentric.z = e / f; + else + return false; // outside + } + + { + Vec3 en = edge1.normalized(); + Vec3 a = pt - v1; + Vec3 b = v0 - v1; + Vec3 c = (a - en * (en ^ a)); + Vec3 d = (b - en * (en ^ b)); + T e = c ^ d; + T f = d ^ d; + + if (e >= 0 && e <= f) + barycentric.x = e / f; + else + return false; // outside + } + + barycentric.y = 1 - barycentric.x - barycentric.z; + + if (barycentric.y < 0) + return false; // outside + + front = ((line.dir ^ normal) < 0); + return true; +} + + +template +Vec3 +closestVertex + (const Vec3 &v0, + const Vec3 &v1, + const Vec3 &v2, + const Line3 &l) +{ + Vec3 nearest = v0; + T neardot = (v0 - l.closestPointTo(v0)).length2(); + + T tmp = (v1 - l.closestPointTo(v1)).length2(); + + if (tmp < neardot) + { + neardot = tmp; + nearest = v1; + } + + tmp = (v2 - l.closestPointTo(v2)).length2(); + if (tmp < neardot) + { + neardot = tmp; + nearest = v2; + } + + return nearest; +} + + +template +Vec3 +rotatePoint (const Vec3 p, Line3 l, T angle) +{ + // + // Rotate the point p around the line l by the given angle. + // + + // + // Form a coordinate frame with . The rotation is the in xy + // plane. + // + + Vec3 q = l.closestPointTo(p); + Vec3 x = p - q; + T radius = x.length(); + + x.normalize(); + Vec3 y = (x % l.dir).normalize(); + + T cosangle = Math::cos(angle); + T sinangle = Math::sin(angle); + + Vec3 r = q + x * radius * cosangle + y * radius * sinangle; + + return r; +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathMath.h b/3rdparty/openexr/Imath/ImathMath.h new file mode 100644 index 000000000..d5b4616c2 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathMath.h @@ -0,0 +1,208 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHMATH_H +#define INCLUDED_IMATHMATH_H + +//---------------------------------------------------------------------------- +// +// ImathMath.h +// +// This file contains template functions which call the double- +// precision math functions defined in math.h (sin(), sqrt(), +// exp() etc.), with specializations that call the faster +// single-precision versions (sinf(), sqrtf(), expf() etc.) +// when appropriate. +// +// Example: +// +// double x = Math::sqrt (3); // calls ::sqrt(double); +// float y = Math::sqrt (3); // calls ::sqrtf(float); +// +// When would I want to use this? +// +// You may be writing a template which needs to call some function +// defined in math.h, for example to extract a square root, but you +// don't know whether to call the single- or the double-precision +// version of this function (sqrt() or sqrtf()): +// +// template +// T +// glorp (T x) +// { +// return sqrt (x + 1); // should call ::sqrtf(float) +// } // if x is a float, but we +// // don't know if it is +// +// Using the templates in this file, you can make sure that +// the appropriate version of the math function is called: +// +// template +// T +// glorp (T x, T y) +// { +// return Math::sqrt (x + 1); // calls ::sqrtf(float) if x +// } // is a float, ::sqrt(double) +// // otherwise +// +//---------------------------------------------------------------------------- + +#include "ImathPlatform.h" +#include "ImathLimits.h" +#include + +namespace Imath { + + +template +struct Math +{ + static T acos (T x) {return ::acos (double(x));} + static T asin (T x) {return ::asin (double(x));} + static T atan (T x) {return ::atan (double(x));} + static T atan2 (T x, T y) {return ::atan2 (double(x), double(y));} + static T cos (T x) {return ::cos (double(x));} + static T sin (T x) {return ::sin (double(x));} + static T tan (T x) {return ::tan (double(x));} + static T cosh (T x) {return ::cosh (double(x));} + static T sinh (T x) {return ::sinh (double(x));} + static T tanh (T x) {return ::tanh (double(x));} + static T exp (T x) {return ::exp (double(x));} + static T log (T x) {return ::log (double(x));} + static T log10 (T x) {return ::log10 (double(x));} + static T modf (T x, T *iptr) + { + double ival; + T rval( ::modf (double(x),&ival)); + *iptr = ival; + return rval; + } + static T pow (T x, T y) {return ::pow (double(x), double(y));} + static T sqrt (T x) {return ::sqrt (double(x));} + static T ceil (T x) {return ::ceil (double(x));} + static T fabs (T x) {return ::fabs (double(x));} + static T floor (T x) {return ::floor (double(x));} + static T fmod (T x, T y) {return ::fmod (double(x), double(y));} + static T hypot (T x, T y) {return ::hypot (double(x), double(y));} +}; + + +template <> +struct Math +{ + static float acos (float x) {return ::acosf (x);} + static float asin (float x) {return ::asinf (x);} + static float atan (float x) {return ::atanf (x);} + static float atan2 (float x, float y) {return ::atan2f (x, y);} + static float cos (float x) {return ::cosf (x);} + static float sin (float x) {return ::sinf (x);} + static float tan (float x) {return ::tanf (x);} + static float cosh (float x) {return ::coshf (x);} + static float sinh (float x) {return ::sinhf (x);} + static float tanh (float x) {return ::tanhf (x);} + static float exp (float x) {return ::expf (x);} + static float log (float x) {return ::logf (x);} + static float log10 (float x) {return ::log10f (x);} + static float modf (float x, float *y) {return ::modff (x, y);} + static float pow (float x, float y) {return ::powf (x, y);} + static float sqrt (float x) {return ::sqrtf (x);} + static float ceil (float x) {return ::ceilf (x);} + static float fabs (float x) {return ::fabsf (x);} + static float floor (float x) {return ::floorf (x);} + static float fmod (float x, float y) {return ::fmodf (x, y);} +#if !defined(_MSC_VER) + static float hypot (float x, float y) {return ::hypotf (x, y);} +#else + static float hypot (float x, float y) {return ::sqrtf(x*x + y*y);} +#endif +}; + + +//-------------------------------------------------------------------------- +// Don Hatch's version of sin(x)/x, which is accurate for very small x. +// Returns 1 for x == 0. +//-------------------------------------------------------------------------- + +template +inline T +sinx_over_x (T x) +{ + if (x * x < limits::epsilon()) + return T (1); + else + return Math::sin (x) / x; +} + + +//-------------------------------------------------------------------------- +// Compare two numbers and test if they are "approximately equal": +// +// equalWithAbsError (x1, x2, e) +// +// Returns true if x1 is the same as x2 with an absolute error of +// no more than e, +// +// abs (x1 - x2) <= e +// +// equalWithRelError (x1, x2, e) +// +// Returns true if x1 is the same as x2 with an relative error of +// no more than e, +// +// abs (x1 - x2) <= e * x1 +// +//-------------------------------------------------------------------------- + +template +inline bool +equalWithAbsError (T x1, T x2, T e) +{ + return ((x1 > x2)? x1 - x2: x2 - x1) <= e; +} + + +template +inline bool +equalWithRelError (T x1, T x2, T e) +{ + return ((x1 > x2)? x1 - x2: x2 - x1) <= e * ((x1 > 0)? x1: -x1); +} + + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathMatrix.h b/3rdparty/openexr/Imath/ImathMatrix.h new file mode 100644 index 000000000..bbf8cd10e --- /dev/null +++ b/3rdparty/openexr/Imath/ImathMatrix.h @@ -0,0 +1,3442 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHMATRIX_H +#define INCLUDED_IMATHMATRIX_H + +//---------------------------------------------------------------- +// +// 2D (3x3) and 3D (4x4) transformation matrix templates. +// +//---------------------------------------------------------------- + +#include "ImathPlatform.h" +#include "ImathFun.h" +#include "ImathExc.h" +#include "ImathVec.h" +#include "ImathShear.h" + +#include +#include +#include +#include + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +// suppress exception specification warnings +#pragma warning(disable:4290) +#endif + + +namespace Imath { + +enum Uninitialized {UNINITIALIZED}; + + +template class Matrix33 +{ + public: + + //------------------- + // Access to elements + //------------------- + + T x[3][3]; + + T * operator [] (int i); + const T * operator [] (int i) const; + + + //------------- + // Constructors + //------------- + + Matrix33 (Uninitialized) {} + + Matrix33 (); + // 1 0 0 + // 0 1 0 + // 0 0 1 + + Matrix33 (T a); + // a a a + // a a a + // a a a + + Matrix33 (const T a[3][3]); + // a[0][0] a[0][1] a[0][2] + // a[1][0] a[1][1] a[1][2] + // a[2][0] a[2][1] a[2][2] + + Matrix33 (T a, T b, T c, T d, T e, T f, T g, T h, T i); + + // a b c + // d e f + // g h i + + + //-------------------------------- + // Copy constructor and assignment + //-------------------------------- + + Matrix33 (const Matrix33 &v); + template explicit Matrix33 (const Matrix33 &v); + + const Matrix33 & operator = (const Matrix33 &v); + const Matrix33 & operator = (T a); + + + //---------------------- + // Compatibility with Sb + //---------------------- + + T * getValue (); + const T * getValue () const; + + template + void getValue (Matrix33 &v) const; + template + Matrix33 & setValue (const Matrix33 &v); + + template + Matrix33 & setTheMatrix (const Matrix33 &v); + + + //--------- + // Identity + //--------- + + void makeIdentity(); + + + //--------- + // Equality + //--------- + + bool operator == (const Matrix33 &v) const; + bool operator != (const Matrix33 &v) const; + + //----------------------------------------------------------------------- + // Compare two matrices and test if they are "approximately equal": + // + // equalWithAbsError (m, e) + // + // Returns true if the coefficients of this and m are the same with + // an absolute error of no more than e, i.e., for all i, j + // + // abs (this[i][j] - m[i][j]) <= e + // + // equalWithRelError (m, e) + // + // Returns true if the coefficients of this and m are the same with + // a relative error of no more than e, i.e., for all i, j + // + // abs (this[i] - v[i][j]) <= e * abs (this[i][j]) + //----------------------------------------------------------------------- + + bool equalWithAbsError (const Matrix33 &v, T e) const; + bool equalWithRelError (const Matrix33 &v, T e) const; + + + //------------------------ + // Component-wise addition + //------------------------ + + const Matrix33 & operator += (const Matrix33 &v); + const Matrix33 & operator += (T a); + Matrix33 operator + (const Matrix33 &v) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Matrix33 & operator -= (const Matrix33 &v); + const Matrix33 & operator -= (T a); + Matrix33 operator - (const Matrix33 &v) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Matrix33 operator - () const; + const Matrix33 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Matrix33 & operator *= (T a); + Matrix33 operator * (T a) const; + + + //----------------------------------- + // Matrix-times-matrix multiplication + //----------------------------------- + + const Matrix33 & operator *= (const Matrix33 &v); + Matrix33 operator * (const Matrix33 &v) const; + + + //----------------------------------------------------------------- + // Vector-times-matrix multiplication; see also the "operator *" + // functions defined below. + // + // m.multVecMatrix(src,dst) implements a homogeneous transformation + // by computing Vec3 (src.x, src.y, 1) * m and dividing by the + // result's third element. + // + // m.multDirMatrix(src,dst) multiplies src by the upper left 2x2 + // submatrix, ignoring the rest of matrix m. + //----------------------------------------------------------------- + + template + void multVecMatrix(const Vec2 &src, Vec2 &dst) const; + + template + void multDirMatrix(const Vec2 &src, Vec2 &dst) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Matrix33 & operator /= (T a); + Matrix33 operator / (T a) const; + + + //------------------ + // Transposed matrix + //------------------ + + const Matrix33 & transpose (); + Matrix33 transposed () const; + + + //------------------------------------------------------------ + // Inverse matrix: If singExc is false, inverting a singular + // matrix produces an identity matrix. If singExc is true, + // inverting a singular matrix throws a SingMatrixExc. + // + // inverse() and invert() invert matrices using determinants; + // gjInverse() and gjInvert() use the Gauss-Jordan method. + // + // inverse() and invert() are significantly faster than + // gjInverse() and gjInvert(), but the results may be slightly + // less accurate. + // + //------------------------------------------------------------ + + const Matrix33 & invert (bool singExc = false) + throw (Iex::MathExc); + + Matrix33 inverse (bool singExc = false) const + throw (Iex::MathExc); + + const Matrix33 & gjInvert (bool singExc = false) + throw (Iex::MathExc); + + Matrix33 gjInverse (bool singExc = false) const + throw (Iex::MathExc); + + + //------------------------------------------------ + // Calculate the matrix minor of the (r,c) element + //------------------------------------------------ + + T minorOf (const int r, const int c) const; + + //--------------------------------------------------- + // Build a minor using the specified rows and columns + //--------------------------------------------------- + + T fastMinor (const int r0, const int r1, + const int c0, const int c1) const; + + //------------ + // Determinant + //------------ + + T determinant() const; + + //----------------------------------------- + // Set matrix to rotation by r (in radians) + //----------------------------------------- + + template + const Matrix33 & setRotation (S r); + + + //----------------------------- + // Rotate the given matrix by r + //----------------------------- + + template + const Matrix33 & rotate (S r); + + + //-------------------------------------------- + // Set matrix to scale by given uniform factor + //-------------------------------------------- + + const Matrix33 & setScale (T s); + + + //------------------------------------ + // Set matrix to scale by given vector + //------------------------------------ + + template + const Matrix33 & setScale (const Vec2 &s); + + + //---------------------- + // Scale the matrix by s + //---------------------- + + template + const Matrix33 & scale (const Vec2 &s); + + + //------------------------------------------ + // Set matrix to translation by given vector + //------------------------------------------ + + template + const Matrix33 & setTranslation (const Vec2 &t); + + + //----------------------------- + // Return translation component + //----------------------------- + + Vec2 translation () const; + + + //-------------------------- + // Translate the matrix by t + //-------------------------- + + template + const Matrix33 & translate (const Vec2 &t); + + + //----------------------------------------------------------- + // Set matrix to shear x for each y coord. by given factor xy + //----------------------------------------------------------- + + template + const Matrix33 & setShear (const S &h); + + + //------------------------------------------------------------- + // Set matrix to shear x for each y coord. by given factor h[0] + // and to shear y for each x coord. by given factor h[1] + //------------------------------------------------------------- + + template + const Matrix33 & setShear (const Vec2 &h); + + + //----------------------------------------------------------- + // Shear the matrix in x for each y coord. by given factor xy + //----------------------------------------------------------- + + template + const Matrix33 & shear (const S &xy); + + + //----------------------------------------------------------- + // Shear the matrix in x for each y coord. by given factor xy + // and shear y for each x coord. by given factor yx + //----------------------------------------------------------- + + template + const Matrix33 & shear (const Vec2 &h); + + + //-------------------------------------------------------- + // Number of the row and column dimensions, since + // Matrix33 is a square matrix. + //-------------------------------------------------------- + + static unsigned int dimensions() {return 3;} + + + //------------------------------------------------- + // Limitations of type T (see also class limits) + //------------------------------------------------- + + static T baseTypeMin() {return limits::min();} + static T baseTypeMax() {return limits::max();} + static T baseTypeSmallest() {return limits::smallest();} + static T baseTypeEpsilon() {return limits::epsilon();} + + typedef T BaseType; + typedef Vec3 BaseVecType; + + private: + + template + struct isSameType + { + enum {value = 0}; + }; + + template + struct isSameType + { + enum {value = 1}; + }; +}; + + +template class Matrix44 +{ + public: + + //------------------- + // Access to elements + //------------------- + + T x[4][4]; + + T * operator [] (int i); + const T * operator [] (int i) const; + + + //------------- + // Constructors + //------------- + + Matrix44 (Uninitialized) {} + + Matrix44 (); + // 1 0 0 0 + // 0 1 0 0 + // 0 0 1 0 + // 0 0 0 1 + + Matrix44 (T a); + // a a a a + // a a a a + // a a a a + // a a a a + + Matrix44 (const T a[4][4]) ; + // a[0][0] a[0][1] a[0][2] a[0][3] + // a[1][0] a[1][1] a[1][2] a[1][3] + // a[2][0] a[2][1] a[2][2] a[2][3] + // a[3][0] a[3][1] a[3][2] a[3][3] + + Matrix44 (T a, T b, T c, T d, T e, T f, T g, T h, + T i, T j, T k, T l, T m, T n, T o, T p); + + // a b c d + // e f g h + // i j k l + // m n o p + + Matrix44 (Matrix33 r, Vec3 t); + // r r r 0 + // r r r 0 + // r r r 0 + // t t t 1 + + + //-------------------------------- + // Copy constructor and assignment + //-------------------------------- + + Matrix44 (const Matrix44 &v); + template explicit Matrix44 (const Matrix44 &v); + + const Matrix44 & operator = (const Matrix44 &v); + const Matrix44 & operator = (T a); + + + //---------------------- + // Compatibility with Sb + //---------------------- + + T * getValue (); + const T * getValue () const; + + template + void getValue (Matrix44 &v) const; + template + Matrix44 & setValue (const Matrix44 &v); + + template + Matrix44 & setTheMatrix (const Matrix44 &v); + + //--------- + // Identity + //--------- + + void makeIdentity(); + + + //--------- + // Equality + //--------- + + bool operator == (const Matrix44 &v) const; + bool operator != (const Matrix44 &v) const; + + //----------------------------------------------------------------------- + // Compare two matrices and test if they are "approximately equal": + // + // equalWithAbsError (m, e) + // + // Returns true if the coefficients of this and m are the same with + // an absolute error of no more than e, i.e., for all i, j + // + // abs (this[i][j] - m[i][j]) <= e + // + // equalWithRelError (m, e) + // + // Returns true if the coefficients of this and m are the same with + // a relative error of no more than e, i.e., for all i, j + // + // abs (this[i] - v[i][j]) <= e * abs (this[i][j]) + //----------------------------------------------------------------------- + + bool equalWithAbsError (const Matrix44 &v, T e) const; + bool equalWithRelError (const Matrix44 &v, T e) const; + + + //------------------------ + // Component-wise addition + //------------------------ + + const Matrix44 & operator += (const Matrix44 &v); + const Matrix44 & operator += (T a); + Matrix44 operator + (const Matrix44 &v) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Matrix44 & operator -= (const Matrix44 &v); + const Matrix44 & operator -= (T a); + Matrix44 operator - (const Matrix44 &v) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Matrix44 operator - () const; + const Matrix44 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Matrix44 & operator *= (T a); + Matrix44 operator * (T a) const; + + + //----------------------------------- + // Matrix-times-matrix multiplication + //----------------------------------- + + const Matrix44 & operator *= (const Matrix44 &v); + Matrix44 operator * (const Matrix44 &v) const; + + static void multiply (const Matrix44 &a, // assumes that + const Matrix44 &b, // &a != &c and + Matrix44 &c); // &b != &c. + + + //----------------------------------------------------------------- + // Vector-times-matrix multiplication; see also the "operator *" + // functions defined below. + // + // m.multVecMatrix(src,dst) implements a homogeneous transformation + // by computing Vec4 (src.x, src.y, src.z, 1) * m and dividing by + // the result's third element. + // + // m.multDirMatrix(src,dst) multiplies src by the upper left 3x3 + // submatrix, ignoring the rest of matrix m. + //----------------------------------------------------------------- + + template + void multVecMatrix(const Vec3 &src, Vec3 &dst) const; + + template + void multDirMatrix(const Vec3 &src, Vec3 &dst) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Matrix44 & operator /= (T a); + Matrix44 operator / (T a) const; + + + //------------------ + // Transposed matrix + //------------------ + + const Matrix44 & transpose (); + Matrix44 transposed () const; + + + //------------------------------------------------------------ + // Inverse matrix: If singExc is false, inverting a singular + // matrix produces an identity matrix. If singExc is true, + // inverting a singular matrix throws a SingMatrixExc. + // + // inverse() and invert() invert matrices using determinants; + // gjInverse() and gjInvert() use the Gauss-Jordan method. + // + // inverse() and invert() are significantly faster than + // gjInverse() and gjInvert(), but the results may be slightly + // less accurate. + // + //------------------------------------------------------------ + + const Matrix44 & invert (bool singExc = false) + throw (Iex::MathExc); + + Matrix44 inverse (bool singExc = false) const + throw (Iex::MathExc); + + const Matrix44 & gjInvert (bool singExc = false) + throw (Iex::MathExc); + + Matrix44 gjInverse (bool singExc = false) const + throw (Iex::MathExc); + + + //------------------------------------------------ + // Calculate the matrix minor of the (r,c) element + //------------------------------------------------ + + T minorOf (const int r, const int c) const; + + //--------------------------------------------------- + // Build a minor using the specified rows and columns + //--------------------------------------------------- + + T fastMinor (const int r0, const int r1, const int r2, + const int c0, const int c1, const int c2) const; + + //------------ + // Determinant + //------------ + + T determinant() const; + + //-------------------------------------------------------- + // Set matrix to rotation by XYZ euler angles (in radians) + //-------------------------------------------------------- + + template + const Matrix44 & setEulerAngles (const Vec3& r); + + + //-------------------------------------------------------- + // Set matrix to rotation around given axis by given angle + //-------------------------------------------------------- + + template + const Matrix44 & setAxisAngle (const Vec3& ax, S ang); + + + //------------------------------------------- + // Rotate the matrix by XYZ euler angles in r + //------------------------------------------- + + template + const Matrix44 & rotate (const Vec3 &r); + + + //-------------------------------------------- + // Set matrix to scale by given uniform factor + //-------------------------------------------- + + const Matrix44 & setScale (T s); + + + //------------------------------------ + // Set matrix to scale by given vector + //------------------------------------ + + template + const Matrix44 & setScale (const Vec3 &s); + + + //---------------------- + // Scale the matrix by s + //---------------------- + + template + const Matrix44 & scale (const Vec3 &s); + + + //------------------------------------------ + // Set matrix to translation by given vector + //------------------------------------------ + + template + const Matrix44 & setTranslation (const Vec3 &t); + + + //----------------------------- + // Return translation component + //----------------------------- + + const Vec3 translation () const; + + + //-------------------------- + // Translate the matrix by t + //-------------------------- + + template + const Matrix44 & translate (const Vec3 &t); + + + //------------------------------------------------------------- + // Set matrix to shear by given vector h. The resulting matrix + // will shear x for each y coord. by a factor of h[0] ; + // will shear x for each z coord. by a factor of h[1] ; + // will shear y for each z coord. by a factor of h[2] . + //------------------------------------------------------------- + + template + const Matrix44 & setShear (const Vec3 &h); + + + //------------------------------------------------------------ + // Set matrix to shear by given factors. The resulting matrix + // will shear x for each y coord. by a factor of h.xy ; + // will shear x for each z coord. by a factor of h.xz ; + // will shear y for each z coord. by a factor of h.yz ; + // will shear y for each x coord. by a factor of h.yx ; + // will shear z for each x coord. by a factor of h.zx ; + // will shear z for each y coord. by a factor of h.zy . + //------------------------------------------------------------ + + template + const Matrix44 & setShear (const Shear6 &h); + + + //-------------------------------------------------------- + // Shear the matrix by given vector. The composed matrix + // will be * , where the shear matrix ... + // will shear x for each y coord. by a factor of h[0] ; + // will shear x for each z coord. by a factor of h[1] ; + // will shear y for each z coord. by a factor of h[2] . + //-------------------------------------------------------- + + template + const Matrix44 & shear (const Vec3 &h); + + //-------------------------------------------------------- + // Number of the row and column dimensions, since + // Matrix44 is a square matrix. + //-------------------------------------------------------- + + static unsigned int dimensions() {return 4;} + + + //------------------------------------------------------------ + // Shear the matrix by the given factors. The composed matrix + // will be * , where the shear matrix ... + // will shear x for each y coord. by a factor of h.xy ; + // will shear x for each z coord. by a factor of h.xz ; + // will shear y for each z coord. by a factor of h.yz ; + // will shear y for each x coord. by a factor of h.yx ; + // will shear z for each x coord. by a factor of h.zx ; + // will shear z for each y coord. by a factor of h.zy . + //------------------------------------------------------------ + + template + const Matrix44 & shear (const Shear6 &h); + + + //------------------------------------------------- + // Limitations of type T (see also class limits) + //------------------------------------------------- + + static T baseTypeMin() {return limits::min();} + static T baseTypeMax() {return limits::max();} + static T baseTypeSmallest() {return limits::smallest();} + static T baseTypeEpsilon() {return limits::epsilon();} + + typedef T BaseType; + typedef Vec4 BaseVecType; + + private: + + template + struct isSameType + { + enum {value = 0}; + }; + + template + struct isSameType + { + enum {value = 1}; + }; +}; + + +//-------------- +// Stream output +//-------------- + +template +std::ostream & operator << (std::ostream & s, const Matrix33 &m); + +template +std::ostream & operator << (std::ostream & s, const Matrix44 &m); + + +//--------------------------------------------- +// Vector-times-matrix multiplication operators +//--------------------------------------------- + +template +const Vec2 & operator *= (Vec2 &v, const Matrix33 &m); + +template +Vec2 operator * (const Vec2 &v, const Matrix33 &m); + +template +const Vec3 & operator *= (Vec3 &v, const Matrix33 &m); + +template +Vec3 operator * (const Vec3 &v, const Matrix33 &m); + +template +const Vec3 & operator *= (Vec3 &v, const Matrix44 &m); + +template +Vec3 operator * (const Vec3 &v, const Matrix44 &m); + +template +const Vec4 & operator *= (Vec4 &v, const Matrix44 &m); + +template +Vec4 operator * (const Vec4 &v, const Matrix44 &m); + +//------------------------- +// Typedefs for convenience +//------------------------- + +typedef Matrix33 M33f; +typedef Matrix33 M33d; +typedef Matrix44 M44f; +typedef Matrix44 M44d; + + +//--------------------------- +// Implementation of Matrix33 +//--------------------------- + +template +inline T * +Matrix33::operator [] (int i) +{ + return x[i]; +} + +template +inline const T * +Matrix33::operator [] (int i) const +{ + return x[i]; +} + +template +inline +Matrix33::Matrix33 () +{ + memset (x, 0, sizeof (x)); + x[0][0] = 1; + x[1][1] = 1; + x[2][2] = 1; +} + +template +inline +Matrix33::Matrix33 (T a) +{ + x[0][0] = a; + x[0][1] = a; + x[0][2] = a; + x[1][0] = a; + x[1][1] = a; + x[1][2] = a; + x[2][0] = a; + x[2][1] = a; + x[2][2] = a; +} + +template +inline +Matrix33::Matrix33 (const T a[3][3]) +{ + memcpy (x, a, sizeof (x)); +} + +template +inline +Matrix33::Matrix33 (T a, T b, T c, T d, T e, T f, T g, T h, T i) +{ + x[0][0] = a; + x[0][1] = b; + x[0][2] = c; + x[1][0] = d; + x[1][1] = e; + x[1][2] = f; + x[2][0] = g; + x[2][1] = h; + x[2][2] = i; +} + +template +inline +Matrix33::Matrix33 (const Matrix33 &v) +{ + memcpy (x, v.x, sizeof (x)); +} + +template +template +inline +Matrix33::Matrix33 (const Matrix33 &v) +{ + x[0][0] = T (v.x[0][0]); + x[0][1] = T (v.x[0][1]); + x[0][2] = T (v.x[0][2]); + x[1][0] = T (v.x[1][0]); + x[1][1] = T (v.x[1][1]); + x[1][2] = T (v.x[1][2]); + x[2][0] = T (v.x[2][0]); + x[2][1] = T (v.x[2][1]); + x[2][2] = T (v.x[2][2]); +} + +template +inline const Matrix33 & +Matrix33::operator = (const Matrix33 &v) +{ + memcpy (x, v.x, sizeof (x)); + return *this; +} + +template +inline const Matrix33 & +Matrix33::operator = (T a) +{ + x[0][0] = a; + x[0][1] = a; + x[0][2] = a; + x[1][0] = a; + x[1][1] = a; + x[1][2] = a; + x[2][0] = a; + x[2][1] = a; + x[2][2] = a; + return *this; +} + +template +inline T * +Matrix33::getValue () +{ + return (T *) &x[0][0]; +} + +template +inline const T * +Matrix33::getValue () const +{ + return (const T *) &x[0][0]; +} + +template +template +inline void +Matrix33::getValue (Matrix33 &v) const +{ + if (isSameType::value) + { + memcpy (v.x, x, sizeof (x)); + } + else + { + v.x[0][0] = x[0][0]; + v.x[0][1] = x[0][1]; + v.x[0][2] = x[0][2]; + v.x[1][0] = x[1][0]; + v.x[1][1] = x[1][1]; + v.x[1][2] = x[1][2]; + v.x[2][0] = x[2][0]; + v.x[2][1] = x[2][1]; + v.x[2][2] = x[2][2]; + } +} + +template +template +inline Matrix33 & +Matrix33::setValue (const Matrix33 &v) +{ + if (isSameType::value) + { + memcpy (x, v.x, sizeof (x)); + } + else + { + x[0][0] = v.x[0][0]; + x[0][1] = v.x[0][1]; + x[0][2] = v.x[0][2]; + x[1][0] = v.x[1][0]; + x[1][1] = v.x[1][1]; + x[1][2] = v.x[1][2]; + x[2][0] = v.x[2][0]; + x[2][1] = v.x[2][1]; + x[2][2] = v.x[2][2]; + } + + return *this; +} + +template +template +inline Matrix33 & +Matrix33::setTheMatrix (const Matrix33 &v) +{ + if (isSameType::value) + { + memcpy (x, v.x, sizeof (x)); + } + else + { + x[0][0] = v.x[0][0]; + x[0][1] = v.x[0][1]; + x[0][2] = v.x[0][2]; + x[1][0] = v.x[1][0]; + x[1][1] = v.x[1][1]; + x[1][2] = v.x[1][2]; + x[2][0] = v.x[2][0]; + x[2][1] = v.x[2][1]; + x[2][2] = v.x[2][2]; + } + + return *this; +} + +template +inline void +Matrix33::makeIdentity() +{ + memset (x, 0, sizeof (x)); + x[0][0] = 1; + x[1][1] = 1; + x[2][2] = 1; +} + +template +bool +Matrix33::operator == (const Matrix33 &v) const +{ + return x[0][0] == v.x[0][0] && + x[0][1] == v.x[0][1] && + x[0][2] == v.x[0][2] && + x[1][0] == v.x[1][0] && + x[1][1] == v.x[1][1] && + x[1][2] == v.x[1][2] && + x[2][0] == v.x[2][0] && + x[2][1] == v.x[2][1] && + x[2][2] == v.x[2][2]; +} + +template +bool +Matrix33::operator != (const Matrix33 &v) const +{ + return x[0][0] != v.x[0][0] || + x[0][1] != v.x[0][1] || + x[0][2] != v.x[0][2] || + x[1][0] != v.x[1][0] || + x[1][1] != v.x[1][1] || + x[1][2] != v.x[1][2] || + x[2][0] != v.x[2][0] || + x[2][1] != v.x[2][1] || + x[2][2] != v.x[2][2]; +} + +template +bool +Matrix33::equalWithAbsError (const Matrix33 &m, T e) const +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + if (!Imath::equalWithAbsError ((*this)[i][j], m[i][j], e)) + return false; + + return true; +} + +template +bool +Matrix33::equalWithRelError (const Matrix33 &m, T e) const +{ + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + if (!Imath::equalWithRelError ((*this)[i][j], m[i][j], e)) + return false; + + return true; +} + +template +const Matrix33 & +Matrix33::operator += (const Matrix33 &v) +{ + x[0][0] += v.x[0][0]; + x[0][1] += v.x[0][1]; + x[0][2] += v.x[0][2]; + x[1][0] += v.x[1][0]; + x[1][1] += v.x[1][1]; + x[1][2] += v.x[1][2]; + x[2][0] += v.x[2][0]; + x[2][1] += v.x[2][1]; + x[2][2] += v.x[2][2]; + + return *this; +} + +template +const Matrix33 & +Matrix33::operator += (T a) +{ + x[0][0] += a; + x[0][1] += a; + x[0][2] += a; + x[1][0] += a; + x[1][1] += a; + x[1][2] += a; + x[2][0] += a; + x[2][1] += a; + x[2][2] += a; + + return *this; +} + +template +Matrix33 +Matrix33::operator + (const Matrix33 &v) const +{ + return Matrix33 (x[0][0] + v.x[0][0], + x[0][1] + v.x[0][1], + x[0][2] + v.x[0][2], + x[1][0] + v.x[1][0], + x[1][1] + v.x[1][1], + x[1][2] + v.x[1][2], + x[2][0] + v.x[2][0], + x[2][1] + v.x[2][1], + x[2][2] + v.x[2][2]); +} + +template +const Matrix33 & +Matrix33::operator -= (const Matrix33 &v) +{ + x[0][0] -= v.x[0][0]; + x[0][1] -= v.x[0][1]; + x[0][2] -= v.x[0][2]; + x[1][0] -= v.x[1][0]; + x[1][1] -= v.x[1][1]; + x[1][2] -= v.x[1][2]; + x[2][0] -= v.x[2][0]; + x[2][1] -= v.x[2][1]; + x[2][2] -= v.x[2][2]; + + return *this; +} + +template +const Matrix33 & +Matrix33::operator -= (T a) +{ + x[0][0] -= a; + x[0][1] -= a; + x[0][2] -= a; + x[1][0] -= a; + x[1][1] -= a; + x[1][2] -= a; + x[2][0] -= a; + x[2][1] -= a; + x[2][2] -= a; + + return *this; +} + +template +Matrix33 +Matrix33::operator - (const Matrix33 &v) const +{ + return Matrix33 (x[0][0] - v.x[0][0], + x[0][1] - v.x[0][1], + x[0][2] - v.x[0][2], + x[1][0] - v.x[1][0], + x[1][1] - v.x[1][1], + x[1][2] - v.x[1][2], + x[2][0] - v.x[2][0], + x[2][1] - v.x[2][1], + x[2][2] - v.x[2][2]); +} + +template +Matrix33 +Matrix33::operator - () const +{ + return Matrix33 (-x[0][0], + -x[0][1], + -x[0][2], + -x[1][0], + -x[1][1], + -x[1][2], + -x[2][0], + -x[2][1], + -x[2][2]); +} + +template +const Matrix33 & +Matrix33::negate () +{ + x[0][0] = -x[0][0]; + x[0][1] = -x[0][1]; + x[0][2] = -x[0][2]; + x[1][0] = -x[1][0]; + x[1][1] = -x[1][1]; + x[1][2] = -x[1][2]; + x[2][0] = -x[2][0]; + x[2][1] = -x[2][1]; + x[2][2] = -x[2][2]; + + return *this; +} + +template +const Matrix33 & +Matrix33::operator *= (T a) +{ + x[0][0] *= a; + x[0][1] *= a; + x[0][2] *= a; + x[1][0] *= a; + x[1][1] *= a; + x[1][2] *= a; + x[2][0] *= a; + x[2][1] *= a; + x[2][2] *= a; + + return *this; +} + +template +Matrix33 +Matrix33::operator * (T a) const +{ + return Matrix33 (x[0][0] * a, + x[0][1] * a, + x[0][2] * a, + x[1][0] * a, + x[1][1] * a, + x[1][2] * a, + x[2][0] * a, + x[2][1] * a, + x[2][2] * a); +} + +template +inline Matrix33 +operator * (T a, const Matrix33 &v) +{ + return v * a; +} + +template +const Matrix33 & +Matrix33::operator *= (const Matrix33 &v) +{ + Matrix33 tmp (T (0)); + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + tmp.x[i][j] += x[i][k] * v.x[k][j]; + + *this = tmp; + return *this; +} + +template +Matrix33 +Matrix33::operator * (const Matrix33 &v) const +{ + Matrix33 tmp (T (0)); + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + tmp.x[i][j] += x[i][k] * v.x[k][j]; + + return tmp; +} + +template +template +void +Matrix33::multVecMatrix(const Vec2 &src, Vec2 &dst) const +{ + S a, b, w; + + a = src[0] * x[0][0] + src[1] * x[1][0] + x[2][0]; + b = src[0] * x[0][1] + src[1] * x[1][1] + x[2][1]; + w = src[0] * x[0][2] + src[1] * x[1][2] + x[2][2]; + + dst.x = a / w; + dst.y = b / w; +} + +template +template +void +Matrix33::multDirMatrix(const Vec2 &src, Vec2 &dst) const +{ + S a, b; + + a = src[0] * x[0][0] + src[1] * x[1][0]; + b = src[0] * x[0][1] + src[1] * x[1][1]; + + dst.x = a; + dst.y = b; +} + +template +const Matrix33 & +Matrix33::operator /= (T a) +{ + x[0][0] /= a; + x[0][1] /= a; + x[0][2] /= a; + x[1][0] /= a; + x[1][1] /= a; + x[1][2] /= a; + x[2][0] /= a; + x[2][1] /= a; + x[2][2] /= a; + + return *this; +} + +template +Matrix33 +Matrix33::operator / (T a) const +{ + return Matrix33 (x[0][0] / a, + x[0][1] / a, + x[0][2] / a, + x[1][0] / a, + x[1][1] / a, + x[1][2] / a, + x[2][0] / a, + x[2][1] / a, + x[2][2] / a); +} + +template +const Matrix33 & +Matrix33::transpose () +{ + Matrix33 tmp (x[0][0], + x[1][0], + x[2][0], + x[0][1], + x[1][1], + x[2][1], + x[0][2], + x[1][2], + x[2][2]); + *this = tmp; + return *this; +} + +template +Matrix33 +Matrix33::transposed () const +{ + return Matrix33 (x[0][0], + x[1][0], + x[2][0], + x[0][1], + x[1][1], + x[2][1], + x[0][2], + x[1][2], + x[2][2]); +} + +template +const Matrix33 & +Matrix33::gjInvert (bool singExc) throw (Iex::MathExc) +{ + *this = gjInverse (singExc); + return *this; +} + +template +Matrix33 +Matrix33::gjInverse (bool singExc) const throw (Iex::MathExc) +{ + int i, j, k; + Matrix33 s; + Matrix33 t (*this); + + // Forward elimination + + for (i = 0; i < 2 ; i++) + { + int pivot = i; + + T pivotsize = t[i][i]; + + if (pivotsize < 0) + pivotsize = -pivotsize; + + for (j = i + 1; j < 3; j++) + { + T tmp = t[j][i]; + + if (tmp < 0) + tmp = -tmp; + + if (tmp > pivotsize) + { + pivot = j; + pivotsize = tmp; + } + } + + if (pivotsize == 0) + { + if (singExc) + throw ::Imath::SingMatrixExc ("Cannot invert singular matrix."); + + return Matrix33(); + } + + if (pivot != i) + { + for (j = 0; j < 3; j++) + { + T tmp; + + tmp = t[i][j]; + t[i][j] = t[pivot][j]; + t[pivot][j] = tmp; + + tmp = s[i][j]; + s[i][j] = s[pivot][j]; + s[pivot][j] = tmp; + } + } + + for (j = i + 1; j < 3; j++) + { + T f = t[j][i] / t[i][i]; + + for (k = 0; k < 3; k++) + { + t[j][k] -= f * t[i][k]; + s[j][k] -= f * s[i][k]; + } + } + } + + // Backward substitution + + for (i = 2; i >= 0; --i) + { + T f; + + if ((f = t[i][i]) == 0) + { + if (singExc) + throw ::Imath::SingMatrixExc ("Cannot invert singular matrix."); + + return Matrix33(); + } + + for (j = 0; j < 3; j++) + { + t[i][j] /= f; + s[i][j] /= f; + } + + for (j = 0; j < i; j++) + { + f = t[j][i]; + + for (k = 0; k < 3; k++) + { + t[j][k] -= f * t[i][k]; + s[j][k] -= f * s[i][k]; + } + } + } + + return s; +} + +template +const Matrix33 & +Matrix33::invert (bool singExc) throw (Iex::MathExc) +{ + *this = inverse (singExc); + return *this; +} + +template +Matrix33 +Matrix33::inverse (bool singExc) const throw (Iex::MathExc) +{ + if (x[0][2] != 0 || x[1][2] != 0 || x[2][2] != 1) + { + Matrix33 s (x[1][1] * x[2][2] - x[2][1] * x[1][2], + x[2][1] * x[0][2] - x[0][1] * x[2][2], + x[0][1] * x[1][2] - x[1][1] * x[0][2], + + x[2][0] * x[1][2] - x[1][0] * x[2][2], + x[0][0] * x[2][2] - x[2][0] * x[0][2], + x[1][0] * x[0][2] - x[0][0] * x[1][2], + + x[1][0] * x[2][1] - x[2][0] * x[1][1], + x[2][0] * x[0][1] - x[0][0] * x[2][1], + x[0][0] * x[1][1] - x[1][0] * x[0][1]); + + T r = x[0][0] * s[0][0] + x[0][1] * s[1][0] + x[0][2] * s[2][0]; + + if (Imath::abs (r) >= 1) + { + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + s[i][j] /= r; + } + } + } + else + { + T mr = Imath::abs (r) / limits::smallest(); + + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + if (mr > Imath::abs (s[i][j])) + { + s[i][j] /= r; + } + else + { + if (singExc) + throw SingMatrixExc ("Cannot invert " + "singular matrix."); + return Matrix33(); + } + } + } + } + + return s; + } + else + { + Matrix33 s ( x[1][1], + -x[0][1], + 0, + + -x[1][0], + x[0][0], + 0, + + 0, + 0, + 1); + + T r = x[0][0] * x[1][1] - x[1][0] * x[0][1]; + + if (Imath::abs (r) >= 1) + { + for (int i = 0; i < 2; ++i) + { + for (int j = 0; j < 2; ++j) + { + s[i][j] /= r; + } + } + } + else + { + T mr = Imath::abs (r) / limits::smallest(); + + for (int i = 0; i < 2; ++i) + { + for (int j = 0; j < 2; ++j) + { + if (mr > Imath::abs (s[i][j])) + { + s[i][j] /= r; + } + else + { + if (singExc) + throw SingMatrixExc ("Cannot invert " + "singular matrix."); + return Matrix33(); + } + } + } + } + + s[2][0] = -x[2][0] * s[0][0] - x[2][1] * s[1][0]; + s[2][1] = -x[2][0] * s[0][1] - x[2][1] * s[1][1]; + + return s; + } +} + +template +inline T +Matrix33::minorOf (const int r, const int c) const +{ + int r0 = 0 + (r < 1 ? 1 : 0); + int r1 = 1 + (r < 2 ? 1 : 0); + int c0 = 0 + (c < 1 ? 1 : 0); + int c1 = 1 + (c < 2 ? 1 : 0); + + return x[r0][c0]*x[r1][c1] - x[r1][c0]*x[r0][c1]; +} + +template +inline T +Matrix33::fastMinor( const int r0, const int r1, + const int c0, const int c1) const +{ + return x[r0][c0]*x[r1][c1] - x[r0][c1]*x[r1][c0]; +} + +template +inline T +Matrix33::determinant () const +{ + return x[0][0]*(x[1][1]*x[2][2] - x[1][2]*x[2][1]) + + x[0][1]*(x[1][2]*x[2][0] - x[1][0]*x[2][2]) + + x[0][2]*(x[1][0]*x[2][1] - x[1][1]*x[2][0]); +} + +template +template +const Matrix33 & +Matrix33::setRotation (S r) +{ + S cos_r, sin_r; + + cos_r = Math::cos (r); + sin_r = Math::sin (r); + + x[0][0] = cos_r; + x[0][1] = sin_r; + x[0][2] = 0; + + x[1][0] = -sin_r; + x[1][1] = cos_r; + x[1][2] = 0; + + x[2][0] = 0; + x[2][1] = 0; + x[2][2] = 1; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::rotate (S r) +{ + *this *= Matrix33().setRotation (r); + return *this; +} + +template +const Matrix33 & +Matrix33::setScale (T s) +{ + memset (x, 0, sizeof (x)); + x[0][0] = s; + x[1][1] = s; + x[2][2] = 1; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::setScale (const Vec2 &s) +{ + memset (x, 0, sizeof (x)); + x[0][0] = s[0]; + x[1][1] = s[1]; + x[2][2] = 1; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::scale (const Vec2 &s) +{ + x[0][0] *= s[0]; + x[0][1] *= s[0]; + x[0][2] *= s[0]; + + x[1][0] *= s[1]; + x[1][1] *= s[1]; + x[1][2] *= s[1]; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::setTranslation (const Vec2 &t) +{ + x[0][0] = 1; + x[0][1] = 0; + x[0][2] = 0; + + x[1][0] = 0; + x[1][1] = 1; + x[1][2] = 0; + + x[2][0] = t[0]; + x[2][1] = t[1]; + x[2][2] = 1; + + return *this; +} + +template +inline Vec2 +Matrix33::translation () const +{ + return Vec2 (x[2][0], x[2][1]); +} + +template +template +const Matrix33 & +Matrix33::translate (const Vec2 &t) +{ + x[2][0] += t[0] * x[0][0] + t[1] * x[1][0]; + x[2][1] += t[0] * x[0][1] + t[1] * x[1][1]; + x[2][2] += t[0] * x[0][2] + t[1] * x[1][2]; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::setShear (const S &xy) +{ + x[0][0] = 1; + x[0][1] = 0; + x[0][2] = 0; + + x[1][0] = xy; + x[1][1] = 1; + x[1][2] = 0; + + x[2][0] = 0; + x[2][1] = 0; + x[2][2] = 1; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::setShear (const Vec2 &h) +{ + x[0][0] = 1; + x[0][1] = h[1]; + x[0][2] = 0; + + x[1][0] = h[0]; + x[1][1] = 1; + x[1][2] = 0; + + x[2][0] = 0; + x[2][1] = 0; + x[2][2] = 1; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::shear (const S &xy) +{ + // + // In this case, we don't need a temp. copy of the matrix + // because we never use a value on the RHS after we've + // changed it on the LHS. + // + + x[1][0] += xy * x[0][0]; + x[1][1] += xy * x[0][1]; + x[1][2] += xy * x[0][2]; + + return *this; +} + +template +template +const Matrix33 & +Matrix33::shear (const Vec2 &h) +{ + Matrix33 P (*this); + + x[0][0] = P[0][0] + h[1] * P[1][0]; + x[0][1] = P[0][1] + h[1] * P[1][1]; + x[0][2] = P[0][2] + h[1] * P[1][2]; + + x[1][0] = P[1][0] + h[0] * P[0][0]; + x[1][1] = P[1][1] + h[0] * P[0][1]; + x[1][2] = P[1][2] + h[0] * P[0][2]; + + return *this; +} + + +//--------------------------- +// Implementation of Matrix44 +//--------------------------- + +template +inline T * +Matrix44::operator [] (int i) +{ + return x[i]; +} + +template +inline const T * +Matrix44::operator [] (int i) const +{ + return x[i]; +} + +template +inline +Matrix44::Matrix44 () +{ + memset (x, 0, sizeof (x)); + x[0][0] = 1; + x[1][1] = 1; + x[2][2] = 1; + x[3][3] = 1; +} + +template +inline +Matrix44::Matrix44 (T a) +{ + x[0][0] = a; + x[0][1] = a; + x[0][2] = a; + x[0][3] = a; + x[1][0] = a; + x[1][1] = a; + x[1][2] = a; + x[1][3] = a; + x[2][0] = a; + x[2][1] = a; + x[2][2] = a; + x[2][3] = a; + x[3][0] = a; + x[3][1] = a; + x[3][2] = a; + x[3][3] = a; +} + +template +inline +Matrix44::Matrix44 (const T a[4][4]) +{ + memcpy (x, a, sizeof (x)); +} + +template +inline +Matrix44::Matrix44 (T a, T b, T c, T d, T e, T f, T g, T h, + T i, T j, T k, T l, T m, T n, T o, T p) +{ + x[0][0] = a; + x[0][1] = b; + x[0][2] = c; + x[0][3] = d; + x[1][0] = e; + x[1][1] = f; + x[1][2] = g; + x[1][3] = h; + x[2][0] = i; + x[2][1] = j; + x[2][2] = k; + x[2][3] = l; + x[3][0] = m; + x[3][1] = n; + x[3][2] = o; + x[3][3] = p; +} + + +template +inline +Matrix44::Matrix44 (Matrix33 r, Vec3 t) +{ + x[0][0] = r[0][0]; + x[0][1] = r[0][1]; + x[0][2] = r[0][2]; + x[0][3] = 0; + x[1][0] = r[1][0]; + x[1][1] = r[1][1]; + x[1][2] = r[1][2]; + x[1][3] = 0; + x[2][0] = r[2][0]; + x[2][1] = r[2][1]; + x[2][2] = r[2][2]; + x[2][3] = 0; + x[3][0] = t[0]; + x[3][1] = t[1]; + x[3][2] = t[2]; + x[3][3] = 1; +} + +template +inline +Matrix44::Matrix44 (const Matrix44 &v) +{ + x[0][0] = v.x[0][0]; + x[0][1] = v.x[0][1]; + x[0][2] = v.x[0][2]; + x[0][3] = v.x[0][3]; + x[1][0] = v.x[1][0]; + x[1][1] = v.x[1][1]; + x[1][2] = v.x[1][2]; + x[1][3] = v.x[1][3]; + x[2][0] = v.x[2][0]; + x[2][1] = v.x[2][1]; + x[2][2] = v.x[2][2]; + x[2][3] = v.x[2][3]; + x[3][0] = v.x[3][0]; + x[3][1] = v.x[3][1]; + x[3][2] = v.x[3][2]; + x[3][3] = v.x[3][3]; +} + +template +template +inline +Matrix44::Matrix44 (const Matrix44 &v) +{ + x[0][0] = T (v.x[0][0]); + x[0][1] = T (v.x[0][1]); + x[0][2] = T (v.x[0][2]); + x[0][3] = T (v.x[0][3]); + x[1][0] = T (v.x[1][0]); + x[1][1] = T (v.x[1][1]); + x[1][2] = T (v.x[1][2]); + x[1][3] = T (v.x[1][3]); + x[2][0] = T (v.x[2][0]); + x[2][1] = T (v.x[2][1]); + x[2][2] = T (v.x[2][2]); + x[2][3] = T (v.x[2][3]); + x[3][0] = T (v.x[3][0]); + x[3][1] = T (v.x[3][1]); + x[3][2] = T (v.x[3][2]); + x[3][3] = T (v.x[3][3]); +} + +template +inline const Matrix44 & +Matrix44::operator = (const Matrix44 &v) +{ + x[0][0] = v.x[0][0]; + x[0][1] = v.x[0][1]; + x[0][2] = v.x[0][2]; + x[0][3] = v.x[0][3]; + x[1][0] = v.x[1][0]; + x[1][1] = v.x[1][1]; + x[1][2] = v.x[1][2]; + x[1][3] = v.x[1][3]; + x[2][0] = v.x[2][0]; + x[2][1] = v.x[2][1]; + x[2][2] = v.x[2][2]; + x[2][3] = v.x[2][3]; + x[3][0] = v.x[3][0]; + x[3][1] = v.x[3][1]; + x[3][2] = v.x[3][2]; + x[3][3] = v.x[3][3]; + return *this; +} + +template +inline const Matrix44 & +Matrix44::operator = (T a) +{ + x[0][0] = a; + x[0][1] = a; + x[0][2] = a; + x[0][3] = a; + x[1][0] = a; + x[1][1] = a; + x[1][2] = a; + x[1][3] = a; + x[2][0] = a; + x[2][1] = a; + x[2][2] = a; + x[2][3] = a; + x[3][0] = a; + x[3][1] = a; + x[3][2] = a; + x[3][3] = a; + return *this; +} + +template +inline T * +Matrix44::getValue () +{ + return (T *) &x[0][0]; +} + +template +inline const T * +Matrix44::getValue () const +{ + return (const T *) &x[0][0]; +} + +template +template +inline void +Matrix44::getValue (Matrix44 &v) const +{ + if (isSameType::value) + { + memcpy (v.x, x, sizeof (x)); + } + else + { + v.x[0][0] = x[0][0]; + v.x[0][1] = x[0][1]; + v.x[0][2] = x[0][2]; + v.x[0][3] = x[0][3]; + v.x[1][0] = x[1][0]; + v.x[1][1] = x[1][1]; + v.x[1][2] = x[1][2]; + v.x[1][3] = x[1][3]; + v.x[2][0] = x[2][0]; + v.x[2][1] = x[2][1]; + v.x[2][2] = x[2][2]; + v.x[2][3] = x[2][3]; + v.x[3][0] = x[3][0]; + v.x[3][1] = x[3][1]; + v.x[3][2] = x[3][2]; + v.x[3][3] = x[3][3]; + } +} + +template +template +inline Matrix44 & +Matrix44::setValue (const Matrix44 &v) +{ + if (isSameType::value) + { + memcpy (x, v.x, sizeof (x)); + } + else + { + x[0][0] = v.x[0][0]; + x[0][1] = v.x[0][1]; + x[0][2] = v.x[0][2]; + x[0][3] = v.x[0][3]; + x[1][0] = v.x[1][0]; + x[1][1] = v.x[1][1]; + x[1][2] = v.x[1][2]; + x[1][3] = v.x[1][3]; + x[2][0] = v.x[2][0]; + x[2][1] = v.x[2][1]; + x[2][2] = v.x[2][2]; + x[2][3] = v.x[2][3]; + x[3][0] = v.x[3][0]; + x[3][1] = v.x[3][1]; + x[3][2] = v.x[3][2]; + x[3][3] = v.x[3][3]; + } + + return *this; +} + +template +template +inline Matrix44 & +Matrix44::setTheMatrix (const Matrix44 &v) +{ + if (isSameType::value) + { + memcpy (x, v.x, sizeof (x)); + } + else + { + x[0][0] = v.x[0][0]; + x[0][1] = v.x[0][1]; + x[0][2] = v.x[0][2]; + x[0][3] = v.x[0][3]; + x[1][0] = v.x[1][0]; + x[1][1] = v.x[1][1]; + x[1][2] = v.x[1][2]; + x[1][3] = v.x[1][3]; + x[2][0] = v.x[2][0]; + x[2][1] = v.x[2][1]; + x[2][2] = v.x[2][2]; + x[2][3] = v.x[2][3]; + x[3][0] = v.x[3][0]; + x[3][1] = v.x[3][1]; + x[3][2] = v.x[3][2]; + x[3][3] = v.x[3][3]; + } + + return *this; +} + +template +inline void +Matrix44::makeIdentity() +{ + memset (x, 0, sizeof (x)); + x[0][0] = 1; + x[1][1] = 1; + x[2][2] = 1; + x[3][3] = 1; +} + +template +bool +Matrix44::operator == (const Matrix44 &v) const +{ + return x[0][0] == v.x[0][0] && + x[0][1] == v.x[0][1] && + x[0][2] == v.x[0][2] && + x[0][3] == v.x[0][3] && + x[1][0] == v.x[1][0] && + x[1][1] == v.x[1][1] && + x[1][2] == v.x[1][2] && + x[1][3] == v.x[1][3] && + x[2][0] == v.x[2][0] && + x[2][1] == v.x[2][1] && + x[2][2] == v.x[2][2] && + x[2][3] == v.x[2][3] && + x[3][0] == v.x[3][0] && + x[3][1] == v.x[3][1] && + x[3][2] == v.x[3][2] && + x[3][3] == v.x[3][3]; +} + +template +bool +Matrix44::operator != (const Matrix44 &v) const +{ + return x[0][0] != v.x[0][0] || + x[0][1] != v.x[0][1] || + x[0][2] != v.x[0][2] || + x[0][3] != v.x[0][3] || + x[1][0] != v.x[1][0] || + x[1][1] != v.x[1][1] || + x[1][2] != v.x[1][2] || + x[1][3] != v.x[1][3] || + x[2][0] != v.x[2][0] || + x[2][1] != v.x[2][1] || + x[2][2] != v.x[2][2] || + x[2][3] != v.x[2][3] || + x[3][0] != v.x[3][0] || + x[3][1] != v.x[3][1] || + x[3][2] != v.x[3][2] || + x[3][3] != v.x[3][3]; +} + +template +bool +Matrix44::equalWithAbsError (const Matrix44 &m, T e) const +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + if (!Imath::equalWithAbsError ((*this)[i][j], m[i][j], e)) + return false; + + return true; +} + +template +bool +Matrix44::equalWithRelError (const Matrix44 &m, T e) const +{ + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + if (!Imath::equalWithRelError ((*this)[i][j], m[i][j], e)) + return false; + + return true; +} + +template +const Matrix44 & +Matrix44::operator += (const Matrix44 &v) +{ + x[0][0] += v.x[0][0]; + x[0][1] += v.x[0][1]; + x[0][2] += v.x[0][2]; + x[0][3] += v.x[0][3]; + x[1][0] += v.x[1][0]; + x[1][1] += v.x[1][1]; + x[1][2] += v.x[1][2]; + x[1][3] += v.x[1][3]; + x[2][0] += v.x[2][0]; + x[2][1] += v.x[2][1]; + x[2][2] += v.x[2][2]; + x[2][3] += v.x[2][3]; + x[3][0] += v.x[3][0]; + x[3][1] += v.x[3][1]; + x[3][2] += v.x[3][2]; + x[3][3] += v.x[3][3]; + + return *this; +} + +template +const Matrix44 & +Matrix44::operator += (T a) +{ + x[0][0] += a; + x[0][1] += a; + x[0][2] += a; + x[0][3] += a; + x[1][0] += a; + x[1][1] += a; + x[1][2] += a; + x[1][3] += a; + x[2][0] += a; + x[2][1] += a; + x[2][2] += a; + x[2][3] += a; + x[3][0] += a; + x[3][1] += a; + x[3][2] += a; + x[3][3] += a; + + return *this; +} + +template +Matrix44 +Matrix44::operator + (const Matrix44 &v) const +{ + return Matrix44 (x[0][0] + v.x[0][0], + x[0][1] + v.x[0][1], + x[0][2] + v.x[0][2], + x[0][3] + v.x[0][3], + x[1][0] + v.x[1][0], + x[1][1] + v.x[1][1], + x[1][2] + v.x[1][2], + x[1][3] + v.x[1][3], + x[2][0] + v.x[2][0], + x[2][1] + v.x[2][1], + x[2][2] + v.x[2][2], + x[2][3] + v.x[2][3], + x[3][0] + v.x[3][0], + x[3][1] + v.x[3][1], + x[3][2] + v.x[3][2], + x[3][3] + v.x[3][3]); +} + +template +const Matrix44 & +Matrix44::operator -= (const Matrix44 &v) +{ + x[0][0] -= v.x[0][0]; + x[0][1] -= v.x[0][1]; + x[0][2] -= v.x[0][2]; + x[0][3] -= v.x[0][3]; + x[1][0] -= v.x[1][0]; + x[1][1] -= v.x[1][1]; + x[1][2] -= v.x[1][2]; + x[1][3] -= v.x[1][3]; + x[2][0] -= v.x[2][0]; + x[2][1] -= v.x[2][1]; + x[2][2] -= v.x[2][2]; + x[2][3] -= v.x[2][3]; + x[3][0] -= v.x[3][0]; + x[3][1] -= v.x[3][1]; + x[3][2] -= v.x[3][2]; + x[3][3] -= v.x[3][3]; + + return *this; +} + +template +const Matrix44 & +Matrix44::operator -= (T a) +{ + x[0][0] -= a; + x[0][1] -= a; + x[0][2] -= a; + x[0][3] -= a; + x[1][0] -= a; + x[1][1] -= a; + x[1][2] -= a; + x[1][3] -= a; + x[2][0] -= a; + x[2][1] -= a; + x[2][2] -= a; + x[2][3] -= a; + x[3][0] -= a; + x[3][1] -= a; + x[3][2] -= a; + x[3][3] -= a; + + return *this; +} + +template +Matrix44 +Matrix44::operator - (const Matrix44 &v) const +{ + return Matrix44 (x[0][0] - v.x[0][0], + x[0][1] - v.x[0][1], + x[0][2] - v.x[0][2], + x[0][3] - v.x[0][3], + x[1][0] - v.x[1][0], + x[1][1] - v.x[1][1], + x[1][2] - v.x[1][2], + x[1][3] - v.x[1][3], + x[2][0] - v.x[2][0], + x[2][1] - v.x[2][1], + x[2][2] - v.x[2][2], + x[2][3] - v.x[2][3], + x[3][0] - v.x[3][0], + x[3][1] - v.x[3][1], + x[3][2] - v.x[3][2], + x[3][3] - v.x[3][3]); +} + +template +Matrix44 +Matrix44::operator - () const +{ + return Matrix44 (-x[0][0], + -x[0][1], + -x[0][2], + -x[0][3], + -x[1][0], + -x[1][1], + -x[1][2], + -x[1][3], + -x[2][0], + -x[2][1], + -x[2][2], + -x[2][3], + -x[3][0], + -x[3][1], + -x[3][2], + -x[3][3]); +} + +template +const Matrix44 & +Matrix44::negate () +{ + x[0][0] = -x[0][0]; + x[0][1] = -x[0][1]; + x[0][2] = -x[0][2]; + x[0][3] = -x[0][3]; + x[1][0] = -x[1][0]; + x[1][1] = -x[1][1]; + x[1][2] = -x[1][2]; + x[1][3] = -x[1][3]; + x[2][0] = -x[2][0]; + x[2][1] = -x[2][1]; + x[2][2] = -x[2][2]; + x[2][3] = -x[2][3]; + x[3][0] = -x[3][0]; + x[3][1] = -x[3][1]; + x[3][2] = -x[3][2]; + x[3][3] = -x[3][3]; + + return *this; +} + +template +const Matrix44 & +Matrix44::operator *= (T a) +{ + x[0][0] *= a; + x[0][1] *= a; + x[0][2] *= a; + x[0][3] *= a; + x[1][0] *= a; + x[1][1] *= a; + x[1][2] *= a; + x[1][3] *= a; + x[2][0] *= a; + x[2][1] *= a; + x[2][2] *= a; + x[2][3] *= a; + x[3][0] *= a; + x[3][1] *= a; + x[3][2] *= a; + x[3][3] *= a; + + return *this; +} + +template +Matrix44 +Matrix44::operator * (T a) const +{ + return Matrix44 (x[0][0] * a, + x[0][1] * a, + x[0][2] * a, + x[0][3] * a, + x[1][0] * a, + x[1][1] * a, + x[1][2] * a, + x[1][3] * a, + x[2][0] * a, + x[2][1] * a, + x[2][2] * a, + x[2][3] * a, + x[3][0] * a, + x[3][1] * a, + x[3][2] * a, + x[3][3] * a); +} + +template +inline Matrix44 +operator * (T a, const Matrix44 &v) +{ + return v * a; +} + +template +inline const Matrix44 & +Matrix44::operator *= (const Matrix44 &v) +{ + Matrix44 tmp (T (0)); + + multiply (*this, v, tmp); + *this = tmp; + return *this; +} + +template +inline Matrix44 +Matrix44::operator * (const Matrix44 &v) const +{ + Matrix44 tmp (T (0)); + + multiply (*this, v, tmp); + return tmp; +} + +template +void +Matrix44::multiply (const Matrix44 &a, + const Matrix44 &b, + Matrix44 &c) +{ + register const T * IMATH_RESTRICT ap = &a.x[0][0]; + register const T * IMATH_RESTRICT bp = &b.x[0][0]; + register T * IMATH_RESTRICT cp = &c.x[0][0]; + + register T a0, a1, a2, a3; + + a0 = ap[0]; + a1 = ap[1]; + a2 = ap[2]; + a3 = ap[3]; + + cp[0] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; + cp[1] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; + cp[2] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; + cp[3] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; + + a0 = ap[4]; + a1 = ap[5]; + a2 = ap[6]; + a3 = ap[7]; + + cp[4] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; + cp[5] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; + cp[6] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; + cp[7] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; + + a0 = ap[8]; + a1 = ap[9]; + a2 = ap[10]; + a3 = ap[11]; + + cp[8] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; + cp[9] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; + cp[10] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; + cp[11] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; + + a0 = ap[12]; + a1 = ap[13]; + a2 = ap[14]; + a3 = ap[15]; + + cp[12] = a0 * bp[0] + a1 * bp[4] + a2 * bp[8] + a3 * bp[12]; + cp[13] = a0 * bp[1] + a1 * bp[5] + a2 * bp[9] + a3 * bp[13]; + cp[14] = a0 * bp[2] + a1 * bp[6] + a2 * bp[10] + a3 * bp[14]; + cp[15] = a0 * bp[3] + a1 * bp[7] + a2 * bp[11] + a3 * bp[15]; +} + +template template +void +Matrix44::multVecMatrix(const Vec3 &src, Vec3 &dst) const +{ + S a, b, c, w; + + a = src[0] * x[0][0] + src[1] * x[1][0] + src[2] * x[2][0] + x[3][0]; + b = src[0] * x[0][1] + src[1] * x[1][1] + src[2] * x[2][1] + x[3][1]; + c = src[0] * x[0][2] + src[1] * x[1][2] + src[2] * x[2][2] + x[3][2]; + w = src[0] * x[0][3] + src[1] * x[1][3] + src[2] * x[2][3] + x[3][3]; + + dst.x = a / w; + dst.y = b / w; + dst.z = c / w; +} + +template template +void +Matrix44::multDirMatrix(const Vec3 &src, Vec3 &dst) const +{ + S a, b, c; + + a = src[0] * x[0][0] + src[1] * x[1][0] + src[2] * x[2][0]; + b = src[0] * x[0][1] + src[1] * x[1][1] + src[2] * x[2][1]; + c = src[0] * x[0][2] + src[1] * x[1][2] + src[2] * x[2][2]; + + dst.x = a; + dst.y = b; + dst.z = c; +} + +template +const Matrix44 & +Matrix44::operator /= (T a) +{ + x[0][0] /= a; + x[0][1] /= a; + x[0][2] /= a; + x[0][3] /= a; + x[1][0] /= a; + x[1][1] /= a; + x[1][2] /= a; + x[1][3] /= a; + x[2][0] /= a; + x[2][1] /= a; + x[2][2] /= a; + x[2][3] /= a; + x[3][0] /= a; + x[3][1] /= a; + x[3][2] /= a; + x[3][3] /= a; + + return *this; +} + +template +Matrix44 +Matrix44::operator / (T a) const +{ + return Matrix44 (x[0][0] / a, + x[0][1] / a, + x[0][2] / a, + x[0][3] / a, + x[1][0] / a, + x[1][1] / a, + x[1][2] / a, + x[1][3] / a, + x[2][0] / a, + x[2][1] / a, + x[2][2] / a, + x[2][3] / a, + x[3][0] / a, + x[3][1] / a, + x[3][2] / a, + x[3][3] / a); +} + +template +const Matrix44 & +Matrix44::transpose () +{ + Matrix44 tmp (x[0][0], + x[1][0], + x[2][0], + x[3][0], + x[0][1], + x[1][1], + x[2][1], + x[3][1], + x[0][2], + x[1][2], + x[2][2], + x[3][2], + x[0][3], + x[1][3], + x[2][3], + x[3][3]); + *this = tmp; + return *this; +} + +template +Matrix44 +Matrix44::transposed () const +{ + return Matrix44 (x[0][0], + x[1][0], + x[2][0], + x[3][0], + x[0][1], + x[1][1], + x[2][1], + x[3][1], + x[0][2], + x[1][2], + x[2][2], + x[3][2], + x[0][3], + x[1][3], + x[2][3], + x[3][3]); +} + +template +const Matrix44 & +Matrix44::gjInvert (bool singExc) throw (Iex::MathExc) +{ + *this = gjInverse (singExc); + return *this; +} + +template +Matrix44 +Matrix44::gjInverse (bool singExc) const throw (Iex::MathExc) +{ + int i, j, k; + Matrix44 s; + Matrix44 t (*this); + + // Forward elimination + + for (i = 0; i < 3 ; i++) + { + int pivot = i; + + T pivotsize = t[i][i]; + + if (pivotsize < 0) + pivotsize = -pivotsize; + + for (j = i + 1; j < 4; j++) + { + T tmp = t[j][i]; + + if (tmp < 0) + tmp = -tmp; + + if (tmp > pivotsize) + { + pivot = j; + pivotsize = tmp; + } + } + + if (pivotsize == 0) + { + if (singExc) + throw ::Imath::SingMatrixExc ("Cannot invert singular matrix."); + + return Matrix44(); + } + + if (pivot != i) + { + for (j = 0; j < 4; j++) + { + T tmp; + + tmp = t[i][j]; + t[i][j] = t[pivot][j]; + t[pivot][j] = tmp; + + tmp = s[i][j]; + s[i][j] = s[pivot][j]; + s[pivot][j] = tmp; + } + } + + for (j = i + 1; j < 4; j++) + { + T f = t[j][i] / t[i][i]; + + for (k = 0; k < 4; k++) + { + t[j][k] -= f * t[i][k]; + s[j][k] -= f * s[i][k]; + } + } + } + + // Backward substitution + + for (i = 3; i >= 0; --i) + { + T f; + + if ((f = t[i][i]) == 0) + { + if (singExc) + throw ::Imath::SingMatrixExc ("Cannot invert singular matrix."); + + return Matrix44(); + } + + for (j = 0; j < 4; j++) + { + t[i][j] /= f; + s[i][j] /= f; + } + + for (j = 0; j < i; j++) + { + f = t[j][i]; + + for (k = 0; k < 4; k++) + { + t[j][k] -= f * t[i][k]; + s[j][k] -= f * s[i][k]; + } + } + } + + return s; +} + +template +const Matrix44 & +Matrix44::invert (bool singExc) throw (Iex::MathExc) +{ + *this = inverse (singExc); + return *this; +} + +template +Matrix44 +Matrix44::inverse (bool singExc) const throw (Iex::MathExc) +{ + if (x[0][3] != 0 || x[1][3] != 0 || x[2][3] != 0 || x[3][3] != 1) + return gjInverse(singExc); + + Matrix44 s (x[1][1] * x[2][2] - x[2][1] * x[1][2], + x[2][1] * x[0][2] - x[0][1] * x[2][2], + x[0][1] * x[1][2] - x[1][1] * x[0][2], + 0, + + x[2][0] * x[1][2] - x[1][0] * x[2][2], + x[0][0] * x[2][2] - x[2][0] * x[0][2], + x[1][0] * x[0][2] - x[0][0] * x[1][2], + 0, + + x[1][0] * x[2][1] - x[2][0] * x[1][1], + x[2][0] * x[0][1] - x[0][0] * x[2][1], + x[0][0] * x[1][1] - x[1][0] * x[0][1], + 0, + + 0, + 0, + 0, + 1); + + T r = x[0][0] * s[0][0] + x[0][1] * s[1][0] + x[0][2] * s[2][0]; + + if (Imath::abs (r) >= 1) + { + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + s[i][j] /= r; + } + } + } + else + { + T mr = Imath::abs (r) / limits::smallest(); + + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + if (mr > Imath::abs (s[i][j])) + { + s[i][j] /= r; + } + else + { + if (singExc) + throw SingMatrixExc ("Cannot invert singular matrix."); + + return Matrix44(); + } + } + } + } + + s[3][0] = -x[3][0] * s[0][0] - x[3][1] * s[1][0] - x[3][2] * s[2][0]; + s[3][1] = -x[3][0] * s[0][1] - x[3][1] * s[1][1] - x[3][2] * s[2][1]; + s[3][2] = -x[3][0] * s[0][2] - x[3][1] * s[1][2] - x[3][2] * s[2][2]; + + return s; +} + +template +inline T +Matrix44::fastMinor( const int r0, const int r1, const int r2, + const int c0, const int c1, const int c2) const +{ + return x[r0][c0] * (x[r1][c1]*x[r2][c2] - x[r1][c2]*x[r2][c1]) + + x[r0][c1] * (x[r1][c2]*x[r2][c0] - x[r1][c0]*x[r2][c2]) + + x[r0][c2] * (x[r1][c0]*x[r2][c1] - x[r1][c1]*x[r2][c0]); +} + +template +inline T +Matrix44::minorOf (const int r, const int c) const +{ + int r0 = 0 + (r < 1 ? 1 : 0); + int r1 = 1 + (r < 2 ? 1 : 0); + int r2 = 2 + (r < 3 ? 1 : 0); + int c0 = 0 + (c < 1 ? 1 : 0); + int c1 = 1 + (c < 2 ? 1 : 0); + int c2 = 2 + (c < 3 ? 1 : 0); + + Matrix33 working (x[r0][c0],x[r1][c0],x[r2][c0], + x[r0][c1],x[r1][c1],x[r2][c1], + x[r0][c2],x[r1][c2],x[r2][c2]); + + return working.determinant(); +} + +template +inline T +Matrix44::determinant () const +{ + T sum = (T)0; + + if (x[0][3] != 0.) sum -= x[0][3] * fastMinor(1,2,3,0,1,2); + if (x[1][3] != 0.) sum += x[1][3] * fastMinor(0,2,3,0,1,2); + if (x[2][3] != 0.) sum -= x[2][3] * fastMinor(0,1,3,0,1,2); + if (x[3][3] != 0.) sum += x[3][3] * fastMinor(0,1,2,0,1,2); + + return sum; +} + +template +template +const Matrix44 & +Matrix44::setEulerAngles (const Vec3& r) +{ + S cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx; + + cos_rz = Math::cos (r[2]); + cos_ry = Math::cos (r[1]); + cos_rx = Math::cos (r[0]); + + sin_rz = Math::sin (r[2]); + sin_ry = Math::sin (r[1]); + sin_rx = Math::sin (r[0]); + + x[0][0] = cos_rz * cos_ry; + x[0][1] = sin_rz * cos_ry; + x[0][2] = -sin_ry; + x[0][3] = 0; + + x[1][0] = -sin_rz * cos_rx + cos_rz * sin_ry * sin_rx; + x[1][1] = cos_rz * cos_rx + sin_rz * sin_ry * sin_rx; + x[1][2] = cos_ry * sin_rx; + x[1][3] = 0; + + x[2][0] = sin_rz * sin_rx + cos_rz * sin_ry * cos_rx; + x[2][1] = -cos_rz * sin_rx + sin_rz * sin_ry * cos_rx; + x[2][2] = cos_ry * cos_rx; + x[2][3] = 0; + + x[3][0] = 0; + x[3][1] = 0; + x[3][2] = 0; + x[3][3] = 1; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::setAxisAngle (const Vec3& axis, S angle) +{ + Vec3 unit (axis.normalized()); + S sine = Math::sin (angle); + S cosine = Math::cos (angle); + + x[0][0] = unit[0] * unit[0] * (1 - cosine) + cosine; + x[0][1] = unit[0] * unit[1] * (1 - cosine) + unit[2] * sine; + x[0][2] = unit[0] * unit[2] * (1 - cosine) - unit[1] * sine; + x[0][3] = 0; + + x[1][0] = unit[0] * unit[1] * (1 - cosine) - unit[2] * sine; + x[1][1] = unit[1] * unit[1] * (1 - cosine) + cosine; + x[1][2] = unit[1] * unit[2] * (1 - cosine) + unit[0] * sine; + x[1][3] = 0; + + x[2][0] = unit[0] * unit[2] * (1 - cosine) + unit[1] * sine; + x[2][1] = unit[1] * unit[2] * (1 - cosine) - unit[0] * sine; + x[2][2] = unit[2] * unit[2] * (1 - cosine) + cosine; + x[2][3] = 0; + + x[3][0] = 0; + x[3][1] = 0; + x[3][2] = 0; + x[3][3] = 1; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::rotate (const Vec3 &r) +{ + S cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx; + S m00, m01, m02; + S m10, m11, m12; + S m20, m21, m22; + + cos_rz = Math::cos (r[2]); + cos_ry = Math::cos (r[1]); + cos_rx = Math::cos (r[0]); + + sin_rz = Math::sin (r[2]); + sin_ry = Math::sin (r[1]); + sin_rx = Math::sin (r[0]); + + m00 = cos_rz * cos_ry; + m01 = sin_rz * cos_ry; + m02 = -sin_ry; + m10 = -sin_rz * cos_rx + cos_rz * sin_ry * sin_rx; + m11 = cos_rz * cos_rx + sin_rz * sin_ry * sin_rx; + m12 = cos_ry * sin_rx; + m20 = -sin_rz * -sin_rx + cos_rz * sin_ry * cos_rx; + m21 = cos_rz * -sin_rx + sin_rz * sin_ry * cos_rx; + m22 = cos_ry * cos_rx; + + Matrix44 P (*this); + + x[0][0] = P[0][0] * m00 + P[1][0] * m01 + P[2][0] * m02; + x[0][1] = P[0][1] * m00 + P[1][1] * m01 + P[2][1] * m02; + x[0][2] = P[0][2] * m00 + P[1][2] * m01 + P[2][2] * m02; + x[0][3] = P[0][3] * m00 + P[1][3] * m01 + P[2][3] * m02; + + x[1][0] = P[0][0] * m10 + P[1][0] * m11 + P[2][0] * m12; + x[1][1] = P[0][1] * m10 + P[1][1] * m11 + P[2][1] * m12; + x[1][2] = P[0][2] * m10 + P[1][2] * m11 + P[2][2] * m12; + x[1][3] = P[0][3] * m10 + P[1][3] * m11 + P[2][3] * m12; + + x[2][0] = P[0][0] * m20 + P[1][0] * m21 + P[2][0] * m22; + x[2][1] = P[0][1] * m20 + P[1][1] * m21 + P[2][1] * m22; + x[2][2] = P[0][2] * m20 + P[1][2] * m21 + P[2][2] * m22; + x[2][3] = P[0][3] * m20 + P[1][3] * m21 + P[2][3] * m22; + + return *this; +} + +template +const Matrix44 & +Matrix44::setScale (T s) +{ + memset (x, 0, sizeof (x)); + x[0][0] = s; + x[1][1] = s; + x[2][2] = s; + x[3][3] = 1; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::setScale (const Vec3 &s) +{ + memset (x, 0, sizeof (x)); + x[0][0] = s[0]; + x[1][1] = s[1]; + x[2][2] = s[2]; + x[3][3] = 1; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::scale (const Vec3 &s) +{ + x[0][0] *= s[0]; + x[0][1] *= s[0]; + x[0][2] *= s[0]; + x[0][3] *= s[0]; + + x[1][0] *= s[1]; + x[1][1] *= s[1]; + x[1][2] *= s[1]; + x[1][3] *= s[1]; + + x[2][0] *= s[2]; + x[2][1] *= s[2]; + x[2][2] *= s[2]; + x[2][3] *= s[2]; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::setTranslation (const Vec3 &t) +{ + x[0][0] = 1; + x[0][1] = 0; + x[0][2] = 0; + x[0][3] = 0; + + x[1][0] = 0; + x[1][1] = 1; + x[1][2] = 0; + x[1][3] = 0; + + x[2][0] = 0; + x[2][1] = 0; + x[2][2] = 1; + x[2][3] = 0; + + x[3][0] = t[0]; + x[3][1] = t[1]; + x[3][2] = t[2]; + x[3][3] = 1; + + return *this; +} + +template +inline const Vec3 +Matrix44::translation () const +{ + return Vec3 (x[3][0], x[3][1], x[3][2]); +} + +template +template +const Matrix44 & +Matrix44::translate (const Vec3 &t) +{ + x[3][0] += t[0] * x[0][0] + t[1] * x[1][0] + t[2] * x[2][0]; + x[3][1] += t[0] * x[0][1] + t[1] * x[1][1] + t[2] * x[2][1]; + x[3][2] += t[0] * x[0][2] + t[1] * x[1][2] + t[2] * x[2][2]; + x[3][3] += t[0] * x[0][3] + t[1] * x[1][3] + t[2] * x[2][3]; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::setShear (const Vec3 &h) +{ + x[0][0] = 1; + x[0][1] = 0; + x[0][2] = 0; + x[0][3] = 0; + + x[1][0] = h[0]; + x[1][1] = 1; + x[1][2] = 0; + x[1][3] = 0; + + x[2][0] = h[1]; + x[2][1] = h[2]; + x[2][2] = 1; + x[2][3] = 0; + + x[3][0] = 0; + x[3][1] = 0; + x[3][2] = 0; + x[3][3] = 1; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::setShear (const Shear6 &h) +{ + x[0][0] = 1; + x[0][1] = h.yx; + x[0][2] = h.zx; + x[0][3] = 0; + + x[1][0] = h.xy; + x[1][1] = 1; + x[1][2] = h.zy; + x[1][3] = 0; + + x[2][0] = h.xz; + x[2][1] = h.yz; + x[2][2] = 1; + x[2][3] = 0; + + x[3][0] = 0; + x[3][1] = 0; + x[3][2] = 0; + x[3][3] = 1; + + return *this; +} + +template +template +const Matrix44 & +Matrix44::shear (const Vec3 &h) +{ + // + // In this case, we don't need a temp. copy of the matrix + // because we never use a value on the RHS after we've + // changed it on the LHS. + // + + for (int i=0; i < 4; i++) + { + x[2][i] += h[1] * x[0][i] + h[2] * x[1][i]; + x[1][i] += h[0] * x[0][i]; + } + + return *this; +} + +template +template +const Matrix44 & +Matrix44::shear (const Shear6 &h) +{ + Matrix44 P (*this); + + for (int i=0; i < 4; i++) + { + x[0][i] = P[0][i] + h.yx * P[1][i] + h.zx * P[2][i]; + x[1][i] = h.xy * P[0][i] + P[1][i] + h.zy * P[2][i]; + x[2][i] = h.xz * P[0][i] + h.yz * P[1][i] + P[2][i]; + } + + return *this; +} + + +//-------------------------------- +// Implementation of stream output +//-------------------------------- + +template +std::ostream & +operator << (std::ostream &s, const Matrix33 &m) +{ + std::ios_base::fmtflags oldFlags = s.flags(); + int width; + + if (s.flags() & std::ios_base::fixed) + { + s.setf (std::ios_base::showpoint); + width = s.precision() + 5; + } + else + { + s.setf (std::ios_base::scientific); + s.setf (std::ios_base::showpoint); + width = s.precision() + 8; + } + + s << "(" << std::setw (width) << m[0][0] << + " " << std::setw (width) << m[0][1] << + " " << std::setw (width) << m[0][2] << "\n" << + + " " << std::setw (width) << m[1][0] << + " " << std::setw (width) << m[1][1] << + " " << std::setw (width) << m[1][2] << "\n" << + + " " << std::setw (width) << m[2][0] << + " " << std::setw (width) << m[2][1] << + " " << std::setw (width) << m[2][2] << ")\n"; + + s.flags (oldFlags); + return s; +} + +template +std::ostream & +operator << (std::ostream &s, const Matrix44 &m) +{ + std::ios_base::fmtflags oldFlags = s.flags(); + int width; + + if (s.flags() & std::ios_base::fixed) + { + s.setf (std::ios_base::showpoint); + width = s.precision() + 5; + } + else + { + s.setf (std::ios_base::scientific); + s.setf (std::ios_base::showpoint); + width = s.precision() + 8; + } + + s << "(" << std::setw (width) << m[0][0] << + " " << std::setw (width) << m[0][1] << + " " << std::setw (width) << m[0][2] << + " " << std::setw (width) << m[0][3] << "\n" << + + " " << std::setw (width) << m[1][0] << + " " << std::setw (width) << m[1][1] << + " " << std::setw (width) << m[1][2] << + " " << std::setw (width) << m[1][3] << "\n" << + + " " << std::setw (width) << m[2][0] << + " " << std::setw (width) << m[2][1] << + " " << std::setw (width) << m[2][2] << + " " << std::setw (width) << m[2][3] << "\n" << + + " " << std::setw (width) << m[3][0] << + " " << std::setw (width) << m[3][1] << + " " << std::setw (width) << m[3][2] << + " " << std::setw (width) << m[3][3] << ")\n"; + + s.flags (oldFlags); + return s; +} + + +//--------------------------------------------------------------- +// Implementation of vector-times-matrix multiplication operators +//--------------------------------------------------------------- + +template +inline const Vec2 & +operator *= (Vec2 &v, const Matrix33 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + m[2][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + m[2][1]); + S w = S(v.x * m[0][2] + v.y * m[1][2] + m[2][2]); + + v.x = x / w; + v.y = y / w; + + return v; +} + +template +inline Vec2 +operator * (const Vec2 &v, const Matrix33 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + m[2][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + m[2][1]); + S w = S(v.x * m[0][2] + v.y * m[1][2] + m[2][2]); + + return Vec2 (x / w, y / w); +} + + +template +inline const Vec3 & +operator *= (Vec3 &v, const Matrix33 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1]); + S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2]); + + v.x = x; + v.y = y; + v.z = z; + + return v; +} + +template +inline Vec3 +operator * (const Vec3 &v, const Matrix33 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1]); + S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2]); + + return Vec3 (x, y, z); +} + + +template +inline const Vec3 & +operator *= (Vec3 &v, const Matrix44 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + m[3][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + m[3][1]); + S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]); + S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + m[3][3]); + + v.x = x / w; + v.y = y / w; + v.z = z / w; + + return v; +} + +template +inline Vec3 +operator * (const Vec3 &v, const Matrix44 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + m[3][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + m[3][1]); + S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]); + S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + m[3][3]); + + return Vec3 (x / w, y / w, z / w); +} + + +template +inline const Vec4 & +operator *= (Vec4 &v, const Matrix44 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]); + S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]); + S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]); + + v.x = x; + v.y = y; + v.z = z; + v.w = w; + + return v; +} + +template +inline Vec4 +operator * (const Vec4 &v, const Matrix44 &m) +{ + S x = S(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + v.w * m[3][0]); + S y = S(v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + v.w * m[3][1]); + S z = S(v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + v.w * m[3][2]); + S w = S(v.x * m[0][3] + v.y * m[1][3] + v.z * m[2][3] + v.w * m[3][3]); + + return Vec4 (x, y, z, w); +} + +} // namespace Imath + + + +#endif diff --git a/3rdparty/openexr/Imath/ImathMatrixAlgo.cpp b/3rdparty/openexr/Imath/ImathMatrixAlgo.cpp new file mode 100644 index 000000000..8896c8ddd --- /dev/null +++ b/3rdparty/openexr/Imath/ImathMatrixAlgo.cpp @@ -0,0 +1,1251 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + + +//---------------------------------------------------------------------------- +// +// Implementation of non-template items declared in ImathMatrixAlgo.h +// +//---------------------------------------------------------------------------- + +#include "ImathMatrixAlgo.h" +#include + +#if defined(OPENEXR_DLL) + #define EXPORT_CONST __declspec(dllexport) +#else + #define EXPORT_CONST const +#endif + +namespace Imath { + +EXPORT_CONST M33f identity33f ( 1, 0, 0, + 0, 1, 0, + 0, 0, 1); + +EXPORT_CONST M33d identity33d ( 1, 0, 0, + 0, 1, 0, + 0, 0, 1); + +EXPORT_CONST M44f identity44f ( 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + +EXPORT_CONST M44d identity44d ( 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + +namespace +{ + +class KahanSum +{ +public: + KahanSum() : _total(0), _correction(0) {} + + void + operator+= (const double val) + { + const double y = val - _correction; + const double t = _total + y; + _correction = (t - _total) - y; + _total = t; + } + + double get() const + { + return _total; + } + +private: + double _total; + double _correction; +}; + +} + +template +M44d +procrustesRotationAndTranslation (const Vec3* A, const Vec3* B, const T* weights, const size_t numPoints, const bool doScale) +{ + if (numPoints == 0) + return M44d(); + + // Always do the accumulation in double precision: + V3d Acenter (0.0); + V3d Bcenter (0.0); + double weightsSum = 0.0; + + if (weights == 0) + { + for (int i = 0; i < numPoints; ++i) + { + Acenter += (V3d) A[i]; + Bcenter += (V3d) B[i]; + } + weightsSum = (double) numPoints; + } + else + { + for (int i = 0; i < numPoints; ++i) + { + const double w = weights[i]; + weightsSum += w; + + Acenter += w * (V3d) A[i]; + Bcenter += w * (V3d) B[i]; + } + } + + if (weightsSum == 0) + return M44d(); + + Acenter /= weightsSum; + Bcenter /= weightsSum; + + // + // Find Q such that |Q*A - B| (actually A-Acenter and B-Bcenter, weighted) + // is minimized in the least squares sense. + // From Golub/Van Loan, p.601 + // + // A,B are 3xn + // Let C = B A^T (where A is 3xn and B^T is nx3, so C is 3x3) + // Compute the SVD: C = U D V^T (U,V rotations, D diagonal). + // Throw away the D part, and return Q = U V^T + M33d C (0.0); + if (weights == 0) + { + for (int i = 0; i < numPoints; ++i) + C += outerProduct ((V3d) B[i] - Bcenter, (V3d) A[i] - Acenter); + } + else + { + for (int i = 0; i < numPoints; ++i) + { + const double w = weights[i]; + C += outerProduct (w * ((V3d) B[i] - Bcenter), (V3d) A[i] - Acenter); + } + } + + M33d U, V; + V3d S; + jacobiSVD (C, U, S, V, Imath::limits::epsilon(), true); + + // We want Q.transposed() here since we are going to be using it in the + // Imath style (multiplying vectors on the right, v' = v*A^T): + const M33d Qt = V * U.transposed(); + + double s = 1.0; + if (doScale && numPoints > 1) + { + // Finding a uniform scale: let us assume the Q is completely fixed + // at this point (solving for both simultaneously seems much harder). + // We are trying to compute (again, per Golub and van Loan) + // min || s*A*Q - B ||_F + // Notice that we've jammed a uniform scale in front of the Q. + // Now, the Frobenius norm (the least squares norm over matrices) + // has the neat property that it is equivalent to minimizing the trace + // of M^T*M (see your friendly neighborhood linear algebra text for a + // derivation). Thus, we can expand this out as + // min tr (s*A*Q - B)^T*(s*A*Q - B) + // = min tr(Q^T*A^T*s*s*A*Q) + tr(B^T*B) - 2*tr(Q^T*A^T*s*B) by linearity of the trace + // = min s^2 tr(A^T*A) + tr(B^T*B) - 2*s*tr(Q^T*A^T*B) using the fact that the trace is invariant + // under similarity transforms Q*M*Q^T + // If we differentiate w.r.t. s and set this to 0, we get + // 0 = 2*s*tr(A^T*A) - 2*tr(Q^T*A^T*B) + // so + // 2*s*tr(A^T*A) = 2*s*tr(Q^T*A^T*B) + // s = tr(Q^T*A^T*B) / tr(A^T*A) + + KahanSum traceATA; + if (weights == 0) + { + for (int i = 0; i < numPoints; ++i) + traceATA += ((V3d) A[i] - Acenter).length2(); + } + else + { + for (int i = 0; i < numPoints; ++i) + traceATA += ((double) weights[i]) * ((V3d) A[i] - Acenter).length2(); + } + + KahanSum traceBATQ; + for (int i = 0; i < 3; ++i) + for (int j = 0; j < 3; ++j) + traceBATQ += Qt[j][i] * C[i][j]; + + s = traceBATQ.get() / traceATA.get(); + } + + // Q is the rotation part of what we want to return. + // The entire transform is: + // (translate origin to Bcenter) * Q * (translate Acenter to origin) + // last first + // The effect of this on a point is: + // (translate origin to Bcenter) * Q * (translate Acenter to origin) * point + // = (translate origin to Bcenter) * Q * (-Acenter + point) + // = (translate origin to Bcenter) * (-Q*Acenter + Q*point) + // = (translate origin to Bcenter) * (translate Q*Acenter to origin) * Q*point + // = (translate Q*Acenter to Bcenter) * Q*point + // So what we want to return is: + // (translate Q*Acenter to Bcenter) * Q + // + // In block form, this is: + // [ 1 0 0 | ] [ 0 ] [ 1 0 0 | ] [ 1 0 0 | ] [ | ] [ ] + // [ 0 1 0 tb ] [ s*Q 0 ] [ 0 1 0 -ta ] = [ 0 1 0 tb ] [ s*Q -s*Q*ta ] = [ Q tb-s*Q*ta ] + // [ 0 0 1 | ] [ 0 ] [ 0 0 1 | ] [ 0 0 1 | ] [ | ] [ ] + // [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] + // (ofc the whole thing is transposed for Imath). + const V3d translate = Bcenter - s*Acenter*Qt; + + return M44d (s*Qt.x[0][0], s*Qt.x[0][1], s*Qt.x[0][2], T(0), + s*Qt.x[1][0], s*Qt.x[1][1], s*Qt.x[1][2], T(0), + s*Qt.x[2][0], s*Qt.x[2][1], s*Qt.x[2][2], T(0), + translate.x, translate.y, translate.z, T(1)); +} // procrustesRotationAndTranslation + +template +M44d +procrustesRotationAndTranslation (const Vec3* A, const Vec3* B, const size_t numPoints, const bool doScale) +{ + return procrustesRotationAndTranslation (A, B, (const T*) 0, numPoints, doScale); +} // procrustesRotationAndTranslation + + +template M44d procrustesRotationAndTranslation (const V3d* from, const V3d* to, const size_t numPoints, const bool doScale); +template M44d procrustesRotationAndTranslation (const V3f* from, const V3f* to, const size_t numPoints, const bool doScale); +template M44d procrustesRotationAndTranslation (const V3d* from, const V3d* to, const double* weights, const size_t numPoints, const bool doScale); +template M44d procrustesRotationAndTranslation (const V3f* from, const V3f* to, const float* weights, const size_t numPoints, const bool doScale); + + +namespace +{ + +// Applies the 2x2 Jacobi rotation +// [ c s 0 ] [ 1 0 0 ] [ c 0 s ] +// [ -s c 0 ] or [ 0 c s ] or [ 0 1 0 ] +// [ 0 0 1 ] [ 0 -s c ] [ -s 0 c ] +// from the right; that is, computes +// J * A +// for the Jacobi rotation J and the matrix A. This is efficient because we +// only need to touch exactly the 2 columns that are affected, so we never +// need to explicitly construct the J matrix. +template +void +jacobiRotateRight (Imath::Matrix33& A, + const T c, + const T s) +{ + for (int i = 0; i < 3; ++i) + { + const T tau1 = A[i][j]; + const T tau2 = A[i][k]; + A[i][j] = c * tau1 - s * tau2; + A[i][k] = s * tau1 + c * tau2; + } +} + +template +void +jacobiRotateRight (Imath::Matrix44& A, + const int j, + const int k, + const T c, + const T s) +{ + for (int i = 0; i < 4; ++i) + { + const T tau1 = A[i][j]; + const T tau2 = A[i][k]; + A[i][j] = c * tau1 - s * tau2; + A[i][k] = s * tau1 + c * tau2; + } +} + +// This routine solves the 2x2 SVD: +// [ c1 s1 ] [ w x ] [ c2 s2 ] [ d1 0 ] +// [ ] [ ] [ ] = [ ] +// [ -s1 c1 ] [ y z ] [ -s2 c2 ] [ 0 d2 ] +// where +// [ w x ] +// A = [ ] +// [ y z ] +// is the subset of A consisting of the [j,k] entries, A([j k], [j k]) in +// Matlab parlance. The method is the 'USVD' algorithm described in the +// following paper: +// 'Computation of the Singular Value Decomposition using Mesh-Connected Processors' +// by Richard P. Brent, Franklin T. Luk, and Charles Van Loan +// It breaks the computation into two steps: the first symmetrizes the matrix, +// and the second diagonalizes the symmetric matrix. +template +bool +twoSidedJacobiRotation (Imath::Matrix33& A, + Imath::Matrix33& U, + Imath::Matrix33& V, + const T tol) +{ + // Load everything into local variables to make things easier on the + // optimizer: + const T w = A[j][j]; + const T x = A[j][k]; + const T y = A[k][j]; + const T z = A[k][k]; + + // We will keep track of whether we're actually performing any rotations, + // since if the matrix is already diagonal we'll end up with the identity + // as our Jacobi rotation and we can short-circuit. + bool changed = false; + + // The first step is to symmetrize the 2x2 matrix, + // [ c s ]^T [ w x ] = [ p q ] + // [ -s c ] [ y z ] [ q r ] + T mu_1 = w + z; + T mu_2 = x - y; + + T c, s; + if (std::abs(mu_2) <= tol*std::abs(mu_1)) // Already symmetric (to tolerance) + { // Note that the <= is important here + c = T(1); // because we want to bypass the computation + s = T(0); // of rho if mu_1 = mu_2 = 0. + + const T p = w; + const T r = z; + mu_1 = r - p; + mu_2 = x + y; + } + else + { + const T rho = mu_1 / mu_2; + s = T(1) / std::sqrt (T(1) + rho*rho); // TODO is there a native inverse square root function? + if (rho < 0) + s = -s; + c = s * rho; + + mu_1 = s * (x + y) + c * (z - w); // = r - p + mu_2 = T(2) * (c * x - s * z); // = 2*q + + changed = true; + } + + // The second stage diagonalizes, + // [ c2 s2 ]^T [ p q ] [ c2 s2 ] = [ d1 0 ] + // [ -s2 c2 ] [ q r ] [ -s2 c2 ] [ 0 d2 ] + T c_2, s_2; + if (std::abs(mu_2) <= tol*std::abs(mu_1)) + { + c_2 = T(1); + s_2 = T(0); + } + else + { + const T rho_2 = mu_1 / mu_2; + T t_2 = T(1) / (std::abs(rho_2) + std::sqrt(1 + rho_2*rho_2)); + if (rho_2 < 0) + t_2 = -t_2; + c_2 = T(1) / std::sqrt (T(1) + t_2*t_2); + s_2 = c_2 * t_2; + + changed = true; + } + + const T c_1 = c_2 * c - s_2 * s; + const T s_1 = s_2 * c + c_2 * s; + + if (!changed) + { + // We've decided that the off-diagonal entries are already small + // enough, so we'll set them to zero. This actually appears to result + // in smaller errors than leaving them be, possibly because it prevents + // us from trying to do extra rotations later that we don't need. + A[k][j] = 0; + A[j][k] = 0; + return false; + } + + const T d_1 = c_1*(w*c_2 - x*s_2) - s_1*(y*c_2 - z*s_2); + const T d_2 = s_1*(w*s_2 + x*c_2) + c_1*(y*s_2 + z*c_2); + + // For the entries we just zeroed out, we'll just set them to 0, since + // they should be 0 up to machine precision. + A[j][j] = d_1; + A[k][k] = d_2; + A[k][j] = 0; + A[j][k] = 0; + + // Rotate the entries that _weren't_ involved in the 2x2 SVD: + { + // Rotate on the left by + // [ c1 s1 0 ]^T [ c1 0 s1 ]^T [ 1 0 0 ]^T + // [ -s1 c1 0 ] or [ 0 1 0 ] or [ 0 c1 s1 ] + // [ 0 0 1 ] [ -s1 0 c1 ] [ 0 -s1 c1 ] + // This has the effect of adding the (weighted) ith and jth _rows_ to + // each other. + const T tau1 = A[j][l]; + const T tau2 = A[k][l]; + A[j][l] = c_1 * tau1 - s_1 * tau2; + A[k][l] = s_1 * tau1 + c_1 * tau2; + } + + { + // Rotate on the right by + // [ c2 s2 0 ] [ c2 0 s2 ] [ 1 0 0 ] + // [ -s2 c2 0 ] or [ 0 1 0 ] or [ 0 c2 s2 ] + // [ 0 0 1 ] [ -s2 0 c2 ] [ 0 -s2 c2 ] + // This has the effect of adding the (weighted) ith and jth _columns_ to + // each other. + const T tau1 = A[l][j]; + const T tau2 = A[l][k]; + A[l][j] = c_2 * tau1 - s_2 * tau2; + A[l][k] = s_2 * tau1 + c_2 * tau2; + } + + // Now apply the rotations to U and V: + // Remember that we have + // R1^T * A * R2 = D + // This is in the 2x2 case, but after doing a bunch of these + // we will get something like this for the 3x3 case: + // ... R1b^T * R1a^T * A * R2a * R2b * ... = D + // ----------------- --------------- + // = U^T = V + // So, + // U = R1a * R1b * ... + // V = R2a * R2b * ... + jacobiRotateRight (U, c_1, s_1); + jacobiRotateRight (V, c_2, s_2); + + return true; +} + +template +bool +twoSidedJacobiRotation (Imath::Matrix44& A, + int j, + int k, + Imath::Matrix44& U, + Imath::Matrix44& V, + const T tol) +{ + // Load everything into local variables to make things easier on the + // optimizer: + const T w = A[j][j]; + const T x = A[j][k]; + const T y = A[k][j]; + const T z = A[k][k]; + + // We will keep track of whether we're actually performing any rotations, + // since if the matrix is already diagonal we'll end up with the identity + // as our Jacobi rotation and we can short-circuit. + bool changed = false; + + // The first step is to symmetrize the 2x2 matrix, + // [ c s ]^T [ w x ] = [ p q ] + // [ -s c ] [ y z ] [ q r ] + T mu_1 = w + z; + T mu_2 = x - y; + + T c, s; + if (std::abs(mu_2) <= tol*std::abs(mu_1)) // Already symmetric (to tolerance) + { // Note that the <= is important here + c = T(1); // because we want to bypass the computation + s = T(0); // of rho if mu_1 = mu_2 = 0. + + const T p = w; + const T r = z; + mu_1 = r - p; + mu_2 = x + y; + } + else + { + const T rho = mu_1 / mu_2; + s = T(1) / std::sqrt (T(1) + rho*rho); // TODO is there a native inverse square root function? + if (rho < 0) + s = -s; + c = s * rho; + + mu_1 = s * (x + y) + c * (z - w); // = r - p + mu_2 = T(2) * (c * x - s * z); // = 2*q + + changed = true; + } + + // The second stage diagonalizes, + // [ c2 s2 ]^T [ p q ] [ c2 s2 ] = [ d1 0 ] + // [ -s2 c2 ] [ q r ] [ -s2 c2 ] [ 0 d2 ] + T c_2, s_2; + if (std::abs(mu_2) <= tol*std::abs(mu_1)) + { + c_2 = T(1); + s_2 = T(0); + } + else + { + const T rho_2 = mu_1 / mu_2; + T t_2 = T(1) / (std::abs(rho_2) + std::sqrt(1 + rho_2*rho_2)); + if (rho_2 < 0) + t_2 = -t_2; + c_2 = T(1) / std::sqrt (T(1) + t_2*t_2); + s_2 = c_2 * t_2; + + changed = true; + } + + const T c_1 = c_2 * c - s_2 * s; + const T s_1 = s_2 * c + c_2 * s; + + if (!changed) + { + // We've decided that the off-diagonal entries are already small + // enough, so we'll set them to zero. This actually appears to result + // in smaller errors than leaving them be, possibly because it prevents + // us from trying to do extra rotations later that we don't need. + A[k][j] = 0; + A[j][k] = 0; + return false; + } + + const T d_1 = c_1*(w*c_2 - x*s_2) - s_1*(y*c_2 - z*s_2); + const T d_2 = s_1*(w*s_2 + x*c_2) + c_1*(y*s_2 + z*c_2); + + // For the entries we just zeroed out, we'll just set them to 0, since + // they should be 0 up to machine precision. + A[j][j] = d_1; + A[k][k] = d_2; + A[k][j] = 0; + A[j][k] = 0; + + // Rotate the entries that _weren't_ involved in the 2x2 SVD: + for (int l = 0; l < 4; ++l) + { + if (l == j || l == k) + continue; + + // Rotate on the left by + // [ 1 ] + // [ . ] + // [ c2 s2 ] j + // [ 1 ] + // [ -s2 c2 ] k + // [ . ] + // [ 1 ] + // j k + // + // This has the effect of adding the (weighted) ith and jth _rows_ to + // each other. + const T tau1 = A[j][l]; + const T tau2 = A[k][l]; + A[j][l] = c_1 * tau1 - s_1 * tau2; + A[k][l] = s_1 * tau1 + c_1 * tau2; + } + + for (int l = 0; l < 4; ++l) + { + // We set the A[j/k][j/k] entries already + if (l == j || l == k) + continue; + + // Rotate on the right by + // [ 1 ] + // [ . ] + // [ c2 s2 ] j + // [ 1 ] + // [ -s2 c2 ] k + // [ . ] + // [ 1 ] + // j k + // + // This has the effect of adding the (weighted) ith and jth _columns_ to + // each other. + const T tau1 = A[l][j]; + const T tau2 = A[l][k]; + A[l][j] = c_2 * tau1 - s_2 * tau2; + A[l][k] = s_2 * tau1 + c_2 * tau2; + } + + // Now apply the rotations to U and V: + // Remember that we have + // R1^T * A * R2 = D + // This is in the 2x2 case, but after doing a bunch of these + // we will get something like this for the 3x3 case: + // ... R1b^T * R1a^T * A * R2a * R2b * ... = D + // ----------------- --------------- + // = U^T = V + // So, + // U = R1a * R1b * ... + // V = R2a * R2b * ... + jacobiRotateRight (U, j, k, c_1, s_1); + jacobiRotateRight (V, j, k, c_2, s_2); + + return true; +} + +template +void +swapColumns (Imath::Matrix33& A, int j, int k) +{ + for (int i = 0; i < 3; ++i) + std::swap (A[i][j], A[i][k]); +} + +template +T +maxOffDiag (const Imath::Matrix33& A) +{ + T result = 0; + result = std::max (result, std::abs (A[0][1])); + result = std::max (result, std::abs (A[0][2])); + result = std::max (result, std::abs (A[1][0])); + result = std::max (result, std::abs (A[1][2])); + result = std::max (result, std::abs (A[2][0])); + result = std::max (result, std::abs (A[2][1])); + return result; +} + +template +T +maxOffDiag (const Imath::Matrix44& A) +{ + T result = 0; + for (int i = 0; i < 4; ++i) + { + for (int j = 0; j < 4; ++j) + { + if (i != j) + result = std::max (result, std::abs (A[i][j])); + } + } + + return result; +} + +template +void +twoSidedJacobiSVD (Imath::Matrix33 A, + Imath::Matrix33& U, + Imath::Vec3& S, + Imath::Matrix33& V, + const T tol, + const bool forcePositiveDeterminant) +{ + // The two-sided Jacobi SVD works by repeatedly zeroing out + // off-diagonal entries of the matrix, 2 at a time. Basically, + // we can take our 3x3 matrix, + // [* * *] + // [* * *] + // [* * *] + // and use a pair of orthogonal transforms to zero out, say, the + // pair of entries (0, 1) and (1, 0): + // [ c1 s1 ] [* * *] [ c2 s2 ] [* *] + // [-s1 c1 ] [* * *] [-s2 c2 ] = [ * *] + // [ 1] [* * *] [ 1] [* * *] + // When we go to zero out the next pair of entries (say, (0, 2) and (2, 0)) + // then we don't expect those entries to stay 0: + // [ c1 s1 ] [* *] [ c2 s2 ] [* * ] + // [-s1 c1 ] [ * *] [-s2 c2 ] = [* * *] + // [ 1] [* * *] [ 1] [ * *] + // However, if we keep doing this, we'll find that the off-diagonal entries + // converge to 0 fairly quickly (convergence should be roughly cubic). The + // result is a diagonal A matrix and a bunch of orthogonal transforms: + // [* * *] [* ] + // L1 L2 ... Ln [* * *] Rn ... R2 R1 = [ * ] + // [* * *] [ *] + // ------------ ------- ------------ ------- + // U^T A V S + // This turns out to be highly accurate because (1) orthogonal transforms + // are extremely stable to compute and apply (this is why QR factorization + // works so well, FWIW) and because (2) by applying everything to the original + // matrix A instead of computing (A^T * A) we avoid any precision loss that + // would result from that. + U.makeIdentity(); + V.makeIdentity(); + + const int maxIter = 20; // In case we get really unlucky, prevents infinite loops + const T absTol = tol * maxOffDiag (A); // Tolerance is in terms of the maximum + if (absTol != 0) // _off-diagonal_ entry. + { + int numIter = 0; + do + { + ++numIter; + bool changed = twoSidedJacobiRotation (A, U, V, tol); + changed = twoSidedJacobiRotation (A, U, V, tol) || changed; + changed = twoSidedJacobiRotation (A, U, V, tol) || changed; + if (!changed) + break; + } while (maxOffDiag(A) > absTol && numIter < maxIter); + } + + // The off-diagonal entries are (effectively) 0, so whatever's left on the + // diagonal are the singular values: + S.x = A[0][0]; + S.y = A[1][1]; + S.z = A[2][2]; + + // Nothing thus far has guaranteed that the singular values are positive, + // so let's go back through and flip them if not (since by contract we are + // supposed to return all positive SVs): + for (int i = 0; i < 3; ++i) + { + if (S[i] < 0) + { + // If we flip S[i], we need to flip the corresponding column of U + // (we could also pick V if we wanted; it doesn't really matter): + S[i] = -S[i]; + for (int j = 0; j < 3; ++j) + U[j][i] = -U[j][i]; + } + } + + // Order the singular values from largest to smallest; this requires + // exactly two passes through the data using bubble sort: + for (int i = 0; i < 2; ++i) + { + for (int j = 0; j < (2 - i); ++j) + { + // No absolute values necessary since we already ensured that + // they're positive: + if (S[j] < S[j+1]) + { + // If we swap singular values we also have to swap + // corresponding columns in U and V: + std::swap (S[j], S[j+1]); + swapColumns (U, j, j+1); + swapColumns (V, j, j+1); + } + } + } + + if (forcePositiveDeterminant) + { + // We want to guarantee that the returned matrices always have positive + // determinant. We can do this by adding the appropriate number of + // matrices of the form: + // [ 1 ] + // L = [ 1 ] + // [ -1 ] + // Note that L' = L and L*L = Identity. Thus we can add: + // U*L*L*S*V = (U*L)*(L*S)*V + // if U has a negative determinant, and + // U*S*L*L*V = U*(S*L)*(L*V) + // if V has a neg. determinant. + if (U.determinant() < 0) + { + for (int i = 0; i < 3; ++i) + U[i][2] = -U[i][2]; + S.z = -S.z; + } + + if (V.determinant() < 0) + { + for (int i = 0; i < 3; ++i) + V[i][2] = -V[i][2]; + S.z = -S.z; + } + } +} + +template +void +twoSidedJacobiSVD (Imath::Matrix44 A, + Imath::Matrix44& U, + Imath::Vec4& S, + Imath::Matrix44& V, + const T tol, + const bool forcePositiveDeterminant) +{ + // Please see the Matrix33 version for a detailed description of the algorithm. + U.makeIdentity(); + V.makeIdentity(); + + const int maxIter = 20; // In case we get really unlucky, prevents infinite loops + const T absTol = tol * maxOffDiag (A); // Tolerance is in terms of the maximum + if (absTol != 0) // _off-diagonal_ entry. + { + int numIter = 0; + do + { + ++numIter; + bool changed = twoSidedJacobiRotation (A, 0, 1, U, V, tol); + changed = twoSidedJacobiRotation (A, 0, 2, U, V, tol) || changed; + changed = twoSidedJacobiRotation (A, 0, 3, U, V, tol) || changed; + changed = twoSidedJacobiRotation (A, 1, 2, U, V, tol) || changed; + changed = twoSidedJacobiRotation (A, 1, 3, U, V, tol) || changed; + changed = twoSidedJacobiRotation (A, 2, 3, U, V, tol) || changed; + if (!changed) + break; + } while (maxOffDiag(A) > absTol && numIter < maxIter); + } + + // The off-diagonal entries are (effectively) 0, so whatever's left on the + // diagonal are the singular values: + S[0] = A[0][0]; + S[1] = A[1][1]; + S[2] = A[2][2]; + S[3] = A[3][3]; + + // Nothing thus far has guaranteed that the singular values are positive, + // so let's go back through and flip them if not (since by contract we are + // supposed to return all positive SVs): + for (int i = 0; i < 4; ++i) + { + if (S[i] < 0) + { + // If we flip S[i], we need to flip the corresponding column of U + // (we could also pick V if we wanted; it doesn't really matter): + S[i] = -S[i]; + for (int j = 0; j < 4; ++j) + U[j][i] = -U[j][i]; + } + } + + // Order the singular values from largest to smallest using insertion sort: + for (int i = 1; i < 4; ++i) + { + const Imath::Vec4 uCol (U[0][i], U[1][i], U[2][i], U[3][i]); + const Imath::Vec4 vCol (V[0][i], V[1][i], V[2][i], V[3][i]); + const T sVal = S[i]; + + int j = i - 1; + while (std::abs (S[j]) < std::abs (sVal)) + { + for (int k = 0; k < 4; ++k) + U[k][j+1] = U[k][j]; + for (int k = 0; k < 4; ++k) + V[k][j+1] = V[k][j]; + S[j+1] = S[j]; + + --j; + if (j < 0) + break; + } + + for (int k = 0; k < 4; ++k) + U[k][j+1] = uCol[k]; + for (int k = 0; k < 4; ++k) + V[k][j+1] = vCol[k]; + S[j+1] = sVal; + } + + if (forcePositiveDeterminant) + { + // We want to guarantee that the returned matrices always have positive + // determinant. We can do this by adding the appropriate number of + // matrices of the form: + // [ 1 ] + // L = [ 1 ] + // [ 1 ] + // [ -1 ] + // Note that L' = L and L*L = Identity. Thus we can add: + // U*L*L*S*V = (U*L)*(L*S)*V + // if U has a negative determinant, and + // U*S*L*L*V = U*(S*L)*(L*V) + // if V has a neg. determinant. + if (U.determinant() < 0) + { + for (int i = 0; i < 4; ++i) + U[i][3] = -U[i][3]; + S[3] = -S[3]; + } + + if (V.determinant() < 0) + { + for (int i = 0; i < 4; ++i) + V[i][3] = -V[i][3]; + S[3] = -S[3]; + } + } +} + +} + +template +void +jacobiSVD (const Imath::Matrix33& A, + Imath::Matrix33& U, + Imath::Vec3& S, + Imath::Matrix33& V, + const T tol, + const bool forcePositiveDeterminant) +{ + twoSidedJacobiSVD (A, U, S, V, tol, forcePositiveDeterminant); +} + +template +void +jacobiSVD (const Imath::Matrix44& A, + Imath::Matrix44& U, + Imath::Vec4& S, + Imath::Matrix44& V, + const T tol, + const bool forcePositiveDeterminant) +{ + twoSidedJacobiSVD (A, U, S, V, tol, forcePositiveDeterminant); +} + +template void jacobiSVD (const Imath::Matrix33& A, + Imath::Matrix33& U, + Imath::Vec3& S, + Imath::Matrix33& V, + const float tol, + const bool forcePositiveDeterminant); +template void jacobiSVD (const Imath::Matrix33& A, + Imath::Matrix33& U, + Imath::Vec3& S, + Imath::Matrix33& V, + const double tol, + const bool forcePositiveDeterminant); +template void jacobiSVD (const Imath::Matrix44& A, + Imath::Matrix44& U, + Imath::Vec4& S, + Imath::Matrix44& V, + const float tol, + const bool forcePositiveDeterminant); +template void jacobiSVD (const Imath::Matrix44& A, + Imath::Matrix44& U, + Imath::Vec4& S, + Imath::Matrix44& V, + const double tol, + const bool forcePositiveDeterminant); + +namespace +{ + +template +inline +void +jacobiRotateRight (TM& A, + const typename TM::BaseType s, + const typename TM::BaseType tau) +{ + typedef typename TM::BaseType T; + + for (unsigned int i = 0; i < TM::dimensions(); ++i) + { + const T nu1 = A[i][j]; + const T nu2 = A[i][k]; + A[i][j] -= s * (nu2 + tau * nu1); + A[i][k] += s * (nu1 - tau * nu2); + } +} + +template +bool +jacobiRotation (Matrix33& A, + Matrix33& V, + Vec3& Z, + const T tol) +{ + // Load everything into local variables to make things easier on the + // optimizer: + const T x = A[j][j]; + const T y = A[j][k]; + const T z = A[k][k]; + + // The first stage diagonalizes, + // [ c s ]^T [ x y ] [ c -s ] = [ d1 0 ] + // [ -s c ] [ y z ] [ s c ] [ 0 d2 ] + const T mu1 = z - x; + const T mu2 = 2 * y; + + if (std::abs(mu2) <= tol*std::abs(mu1)) + { + // We've decided that the off-diagonal entries are already small + // enough, so we'll set them to zero. This actually appears to result + // in smaller errors than leaving them be, possibly because it prevents + // us from trying to do extra rotations later that we don't need. + A[j][k] = 0; + return false; + } + const T rho = mu1 / mu2; + const T t = (rho < 0 ? T(-1) : T(1)) / (std::abs(rho) + std::sqrt(1 + rho*rho)); + const T c = T(1) / std::sqrt (T(1) + t*t); + const T s = t * c; + const T tau = s / (T(1) + c); + const T h = t * y; + + // Update diagonal elements. + Z[j] -= h; + Z[k] += h; + A[j][j] -= h; + A[k][k] += h; + + // For the entries we just zeroed out, we'll just set them to 0, since + // they should be 0 up to machine precision. + A[j][k] = 0; + + // We only update upper triagnular elements of A, since + // A is supposed to be symmetric. + T& offd1 = l < j ? A[l][j] : A[j][l]; + T& offd2 = l < k ? A[l][k] : A[k][l]; + const T nu1 = offd1; + const T nu2 = offd2; + offd1 = nu1 - s * (nu2 + tau * nu1); + offd2 = nu2 + s * (nu1 - tau * nu2); + + // Apply rotation to V + jacobiRotateRight (V, s, tau); + + return true; +} + +template +bool +jacobiRotation (Matrix44& A, + Matrix44& V, + Vec4& Z, + const T tol) +{ + const T x = A[j][j]; + const T y = A[j][k]; + const T z = A[k][k]; + + const T mu1 = z - x; + const T mu2 = T(2) * y; + + // Let's see if rho^(-1) = mu2 / mu1 is less than tol + // This test also checks if rho^2 will overflow + // when tol^(-1) < sqrt(limits::max()). + if (std::abs(mu2) <= tol*std::abs(mu1)) + { + A[j][k] = 0; + return true; + } + + const T rho = mu1 / mu2; + const T t = (rho < 0 ? T(-1) : T(1)) / (std::abs(rho) + std::sqrt(1 + rho*rho)); + const T c = T(1) / std::sqrt (T(1) + t*t); + const T s = c * t; + const T tau = s / (T(1) + c); + const T h = t * y; + + Z[j] -= h; + Z[k] += h; + A[j][j] -= h; + A[k][k] += h; + A[j][k] = 0; + + { + T& offd1 = l1 < j ? A[l1][j] : A[j][l1]; + T& offd2 = l1 < k ? A[l1][k] : A[k][l1]; + const T nu1 = offd1; + const T nu2 = offd2; + offd1 -= s * (nu2 + tau * nu1); + offd2 += s * (nu1 - tau * nu2); + } + + { + T& offd1 = l2 < j ? A[l2][j] : A[j][l2]; + T& offd2 = l2 < k ? A[l2][k] : A[k][l2]; + const T nu1 = offd1; + const T nu2 = offd2; + offd1 -= s * (nu2 + tau * nu1); + offd2 += s * (nu1 - tau * nu2); + } + + jacobiRotateRight (V, s, tau); + + return true; +} + +template +inline +typename TM::BaseType +maxOffDiagSymm (const TM& A) +{ + typedef typename TM::BaseType T; + T result = 0; + for (unsigned int i = 0; i < TM::dimensions(); ++i) + for (unsigned int j = i+1; j < TM::dimensions(); ++j) + result = std::max (result, std::abs (A[i][j])); + + return result; +} + +} // namespace + +template +void +jacobiEigenSolver (Matrix33& A, + Vec3& S, + Matrix33& V, + const T tol) +{ + V.makeIdentity(); + for(int i = 0; i < 3; ++i) { + S[i] = A[i][i]; + } + + const int maxIter = 20; // In case we get really unlucky, prevents infinite loops + const T absTol = tol * maxOffDiagSymm (A); // Tolerance is in terms of the maximum + if (absTol != 0) // _off-diagonal_ entry. + { + int numIter = 0; + do + { + // Z is for accumulating small changes (h) to diagonal entries + // of A for one sweep. Adding h's directly to A might cause + // a cancellation effect when h is relatively very small to + // the corresponding diagonal entry of A and + // this will increase numerical errors + Vec3 Z(0, 0, 0); + ++numIter; + bool changed = jacobiRotation<0, 1, 2> (A, V, Z, tol); + changed = jacobiRotation<0, 2, 1> (A, V, Z, tol) || changed; + changed = jacobiRotation<1, 2, 0> (A, V, Z, tol) || changed; + // One sweep passed. Add accumulated changes (Z) to singular values (S) + // Update diagonal elements of A for better accuracy as well. + for(int i = 0; i < 3; ++i) { + A[i][i] = S[i] += Z[i]; + } + if (!changed) + break; + } while (maxOffDiagSymm(A) > absTol && numIter < maxIter); + } +} + +template +void +jacobiEigenSolver (Matrix44& A, + Vec4& S, + Matrix44& V, + const T tol) +{ + V.makeIdentity(); + + for(int i = 0; i < 4; ++i) { + S[i] = A[i][i]; + } + + const int maxIter = 20; // In case we get really unlucky, prevents infinite loops + const T absTol = tol * maxOffDiagSymm (A); // Tolerance is in terms of the maximum + if (absTol != 0) // _off-diagonal_ entry. + { + int numIter = 0; + do + { + ++numIter; + Vec4 Z(0, 0, 0, 0); + bool changed = jacobiRotation<0, 1, 2, 3> (A, V, Z, tol); + changed = jacobiRotation<0, 2, 1, 3> (A, V, Z, tol) || changed; + changed = jacobiRotation<0, 3, 1, 2> (A, V, Z, tol) || changed; + changed = jacobiRotation<1, 2, 0, 3> (A, V, Z, tol) || changed; + changed = jacobiRotation<1, 3, 0, 2> (A, V, Z, tol) || changed; + changed = jacobiRotation<2, 3, 0, 1> (A, V, Z, tol) || changed; + for(int i = 0; i < 4; ++i) { + A[i][i] = S[i] += Z[i]; + } + if (!changed) + break; + } while (maxOffDiagSymm(A) > absTol && numIter < maxIter); + } +} + +template +void +maxEigenVector (TM& A, TV& V) +{ + TV S; + TM MV; + jacobiEigenSolver(A, S, MV); + + int maxIdx(0); + for(unsigned int i = 1; i < TV::dimensions(); ++i) + { + if(std::abs(S[i]) > std::abs(S[maxIdx])) + maxIdx = i; + } + + for(unsigned int i = 0; i < TV::dimensions(); ++i) + V[i] = MV[i][maxIdx]; +} + +template +void +minEigenVector (TM& A, TV& V) +{ + TV S; + TM MV; + jacobiEigenSolver(A, S, MV); + + int minIdx(0); + for(unsigned int i = 1; i < TV::dimensions(); ++i) + { + if(std::abs(S[i]) < std::abs(S[minIdx])) + minIdx = i; + } + + for(unsigned int i = 0; i < TV::dimensions(); ++i) + V[i] = MV[i][minIdx]; +} + +template void jacobiEigenSolver (Matrix33& A, + Vec3& S, + Matrix33& V, + const float tol); +template void jacobiEigenSolver (Matrix33& A, + Vec3& S, + Matrix33& V, + const double tol); +template void jacobiEigenSolver (Matrix44& A, + Vec4& S, + Matrix44& V, + const float tol); +template void jacobiEigenSolver (Matrix44& A, + Vec4& S, + Matrix44& V, + const double tol); + +template void maxEigenVector (Matrix33& A, + Vec3& S); +template void maxEigenVector (Matrix44& A, + Vec4& S); +template void maxEigenVector (Matrix33& A, + Vec3& S); +template void maxEigenVector (Matrix44& A, + Vec4& S); + +template void minEigenVector (Matrix33& A, + Vec3& S); +template void minEigenVector (Matrix44& A, + Vec4& S); +template void minEigenVector (Matrix33& A, + Vec3& S); +template void minEigenVector (Matrix44& A, + Vec4& S); + +} // namespace Imath diff --git a/3rdparty/openexr/Imath/ImathMatrixAlgo.h b/3rdparty/openexr/Imath/ImathMatrixAlgo.h new file mode 100644 index 000000000..6cb156824 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathMatrixAlgo.h @@ -0,0 +1,1435 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHMATRIXALGO_H +#define INCLUDED_IMATHMATRIXALGO_H + +//------------------------------------------------------------------------- +// +// This file contains algorithms applied to or in conjunction with +// transformation matrices (Imath::Matrix33 and Imath::Matrix44). +// The assumption made is that these functions are called much less +// often than the basic point functions or these functions require +// more support classes. +// +// This file also defines a few predefined constant matrices. +// +//------------------------------------------------------------------------- + +#include "ImathMatrix.h" +#include "ImathQuat.h" +#include "ImathEuler.h" +#include "ImathExc.h" +#include "ImathVec.h" +#include "ImathLimits.h" +#include + + +#ifdef OPENEXR_DLL + #ifdef IMATH_EXPORTS + #define IMATH_EXPORT_CONST extern __declspec(dllexport) + #else + #define IMATH_EXPORT_CONST extern __declspec(dllimport) + #endif +#else + #define IMATH_EXPORT_CONST extern const +#endif + + +namespace Imath { + +//------------------ +// Identity matrices +//------------------ + +IMATH_EXPORT_CONST M33f identity33f; +IMATH_EXPORT_CONST M44f identity44f; +IMATH_EXPORT_CONST M33d identity33d; +IMATH_EXPORT_CONST M44d identity44d; + +//---------------------------------------------------------------------- +// Extract scale, shear, rotation, and translation values from a matrix: +// +// Notes: +// +// This implementation follows the technique described in the paper by +// Spencer W. Thomas in the Graphics Gems II article: "Decomposing a +// Matrix into Simple Transformations", p. 320. +// +// - Some of the functions below have an optional exc parameter +// that determines the functions' behavior when the matrix' +// scaling is very close to zero: +// +// If exc is true, the functions throw an Imath::ZeroScale exception. +// +// If exc is false: +// +// extractScaling (m, s) returns false, s is invalid +// sansScaling (m) returns m +// removeScaling (m) returns false, m is unchanged +// sansScalingAndShear (m) returns m +// removeScalingAndShear (m) returns false, m is unchanged +// extractAndRemoveScalingAndShear (m, s, h) +// returns false, m is unchanged, +// (sh) are invalid +// checkForZeroScaleInRow () returns false +// extractSHRT (m, s, h, r, t) returns false, (shrt) are invalid +// +// - Functions extractEuler(), extractEulerXYZ() and extractEulerZYX() +// assume that the matrix does not include shear or non-uniform scaling, +// but they do not examine the matrix to verify this assumption. +// Matrices with shear or non-uniform scaling are likely to produce +// meaningless results. Therefore, you should use the +// removeScalingAndShear() routine, if necessary, prior to calling +// extractEuler...() . +// +// - All functions assume that the matrix does not include perspective +// transformation(s), but they do not examine the matrix to verify +// this assumption. Matrices with perspective transformations are +// likely to produce meaningless results. +// +//---------------------------------------------------------------------- + + +// +// Declarations for 4x4 matrix. +// + +template bool extractScaling + (const Matrix44 &mat, + Vec3 &scl, + bool exc = true); + +template Matrix44 sansScaling (const Matrix44 &mat, + bool exc = true); + +template bool removeScaling + (Matrix44 &mat, + bool exc = true); + +template bool extractScalingAndShear + (const Matrix44 &mat, + Vec3 &scl, + Vec3 &shr, + bool exc = true); + +template Matrix44 sansScalingAndShear + (const Matrix44 &mat, + bool exc = true); + +template void sansScalingAndShear + (Matrix44 &result, + const Matrix44 &mat, + bool exc = true); + +template bool removeScalingAndShear + (Matrix44 &mat, + bool exc = true); + +template bool extractAndRemoveScalingAndShear + (Matrix44 &mat, + Vec3 &scl, + Vec3 &shr, + bool exc = true); + +template void extractEulerXYZ + (const Matrix44 &mat, + Vec3 &rot); + +template void extractEulerZYX + (const Matrix44 &mat, + Vec3 &rot); + +template Quat extractQuat (const Matrix44 &mat); + +template bool extractSHRT + (const Matrix44 &mat, + Vec3 &s, + Vec3 &h, + Vec3 &r, + Vec3 &t, + bool exc /*= true*/, + typename Euler::Order rOrder); + +template bool extractSHRT + (const Matrix44 &mat, + Vec3 &s, + Vec3 &h, + Vec3 &r, + Vec3 &t, + bool exc = true); + +template bool extractSHRT + (const Matrix44 &mat, + Vec3 &s, + Vec3 &h, + Euler &r, + Vec3 &t, + bool exc = true); + +// +// Internal utility function. +// + +template bool checkForZeroScaleInRow + (const T &scl, + const Vec3 &row, + bool exc = true); + +template Matrix44 outerProduct + ( const Vec4 &a, + const Vec4 &b); + + +// +// Returns a matrix that rotates "fromDirection" vector to "toDirection" +// vector. +// + +template Matrix44 rotationMatrix (const Vec3 &fromDirection, + const Vec3 &toDirection); + + + +// +// Returns a matrix that rotates the "fromDir" vector +// so that it points towards "toDir". You may also +// specify that you want the up vector to be pointing +// in a certain direction "upDir". +// + +template Matrix44 rotationMatrixWithUpDir + (const Vec3 &fromDir, + const Vec3 &toDir, + const Vec3 &upDir); + + +// +// Constructs a matrix that rotates the z-axis so that it +// points towards "targetDir". You must also specify +// that you want the up vector to be pointing in a +// certain direction "upDir". +// +// Notes: The following degenerate cases are handled: +// (a) when the directions given by "toDir" and "upDir" +// are parallel or opposite; +// (the direction vectors must have a non-zero cross product) +// (b) when any of the given direction vectors have zero length +// + +template void alignZAxisWithTargetDir + (Matrix44 &result, + Vec3 targetDir, + Vec3 upDir); + + +// Compute an orthonormal direct frame from : a position, an x axis direction and a normal to the y axis +// If the x axis and normal are perpendicular, then the normal will have the same direction as the z axis. +// Inputs are : +// -the position of the frame +// -the x axis direction of the frame +// -a normal to the y axis of the frame +// Return is the orthonormal frame +template Matrix44 computeLocalFrame( const Vec3& p, + const Vec3& xDir, + const Vec3& normal); + +// Add a translate/rotate/scale offset to an input frame +// and put it in another frame of reference +// Inputs are : +// - input frame +// - translate offset +// - rotate offset in degrees +// - scale offset +// - frame of reference +// Output is the offsetted frame +template Matrix44 addOffset( const Matrix44& inMat, + const Vec3& tOffset, + const Vec3& rOffset, + const Vec3& sOffset, + const Vec3& ref); + +// Compute Translate/Rotate/Scale matrix from matrix A with the Rotate/Scale of Matrix B +// Inputs are : +// -keepRotateA : if true keep rotate from matrix A, use B otherwise +// -keepScaleA : if true keep scale from matrix A, use B otherwise +// -Matrix A +// -Matrix B +// Return Matrix A with tweaked rotation/scale +template Matrix44 computeRSMatrix( bool keepRotateA, + bool keepScaleA, + const Matrix44& A, + const Matrix44& B); + + +//---------------------------------------------------------------------- + + +// +// Declarations for 3x3 matrix. +// + + +template bool extractScaling + (const Matrix33 &mat, + Vec2 &scl, + bool exc = true); + +template Matrix33 sansScaling (const Matrix33 &mat, + bool exc = true); + +template bool removeScaling + (Matrix33 &mat, + bool exc = true); + +template bool extractScalingAndShear + (const Matrix33 &mat, + Vec2 &scl, + T &h, + bool exc = true); + +template Matrix33 sansScalingAndShear + (const Matrix33 &mat, + bool exc = true); + +template bool removeScalingAndShear + (Matrix33 &mat, + bool exc = true); + +template bool extractAndRemoveScalingAndShear + (Matrix33 &mat, + Vec2 &scl, + T &shr, + bool exc = true); + +template void extractEuler + (const Matrix33 &mat, + T &rot); + +template bool extractSHRT (const Matrix33 &mat, + Vec2 &s, + T &h, + T &r, + Vec2 &t, + bool exc = true); + +template bool checkForZeroScaleInRow + (const T &scl, + const Vec2 &row, + bool exc = true); + +template Matrix33 outerProduct + ( const Vec3 &a, + const Vec3 &b); + + +//----------------------------------------------------------------------------- +// Implementation for 4x4 Matrix +//------------------------------ + + +template +bool +extractScaling (const Matrix44 &mat, Vec3 &scl, bool exc) +{ + Vec3 shr; + Matrix44 M (mat); + + if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) + return false; + + return true; +} + + +template +Matrix44 +sansScaling (const Matrix44 &mat, bool exc) +{ + Vec3 scl; + Vec3 shr; + Vec3 rot; + Vec3 tran; + + if (! extractSHRT (mat, scl, shr, rot, tran, exc)) + return mat; + + Matrix44 M; + + M.translate (tran); + M.rotate (rot); + M.shear (shr); + + return M; +} + + +template +bool +removeScaling (Matrix44 &mat, bool exc) +{ + Vec3 scl; + Vec3 shr; + Vec3 rot; + Vec3 tran; + + if (! extractSHRT (mat, scl, shr, rot, tran, exc)) + return false; + + mat.makeIdentity (); + mat.translate (tran); + mat.rotate (rot); + mat.shear (shr); + + return true; +} + + +template +bool +extractScalingAndShear (const Matrix44 &mat, + Vec3 &scl, Vec3 &shr, bool exc) +{ + Matrix44 M (mat); + + if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) + return false; + + return true; +} + + +template +Matrix44 +sansScalingAndShear (const Matrix44 &mat, bool exc) +{ + Vec3 scl; + Vec3 shr; + Matrix44 M (mat); + + if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) + return mat; + + return M; +} + + +template +void +sansScalingAndShear (Matrix44 &result, const Matrix44 &mat, bool exc) +{ + Vec3 scl; + Vec3 shr; + + if (! extractAndRemoveScalingAndShear (result, scl, shr, exc)) + result = mat; +} + + +template +bool +removeScalingAndShear (Matrix44 &mat, bool exc) +{ + Vec3 scl; + Vec3 shr; + + if (! extractAndRemoveScalingAndShear (mat, scl, shr, exc)) + return false; + + return true; +} + + +template +bool +extractAndRemoveScalingAndShear (Matrix44 &mat, + Vec3 &scl, Vec3 &shr, bool exc) +{ + // + // This implementation follows the technique described in the paper by + // Spencer W. Thomas in the Graphics Gems II article: "Decomposing a + // Matrix into Simple Transformations", p. 320. + // + + Vec3 row[3]; + + row[0] = Vec3 (mat[0][0], mat[0][1], mat[0][2]); + row[1] = Vec3 (mat[1][0], mat[1][1], mat[1][2]); + row[2] = Vec3 (mat[2][0], mat[2][1], mat[2][2]); + + T maxVal = 0; + for (int i=0; i < 3; i++) + for (int j=0; j < 3; j++) + if (Imath::abs (row[i][j]) > maxVal) + maxVal = Imath::abs (row[i][j]); + + // + // We normalize the 3x3 matrix here. + // It was noticed that this can improve numerical stability significantly, + // especially when many of the upper 3x3 matrix's coefficients are very + // close to zero; we correct for this step at the end by multiplying the + // scaling factors by maxVal at the end (shear and rotation are not + // affected by the normalization). + + if (maxVal != 0) + { + for (int i=0; i < 3; i++) + if (! checkForZeroScaleInRow (maxVal, row[i], exc)) + return false; + else + row[i] /= maxVal; + } + + // Compute X scale factor. + scl.x = row[0].length (); + if (! checkForZeroScaleInRow (scl.x, row[0], exc)) + return false; + + // Normalize first row. + row[0] /= scl.x; + + // An XY shear factor will shear the X coord. as the Y coord. changes. + // There are 6 combinations (XY, XZ, YZ, YX, ZX, ZY), although we only + // extract the first 3 because we can effect the last 3 by shearing in + // XY, XZ, YZ combined rotations and scales. + // + // shear matrix < 1, YX, ZX, 0, + // XY, 1, ZY, 0, + // XZ, YZ, 1, 0, + // 0, 0, 0, 1 > + + // Compute XY shear factor and make 2nd row orthogonal to 1st. + shr[0] = row[0].dot (row[1]); + row[1] -= shr[0] * row[0]; + + // Now, compute Y scale. + scl.y = row[1].length (); + if (! checkForZeroScaleInRow (scl.y, row[1], exc)) + return false; + + // Normalize 2nd row and correct the XY shear factor for Y scaling. + row[1] /= scl.y; + shr[0] /= scl.y; + + // Compute XZ and YZ shears, orthogonalize 3rd row. + shr[1] = row[0].dot (row[2]); + row[2] -= shr[1] * row[0]; + shr[2] = row[1].dot (row[2]); + row[2] -= shr[2] * row[1]; + + // Next, get Z scale. + scl.z = row[2].length (); + if (! checkForZeroScaleInRow (scl.z, row[2], exc)) + return false; + + // Normalize 3rd row and correct the XZ and YZ shear factors for Z scaling. + row[2] /= scl.z; + shr[1] /= scl.z; + shr[2] /= scl.z; + + // At this point, the upper 3x3 matrix in mat is orthonormal. + // Check for a coordinate system flip. If the determinant + // is less than zero, then negate the matrix and the scaling factors. + if (row[0].dot (row[1].cross (row[2])) < 0) + for (int i=0; i < 3; i++) + { + scl[i] *= -1; + row[i] *= -1; + } + + // Copy over the orthonormal rows into the returned matrix. + // The upper 3x3 matrix in mat is now a rotation matrix. + for (int i=0; i < 3; i++) + { + mat[i][0] = row[i][0]; + mat[i][1] = row[i][1]; + mat[i][2] = row[i][2]; + } + + // Correct the scaling factors for the normalization step that we + // performed above; shear and rotation are not affected by the + // normalization. + scl *= maxVal; + + return true; +} + + +template +void +extractEulerXYZ (const Matrix44 &mat, Vec3 &rot) +{ + // + // Normalize the local x, y and z axes to remove scaling. + // + + Vec3 i (mat[0][0], mat[0][1], mat[0][2]); + Vec3 j (mat[1][0], mat[1][1], mat[1][2]); + Vec3 k (mat[2][0], mat[2][1], mat[2][2]); + + i.normalize(); + j.normalize(); + k.normalize(); + + Matrix44 M (i[0], i[1], i[2], 0, + j[0], j[1], j[2], 0, + k[0], k[1], k[2], 0, + 0, 0, 0, 1); + + // + // Extract the first angle, rot.x. + // + + rot.x = Math::atan2 (M[1][2], M[2][2]); + + // + // Remove the rot.x rotation from M, so that the remaining + // rotation, N, is only around two axes, and gimbal lock + // cannot occur. + // + + Matrix44 N; + N.rotate (Vec3 (-rot.x, 0, 0)); + N = N * M; + + // + // Extract the other two angles, rot.y and rot.z, from N. + // + + T cy = Math::sqrt (N[0][0]*N[0][0] + N[0][1]*N[0][1]); + rot.y = Math::atan2 (-N[0][2], cy); + rot.z = Math::atan2 (-N[1][0], N[1][1]); +} + + +template +void +extractEulerZYX (const Matrix44 &mat, Vec3 &rot) +{ + // + // Normalize the local x, y and z axes to remove scaling. + // + + Vec3 i (mat[0][0], mat[0][1], mat[0][2]); + Vec3 j (mat[1][0], mat[1][1], mat[1][2]); + Vec3 k (mat[2][0], mat[2][1], mat[2][2]); + + i.normalize(); + j.normalize(); + k.normalize(); + + Matrix44 M (i[0], i[1], i[2], 0, + j[0], j[1], j[2], 0, + k[0], k[1], k[2], 0, + 0, 0, 0, 1); + + // + // Extract the first angle, rot.x. + // + + rot.x = -Math::atan2 (M[1][0], M[0][0]); + + // + // Remove the x rotation from M, so that the remaining + // rotation, N, is only around two axes, and gimbal lock + // cannot occur. + // + + Matrix44 N; + N.rotate (Vec3 (0, 0, -rot.x)); + N = N * M; + + // + // Extract the other two angles, rot.y and rot.z, from N. + // + + T cy = Math::sqrt (N[2][2]*N[2][2] + N[2][1]*N[2][1]); + rot.y = -Math::atan2 (-N[2][0], cy); + rot.z = -Math::atan2 (-N[1][2], N[1][1]); +} + + +template +Quat +extractQuat (const Matrix44 &mat) +{ + Matrix44 rot; + + T tr, s; + T q[4]; + int i, j, k; + Quat quat; + + int nxt[3] = {1, 2, 0}; + tr = mat[0][0] + mat[1][1] + mat[2][2]; + + // check the diagonal + if (tr > 0.0) { + s = Math::sqrt (tr + T(1.0)); + quat.r = s / T(2.0); + s = T(0.5) / s; + + quat.v.x = (mat[1][2] - mat[2][1]) * s; + quat.v.y = (mat[2][0] - mat[0][2]) * s; + quat.v.z = (mat[0][1] - mat[1][0]) * s; + } + else { + // diagonal is negative + i = 0; + if (mat[1][1] > mat[0][0]) + i=1; + if (mat[2][2] > mat[i][i]) + i=2; + + j = nxt[i]; + k = nxt[j]; + s = Math::sqrt ((mat[i][i] - (mat[j][j] + mat[k][k])) + T(1.0)); + + q[i] = s * T(0.5); + if (s != T(0.0)) + s = T(0.5) / s; + + q[3] = (mat[j][k] - mat[k][j]) * s; + q[j] = (mat[i][j] + mat[j][i]) * s; + q[k] = (mat[i][k] + mat[k][i]) * s; + + quat.v.x = q[0]; + quat.v.y = q[1]; + quat.v.z = q[2]; + quat.r = q[3]; + } + + return quat; +} + +template +bool +extractSHRT (const Matrix44 &mat, + Vec3 &s, + Vec3 &h, + Vec3 &r, + Vec3 &t, + bool exc /* = true */ , + typename Euler::Order rOrder /* = Euler::XYZ */ ) +{ + Matrix44 rot; + + rot = mat; + if (! extractAndRemoveScalingAndShear (rot, s, h, exc)) + return false; + + extractEulerXYZ (rot, r); + + t.x = mat[3][0]; + t.y = mat[3][1]; + t.z = mat[3][2]; + + if (rOrder != Euler::XYZ) + { + Imath::Euler eXYZ (r, Imath::Euler::XYZ); + Imath::Euler e (eXYZ, rOrder); + r = e.toXYZVector (); + } + + return true; +} + +template +bool +extractSHRT (const Matrix44 &mat, + Vec3 &s, + Vec3 &h, + Vec3 &r, + Vec3 &t, + bool exc) +{ + return extractSHRT(mat, s, h, r, t, exc, Imath::Euler::XYZ); +} + +template +bool +extractSHRT (const Matrix44 &mat, + Vec3 &s, + Vec3 &h, + Euler &r, + Vec3 &t, + bool exc /* = true */) +{ + return extractSHRT (mat, s, h, r, t, exc, r.order ()); +} + + +template +bool +checkForZeroScaleInRow (const T& scl, + const Vec3 &row, + bool exc /* = true */ ) +{ + for (int i = 0; i < 3; i++) + { + if ((abs (scl) < 1 && abs (row[i]) >= limits::max() * abs (scl))) + { + if (exc) + throw Imath::ZeroScaleExc ("Cannot remove zero scaling " + "from matrix."); + else + return false; + } + } + + return true; +} + +template +Matrix44 +outerProduct (const Vec4 &a, const Vec4 &b ) +{ + return Matrix44 (a.x*b.x, a.x*b.y, a.x*b.z, a.x*b.w, + a.y*b.x, a.y*b.y, a.y*b.z, a.x*b.w, + a.z*b.x, a.z*b.y, a.z*b.z, a.x*b.w, + a.w*b.x, a.w*b.y, a.w*b.z, a.w*b.w); +} + +template +Matrix44 +rotationMatrix (const Vec3 &from, const Vec3 &to) +{ + Quat q; + q.setRotation(from, to); + return q.toMatrix44(); +} + + +template +Matrix44 +rotationMatrixWithUpDir (const Vec3 &fromDir, + const Vec3 &toDir, + const Vec3 &upDir) +{ + // + // The goal is to obtain a rotation matrix that takes + // "fromDir" to "toDir". We do this in two steps and + // compose the resulting rotation matrices; + // (a) rotate "fromDir" into the z-axis + // (b) rotate the z-axis into "toDir" + // + + // The from direction must be non-zero; but we allow zero to and up dirs. + if (fromDir.length () == 0) + return Matrix44 (); + + else + { + Matrix44 zAxis2FromDir( Imath::UNINITIALIZED ); + alignZAxisWithTargetDir (zAxis2FromDir, fromDir, Vec3 (0, 1, 0)); + + Matrix44 fromDir2zAxis = zAxis2FromDir.transposed (); + + Matrix44 zAxis2ToDir( Imath::UNINITIALIZED ); + alignZAxisWithTargetDir (zAxis2ToDir, toDir, upDir); + + return fromDir2zAxis * zAxis2ToDir; + } +} + + +template +void +alignZAxisWithTargetDir (Matrix44 &result, Vec3 targetDir, Vec3 upDir) +{ + // + // Ensure that the target direction is non-zero. + // + + if ( targetDir.length () == 0 ) + targetDir = Vec3 (0, 0, 1); + + // + // Ensure that the up direction is non-zero. + // + + if ( upDir.length () == 0 ) + upDir = Vec3 (0, 1, 0); + + // + // Check for degeneracies. If the upDir and targetDir are parallel + // or opposite, then compute a new, arbitrary up direction that is + // not parallel or opposite to the targetDir. + // + + if (upDir.cross (targetDir).length () == 0) + { + upDir = targetDir.cross (Vec3 (1, 0, 0)); + if (upDir.length() == 0) + upDir = targetDir.cross(Vec3 (0, 0, 1)); + } + + // + // Compute the x-, y-, and z-axis vectors of the new coordinate system. + // + + Vec3 targetPerpDir = upDir.cross (targetDir); + Vec3 targetUpDir = targetDir.cross (targetPerpDir); + + // + // Rotate the x-axis into targetPerpDir (row 0), + // rotate the y-axis into targetUpDir (row 1), + // rotate the z-axis into targetDir (row 2). + // + + Vec3 row[3]; + row[0] = targetPerpDir.normalized (); + row[1] = targetUpDir .normalized (); + row[2] = targetDir .normalized (); + + result.x[0][0] = row[0][0]; + result.x[0][1] = row[0][1]; + result.x[0][2] = row[0][2]; + result.x[0][3] = (T)0; + + result.x[1][0] = row[1][0]; + result.x[1][1] = row[1][1]; + result.x[1][2] = row[1][2]; + result.x[1][3] = (T)0; + + result.x[2][0] = row[2][0]; + result.x[2][1] = row[2][1]; + result.x[2][2] = row[2][2]; + result.x[2][3] = (T)0; + + result.x[3][0] = (T)0; + result.x[3][1] = (T)0; + result.x[3][2] = (T)0; + result.x[3][3] = (T)1; +} + + +// Compute an orthonormal direct frame from : a position, an x axis direction and a normal to the y axis +// If the x axis and normal are perpendicular, then the normal will have the same direction as the z axis. +// Inputs are : +// -the position of the frame +// -the x axis direction of the frame +// -a normal to the y axis of the frame +// Return is the orthonormal frame +template +Matrix44 +computeLocalFrame( const Vec3& p, + const Vec3& xDir, + const Vec3& normal) +{ + Vec3 _xDir(xDir); + Vec3 x = _xDir.normalize(); + Vec3 y = (normal % x).normalize(); + Vec3 z = (x % y).normalize(); + + Matrix44 L; + L[0][0] = x[0]; + L[0][1] = x[1]; + L[0][2] = x[2]; + L[0][3] = 0.0; + + L[1][0] = y[0]; + L[1][1] = y[1]; + L[1][2] = y[2]; + L[1][3] = 0.0; + + L[2][0] = z[0]; + L[2][1] = z[1]; + L[2][2] = z[2]; + L[2][3] = 0.0; + + L[3][0] = p[0]; + L[3][1] = p[1]; + L[3][2] = p[2]; + L[3][3] = 1.0; + + return L; +} + +// Add a translate/rotate/scale offset to an input frame +// and put it in another frame of reference +// Inputs are : +// - input frame +// - translate offset +// - rotate offset in degrees +// - scale offset +// - frame of reference +// Output is the offsetted frame +template +Matrix44 +addOffset( const Matrix44& inMat, + const Vec3& tOffset, + const Vec3& rOffset, + const Vec3& sOffset, + const Matrix44& ref) +{ + Matrix44 O; + + Vec3 _rOffset(rOffset); + _rOffset *= M_PI / 180.0; + O.rotate (_rOffset); + + O[3][0] = tOffset[0]; + O[3][1] = tOffset[1]; + O[3][2] = tOffset[2]; + + Matrix44 S; + S.scale (sOffset); + + Matrix44 X = S * O * inMat * ref; + + return X; +} + +// Compute Translate/Rotate/Scale matrix from matrix A with the Rotate/Scale of Matrix B +// Inputs are : +// -keepRotateA : if true keep rotate from matrix A, use B otherwise +// -keepScaleA : if true keep scale from matrix A, use B otherwise +// -Matrix A +// -Matrix B +// Return Matrix A with tweaked rotation/scale +template +Matrix44 +computeRSMatrix( bool keepRotateA, + bool keepScaleA, + const Matrix44& A, + const Matrix44& B) +{ + Vec3 as, ah, ar, at; + extractSHRT (A, as, ah, ar, at); + + Vec3 bs, bh, br, bt; + extractSHRT (B, bs, bh, br, bt); + + if (!keepRotateA) + ar = br; + + if (!keepScaleA) + as = bs; + + Matrix44 mat; + mat.makeIdentity(); + mat.translate (at); + mat.rotate (ar); + mat.scale (as); + + return mat; +} + + + +//----------------------------------------------------------------------------- +// Implementation for 3x3 Matrix +//------------------------------ + + +template +bool +extractScaling (const Matrix33 &mat, Vec2 &scl, bool exc) +{ + T shr; + Matrix33 M (mat); + + if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) + return false; + + return true; +} + + +template +Matrix33 +sansScaling (const Matrix33 &mat, bool exc) +{ + Vec2 scl; + T shr; + T rot; + Vec2 tran; + + if (! extractSHRT (mat, scl, shr, rot, tran, exc)) + return mat; + + Matrix33 M; + + M.translate (tran); + M.rotate (rot); + M.shear (shr); + + return M; +} + + +template +bool +removeScaling (Matrix33 &mat, bool exc) +{ + Vec2 scl; + T shr; + T rot; + Vec2 tran; + + if (! extractSHRT (mat, scl, shr, rot, tran, exc)) + return false; + + mat.makeIdentity (); + mat.translate (tran); + mat.rotate (rot); + mat.shear (shr); + + return true; +} + + +template +bool +extractScalingAndShear (const Matrix33 &mat, Vec2 &scl, T &shr, bool exc) +{ + Matrix33 M (mat); + + if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) + return false; + + return true; +} + + +template +Matrix33 +sansScalingAndShear (const Matrix33 &mat, bool exc) +{ + Vec2 scl; + T shr; + Matrix33 M (mat); + + if (! extractAndRemoveScalingAndShear (M, scl, shr, exc)) + return mat; + + return M; +} + + +template +bool +removeScalingAndShear (Matrix33 &mat, bool exc) +{ + Vec2 scl; + T shr; + + if (! extractAndRemoveScalingAndShear (mat, scl, shr, exc)) + return false; + + return true; +} + +template +bool +extractAndRemoveScalingAndShear (Matrix33 &mat, + Vec2 &scl, T &shr, bool exc) +{ + Vec2 row[2]; + + row[0] = Vec2 (mat[0][0], mat[0][1]); + row[1] = Vec2 (mat[1][0], mat[1][1]); + + T maxVal = 0; + for (int i=0; i < 2; i++) + for (int j=0; j < 2; j++) + if (Imath::abs (row[i][j]) > maxVal) + maxVal = Imath::abs (row[i][j]); + + // + // We normalize the 2x2 matrix here. + // It was noticed that this can improve numerical stability significantly, + // especially when many of the upper 2x2 matrix's coefficients are very + // close to zero; we correct for this step at the end by multiplying the + // scaling factors by maxVal at the end (shear and rotation are not + // affected by the normalization). + + if (maxVal != 0) + { + for (int i=0; i < 2; i++) + if (! checkForZeroScaleInRow (maxVal, row[i], exc)) + return false; + else + row[i] /= maxVal; + } + + // Compute X scale factor. + scl.x = row[0].length (); + if (! checkForZeroScaleInRow (scl.x, row[0], exc)) + return false; + + // Normalize first row. + row[0] /= scl.x; + + // An XY shear factor will shear the X coord. as the Y coord. changes. + // There are 2 combinations (XY, YX), although we only extract the XY + // shear factor because we can effect the an YX shear factor by + // shearing in XY combined with rotations and scales. + // + // shear matrix < 1, YX, 0, + // XY, 1, 0, + // 0, 0, 1 > + + // Compute XY shear factor and make 2nd row orthogonal to 1st. + shr = row[0].dot (row[1]); + row[1] -= shr * row[0]; + + // Now, compute Y scale. + scl.y = row[1].length (); + if (! checkForZeroScaleInRow (scl.y, row[1], exc)) + return false; + + // Normalize 2nd row and correct the XY shear factor for Y scaling. + row[1] /= scl.y; + shr /= scl.y; + + // At this point, the upper 2x2 matrix in mat is orthonormal. + // Check for a coordinate system flip. If the determinant + // is -1, then flip the rotation matrix and adjust the scale(Y) + // and shear(XY) factors to compensate. + if (row[0][0] * row[1][1] - row[0][1] * row[1][0] < 0) + { + row[1][0] *= -1; + row[1][1] *= -1; + scl[1] *= -1; + shr *= -1; + } + + // Copy over the orthonormal rows into the returned matrix. + // The upper 2x2 matrix in mat is now a rotation matrix. + for (int i=0; i < 2; i++) + { + mat[i][0] = row[i][0]; + mat[i][1] = row[i][1]; + } + + scl *= maxVal; + + return true; +} + + +template +void +extractEuler (const Matrix33 &mat, T &rot) +{ + // + // Normalize the local x and y axes to remove scaling. + // + + Vec2 i (mat[0][0], mat[0][1]); + Vec2 j (mat[1][0], mat[1][1]); + + i.normalize(); + j.normalize(); + + // + // Extract the angle, rot. + // + + rot = - Math::atan2 (j[0], i[0]); +} + + +template +bool +extractSHRT (const Matrix33 &mat, + Vec2 &s, + T &h, + T &r, + Vec2 &t, + bool exc) +{ + Matrix33 rot; + + rot = mat; + if (! extractAndRemoveScalingAndShear (rot, s, h, exc)) + return false; + + extractEuler (rot, r); + + t.x = mat[2][0]; + t.y = mat[2][1]; + + return true; +} + + +template +bool +checkForZeroScaleInRow (const T& scl, + const Vec2 &row, + bool exc /* = true */ ) +{ + for (int i = 0; i < 2; i++) + { + if ((abs (scl) < 1 && abs (row[i]) >= limits::max() * abs (scl))) + { + if (exc) + throw Imath::ZeroScaleExc ("Cannot remove zero scaling " + "from matrix."); + else + return false; + } + } + + return true; +} + + +template +Matrix33 +outerProduct (const Vec3 &a, const Vec3 &b ) +{ + return Matrix33 (a.x*b.x, a.x*b.y, a.x*b.z, + a.y*b.x, a.y*b.y, a.y*b.z, + a.z*b.x, a.z*b.y, a.z*b.z ); +} + + +// Computes the translation and rotation that brings the 'from' points +// as close as possible to the 'to' points under the Frobenius norm. +// To be more specific, let x be the matrix of 'from' points and y be +// the matrix of 'to' points, we want to find the matrix A of the form +// [ R t ] +// [ 0 1 ] +// that minimizes +// || (A*x - y)^T * W * (A*x - y) ||_F +// If doScaling is true, then a uniform scale is allowed also. +template +Imath::M44d +procrustesRotationAndTranslation (const Imath::Vec3* A, // From these + const Imath::Vec3* B, // To these + const T* weights, + const size_t numPoints, + const bool doScaling = false); + +// Unweighted: +template +Imath::M44d +procrustesRotationAndTranslation (const Imath::Vec3* A, + const Imath::Vec3* B, + const size_t numPoints, + const bool doScaling = false); + +// Compute the SVD of a 3x3 matrix using Jacobi transformations. This method +// should be quite accurate (competitive with LAPACK) even for poorly +// conditioned matrices, and because it has been written specifically for the +// 3x3/4x4 case it is much faster than calling out to LAPACK. +// +// The SVD of a 3x3/4x4 matrix A is defined as follows: +// A = U * S * V^T +// where S is the diagonal matrix of singular values and both U and V are +// orthonormal. By convention, the entries S are all positive and sorted from +// the largest to the smallest. However, some uses of this function may +// require that the matrix U*V^T have positive determinant; in this case, we +// may make the smallest singular value negative to ensure that this is +// satisfied. +// +// Currently only available for single- and double-precision matrices. +template +void +jacobiSVD (const Imath::Matrix33& A, + Imath::Matrix33& U, + Imath::Vec3& S, + Imath::Matrix33& V, + const T tol = Imath::limits::epsilon(), + const bool forcePositiveDeterminant = false); + +template +void +jacobiSVD (const Imath::Matrix44& A, + Imath::Matrix44& U, + Imath::Vec4& S, + Imath::Matrix44& V, + const T tol = Imath::limits::epsilon(), + const bool forcePositiveDeterminant = false); + +// Compute the eigenvalues (S) and the eigenvectors (V) of +// a real symmetric matrix using Jacobi transformation. +// +// Jacobi transformation of a 3x3/4x4 matrix A outputs S and V: +// A = V * S * V^T +// where V is orthonormal and S is the diagonal matrix of eigenvalues. +// Input matrix A must be symmetric. A is also modified during +// the computation so that upper diagonal entries of A become zero. +// +template +void +jacobiEigenSolver (Matrix33& A, + Vec3& S, + Matrix33& V, + const T tol); + +template +inline +void +jacobiEigenSolver (Matrix33& A, + Vec3& S, + Matrix33& V) +{ + jacobiEigenSolver(A,S,V,limits::epsilon()); +} + +template +void +jacobiEigenSolver (Matrix44& A, + Vec4& S, + Matrix44& V, + const T tol); + +template +inline +void +jacobiEigenSolver (Matrix44& A, + Vec4& S, + Matrix44& V) +{ + jacobiEigenSolver(A,S,V,limits::epsilon()); +} + +// Compute a eigenvector corresponding to the abs max/min eigenvalue +// of a real symmetric matrix using Jacobi transformation. +template +void +maxEigenVector (TM& A, TV& S); +template +void +minEigenVector (TM& A, TV& S); + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathPlane.h b/3rdparty/openexr/Imath/ImathPlane.h new file mode 100644 index 000000000..aa59e3c7d --- /dev/null +++ b/3rdparty/openexr/Imath/ImathPlane.h @@ -0,0 +1,256 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHPLANE_H +#define INCLUDED_IMATHPLANE_H + +//---------------------------------------------------------------------- +// +// template class Plane3 +// +// The Imath::Plane3<> class represents a half space, so the +// normal may point either towards or away from origin. The +// plane P can be represented by Imath::Plane3 as either p or -p +// corresponding to the two half-spaces on either side of the +// plane. Any function which computes a distance will return +// either negative or positive values for the distance indicating +// which half-space the point is in. Note that reflection, and +// intersection functions will operate as expected. +// +//---------------------------------------------------------------------- + +#include "ImathVec.h" +#include "ImathLine.h" + +namespace Imath { + + +template +class Plane3 +{ + public: + + Vec3 normal; + T distance; + + Plane3() {} + Plane3(const Vec3 &normal, T distance); + Plane3(const Vec3 &point, const Vec3 &normal); + Plane3(const Vec3 &point1, + const Vec3 &point2, + const Vec3 &point3); + + //---------------------- + // Various set methods + //---------------------- + + void set(const Vec3 &normal, + T distance); + + void set(const Vec3 &point, + const Vec3 &normal); + + void set(const Vec3 &point1, + const Vec3 &point2, + const Vec3 &point3 ); + + //---------------------- + // Utilities + //---------------------- + + bool intersect(const Line3 &line, + Vec3 &intersection) const; + + bool intersectT(const Line3 &line, + T ¶meter) const; + + T distanceTo(const Vec3 &) const; + + Vec3 reflectPoint(const Vec3 &) const; + Vec3 reflectVector(const Vec3 &) const; +}; + + +//-------------------- +// Convenient typedefs +//-------------------- + +typedef Plane3 Plane3f; +typedef Plane3 Plane3d; + + +//--------------- +// Implementation +//--------------- + +template +inline Plane3::Plane3(const Vec3 &p0, + const Vec3 &p1, + const Vec3 &p2) +{ + set(p0,p1,p2); +} + +template +inline Plane3::Plane3(const Vec3 &n, T d) +{ + set(n, d); +} + +template +inline Plane3::Plane3(const Vec3 &p, const Vec3 &n) +{ + set(p, n); +} + +template +inline void Plane3::set(const Vec3& point1, + const Vec3& point2, + const Vec3& point3) +{ + normal = (point2 - point1) % (point3 - point1); + normal.normalize(); + distance = normal ^ point1; +} + +template +inline void Plane3::set(const Vec3& point, const Vec3& n) +{ + normal = n; + normal.normalize(); + distance = normal ^ point; +} + +template +inline void Plane3::set(const Vec3& n, T d) +{ + normal = n; + normal.normalize(); + distance = d; +} + +template +inline T Plane3::distanceTo(const Vec3 &point) const +{ + return (point ^ normal) - distance; +} + +template +inline Vec3 Plane3::reflectPoint(const Vec3 &point) const +{ + return normal * distanceTo(point) * -2.0 + point; +} + + +template +inline Vec3 Plane3::reflectVector(const Vec3 &v) const +{ + return normal * (normal ^ v) * 2.0 - v; +} + + +template +inline bool Plane3::intersect(const Line3& line, Vec3& point) const +{ + T d = normal ^ line.dir; + if ( d == 0.0 ) return false; + T t = - ((normal ^ line.pos) - distance) / d; + point = line(t); + return true; +} + +template +inline bool Plane3::intersectT(const Line3& line, T &t) const +{ + T d = normal ^ line.dir; + if ( d == 0.0 ) return false; + t = - ((normal ^ line.pos) - distance) / d; + return true; +} + +template +std::ostream &operator<< (std::ostream &o, const Plane3 &plane) +{ + return o << "(" << plane.normal << ", " << plane.distance + << ")"; +} + +template +Plane3 operator* (const Plane3 &plane, const Matrix44 &M) +{ + // T + // -1 + // Could also compute M but that would suck. + // + + Vec3 dir1 = Vec3 (1, 0, 0) % plane.normal; + T dir1Len = dir1 ^ dir1; + + Vec3 tmp = Vec3 (0, 1, 0) % plane.normal; + T tmpLen = tmp ^ tmp; + + if (tmpLen > dir1Len) + { + dir1 = tmp; + dir1Len = tmpLen; + } + + tmp = Vec3 (0, 0, 1) % plane.normal; + tmpLen = tmp ^ tmp; + + if (tmpLen > dir1Len) + { + dir1 = tmp; + } + + Vec3 dir2 = dir1 % plane.normal; + Vec3 point = plane.distance * plane.normal; + + return Plane3 ( point * M, + (point + dir2) * M, + (point + dir1) * M ); +} + +template +Plane3 operator- (const Plane3 &plane) +{ + return Plane3(-plane.normal,-plane.distance); +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathPlatform.h b/3rdparty/openexr/Imath/ImathPlatform.h new file mode 100644 index 000000000..91e82cc20 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathPlatform.h @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHPLATFORM_H +#define INCLUDED_IMATHPLATFORM_H + +//---------------------------------------------------------------------------- +// +// ImathPlatform.h +// +// This file contains functions and constants which aren't +// provided by the system libraries, compilers, or includes on +// certain platforms. +// +//---------------------------------------------------------------------------- + +#include + +#ifndef M_PI + #define M_PI 3.14159265358979323846 +#endif + +#ifndef M_PI_2 + #define M_PI_2 1.57079632679489661923 // pi/2 +#endif + + +//----------------------------------------------------------------------------- +// +// Some, but not all, C++ compilers support the C99 restrict +// keyword or some variant of it, for example, __restrict. +// +//----------------------------------------------------------------------------- + +#if defined __GNUC__ + + // + // supports __restrict + // + + #define IMATH_RESTRICT __restrict + +#elif defined (__INTEL_COMPILER) || \ + defined(__ICL) || \ + defined(__ICC) || \ + defined(__ECC) + + // + // supports restrict + // + + #define IMATH_RESTRICT restrict + +#elif defined __sgi + + // + // supports restrict + // + + #define IMATH_RESTRICT restrict + +#elif defined _MSC_VER + + // + // supports __restrict + // + +// #define IMATH_RESTRICT __restrict + #define IMATH_RESTRICT + +#else + + // + // restrict / __restrict not supported + // + + #define IMATH_RESTRICT + +#endif + +#endif // INCLUDED_IMATHPLATFORM_H diff --git a/3rdparty/openexr/Imath/ImathQuat.h b/3rdparty/openexr/Imath/ImathQuat.h new file mode 100644 index 000000000..a6ee936e5 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathQuat.h @@ -0,0 +1,963 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHQUAT_H +#define INCLUDED_IMATHQUAT_H + +//---------------------------------------------------------------------- +// +// template class Quat +// +// "Quaternions came from Hamilton ... and have been an unmixed +// evil to those who have touched them in any way. Vector is a +// useless survival ... and has never been of the slightest use +// to any creature." +// +// - Lord Kelvin +// +// This class implements the quaternion numerical type -- you +// will probably want to use this class to represent orientations +// in R3 and to convert between various euler angle reps. You +// should probably use Imath::Euler<> for that. +// +//---------------------------------------------------------------------- + +#include "ImathExc.h" +#include "ImathMatrix.h" + +#include + +namespace Imath { + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +// Disable MS VC++ warnings about conversion from double to float +#pragma warning(disable:4244) +#endif + +template +class Quat +{ + public: + + T r; // real part + Vec3 v; // imaginary vector + + + //----------------------------------------------------- + // Constructors - default constructor is identity quat + //----------------------------------------------------- + + Quat (); + + template + Quat (const Quat &q); + + Quat (T s, T i, T j, T k); + + Quat (T s, Vec3 d); + + static Quat identity (); + + + //------------------------------------------------- + // Basic Algebra - Operators and Methods + // The operator return values are *NOT* normalized + // + // operator^ and euclideanInnnerProduct() both + // implement the 4D dot product + // + // operator/ uses the inverse() quaternion + // + // operator~ is conjugate -- if (S+V) is quat then + // the conjugate (S+V)* == (S-V) + // + // some operators (*,/,*=,/=) treat the quat as + // a 4D vector when one of the operands is scalar + //------------------------------------------------- + + const Quat & operator = (const Quat &q); + const Quat & operator *= (const Quat &q); + const Quat & operator *= (T t); + const Quat & operator /= (const Quat &q); + const Quat & operator /= (T t); + const Quat & operator += (const Quat &q); + const Quat & operator -= (const Quat &q); + T & operator [] (int index); // as 4D vector + T operator [] (int index) const; + + template bool operator == (const Quat &q) const; + template bool operator != (const Quat &q) const; + + Quat & invert (); // this -> 1 / this + Quat inverse () const; + Quat & normalize (); // returns this + Quat normalized () const; + T length () const; // in R4 + Vec3 rotateVector(const Vec3 &original) const; + T euclideanInnerProduct(const Quat &q) const; + + //----------------------- + // Rotation conversion + //----------------------- + + Quat & setAxisAngle (const Vec3 &axis, T radians); + + Quat & setRotation (const Vec3 &fromDirection, + const Vec3 &toDirection); + + T angle () const; + Vec3 axis () const; + + Matrix33 toMatrix33 () const; + Matrix44 toMatrix44 () const; + + Quat log () const; + Quat exp () const; + + + private: + + void setRotationInternal (const Vec3 &f0, + const Vec3 &t0, + Quat &q); +}; + + +template +Quat slerp (const Quat &q1, const Quat &q2, T t); + +template +Quat slerpShortestArc + (const Quat &q1, const Quat &q2, T t); + + +template +Quat squad (const Quat &q1, const Quat &q2, + const Quat &qa, const Quat &qb, T t); + +template +void intermediate (const Quat &q0, const Quat &q1, + const Quat &q2, const Quat &q3, + Quat &qa, Quat &qb); + +template +Matrix33 operator * (const Matrix33 &M, const Quat &q); + +template +Matrix33 operator * (const Quat &q, const Matrix33 &M); + +template +std::ostream & operator << (std::ostream &o, const Quat &q); + +template +Quat operator * (const Quat &q1, const Quat &q2); + +template +Quat operator / (const Quat &q1, const Quat &q2); + +template +Quat operator / (const Quat &q, T t); + +template +Quat operator * (const Quat &q, T t); + +template +Quat operator * (T t, const Quat &q); + +template +Quat operator + (const Quat &q1, const Quat &q2); + +template +Quat operator - (const Quat &q1, const Quat &q2); + +template +Quat operator ~ (const Quat &q); + +template +Quat operator - (const Quat &q); + +template +Vec3 operator * (const Vec3 &v, const Quat &q); + + +//-------------------- +// Convenient typedefs +//-------------------- + +typedef Quat Quatf; +typedef Quat Quatd; + + +//--------------- +// Implementation +//--------------- + +template +inline +Quat::Quat (): r (1), v (0, 0, 0) +{ + // empty +} + + +template +template +inline +Quat::Quat (const Quat &q): r (q.r), v (q.v) +{ + // empty +} + + +template +inline +Quat::Quat (T s, T i, T j, T k): r (s), v (i, j, k) +{ + // empty +} + + +template +inline +Quat::Quat (T s, Vec3 d): r (s), v (d) +{ + // empty +} + + +template +inline Quat +Quat::identity () +{ + return Quat(); +} + +template +inline const Quat & +Quat::operator = (const Quat &q) +{ + r = q.r; + v = q.v; + return *this; +} + + +template +inline const Quat & +Quat::operator *= (const Quat &q) +{ + T rtmp = r * q.r - (v ^ q.v); + v = r * q.v + v * q.r + v % q.v; + r = rtmp; + return *this; +} + + +template +inline const Quat & +Quat::operator *= (T t) +{ + r *= t; + v *= t; + return *this; +} + + +template +inline const Quat & +Quat::operator /= (const Quat &q) +{ + *this = *this * q.inverse(); + return *this; +} + + +template +inline const Quat & +Quat::operator /= (T t) +{ + r /= t; + v /= t; + return *this; +} + + +template +inline const Quat & +Quat::operator += (const Quat &q) +{ + r += q.r; + v += q.v; + return *this; +} + + +template +inline const Quat & +Quat::operator -= (const Quat &q) +{ + r -= q.r; + v -= q.v; + return *this; +} + + +template +inline T & +Quat::operator [] (int index) +{ + return index ? v[index - 1] : r; +} + + +template +inline T +Quat::operator [] (int index) const +{ + return index ? v[index - 1] : r; +} + + +template +template +inline bool +Quat::operator == (const Quat &q) const +{ + return r == q.r && v == q.v; +} + + +template +template +inline bool +Quat::operator != (const Quat &q) const +{ + return r != q.r || v != q.v; +} + + +template +inline T +operator ^ (const Quat& q1 ,const Quat& q2) +{ + return q1.r * q2.r + (q1.v ^ q2.v); +} + + +template +inline T +Quat::length () const +{ + return Math::sqrt (r * r + (v ^ v)); +} + + +template +inline Quat & +Quat::normalize () +{ + if (T l = length()) + { + r /= l; + v /= l; + } + else + { + r = 1; + v = Vec3 (0); + } + + return *this; +} + + +template +inline Quat +Quat::normalized () const +{ + if (T l = length()) + return Quat (r / l, v / l); + + return Quat(); +} + + +template +inline Quat +Quat::inverse () const +{ + // + // 1 Q* + // - = ---- where Q* is conjugate (operator~) + // Q Q* Q and (Q* Q) == Q ^ Q (4D dot) + // + + T qdot = *this ^ *this; + return Quat (r / qdot, -v / qdot); +} + + +template +inline Quat & +Quat::invert () +{ + T qdot = (*this) ^ (*this); + r /= qdot; + v = -v / qdot; + return *this; +} + + +template +inline Vec3 +Quat::rotateVector(const Vec3& original) const +{ + // + // Given a vector p and a quaternion q (aka this), + // calculate p' = qpq* + // + // Assumes unit quaternions (because non-unit + // quaternions cannot be used to rotate vectors + // anyway). + // + + Quat vec (0, original); // temporarily promote grade of original + Quat inv (*this); + inv.v *= -1; // unit multiplicative inverse + Quat result = *this * vec * inv; + return result.v; +} + + +template +inline T +Quat::euclideanInnerProduct (const Quat &q) const +{ + return r * q.r + v.x * q.v.x + v.y * q.v.y + v.z * q.v.z; +} + + +template +T +angle4D (const Quat &q1, const Quat &q2) +{ + // + // Compute the angle between two quaternions, + // interpreting the quaternions as 4D vectors. + // + + Quat d = q1 - q2; + T lengthD = Math::sqrt (d ^ d); + + Quat s = q1 + q2; + T lengthS = Math::sqrt (s ^ s); + + return 2 * Math::atan2 (lengthD, lengthS); +} + + +template +Quat +slerp (const Quat &q1, const Quat &q2, T t) +{ + // + // Spherical linear interpolation. + // Assumes q1 and q2 are normalized and that q1 != -q2. + // + // This method does *not* interpolate along the shortest + // arc between q1 and q2. If you desire interpolation + // along the shortest arc, and q1^q2 is negative, then + // consider calling slerpShortestArc(), below, or flipping + // the second quaternion explicitly. + // + // The implementation of squad() depends on a slerp() + // that interpolates as is, without the automatic + // flipping. + // + // Don Hatch explains the method we use here on his + // web page, The Right Way to Calculate Stuff, at + // http://www.plunk.org/~hatch/rightway.php + // + + T a = angle4D (q1, q2); + T s = 1 - t; + + Quat q = sinx_over_x (s * a) / sinx_over_x (a) * s * q1 + + sinx_over_x (t * a) / sinx_over_x (a) * t * q2; + + return q.normalized(); +} + + +template +Quat +slerpShortestArc (const Quat &q1, const Quat &q2, T t) +{ + // + // Spherical linear interpolation along the shortest + // arc from q1 to either q2 or -q2, whichever is closer. + // Assumes q1 and q2 are unit quaternions. + // + + if ((q1 ^ q2) >= 0) + return slerp (q1, q2, t); + else + return slerp (q1, -q2, t); +} + + +template +Quat +spline (const Quat &q0, const Quat &q1, + const Quat &q2, const Quat &q3, + T t) +{ + // + // Spherical Cubic Spline Interpolation - + // from Advanced Animation and Rendering + // Techniques by Watt and Watt, Page 366: + // A spherical curve is constructed using three + // spherical linear interpolations of a quadrangle + // of unit quaternions: q1, qa, qb, q2. + // Given a set of quaternion keys: q0, q1, q2, q3, + // this routine does the interpolation between + // q1 and q2 by constructing two intermediate + // quaternions: qa and qb. The qa and qb are + // computed by the intermediate function to + // guarantee the continuity of tangents across + // adjacent cubic segments. The qa represents in-tangent + // for q1 and the qb represents the out-tangent for q2. + // + // The q1 q2 is the cubic segment being interpolated. + // The q0 is from the previous adjacent segment and q3 is + // from the next adjacent segment. The q0 and q3 are used + // in computing qa and qb. + // + + Quat qa = intermediate (q0, q1, q2); + Quat qb = intermediate (q1, q2, q3); + Quat result = squad (q1, qa, qb, q2, t); + + return result; +} + + +template +Quat +squad (const Quat &q1, const Quat &qa, + const Quat &qb, const Quat &q2, + T t) +{ + // + // Spherical Quadrangle Interpolation - + // from Advanced Animation and Rendering + // Techniques by Watt and Watt, Page 366: + // It constructs a spherical cubic interpolation as + // a series of three spherical linear interpolations + // of a quadrangle of unit quaternions. + // + + Quat r1 = slerp (q1, q2, t); + Quat r2 = slerp (qa, qb, t); + Quat result = slerp (r1, r2, 2 * t * (1 - t)); + + return result; +} + + +template +Quat +intermediate (const Quat &q0, const Quat &q1, const Quat &q2) +{ + // + // From advanced Animation and Rendering + // Techniques by Watt and Watt, Page 366: + // computing the inner quadrangle + // points (qa and qb) to guarantee tangent + // continuity. + // + + Quat q1inv = q1.inverse(); + Quat c1 = q1inv * q2; + Quat c2 = q1inv * q0; + Quat c3 = (T) (-0.25) * (c2.log() + c1.log()); + Quat qa = q1 * c3.exp(); + qa.normalize(); + return qa; +} + + +template +inline Quat +Quat::log () const +{ + // + // For unit quaternion, from Advanced Animation and + // Rendering Techniques by Watt and Watt, Page 366: + // + + T theta = Math::acos (std::min (r, (T) 1.0)); + + if (theta == 0) + return Quat (0, v); + + T sintheta = Math::sin (theta); + + T k; + if (abs (sintheta) < 1 && abs (theta) >= limits::max() * abs (sintheta)) + k = 1; + else + k = theta / sintheta; + + return Quat ((T) 0, v.x * k, v.y * k, v.z * k); +} + + +template +inline Quat +Quat::exp () const +{ + // + // For pure quaternion (zero scalar part): + // from Advanced Animation and Rendering + // Techniques by Watt and Watt, Page 366: + // + + T theta = v.length(); + T sintheta = Math::sin (theta); + + T k; + if (abs (theta) < 1 && abs (sintheta) >= limits::max() * abs (theta)) + k = 1; + else + k = sintheta / theta; + + T costheta = Math::cos (theta); + + return Quat (costheta, v.x * k, v.y * k, v.z * k); +} + + +template +inline T +Quat::angle () const +{ + return 2 * Math::atan2 (v.length(), r); +} + + +template +inline Vec3 +Quat::axis () const +{ + return v.normalized(); +} + + +template +inline Quat & +Quat::setAxisAngle (const Vec3 &axis, T radians) +{ + r = Math::cos (radians / 2); + v = axis.normalized() * Math::sin (radians / 2); + return *this; +} + + +template +Quat & +Quat::setRotation (const Vec3 &from, const Vec3 &to) +{ + // + // Create a quaternion that rotates vector from into vector to, + // such that the rotation is around an axis that is the cross + // product of from and to. + // + // This function calls function setRotationInternal(), which is + // numerically accurate only for rotation angles that are not much + // greater than pi/2. In order to achieve good accuracy for angles + // greater than pi/2, we split large angles in half, and rotate in + // two steps. + // + + // + // Normalize from and to, yielding f0 and t0. + // + + Vec3 f0 = from.normalized(); + Vec3 t0 = to.normalized(); + + if ((f0 ^ t0) >= 0) + { + // + // The rotation angle is less than or equal to pi/2. + // + + setRotationInternal (f0, t0, *this); + } + else + { + // + // The angle is greater than pi/2. After computing h0, + // which is halfway between f0 and t0, we rotate first + // from f0 to h0, then from h0 to t0. + // + + Vec3 h0 = (f0 + t0).normalized(); + + if ((h0 ^ h0) != 0) + { + setRotationInternal (f0, h0, *this); + + Quat q; + setRotationInternal (h0, t0, q); + + *this *= q; + } + else + { + // + // f0 and t0 point in exactly opposite directions. + // Pick an arbitrary axis that is orthogonal to f0, + // and rotate by pi. + // + + r = T (0); + + Vec3 f02 = f0 * f0; + + if (f02.x <= f02.y && f02.x <= f02.z) + v = (f0 % Vec3 (1, 0, 0)).normalized(); + else if (f02.y <= f02.z) + v = (f0 % Vec3 (0, 1, 0)).normalized(); + else + v = (f0 % Vec3 (0, 0, 1)).normalized(); + } + } + + return *this; +} + + +template +void +Quat::setRotationInternal (const Vec3 &f0, const Vec3 &t0, Quat &q) +{ + // + // The following is equivalent to setAxisAngle(n,2*phi), + // where the rotation axis, n, is orthogonal to the f0 and + // t0 vectors, and 2*phi is the angle between f0 and t0. + // + // This function is called by setRotation(), above; it assumes + // that f0 and t0 are normalized and that the angle between + // them is not much greater than pi/2. This function becomes + // numerically inaccurate if f0 and t0 point into nearly + // opposite directions. + // + + // + // Find a normalized vector, h0, that is halfway between f0 and t0. + // The angle between f0 and h0 is phi. + // + + Vec3 h0 = (f0 + t0).normalized(); + + // + // Store the rotation axis and rotation angle. + // + + q.r = f0 ^ h0; // f0 ^ h0 == cos (phi) + q.v = f0 % h0; // (f0 % h0).length() == sin (phi) +} + + +template +Matrix33 +Quat::toMatrix33() const +{ + return Matrix33 (1 - 2 * (v.y * v.y + v.z * v.z), + 2 * (v.x * v.y + v.z * r), + 2 * (v.z * v.x - v.y * r), + + 2 * (v.x * v.y - v.z * r), + 1 - 2 * (v.z * v.z + v.x * v.x), + 2 * (v.y * v.z + v.x * r), + + 2 * (v.z * v.x + v.y * r), + 2 * (v.y * v.z - v.x * r), + 1 - 2 * (v.y * v.y + v.x * v.x)); +} + +template +Matrix44 +Quat::toMatrix44() const +{ + return Matrix44 (1 - 2 * (v.y * v.y + v.z * v.z), + 2 * (v.x * v.y + v.z * r), + 2 * (v.z * v.x - v.y * r), + 0, + 2 * (v.x * v.y - v.z * r), + 1 - 2 * (v.z * v.z + v.x * v.x), + 2 * (v.y * v.z + v.x * r), + 0, + 2 * (v.z * v.x + v.y * r), + 2 * (v.y * v.z - v.x * r), + 1 - 2 * (v.y * v.y + v.x * v.x), + 0, + 0, + 0, + 0, + 1); +} + + +template +inline Matrix33 +operator * (const Matrix33 &M, const Quat &q) +{ + return M * q.toMatrix33(); +} + + +template +inline Matrix33 +operator * (const Quat &q, const Matrix33 &M) +{ + return q.toMatrix33() * M; +} + + +template +std::ostream & +operator << (std::ostream &o, const Quat &q) +{ + return o << "(" << q.r + << " " << q.v.x + << " " << q.v.y + << " " << q.v.z + << ")"; +} + + +template +inline Quat +operator * (const Quat &q1, const Quat &q2) +{ + return Quat (q1.r * q2.r - (q1.v ^ q2.v), + q1.r * q2.v + q1.v * q2.r + q1.v % q2.v); +} + + +template +inline Quat +operator / (const Quat &q1, const Quat &q2) +{ + return q1 * q2.inverse(); +} + + +template +inline Quat +operator / (const Quat &q, T t) +{ + return Quat (q.r / t, q.v / t); +} + + +template +inline Quat +operator * (const Quat &q, T t) +{ + return Quat (q.r * t, q.v * t); +} + + +template +inline Quat +operator * (T t, const Quat &q) +{ + return Quat (q.r * t, q.v * t); +} + + +template +inline Quat +operator + (const Quat &q1, const Quat &q2) +{ + return Quat (q1.r + q2.r, q1.v + q2.v); +} + + +template +inline Quat +operator - (const Quat &q1, const Quat &q2) +{ + return Quat (q1.r - q2.r, q1.v - q2.v); +} + + +template +inline Quat +operator ~ (const Quat &q) +{ + return Quat (q.r, -q.v); +} + + +template +inline Quat +operator - (const Quat &q) +{ + return Quat (-q.r, -q.v); +} + + +template +inline Vec3 +operator * (const Vec3 &v, const Quat &q) +{ + Vec3 a = q.v % v; + Vec3 b = q.v % a; + return v + T (2) * (q.r * a + b); +} + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +#pragma warning(default:4244) +#endif + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathRandom.cpp b/3rdparty/openexr/Imath/ImathRandom.cpp new file mode 100644 index 000000000..b261b39f0 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathRandom.cpp @@ -0,0 +1,195 @@ + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + +//----------------------------------------------------------------------------- +// +// Routines that generate pseudo-random numbers compatible +// with the standard erand48(), nrand48(), etc. functions. +// +//----------------------------------------------------------------------------- + +#include "ImathRandom.h" +#include "ImathInt64.h" + +namespace Imath { +namespace { + +// +// Static state used by Imath::drand48(), Imath::lrand48() and Imath::srand48() +// + +unsigned short staticState[3] = {0, 0, 0}; + + +void +rand48Next (unsigned short state[3]) +{ + // + // drand48() and friends are all based on a linear congruential + // sequence, + // + // x[n+1] = (a * x[n] + c) % m, + // + // where a and c are as specified below, and m == (1 << 48) + // + + static const Int64 a = Int64 (0x5deece66dLL); + static const Int64 c = Int64 (0xbLL); + + // + // Assemble the 48-bit value x[n] from the + // three 16-bit values stored in state. + // + + Int64 x = (Int64 (state[2]) << 32) | + (Int64 (state[1]) << 16) | + Int64 (state[0]); + + // + // Compute x[n+1], except for the "modulo m" part. + // + + x = a * x + c; + + // + // Disassemble the 48 least significant bits of x[n+1] into + // three 16-bit values. Discard the 16 most significant bits; + // this takes care of the "modulo m" operation. + // + // We assume that sizeof (unsigned short) == 2. + // + + state[2] = (unsigned short)(x >> 32); + state[1] = (unsigned short)(x >> 16); + state[0] = (unsigned short)(x); +} + +} // namespace + + +double +erand48 (unsigned short state[3]) +{ + // + // Generate double-precision floating-point values between 0.0 and 1.0: + // + // The exponent is set to 0x3ff, which indicates a value greater + // than or equal to 1.0, and less than 2.0. The 48 most significant + // bits of the significand (mantissa) are filled with pseudo-random + // bits generated by rand48Next(). The remaining 4 bits are a copy + // of the 4 most significant bits of the significand. This results + // in bit patterns between 0x3ff0000000000000 and 0x3fffffffffffffff, + // which correspond to uniformly distributed floating-point values + // between 1.0 and 1.99999999999999978. Subtracting 1.0 from those + // values produces numbers between 0.0 and 0.99999999999999978, that + // is, between 0.0 and 1.0-DBL_EPSILON. + // + + rand48Next (state); + + union {double d; Int64 i;} u; + + u.i = (Int64 (0x3ff) << 52) | // sign and exponent + (Int64 (state[2]) << 36) | // significand + (Int64 (state[1]) << 20) | + (Int64 (state[0]) << 4) | + (Int64 (state[2]) >> 12); + + return u.d - 1; +} + + +double +drand48 () +{ + return Imath::erand48 (staticState); +} + + +long int +nrand48 (unsigned short state[3]) +{ + // + // Generate uniformly distributed integers between 0 and 0x7fffffff. + // + + rand48Next (state); + + return ((long int) (state[2]) << 15) | + ((long int) (state[1]) >> 1); +} + + +long int +lrand48 () +{ + return Imath::nrand48 (staticState); +} + + +void +srand48 (long int seed) +{ + staticState[2] = (unsigned short)(seed >> 16); + staticState[1] = (unsigned short)(seed); + staticState[0] = 0x330e; +} + + +float +Rand32::nextf () +{ + // + // Generate single-precision floating-point values between 0.0 and 1.0: + // + // The exponent is set to 0x7f, which indicates a value greater than + // or equal to 1.0, and less than 2.0. The 23 bits of the significand + // (mantissa) are filled with pseudo-random bits generated by + // Rand32::next(). This results in in bit patterns between 0x3f800000 + // and 0x3fffffff, which correspond to uniformly distributed floating- + // point values between 1.0 and 1.99999988. Subtracting 1.0 from + // those values produces numbers between 0.0 and 0.99999988, that is, + // between 0.0 and 1.0-FLT_EPSILON. + // + + next (); + + union {float f; unsigned int i;} u; + + u.i = 0x3f800000 | (_state & 0x7fffff); + return u.f - 1; +} + +} // namespace Imath diff --git a/3rdparty/openexr/Imath/ImathRandom.h b/3rdparty/openexr/Imath/ImathRandom.h new file mode 100644 index 000000000..435197515 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathRandom.h @@ -0,0 +1,398 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHRANDOM_H +#define INCLUDED_IMATHRANDOM_H + +//----------------------------------------------------------------------------- +// +// Generators for uniformly distributed pseudo-random numbers and +// functions that use those generators to generate numbers with +// non-uniform distributions: +// +// class Rand32 +// class Rand48 +// solidSphereRand() +// hollowSphereRand() +// gaussRand() +// gaussSphereRand() +// +// Note: class Rand48() calls erand48() and nrand48(), which are not +// available on all operating systems. For compatibility we include +// our own versions of erand48() and nrand48(). Our functions have +// been reverse-engineered from the corresponding Unix/Linux man page. +// +//----------------------------------------------------------------------------- + +#include +#include + +namespace Imath { + +//----------------------------------------------- +// Fast random-number generator that generates +// a uniformly distributed sequence with a period +// length of 2^32. +//----------------------------------------------- + +class Rand32 +{ + public: + + //------------ + // Constructor + //------------ + + Rand32 (unsigned long int seed = 0); + + + //-------------------------------- + // Re-initialize with a given seed + //-------------------------------- + + void init (unsigned long int seed); + + + //---------------------------------------------------------- + // Get the next value in the sequence (range: [false, true]) + //---------------------------------------------------------- + + bool nextb (); + + + //--------------------------------------------------------------- + // Get the next value in the sequence (range: [0 ... 0xffffffff]) + //--------------------------------------------------------------- + + unsigned long int nexti (); + + + //------------------------------------------------------ + // Get the next value in the sequence (range: [0 ... 1[) + //------------------------------------------------------ + + float nextf (); + + + //------------------------------------------------------------------- + // Get the next value in the sequence (range [rangeMin ... rangeMax[) + //------------------------------------------------------------------- + + float nextf (float rangeMin, float rangeMax); + + + private: + + void next (); + + unsigned long int _state; +}; + + +//-------------------------------------------------------- +// Random-number generator based on the C Standard Library +// functions erand48(), nrand48() & company; generates a +// uniformly distributed sequence. +//-------------------------------------------------------- + +class Rand48 +{ + public: + + //------------ + // Constructor + //------------ + + Rand48 (unsigned long int seed = 0); + + + //-------------------------------- + // Re-initialize with a given seed + //-------------------------------- + + void init (unsigned long int seed); + + + //---------------------------------------------------------- + // Get the next value in the sequence (range: [false, true]) + //---------------------------------------------------------- + + bool nextb (); + + + //--------------------------------------------------------------- + // Get the next value in the sequence (range: [0 ... 0x7fffffff]) + //--------------------------------------------------------------- + + long int nexti (); + + + //------------------------------------------------------ + // Get the next value in the sequence (range: [0 ... 1[) + //------------------------------------------------------ + + double nextf (); + + + //------------------------------------------------------------------- + // Get the next value in the sequence (range [rangeMin ... rangeMax[) + //------------------------------------------------------------------- + + double nextf (double rangeMin, double rangeMax); + + + private: + + unsigned short int _state[3]; +}; + + +//------------------------------------------------------------ +// Return random points uniformly distributed in a sphere with +// radius 1 around the origin (distance from origin <= 1). +//------------------------------------------------------------ + +template +Vec +solidSphereRand (Rand &rand); + + +//------------------------------------------------------------- +// Return random points uniformly distributed on the surface of +// a sphere with radius 1 around the origin. +//------------------------------------------------------------- + +template +Vec +hollowSphereRand (Rand &rand); + + +//----------------------------------------------- +// Return random numbers with a normal (Gaussian) +// distribution with zero mean and unit variance. +//----------------------------------------------- + +template +float +gaussRand (Rand &rand); + + +//---------------------------------------------------- +// Return random points whose distance from the origin +// has a normal (Gaussian) distribution with zero mean +// and unit variance. +//---------------------------------------------------- + +template +Vec +gaussSphereRand (Rand &rand); + + +//--------------------------------- +// erand48(), nrand48() and friends +//--------------------------------- + +double erand48 (unsigned short state[3]); +double drand48 (); +long int nrand48 (unsigned short state[3]); +long int lrand48 (); +void srand48 (long int seed); + + +//--------------- +// Implementation +//--------------- + + +inline void +Rand32::init (unsigned long int seed) +{ + _state = (seed * 0xa5a573a5L) ^ 0x5a5a5a5aL; +} + + +inline +Rand32::Rand32 (unsigned long int seed) +{ + init (seed); +} + + +inline void +Rand32::next () +{ + _state = 1664525L * _state + 1013904223L; +} + + +inline bool +Rand32::nextb () +{ + next (); + // Return the 31st (most significant) bit, by and-ing with 2 ^ 31. + return !!(_state & 2147483648UL); +} + + +inline unsigned long int +Rand32::nexti () +{ + next (); + return _state & 0xffffffff; +} + + +inline float +Rand32::nextf (float rangeMin, float rangeMax) +{ + float f = nextf(); + return rangeMin * (1 - f) + rangeMax * f; +} + + +inline void +Rand48::init (unsigned long int seed) +{ + seed = (seed * 0xa5a573a5L) ^ 0x5a5a5a5aL; + + _state[0] = (unsigned short int) (seed & 0xFFFF); + _state[1] = (unsigned short int) ((seed >> 16) & 0xFFFF); + _state[2] = (unsigned short int) (seed & 0xFFFF); +} + + +inline +Rand48::Rand48 (unsigned long int seed) +{ + init (seed); +} + + +inline bool +Rand48::nextb () +{ + return Imath::nrand48 (_state) & 1; +} + + +inline long int +Rand48::nexti () +{ + return Imath::nrand48 (_state); +} + + +inline double +Rand48::nextf () +{ + return Imath::erand48 (_state); +} + + +inline double +Rand48::nextf (double rangeMin, double rangeMax) +{ + double f = nextf(); + return rangeMin * (1 - f) + rangeMax * f; +} + + +template +Vec +solidSphereRand (Rand &rand) +{ + Vec v; + + do + { + for (unsigned int i = 0; i < Vec::dimensions(); i++) + v[i] = (typename Vec::BaseType) rand.nextf (-1, 1); + } + while (v.length2() > 1); + + return v; +} + + +template +Vec +hollowSphereRand (Rand &rand) +{ + Vec v; + typename Vec::BaseType length; + + do + { + for (unsigned int i = 0; i < Vec::dimensions(); i++) + v[i] = (typename Vec::BaseType) rand.nextf (-1, 1); + + length = v.length(); + } + while (length > 1 || length == 0); + + return v / length; +} + + +template +float +gaussRand (Rand &rand) +{ + float x; // Note: to avoid numerical problems with very small + float y; // numbers, we make these variables singe-precision + float length2; // floats, but later we call the double-precision log() + // and sqrt() functions instead of logf() and sqrtf(). + do + { + x = float (rand.nextf (-1, 1)); + y = float (rand.nextf (-1, 1)); + length2 = x * x + y * y; + } + while (length2 >= 1 || length2 == 0); + + return x * sqrt (-2 * log (double (length2)) / length2); +} + + +template +Vec +gaussSphereRand (Rand &rand) +{ + return hollowSphereRand (rand) * gaussRand (rand); +} + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathRoots.h b/3rdparty/openexr/Imath/ImathRoots.h new file mode 100644 index 000000000..d915c6329 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathRoots.h @@ -0,0 +1,219 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHROOTS_H +#define INCLUDED_IMATHROOTS_H + +//--------------------------------------------------------------------- +// +// Functions to solve linear, quadratic or cubic equations +// +//--------------------------------------------------------------------- + +#include +#include + +namespace Imath { + +//-------------------------------------------------------------------------- +// Find the real solutions of a linear, quadratic or cubic equation: +// +// function equation solved +// +// solveLinear (a, b, x) a * x + b == 0 +// solveQuadratic (a, b, c, x) a * x*x + b * x + c == 0 +// solveNormalizedCubic (r, s, t, x) x*x*x + r * x*x + s * x + t == 0 +// solveCubic (a, b, c, d, x) a * x*x*x + b * x*x + c * x + d == 0 +// +// Return value: +// +// 3 three real solutions, stored in x[0], x[1] and x[2] +// 2 two real solutions, stored in x[0] and x[1] +// 1 one real solution, stored in x[1] +// 0 no real solutions +// -1 all real numbers are solutions +// +// Notes: +// +// * It is possible that an equation has real solutions, but that the +// solutions (or some intermediate result) are not representable. +// In this case, either some of the solutions returned are invalid +// (nan or infinity), or, if floating-point exceptions have been +// enabled with Iex::mathExcOn(), an Iex::MathExc exception is +// thrown. +// +// * Cubic equations are solved using Cardano's Formula; even though +// only real solutions are produced, some intermediate results are +// complex (std::complex). +// +//-------------------------------------------------------------------------- + +template int solveLinear (T a, T b, T &x); +template int solveQuadratic (T a, T b, T c, T x[2]); +template int solveNormalizedCubic (T r, T s, T t, T x[3]); +template int solveCubic (T a, T b, T c, T d, T x[3]); + + +//--------------- +// Implementation +//--------------- + +template +int +solveLinear (T a, T b, T &x) +{ + if (a != 0) + { + x = -b / a; + return 1; + } + else if (b != 0) + { + return 0; + } + else + { + return -1; + } +} + + +template +int +solveQuadratic (T a, T b, T c, T x[2]) +{ + if (a == 0) + { + return solveLinear (b, c, x[0]); + } + else + { + T D = b * b - 4 * a * c; + + if (D > 0) + { + T s = Math::sqrt (D); + T q = -(b + (b > 0 ? 1 : -1) * s) / T(2); + + x[0] = q / a; + x[1] = c / q; + return 2; + } + if (D == 0) + { + x[0] = -b / (2 * a); + return 1; + } + else + { + return 0; + } + } +} + + +template +int +solveNormalizedCubic (T r, T s, T t, T x[3]) +{ + T p = (3 * s - r * r) / 3; + T q = 2 * r * r * r / 27 - r * s / 3 + t; + T p3 = p / 3; + T q2 = q / 2; + T D = p3 * p3 * p3 + q2 * q2; + + if (D == 0 && p3 == 0) + { + x[0] = -r / 3; + x[1] = -r / 3; + x[2] = -r / 3; + return 1; + } + + std::complex u = std::pow (-q / 2 + std::sqrt (std::complex (D)), + T (1) / T (3)); + + std::complex v = -p / (T (3) * u); + + const T sqrt3 = T (1.73205080756887729352744634150587); // enough digits + // for long double + std::complex y0 (u + v); + + std::complex y1 (-(u + v) / T (2) + + (u - v) / T (2) * std::complex (0, sqrt3)); + + std::complex y2 (-(u + v) / T (2) - + (u - v) / T (2) * std::complex (0, sqrt3)); + + if (D > 0) + { + x[0] = y0.real() - r / 3; + return 1; + } + else if (D == 0) + { + x[0] = y0.real() - r / 3; + x[1] = y1.real() - r / 3; + return 2; + } + else + { + x[0] = y0.real() - r / 3; + x[1] = y1.real() - r / 3; + x[2] = y2.real() - r / 3; + return 3; + } +} + + +template +int +solveCubic (T a, T b, T c, T d, T x[3]) +{ + if (a == 0) + { + return solveQuadratic (b, c, d, x); + } + else + { + return solveNormalizedCubic (b / a, c / a, d / a, x); + } +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathShear.cpp b/3rdparty/openexr/Imath/ImathShear.cpp new file mode 100644 index 000000000..72541f58b --- /dev/null +++ b/3rdparty/openexr/Imath/ImathShear.cpp @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + + +//---------------------------------------------------------------------------- +// +// Specializations of the Shear6 template. +// +//---------------------------------------------------------------------------- + +#include "ImathShear.h" + +namespace Imath { + + + +// empty + + + +} // namespace Imath diff --git a/3rdparty/openexr/Imath/ImathShear.h b/3rdparty/openexr/Imath/ImathShear.h new file mode 100644 index 000000000..bad40a549 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathShear.h @@ -0,0 +1,659 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHSHEAR_H +#define INCLUDED_IMATHSHEAR_H + +//---------------------------------------------------- +// +// Shear6 class template. +// +//---------------------------------------------------- + +#include "ImathExc.h" +#include "ImathLimits.h" +#include "ImathMath.h" +#include "ImathVec.h" + +#include + + +namespace Imath { + + + + +template class Shear6 +{ + public: + + //------------------- + // Access to elements + //------------------- + + T xy, xz, yz, yx, zx, zy; + + T & operator [] (int i); + const T & operator [] (int i) const; + + + //------------- + // Constructors + //------------- + + Shear6 (); // (0 0 0 0 0 0) + Shear6 (T XY, T XZ, T YZ); // (XY XZ YZ 0 0 0) + Shear6 (const Vec3 &v); // (v.x v.y v.z 0 0 0) + template // (v.x v.y v.z 0 0 0) + Shear6 (const Vec3 &v); + Shear6 (T XY, T XZ, T YZ, // (XY XZ YZ YX ZX ZY) + T YX, T ZX, T ZY); + + + //--------------------------------- + // Copy constructors and assignment + //--------------------------------- + + Shear6 (const Shear6 &h); + template Shear6 (const Shear6 &h); + + const Shear6 & operator = (const Shear6 &h); + template + const Shear6 & operator = (const Vec3 &v); + + + //---------------------- + // Compatibility with Sb + //---------------------- + + template + void setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY); + + template + void setValue (const Shear6 &h); + + template + void getValue (S &XY, S &XZ, S &YZ, + S &YX, S &ZX, S &ZY) const; + + template + void getValue (Shear6 &h) const; + + T * getValue(); + const T * getValue() const; + + + //--------- + // Equality + //--------- + + template + bool operator == (const Shear6 &h) const; + + template + bool operator != (const Shear6 &h) const; + + //----------------------------------------------------------------------- + // Compare two shears and test if they are "approximately equal": + // + // equalWithAbsError (h, e) + // + // Returns true if the coefficients of this and h are the same with + // an absolute error of no more than e, i.e., for all i + // + // abs (this[i] - h[i]) <= e + // + // equalWithRelError (h, e) + // + // Returns true if the coefficients of this and h are the same with + // a relative error of no more than e, i.e., for all i + // + // abs (this[i] - h[i]) <= e * abs (this[i]) + //----------------------------------------------------------------------- + + bool equalWithAbsError (const Shear6 &h, T e) const; + bool equalWithRelError (const Shear6 &h, T e) const; + + + //------------------------ + // Component-wise addition + //------------------------ + + const Shear6 & operator += (const Shear6 &h); + Shear6 operator + (const Shear6 &h) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Shear6 & operator -= (const Shear6 &h); + Shear6 operator - (const Shear6 &h) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Shear6 operator - () const; + const Shear6 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Shear6 & operator *= (const Shear6 &h); + const Shear6 & operator *= (T a); + Shear6 operator * (const Shear6 &h) const; + Shear6 operator * (T a) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Shear6 & operator /= (const Shear6 &h); + const Shear6 & operator /= (T a); + Shear6 operator / (const Shear6 &h) const; + Shear6 operator / (T a) const; + + + //---------------------------------------------------------- + // Number of dimensions, i.e. number of elements in a Shear6 + //---------------------------------------------------------- + + static unsigned int dimensions() {return 6;} + + + //------------------------------------------------- + // Limitations of type T (see also class limits) + //------------------------------------------------- + + static T baseTypeMin() {return limits::min();} + static T baseTypeMax() {return limits::max();} + static T baseTypeSmallest() {return limits::smallest();} + static T baseTypeEpsilon() {return limits::epsilon();} + + + //-------------------------------------------------------------- + // Base type -- in templates, which accept a parameter, V, which + // could be either a Vec2 or a Shear6, you can refer to T as + // V::BaseType + //-------------------------------------------------------------- + + typedef T BaseType; +}; + + +//-------------- +// Stream output +//-------------- + +template +std::ostream & operator << (std::ostream &s, const Shear6 &h); + + +//---------------------------------------------------- +// Reverse multiplication: scalar * Shear6 +//---------------------------------------------------- + +template Shear6 operator * (S a, const Shear6 &h); + + +//------------------------- +// Typedefs for convenience +//------------------------- + +typedef Vec3 Shear3f; +typedef Vec3 Shear3d; +typedef Shear6 Shear6f; +typedef Shear6 Shear6d; + + + + +//----------------------- +// Implementation of Shear6 +//----------------------- + +template +inline T & +Shear6::operator [] (int i) +{ + return (&xy)[i]; +} + +template +inline const T & +Shear6::operator [] (int i) const +{ + return (&xy)[i]; +} + +template +inline +Shear6::Shear6 () +{ + xy = xz = yz = yx = zx = zy = 0; +} + +template +inline +Shear6::Shear6 (T XY, T XZ, T YZ) +{ + xy = XY; + xz = XZ; + yz = YZ; + yx = 0; + zx = 0; + zy = 0; +} + +template +inline +Shear6::Shear6 (const Vec3 &v) +{ + xy = v.x; + xz = v.y; + yz = v.z; + yx = 0; + zx = 0; + zy = 0; +} + +template +template +inline +Shear6::Shear6 (const Vec3 &v) +{ + xy = T (v.x); + xz = T (v.y); + yz = T (v.z); + yx = 0; + zx = 0; + zy = 0; +} + +template +inline +Shear6::Shear6 (T XY, T XZ, T YZ, T YX, T ZX, T ZY) +{ + xy = XY; + xz = XZ; + yz = YZ; + yx = YX; + zx = ZX; + zy = ZY; +} + +template +inline +Shear6::Shear6 (const Shear6 &h) +{ + xy = h.xy; + xz = h.xz; + yz = h.yz; + yx = h.yx; + zx = h.zx; + zy = h.zy; +} + +template +template +inline +Shear6::Shear6 (const Shear6 &h) +{ + xy = T (h.xy); + xz = T (h.xz); + yz = T (h.yz); + yx = T (h.yx); + zx = T (h.zx); + zy = T (h.zy); +} + +template +inline const Shear6 & +Shear6::operator = (const Shear6 &h) +{ + xy = h.xy; + xz = h.xz; + yz = h.yz; + yx = h.yx; + zx = h.zx; + zy = h.zy; + return *this; +} + +template +template +inline const Shear6 & +Shear6::operator = (const Vec3 &v) +{ + xy = T (v.x); + xz = T (v.y); + yz = T (v.z); + yx = 0; + zx = 0; + zy = 0; + return *this; +} + +template +template +inline void +Shear6::setValue (S XY, S XZ, S YZ, S YX, S ZX, S ZY) +{ + xy = T (XY); + xz = T (XZ); + yz = T (YZ); + yx = T (YX); + zx = T (ZX); + zy = T (ZY); +} + +template +template +inline void +Shear6::setValue (const Shear6 &h) +{ + xy = T (h.xy); + xz = T (h.xz); + yz = T (h.yz); + yx = T (h.yx); + zx = T (h.zx); + zy = T (h.zy); +} + +template +template +inline void +Shear6::getValue (S &XY, S &XZ, S &YZ, S &YX, S &ZX, S &ZY) const +{ + XY = S (xy); + XZ = S (xz); + YZ = S (yz); + YX = S (yx); + ZX = S (zx); + ZY = S (zy); +} + +template +template +inline void +Shear6::getValue (Shear6 &h) const +{ + h.xy = S (xy); + h.xz = S (xz); + h.yz = S (yz); + h.yx = S (yx); + h.zx = S (zx); + h.zy = S (zy); +} + +template +inline T * +Shear6::getValue() +{ + return (T *) &xy; +} + +template +inline const T * +Shear6::getValue() const +{ + return (const T *) &xy; +} + +template +template +inline bool +Shear6::operator == (const Shear6 &h) const +{ + return xy == h.xy && xz == h.xz && yz == h.yz && + yx == h.yx && zx == h.zx && zy == h.zy; +} + +template +template +inline bool +Shear6::operator != (const Shear6 &h) const +{ + return xy != h.xy || xz != h.xz || yz != h.yz || + yx != h.yx || zx != h.zx || zy != h.zy; +} + +template +bool +Shear6::equalWithAbsError (const Shear6 &h, T e) const +{ + for (int i = 0; i < 6; i++) + if (!Imath::equalWithAbsError ((*this)[i], h[i], e)) + return false; + + return true; +} + +template +bool +Shear6::equalWithRelError (const Shear6 &h, T e) const +{ + for (int i = 0; i < 6; i++) + if (!Imath::equalWithRelError ((*this)[i], h[i], e)) + return false; + + return true; +} + + +template +inline const Shear6 & +Shear6::operator += (const Shear6 &h) +{ + xy += h.xy; + xz += h.xz; + yz += h.yz; + yx += h.yx; + zx += h.zx; + zy += h.zy; + return *this; +} + +template +inline Shear6 +Shear6::operator + (const Shear6 &h) const +{ + return Shear6 (xy + h.xy, xz + h.xz, yz + h.yz, + yx + h.yx, zx + h.zx, zy + h.zy); +} + +template +inline const Shear6 & +Shear6::operator -= (const Shear6 &h) +{ + xy -= h.xy; + xz -= h.xz; + yz -= h.yz; + yx -= h.yx; + zx -= h.zx; + zy -= h.zy; + return *this; +} + +template +inline Shear6 +Shear6::operator - (const Shear6 &h) const +{ + return Shear6 (xy - h.xy, xz - h.xz, yz - h.yz, + yx - h.yx, zx - h.zx, zy - h.zy); +} + +template +inline Shear6 +Shear6::operator - () const +{ + return Shear6 (-xy, -xz, -yz, -yx, -zx, -zy); +} + +template +inline const Shear6 & +Shear6::negate () +{ + xy = -xy; + xz = -xz; + yz = -yz; + yx = -yx; + zx = -zx; + zy = -zy; + return *this; +} + +template +inline const Shear6 & +Shear6::operator *= (const Shear6 &h) +{ + xy *= h.xy; + xz *= h.xz; + yz *= h.yz; + yx *= h.yx; + zx *= h.zx; + zy *= h.zy; + return *this; +} + +template +inline const Shear6 & +Shear6::operator *= (T a) +{ + xy *= a; + xz *= a; + yz *= a; + yx *= a; + zx *= a; + zy *= a; + return *this; +} + +template +inline Shear6 +Shear6::operator * (const Shear6 &h) const +{ + return Shear6 (xy * h.xy, xz * h.xz, yz * h.yz, + yx * h.yx, zx * h.zx, zy * h.zy); +} + +template +inline Shear6 +Shear6::operator * (T a) const +{ + return Shear6 (xy * a, xz * a, yz * a, + yx * a, zx * a, zy * a); +} + +template +inline const Shear6 & +Shear6::operator /= (const Shear6 &h) +{ + xy /= h.xy; + xz /= h.xz; + yz /= h.yz; + yx /= h.yx; + zx /= h.zx; + zy /= h.zy; + return *this; +} + +template +inline const Shear6 & +Shear6::operator /= (T a) +{ + xy /= a; + xz /= a; + yz /= a; + yx /= a; + zx /= a; + zy /= a; + return *this; +} + +template +inline Shear6 +Shear6::operator / (const Shear6 &h) const +{ + return Shear6 (xy / h.xy, xz / h.xz, yz / h.yz, + yx / h.yx, zx / h.zx, zy / h.zy); +} + +template +inline Shear6 +Shear6::operator / (T a) const +{ + return Shear6 (xy / a, xz / a, yz / a, + yx / a, zx / a, zy / a); +} + + +//----------------------------- +// Stream output implementation +//----------------------------- + +template +std::ostream & +operator << (std::ostream &s, const Shear6 &h) +{ + return s << '(' + << h.xy << ' ' << h.xz << ' ' << h.yz + << h.yx << ' ' << h.zx << ' ' << h.zy + << ')'; +} + + +//----------------------------------------- +// Implementation of reverse multiplication +//----------------------------------------- + +template +inline Shear6 +operator * (S a, const Shear6 &h) +{ + return Shear6 (a * h.xy, a * h.xz, a * h.yz, + a * h.yx, a * h.zx, a * h.zy); +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathSphere.h b/3rdparty/openexr/Imath/ImathSphere.h new file mode 100644 index 000000000..14d03651b --- /dev/null +++ b/3rdparty/openexr/Imath/ImathSphere.h @@ -0,0 +1,177 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHSPHERE_H +#define INCLUDED_IMATHSPHERE_H + +//------------------------------------- +// +// A 3D sphere class template +// +//------------------------------------- + +#include "ImathVec.h" +#include "ImathBox.h" +#include "ImathLine.h" + +namespace Imath { + +template +class Sphere3 +{ + public: + + Vec3 center; + T radius; + + //--------------- + // Constructors + //--------------- + + Sphere3() : center(0,0,0), radius(0) {} + Sphere3(const Vec3 &c, T r) : center(c), radius(r) {} + + //------------------------------------------------------------------- + // Utilities: + // + // s.circumscribe(b) sets center and radius of sphere s + // so that the s tightly encloses box b. + // + // s.intersectT (l, t) If sphere s and line l intersect, then + // intersectT() computes the smallest t, + // t >= 0, so that l(t) is a point on the + // sphere. intersectT() then returns true. + // + // If s and l do not intersect, intersectT() + // returns false. + // + // s.intersect (l, i) If sphere s and line l intersect, then + // intersect() calls s.intersectT(l,t) and + // computes i = l(t). + // + // If s and l do not intersect, intersect() + // returns false. + // + //------------------------------------------------------------------- + + void circumscribe(const Box > &box); + bool intersect(const Line3 &l, Vec3 &intersection) const; + bool intersectT(const Line3 &l, T &t) const; +}; + + +//-------------------- +// Convenient typedefs +//-------------------- + +typedef Sphere3 Sphere3f; +typedef Sphere3 Sphere3d; + + +//--------------- +// Implementation +//--------------- + +template +void Sphere3::circumscribe(const Box > &box) +{ + center = T(0.5) * (box.min + box.max); + radius = (box.max - center).length(); +} + + +template +bool Sphere3::intersectT(const Line3 &line, T &t) const +{ + bool doesIntersect = true; + + Vec3 v = line.pos - center; + T B = T(2.0) * (line.dir ^ v); + T C = (v ^ v) - (radius * radius); + + // compute discriminant + // if negative, there is no intersection + + T discr = B*B - T(4.0)*C; + + if (discr < 0.0) + { + // line and Sphere3 do not intersect + + doesIntersect = false; + } + else + { + // t0: (-B - sqrt(B^2 - 4AC)) / 2A (A = 1) + + T sqroot = Math::sqrt(discr); + t = (-B - sqroot) * T(0.5); + + if (t < 0.0) + { + // no intersection, try t1: (-B + sqrt(B^2 - 4AC)) / 2A (A = 1) + + t = (-B + sqroot) * T(0.5); + } + + if (t < 0.0) + doesIntersect = false; + } + + return doesIntersect; +} + + +template +bool Sphere3::intersect(const Line3 &line, Vec3 &intersection) const +{ + T t; + + if (intersectT (line, t)) + { + intersection = line(t); + return true; + } + else + { + return false; + } +} + + +} //namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathVec.cpp b/3rdparty/openexr/Imath/ImathVec.cpp new file mode 100644 index 000000000..f692271c2 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathVec.cpp @@ -0,0 +1,540 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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. +// +/////////////////////////////////////////////////////////////////////////// + + + +//---------------------------------------------------------------------------- +// +// Specializations of the Vec2 and Vec3 templates. +// +//---------------------------------------------------------------------------- + +#include "ImathVec.h" + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +// suppress exception specification warnings +#pragma warning(disable:4290) +#endif + + +namespace Imath { + +namespace +{ + +template +bool +normalizeOrThrow(Vec2 &v) +{ + int axis = -1; + for (int i = 0; i < 2; i ++) + { + if (v[i] != 0) + { + if (axis != -1) + { + throw IntVecNormalizeExc ("Cannot normalize an integer " + "vector unless it is parallel " + "to a principal axis"); + } + axis = i; + } + } + v[axis] = (v[axis] > 0) ? 1 : -1; + return true; +} + + +template +bool +normalizeOrThrow(Vec3 &v) +{ + int axis = -1; + for (int i = 0; i < 3; i ++) + { + if (v[i] != 0) + { + if (axis != -1) + { + throw IntVecNormalizeExc ("Cannot normalize an integer " + "vector unless it is parallel " + "to a principal axis"); + } + axis = i; + } + } + v[axis] = (v[axis] > 0) ? 1 : -1; + return true; +} + + +template +bool +normalizeOrThrow(Vec4 &v) +{ + int axis = -1; + for (int i = 0; i < 4; i ++) + { + if (v[i] != 0) + { + if (axis != -1) + { + throw IntVecNormalizeExc ("Cannot normalize an integer " + "vector unless it is parallel " + "to a principal axis"); + } + axis = i; + } + } + v[axis] = (v[axis] > 0) ? 1 : -1; + return true; +} + +} + + +// Vec2 + +template <> +short +Vec2::length () const +{ + float lenF = Math::sqrt ((float)dot (*this)); + short lenS = (short) (lenF + 0.5f); + return lenS; +} + +template <> +const Vec2 & +Vec2::normalize () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec2 & +Vec2::normalizeExc () throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec2 & +Vec2::normalizeNonNull () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +Vec2 +Vec2::normalized () const +{ + Vec2 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec2 +Vec2::normalizedExc () const throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + Vec2 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec2 +Vec2::normalizedNonNull () const +{ + Vec2 v(*this); + normalizeOrThrow(v); + return v; +} + + +// Vec2 + +template <> +int +Vec2::length () const +{ + float lenF = Math::sqrt ((float)dot (*this)); + int lenI = (int) (lenF + 0.5f); + return lenI; +} + +template <> +const Vec2 & +Vec2::normalize () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec2 & +Vec2::normalizeExc () throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec2 & +Vec2::normalizeNonNull () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +Vec2 +Vec2::normalized () const +{ + Vec2 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec2 +Vec2::normalizedExc () const throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + Vec2 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec2 +Vec2::normalizedNonNull () const +{ + Vec2 v(*this); + normalizeOrThrow(v); + return v; +} + + +// Vec3 + +template <> +short +Vec3::length () const +{ + float lenF = Math::sqrt ((float)dot (*this)); + short lenS = (short) (lenF + 0.5f); + return lenS; +} + +template <> +const Vec3 & +Vec3::normalize () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec3 & +Vec3::normalizeExc () throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec3 & +Vec3::normalizeNonNull () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +Vec3 +Vec3::normalized () const +{ + Vec3 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec3 +Vec3::normalizedExc () const throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + Vec3 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec3 +Vec3::normalizedNonNull () const +{ + Vec3 v(*this); + normalizeOrThrow(v); + return v; +} + + +// Vec3 + +template <> +int +Vec3::length () const +{ + float lenF = Math::sqrt ((float)dot (*this)); + int lenI = (int) (lenF + 0.5f); + return lenI; +} + +template <> +const Vec3 & +Vec3::normalize () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec3 & +Vec3::normalizeExc () throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec3 & +Vec3::normalizeNonNull () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +Vec3 +Vec3::normalized () const +{ + Vec3 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec3 +Vec3::normalizedExc () const throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + Vec3 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec3 +Vec3::normalizedNonNull () const +{ + Vec3 v(*this); + normalizeOrThrow(v); + return v; +} + + +// Vec4 + +template <> +short +Vec4::length () const +{ + float lenF = Math::sqrt ((float)dot (*this)); + short lenS = (short) (lenF + 0.5f); + return lenS; +} + +template <> +const Vec4 & +Vec4::normalize () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec4 & +Vec4::normalizeExc () throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec4 & +Vec4::normalizeNonNull () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +Vec4 +Vec4::normalized () const +{ + Vec4 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec4 +Vec4::normalizedExc () const throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + Vec4 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec4 +Vec4::normalizedNonNull () const +{ + Vec4 v(*this); + normalizeOrThrow(v); + return v; +} + + +// Vec4 + +template <> +int +Vec4::length () const +{ + float lenF = Math::sqrt ((float)dot (*this)); + int lenI = (int) (lenF + 0.5f); + return lenI; +} + +template <> +const Vec4 & +Vec4::normalize () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec4 & +Vec4::normalizeExc () throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + normalizeOrThrow(*this); + return *this; +} + +template <> +const Vec4 & +Vec4::normalizeNonNull () +{ + normalizeOrThrow(*this); + return *this; +} + +template <> +Vec4 +Vec4::normalized () const +{ + Vec4 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec4 +Vec4::normalizedExc () const throw (Iex::MathExc) +{ + if ((x == 0) && (y == 0) && (z == 0) && (w == 0)) + throw NullVecExc ("Cannot normalize null vector."); + + Vec4 v(*this); + normalizeOrThrow(v); + return v; +} + +template <> +Vec4 +Vec4::normalizedNonNull () const +{ + Vec4 v(*this); + normalizeOrThrow(v); + return v; +} + +} // namespace Imath diff --git a/3rdparty/openexr/Imath/ImathVec.h b/3rdparty/openexr/Imath/ImathVec.h new file mode 100644 index 000000000..e6d2b791a --- /dev/null +++ b/3rdparty/openexr/Imath/ImathVec.h @@ -0,0 +1,2226 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHVEC_H +#define INCLUDED_IMATHVEC_H + +//---------------------------------------------------- +// +// 2D, 3D and 4D point/vector class templates +// +//---------------------------------------------------- + +#include "ImathExc.h" +#include "ImathLimits.h" +#include "ImathMath.h" + +#include + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +// suppress exception specification warnings +#pragma warning(push) +#pragma warning(disable:4290) +#endif + + +namespace Imath { + +template class Vec2; +template class Vec3; +template class Vec4; + +enum InfException {INF_EXCEPTION}; + + +template class Vec2 +{ + public: + + //------------------- + // Access to elements + //------------------- + + T x, y; + + T & operator [] (int i); + const T & operator [] (int i) const; + + + //------------- + // Constructors + //------------- + + Vec2 (); // no initialization + explicit Vec2 (T a); // (a a) + Vec2 (T a, T b); // (a b) + + + //--------------------------------- + // Copy constructors and assignment + //--------------------------------- + + Vec2 (const Vec2 &v); + template Vec2 (const Vec2 &v); + + const Vec2 & operator = (const Vec2 &v); + + + //---------------------- + // Compatibility with Sb + //---------------------- + + template + void setValue (S a, S b); + + template + void setValue (const Vec2 &v); + + template + void getValue (S &a, S &b) const; + + template + void getValue (Vec2 &v) const; + + T * getValue (); + const T * getValue () const; + + + //--------- + // Equality + //--------- + + template + bool operator == (const Vec2 &v) const; + + template + bool operator != (const Vec2 &v) const; + + + //----------------------------------------------------------------------- + // Compare two vectors and test if they are "approximately equal": + // + // equalWithAbsError (v, e) + // + // Returns true if the coefficients of this and v are the same with + // an absolute error of no more than e, i.e., for all i + // + // abs (this[i] - v[i]) <= e + // + // equalWithRelError (v, e) + // + // Returns true if the coefficients of this and v are the same with + // a relative error of no more than e, i.e., for all i + // + // abs (this[i] - v[i]) <= e * abs (this[i]) + //----------------------------------------------------------------------- + + bool equalWithAbsError (const Vec2 &v, T e) const; + bool equalWithRelError (const Vec2 &v, T e) const; + + //------------ + // Dot product + //------------ + + T dot (const Vec2 &v) const; + T operator ^ (const Vec2 &v) const; + + + //------------------------------------------------ + // Right-handed cross product, i.e. z component of + // Vec3 (this->x, this->y, 0) % Vec3 (v.x, v.y, 0) + //------------------------------------------------ + + T cross (const Vec2 &v) const; + T operator % (const Vec2 &v) const; + + + //------------------------ + // Component-wise addition + //------------------------ + + const Vec2 & operator += (const Vec2 &v); + Vec2 operator + (const Vec2 &v) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Vec2 & operator -= (const Vec2 &v); + Vec2 operator - (const Vec2 &v) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Vec2 operator - () const; + const Vec2 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Vec2 & operator *= (const Vec2 &v); + const Vec2 & operator *= (T a); + Vec2 operator * (const Vec2 &v) const; + Vec2 operator * (T a) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Vec2 & operator /= (const Vec2 &v); + const Vec2 & operator /= (T a); + Vec2 operator / (const Vec2 &v) const; + Vec2 operator / (T a) const; + + + //---------------------------------------------------------------- + // Length and normalization: If v.length() is 0.0, v.normalize() + // and v.normalized() produce a null vector; v.normalizeExc() and + // v.normalizedExc() throw a NullVecExc. + // v.normalizeNonNull() and v.normalizedNonNull() are slightly + // faster than the other normalization routines, but if v.length() + // is 0.0, the result is undefined. + //---------------------------------------------------------------- + + T length () const; + T length2 () const; + + const Vec2 & normalize (); // modifies *this + const Vec2 & normalizeExc () throw (Iex::MathExc); + const Vec2 & normalizeNonNull (); + + Vec2 normalized () const; // does not modify *this + Vec2 normalizedExc () const throw (Iex::MathExc); + Vec2 normalizedNonNull () const; + + + //-------------------------------------------------------- + // Number of dimensions, i.e. number of elements in a Vec2 + //-------------------------------------------------------- + + static unsigned int dimensions() {return 2;} + + + //------------------------------------------------- + // Limitations of type T (see also class limits) + //------------------------------------------------- + + static T baseTypeMin() {return limits::min();} + static T baseTypeMax() {return limits::max();} + static T baseTypeSmallest() {return limits::smallest();} + static T baseTypeEpsilon() {return limits::epsilon();} + + + //-------------------------------------------------------------- + // Base type -- in templates, which accept a parameter, V, which + // could be either a Vec2, a Vec3, or a Vec4 you can + // refer to T as V::BaseType + //-------------------------------------------------------------- + + typedef T BaseType; + + private: + + T lengthTiny () const; +}; + + +template class Vec3 +{ + public: + + //------------------- + // Access to elements + //------------------- + + T x, y, z; + + T & operator [] (int i); + const T & operator [] (int i) const; + + + //------------- + // Constructors + //------------- + + Vec3 (); // no initialization + explicit Vec3 (T a); // (a a a) + Vec3 (T a, T b, T c); // (a b c) + + + //--------------------------------- + // Copy constructors and assignment + //--------------------------------- + + Vec3 (const Vec3 &v); + template Vec3 (const Vec3 &v); + + const Vec3 & operator = (const Vec3 &v); + + + //--------------------------------------------------------- + // Vec4 to Vec3 conversion, divides x, y and z by w: + // + // The one-argument conversion function divides by w even + // if w is zero. The result depends on how the environment + // handles floating-point exceptions. + // + // The two-argument version thows an InfPointExc exception + // if w is zero or if division by w would overflow. + //--------------------------------------------------------- + + template explicit Vec3 (const Vec4 &v); + template explicit Vec3 (const Vec4 &v, InfException); + + + //---------------------- + // Compatibility with Sb + //---------------------- + + template + void setValue (S a, S b, S c); + + template + void setValue (const Vec3 &v); + + template + void getValue (S &a, S &b, S &c) const; + + template + void getValue (Vec3 &v) const; + + T * getValue(); + const T * getValue() const; + + + //--------- + // Equality + //--------- + + template + bool operator == (const Vec3 &v) const; + + template + bool operator != (const Vec3 &v) const; + + //----------------------------------------------------------------------- + // Compare two vectors and test if they are "approximately equal": + // + // equalWithAbsError (v, e) + // + // Returns true if the coefficients of this and v are the same with + // an absolute error of no more than e, i.e., for all i + // + // abs (this[i] - v[i]) <= e + // + // equalWithRelError (v, e) + // + // Returns true if the coefficients of this and v are the same with + // a relative error of no more than e, i.e., for all i + // + // abs (this[i] - v[i]) <= e * abs (this[i]) + //----------------------------------------------------------------------- + + bool equalWithAbsError (const Vec3 &v, T e) const; + bool equalWithRelError (const Vec3 &v, T e) const; + + //------------ + // Dot product + //------------ + + T dot (const Vec3 &v) const; + T operator ^ (const Vec3 &v) const; + + + //--------------------------- + // Right-handed cross product + //--------------------------- + + Vec3 cross (const Vec3 &v) const; + const Vec3 & operator %= (const Vec3 &v); + Vec3 operator % (const Vec3 &v) const; + + + //------------------------ + // Component-wise addition + //------------------------ + + const Vec3 & operator += (const Vec3 &v); + Vec3 operator + (const Vec3 &v) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Vec3 & operator -= (const Vec3 &v); + Vec3 operator - (const Vec3 &v) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Vec3 operator - () const; + const Vec3 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Vec3 & operator *= (const Vec3 &v); + const Vec3 & operator *= (T a); + Vec3 operator * (const Vec3 &v) const; + Vec3 operator * (T a) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Vec3 & operator /= (const Vec3 &v); + const Vec3 & operator /= (T a); + Vec3 operator / (const Vec3 &v) const; + Vec3 operator / (T a) const; + + + //---------------------------------------------------------------- + // Length and normalization: If v.length() is 0.0, v.normalize() + // and v.normalized() produce a null vector; v.normalizeExc() and + // v.normalizedExc() throw a NullVecExc. + // v.normalizeNonNull() and v.normalizedNonNull() are slightly + // faster than the other normalization routines, but if v.length() + // is 0.0, the result is undefined. + //---------------------------------------------------------------- + + T length () const; + T length2 () const; + + const Vec3 & normalize (); // modifies *this + const Vec3 & normalizeExc () throw (Iex::MathExc); + const Vec3 & normalizeNonNull (); + + Vec3 normalized () const; // does not modify *this + Vec3 normalizedExc () const throw (Iex::MathExc); + Vec3 normalizedNonNull () const; + + + //-------------------------------------------------------- + // Number of dimensions, i.e. number of elements in a Vec3 + //-------------------------------------------------------- + + static unsigned int dimensions() {return 3;} + + + //------------------------------------------------- + // Limitations of type T (see also class limits) + //------------------------------------------------- + + static T baseTypeMin() {return limits::min();} + static T baseTypeMax() {return limits::max();} + static T baseTypeSmallest() {return limits::smallest();} + static T baseTypeEpsilon() {return limits::epsilon();} + + + //-------------------------------------------------------------- + // Base type -- in templates, which accept a parameter, V, which + // could be either a Vec2, a Vec3, or a Vec4 you can + // refer to T as V::BaseType + //-------------------------------------------------------------- + + typedef T BaseType; + + private: + + T lengthTiny () const; +}; + + + +template class Vec4 +{ + public: + + //------------------- + // Access to elements + //------------------- + + T x, y, z, w; + + T & operator [] (int i); + const T & operator [] (int i) const; + + + //------------- + // Constructors + //------------- + + Vec4 (); // no initialization + explicit Vec4 (T a); // (a a a a) + Vec4 (T a, T b, T c, T d); // (a b c d) + + + //--------------------------------- + // Copy constructors and assignment + //--------------------------------- + + Vec4 (const Vec4 &v); + template Vec4 (const Vec4 &v); + + const Vec4 & operator = (const Vec4 &v); + + + //------------------------------------- + // Vec3 to Vec4 conversion, sets w to 1 + //------------------------------------- + + template explicit Vec4 (const Vec3 &v); + + + //--------- + // Equality + //--------- + + template + bool operator == (const Vec4 &v) const; + + template + bool operator != (const Vec4 &v) const; + + + //----------------------------------------------------------------------- + // Compare two vectors and test if they are "approximately equal": + // + // equalWithAbsError (v, e) + // + // Returns true if the coefficients of this and v are the same with + // an absolute error of no more than e, i.e., for all i + // + // abs (this[i] - v[i]) <= e + // + // equalWithRelError (v, e) + // + // Returns true if the coefficients of this and v are the same with + // a relative error of no more than e, i.e., for all i + // + // abs (this[i] - v[i]) <= e * abs (this[i]) + //----------------------------------------------------------------------- + + bool equalWithAbsError (const Vec4 &v, T e) const; + bool equalWithRelError (const Vec4 &v, T e) const; + + + //------------ + // Dot product + //------------ + + T dot (const Vec4 &v) const; + T operator ^ (const Vec4 &v) const; + + + //----------------------------------- + // Cross product is not defined in 4D + //----------------------------------- + + //------------------------ + // Component-wise addition + //------------------------ + + const Vec4 & operator += (const Vec4 &v); + Vec4 operator + (const Vec4 &v) const; + + + //--------------------------- + // Component-wise subtraction + //--------------------------- + + const Vec4 & operator -= (const Vec4 &v); + Vec4 operator - (const Vec4 &v) const; + + + //------------------------------------ + // Component-wise multiplication by -1 + //------------------------------------ + + Vec4 operator - () const; + const Vec4 & negate (); + + + //------------------------------ + // Component-wise multiplication + //------------------------------ + + const Vec4 & operator *= (const Vec4 &v); + const Vec4 & operator *= (T a); + Vec4 operator * (const Vec4 &v) const; + Vec4 operator * (T a) const; + + + //------------------------ + // Component-wise division + //------------------------ + + const Vec4 & operator /= (const Vec4 &v); + const Vec4 & operator /= (T a); + Vec4 operator / (const Vec4 &v) const; + Vec4 operator / (T a) const; + + + //---------------------------------------------------------------- + // Length and normalization: If v.length() is 0.0, v.normalize() + // and v.normalized() produce a null vector; v.normalizeExc() and + // v.normalizedExc() throw a NullVecExc. + // v.normalizeNonNull() and v.normalizedNonNull() are slightly + // faster than the other normalization routines, but if v.length() + // is 0.0, the result is undefined. + //---------------------------------------------------------------- + + T length () const; + T length2 () const; + + const Vec4 & normalize (); // modifies *this + const Vec4 & normalizeExc () throw (Iex::MathExc); + const Vec4 & normalizeNonNull (); + + Vec4 normalized () const; // does not modify *this + Vec4 normalizedExc () const throw (Iex::MathExc); + Vec4 normalizedNonNull () const; + + + //-------------------------------------------------------- + // Number of dimensions, i.e. number of elements in a Vec4 + //-------------------------------------------------------- + + static unsigned int dimensions() {return 4;} + + + //------------------------------------------------- + // Limitations of type T (see also class limits) + //------------------------------------------------- + + static T baseTypeMin() {return limits::min();} + static T baseTypeMax() {return limits::max();} + static T baseTypeSmallest() {return limits::smallest();} + static T baseTypeEpsilon() {return limits::epsilon();} + + + //-------------------------------------------------------------- + // Base type -- in templates, which accept a parameter, V, which + // could be either a Vec2, a Vec3, or a Vec4 you can + // refer to T as V::BaseType + //-------------------------------------------------------------- + + typedef T BaseType; + + private: + + T lengthTiny () const; +}; + + +//-------------- +// Stream output +//-------------- + +template +std::ostream & operator << (std::ostream &s, const Vec2 &v); + +template +std::ostream & operator << (std::ostream &s, const Vec3 &v); + +template +std::ostream & operator << (std::ostream &s, const Vec4 &v); + +//---------------------------------------------------- +// Reverse multiplication: S * Vec2 and S * Vec3 +//---------------------------------------------------- + +template Vec2 operator * (T a, const Vec2 &v); +template Vec3 operator * (T a, const Vec3 &v); +template Vec4 operator * (T a, const Vec4 &v); + + +//------------------------- +// Typedefs for convenience +//------------------------- + +typedef Vec2 V2s; +typedef Vec2 V2i; +typedef Vec2 V2f; +typedef Vec2 V2d; +typedef Vec3 V3s; +typedef Vec3 V3i; +typedef Vec3 V3f; +typedef Vec3 V3d; +typedef Vec4 V4s; +typedef Vec4 V4i; +typedef Vec4 V4f; +typedef Vec4 V4d; + + +//------------------------------------------- +// Specializations for VecN, VecN +//------------------------------------------- + +// Vec2 + +template <> short +Vec2::length () const; + +template <> const Vec2 & +Vec2::normalize (); + +template <> const Vec2 & +Vec2::normalizeExc () throw (Iex::MathExc); + +template <> const Vec2 & +Vec2::normalizeNonNull (); + +template <> Vec2 +Vec2::normalized () const; + +template <> Vec2 +Vec2::normalizedExc () const throw (Iex::MathExc); + +template <> Vec2 +Vec2::normalizedNonNull () const; + + +// Vec2 + +template <> int +Vec2::length () const; + +template <> const Vec2 & +Vec2::normalize (); + +template <> const Vec2 & +Vec2::normalizeExc () throw (Iex::MathExc); + +template <> const Vec2 & +Vec2::normalizeNonNull (); + +template <> Vec2 +Vec2::normalized () const; + +template <> Vec2 +Vec2::normalizedExc () const throw (Iex::MathExc); + +template <> Vec2 +Vec2::normalizedNonNull () const; + + +// Vec3 + +template <> short +Vec3::length () const; + +template <> const Vec3 & +Vec3::normalize (); + +template <> const Vec3 & +Vec3::normalizeExc () throw (Iex::MathExc); + +template <> const Vec3 & +Vec3::normalizeNonNull (); + +template <> Vec3 +Vec3::normalized () const; + +template <> Vec3 +Vec3::normalizedExc () const throw (Iex::MathExc); + +template <> Vec3 +Vec3::normalizedNonNull () const; + + +// Vec3 + +template <> int +Vec3::length () const; + +template <> const Vec3 & +Vec3::normalize (); + +template <> const Vec3 & +Vec3::normalizeExc () throw (Iex::MathExc); + +template <> const Vec3 & +Vec3::normalizeNonNull (); + +template <> Vec3 +Vec3::normalized () const; + +template <> Vec3 +Vec3::normalizedExc () const throw (Iex::MathExc); + +template <> Vec3 +Vec3::normalizedNonNull () const; + +// Vec4 + +template <> short +Vec4::length () const; + +template <> const Vec4 & +Vec4::normalize (); + +template <> const Vec4 & +Vec4::normalizeExc () throw (Iex::MathExc); + +template <> const Vec4 & +Vec4::normalizeNonNull (); + +template <> Vec4 +Vec4::normalized () const; + +template <> Vec4 +Vec4::normalizedExc () const throw (Iex::MathExc); + +template <> Vec4 +Vec4::normalizedNonNull () const; + + +// Vec4 + +template <> int +Vec4::length () const; + +template <> const Vec4 & +Vec4::normalize (); + +template <> const Vec4 & +Vec4::normalizeExc () throw (Iex::MathExc); + +template <> const Vec4 & +Vec4::normalizeNonNull (); + +template <> Vec4 +Vec4::normalized () const; + +template <> Vec4 +Vec4::normalizedExc () const throw (Iex::MathExc); + +template <> Vec4 +Vec4::normalizedNonNull () const; + + +//------------------------ +// Implementation of Vec2: +//------------------------ + +template +inline T & +Vec2::operator [] (int i) +{ + return (&x)[i]; +} + +template +inline const T & +Vec2::operator [] (int i) const +{ + return (&x)[i]; +} + +template +inline +Vec2::Vec2 () +{ + // empty +} + +template +inline +Vec2::Vec2 (T a) +{ + x = y = a; +} + +template +inline +Vec2::Vec2 (T a, T b) +{ + x = a; + y = b; +} + +template +inline +Vec2::Vec2 (const Vec2 &v) +{ + x = v.x; + y = v.y; +} + +template +template +inline +Vec2::Vec2 (const Vec2 &v) +{ + x = T (v.x); + y = T (v.y); +} + +template +inline const Vec2 & +Vec2::operator = (const Vec2 &v) +{ + x = v.x; + y = v.y; + return *this; +} + +template +template +inline void +Vec2::setValue (S a, S b) +{ + x = T (a); + y = T (b); +} + +template +template +inline void +Vec2::setValue (const Vec2 &v) +{ + x = T (v.x); + y = T (v.y); +} + +template +template +inline void +Vec2::getValue (S &a, S &b) const +{ + a = S (x); + b = S (y); +} + +template +template +inline void +Vec2::getValue (Vec2 &v) const +{ + v.x = S (x); + v.y = S (y); +} + +template +inline T * +Vec2::getValue() +{ + return (T *) &x; +} + +template +inline const T * +Vec2::getValue() const +{ + return (const T *) &x; +} + +template +template +inline bool +Vec2::operator == (const Vec2 &v) const +{ + return x == v.x && y == v.y; +} + +template +template +inline bool +Vec2::operator != (const Vec2 &v) const +{ + return x != v.x || y != v.y; +} + +template +bool +Vec2::equalWithAbsError (const Vec2 &v, T e) const +{ + for (int i = 0; i < 2; i++) + if (!Imath::equalWithAbsError ((*this)[i], v[i], e)) + return false; + + return true; +} + +template +bool +Vec2::equalWithRelError (const Vec2 &v, T e) const +{ + for (int i = 0; i < 2; i++) + if (!Imath::equalWithRelError ((*this)[i], v[i], e)) + return false; + + return true; +} + +template +inline T +Vec2::dot (const Vec2 &v) const +{ + return x * v.x + y * v.y; +} + +template +inline T +Vec2::operator ^ (const Vec2 &v) const +{ + return dot (v); +} + +template +inline T +Vec2::cross (const Vec2 &v) const +{ + return x * v.y - y * v.x; + +} + +template +inline T +Vec2::operator % (const Vec2 &v) const +{ + return x * v.y - y * v.x; +} + +template +inline const Vec2 & +Vec2::operator += (const Vec2 &v) +{ + x += v.x; + y += v.y; + return *this; +} + +template +inline Vec2 +Vec2::operator + (const Vec2 &v) const +{ + return Vec2 (x + v.x, y + v.y); +} + +template +inline const Vec2 & +Vec2::operator -= (const Vec2 &v) +{ + x -= v.x; + y -= v.y; + return *this; +} + +template +inline Vec2 +Vec2::operator - (const Vec2 &v) const +{ + return Vec2 (x - v.x, y - v.y); +} + +template +inline Vec2 +Vec2::operator - () const +{ + return Vec2 (-x, -y); +} + +template +inline const Vec2 & +Vec2::negate () +{ + x = -x; + y = -y; + return *this; +} + +template +inline const Vec2 & +Vec2::operator *= (const Vec2 &v) +{ + x *= v.x; + y *= v.y; + return *this; +} + +template +inline const Vec2 & +Vec2::operator *= (T a) +{ + x *= a; + y *= a; + return *this; +} + +template +inline Vec2 +Vec2::operator * (const Vec2 &v) const +{ + return Vec2 (x * v.x, y * v.y); +} + +template +inline Vec2 +Vec2::operator * (T a) const +{ + return Vec2 (x * a, y * a); +} + +template +inline const Vec2 & +Vec2::operator /= (const Vec2 &v) +{ + x /= v.x; + y /= v.y; + return *this; +} + +template +inline const Vec2 & +Vec2::operator /= (T a) +{ + x /= a; + y /= a; + return *this; +} + +template +inline Vec2 +Vec2::operator / (const Vec2 &v) const +{ + return Vec2 (x / v.x, y / v.y); +} + +template +inline Vec2 +Vec2::operator / (T a) const +{ + return Vec2 (x / a, y / a); +} + +template +T +Vec2::lengthTiny () const +{ + T absX = (x >= T (0))? x: -x; + T absY = (y >= T (0))? y: -y; + + T max = absX; + + if (max < absY) + max = absY; + + if (max == T (0)) + return T (0); + + // + // Do not replace the divisions by max with multiplications by 1/max. + // Computing 1/max can overflow but the divisions below will always + // produce results less than or equal to 1. + // + + absX /= max; + absY /= max; + + return max * Math::sqrt (absX * absX + absY * absY); +} + +template +inline T +Vec2::length () const +{ + T length2 = dot (*this); + + if (length2 < T (2) * limits::smallest()) + return lengthTiny(); + + return Math::sqrt (length2); +} + +template +inline T +Vec2::length2 () const +{ + return dot (*this); +} + +template +const Vec2 & +Vec2::normalize () +{ + T l = length(); + + if (l != T (0)) + { + // + // Do not replace the divisions by l with multiplications by 1/l. + // Computing 1/l can overflow but the divisions below will always + // produce results less than or equal to 1. + // + + x /= l; + y /= l; + } + + return *this; +} + +template +const Vec2 & +Vec2::normalizeExc () throw (Iex::MathExc) +{ + T l = length(); + + if (l == T (0)) + throw NullVecExc ("Cannot normalize null vector."); + + x /= l; + y /= l; + return *this; +} + +template +inline +const Vec2 & +Vec2::normalizeNonNull () +{ + T l = length(); + x /= l; + y /= l; + return *this; +} + +template +Vec2 +Vec2::normalized () const +{ + T l = length(); + + if (l == T (0)) + return Vec2 (T (0)); + + return Vec2 (x / l, y / l); +} + +template +Vec2 +Vec2::normalizedExc () const throw (Iex::MathExc) +{ + T l = length(); + + if (l == T (0)) + throw NullVecExc ("Cannot normalize null vector."); + + return Vec2 (x / l, y / l); +} + +template +inline +Vec2 +Vec2::normalizedNonNull () const +{ + T l = length(); + return Vec2 (x / l, y / l); +} + + +//----------------------- +// Implementation of Vec3 +//----------------------- + +template +inline T & +Vec3::operator [] (int i) +{ + return (&x)[i]; +} + +template +inline const T & +Vec3::operator [] (int i) const +{ + return (&x)[i]; +} + +template +inline +Vec3::Vec3 () +{ + // empty +} + +template +inline +Vec3::Vec3 (T a) +{ + x = y = z = a; +} + +template +inline +Vec3::Vec3 (T a, T b, T c) +{ + x = a; + y = b; + z = c; +} + +template +inline +Vec3::Vec3 (const Vec3 &v) +{ + x = v.x; + y = v.y; + z = v.z; +} + +template +template +inline +Vec3::Vec3 (const Vec3 &v) +{ + x = T (v.x); + y = T (v.y); + z = T (v.z); +} + +template +inline const Vec3 & +Vec3::operator = (const Vec3 &v) +{ + x = v.x; + y = v.y; + z = v.z; + return *this; +} + +template +template +inline +Vec3::Vec3 (const Vec4 &v) +{ + x = T (v.x / v.w); + y = T (v.y / v.w); + z = T (v.z / v.w); +} + +template +template +Vec3::Vec3 (const Vec4 &v, InfException) +{ + T vx = T (v.x); + T vy = T (v.y); + T vz = T (v.z); + T vw = T (v.w); + + T absW = (vw >= T (0))? vw: -vw; + + if (absW < 1) + { + T m = baseTypeMax() * absW; + + if (vx <= -m || vx >= m || vy <= -m || vy >= m || vz <= -m || vz >= m) + throw InfPointExc ("Cannot normalize point at infinity."); + } + + x = vx / vw; + y = vy / vw; + z = vz / vw; +} + +template +template +inline void +Vec3::setValue (S a, S b, S c) +{ + x = T (a); + y = T (b); + z = T (c); +} + +template +template +inline void +Vec3::setValue (const Vec3 &v) +{ + x = T (v.x); + y = T (v.y); + z = T (v.z); +} + +template +template +inline void +Vec3::getValue (S &a, S &b, S &c) const +{ + a = S (x); + b = S (y); + c = S (z); +} + +template +template +inline void +Vec3::getValue (Vec3 &v) const +{ + v.x = S (x); + v.y = S (y); + v.z = S (z); +} + +template +inline T * +Vec3::getValue() +{ + return (T *) &x; +} + +template +inline const T * +Vec3::getValue() const +{ + return (const T *) &x; +} + +template +template +inline bool +Vec3::operator == (const Vec3 &v) const +{ + return x == v.x && y == v.y && z == v.z; +} + +template +template +inline bool +Vec3::operator != (const Vec3 &v) const +{ + return x != v.x || y != v.y || z != v.z; +} + +template +bool +Vec3::equalWithAbsError (const Vec3 &v, T e) const +{ + for (int i = 0; i < 3; i++) + if (!Imath::equalWithAbsError ((*this)[i], v[i], e)) + return false; + + return true; +} + +template +bool +Vec3::equalWithRelError (const Vec3 &v, T e) const +{ + for (int i = 0; i < 3; i++) + if (!Imath::equalWithRelError ((*this)[i], v[i], e)) + return false; + + return true; +} + +template +inline T +Vec3::dot (const Vec3 &v) const +{ + return x * v.x + y * v.y + z * v.z; +} + +template +inline T +Vec3::operator ^ (const Vec3 &v) const +{ + return dot (v); +} + +template +inline Vec3 +Vec3::cross (const Vec3 &v) const +{ + return Vec3 (y * v.z - z * v.y, + z * v.x - x * v.z, + x * v.y - y * v.x); +} + +template +inline const Vec3 & +Vec3::operator %= (const Vec3 &v) +{ + T a = y * v.z - z * v.y; + T b = z * v.x - x * v.z; + T c = x * v.y - y * v.x; + x = a; + y = b; + z = c; + return *this; +} + +template +inline Vec3 +Vec3::operator % (const Vec3 &v) const +{ + return Vec3 (y * v.z - z * v.y, + z * v.x - x * v.z, + x * v.y - y * v.x); +} + +template +inline const Vec3 & +Vec3::operator += (const Vec3 &v) +{ + x += v.x; + y += v.y; + z += v.z; + return *this; +} + +template +inline Vec3 +Vec3::operator + (const Vec3 &v) const +{ + return Vec3 (x + v.x, y + v.y, z + v.z); +} + +template +inline const Vec3 & +Vec3::operator -= (const Vec3 &v) +{ + x -= v.x; + y -= v.y; + z -= v.z; + return *this; +} + +template +inline Vec3 +Vec3::operator - (const Vec3 &v) const +{ + return Vec3 (x - v.x, y - v.y, z - v.z); +} + +template +inline Vec3 +Vec3::operator - () const +{ + return Vec3 (-x, -y, -z); +} + +template +inline const Vec3 & +Vec3::negate () +{ + x = -x; + y = -y; + z = -z; + return *this; +} + +template +inline const Vec3 & +Vec3::operator *= (const Vec3 &v) +{ + x *= v.x; + y *= v.y; + z *= v.z; + return *this; +} + +template +inline const Vec3 & +Vec3::operator *= (T a) +{ + x *= a; + y *= a; + z *= a; + return *this; +} + +template +inline Vec3 +Vec3::operator * (const Vec3 &v) const +{ + return Vec3 (x * v.x, y * v.y, z * v.z); +} + +template +inline Vec3 +Vec3::operator * (T a) const +{ + return Vec3 (x * a, y * a, z * a); +} + +template +inline const Vec3 & +Vec3::operator /= (const Vec3 &v) +{ + x /= v.x; + y /= v.y; + z /= v.z; + return *this; +} + +template +inline const Vec3 & +Vec3::operator /= (T a) +{ + x /= a; + y /= a; + z /= a; + return *this; +} + +template +inline Vec3 +Vec3::operator / (const Vec3 &v) const +{ + return Vec3 (x / v.x, y / v.y, z / v.z); +} + +template +inline Vec3 +Vec3::operator / (T a) const +{ + return Vec3 (x / a, y / a, z / a); +} + +template +T +Vec3::lengthTiny () const +{ + T absX = (x >= T (0))? x: -x; + T absY = (y >= T (0))? y: -y; + T absZ = (z >= T (0))? z: -z; + + T max = absX; + + if (max < absY) + max = absY; + + if (max < absZ) + max = absZ; + + if (max == T (0)) + return T (0); + + // + // Do not replace the divisions by max with multiplications by 1/max. + // Computing 1/max can overflow but the divisions below will always + // produce results less than or equal to 1. + // + + absX /= max; + absY /= max; + absZ /= max; + + return max * Math::sqrt (absX * absX + absY * absY + absZ * absZ); +} + +template +inline T +Vec3::length () const +{ + T length2 = dot (*this); + + if (length2 < T (2) * limits::smallest()) + return lengthTiny(); + + return Math::sqrt (length2); +} + +template +inline T +Vec3::length2 () const +{ + return dot (*this); +} + +template +const Vec3 & +Vec3::normalize () +{ + T l = length(); + + if (l != T (0)) + { + // + // Do not replace the divisions by l with multiplications by 1/l. + // Computing 1/l can overflow but the divisions below will always + // produce results less than or equal to 1. + // + + x /= l; + y /= l; + z /= l; + } + + return *this; +} + +template +const Vec3 & +Vec3::normalizeExc () throw (Iex::MathExc) +{ + T l = length(); + + if (l == T (0)) + throw NullVecExc ("Cannot normalize null vector."); + + x /= l; + y /= l; + z /= l; + return *this; +} + +template +inline +const Vec3 & +Vec3::normalizeNonNull () +{ + T l = length(); + x /= l; + y /= l; + z /= l; + return *this; +} + +template +Vec3 +Vec3::normalized () const +{ + T l = length(); + + if (l == T (0)) + return Vec3 (T (0)); + + return Vec3 (x / l, y / l, z / l); +} + +template +Vec3 +Vec3::normalizedExc () const throw (Iex::MathExc) +{ + T l = length(); + + if (l == T (0)) + throw NullVecExc ("Cannot normalize null vector."); + + return Vec3 (x / l, y / l, z / l); +} + +template +inline +Vec3 +Vec3::normalizedNonNull () const +{ + T l = length(); + return Vec3 (x / l, y / l, z / l); +} + + +//----------------------- +// Implementation of Vec4 +//----------------------- + +template +inline T & +Vec4::operator [] (int i) +{ + return (&x)[i]; +} + +template +inline const T & +Vec4::operator [] (int i) const +{ + return (&x)[i]; +} + +template +inline +Vec4::Vec4 () +{ + // empty +} + +template +inline +Vec4::Vec4 (T a) +{ + x = y = z = w = a; +} + +template +inline +Vec4::Vec4 (T a, T b, T c, T d) +{ + x = a; + y = b; + z = c; + w = d; +} + +template +inline +Vec4::Vec4 (const Vec4 &v) +{ + x = v.x; + y = v.y; + z = v.z; + w = v.w; +} + +template +template +inline +Vec4::Vec4 (const Vec4 &v) +{ + x = T (v.x); + y = T (v.y); + z = T (v.z); + w = T (v.w); +} + +template +inline const Vec4 & +Vec4::operator = (const Vec4 &v) +{ + x = v.x; + y = v.y; + z = v.z; + w = v.w; + return *this; +} + +template +template +inline +Vec4::Vec4 (const Vec3 &v) +{ + x = T (v.x); + y = T (v.y); + z = T (v.z); + w = T (1); +} + +template +template +inline bool +Vec4::operator == (const Vec4 &v) const +{ + return x == v.x && y == v.y && z == v.z && w == v.w; +} + +template +template +inline bool +Vec4::operator != (const Vec4 &v) const +{ + return x != v.x || y != v.y || z != v.z || w != v.w; +} + +template +bool +Vec4::equalWithAbsError (const Vec4 &v, T e) const +{ + for (int i = 0; i < 4; i++) + if (!Imath::equalWithAbsError ((*this)[i], v[i], e)) + return false; + + return true; +} + +template +bool +Vec4::equalWithRelError (const Vec4 &v, T e) const +{ + for (int i = 0; i < 4; i++) + if (!Imath::equalWithRelError ((*this)[i], v[i], e)) + return false; + + return true; +} + +template +inline T +Vec4::dot (const Vec4 &v) const +{ + return x * v.x + y * v.y + z * v.z + w * v.w; +} + +template +inline T +Vec4::operator ^ (const Vec4 &v) const +{ + return dot (v); +} + + +template +inline const Vec4 & +Vec4::operator += (const Vec4 &v) +{ + x += v.x; + y += v.y; + z += v.z; + w += v.w; + return *this; +} + +template +inline Vec4 +Vec4::operator + (const Vec4 &v) const +{ + return Vec4 (x + v.x, y + v.y, z + v.z, w + v.w); +} + +template +inline const Vec4 & +Vec4::operator -= (const Vec4 &v) +{ + x -= v.x; + y -= v.y; + z -= v.z; + w -= v.w; + return *this; +} + +template +inline Vec4 +Vec4::operator - (const Vec4 &v) const +{ + return Vec4 (x - v.x, y - v.y, z - v.z, w - v.w); +} + +template +inline Vec4 +Vec4::operator - () const +{ + return Vec4 (-x, -y, -z, -w); +} + +template +inline const Vec4 & +Vec4::negate () +{ + x = -x; + y = -y; + z = -z; + w = -w; + return *this; +} + +template +inline const Vec4 & +Vec4::operator *= (const Vec4 &v) +{ + x *= v.x; + y *= v.y; + z *= v.z; + w *= v.w; + return *this; +} + +template +inline const Vec4 & +Vec4::operator *= (T a) +{ + x *= a; + y *= a; + z *= a; + w *= a; + return *this; +} + +template +inline Vec4 +Vec4::operator * (const Vec4 &v) const +{ + return Vec4 (x * v.x, y * v.y, z * v.z, w * v.w); +} + +template +inline Vec4 +Vec4::operator * (T a) const +{ + return Vec4 (x * a, y * a, z * a, w * a); +} + +template +inline const Vec4 & +Vec4::operator /= (const Vec4 &v) +{ + x /= v.x; + y /= v.y; + z /= v.z; + w /= v.w; + return *this; +} + +template +inline const Vec4 & +Vec4::operator /= (T a) +{ + x /= a; + y /= a; + z /= a; + w /= a; + return *this; +} + +template +inline Vec4 +Vec4::operator / (const Vec4 &v) const +{ + return Vec4 (x / v.x, y / v.y, z / v.z, w / v.w); +} + +template +inline Vec4 +Vec4::operator / (T a) const +{ + return Vec4 (x / a, y / a, z / a, w / a); +} + +template +T +Vec4::lengthTiny () const +{ + T absX = (x >= T (0))? x: -x; + T absY = (y >= T (0))? y: -y; + T absZ = (z >= T (0))? z: -z; + T absW = (w >= T (0))? w: -w; + + T max = absX; + + if (max < absY) + max = absY; + + if (max < absZ) + max = absZ; + + if (max < absW) + max = absW; + + if (max == T (0)) + return T (0); + + // + // Do not replace the divisions by max with multiplications by 1/max. + // Computing 1/max can overflow but the divisions below will always + // produce results less than or equal to 1. + // + + absX /= max; + absY /= max; + absZ /= max; + absW /= max; + + return max * + Math::sqrt (absX * absX + absY * absY + absZ * absZ + absW * absW); +} + +template +inline T +Vec4::length () const +{ + T length2 = dot (*this); + + if (length2 < T (2) * limits::smallest()) + return lengthTiny(); + + return Math::sqrt (length2); +} + +template +inline T +Vec4::length2 () const +{ + return dot (*this); +} + +template +const Vec4 & +Vec4::normalize () +{ + T l = length(); + + if (l != T (0)) + { + // + // Do not replace the divisions by l with multiplications by 1/l. + // Computing 1/l can overflow but the divisions below will always + // produce results less than or equal to 1. + // + + x /= l; + y /= l; + z /= l; + w /= l; + } + + return *this; +} + +template +const Vec4 & +Vec4::normalizeExc () throw (Iex::MathExc) +{ + T l = length(); + + if (l == T (0)) + throw NullVecExc ("Cannot normalize null vector."); + + x /= l; + y /= l; + z /= l; + w /= l; + return *this; +} + +template +inline +const Vec4 & +Vec4::normalizeNonNull () +{ + T l = length(); + x /= l; + y /= l; + z /= l; + w /= l; + return *this; +} + +template +Vec4 +Vec4::normalized () const +{ + T l = length(); + + if (l == T (0)) + return Vec4 (T (0)); + + return Vec4 (x / l, y / l, z / l, w / l); +} + +template +Vec4 +Vec4::normalizedExc () const throw (Iex::MathExc) +{ + T l = length(); + + if (l == T (0)) + throw NullVecExc ("Cannot normalize null vector."); + + return Vec4 (x / l, y / l, z / l, w / l); +} + +template +inline +Vec4 +Vec4::normalizedNonNull () const +{ + T l = length(); + return Vec4 (x / l, y / l, z / l, w / l); +} + +//----------------------------- +// Stream output implementation +//----------------------------- + +template +std::ostream & +operator << (std::ostream &s, const Vec2 &v) +{ + return s << '(' << v.x << ' ' << v.y << ')'; +} + +template +std::ostream & +operator << (std::ostream &s, const Vec3 &v) +{ + return s << '(' << v.x << ' ' << v.y << ' ' << v.z << ')'; +} + +template +std::ostream & +operator << (std::ostream &s, const Vec4 &v) +{ + return s << '(' << v.x << ' ' << v.y << ' ' << v.z << ' ' << v.w << ')'; +} + + +//----------------------------------------- +// Implementation of reverse multiplication +//----------------------------------------- + +template +inline Vec2 +operator * (T a, const Vec2 &v) +{ + return Vec2 (a * v.x, a * v.y); +} + +template +inline Vec3 +operator * (T a, const Vec3 &v) +{ + return Vec3 (a * v.x, a * v.y, a * v.z); +} + +template +inline Vec4 +operator * (T a, const Vec4 &v) +{ + return Vec4 (a * v.x, a * v.y, a * v.z, a * v.w); +} + + +#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER +#pragma warning(pop) +#endif + +} // namespace Imath + +#endif diff --git a/3rdparty/openexr/Imath/ImathVecAlgo.h b/3rdparty/openexr/Imath/ImathVecAlgo.h new file mode 100644 index 000000000..33e2c12c5 --- /dev/null +++ b/3rdparty/openexr/Imath/ImathVecAlgo.h @@ -0,0 +1,146 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas +// Digital Ltd. LLC +// +// 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 Industrial Light & Magic 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 INCLUDED_IMATHVECALGO_H +#define INCLUDED_IMATHVECALGO_H + +//------------------------------------------------------------------------- +// +// This file contains algorithms applied to or in conjunction +// with points (Imath::Vec2 and Imath::Vec3). +// The assumption made is that these functions are called much +// less often than the basic point functions or these functions +// require more support classes. +// +//------------------------------------------------------------------------- + +#include "ImathVec.h" +#include "ImathLimits.h" + +namespace Imath { + + +//----------------------------------------------------------------- +// Find the projection of vector t onto vector s (Vec2, Vec3, Vec4) +//----------------------------------------------------------------- + +template Vec project (const Vec &s, const Vec &t); + + +//------------------------------------------------ +// Find a vector that is perpendicular to s and +// in the same plane as s and t (Vec2, Vec3, Vec4) +//------------------------------------------------ + +template Vec orthogonal (const Vec &s, const Vec &t); + + +//----------------------------------------------- +// Find the direction of a ray s after reflection +// off a plane with normal t (Vec2, Vec3, Vec4) +//----------------------------------------------- + +template Vec reflect (const Vec &s, const Vec &t); + + +//-------------------------------------------------------------------- +// Find the vertex of triangle (v0, v1, v2) that is closest to point p +// (Vec2, Vec3, Vec4) +//-------------------------------------------------------------------- + +template Vec closestVertex (const Vec &v0, + const Vec &v1, + const Vec &v2, + const Vec &p); + +//--------------- +// Implementation +//--------------- + +template +Vec +project (const Vec &s, const Vec &t) +{ + Vec sNormalized = s.normalized(); + return sNormalized * (sNormalized ^ t); +} + +template +Vec +orthogonal (const Vec &s, const Vec &t) +{ + return t - project (s, t); +} + +template +Vec +reflect (const Vec &s, const Vec &t) +{ + return s - typename Vec::BaseType(2) * (s - project(t, s)); +} + +template +Vec +closestVertex(const Vec &v0, + const Vec &v1, + const Vec &v2, + const Vec &p) +{ + Vec nearest = v0; + typename Vec::BaseType neardot = (v0 - p).length2(); + typename Vec::BaseType tmp = (v1 - p).length2(); + + if (tmp < neardot) + { + neardot = tmp; + nearest = v1; + } + + tmp = (v2 - p).length2(); + + if (tmp < neardot) + { + neardot = tmp; + nearest = v2; + } + + return nearest; +} + + +} // namespace Imath + +#endif diff --git a/3rdparty/ilmimf/LICENSE b/3rdparty/openexr/LICENSE similarity index 96% rename from 3rdparty/ilmimf/LICENSE rename to 3rdparty/openexr/LICENSE index 268d234ad..6372750d3 100644 --- a/3rdparty/ilmimf/LICENSE +++ b/3rdparty/openexr/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm +Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd. Portions contributed and copyright held by others as indicated. All rights reserved. diff --git a/3rdparty/openexr/OpenEXRConfig.h.cmakein b/3rdparty/openexr/OpenEXRConfig.h.cmakein new file mode 100644 index 000000000..0a6b592c7 --- /dev/null +++ b/3rdparty/openexr/OpenEXRConfig.h.cmakein @@ -0,0 +1,36 @@ +// +// Define and set to 1 if the target system supports a proc filesystem +// compatible with the Linux kernel's proc filesystem. Note that this +// is only used by a program in the IlmImfTest test suite, it's not +// used by any OpenEXR library or application code. +// + +#undef HAVE_LINUX_PROCFS + +// +// Define and set to 1 if the target system is a Darwin-based system +// (e.g., OS X). +// + +#undef HAVE_DARWIN + +// +// Define and set to 1 if the target system has a complete +// implementation, specifically if it supports the std::right +// formatter. +// + +#undef HAVE_COMPLETE_IOMANIP + +// +// Define and set to 1 if the target system has support for large +// stack sizes. +// + +#undef HAVE_LARGE_STACK + +// +// Version string for runtime access +// +#define OPENEXR_VERSION_STRING "1.7.1" +#define OPENEXR_PACKAGE_STRING "OpenEXR 1.7.1" diff --git a/CMakeLists.txt b/CMakeLists.txt index b644212c7..e6639a962 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,11 +161,12 @@ OCV_OPTION(BUILD_ANDROID_PACKAGE "Build platform-specific package for Google # 3rd party libs -OCV_OPTION(BUILD_ZLIB "Build zlib from source" WIN32 OR IOS OR APPLE ) -OCV_OPTION(BUILD_TIFF "Build libtiff from source" WIN32 OR IOS OR ANDROID OR APPLE ) -OCV_OPTION(BUILD_JASPER "Build libjasper from source" WIN32 OR IOS OR ANDROID OR APPLE ) -OCV_OPTION(BUILD_JPEG "Build libjpeg from source" WIN32 OR IOS OR ANDROID OR APPLE ) -OCV_OPTION(BUILD_PNG "Build libpng from source" WIN32 OR IOS OR ANDROID OR APPLE ) +OCV_OPTION(BUILD_ZLIB "Build zlib from source" WIN32 OR APPLE ) +OCV_OPTION(BUILD_TIFF "Build libtiff from source" WIN32 OR ANDROID OR APPLE ) +OCV_OPTION(BUILD_JASPER "Build libjasper from source" WIN32 OR ANDROID OR APPLE ) +OCV_OPTION(BUILD_JPEG "Build libjpeg from source" WIN32 OR ANDROID OR APPLE ) +OCV_OPTION(BUILD_PNG "Build libpng from source" WIN32 OR ANDROID OR APPLE ) +OCV_OPTION(BUILD_OPENEXR "Build openexr from source" WIN32 OR ANDROID OR APPLE ) # OpenCV installation options # =================================================== @@ -633,8 +634,11 @@ if(WITH_JASPER) else() status(" JPEG 2000:" "NO") endif() - -status(" OpenEXR:" WITH_OPENEXR AND OPENEXR_FOUND THEN "${OPENEXR_LIBRARIES} (ver ${OPENEXR_VERSION})" ELSE NO) +if(WITH_OPENEXR) + status(" OpenEXR:" OPENEXR_FOUND THEN "${OPENEXR_LIBRARIES} (ver ${OPENEXR_VERSION})" ELSE "build (ver ${OPENEXR_VERSION})") +else() + status(" OpenEXR:" "NO") +endif() # ========================== VIDEO IO ========================== status("") diff --git a/cmake/OpenCVFindLibsGrfmt.cmake b/cmake/OpenCVFindLibsGrfmt.cmake index 36b89cae5..598816991 100644 --- a/cmake/OpenCVFindLibsGrfmt.cmake +++ b/cmake/OpenCVFindLibsGrfmt.cmake @@ -142,7 +142,19 @@ set(PNG_VERSION "${PNG_LIBPNG_VER_MAJOR}.${PNG_LIBPNG_VER_MINOR}.${PNG_LIBPNG_VE # --- OpenEXR (optional) --- if(WITH_OPENEXR) - include("${OpenCV_SOURCE_DIR}/cmake/OpenCVFindOpenEXR.cmake") + if(BUILD_OPENEXR) + ocv_clear_vars(OPENEXR_FOUND) + else() + include("${OpenCV_SOURCE_DIR}/cmake/OpenCVFindOpenEXR.cmake") + endif() +endif() + +if(WITH_OPENEXR AND NOT OPENEXR_FOUND) + ocv_clear_vars(OPENEXR_INCLUDE_PATHS OPENEXR_LIBRARIES OPENEXR_ILMIMF_LIBRARY OPENEXR_VERSION) + + set(OPENEXR_LIBRARIES IlmImf) + set(OPENEXR_ILMIMF_LIBRARY IlmImf) + add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/openexr") endif() #cmake 2.8.2 bug - it fails to determine zlib version diff --git a/modules/highgui/CMakeLists.txt b/modules/highgui/CMakeLists.txt index d53c17c40..30c0c82f4 100644 --- a/modules/highgui/CMakeLists.txt +++ b/modules/highgui/CMakeLists.txt @@ -39,9 +39,9 @@ if(WITH_JASPER) list(APPEND GRFMT_LIBS ${JASPER_LIBRARIES}) endif() -if(WITH_OPENEXR AND OPENEXR_FOUND) +if(WITH_OPENEXR) add_definitions(-DHAVE_OPENEXR) - ocv_include_directories(${OPENEXR_INCLUDE_PATHS}) + include_directories(SYSTEM ${OPENEXR_INCLUDE_PATHS}) list(APPEND GRFMT_LIBS ${OPENEXR_LIBRARIES}) endif() From 941391c0bead29f29904b49e776d5468ac8c20ff Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sat, 25 Aug 2012 17:12:17 +0400 Subject: [PATCH 075/103] Fix openexr build with MSVC --- 3rdparty/openexr/CMakeLists.txt | 7 ++- .../openexr/IlmImf/ImfPxr24Compressor.cpp | 2 +- 3rdparty/openexr/IlmImf/ImfZipCompressor.cpp | 2 +- 3rdparty/openexr/Imath/ImathBox.cpp | 37 ------------- 3rdparty/openexr/Imath/ImathShear.cpp | 54 ------------------- modules/highgui/src/grfmt_exr.cpp | 9 ++-- 6 files changed, 11 insertions(+), 100 deletions(-) delete mode 100644 3rdparty/openexr/Imath/ImathBox.cpp delete mode 100644 3rdparty/openexr/Imath/ImathShear.cpp diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt index 3b811e2ee..60bfa3ca7 100644 --- a/3rdparty/openexr/CMakeLists.txt +++ b/3rdparty/openexr/CMakeLists.txt @@ -37,8 +37,11 @@ endif() source_group("Include" FILES ${lib_hdrs} ) source_group("Src" FILES ${lib_srcs}) -ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Wunused -Wsign-compare -Wundef -Wmissing-declarations -Wuninitialized -Wswitch - /wd4018 /wd4099 /wd4100 /wd4101 /wd4127 /wd4189 /wd4244 /wd4245 /wd4267 /wd4305 /wd4334 /wd4389 /wd4512 /wd4701 /wd4702 /wd4706 /wd4800) +ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow -Wunused -Wsign-compare -Wundef -Wmissing-declarations -Wuninitialized -Wswitch -Wparentheses) +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4018 /wd4099 /wd4100 /wd4101 /wd4127 /wd4189 /wd4245 /wd4305 /wd4389 /wd4512 /wd4701 /wd4702 /wd4706 /wd4800) # vs2005 +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4334) # vs2005 Win64 +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244) # vs2008 +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4267) # vs2008 Win64 add_library(IlmImf STATIC ${lib_hdrs} ${lib_srcs}) target_link_libraries(IlmImf ${ZLIB_LIBRARIES}) diff --git a/3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp b/3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp index 270facfce..8f3fb2ca6 100644 --- a/3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp +++ b/3rdparty/openexr/IlmImf/ImfPxr24Compressor.cpp @@ -62,7 +62,7 @@ // string of bytes is compressed with zlib. // //----------------------------------------------------------------------------- -#define ZLIB_WINAPI +//#define ZLIB_WINAPI #include #include diff --git a/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp b/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp index 80cefa1e0..1a56adf71 100644 --- a/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp +++ b/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp @@ -39,7 +39,7 @@ // class ZipCompressor // //----------------------------------------------------------------------------- -#define ZLIB_WINAPI +//#define ZLIB_WINAPI #include #include diff --git a/3rdparty/openexr/Imath/ImathBox.cpp b/3rdparty/openexr/Imath/ImathBox.cpp deleted file mode 100644 index 07bddfd3b..000000000 --- a/3rdparty/openexr/Imath/ImathBox.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas -// Digital Ltd. LLC -// -// 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 Industrial Light & Magic nor the names of -// its contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////// - -#include "ImathBox.h" - -// this file is necessary for template instantiation on windows diff --git a/3rdparty/openexr/Imath/ImathShear.cpp b/3rdparty/openexr/Imath/ImathShear.cpp deleted file mode 100644 index 72541f58b..000000000 --- a/3rdparty/openexr/Imath/ImathShear.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/////////////////////////////////////////////////////////////////////////// -// -// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas -// Digital Ltd. LLC -// -// 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 Industrial Light & Magic 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. -// -/////////////////////////////////////////////////////////////////////////// - - - - -//---------------------------------------------------------------------------- -// -// Specializations of the Shear6 template. -// -//---------------------------------------------------------------------------- - -#include "ImathShear.h" - -namespace Imath { - - - -// empty - - - -} // namespace Imath diff --git a/modules/highgui/src/grfmt_exr.cpp b/modules/highgui/src/grfmt_exr.cpp index ac874ae61..f01f1fd8c 100644 --- a/modules/highgui/src/grfmt_exr.cpp +++ b/modules/highgui/src/grfmt_exr.cpp @@ -44,6 +44,10 @@ #ifdef HAVE_OPENEXR +#if defined _MSC_VER && _MSC_VER >= 1200 +# pragma warning( disable: 4100 4244 4267 ) +#endif + #include #include #include @@ -53,11 +57,6 @@ #include "grfmt_exr.hpp" #if defined _MSC_VER && _MSC_VER >= 1200 -#pragma comment(lib, "Half.lib") -#pragma comment(lib, "Iex.lib") -#pragma comment(lib, "IlmImf.lib") -#pragma comment(lib, "IlmThread.lib") -#pragma comment(lib, "Imath.lib") #undef UINT #define UINT ((Imf::PixelType)0) From 577d9cdece0e20e13e3ee9f52a621d1b0d73ea9f Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sat, 25 Aug 2012 18:13:59 +0400 Subject: [PATCH 076/103] Fix openexr build on MinGW --- 3rdparty/openexr/IlmImf/ImfAutoArray.h | 4 ++++ modules/highgui/src/grfmt_exr.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/3rdparty/openexr/IlmImf/ImfAutoArray.h b/3rdparty/openexr/IlmImf/ImfAutoArray.h index edb8b1076..555205b0a 100644 --- a/3rdparty/openexr/IlmImf/ImfAutoArray.h +++ b/3rdparty/openexr/IlmImf/ImfAutoArray.h @@ -46,6 +46,10 @@ #include "OpenEXRConfig.h" +#if !defined (HAVE_LARGE_STACK) +#include +#endif + namespace Imf { diff --git a/modules/highgui/src/grfmt_exr.cpp b/modules/highgui/src/grfmt_exr.cpp index f01f1fd8c..9697cbc2d 100644 --- a/modules/highgui/src/grfmt_exr.cpp +++ b/modules/highgui/src/grfmt_exr.cpp @@ -56,7 +56,7 @@ #include #include "grfmt_exr.hpp" -#if defined _MSC_VER && _MSC_VER >= 1200 +#if defined _WIN32 #undef UINT #define UINT ((Imf::PixelType)0) From 7280039d8cab0ec97baaf8eefcf133159e608d9f Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Sun, 2 Sep 2012 21:16:57 +0400 Subject: [PATCH 077/103] Update readme for 3rdparty libs --- 3rdparty/readme.txt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/3rdparty/readme.txt b/3rdparty/readme.txt index ceac43dda..5f135a52c 100644 --- a/3rdparty/readme.txt +++ b/3rdparty/readme.txt @@ -57,18 +57,14 @@ jasper-1.900.1 - JasPer is a collection of software please, visit the project homepage: http://www.ece.uvic.ca/~mdadams/jasper/ ------------------------------------------------------------------------------------ -openexr-1.4.0 - OpenEXR is a high dynamic-range (HDR) image file format developed +openexr-1.7.1 - OpenEXR is a high dynamic-range (HDR) image file format developed by Industrial Light & Magic for use in computer imaging applications. - Copyright (c) 2004, Industrial Light & Magic, a division of Lucasfilm - Entertainment Company Ltd. Portions contributed and copyright held by - others as indicated. All rights reserved. + Copyright (c) 2006, Industrial Light & Magic, a division of Lucasfilm + Entertainment Company Ltd. Portions contributed and copyright held by + others as indicated. All rights reserved. - The project homepage: http://www.openexr.com/ - - OpenCV does not include openexr codec. - To add it, you will need install OpenEXR, reconfigure OpenCV - using CMake (make sure OpenEXR library is found) and the rebuild OpenCV. + The project homepage: http://www.openexr.com ------------------------------------------------------------------------------------ ffmpeg-0.8.0 - FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video. It includes libavcodec - From e402bb496d3c147a2561664b633fce21b38b1d3c Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 3 Sep 2012 03:54:06 +0400 Subject: [PATCH 078/103] Add support for all NDK runtimes --- android/android.toolchain.cmake | 333 ++++++++++++++++++++------------ 1 file changed, 211 insertions(+), 122 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index 96772e9e8..ece2c9dc6 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -82,6 +82,35 @@ # obsolete variables which were used by previous versions of this file for # backward compatibility. # +# ANDROID_STL=gnustl_static - specify the runtime to use. +# +# Possible values are: +# none -> Do not configure the runtime. +# system -> Use the default minimal system C++ runtime library. +# Implies -fno-rtti -fno-exceptions. +# system_re -> Use the default minimal system C++ runtime library. +# Implies -frtti -fexceptions. +# gabi++_static -> Use the GAbi++ runtime as a static library. +# Implies -frtti -fno-exceptions. +# Available for NDK r7 and newer. +# gabi++_shared -> Use the GAbi++ runtime as a shared library. +# Implies -frtti -fno-exceptions. +# Available for NDK r7 and newer. +# stlport_static -> Use the STLport runtime as a static library. +# Implies -fno-rtti -fno-exceptions for NDK before r7. +# Implies -frtti -fno-exceptions for NDK r7 and newer. +# stlport_shared -> Use the STLport runtime as a shared library. +# Implies -fno-rtti -fno-exceptions for NDK before r7. +# Implies -frtti -fno-exceptions for NDK r7 and newer. +# gnustl_static -> Use the GNU STL as a static library. +# Implies -frtti -fexceptions. +# gnustl_shared -> Use the GNU STL as a shared library. +# Implies -frtti -fno-exceptions. +# Available for NDK r7b and newer. +# +# ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on +# chosen runtime. If disabled, then the user is responsible for settings +# these options. # # What?: # android-cmake toolchain searches for NDK/toolchain in the following order: @@ -338,18 +367,6 @@ macro( __DETECT_TOOLCHAIN_MACHINE_NAME _var _root ) endif() endmacro() -macro( __COPY_IF_DIFFERENT _source _destination ) - execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${_source}" "${_destination}" RESULT_VARIABLE __fileCopyProcess ) - if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${_destination}") - message( SEND_ERROR "Failed copying of ${_source} to the ${_destination}" ) - endif() - unset( __fileCopyProcess ) -endmacro() - - -# stl version: by default gnustl_static will be used -set( ANDROID_USE_STLPORT FALSE CACHE BOOL "Experimental: use stlport_static instead of gnustl_static") -mark_as_advanced( ANDROID_USE_STLPORT ) # fight against cygwin set( ANDROID_FORBID_SYGWIN TRUE CACHE BOOL "Prevent cmake from working under cygwin and using cygwin tools") @@ -676,29 +693,151 @@ if( CMAKE_VERSION VERSION_GREATER "2.8" ) set_property( CACHE ANDROID_NATIVE_API_LEVEL PROPERTY STRINGS ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} ) endif() -# setup paths -if( BUILD_WITH_STANDALONE_TOOLCHAIN ) - set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" ) - set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" ) - set( __stlLibPath "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" ) +# setup output directories +set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "root for library output, set this to change where android libs are installed to" ) +set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" ) + +if(NOT _CMAKE_IN_TRY_COMPILE) + if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" ) + set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" ) + else() + set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" ) + endif() + set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for android libs" ) endif() + +# runtime choice (STL, rtti, exceptions) +if( NOT ANDROID_STL ) + if( DEFINED ANDROID_USE_STLPORT ) + if( ANDROID_USE_STLPORT ) + set( ANDROID_STL stlport_static ) + endif() + message( WARNING "You are using an obsolete variable ANDROID_USE_STLPORT to select the STL. Use -DANDROID_STL=stlport_static instead." ) + endif() + if( NOT ANDROID_STL ) + set( ANDROID_STL gnustl_static ) + endif() +endif() +set( ANDROID_STL "${ANDROID_STL}" CACHE STRING "C++ runtime" ) +set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and exceptions support based on C++ runtime" ) +mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES ) + +if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$") + message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\". +The possible values are: + none -> Do not configure the runtime. + system -> Use the default minimal system C++ runtime library. + system_re -> Same as system but with rtti and exceptions. + gabi++_static -> Use the GAbi++ runtime as a static library. + gabi++_shared -> Use the GAbi++ runtime as a shared library. + stlport_static -> Use the STLport runtime as a static library. + stlport_shared -> Use the STLport runtime as a shared library. + gnustl_static -> (default) Use the GNU STL as a static library. + gnustl_shared -> Use the GNU STL as a shared library. + " ) +endif() + +unset( ANDROID_RTTI ) +unset( ANDROID_EXCEPTIONS ) +unset( ANDROID_STL_INCLUDE_DIRS ) +unset( __libstl ) +unset( __libsupcxx ) + +# setup paths and STL for NDK if( BUILD_WITH_ANDROID_NDK ) set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" ) set( ANDROID_SYSROOT "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}" ) - if( ANDROID_USE_STLPORT ) - set( __stlIncludePath "${ANDROID_NDK}/sources/cxx-stl/stlport/stlport" ) - set( __stlLibPath "${ANDROID_NDK}/sources/cxx-stl/stlport/libs/${ANDROID_NDK_ABI_NAME}" ) - else() - if( EXISTS "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" ) - set( __stlIncludePath "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/include" ) - set( __stlLibPath "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}" ) + + if( ANDROID_STL STREQUAL "none" ) + # do nothing + elseif( ANDROID_STL STREQUAL "system" ) + set( ANDROID_RTTI OFF ) + set( ANDROID_EXCEPTIONS OFF ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" ) + elseif( ANDROID_STL STREQUAL "system_re" ) + set( ANDROID_RTTI ON ) + set( ANDROID_EXCEPTIONS ON ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" ) + elseif( ANDROID_STL MATCHES "gabi" ) + if( ANDROID_NDK_RELEASE STRLESS "r7" ) + message( FATAL_ERROR "gabi++ is not awailable in your NDK. You have to upgrade to NDK r7 or newer to use gabi++.") + endif() + set( ANDROID_RTTI ON ) + set( ANDROID_EXCEPTIONS OFF ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/gabi++/include" ) + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gabi++/libs/${ANDROID_NDK_ABI_NAME}/libgabi++_static.a" ) + elseif( ANDROID_STL MATCHES "stlport" ) + set( ANDROID_EXCEPTIONS OFF ) + if( ANDROID_NDK_RELEASE STRLESS "r7" ) + set( ANDROID_RTTI OFF ) else() - set( __stlIncludePath "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/include" ) - set( __stlLibPath "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}" ) + set( ANDROID_RTTI ON ) + endif() + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/stlport/stlport" ) + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/stlport/libs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" ) + elseif( ANDROID_STL MATCHES "gnustl" ) + set( ANDROID_EXCEPTIONS ON ) + set( ANDROID_RTTI ON ) + if( EXISTS "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" ) + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" ) + else() + set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++" ) + endif() + set( ANDROID_STL_INCLUDE_DIRS "${__libstl}/include" "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/include" ) + if( EXISTS "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" ) + set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" ) + else() + set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" ) + endif() + else() + message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" ) + endif() + + if( ANDROID_STL STREQUAL "system_re" OR ANDROID_STL MATCHES "gnustl" ) + # find libsupc++.a + if( ANDROID_NDK_RELEASE STRGREATER "r8" ) # r8b + set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) + elseif( NOT ANDROID_NDK_RELEASE STRLESS "r7" AND ANDROID_NDK_RELEASE STRLESS "r8b") + set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) + else( ANDROID_NDK_RELEASE STRLESS "r7" ) + if( ARMEABI_V7A ) + if( ANDROID_FORCE_ARM_BUILD ) + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" ) + else() + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" ) + endif() + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD ) + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" ) + else() + set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" ) + endif() + endif() + if( NOT EXISTS "${__libsupcxx}") + message( ERROR "Could not find libsupc++.a for a chosen platform. Either your NDK is not supported or is broken.") endif() endif() endif() +# setup paths and STL for standalone toolchain +if( BUILD_WITH_STANDALONE_TOOLCHAIN ) + set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" ) + set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" ) + #set( __stlLibPath "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" ) + #TODO: configure stl +endif() + + +if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl ) + string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" ) + get_filename_component( __libstlname "${__libstl}" NAME ) + execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess ) + if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}") + message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" ) + endif() + unset( __fileCopyProcess ) + unset( __libstlname ) +endif() + # ccache support __INIT_VARIABLE( _ndk_ccache NDK_CCACHE ENV_NDK_CCACHE ) if( _ndk_ccache ) @@ -739,43 +878,6 @@ if( APPLE ) mark_as_advanced( CMAKE_INSTALL_NAME_TOOL ) endif() -# export directories -set( ANDROID_SYSTEM_INCLUDE_DIRS "" ) -set( ANDROID_SYSTEM_LIB_DIRS "" ) - -# setup output directories -set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "root for library output, set this to change where android libs are installed to" ) -set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" ) - -if(NOT _CMAKE_IN_TRY_COMPILE) - if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" ) - set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" ) - else() - set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" ) - endif() - set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "path for android libs" ) -endif() - -# includes -list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${ANDROID_SYSROOT}/usr/include" ) -if( __stlIncludePath AND EXISTS "${__stlIncludePath}" ) - list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${__stlIncludePath}" ) -endif() - -# c++ bits includes -if( __stlLibPath AND EXISTS "${__stlLibPath}/include" ) - list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${__stlLibPath}/include" ) -endif() -if( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/thumb/bits" ) - list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/thumb" ) -elseif( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" ) - list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" ) -elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" ) - list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" ) -elseif( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/bits" ) - list( APPEND ANDROID_SYSTEM_INCLUDE_DIRS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" ) -endif() - # flags and definitions if(ANDROID_SYSROOT MATCHES "[ ;\"]") set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" ) @@ -831,14 +933,6 @@ else() set( _CMAKE_C_FLAGS "" ) endif() -if( ANDROID_USE_STLPORT ) - set( _CMAKE_CXX_FLAGS "${_CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions" ) - set( _CMAKE_C_FLAGS "${_CMAKE_C_FLAGS} -fno-exceptions" ) -else() - set( _CMAKE_CXX_FLAGS "${_CMAKE_CXX_FLAGS} -frtti -fexceptions" ) - set( _CMAKE_C_FLAGS "${_CMAKE_C_FLAGS} -fexceptions" ) -endif() - # release and debug flags if( ARMEABI OR ARMEABI_V7A ) if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 ) @@ -891,50 +985,23 @@ elseif( X86 ) set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" )#sse? endif() -# linker flags -if( NOT DEFINED __ndklibspath ) - set( __ndklibspath "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/ndklibs/${ANDROID_NDK_ABI_NAME}" ) +# STL +if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o ") + set( CMAKE_CXX_CREATE_SHARED_MODULE " -o ") + if( EXISTS "${__libstl}" ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"") + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"") + endif() + if( EXISTS "${__libsupcxx}" ) + set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"") + set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"") + endif() endif() -list( APPEND ANDROID_SYSTEM_LIB_DIRS "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) + +# linker flags set( ANDROID_LINKER_FLAGS "" ) -# STL -if( ANDROID_USE_STLPORT ) - if( EXISTS "${__stlLibPath}/libstlport_static.a" ) - set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o \"${__stlLibPath}/libstlport_static.a\"") - set( CMAKE_CXX_CREATE_SHARED_MODULE " -o \"${__stlLibPath}/libstlport_static.a\"") - endif() -else( ANDROID_USE_STLPORT ) - if( EXISTS "${__stlLibPath}/libgnustl_static.a" ) - __COPY_IF_DIFFERENT( "${__stlLibPath}/libgnustl_static.a" "${__ndklibspath}/libstdc++.a" ) - elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" ) - __COPY_IF_DIFFERENT( "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" "${__ndklibspath}/libstdc++.a" ) - elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" ) - __COPY_IF_DIFFERENT( "${__stlLibPath}/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" "${__ndklibspath}/libstdc++.a" ) - elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${__stlLibPath}/thumb/libstdc++.a" ) - __COPY_IF_DIFFERENT( "${__stlLibPath}/thumb/libstdc++.a" "${__ndklibspath}/libstdc++.a" ) - elseif( EXISTS "${__stlLibPath}/libstdc++.a" ) - __COPY_IF_DIFFERENT( "${__stlLibPath}/libstdc++.a" "${__ndklibspath}/libstdc++.a" ) - endif() - if( EXISTS "${__stlLibPath}/libsupc++.a" ) - __COPY_IF_DIFFERENT( "${__stlLibPath}/libsupc++.a" "${__ndklibspath}/libsupc++.a" ) - elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" ) - __COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" "${__ndklibspath}/libsupc++.a" ) - elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" ) - __COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" "${__ndklibspath}/libsupc++.a" ) - elseif( ANDROID_ARCH_NAME STREQUAL "arm" AND EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" ) - __COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" "${__ndklibspath}/libsupc++.a" ) - elseif( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" ) - __COPY_IF_DIFFERENT( "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" "${__ndklibspath}/libsupc++.a" ) - endif() - list( APPEND ANDROID_SYSTEM_LIB_DIRS "${__ndklibspath}" ) -endif( ANDROID_USE_STLPORT ) - -# cleanup for STL search -unset( __stlIncludePath ) -unset( __stlLibPath ) - -# other linker flags __INIT_VARIABLE( ANDROID_NO_UNDEFINED OBSOLETE_NO_UNDEFINED VALUES ON ) set( ANDROID_NO_UNDEFINED ${ANDROID_NO_UNDEFINED} CACHE BOOL "Show all undefined symbols as linker errors" FORCE ) mark_as_advanced( ANDROID_NO_UNDEFINED ) @@ -943,7 +1010,7 @@ if( ANDROID_NO_UNDEFINED ) endif() if (ANDROID_NDK_RELEASE STRLESS "r7") - # libGLESv2.so in NDK's prior to r7 refers to missing exteranal symbols. + # libGLESv2.so in NDK's prior to r7 refers to missing external symbols. # So this flag option is required for all projects using OpenGL from native. __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON ) else() @@ -990,8 +1057,8 @@ set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "linker flags" ) set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "linker flags" ) set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "linker flags" ) -include_directories( SYSTEM ${ANDROID_SYSTEM_INCLUDE_DIRS} ) -link_directories( ${ANDROID_SYSTEM_LIB_DIRS} ) +include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} ) +link_directories( "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) # finish flags set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Extra Android compiler flags" ) @@ -1008,6 +1075,26 @@ else() set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" ) endif() +# configure rtti +if( DEFINED ANDROID_RTTI AND ANDROID_STL_FORCE_FEATURES ) + if( ANDROID_RTTI ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti" ) + else() + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti" ) + endif() +endif() + +# configure exceptios +if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES ) + if( ANDROID_EXCEPTIONS ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions" ) + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions" ) + else() + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions" ) + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-exceptions" ) + endif() +endif() + # set these global flags for cmake client scripts to change behavior set( ANDROID True ) set( BUILD_ANDROID True ) @@ -1082,9 +1169,9 @@ endmacro() if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" ) set( __toolchain_config "") foreach( __var NDK_CCACHE ANDROID_ABI ANDROID_FORCE_ARM_BUILD ANDROID_NATIVE_API_LEVEL ANDROID_NO_UNDEFINED - ANDROID_SO_UNDEFINED ANDROID_SET_OBSOLETE_VARIABLES LIBRARY_OUTPUT_PATH_ROOT ANDROID_USE_STLPORT - ANDROID_FORBID_SYGWIN ANDROID_NDK ANDROID_STANDALONE_TOOLCHAIN ANDROID_FUNCTION_LEVEL_LINKING - ANDROID_USE_GOLD_LINKER __ndklibspath ) + ANDROID_SO_UNDEFINED ANDROID_SET_OBSOLETE_VARIABLES LIBRARY_OUTPUT_PATH_ROOT ANDROID_STL + ANDROID_STL_FORCE_FEATURES ANDROID_FORBID_SYGWIN ANDROID_NDK ANDROID_STANDALONE_TOOLCHAIN + ANDROID_FUNCTION_LEVEL_LINKING ANDROID_USE_GOLD_LINKER ) if( DEFINED ${__var} ) if( "${__var}" MATCHES " ") set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" CACHE INTERNAL \"\" )\n" ) @@ -1095,7 +1182,6 @@ if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" ) endforeach() file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/android.toolchain.config.cmake" "${__toolchain_config}" ) unset( __toolchain_config ) - unset( __ndklibspath ) endif() @@ -1113,7 +1199,6 @@ endif() # ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips" # ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14 (depends on NDK version) # ANDROID_SET_OBSOLETE_VARIABLES : ON/OFF -# ANDROID_USE_STLPORT : OFF/ON - EXPERIMENTAL!!! # ANDROID_FORBID_SYGWIN : ON/OFF # ANDROID_NO_UNDEFINED : ON/OFF # ANDROID_SO_UNDEFINED : OFF/ON (default depends on NDK version) @@ -1121,6 +1206,8 @@ endif() # ANDROID_USE_GOLD_LINKER : ON/OFF (default depends on NDK version and host & target platforms) # Variables that takes effect only at first run: # ANDROID_FORCE_ARM_BUILD : ON/OFF +# ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none +# ANDROID_STL_FORCE_FEATURES : ON/OFF # LIBRARY_OUTPUT_PATH_ROOT : # NDK_CCACHE : # Can be set only at the first run: @@ -1132,6 +1219,7 @@ endif() # ARM_TARGET : superseded by ANDROID_ABI # ARM_TARGETS : superseded by ANDROID_ABI (can be set only) # ANDROID_NDK_TOOLCHAIN_ROOT : superseded by ANDROID_STANDALONE_TOOLCHAIN (can be set only) +# ANDROID_USE_STLPORT : superseded by ANDROID_STL=stlport_static # ANDROID_LEVEL : superseded by ANDROID_NATIVE_API_LEVEL (completely removed) # # Primary read-only variables: @@ -1151,8 +1239,6 @@ endif() # ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b; set only for NDK # ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI # ANDROID_SYSROOT : path to the compiler sysroot -# ANDROID_SYSTEM_INCLUDE_DIRS -# ANDROID_SYSTEM_LIB_DIRS # TOOL_OS_SUFFIX : "" or ".exe" depending on host platform # Obsolete: # ARMEABI_NDK_NAME : superseded by ANDROID_NDK_ABI_NAME @@ -1164,6 +1250,9 @@ endif() # ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux" # ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK) # ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK +# ANDROID_STL_INCLUDE_DIRS : stl include paths +# ANDROID_RTTI : if rtti is enabled by the runtime +# ANDROID_EXCEPTIONS : if exceptions are enabled by the runtime # # Defaults: # ANDROID_DEFAULT_NDK_API_LEVEL From 0fdb55a54d211aa642721a9623c41380f1da7623 Mon Sep 17 00:00:00 2001 From: yao Date: Mon, 3 Sep 2012 17:03:37 +0800 Subject: [PATCH 079/103] update some of the functions in ocl module to the latest version --- modules/ocl/include/opencv2/ocl/ocl.hpp | 353 +++---- modules/ocl/perf/test_blend.cpp | 122 +++ modules/ocl/perf/test_canny.cpp | 155 +++ modules/ocl/perf/test_columnsum.cpp | 120 +++ modules/ocl/perf/test_fft.cpp | 126 +++ modules/ocl/perf/test_gemm.cpp | 113 +++ modules/ocl/perf/test_hog.cpp | 218 +++++ modules/ocl/perf/test_match_template.cpp | 232 +++++ modules/ocl/perf/test_pyrdown.cpp | 137 +++ modules/ocl/perf/test_pyrup.cpp | 122 +++ modules/ocl/src/canny.cpp | 384 ++++---- modules/ocl/src/columnsum.cpp | 4 +- modules/ocl/src/hog.cpp | 117 ++- modules/ocl/src/kernels/blend_linear.cl | 53 +- modules/ocl/src/kernels/imgproc_canny.cl | 1124 +++++++++++----------- modules/ocl/src/kernels/nonfree_surf.cl | 29 +- modules/ocl/src/kernels/objdetect_hog.cl | 39 + modules/ocl/src/match_template.cpp | 880 ++++++++--------- modules/ocl/src/pyrdown.cpp | 50 +- modules/ocl/src/pyrup.cpp | 4 +- modules/ocl/src/surf.cpp | 3 +- modules/ocl/test/test_columnsum.cpp | 8 +- modules/ocl/test/test_pyrdown.cpp | 220 +---- modules/ocl/test/test_pyrup.cpp | 46 +- 24 files changed, 2931 insertions(+), 1728 deletions(-) create mode 100644 modules/ocl/perf/test_blend.cpp create mode 100644 modules/ocl/perf/test_canny.cpp create mode 100644 modules/ocl/perf/test_columnsum.cpp create mode 100644 modules/ocl/perf/test_fft.cpp create mode 100644 modules/ocl/perf/test_gemm.cpp create mode 100644 modules/ocl/perf/test_hog.cpp create mode 100644 modules/ocl/perf/test_match_template.cpp create mode 100644 modules/ocl/perf/test_pyrdown.cpp create mode 100644 modules/ocl/perf/test_pyrup.cpp diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index a86f3737d..3eff7ef67 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -877,32 +877,32 @@ namespace cv // Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4 CV_EXPORTS void matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method, MatchTemplateBuf& buf); - ///////////////////////////////////////////// Canny ///////////////////////////////////////////// - struct CV_EXPORTS CannyBuf; - - //! compute edges of the input image using Canny operator - // Support CV_8UC1 only - CV_EXPORTS void Canny(const oclMat& image, oclMat& edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false); - CV_EXPORTS void Canny(const oclMat& image, CannyBuf& buf, oclMat& edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false); - CV_EXPORTS void Canny(const oclMat& dx, const oclMat& dy, oclMat& edges, double low_thresh, double high_thresh, bool L2gradient = false); - CV_EXPORTS void Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& edges, double low_thresh, double high_thresh, bool L2gradient = false); - - struct CV_EXPORTS CannyBuf - { - CannyBuf() {} - explicit CannyBuf(const Size& image_size, int apperture_size = 3) {create(image_size, apperture_size);} - CannyBuf(const oclMat& dx_, const oclMat& dy_); - - void create(const Size& image_size, int apperture_size = 3); - - void release(); - - oclMat dx, dy; - oclMat dx_buf, dy_buf; - oclMat edgeBuf; - oclMat trackBuf1, trackBuf2; - oclMat counter; - Ptr filterDX, filterDY; + ///////////////////////////////////////////// Canny ///////////////////////////////////////////// + struct CV_EXPORTS CannyBuf; + + //! compute edges of the input image using Canny operator + // Support CV_8UC1 only + CV_EXPORTS void Canny(const oclMat& image, oclMat& edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false); + CV_EXPORTS void Canny(const oclMat& image, CannyBuf& buf, oclMat& edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false); + CV_EXPORTS void Canny(const oclMat& dx, const oclMat& dy, oclMat& edges, double low_thresh, double high_thresh, bool L2gradient = false); + CV_EXPORTS void Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& edges, double low_thresh, double high_thresh, bool L2gradient = false); + + struct CV_EXPORTS CannyBuf + { + CannyBuf() {} + explicit CannyBuf(const Size& image_size, int apperture_size = 3) {create(image_size, apperture_size);} + CannyBuf(const oclMat& dx_, const oclMat& dy_); + + void create(const Size& image_size, int apperture_size = 3); + + void release(); + + oclMat dx, dy; + oclMat dx_buf, dy_buf; + oclMat edgeBuf; + oclMat trackBuf1, trackBuf2; + void * counter; + Ptr filterDX, filterDY; }; #ifdef HAVE_CLAMDFFT @@ -935,154 +935,161 @@ namespace cv const oclMat& src3, double beta, oclMat& dst, int flags = 0); #endif - //////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector ////////////// - struct CV_EXPORTS HOGDescriptor - { - enum { DEFAULT_WIN_SIGMA = -1 }; - enum { DEFAULT_NLEVELS = 64 }; - enum { DESCR_FORMAT_ROW_BY_ROW, DESCR_FORMAT_COL_BY_COL }; + //////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector ////////////// + struct CV_EXPORTS HOGDescriptor + { + enum { DEFAULT_WIN_SIGMA = -1 }; + enum { DEFAULT_NLEVELS = 64 }; + enum { DESCR_FORMAT_ROW_BY_ROW, DESCR_FORMAT_COL_BY_COL }; + + HOGDescriptor(Size win_size=Size(64, 128), Size block_size=Size(16, 16), + Size block_stride=Size(8, 8), Size cell_size=Size(8, 8), + int nbins=9, double win_sigma=DEFAULT_WIN_SIGMA, + double threshold_L2hys=0.2, bool gamma_correction=true, + int nlevels=DEFAULT_NLEVELS); + + size_t getDescriptorSize() const; + size_t getBlockHistogramSize() const; + + void setSVMDetector(const vector& detector); + + static vector getDefaultPeopleDetector(); + static vector getPeopleDetector48x96(); + static vector getPeopleDetector64x128(); + + void detect(const oclMat& img, vector& found_locations, + double hit_threshold=0, Size win_stride=Size(), + Size padding=Size()); + + void detectMultiScale(const oclMat& img, vector& found_locations, + double hit_threshold=0, Size win_stride=Size(), + Size padding=Size(), double scale0=1.05, + int group_threshold=2); + + void getDescriptors(const oclMat& img, Size win_stride, + oclMat& descriptors, + int descr_format=DESCR_FORMAT_COL_BY_COL); + + Size win_size; + Size block_size; + Size block_stride; + Size cell_size; + int nbins; + double win_sigma; + double threshold_L2hys; + bool gamma_correction; + int nlevels; + + protected: + // initialize buffers; only need to do once in case of multiscale detection + void init_buffer(const oclMat& img, Size win_stride); + + void computeBlockHistograms(const oclMat& img); + void computeGradient(const oclMat& img, oclMat& grad, oclMat& qangle); + + double getWinSigma() const; + bool checkDetectorSize() const; + + static int numPartsWithin(int size, int part_size, int stride); + static Size numPartsWithin(Size size, Size part_size, Size stride); + + // Coefficients of the separating plane + float free_coef; + oclMat detector; + + // Results of the last classification step + oclMat labels; + Mat labels_host; + + // Results of the last histogram evaluation step + oclMat block_hists; + + // Gradients conputation results + oclMat grad, qangle; + + // scaled image + oclMat image_scale; + + // effect size of input image (might be different from original size after scaling) + Size effect_size; + }; - HOGDescriptor(Size win_size=Size(64, 128), Size block_size=Size(16, 16), - Size block_stride=Size(8, 8), Size cell_size=Size(8, 8), - int nbins=9, double win_sigma=DEFAULT_WIN_SIGMA, - double threshold_L2hys=0.2, bool gamma_correction=true, - int nlevels=DEFAULT_NLEVELS); - - size_t getDescriptorSize() const; - size_t getBlockHistogramSize() const; - - void setSVMDetector(const vector& detector); - - static vector getDefaultPeopleDetector(); - static vector getPeopleDetector48x96(); - static vector getPeopleDetector64x128(); - - void detect(const oclMat& img, vector& found_locations, - double hit_threshold=0, Size win_stride=Size(), - Size padding=Size()); - - void detectMultiScale(const oclMat& img, vector& found_locations, - double hit_threshold=0, Size win_stride=Size(), - Size padding=Size(), double scale0=1.05, - int group_threshold=2); - - void getDescriptors(const oclMat& img, Size win_stride, - oclMat& descriptors, - int descr_format=DESCR_FORMAT_COL_BY_COL); - - Size win_size; - Size block_size; - Size block_stride; - Size cell_size; - int nbins; - double win_sigma; - double threshold_L2hys; - bool gamma_correction; - int nlevels; - - protected: - void computeBlockHistograms(const oclMat& img); - void computeGradient(const oclMat& img, oclMat& grad, oclMat& qangle); - - double getWinSigma() const; - bool checkDetectorSize() const; - - static int numPartsWithin(int size, int part_size, int stride); - static Size numPartsWithin(Size size, Size part_size, Size stride); - - // Coefficients of the separating plane - float free_coef; - oclMat detector; - - // Results of the last classification step - oclMat labels; - Mat labels_host; - - // Results of the last histogram evaluation step - oclMat block_hists; - - // Gradients conputation results - oclMat grad, qangle; - - std::vector image_scales; - }; - - //! Speeded up robust features, port from GPU module. - ////////////////////////////////// SURF ////////////////////////////////////////// - class CV_EXPORTS SURF_OCL - { - public: - enum KeypointLayout - { - X_ROW = 0, - Y_ROW, - LAPLACIAN_ROW, - OCTAVE_ROW, - SIZE_ROW, - ANGLE_ROW, - HESSIAN_ROW, - ROWS_COUNT - }; - - //! the default constructor - SURF_OCL(); - //! the full constructor taking all the necessary parameters - explicit SURF_OCL(double _hessianThreshold, int _nOctaves=4, - int _nOctaveLayers=2, bool _extended=false, float _keypointsRatio=0.01f, bool _upright = false); - - //! returns the descriptor size in float's (64 or 128) - int descriptorSize() const; - - //! upload host keypoints to device memory - void uploadKeypoints(const vector& keypoints, oclMat& keypointsocl); - //! download keypoints from device to host memory - void downloadKeypoints(const oclMat& keypointsocl, vector& keypoints); - - //! download descriptors from device to host memory - void downloadDescriptors(const oclMat& descriptorsocl, vector& descriptors); - - //! finds the keypoints using fast hessian detector used in SURF - //! supports CV_8UC1 images - //! keypoints will have nFeature cols and 6 rows - //! keypoints.ptr(X_ROW)[i] will contain x coordinate of i'th feature - //! keypoints.ptr(Y_ROW)[i] will contain y coordinate of i'th feature - //! keypoints.ptr(LAPLACIAN_ROW)[i] will contain laplacian sign of i'th feature - //! keypoints.ptr(OCTAVE_ROW)[i] will contain octave of i'th feature - //! keypoints.ptr(SIZE_ROW)[i] will contain size of i'th feature - //! keypoints.ptr(ANGLE_ROW)[i] will contain orientation of i'th feature - //! keypoints.ptr(HESSIAN_ROW)[i] will contain response of i'th feature - void operator()(const oclMat& img, const oclMat& mask, oclMat& keypoints); - //! finds the keypoints and computes their descriptors. - //! Optionally it can compute descriptors for the user-provided keypoints and recompute keypoints direction - void operator()(const oclMat& img, const oclMat& mask, oclMat& keypoints, oclMat& descriptors, - bool useProvidedKeypoints = false); - - void operator()(const oclMat& img, const oclMat& mask, std::vector& keypoints); - void operator()(const oclMat& img, const oclMat& mask, std::vector& keypoints, oclMat& descriptors, - bool useProvidedKeypoints = false); - - void operator()(const oclMat& img, const oclMat& mask, std::vector& keypoints, std::vector& descriptors, - bool useProvidedKeypoints = false); - - void releaseMemory(); - - // SURF parameters - float hessianThreshold; - int nOctaves; - int nOctaveLayers; - bool extended; - bool upright; - - //! max keypoints = min(keypointsRatio * img.size().area(), 65535) - float keypointsRatio; - - oclMat sum, mask1, maskSum, intBuffer; - - oclMat det, trace; - - oclMat maxPosBuffer; - - }; + //! Speeded up robust features, port from GPU module. + ////////////////////////////////// SURF ////////////////////////////////////////// + class CV_EXPORTS SURF_OCL + { + public: + enum KeypointLayout + { + X_ROW = 0, + Y_ROW, + LAPLACIAN_ROW, + OCTAVE_ROW, + SIZE_ROW, + ANGLE_ROW, + HESSIAN_ROW, + ROWS_COUNT + }; + + //! the default constructor + SURF_OCL(); + //! the full constructor taking all the necessary parameters + explicit SURF_OCL(double _hessianThreshold, int _nOctaves=4, + int _nOctaveLayers=2, bool _extended=false, float _keypointsRatio=0.01f, bool _upright = false); + + //! returns the descriptor size in float's (64 or 128) + int descriptorSize() const; + + //! upload host keypoints to device memory + void uploadKeypoints(const vector& keypoints, oclMat& keypointsocl); + //! download keypoints from device to host memory + void downloadKeypoints(const oclMat& keypointsocl, vector& keypoints); + + //! download descriptors from device to host memory + void downloadDescriptors(const oclMat& descriptorsocl, vector& descriptors); + + //! finds the keypoints using fast hessian detector used in SURF + //! supports CV_8UC1 images + //! keypoints will have nFeature cols and 6 rows + //! keypoints.ptr(X_ROW)[i] will contain x coordinate of i'th feature + //! keypoints.ptr(Y_ROW)[i] will contain y coordinate of i'th feature + //! keypoints.ptr(LAPLACIAN_ROW)[i] will contain laplacian sign of i'th feature + //! keypoints.ptr(OCTAVE_ROW)[i] will contain octave of i'th feature + //! keypoints.ptr(SIZE_ROW)[i] will contain size of i'th feature + //! keypoints.ptr(ANGLE_ROW)[i] will contain orientation of i'th feature + //! keypoints.ptr(HESSIAN_ROW)[i] will contain response of i'th feature + void operator()(const oclMat& img, const oclMat& mask, oclMat& keypoints); + //! finds the keypoints and computes their descriptors. + //! Optionally it can compute descriptors for the user-provided keypoints and recompute keypoints direction + void operator()(const oclMat& img, const oclMat& mask, oclMat& keypoints, oclMat& descriptors, + bool useProvidedKeypoints = false); + + void operator()(const oclMat& img, const oclMat& mask, std::vector& keypoints); + void operator()(const oclMat& img, const oclMat& mask, std::vector& keypoints, oclMat& descriptors, + bool useProvidedKeypoints = false); + + void operator()(const oclMat& img, const oclMat& mask, std::vector& keypoints, std::vector& descriptors, + bool useProvidedKeypoints = false); + + void releaseMemory(); + + // SURF parameters + float hessianThreshold; + int nOctaves; + int nOctaveLayers; + bool extended; + bool upright; + + //! max keypoints = min(keypointsRatio * img.size().area(), 65535) + float keypointsRatio; + + oclMat sum, mask1, maskSum, intBuffer; + + oclMat det, trace; + + oclMat maxPosBuffer; + + }; } } #include "opencv2/ocl/matrix_operations.hpp" diff --git a/modules/ocl/perf/test_blend.cpp b/modules/ocl/perf/test_blend.cpp new file mode 100644 index 000000000..ad5b4020e --- /dev/null +++ b/modules/ocl/perf/test_blend.cpp @@ -0,0 +1,122 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Fangfang Bai, fangfang@multicorewareinc.com +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include + +#ifdef HAVE_OPENCL +using namespace cv; +using namespace cv::ocl; +using namespace cvtest; +using namespace testing; +using namespace std; + +PARAM_TEST_CASE(Blend, MatType, int) +{ + int type; + int channels; + std::vector oclinfo; + + virtual void SetUp() + { + + type = GET_PARAM(0); + channels = GET_PARAM(1); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + //cv::ocl::setBinpath(CLBINPATH); + } +}; + +TEST_P(Blend, Performance) +{ + cv::Size size(MWIDTH, MHEIGHT); + cv::Mat img1_host = randomMat(size, CV_MAKETYPE(type, channels), 0, type == CV_8U ? 255.0 : 1.0); + cv::Mat img2_host = randomMat(size, CV_MAKETYPE(type, channels), 0, type == CV_8U ? 255.0 : 1.0); + cv::Mat weights1 = randomMat(size, CV_32F, 0, 1); + cv::Mat weights2 = randomMat(size, CV_32F, 0, 1); + cv::ocl::oclMat gimg1(size, CV_MAKETYPE(type, channels)), gimg2(size, CV_MAKETYPE(type, channels)), gweights1(size, CV_32F), gweights2(size, CV_32F); + cv::ocl::oclMat gdst(size, CV_MAKETYPE(type, channels)); + + + double totalgputick_all = 0; + double totalgputick_kernel = 0; + double t1 = 0; + double t2 = 0; + + for (int j = 0; j < LOOP_TIMES + 1; j ++) //LOOP_TIMES=100 + { + t1 = (double)cvGetTickCount(); + cv::ocl::oclMat gimg1 = cv::ocl::oclMat(img1_host); + cv::ocl::oclMat gimg2 = cv::ocl::oclMat(img2_host); + cv::ocl::oclMat gweights1 = cv::ocl::oclMat(weights1); + cv::ocl::oclMat gweights2 = cv::ocl::oclMat(weights1); + + t2 = (double)cvGetTickCount(); + cv::ocl::blendLinear(gimg1, gimg2, gweights1, gweights2, gdst); + t2 = (double)cvGetTickCount() - t2; + + cv::Mat m; + gdst.download(m); + t1 = (double)cvGetTickCount() - t1; + + if (j == 0) + { + continue; + } + + totalgputick_all = t1 + totalgputick_all; + totalgputick_kernel = t2 + totalgputick_kernel; + }; + + cout << "average gpu total runtime is " << totalgputick_all / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl; + + cout << "average gpu runtime without data transfering is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl; + +} + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Blend, Combine( + Values(CV_8U, CV_32F), Values(1, 4))); +#endif \ No newline at end of file diff --git a/modules/ocl/perf/test_canny.cpp b/modules/ocl/perf/test_canny.cpp new file mode 100644 index 000000000..8eff35f0a --- /dev/null +++ b/modules/ocl/perf/test_canny.cpp @@ -0,0 +1,155 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Fangfang Bai, fangfang@multicorewareinc.com +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include +#ifdef HAVE_OPENCL +using namespace cv; +using namespace cv::ocl; +using namespace cvtest; +using namespace testing; +using namespace std; + +#define FILTER_IMAGE "../../../samples/gpu/road.png" + +#ifndef MWC_TEST_UTILITY +#define MWC_TEST_UTILITY + +// Param class +#ifndef IMPLEMENT_PARAM_CLASS +#define IMPLEMENT_PARAM_CLASS(name, type) \ +class name \ + { \ + public: \ + name ( type arg = type ()) : val_(arg) {} \ + operator type () const {return val_;} \ + private: \ + type val_; \ + }; \ + inline void PrintTo( name param, std::ostream* os) \ + { \ + *os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \ + } + +IMPLEMENT_PARAM_CLASS(Channels, int) +#endif // IMPLEMENT_PARAM_CLASS +#endif // MWC_TEST_UTILITY + +//////////////////////////////////////////////////////// +// Canny1 + +IMPLEMENT_PARAM_CLASS(AppertureSize, int); +IMPLEMENT_PARAM_CLASS(L2gradient, bool); + +PARAM_TEST_CASE(Canny1, AppertureSize, L2gradient) +{ + int apperture_size; + bool useL2gradient; + //std::vector oclinfo; + + virtual void SetUp() + { + apperture_size = GET_PARAM(0); + useL2gradient = GET_PARAM(1); + + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + } +}; + +TEST_P(Canny1, Performance) +{ + cv::Mat img = readImage(FILTER_IMAGE,cv::IMREAD_GRAYSCALE); + ASSERT_FALSE(img.empty()); + + double low_thresh = 100.0; + double high_thresh = 150.0; + + cv::Mat edges_gold; + cv::ocl::oclMat edges; + + double totalgputick=0; + double totalgputick_kernel=0; + + double t1=0; + double t2=0; + for(int j = 0; j < LOOP_TIMES+1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat ocl_img = cv::ocl::oclMat(img);//upload + + t2=(double)cvGetTickCount();//kernel + cv::ocl::Canny(ocl_img, edges, low_thresh, high_thresh, apperture_size, useL2gradient); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + edges.download (cpu_dst);//download + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + if(j == 0) + continue; + + totalgputick=t1+totalgputick; + + totalgputick_kernel=t2+totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + + +} + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Canny1, testing::Combine( + testing::Values(AppertureSize(3), AppertureSize(5)), + testing::Values(L2gradient(false), L2gradient(true)))); + + + +#endif //Have opencl \ No newline at end of file diff --git a/modules/ocl/perf/test_columnsum.cpp b/modules/ocl/perf/test_columnsum.cpp new file mode 100644 index 000000000..c1f23fc94 --- /dev/null +++ b/modules/ocl/perf/test_columnsum.cpp @@ -0,0 +1,120 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Fangfang Bai fangfang@multicorewareinc.com +// +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include + +using namespace cv; +using namespace cv::ocl; +using namespace cvtest; +using namespace testing; +using namespace std; + +/////////////////////////////////////////////////////////////////////////////// +/// ColumnSum + +#ifdef HAVE_OPENCL + +//////////////////////////////////////////////////////////////////////// +// ColumnSum + +PARAM_TEST_CASE(ColumnSum) +{ + cv::Mat src; + //std::vector oclinfo; + + virtual void SetUp() + { + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + } +}; + +TEST_F(ColumnSum, Performance) +{ + cv::Size size(MWIDTH,MHEIGHT); + cv::Mat src = randomMat(size, CV_32FC1); + cv::ocl::oclMat d_dst; + + double totalgputick=0; + double totalgputick_kernel=0; + double t1=0; + double t2=0; + + for(int j = 0; j < LOOP_TIMES+1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat d_src(src); + + t2=(double)cvGetTickCount();//kernel + cv::ocl::columnSum(d_src,d_dst); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + d_dst.download (cpu_dst);//download + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + if(j == 0) + continue; + + totalgputick=t1+totalgputick; + totalgputick_kernel=t2+totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + + + +} + + + +#endif \ No newline at end of file diff --git a/modules/ocl/perf/test_fft.cpp b/modules/ocl/perf/test_fft.cpp new file mode 100644 index 000000000..6b929f41d --- /dev/null +++ b/modules/ocl/perf/test_fft.cpp @@ -0,0 +1,126 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Fangfangbai, fangfang@multicorewareinc.com +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +using namespace std; +#ifdef HAVE_CLAMDFFT +//////////////////////////////////////////////////////////////////////////// +// Dft +PARAM_TEST_CASE(Dft, cv::Size, bool) +{ + cv::Size dft_size; + bool dft_rows; + vector info; + virtual void SetUp() + { + dft_size = GET_PARAM(0); + dft_rows = GET_PARAM(1); + cv::ocl::getDevice(info); + } +}; + +TEST_P(Dft, C2C) +{ + cv::Mat a = randomMat(dft_size, CV_32FC2, 0.0, 10.0); + int flags = 0; + flags |= dft_rows ? cv::DFT_ROWS : 0; + + cv::ocl::oclMat d_b; + + double totalgputick=0; + double totalgputick_kernel=0; + double t1=0; + double t2=0; + + for(int j = 0; j < LOOP_TIMES+1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat ga=cv::ocl::oclMat(a);//upload + + t2=(double)cvGetTickCount();//kernel + cv::ocl::dft(ga, d_b, a.size(), flags); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + d_b.download (cpu_dst);//download + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + if(j == 0) + continue; + + totalgputick=t1+totalgputick; + totalgputick_kernel=t2+totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; +} + + + +TEST_P(Dft, R2CthenC2R) +{ + cv::Mat a = randomMat(dft_size, CV_32FC1, 0.0, 10.0); + + int flags = 0; + //flags |= dft_rows ? cv::DFT_ROWS : 0; // not supported yet + + cv::ocl::oclMat d_b, d_c; + + cv::ocl::dft(cv::ocl::oclMat(a), d_b, a.size(), flags); + cv::ocl::dft(d_b, d_c, a.size(), flags + cv::DFT_INVERSE + cv::DFT_REAL_OUTPUT); + + EXPECT_MAT_NEAR(a, d_c, a.size().area() * 1e-4, ""); +} + +//INSTANTIATE_TEST_CASE_P(ocl_DFT, Dft, testing::Combine( +// testing::Values(cv::Size(1280, 1024), cv::Size(1920, 1080),cv::Size(1800, 1500)), +// testing::Values(false, true))); + +#endif // HAVE_CLAMDFFT diff --git a/modules/ocl/perf/test_gemm.cpp b/modules/ocl/perf/test_gemm.cpp new file mode 100644 index 000000000..6cdbc47ce --- /dev/null +++ b/modules/ocl/perf/test_gemm.cpp @@ -0,0 +1,113 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Fangfang Bai, fangfang@multicorewareinc.com +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + + +#include "precomp.hpp" +using namespace std; +#ifdef HAVE_CLAMDBLAS +//////////////////////////////////////////////////////////////////////////// +// GEMM +PARAM_TEST_CASE(Gemm, int, cv::Size, int) +{ + int type; + cv::Size mat_size; + int flags; + vector info; + virtual void SetUp() + { + type = GET_PARAM(0); + mat_size = GET_PARAM(1); + flags = GET_PARAM(2); + + cv::ocl::getDevice(info); + } +}; + +TEST_P(Gemm, Performance) +{ + cv::Mat a = randomMat(mat_size, type, 0.0, 10.0); + cv::Mat b = randomMat(mat_size, type, 0.0, 10.0); + cv::Mat c = randomMat(mat_size, type, 0.0, 10.0); + cv::ocl::oclMat ocl_dst; + + double totalgputick=0; + double totalgputick_kernel=0; + double t1=0; + double t2=0; + + for(int j = 0; j < LOOP_TIMES+1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat ga = cv::ocl::oclMat(a);//upload + cv::ocl::oclMat gb = cv::ocl::oclMat(b);//upload + cv::ocl::oclMat gc = cv::ocl::oclMat(c);//upload + + t2=(double)cvGetTickCount();//kernel + cv::ocl::gemm(ga, gb, 1.0,gc, 1.0, ocl_dst, flags); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + ocl_dst.download (cpu_dst);//download + + t1 = (double)cvGetTickCount() - t1;//gpu end + + if(j == 0) + continue; + + totalgputick=t1+totalgputick; + totalgputick_kernel=t2+totalgputick_kernel; + + } + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; +} + + +INSTANTIATE_TEST_CASE_P(ocl_gemm, Gemm, testing::Combine( + testing::Values(CV_32FC1, CV_32FC2/* , CV_64FC1, CV_64FC2*/), + testing::Values(cv::Size(512, 512), cv::Size(1024, 1024)), + testing::Values(0, cv::GEMM_1_T, cv::GEMM_2_T, cv::GEMM_1_T + cv::GEMM_2_T))); +#endif \ No newline at end of file diff --git a/modules/ocl/perf/test_hog.cpp b/modules/ocl/perf/test_hog.cpp new file mode 100644 index 000000000..9abcb2071 --- /dev/null +++ b/modules/ocl/perf/test_hog.cpp @@ -0,0 +1,218 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Fangfang BAI, fangfang@multicorewareinc.com +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of Intel Corporation may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include "opencv2/core/core.hpp" +#include +using namespace std; + + + +#ifdef HAVE_OPENCL + + +PARAM_TEST_CASE(HOG,cv::Size,int) +{ + cv::Size winSize; + int type; + std::vector oclinfo; + + virtual void SetUp() + { + winSize = GET_PARAM(0); + type = GET_PARAM(1); + int devnums = getDevice(oclinfo); + CV_Assert(devnums > 0); + } +}; + +TEST_P(HOG, GetDescriptors) +{ + // Load image + cv::Mat img_rgb = readImage("D:road.png"); + ASSERT_FALSE(img_rgb.empty()); + + // Convert image + cv::Mat img; + switch (type) + { + case CV_8UC1: + cv::cvtColor(img_rgb, img, CV_BGR2GRAY); + break; + case CV_8UC4: + default: + cv::cvtColor(img_rgb, img, CV_BGR2BGRA); + break; + } + // HOGs + cv::ocl::HOGDescriptor ocl_hog; + ocl_hog.gamma_correction = true; + + + // Compute descriptor + cv::ocl::oclMat d_descriptors; + //down_descriptors = down_descriptors.reshape(0, down_descriptors.cols * down_descriptors.rows); + + double totalgputick=0; + double totalgputick_kernel=0; + double t1=0; + double t2=0; + + for(int j = 0; j < LOOP_TIMES+1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat d_img=cv::ocl::oclMat(img);//upload + + t2=(double)cvGetTickCount();//kernel + ocl_hog.getDescriptors(d_img, ocl_hog.win_size, d_descriptors, ocl_hog.DESCR_FORMAT_COL_BY_COL); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat down_descriptors; + d_descriptors.download(down_descriptors); + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + if(j == 0) + continue; + + totalgputick=t1+totalgputick; + totalgputick_kernel=t2+totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + + +} + + +TEST_P(HOG, Detect) +{ + // Load image + cv::Mat img_rgb = readImage("D:road.png"); + ASSERT_FALSE(img_rgb.empty()); + + // Convert image + cv::Mat img; + switch (type) + { + case CV_8UC1: + cv::cvtColor(img_rgb, img, CV_BGR2GRAY); + break; + case CV_8UC4: + default: + cv::cvtColor(img_rgb, img, CV_BGR2BGRA); + break; + } + + // HOGs + if ((winSize != cv::Size(48, 96)) && (winSize != cv::Size(64, 128))) + winSize = cv::Size(64, 128); + cv::ocl::HOGDescriptor ocl_hog(winSize); + ocl_hog.gamma_correction = true; + + cv::HOGDescriptor hog; + hog.winSize = winSize; + hog.gammaCorrection = true; + + if (winSize.width == 48 && winSize.height == 96) + { + // daimler's base + ocl_hog.setSVMDetector(ocl_hog.getPeopleDetector48x96()); + hog.setSVMDetector(hog.getDaimlerPeopleDetector()); + } + else if (winSize.width == 64 && winSize.height == 128) + { + ocl_hog.setSVMDetector(ocl_hog.getPeopleDetector64x128()); + hog.setSVMDetector(hog.getDefaultPeopleDetector()); + } + else + { + ocl_hog.setSVMDetector(ocl_hog.getDefaultPeopleDetector()); + hog.setSVMDetector(hog.getDefaultPeopleDetector()); + } + + // OpenCL detection + std::vector d_v_locations; + + double totalgputick=0; + double totalgputick_kernel=0; + double t1=0; + double t2=0; + + for(int j = 0; j < LOOP_TIMES+1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat d_img=cv::ocl::oclMat(img);//upload + + t2=(double)cvGetTickCount();//kernel + ocl_hog.detect(d_img, d_v_locations, 0); + t2 = (double)cvGetTickCount() - t2;//kernel + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + if(j == 0) + continue; + totalgputick=t1+totalgputick; + totalgputick_kernel=t2+totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + +} + + +INSTANTIATE_TEST_CASE_P(OCL_ObjDetect, HOG, testing::Combine( + testing::Values(cv::Size(64, 128), cv::Size(48, 96)), + testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)))); + + +#endif //HAVE_OPENCL diff --git a/modules/ocl/perf/test_match_template.cpp b/modules/ocl/perf/test_match_template.cpp new file mode 100644 index 000000000..1e6b0f7e3 --- /dev/null +++ b/modules/ocl/perf/test_match_template.cpp @@ -0,0 +1,232 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Fangfang Bai, fangfang@multicorewareinc.com +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include +#ifdef HAVE_OPENCL +using namespace cv; +using namespace cv::ocl; +using namespace cvtest; +using namespace testing; +using namespace std; + +#ifndef MWC_TEST_UTILITY +#define MWC_TEST_UTILITY +//////// Utility +#ifndef DIFFERENT_SIZES +#else +#undef DIFFERENT_SIZES +#endif +#define DIFFERENT_SIZES testing::Values(cv::Size(256, 256), cv::Size(3000, 3000)) + +// Param class +#ifndef IMPLEMENT_PARAM_CLASS +#define IMPLEMENT_PARAM_CLASS(name, type) \ +class name \ +{ \ +public: \ + name ( type arg = type ()) : val_(arg) {} \ + operator type () const {return val_;} \ +private: \ + type val_; \ +}; \ + inline void PrintTo( name param, std::ostream* os) \ +{ \ + *os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \ +} + +IMPLEMENT_PARAM_CLASS(Channels, int) +#endif // IMPLEMENT_PARAM_CLASS +#endif // MWC_TEST_UTILITY + +//////////////////////////////////////////////////////////////////////////////// +// MatchTemplate +#define ALL_TEMPLATE_METHODS testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR), TemplateMethod(cv::TM_CCOEFF), TemplateMethod(cv::TM_SQDIFF_NORMED), TemplateMethod(cv::TM_CCORR_NORMED), TemplateMethod(cv::TM_CCOEFF_NORMED)) + +IMPLEMENT_PARAM_CLASS(TemplateSize, cv::Size); + +const char* TEMPLATE_METHOD_NAMES[6] = {"TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR", "TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED"}; + +PARAM_TEST_CASE(MatchTemplate, cv::Size, TemplateSize, Channels, TemplateMethod) +{ + cv::Size size; + cv::Size templ_size; + int cn; + int method; + //vector oclinfo; + + virtual void SetUp() + { + size = GET_PARAM(0); + templ_size = GET_PARAM(1); + cn = GET_PARAM(2); + method = GET_PARAM(3); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + } +}; +struct MatchTemplate8U : MatchTemplate {}; + +TEST_P(MatchTemplate8U, Performance) +{ + std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl; + std::cout << "Image Size: (" << size.width << ", " << size.height << ")"<< std::endl; + std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")"<< std::endl; + std::cout << "Channels: " << cn << std::endl; + + cv::Mat image = randomMat(size, CV_MAKETYPE(CV_8U, cn)); + cv::Mat templ = randomMat(templ_size, CV_MAKETYPE(CV_8U, cn)); + cv::Mat dst_gold; + cv::ocl::oclMat dst; + + + + + + double totalgputick=0; + double totalgputick_kernel=0; + + double t1=0; + double t2=0; + for(int j = 0; j < LOOP_TIMES+1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload + cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload + + t2=(double)cvGetTickCount();//kernel + cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + dst.download (cpu_dst);//download + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + if(j == 0) + continue; + + totalgputick=t1+totalgputick; + totalgputick_kernel=t2+totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + + +} + + +struct MatchTemplate32F : MatchTemplate {}; +TEST_P(MatchTemplate32F, Performance) +{ + std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl; + std::cout << "Image Size: (" << size.width << ", " << size.height << ")"<< std::endl; + std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")"<< std::endl; + std::cout << "Channels: " << cn << std::endl; + cv::Mat image = randomMat(size, CV_MAKETYPE(CV_32F, cn)); + cv::Mat templ = randomMat(templ_size, CV_MAKETYPE(CV_32F, cn)); + + cv::Mat dst_gold; + cv::ocl::oclMat dst; + + + + + double totalgputick=0; + double totalgputick_kernel=0; + + double t1=0; + double t2=0; + for(int j = 0; j < LOOP_TIMES; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload + cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload + + t2=(double)cvGetTickCount();//kernel + cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + dst.download (cpu_dst);//download + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + totalgputick=t1+totalgputick; + + totalgputick_kernel=t2+totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; + + + +} + + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U, + testing::Combine( + testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT),cv::Size(1800, 1500)), + testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), + testing::Values(Channels(1), Channels(4)/*, Channels(3)*/), + ALL_TEMPLATE_METHODS + ) +); + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine( + testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT),cv::Size(1800, 1500)), + testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), + testing::Values(Channels(1), Channels(4) /*, Channels(3)*/), + testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR)))); + +#endif //HAVE_OPENCL \ No newline at end of file diff --git a/modules/ocl/perf/test_pyrdown.cpp b/modules/ocl/perf/test_pyrdown.cpp new file mode 100644 index 000000000..5d92a21e2 --- /dev/null +++ b/modules/ocl/perf/test_pyrdown.cpp @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// fangfang bai, fangfang@multicorewareinc.com +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include + +#ifdef HAVE_OPENCL + +using namespace cv; +using namespace cv::ocl; +using namespace cvtest; +using namespace testing; +using namespace std; + +PARAM_TEST_CASE(PyrDown, MatType, int) +{ + int type; + int channels; + //src mat + cv::Mat mat1; + cv::Mat dst; + + //std::vector oclinfo; + //ocl dst mat for testing + + cv::ocl::oclMat gmat1; + cv::ocl::oclMat gdst; + + + virtual void SetUp() + { + type = GET_PARAM(0); + channels = GET_PARAM(1); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + } + + +}; + +#define VARNAME(A) string(#A); + +////////////////////////////////PyrDown///////////////////////////////////////////////// +TEST_P(PyrDown, Mat) +{ + cv::Size size(MWIDTH, MHEIGHT); + cv::RNG &rng = TS::ptr()->get_rng(); + mat1 = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false); + + + cv::ocl::oclMat gdst; + double totalgputick = 0; + double totalgputick_kernel = 0; + + double t1 = 0; + double t2 = 0; + + for (int j = 0; j < LOOP_TIMES + 1; j ++) + { + + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat gmat1(mat1); + + t2 = (double)cvGetTickCount(); //kernel + cv::ocl::pyrDown(gmat1, gdst); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + gdst.download(cpu_dst); + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + if (j == 0) + { + continue; + } + + totalgputick = t1 + totalgputick; + + totalgputick_kernel = t2 + totalgputick_kernel; + + } + + cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl; + +} + +//********test**************** +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrDown, Combine( + Values(CV_8U, CV_32F), Values(1, 4))); + + +#endif // HAVE_OPENCL diff --git a/modules/ocl/perf/test_pyrup.cpp b/modules/ocl/perf/test_pyrup.cpp new file mode 100644 index 000000000..5cefba700 --- /dev/null +++ b/modules/ocl/perf/test_pyrup.cpp @@ -0,0 +1,122 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// fangfang bai fangfang@multicorewareinc.com +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "opencv2/core/core.hpp" +#include "precomp.hpp" +#include +#ifdef HAVE_OPENCL +using namespace cv; +using namespace cv::ocl; +using namespace cvtest; +using namespace testing; +using namespace std; + + +PARAM_TEST_CASE(PyrUp, MatType, int) +{ + int type; + int channels; + //std::vector oclinfo; + + virtual void SetUp() + { + type = GET_PARAM(0); + channels = GET_PARAM(1); + //int devnums = getDevice(oclinfo); + //CV_Assert(devnums > 0); + } +}; + +TEST_P(PyrUp, Performance) +{ + cv::Size size(MWIDTH, MHEIGHT); + cv::Mat src = randomMat(size, CV_MAKETYPE(type, channels)); + cv::Mat dst_gold; + cv::ocl::oclMat dst; + + + double totalgputick = 0; + double totalgputick_kernel = 0; + + double t1 = 0; + double t2 = 0; + + for (int j = 0; j < LOOP_TIMES + 1; j ++) + { + t1 = (double)cvGetTickCount();//gpu start1 + + cv::ocl::oclMat srcMat = cv::ocl::oclMat(src);//upload + + t2 = (double)cvGetTickCount(); //kernel + cv::ocl::pyrUp(srcMat, dst); + t2 = (double)cvGetTickCount() - t2;//kernel + + cv::Mat cpu_dst; + dst.download(cpu_dst); //download + + t1 = (double)cvGetTickCount() - t1;//gpu end1 + + if (j == 0) + { + continue; + } + + totalgputick = t1 + totalgputick; + + totalgputick_kernel = t2 + totalgputick_kernel; + + } + + + cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl; + cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl; + + +} + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrUp, Combine( + Values(CV_8U, CV_32F), Values(1, 4))); + +#endif // HAVE_OPENCL \ No newline at end of file diff --git a/modules/ocl/src/canny.cpp b/modules/ocl/src/canny.cpp index f41d953dc..5881a4cae 100644 --- a/modules/ocl/src/canny.cpp +++ b/modules/ocl/src/canny.cpp @@ -59,11 +59,11 @@ void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& e namespace cv { - namespace ocl - { - ///////////////////////////OpenCL kernel strings/////////////////////////// - extern const char *imgproc_canny; - } + namespace ocl + { + ///////////////////////////OpenCL kernel strings/////////////////////////// + extern const char *imgproc_canny; + } } cv::ocl::CannyBuf::CannyBuf(const oclMat& dx_, const oclMat& dy_) : dx(dx_), dy(dy_) @@ -75,32 +75,35 @@ cv::ocl::CannyBuf::CannyBuf(const oclMat& dx_, const oclMat& dy_) : dx(dx_), dy( void cv::ocl::CannyBuf::create(const Size& image_size, int apperture_size) { - dx.create(image_size, CV_32SC1); - dy.create(image_size, CV_32SC1); + dx.create(image_size, CV_32SC1); + dy.create(image_size, CV_32SC1); - if(apperture_size == 3) - { - dx_buf.create(image_size, CV_32SC1); - dy_buf.create(image_size, CV_32SC1); - } - else if(apperture_size > 0) + if(apperture_size == 3) { - Mat kx, ky; - if (!filterDX) - { - filterDX = createDerivFilter_GPU(CV_32F, CV_32F, 1, 0, apperture_size, BORDER_REPLICATE); - } - if (!filterDY) - { - filterDY = createDerivFilter_GPU(CV_32F, CV_32F, 0, 1, apperture_size, BORDER_REPLICATE); - } + dx_buf.create(image_size, CV_32SC1); + dy_buf.create(image_size, CV_32SC1); } - edgeBuf.create(image_size.height + 2, image_size.width + 2, CV_32FC1); - - trackBuf1.create(1, image_size.width * image_size.height, CV_16UC2); - trackBuf2.create(1, image_size.width * image_size.height, CV_16UC2); + else if(apperture_size > 0) + { + Mat kx, ky; + if (!filterDX) + { + filterDX = createDerivFilter_GPU(CV_8U, CV_32S, 1, 0, apperture_size, BORDER_REPLICATE); + } + if (!filterDY) + { + filterDY = createDerivFilter_GPU(CV_8U, CV_32S, 0, 1, apperture_size, BORDER_REPLICATE); + } + } + edgeBuf.create(image_size.height + 2, image_size.width + 2, CV_32FC1); - counter.create(1,1, CV_32SC1); + trackBuf1.create(1, image_size.width * image_size.height, CV_16UC2); + trackBuf2.create(1, image_size.width * image_size.height, CV_16UC2); + + float counter_f [1] = { 0 }; + int err = 0; + counter = clCreateBuffer( Context::getContext()->impl->clContext, CL_MEM_COPY_HOST_PTR, sizeof(float), counter_f, &err ); + openCLSafeCall(err); } void cv::ocl::CannyBuf::release() @@ -112,12 +115,12 @@ void cv::ocl::CannyBuf::release() edgeBuf.release(); trackBuf1.release(); trackBuf2.release(); - counter.release(); + openCLFree(counter); } namespace cv { namespace ocl { - namespace canny - { + namespace canny + { void calcSobelRowPass_gpu(const oclMat& src, oclMat& dx_buf, oclMat& dy_buf, int rows, int cols); void calcMagnitude_gpu(const oclMat& dx_buf, const oclMat& dy_buf, oclMat& dx, oclMat& dy, oclMat& mag, int rows, int cols, bool L2Grad); @@ -125,12 +128,12 @@ namespace cv { namespace ocl { void calcMap_gpu(oclMat& dx, oclMat& dy, oclMat& mag, oclMat& map, int rows, int cols, float low_thresh, float high_thresh); - void edgesHysteresisLocal_gpu(oclMat& map, oclMat& st1, oclMat& counter, int rows, int cols); + void edgesHysteresisLocal_gpu(oclMat& map, oclMat& st1, void * counter, int rows, int cols); - void edgesHysteresisGlobal_gpu(oclMat& map, oclMat& st1, oclMat& st2, oclMat& counter, int rows, int cols); + void edgesHysteresisGlobal_gpu(oclMat& map, oclMat& st1, oclMat& st2, void * counter, int rows, int cols); void getEdges_gpu(oclMat& map, oclMat& dst, int rows, int cols); - } + } }}// cv::ocl namespace @@ -164,11 +167,10 @@ void cv::ocl::Canny(const oclMat& src, CannyBuf& buf, oclMat& dst, double low_th std::swap( low_thresh, high_thresh ); dst.create(src.size(), CV_8U); - dst.setTo(Scalar::all(0)); + //dst.setTo(Scalar::all(0)); buf.create(src.size(), apperture_size); - buf.edgeBuf.setTo(Scalar::all(0)); - buf.counter.setTo(Scalar::all(0)); + //buf.edgeBuf.setTo(Scalar::all(0)); if (apperture_size == 3) { @@ -178,17 +180,8 @@ void cv::ocl::Canny(const oclMat& src, CannyBuf& buf, oclMat& dst, double low_th } else { - // FIXME: - // current ocl implementation requires the src and dst having same type - // convertTo is time consuming so this may be optimized later. - oclMat src_omat32f = src; - src.convertTo(src_omat32f, CV_32F); // FIXME - - buf.filterDX->apply(src_omat32f, buf.dx); - buf.filterDY->apply(src_omat32f, buf.dy); - - buf.dx.convertTo(buf.dx, CV_32S); // FIXME - buf.dy.convertTo(buf.dy, CV_32S); // FIXME + buf.filterDX->apply(src, buf.dx); + buf.filterDY->apply(src, buf.dy); calcMagnitude_gpu(buf.dx, buf.dy, buf.edgeBuf, src.rows, src.cols, L2gradient); } @@ -210,12 +203,11 @@ void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& d std::swap( low_thresh, high_thresh); dst.create(dx.size(), CV_8U); - dst.setTo(Scalar::all(0)); + //dst.setTo(Scalar::all(0)); buf.dx = dx; buf.dy = dy; buf.create(dx.size(), -1); - buf.edgeBuf.setTo(Scalar::all(0)); - buf.counter.setTo(Scalar::all(0)); + //buf.edgeBuf.setTo(Scalar::all(0)); calcMagnitude_gpu(buf.dx, buf.dy, buf.edgeBuf, dx.rows, dx.cols, L2gradient); CannyCaller(buf, dst, static_cast(low_thresh), static_cast(high_thresh)); @@ -223,197 +215,197 @@ void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& d void canny::calcSobelRowPass_gpu(const oclMat& src, oclMat& dx_buf, oclMat& dy_buf, int rows, int cols) { - Context *clCxt = src.clCxt; - string kernelName = "calcSobelRowPass"; - vector< pair > args; + Context *clCxt = src.clCxt; + string kernelName = "calcSobelRowPass"; + vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dx_buf.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dy_buf.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&src.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&src.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.offset)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dx_buf.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dy_buf.data)); + args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&src.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&src.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.offset)); - size_t globalThreads[3] = {cols, rows, 1}; - size_t localThreads[3] = {16, 16, 1}; - openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); + size_t globalThreads[3] = {cols, rows, 1}; + size_t localThreads[3] = {16, 16, 1}; + openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); } void canny::calcMagnitude_gpu(const oclMat& dx_buf, const oclMat& dy_buf, oclMat& dx, oclMat& dy, oclMat& mag, int rows, int cols, bool L2Grad) { - Context *clCxt = dx_buf.clCxt; - string kernelName = "calcMagnitude_buf"; - vector< pair > args; + Context *clCxt = dx_buf.clCxt; + string kernelName = "calcMagnitude_buf"; + vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&dx_buf.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dy_buf.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dx.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dy.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&mag.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&mag.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&mag.offset)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dx_buf.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dy_buf.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dx.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dy.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&mag.data)); + args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx_buf.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy_buf.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&mag.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&mag.offset)); - size_t globalThreads[3] = {cols, rows, 1}; - size_t localThreads[3] = {16, 16, 1}; + size_t globalThreads[3] = {cols, rows, 1}; + size_t localThreads[3] = {16, 16, 1}; - char build_options [15] = ""; - if(L2Grad) - { - strcat(build_options, "-D L2GRAD"); - } - openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options); + char build_options [15] = ""; + if(L2Grad) + { + strcat(build_options, "-D L2GRAD"); + } + openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options); } void canny::calcMagnitude_gpu(const oclMat& dx, const oclMat& dy, oclMat& mag, int rows, int cols, bool L2Grad) { - Context *clCxt = dx.clCxt; - string kernelName = "calcMagnitude"; - vector< pair > args; + Context *clCxt = dx.clCxt; + string kernelName = "calcMagnitude"; + vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&dx.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dy.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&mag.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&mag.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&mag.offset)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dx.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dy.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&mag.data)); + args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&mag.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&mag.offset)); - size_t globalThreads[3] = {cols, rows, 1}; - size_t localThreads[3] = {16, 16, 1}; + size_t globalThreads[3] = {cols, rows, 1}; + size_t localThreads[3] = {16, 16, 1}; - char build_options [15] = ""; - if(L2Grad) - { - strcat(build_options, "-D L2GRAD"); - } - openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options); + char build_options [15] = ""; + if(L2Grad) + { + strcat(build_options, "-D L2GRAD"); + } + openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options); } void canny::calcMap_gpu(oclMat& dx, oclMat& dy, oclMat& mag, oclMat& map, int rows, int cols, float low_thresh, float high_thresh) { - Context *clCxt = dx.clCxt; - - vector< pair > args; + Context *clCxt = dx.clCxt; - args.push_back( make_pair( sizeof(cl_mem), (void *)&dx.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dy.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&mag.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); - args.push_back( make_pair( sizeof(cl_float), (void *)&low_thresh)); - args.push_back( make_pair( sizeof(cl_float), (void *)&high_thresh)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dx.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dy.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&mag.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&mag.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); + vector< pair > args; + + args.push_back( make_pair( sizeof(cl_mem), (void *)&dx.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dy.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&mag.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); + args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); + args.push_back( make_pair( sizeof(cl_float), (void *)&low_thresh)); + args.push_back( make_pair( sizeof(cl_float), (void *)&high_thresh)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dx.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dy.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&mag.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&mag.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); #if CALCMAP_FIXED - size_t globalThreads[3] = {cols, rows, 1}; - string kernelName = "calcMap"; - size_t localThreads[3] = {16, 16, 1}; + size_t globalThreads[3] = {cols, rows, 1}; + string kernelName = "calcMap"; + size_t localThreads[3] = {16, 16, 1}; #else - size_t globalThreads[3] = {cols, rows, 1}; - string kernelName = "calcMap_2"; - size_t localThreads[3] = {256, 1, 1}; + size_t globalThreads[3] = {cols, rows, 1}; + string kernelName = "calcMap_2"; + size_t localThreads[3] = {256, 1, 1}; #endif - openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); + openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); } -void canny::edgesHysteresisLocal_gpu(oclMat& map, oclMat& st1, oclMat& counter, int rows, int cols) +void canny::edgesHysteresisLocal_gpu(oclMat& map, oclMat& st1, void * counter, int rows, int cols) { - Context *clCxt = map.clCxt; - string kernelName = "edgesHysteresisLocal"; - vector< pair > args; + Context *clCxt = map.clCxt; + string kernelName = "edgesHysteresisLocal"; + vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&st1.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&counter.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&st1.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&counter)); + args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); - size_t globalThreads[3] = {cols, rows, 1}; - size_t localThreads[3] = {16, 16, 1}; + size_t globalThreads[3] = {cols, rows, 1}; + size_t localThreads[3] = {16, 16, 1}; - openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); + openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); } -void canny::edgesHysteresisGlobal_gpu(oclMat& map, oclMat& st1, oclMat& st2, oclMat& counter, int rows, int cols) +void canny::edgesHysteresisGlobal_gpu(oclMat& map, oclMat& st1, oclMat& st2, void * counter, int rows, int cols) { - unsigned int count = Mat(counter).at(0); - - Context *clCxt = map.clCxt; - string kernelName = "edgesHysteresisGlobal"; - vector< pair > args; - size_t localThreads[3] = {128, 1, 1}; + unsigned int count; + openCLSafeCall(clEnqueueReadBuffer(Context::getContext()->impl->clCmdQueue, (cl_mem)counter, 1, 0, sizeof(float), &count, NULL, NULL, NULL)); + Context *clCxt = map.clCxt; + string kernelName = "edgesHysteresisGlobal"; + vector< pair > args; + size_t localThreads[3] = {128, 1, 1}; #define DIVUP(a, b) ((a)+(b)-1)/(b) - while(count > 0) - { - counter.setTo(0); - args.clear(); - size_t globalThreads[3] = {std::min(count, 65535u) * 128, DIVUP(count, 65535), 1}; - args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&st1.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&st2.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&counter.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&count)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); + while(count > 0) + { + //counter.setTo(0); + args.clear(); + size_t globalThreads[3] = {std::min(count, 65535u) * 128, DIVUP(count, 65535), 1}; + args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&st1.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&st2.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&counter)); + args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&count)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); - openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); - count = Mat(counter).at(0); - std::swap(st1, st2); - } + openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); + openCLSafeCall(clEnqueueReadBuffer(Context::getContext()->impl->clCmdQueue, (cl_mem)counter, 1, 0, sizeof(float), &count, NULL, NULL, NULL)); + std::swap(st1, st2); + } #undef DIVUP } void canny::getEdges_gpu(oclMat& map, oclMat& dst, int rows, int cols) { - Context *clCxt = map.clCxt; - string kernelName = "getEdges"; - vector< pair > args; + Context *clCxt = map.clCxt; + string kernelName = "getEdges"; + vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&dst.offset)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&map.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data)); + args.push_back( make_pair( sizeof(cl_int), (void *)&rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&dst.offset)); - size_t globalThreads[3] = {cols, rows, 1}; - size_t localThreads[3] = {16, 16, 1}; + size_t globalThreads[3] = {cols, rows, 1}; + size_t localThreads[3] = {16, 16, 1}; - openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); + openCLExecuteKernel(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); } #endif // HAVE_OPENCL diff --git a/modules/ocl/src/columnsum.cpp b/modules/ocl/src/columnsum.cpp index e789d38b0..245082a2a 100644 --- a/modules/ocl/src/columnsum.cpp +++ b/modules/ocl/src/columnsum.cpp @@ -67,7 +67,9 @@ namespace cv void cv::ocl::columnSum(const oclMat& src,oclMat& dst) { - CV_Assert(src.type() == CV_32FC1 && dst.type() == CV_32FC1 && src.size() == dst.size()); + CV_Assert(src.type() == CV_32FC1); + + dst.create(src.size(), src.type()); Context *clCxt = src.clCxt; diff --git a/modules/ocl/src/hog.cpp b/modules/ocl/src/hog.cpp index 1f8a92541..ea0ba685a 100644 --- a/modules/ocl/src/hog.cpp +++ b/modules/ocl/src/hog.cpp @@ -119,6 +119,8 @@ namespace cv { namespace ocl { namespace device float angle_scale, cv::ocl::oclMat& grad, cv::ocl::oclMat& qangle, bool correct_gamma); void compute_gradients_8UC4(int height, int width, const cv::ocl::oclMat& img, float angle_scale, cv::ocl::oclMat& grad, cv::ocl::oclMat& qangle, bool correct_gamma); + + void resize( const oclMat &src, oclMat &dst, const Size sz); } }}} @@ -150,6 +152,8 @@ cv::ocl::HOGDescriptor::HOGDescriptor(Size win_size_, Size block_size_, Size blo cv::Size blocks_per_win = numPartsWithin(win_size, block_size, block_stride); hog::set_up_constants(nbins, block_stride.width, block_stride.height, blocks_per_win.width, blocks_per_win.height); + + effect_size = Size(0, 0); } size_t cv::ocl::HOGDescriptor::getDescriptorSize() const @@ -199,22 +203,37 @@ void cv::ocl::HOGDescriptor::setSVMDetector(const vector& _detector) CV_Assert(checkDetectorSize()); } +void cv::ocl::HOGDescriptor::init_buffer(const oclMat& img, Size win_stride) +{ + if (!image_scale.empty()) + return; + + if (effect_size == Size(0, 0)) + effect_size = img.size(); + + grad.create(img.size(), CV_32FC2); + qangle.create(img.size(), CV_8UC2); + + const size_t block_hist_size = getBlockHistogramSize(); + const Size blocks_per_img = numPartsWithin(img.size(), block_size, block_stride); + block_hists.create(1, static_cast(block_hist_size * blocks_per_img.area()), CV_32F); + + Size wins_per_img = numPartsWithin(img.size(), win_size, win_stride); + labels.create(1, wins_per_img.area(), CV_8U); +} + void cv::ocl::HOGDescriptor::computeGradient(const oclMat& img, oclMat& grad, oclMat& qangle) { CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4); - grad.create(img.size(), CV_32FC2); - - qangle.create(img.size(), CV_8UC2); - float angleScale = (float)(nbins / CV_PI); switch (img.type()) { case CV_8UC1: - hog::compute_gradients_8UC1(img.rows, img.cols, img, angleScale, grad, qangle, gamma_correction); + hog::compute_gradients_8UC1(effect_size.height, effect_size.width, img, angleScale, grad, qangle, gamma_correction); break; case CV_8UC4: - hog::compute_gradients_8UC4(img.rows, img.cols, img, angleScale, grad, qangle, gamma_correction); + hog::compute_gradients_8UC4(effect_size.height, effect_size.width, img, angleScale, grad, qangle, gamma_correction); break; } } @@ -224,14 +243,11 @@ void cv::ocl::HOGDescriptor::computeBlockHistograms(const oclMat& img) { computeGradient(img, grad, qangle); - size_t block_hist_size = getBlockHistogramSize(); - Size blocks_per_img = numPartsWithin(img.size(), block_size, block_stride); + hog::compute_hists(nbins, block_stride.width, block_stride.height, effect_size.height, effect_size.width, + grad, qangle, (float)getWinSigma(), block_hists); - block_hists.create(1, static_cast(block_hist_size * blocks_per_img.area()), CV_32F); - - hog::compute_hists(nbins, block_stride.width, block_stride.height, img.rows, img.cols, grad, qangle, (float)getWinSigma(), block_hists); - - hog::normalize_hists(nbins, block_stride.width, block_stride.height, img.rows, img.cols, block_hists, (float)threshold_L2hys); + hog::normalize_hists(nbins, block_stride.width, block_stride.height, effect_size.height, effect_size.width, + block_hists, (float)threshold_L2hys); } @@ -239,11 +255,13 @@ void cv::ocl::HOGDescriptor::getDescriptors(const oclMat& img, Size win_stride, { CV_Assert(win_stride.width % block_stride.width == 0 && win_stride.height % block_stride.height == 0); + init_buffer(img, win_stride); + computeBlockHistograms(img); const size_t block_hist_size = getBlockHistogramSize(); Size blocks_per_win = numPartsWithin(win_size, block_size, block_stride); - Size wins_per_img = numPartsWithin(img.size(), win_size, win_stride); + Size wins_per_img = numPartsWithin(effect_size, win_size, win_stride); descriptors.create(wins_per_img.area(), static_cast(blocks_per_win.area() * block_hist_size), CV_32F); @@ -251,11 +269,11 @@ void cv::ocl::HOGDescriptor::getDescriptors(const oclMat& img, Size win_stride, { case DESCR_FORMAT_ROW_BY_ROW: hog::extract_descrs_by_rows(win_size.height, win_size.width, block_stride.height, block_stride.width, - win_stride.height, win_stride.width, img.rows, img.cols, block_hists, descriptors); + win_stride.height, win_stride.width, effect_size.height, effect_size.width, block_hists, descriptors); break; case DESCR_FORMAT_COL_BY_COL: hog::extract_descrs_by_cols(win_size.height, win_size.width, block_stride.height, block_stride.width, - win_stride.height, win_stride.width, img.rows, img.cols, block_hists, descriptors); + win_stride.height, win_stride.width, effect_size.height, effect_size.width, block_hists, descriptors); break; default: CV_Error(CV_StsBadArg, "Unknown descriptor format"); @@ -272,22 +290,21 @@ void cv::ocl::HOGDescriptor::detect(const oclMat& img, vector& hits, doub if (detector.empty()) return; - computeBlockHistograms(img); - if (win_stride == Size()) win_stride = block_stride; else CV_Assert(win_stride.width % block_stride.width == 0 && win_stride.height % block_stride.height == 0); + init_buffer(img, win_stride); - Size wins_per_img = numPartsWithin(img.size(), win_size, win_stride); - labels.create(1, wins_per_img.area(), CV_8U); + computeBlockHistograms(img); hog::classify_hists(win_size.height, win_size.width, block_stride.height, block_stride.width, - win_stride.height, win_stride.width, img.rows, img.cols, block_hists, + win_stride.height, win_stride.width, effect_size.height, effect_size.width, block_hists, detector, (float)free_coef, (float)hit_threshold, labels); labels.download(labels_host); unsigned char* vec = labels_host.ptr(); + Size wins_per_img = numPartsWithin(effect_size, win_size, win_stride); for (int i = 0; i < wins_per_img.area(); i++) { int y = i / wins_per_img.width; @@ -303,6 +320,7 @@ void cv::ocl::HOGDescriptor::detectMultiScale(const oclMat& img, vector& f Size win_stride, Size padding, double scale0, int group_threshold) { CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4); + CV_Assert(scale0 > 1); vector level_scale; double scale = 1.; @@ -318,27 +336,30 @@ void cv::ocl::HOGDescriptor::detectMultiScale(const oclMat& img, vector& f } levels = std::max(levels, 1); level_scale.resize(levels); - image_scales.resize(levels); std::vector all_candidates; vector locations; + if (win_stride == Size()) + win_stride = block_stride; + else + CV_Assert(win_stride.width % block_stride.width == 0 && win_stride.height % block_stride.height == 0); + init_buffer(img, win_stride); + image_scale.create(img.size(), img.type()); + for (size_t i = 0; i < level_scale.size(); i++) { scale = level_scale[i]; - Size sz(cvRound(img.cols / scale), cvRound(img.rows / scale)); - oclMat smaller_img; - - if (sz == img.size()) - smaller_img = img; + effect_size = Size(cvRound(img.cols / scale), cvRound(img.rows / scale)); + if (effect_size == img.size()) + { + detect(img, locations, hit_threshold, win_stride, padding); + } else { - image_scales[i].create(sz, img.type()); - resize(img, image_scales[i], image_scales[i].size(), 0, 0, INTER_LINEAR); - smaller_img = image_scales[i]; + hog::resize( img, image_scale, effect_size); + detect(image_scale, locations, hit_threshold, win_stride, padding); } - - detect(smaller_img, locations, hit_threshold, win_stride, padding); Size scaled_win_size(cvRound(win_size.width * scale), cvRound(win_size.height * scale)); for (size_t j = 0; j < locations.size(); j++) all_candidates.push_back(Rect(Point2d((CvPoint)locations[j]) * scale, scaled_win_size)); @@ -1784,4 +1805,36 @@ void cv::ocl::device::hog::compute_gradients_8UC4(int height, int width, const c openCLExecuteKernel(clCxt, &objdetect_hog, kernelName, globalThreads, localThreads, args, -1, -1); } +void cv::ocl::device::hog::resize( const oclMat &src, oclMat &dst, const Size sz) +{ + CV_Assert( (src.channels() == dst.channels()) ); + Context *clCxt = Context::getContext(); + + string kernelName = (src.type() == CV_8UC1) ? "resize_8UC1_kernel" : "resize_8UC4_kernel"; + size_t blkSizeX = 16, blkSizeY = 16; + size_t glbSizeX = sz.width % blkSizeX == 0 ? sz.width : (sz.width / blkSizeX + 1) * blkSizeX; + size_t glbSizeY = sz.height % blkSizeY == 0 ? sz.height : (sz.height / blkSizeY + 1) * blkSizeY; + size_t globalThreads[3] = {glbSizeX, glbSizeY, 1}; + size_t localThreads[3] = {blkSizeX, blkSizeY, 1}; + + float ifx = (float)src.cols / sz.width; + float ify = (float)src.rows / sz.height; + + vector< pair > args; + args.push_back( make_pair(sizeof(cl_mem), (void *)&dst.data)); + args.push_back( make_pair(sizeof(cl_mem), (void *)&src.data)); + args.push_back( make_pair(sizeof(cl_int), (void *)&dst.offset)); + args.push_back( make_pair(sizeof(cl_int), (void *)&src.offset)); + args.push_back( make_pair(sizeof(cl_int), (void *)&dst.step)); + args.push_back( make_pair(sizeof(cl_int), (void *)&src.step)); + args.push_back( make_pair(sizeof(cl_int), (void *)&src.cols)); + args.push_back( make_pair(sizeof(cl_int), (void *)&src.rows)); + args.push_back( make_pair(sizeof(cl_int), (void *)&sz.width)); + args.push_back( make_pair(sizeof(cl_int), (void *)&sz.height)); + args.push_back( make_pair(sizeof(cl_float), (void *)&ifx)); + args.push_back( make_pair(sizeof(cl_float), (void *)&ify)); + + openCLExecuteKernel(clCxt, &objdetect_hog, kernelName, globalThreads, localThreads, args, -1, -1); +} + #endif diff --git a/modules/ocl/src/kernels/blend_linear.cl b/modules/ocl/src/kernels/blend_linear.cl index bf733576c..6b4781151 100644 --- a/modules/ocl/src/kernels/blend_linear.cl +++ b/modules/ocl/src/kernels/blend_linear.cl @@ -67,32 +67,6 @@ __kernel void BlendLinear_C1_D0( } } -__kernel void BlendLinear_C3_D0( - __global uchar *dst, - __global uchar *img1, - __global uchar *img2, - __global float *weight1, - __global float *weight2, - int rows, - int cols, - int istep, - int wstep - ) -{ - int idx = get_global_id(0); - int idy = get_global_id(1); - int x = idx / 3; - int y = idy; - if (x < cols && y < rows) - { - int pos = idy * istep + idx; - int wpos = idy * (wstep /sizeof(float)) + x; - float w1 = weight1[wpos]; - float w2 = weight2[wpos]; - dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f); - } -} - __kernel void BlendLinear_C4_D0( __global uchar *dst, __global uchar *img1, @@ -143,32 +117,6 @@ __kernel void BlendLinear_C1_D5( } } -__kernel void BlendLinear_C3_D5( - __global float *dst, - __global float *img1, - __global float *img2, - __global float *weight1, - __global float *weight2, - int rows, - int cols, - int istep, - int wstep - ) -{ - int idx = get_global_id(0); - int idy = get_global_id(1); - int x = idx / 3; - int y = idy; - if (x < cols && y < rows) - { - int pos = idy * (istep / sizeof(float)) + idx; - int wpos = idy * (wstep /sizeof(float)) + x; - float w1 = weight1[wpos]; - float w2 = weight2[wpos]; - dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f); - } -} - __kernel void BlendLinear_C4_D5( __global float *dst, __global float *img1, @@ -194,3 +142,4 @@ __kernel void BlendLinear_C4_D5( dst[pos] = (img1[pos] * w1 + img2[pos] * w2) / (w1 + w2 + 1e-5f); } } + diff --git a/modules/ocl/src/kernels/imgproc_canny.cl b/modules/ocl/src/kernels/imgproc_canny.cl index da64d157f..e32e92835 100644 --- a/modules/ocl/src/kernels/imgproc_canny.cl +++ b/modules/ocl/src/kernels/imgproc_canny.cl @@ -50,12 +50,12 @@ #ifdef L2GRAD inline float calc(int x, int y) { - return sqrt((float)(x * x + y * y)); + return sqrt((float)(x * x + y * y)); } #else inline float calc(int x, int y) { - return (float)abs(x) + abs(y); + return (float)abs(x) + abs(y); } #endif // @@ -70,53 +70,53 @@ inline float calc(int x, int y) // dx_buf output dx buffer // dy_buf output dy buffer __kernel -void calcSobelRowPass -( - __global const uchar * src, - __global int * dx_buf, - __global int * dy_buf, - int rows, - int cols, - int src_step, - int src_offset, - int dx_buf_step, - int dx_buf_offset, - int dy_buf_step, - int dy_buf_offset -) + void calcSobelRowPass + ( + __global const uchar * src, + __global int * dx_buf, + __global int * dy_buf, + int rows, + int cols, + int src_step, + int src_offset, + int dx_buf_step, + int dx_buf_offset, + int dy_buf_step, + int dy_buf_offset + ) { - //src_step /= sizeof(*src); - //src_offset /= sizeof(*src); - dx_buf_step /= sizeof(*dx_buf); - dx_buf_offset /= sizeof(*dx_buf); - dy_buf_step /= sizeof(*dy_buf); - dy_buf_offset /= sizeof(*dy_buf); + //src_step /= sizeof(*src); + //src_offset /= sizeof(*src); + dx_buf_step /= sizeof(*dx_buf); + dx_buf_offset /= sizeof(*dx_buf); + dy_buf_step /= sizeof(*dy_buf); + dy_buf_offset /= sizeof(*dy_buf); - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - int lidx = get_local_id(0); - int lidy = get_local_id(1); + int lidx = get_local_id(0); + int lidy = get_local_id(1); - __local int smem[16][18]; + __local int smem[16][18]; - if(gidy < rows) - { - smem[lidy][lidx + 1] = src[gidx + gidy * src_step + src_offset]; - if(lidx == 0) - { - smem[lidy][0] = src[max(gidx - 1, 0) + gidy * src_step + src_offset]; - smem[lidy][17] = src[min(gidx + 16, cols - 1) + gidy * src_step + src_offset]; - } - barrier(CLK_LOCAL_MEM_FENCE); - if(gidx < cols) - { - dx_buf[gidx + gidy * dx_buf_step + dx_buf_offset] = - -smem[lidy][lidx] + smem[lidy][lidx + 2]; - dy_buf[gidx + gidy * dy_buf_step + dy_buf_offset] = - smem[lidy][lidx] + 2 * smem[lidy][lidx + 1] + smem[lidy][lidx + 2]; - } - } + if(gidy < rows) + { + smem[lidy][lidx + 1] = src[gidx + gidy * src_step + src_offset]; + if(lidx == 0) + { + smem[lidy][0] = src[max(gidx - 1, 0) + gidy * src_step + src_offset]; + smem[lidy][17] = src[min(gidx + 16, cols - 1) + gidy * src_step + src_offset]; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(gidx < cols) + { + dx_buf[gidx + gidy * dx_buf_step + dx_buf_offset] = + -smem[lidy][lidx] + smem[lidy][lidx + 2]; + dy_buf[gidx + gidy * dy_buf_step + dy_buf_offset] = + smem[lidy][lidx] + 2 * smem[lidy][lidx + 1] + smem[lidy][lidx + 2]; + } + } } // calculate the magnitude of the filter pass combining both x and y directions @@ -128,72 +128,72 @@ void calcSobelRowPass // dy direvitive in y direction output // mag magnitude direvitive of xy output __kernel -void calcMagnitude_buf -( - __global const int * dx_buf, - __global const int * dy_buf, - __global int * dx, - __global int * dy, - __global float * mag, - int rows, - int cols, - int dx_buf_step, - int dx_buf_offset, - int dy_buf_step, - int dy_buf_offset, - int dx_step, - int dx_offset, - int dy_step, - int dy_offset, - int mag_step, - int mag_offset -) + void calcMagnitude_buf + ( + __global const int * dx_buf, + __global const int * dy_buf, + __global int * dx, + __global int * dy, + __global float * mag, + int rows, + int cols, + int dx_buf_step, + int dx_buf_offset, + int dy_buf_step, + int dy_buf_offset, + int dx_step, + int dx_offset, + int dy_step, + int dy_offset, + int mag_step, + int mag_offset + ) { - dx_buf_step /= sizeof(*dx_buf); - dx_buf_offset /= sizeof(*dx_buf); - dy_buf_step /= sizeof(*dy_buf); - dy_buf_offset /= sizeof(*dy_buf); - dx_step /= sizeof(*dx); - dx_offset /= sizeof(*dx); - dy_step /= sizeof(*dy); - dy_offset /= sizeof(*dy); - mag_step /= sizeof(*mag); - mag_offset /= sizeof(*mag); + dx_buf_step /= sizeof(*dx_buf); + dx_buf_offset /= sizeof(*dx_buf); + dy_buf_step /= sizeof(*dy_buf); + dy_buf_offset /= sizeof(*dy_buf); + dx_step /= sizeof(*dx); + dx_offset /= sizeof(*dx); + dy_step /= sizeof(*dy); + dy_offset /= sizeof(*dy); + mag_step /= sizeof(*mag); + mag_offset /= sizeof(*mag); - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - int lidx = get_local_id(0); - int lidy = get_local_id(1); + int lidx = get_local_id(0); + int lidy = get_local_id(1); - __local int sdx[18][16]; - __local int sdy[18][16]; + __local int sdx[18][16]; + __local int sdy[18][16]; - if(gidx < cols) - { - sdx[lidy + 1][lidx] = dx_buf[gidx + gidy * dx_buf_step + dx_buf_offset]; - sdy[lidy + 1][lidx] = dy_buf[gidx + gidy * dy_buf_step + dy_buf_offset]; - if(lidy == 0) - { - sdx[0][lidx] = dx_buf[gidx + max(gidy - 1, 0) * dx_buf_step + dx_buf_offset]; - sdx[17][lidx] = dx_buf[gidx + min(gidy + 16, rows - 1) * dx_buf_step + dx_buf_offset]; + if(gidx < cols) + { + sdx[lidy + 1][lidx] = dx_buf[gidx + gidy * dx_buf_step + dx_buf_offset]; + sdy[lidy + 1][lidx] = dy_buf[gidx + gidy * dy_buf_step + dy_buf_offset]; + if(lidy == 0) + { + sdx[0][lidx] = dx_buf[gidx + max(gidy - 1, 0) * dx_buf_step + dx_buf_offset]; + sdx[17][lidx] = dx_buf[gidx + min(gidy + 16, rows - 1) * dx_buf_step + dx_buf_offset]; - sdy[0][lidx] = dy_buf[gidx + max(gidy - 1, 0) * dy_buf_step + dy_buf_offset]; - sdy[17][lidx] = dy_buf[gidx + min(gidy + 16, rows - 1) * dy_buf_step + dy_buf_offset]; - } - barrier(CLK_LOCAL_MEM_FENCE); + sdy[0][lidx] = dy_buf[gidx + max(gidy - 1, 0) * dy_buf_step + dy_buf_offset]; + sdy[17][lidx] = dy_buf[gidx + min(gidy + 16, rows - 1) * dy_buf_step + dy_buf_offset]; + } + barrier(CLK_LOCAL_MEM_FENCE); - if(gidy < rows) - { - int x = sdx[lidy][lidx] + 2 * sdx[lidy + 1][lidx] + sdx[lidy + 2][lidx]; + if(gidy < rows) + { + int x = sdx[lidy][lidx] + 2 * sdx[lidy + 1][lidx] + sdx[lidy + 2][lidx]; int y = -sdy[lidy][lidx] + sdy[lidy + 2][lidx]; - - dx[gidx + gidy * dx_step + dx_offset] = x; - dy[gidx + gidy * dy_step + dy_offset] = y; - mag[(gidx + 1) + (gidy + 1) * mag_step + mag_offset] = calc(x, y); - } - } + dx[gidx + gidy * dx_step + dx_offset] = x; + dy[gidx + gidy * dy_step + dy_offset] = y; + + mag[(gidx + 1) + (gidy + 1) * mag_step + mag_offset] = calc(x, y); + } + } } // calculate the magnitude of the filter pass combining both x and y directions @@ -205,39 +205,39 @@ void calcMagnitude_buf // dy direvitive in y direction output // mag magnitude direvitive of xy output __kernel -void calcMagnitude -( - __global const int * dx, - __global const int * dy, - __global float * mag, - int rows, - int cols, - int dx_step, - int dx_offset, - int dy_step, - int dy_offset, - int mag_step, - int mag_offset -) + void calcMagnitude + ( + __global const int * dx, + __global const int * dy, + __global float * mag, + int rows, + int cols, + int dx_step, + int dx_offset, + int dy_step, + int dy_offset, + int mag_step, + int mag_offset + ) { - dx_step /= sizeof(*dx); - dx_offset /= sizeof(*dx); - dy_step /= sizeof(*dy); - dy_offset /= sizeof(*dy); - mag_step /= sizeof(*mag); - mag_offset /= sizeof(*mag); + dx_step /= sizeof(*dx); + dx_offset /= sizeof(*dx); + dy_step /= sizeof(*dy); + dy_offset /= sizeof(*dy); + mag_step /= sizeof(*mag); + mag_offset /= sizeof(*mag); - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - if(gidy < rows && gidx < cols) - { - mag[(gidx + 1) + (gidy + 1) * mag_step + mag_offset] = - calc( - dx[gidx + gidy * dx_step + dx_offset], - dy[gidx + gidy * dy_step + dy_offset] - ); - } + if(gidy < rows && gidx < cols) + { + mag[(gidx + 1) + (gidy + 1) * mag_step + mag_offset] = + calc( + dx[gidx + gidy * dx_step + dx_offset], + dy[gidx + gidy * dy_step + dy_offset] + ); + } } ////////////////////////////////////////////////////////////////////////////////////////// @@ -261,284 +261,284 @@ void calcMagnitude // mag magnitudes calculated from calcMagnitude function // map output containing raw edge types __kernel -void calcMap -( - __global const int * dx, - __global const int * dy, - __global const float * mag, - __global int * map, - int rows, - int cols, - float low_thresh, - float high_thresh, - int dx_step, - int dx_offset, - int dy_step, - int dy_offset, - int mag_step, - int mag_offset, - int map_step, - int map_offset -) + void calcMap + ( + __global const int * dx, + __global const int * dy, + __global const float * mag, + __global int * map, + int rows, + int cols, + float low_thresh, + float high_thresh, + int dx_step, + int dx_offset, + int dy_step, + int dy_offset, + int mag_step, + int mag_offset, + int map_step, + int map_offset + ) { - dx_step /= sizeof(*dx); - dx_offset /= sizeof(*dx); - dy_step /= sizeof(*dy); - dy_offset /= sizeof(*dy); - mag_step /= sizeof(*mag); - mag_offset /= sizeof(*mag); - map_step /= sizeof(*map); - map_offset /= sizeof(*map); + dx_step /= sizeof(*dx); + dx_offset /= sizeof(*dx); + dy_step /= sizeof(*dy); + dy_offset /= sizeof(*dy); + mag_step /= sizeof(*mag); + mag_offset /= sizeof(*mag); + map_step /= sizeof(*map); + map_offset /= sizeof(*map); - __local float smem[18][18]; + __local float smem[18][18]; - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - int lidx = get_local_id(0); - int lidy = get_local_id(1); + int lidx = get_local_id(0); + int lidy = get_local_id(1); - int grp_idx = get_global_id(0) & 0xFFFFF0; - int grp_idy = get_global_id(1) & 0xFFFFF0; + int grp_idx = get_global_id(0) & 0xFFFFF0; + int grp_idy = get_global_id(1) & 0xFFFFF0; - int tid = lidx + lidy * 16; - int lx = tid % 18; - int ly = tid / 18; - if(ly < 14) - { - smem[ly][lx] = mag[grp_idx + lx + (grp_idy + ly) * mag_step]; - } - if(ly < 4 && grp_idy + ly + 14 <= rows && grp_idx + lx <= cols) - { - smem[ly + 14][lx] = mag[grp_idx + lx + (grp_idy + ly + 14) * mag_step]; - } + int tid = lidx + lidy * 16; + int lx = tid % 18; + int ly = tid / 18; + if(ly < 14) + { + smem[ly][lx] = mag[grp_idx + lx + (grp_idy + ly) * mag_step]; + } + if(ly < 4 && grp_idy + ly + 14 <= rows && grp_idx + lx <= cols) + { + smem[ly + 14][lx] = mag[grp_idx + lx + (grp_idy + ly + 14) * mag_step]; + } - barrier(CLK_LOCAL_MEM_FENCE); + barrier(CLK_LOCAL_MEM_FENCE); - if(gidy < rows && gidx < cols) - { - int x = dx[gidx + gidy * dx_step]; - int y = dy[gidx + gidy * dy_step]; - const int s = (x ^ y) < 0 ? -1 : 1; - const float m = smem[lidy + 1][lidx + 1]; - x = abs(x); - y = abs(y); + if(gidy < rows && gidx < cols) + { + int x = dx[gidx + gidy * dx_step]; + int y = dy[gidx + gidy * dy_step]; + const int s = (x ^ y) < 0 ? -1 : 1; + const float m = smem[lidy + 1][lidx + 1]; + x = abs(x); + y = abs(y); - // 0 - the pixel can not belong to an edge - // 1 - the pixel might belong to an edge - // 2 - the pixel does belong to an edge - int edge_type = 0; - if(m > low_thresh) - { - const int tg22x = x * TG22; - const int tg67x = tg22x + (x << (1 + CANNY_SHIFT)); - y <<= CANNY_SHIFT; - if(y < tg22x) - { - if(m > smem[lidy + 1][lidx] && m >= smem[lidy + 1][lidx + 2]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - else if (y > tg67x) - { - if(m > smem[lidy][lidx + 1]&& m >= smem[lidy + 2][lidx + 1]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - else - { - if(m > smem[lidy][lidx + 1 - s]&& m > smem[lidy + 2][lidx + 1 + s]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - } - map[gidx + 1 + (gidy + 1) * map_step] = edge_type; - } + // 0 - the pixel can not belong to an edge + // 1 - the pixel might belong to an edge + // 2 - the pixel does belong to an edge + int edge_type = 0; + if(m > low_thresh) + { + const int tg22x = x * TG22; + const int tg67x = tg22x + (x << (1 + CANNY_SHIFT)); + y <<= CANNY_SHIFT; + if(y < tg22x) + { + if(m > smem[lidy + 1][lidx] && m >= smem[lidy + 1][lidx + 2]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + else if (y > tg67x) + { + if(m > smem[lidy][lidx + 1]&& m >= smem[lidy + 2][lidx + 1]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + else + { + if(m > smem[lidy][lidx + 1 - s]&& m > smem[lidy + 2][lidx + 1 + s]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + } + map[gidx + 1 + (gidy + 1) * map_step] = edge_type; + } } // non local memory version __kernel -void calcMap_2 -( - __global const int * dx, - __global const int * dy, - __global const float * mag, - __global int * map, - int rows, - int cols, - float low_thresh, - float high_thresh, - int dx_step, - int dx_offset, - int dy_step, - int dy_offset, - int mag_step, - int mag_offset, - int map_step, - int map_offset -) + void calcMap_2 + ( + __global const int * dx, + __global const int * dy, + __global const float * mag, + __global int * map, + int rows, + int cols, + float low_thresh, + float high_thresh, + int dx_step, + int dx_offset, + int dy_step, + int dy_offset, + int mag_step, + int mag_offset, + int map_step, + int map_offset + ) { - dx_step /= sizeof(*dx); - dx_offset /= sizeof(*dx); - dy_step /= sizeof(*dy); - dy_offset /= sizeof(*dy); - mag_step /= sizeof(*mag); - mag_offset /= sizeof(*mag); - map_step /= sizeof(*map); - map_offset /= sizeof(*map); + dx_step /= sizeof(*dx); + dx_offset /= sizeof(*dx); + dy_step /= sizeof(*dy); + dy_offset /= sizeof(*dy); + mag_step /= sizeof(*mag); + mag_offset /= sizeof(*mag); + map_step /= sizeof(*map); + map_offset /= sizeof(*map); - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - if(gidy < rows && gidx < cols) - { - int x = dx[gidx + gidy * dx_step]; - int y = dy[gidx + gidy * dy_step]; - const int s = (x ^ y) < 0 ? -1 : 1; - const float m = mag[gidx + 1 + (gidy + 1) * mag_step]; - x = abs(x); - y = abs(y); + if(gidy < rows && gidx < cols) + { + int x = dx[gidx + gidy * dx_step]; + int y = dy[gidx + gidy * dy_step]; + const int s = (x ^ y) < 0 ? -1 : 1; + const float m = mag[gidx + 1 + (gidy + 1) * mag_step]; + x = abs(x); + y = abs(y); - // 0 - the pixel can not belong to an edge - // 1 - the pixel might belong to an edge - // 2 - the pixel does belong to an edge - int edge_type = 0; - if(m > low_thresh) - { - const int tg22x = x * TG22; - const int tg67x = tg22x + (x << (1 + CANNY_SHIFT)); - y <<= CANNY_SHIFT; - if(y < tg22x) - { - if(m > mag[gidx + (gidy + 1) * mag_step] && m >= mag[gidx + 2 + (gidy + 1) * mag_step]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - else if (y > tg67x) - { - if(m > mag[gidx + 1 + gidy* mag_step] && m >= mag[gidx + 1 + (gidy + 2) * mag_step]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - else - { - if(m > mag[gidx + 1 - s + gidy * mag_step] && m > mag[gidx + 1 + s + (gidy + 2) * mag_step]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - } - map[gidx + 1 + (gidy + 1) * map_step] = edge_type; - } + // 0 - the pixel can not belong to an edge + // 1 - the pixel might belong to an edge + // 2 - the pixel does belong to an edge + int edge_type = 0; + if(m > low_thresh) + { + const int tg22x = x * TG22; + const int tg67x = tg22x + (x << (1 + CANNY_SHIFT)); + y <<= CANNY_SHIFT; + if(y < tg22x) + { + if(m > mag[gidx + (gidy + 1) * mag_step] && m >= mag[gidx + 2 + (gidy + 1) * mag_step]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + else if (y > tg67x) + { + if(m > mag[gidx + 1 + gidy* mag_step] && m >= mag[gidx + 1 + (gidy + 2) * mag_step]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + else + { + if(m > mag[gidx + 1 - s + gidy * mag_step] && m > mag[gidx + 1 + s + (gidy + 2) * mag_step]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + } + map[gidx + 1 + (gidy + 1) * map_step] = edge_type; + } } // [256, 1, 1] threaded, local memory version __kernel -void calcMap_3 -( - __global const int * dx, - __global const int * dy, - __global const float * mag, - __global int * map, - int rows, - int cols, - float low_thresh, - float high_thresh, - int dx_step, - int dx_offset, - int dy_step, - int dy_offset, - int mag_step, - int mag_offset, - int map_step, - int map_offset -) + void calcMap_3 + ( + __global const int * dx, + __global const int * dy, + __global const float * mag, + __global int * map, + int rows, + int cols, + float low_thresh, + float high_thresh, + int dx_step, + int dx_offset, + int dy_step, + int dy_offset, + int mag_step, + int mag_offset, + int map_step, + int map_offset + ) { - dx_step /= sizeof(*dx); - dx_offset /= sizeof(*dx); - dy_step /= sizeof(*dy); - dy_offset /= sizeof(*dy); - mag_step /= sizeof(*mag); - mag_offset /= sizeof(*mag); - map_step /= sizeof(*map); - map_offset /= sizeof(*map); + dx_step /= sizeof(*dx); + dx_offset /= sizeof(*dx); + dy_step /= sizeof(*dy); + dy_offset /= sizeof(*dy); + mag_step /= sizeof(*mag); + mag_offset /= sizeof(*mag); + map_step /= sizeof(*map); + map_offset /= sizeof(*map); - __local float smem[18][18]; + __local float smem[18][18]; - int lidx = get_local_id(0) % 16; - int lidy = get_local_id(0) / 16; - - int grp_pix = get_global_id(0); // identifies which pixel is processing currently in the target block - int grp_ind = get_global_id(1); // identifies which block of pixels is currently processing + int lidx = get_local_id(0) % 16; + int lidy = get_local_id(0) / 16; - int grp_idx = (grp_ind % (cols/16)) * 16; - int grp_idy = (grp_ind / (cols/16)) * 16; //(grp_ind / (cols/16)) * 16 + int grp_pix = get_global_id(0); // identifies which pixel is processing currently in the target block + int grp_ind = get_global_id(1); // identifies which block of pixels is currently processing - int gidx = grp_idx + lidx; - int gidy = grp_idy + lidy; + int grp_idx = (grp_ind % (cols/16)) * 16; + int grp_idy = (grp_ind / (cols/16)) * 16; //(grp_ind / (cols/16)) * 16 - int tid = get_global_id(0) % 256; - int lx = tid % 18; - int ly = tid / 18; - if(ly < 14) - { - smem[ly][lx] = mag[grp_idx + lx + (grp_idy + ly) * mag_step]; - } - if(ly < 4 && grp_idy + ly + 14 <= rows && grp_idx + lx <= cols) - { - smem[ly + 14][lx] = mag[grp_idx + lx + (grp_idy + ly + 14) * mag_step]; - } + int gidx = grp_idx + lidx; + int gidy = grp_idy + lidy; - barrier(CLK_LOCAL_MEM_FENCE); + int tid = get_global_id(0) % 256; + int lx = tid % 18; + int ly = tid / 18; + if(ly < 14) + { + smem[ly][lx] = mag[grp_idx + lx + (grp_idy + ly) * mag_step]; + } + if(ly < 4 && grp_idy + ly + 14 <= rows && grp_idx + lx <= cols) + { + smem[ly + 14][lx] = mag[grp_idx + lx + (grp_idy + ly + 14) * mag_step]; + } - if(gidy < rows && gidx < cols) - { - int x = dx[gidx + gidy * dx_step]; - int y = dy[gidx + gidy * dy_step]; - const int s = (x ^ y) < 0 ? -1 : 1; - const float m = smem[lidy + 1][lidx + 1]; - x = abs(x); - y = abs(y); + barrier(CLK_LOCAL_MEM_FENCE); - // 0 - the pixel can not belong to an edge - // 1 - the pixel might belong to an edge - // 2 - the pixel does belong to an edge - int edge_type = 0; - if(m > low_thresh) - { - const int tg22x = x * TG22; - const int tg67x = tg22x + (x << (1 + CANNY_SHIFT)); - y <<= CANNY_SHIFT; - if(y < tg22x) - { - if(m > smem[lidy + 1][lidx] && m >= smem[lidy + 1][lidx + 2]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - else if (y > tg67x) - { - if(m > smem[lidy][lidx + 1]&& m >= smem[lidy + 2][lidx + 1]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - else - { - if(m > smem[lidy][lidx + 1 - s]&& m > smem[lidy + 2][lidx + 1 + s]) - { - edge_type = 1 + (int)(m > high_thresh); - } - } - } - map[gidx + 1 + (gidy + 1) * map_step] = edge_type; - } + if(gidy < rows && gidx < cols) + { + int x = dx[gidx + gidy * dx_step]; + int y = dy[gidx + gidy * dy_step]; + const int s = (x ^ y) < 0 ? -1 : 1; + const float m = smem[lidy + 1][lidx + 1]; + x = abs(x); + y = abs(y); + + // 0 - the pixel can not belong to an edge + // 1 - the pixel might belong to an edge + // 2 - the pixel does belong to an edge + int edge_type = 0; + if(m > low_thresh) + { + const int tg22x = x * TG22; + const int tg67x = tg22x + (x << (1 + CANNY_SHIFT)); + y <<= CANNY_SHIFT; + if(y < tg22x) + { + if(m > smem[lidy + 1][lidx] && m >= smem[lidy + 1][lidx + 2]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + else if (y > tg67x) + { + if(m > smem[lidy][lidx + 1]&& m >= smem[lidy + 2][lidx + 1]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + else + { + if(m > smem[lidy][lidx + 1 - s]&& m > smem[lidy + 2][lidx + 1 + s]) + { + edge_type = 1 + (int)(m > high_thresh); + } + } + } + map[gidx + 1 + (gidy + 1) * map_step] = edge_type; + } } #undef CANNY_SHIFT @@ -556,96 +556,96 @@ void calcMap_3 // st the potiential edge points found in this kernel call // counter the number of potiential edge points __kernel -void edgesHysteresisLocal -( - __global int * map, - __global ushort2 * st, - volatile __global unsigned int * counter, - int rows, - int cols, - int map_step, - int map_offset -) + void edgesHysteresisLocal + ( + __global int * map, + __global ushort2 * st, + volatile __global unsigned int * counter, + int rows, + int cols, + int map_step, + int map_offset + ) { - map_step /= sizeof(*map); - map_offset /= sizeof(*map); + map_step /= sizeof(*map); + map_offset /= sizeof(*map); - __local int smem[18][18]; + __local int smem[18][18]; - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - int lidx = get_local_id(0); - int lidy = get_local_id(1); + int lidx = get_local_id(0); + int lidy = get_local_id(1); - int grp_idx = get_global_id(0) & 0xFFFFF0; - int grp_idy = get_global_id(1) & 0xFFFFF0; + int grp_idx = get_global_id(0) & 0xFFFFF0; + int grp_idy = get_global_id(1) & 0xFFFFF0; - int tid = lidx + lidy * 16; - int lx = tid % 18; - int ly = tid / 18; - if(ly < 14) - { - smem[ly][lx] = map[grp_idx + lx + (grp_idy + ly) * map_step + map_offset]; - } - if(ly < 4 && grp_idy + ly + 14 <= rows && grp_idx + lx <= cols) - { - smem[ly + 14][lx] = map[grp_idx + lx + (grp_idy + ly + 14) * map_step + map_offset]; - } + int tid = lidx + lidy * 16; + int lx = tid % 18; + int ly = tid / 18; + if(ly < 14) + { + smem[ly][lx] = map[grp_idx + lx + (grp_idy + ly) * map_step + map_offset]; + } + if(ly < 4 && grp_idy + ly + 14 <= rows && grp_idx + lx <= cols) + { + smem[ly + 14][lx] = map[grp_idx + lx + (grp_idy + ly + 14) * map_step + map_offset]; + } - barrier(CLK_LOCAL_MEM_FENCE); + barrier(CLK_LOCAL_MEM_FENCE); - if(gidy < rows && gidx < cols) - { - int n; + if(gidy < rows && gidx < cols) + { + int n; - #pragma unroll - for (int k = 0; k < 16; ++k) - { - n = 0; +#pragma unroll + for (int k = 0; k < 16; ++k) + { + n = 0; - if (smem[lidy + 1][lidx + 1] == 1) - { - n += smem[lidy ][lidx ] == 2; - n += smem[lidy ][lidx + 1] == 2; - n += smem[lidy ][lidx + 2] == 2; + if (smem[lidy + 1][lidx + 1] == 1) + { + n += smem[lidy ][lidx ] == 2; + n += smem[lidy ][lidx + 1] == 2; + n += smem[lidy ][lidx + 2] == 2; - n += smem[lidy + 1][lidx ] == 2; - n += smem[lidy + 1][lidx + 2] == 2; + n += smem[lidy + 1][lidx ] == 2; + n += smem[lidy + 1][lidx + 2] == 2; - n += smem[lidy + 2][lidx ] == 2; - n += smem[lidy + 2][lidx + 1] == 2; - n += smem[lidy + 2][lidx + 2] == 2; - } + n += smem[lidy + 2][lidx ] == 2; + n += smem[lidy + 2][lidx + 1] == 2; + n += smem[lidy + 2][lidx + 2] == 2; + } - if (n > 0) - smem[lidy + 1][lidx + 1] = 2; - } + if (n > 0) + smem[lidy + 1][lidx + 1] = 2; + } - const int e = smem[lidy + 1][lidx + 1]; - map[gidx + 1 + (gidy + 1) * map_step] = e; + const int e = smem[lidy + 1][lidx + 1]; + map[gidx + 1 + (gidy + 1) * map_step] = e; - n = 0; - if(e == 2) - { - n += smem[lidy ][lidx ] == 1; - n += smem[lidy ][lidx + 1] == 1; - n += smem[lidy ][lidx + 2] == 1; + n = 0; + if(e == 2) + { + n += smem[lidy ][lidx ] == 1; + n += smem[lidy ][lidx + 1] == 1; + n += smem[lidy ][lidx + 2] == 1; - n += smem[lidy + 1][lidx ] == 1; - n += smem[lidy + 1][lidx + 2] == 1; + n += smem[lidy + 1][lidx ] == 1; + n += smem[lidy + 1][lidx + 2] == 1; - n += smem[lidy + 2][lidx ] == 1; - n += smem[lidy + 2][lidx + 1] == 1; - n += smem[lidy + 2][lidx + 2] == 1; - } + n += smem[lidy + 2][lidx ] == 1; + n += smem[lidy + 2][lidx + 1] == 1; + n += smem[lidy + 2][lidx + 2] == 1; + } - if(n > 0) - { - unsigned int ind = atomic_inc(counter); - st[ind] = (ushort2)(gidx + 1, gidy + 1); - } - } + if(n > 0) + { + unsigned int ind = atomic_inc(counter); + st[ind] = (ushort2)(gidx + 1, gidy + 1); + } + } } __constant int c_dx[8] = {-1, 0, 1, -1, 1, -1, 0, 1}; @@ -653,116 +653,122 @@ __constant c_dy[8] = {-1, -1, -1, 0, 0, 1, 1, 1}; #define stack_size 512 __kernel -void edgesHysteresisGlobal -( - __global int * map, - __global ushort2 * st1, - __global ushort2 * st2, - volatile __global int * counter, - int rows, - int cols, - int count, - int map_step, - int map_offset -) + void edgesHysteresisGlobal + ( + __global int * map, + __global ushort2 * st1, + __global ushort2 * st2, + volatile __global int * counter, + int rows, + int cols, + int count, + int map_step, + int map_offset + ) { - map_step /= sizeof(*map); - map_offset /= sizeof(*map); + map_step /= sizeof(*map); + map_offset /= sizeof(*map); - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - int lidx = get_local_id(0); - int lidy = get_local_id(1); + int lidx = get_local_id(0); + int lidy = get_local_id(1); - int grp_idx = get_group_id(0); - int grp_idy = get_group_id(1); + int grp_idx = get_group_id(0); + int grp_idy = get_group_id(1); - volatile __local unsigned int s_counter; - __local unsigned int s_ind; + volatile __local unsigned int s_counter; + __local unsigned int s_ind; - __local ushort2 s_st[stack_size]; + __local ushort2 s_st[stack_size]; - if(lidx == 0) - { - s_counter = 0; - } - barrier(CLK_LOCAL_MEM_FENCE); + if(gidx + gidy == 0) + { + *counter = 0; + } + barrier(CLK_GLOBAL_MEM_FENCE); - int ind = grp_idy * get_num_groups(0) + grp_idx; - - if(ind < count) - { - ushort2 pos = st1[ind]; - if (pos.x > 0 && pos.x <= cols && pos.y > 0 && pos.y <= rows) - { - if (lidx < 8) - { - pos.x += c_dx[lidx]; - pos.y += c_dy[lidx]; + if(lidx == 0) + { + s_counter = 0; + } + barrier(CLK_LOCAL_MEM_FENCE); - if (map[pos.x + pos.y * map_step] == 1) - { - map[pos.x + pos.y * map_step] = 2; + int ind = grp_idy * get_num_groups(0) + grp_idx; - ind = atomic_inc(&s_counter); + if(ind < count) + { + ushort2 pos = st1[ind]; + if (pos.x > 0 && pos.x <= cols && pos.y > 0 && pos.y <= rows) + { + if (lidx < 8) + { + pos.x += c_dx[lidx]; + pos.y += c_dy[lidx]; - s_st[ind] = pos; - } - } - barrier(CLK_LOCAL_MEM_FENCE); + if (map[pos.x + pos.y * map_step] == 1) + { + map[pos.x + pos.y * map_step] = 2; - while (s_counter > 0 && s_counter <= stack_size - get_num_groups(0)) - { - const int subTaskIdx = lidx >> 3; - const int portion = min(s_counter, get_num_groups(0) >> 3); + ind = atomic_inc(&s_counter); - pos.x = pos.y = 0; + s_st[ind] = pos; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - if (subTaskIdx < portion) - pos = s_st[s_counter - 1 - subTaskIdx]; - barrier(CLK_LOCAL_MEM_FENCE); + while (s_counter > 0 && s_counter <= stack_size - get_num_groups(0)) + { + const int subTaskIdx = lidx >> 3; + const int portion = min(s_counter, get_num_groups(0) >> 3); - if (lidx == 0) - s_counter -= portion; - barrier(CLK_LOCAL_MEM_FENCE); + pos.x = pos.y = 0; - if (pos.x > 0 && pos.x <= cols && pos.y > 0 && pos.y <= rows) - { - pos.x += c_dx[lidx & 7]; - pos.y += c_dy[lidx & 7]; + if (subTaskIdx < portion) + pos = s_st[s_counter - 1 - subTaskIdx]; + barrier(CLK_LOCAL_MEM_FENCE); - if (map[pos.x + map_offset + pos.y * map_step] == 1) - { - map[pos.x + map_offset + pos.y * map_step] = 2; + if (lidx == 0) + s_counter -= portion; + barrier(CLK_LOCAL_MEM_FENCE); - ind = atomic_inc(&s_counter); + if (pos.x > 0 && pos.x <= cols && pos.y > 0 && pos.y <= rows) + { + pos.x += c_dx[lidx & 7]; + pos.y += c_dy[lidx & 7]; - s_st[ind] = pos; - } - } - barrier(CLK_LOCAL_MEM_FENCE); - } + if (map[pos.x + map_offset + pos.y * map_step] == 1) + { + map[pos.x + map_offset + pos.y * map_step] = 2; - if (s_counter > 0) - { - if (lidx == 0) - { - ind = atomic_add(counter, s_counter); - s_ind = ind - s_counter; - } - barrier(CLK_LOCAL_MEM_FENCE); + ind = atomic_inc(&s_counter); - ind = s_ind; + s_st[ind] = pos; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + } - for (int i = lidx; i < s_counter; i += get_num_groups(0)) - { - st2[ind + i] = s_st[i]; - } - } - } - } + if (s_counter > 0) + { + if (lidx == 0) + { + ind = atomic_add(counter, s_counter); + s_ind = ind - s_counter; + } + barrier(CLK_LOCAL_MEM_FENCE); + + ind = s_ind; + + for (int i = lidx; i < s_counter; i += get_num_groups(0)) + { + st2[ind + i] = s_st[i]; + } + } + } + } } #undef stack_size @@ -770,29 +776,29 @@ void edgesHysteresisGlobal // map edge type mappings // dst edge output __kernel -void getEdges -( - __global const int * map, - __global uchar * dst, - int rows, - int cols, - int map_step, - int map_offset, - int dst_step, - int dst_offset -) + void getEdges + ( + __global const int * map, + __global uchar * dst, + int rows, + int cols, + int map_step, + int map_offset, + int dst_step, + int dst_offset + ) { - map_step /= sizeof(*map); - map_offset /= sizeof(*map); - //dst_step /= sizeof(*dst); - //dst_offset /= sizeof(*dst); + map_step /= sizeof(*map); + map_offset /= sizeof(*map); + //dst_step /= sizeof(*dst); + //dst_offset /= sizeof(*dst); - int gidx = get_global_id(0); - int gidy = get_global_id(1); + int gidx = get_global_id(0); + int gidy = get_global_id(1); - if(gidy < rows && gidx < cols) - { - //dst[gidx + gidy * dst_step] = map[gidx + 1 + (gidy + 1) * map_step] == 2 ? 255: 0; - dst[gidx + gidy * dst_step] = (uchar)(-(map[gidx + 1 + (gidy + 1) * map_step] / 2)); - } + if(gidy < rows && gidx < cols) + { + //dst[gidx + gidy * dst_step] = map[gidx + 1 + (gidy + 1) * map_step] == 2 ? 255: 0; + dst[gidx + gidy * dst_step] = (uchar)(-(map[gidx + 1 + (gidy + 1) * map_step] / 2)); + } } diff --git a/modules/ocl/src/kernels/nonfree_surf.cl b/modules/ocl/src/kernels/nonfree_surf.cl index 16cd4be54..ae694d57f 100644 --- a/modules/ocl/src/kernels/nonfree_surf.cl +++ b/modules/ocl/src/kernels/nonfree_surf.cl @@ -58,17 +58,9 @@ // Image read mode __constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; +#define FLT_EPSILON (1e-15) #define CV_PI_F 3.14159265f -// print greyscale image to show image layout -__kernel void printImage(image2d_t img) -{ - printf("(%d, %d) - %3d \n", - get_global_id(0), - get_global_id(1), - read_imageui(img, (int2)(get_global_id(0), get_global_id(1))).x - ); -} // Use integral image to calculate haar wavelets. // N = 2 @@ -444,7 +436,6 @@ __kernel float val0 = N9[localLin]; if (val0 > c_hessianThreshold) { - //printf(\"(%3d, %3d) N9[%3d]=%7.1f val0=%7.1f\\n\", l_x, l_y, localLin - zoff, N9[localLin], val0); // Coordinates for the start of the wavelet in the sum image. There // is some integer division involved, so don't try to simplify this // (cancel out sampleStep) without checking the result is the same @@ -726,6 +717,7 @@ __kernel __global float* featureSize = keypoints + SIZE_ROW * keypoints_step; __global float* featureDir = keypoints + ANGLE_ROW * keypoints_step; + volatile __local float s_X[128]; volatile __local float s_Y[128]; volatile __local float s_angle[128]; @@ -737,6 +729,7 @@ __kernel and building the keypoint descriptor are defined relative to 's' */ const float s = featureSize[get_group_id(0)] * 1.2f / 9.0f; + /* To find the dominant orientation, the gradients in x and y are sampled in a circle of radius 6s using wavelets of size 4s. We ensure the gradient wavelet size is even to ensure the @@ -765,16 +758,18 @@ __kernel Y = c_aptW[tid] * icvCalcHaarPatternSum_2(sumTex, c_NY, 4, grad_wav_size, y, x); angle = atan2(Y, X); + if (angle < 0) angle += 2.0f * CV_PI_F; angle *= 180.0f / CV_PI_F; + } } s_X[tid] = X; s_Y[tid] = Y; s_angle[tid] = angle; barrier(CLK_LOCAL_MEM_FENCE); - + float bestx = 0, besty = 0, best_mod = 0; #pragma unroll @@ -807,7 +802,6 @@ __kernel sumx += s_X[get_local_id(0) + 96]; sumy += s_Y[get_local_id(0) + 96]; } - reduce_32_sum(s_sumx + get_local_id(1) * 32, sumx, get_local_id(0)); reduce_32_sum(s_sumy + get_local_id(1) * 32, sumy, get_local_id(0)); @@ -818,10 +812,8 @@ __kernel bestx = sumx; besty = sumy; } - barrier(CLK_LOCAL_MEM_FENCE); } - if (get_local_id(0) == 0) { s_X[get_local_id(1)] = bestx; @@ -846,6 +838,10 @@ __kernel kp_dir += 2.0f * CV_PI_F; kp_dir *= 180.0f / CV_PI_F; + kp_dir = 360.0f - kp_dir; + if (fabs(kp_dir - 360.f) < FLT_EPSILON) + kp_dir = 0.f; + featureDir[get_group_id(0)] = kp_dir; } } @@ -940,7 +936,10 @@ void calc_dx_dy( const float centerX = featureX[get_group_id(0)]; const float centerY = featureY[get_group_id(0)]; const float size = featureSize[get_group_id(0)]; - const float descriptor_dir = featureDir[get_group_id(0)] * (float)(CV_PI_F / 180.0f); + float descriptor_dir = 360.0f - featureDir[get_group_id(0)]; + if (fabs(descriptor_dir - 360.f) < FLT_EPSILON) + descriptor_dir = 0.f; + descriptor_dir *= (float)(CV_PI_F / 180.0f); /* The sampling intervals and wavelet sized for selecting an orientation and building the keypoint descriptor are defined relative to 's' */ diff --git a/modules/ocl/src/kernels/objdetect_hog.cl b/modules/ocl/src/kernels/objdetect_hog.cl index 4a950fa1c..e1e3c1b7c 100644 --- a/modules/ocl/src/kernels/objdetect_hog.cl +++ b/modules/ocl/src/kernels/objdetect_hog.cl @@ -448,3 +448,42 @@ __kernel void compute_gradients_8UC1_kernel(const int height, const int width, c grad[ ((gidY * grad_quadstep + x) << 1) + 1 ] = mag * ang; } } + +//---------------------------------------------------------------------------- +// Resize + +__kernel void resize_8UC4_kernel(__global uchar4 * dst, __global const uchar4 * src, + int dst_offset, int src_offset, int dst_step, int src_step, + int src_cols, int src_rows, int dst_cols, int dst_rows, float ifx, float ify ) +{ + int dx = get_global_id(0); + int dy = get_global_id(1); + + int sx = (int)floor(dx*ifx+0.5f); + int sy = (int)floor(dy*ify+0.5f); + sx = min(sx, src_cols-1); + sy = min(sy, src_rows-1); + int dpos = (dst_offset>>2) + dy * (dst_step>>2) + dx; + int spos = (src_offset>>2) + sy * (src_step>>2) + sx; + + if(dx > args; - - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); - args.push_back( make_pair( sizeof(cl_ulong), (void *)&templ_sqsum)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); - - size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; - openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U); - } - - void matchTemplateNaive_SQDIFF( - const oclMat& image, const oclMat& templ, oclMat& result, int cn) - { - CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U ) - || (image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F); - CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1); - CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1); - - Context *clCxt = image.clCxt; - string kernelName = "matchTemplate_Naive_SQDIFF"; - - vector< pair > args; - - args.push_back( make_pair( sizeof(cl_mem), (void *)&image.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&templ.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); - - size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; - openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); - } - - ////////////////////////////////////////////////////////////////////// - // CCORR - void matchTemplate_CCORR( - const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) - { - result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F); - if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth())) - { - matchTemplateNaive_CCORR(image, templ, result, image.channels()); - return; - } - else - { - CV_Error(CV_StsBadArg, "Not supported yet for this size template"); - if(image.depth() == CV_8U && templ.depth() == CV_8U) - { - image.convertTo(buf.imagef, CV_32F); - templ.convertTo(buf.templf, CV_32F); - } - CV_Assert(image.channels() == 1); - oclMat o_result(image.size(), CV_MAKETYPE(CV_32F, image.channels())); - filter2D(buf.imagef,o_result,CV_32F,buf.templf, Point(0,0)); - result = o_result(Rect(0,0,image.rows - templ.rows + 1, image.cols - templ.cols + 1)); - } - } - - void matchTemplate_CCORR_NORMED( - const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) - { - matchTemplate_CCORR(image,templ,result,buf); - buf.image_sums.resize(1); - buf.image_sqsums.resize(1); - - integral(image.reshape(1), buf.image_sums[0], buf.image_sqsums[0]); -#if EXT_FP64 && SQRSUM_FIXED - unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; -#elif EXT_FP64 - oclMat templ_c1 = templ.reshape(1); - multiply(templ_c1, templ_c1, templ_c1); - unsigned long long templ_sqsum = (unsigned long long)sum(templ_c1)[0]; -#else - Mat m_templ_c1 = templ.reshape(1); - multiply(m_templ_c1, m_templ_c1, m_templ_c1); - unsigned long long templ_sqsum = (unsigned long long)sum(m_templ_c1)[0]; -#endif - Context *clCxt = image.clCxt; - string kernelName = "normalizeKernel"; - vector< pair > args; - - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); - args.push_back( make_pair( sizeof(cl_ulong), (void *)&templ_sqsum)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); - - size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; - openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U); - } - - void matchTemplateNaive_CCORR( - const oclMat& image, const oclMat& templ, oclMat& result, int cn) - { - CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U ) - || (image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F); - CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1); - CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1); - - Context *clCxt = image.clCxt; - string kernelName = "matchTemplate_Naive_CCORR"; - - vector< pair > args; - - args.push_back( make_pair( sizeof(cl_mem), (void *)&image.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&templ.data)); - args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.step)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); - - size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; - openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); - } - ////////////////////////////////////////////////////////////////////// - // CCOFF - void matchTemplate_CCOFF( - const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) - { - CV_Assert(image.depth() == CV_8U && templ.depth() == CV_8U); - - matchTemplate_CCORR(image,templ,result,buf); - - Context *clCxt = image.clCxt; - string kernelName; - - kernelName = "matchTemplate_Prepared_CCOFF"; - size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; - - vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); - // to be continued in the following section - if(image.channels() == 1) - { - buf.image_sums.resize(1); - // FIXME: temp fix for incorrect integral kernel - oclMat tmp_oclmat; - integral(image, buf.image_sums[0], tmp_oclmat); - - float templ_sum = 0; -#if EXT_FP64 - templ_sum = (float)sum(templ)[0] / templ.size().area(); -#else - Mat o_templ = templ; - templ_sum = (float)sum(o_templ)[0] / o_templ.size().area(); // temp fix for non-double supported machine -#endif - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) ); - } - else - { - Vec4f templ_sum = Vec4f::all(0); -#if EXT_FP64 - split(image,buf.images); - templ_sum = sum(templ) / templ.size().area(); -#else - // temp fix for non-double supported machine - Mat o_templ = templ, o_image = image; - vector o_mat_vector; - o_mat_vector.resize(image.channels()); - buf.images.resize(image.channels()); - split(o_image, o_mat_vector); - for(int i = 0; i < o_mat_vector.size(); i ++) - { - buf.images[i] = oclMat(o_mat_vector[i]); - } - templ_sum = sum(o_templ) / templ.size().area(); -#endif - buf.image_sums.resize(buf.images.size()); - - for(int i = 0; i < image.channels(); i ++) - { - // FIXME: temp fix for incorrect integral kernel - oclMat omat_temp; - integral(buf.images[i], buf.image_sums[i], omat_temp); - } - switch(image.channels()) - { - case 4: - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[1].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[2].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) ); - break; - default: - CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels"); - break; - } - } - openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); - } - - void matchTemplate_CCOFF_NORMED( - const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) - { - image.convertTo(buf.imagef, CV_32F); - templ.convertTo(buf.templf, CV_32F); - - matchTemplate_CCORR(buf.imagef, buf.templf, result, buf); - float scale = 1.f/templ.size().area(); - - Context *clCxt = image.clCxt; - string kernelName; - - kernelName = "matchTemplate_Prepared_CCOFF_NORMED"; - size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; - - vector< pair > args; - args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); - args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); - args.push_back( make_pair( sizeof(cl_float),(void *)&scale) ); - // to be continued in the following section - if(image.channels() == 1) - { - buf.image_sums.resize(1); - buf.image_sqsums.resize(1); - integral(image, buf.image_sums[0], buf.image_sqsums[0]); - float templ_sum = 0; - float templ_sqsum = 0; -#if EXT_FP64 - templ_sum = (float)sum(templ)[0]; #if SQRSUM_FIXED - templ_sqsum = sqrSum(templ); + unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; #else - oclMat templ_sqr = templ; - multiply(templ,templ, templ_sqr); - templ_sqsum = sum(templ_sqr)[0]; -#endif //SQRSUM_FIXED - templ_sqsum -= scale * templ_sum * templ_sum; - templ_sum *= scale; -#else - // temp fix for non-double supported machine - Mat o_templ = templ; - templ_sum = (float)sum(o_templ)[0]; - templ_sqsum = sum(o_templ.mul(o_templ))[0] - scale * templ_sum * templ_sum; - templ_sum *= scale; + Mat sqr_mat = templ.reshape(1); + unsigned long long templ_sqsum = (unsigned long long)sum(sqr_mat.mul(sqr_mat))[0]; #endif - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum) ); - } - else - { - Vec4f templ_sum = Vec4f::all(0); - Vec4f templ_sqsum = Vec4f::all(0); -#if EXT_FP64 - split(image,buf.images); - templ_sum = sum(templ); + + Context *clCxt = image.clCxt; + string kernelName = "matchTemplate_Prepared_SQDIFF_NORMED"; + vector< pair > args; + + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); + args.push_back( make_pair( sizeof(cl_ulong), (void *)&templ_sqsum)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {32, 8, 1}; + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U); + } + + void matchTemplateNaive_SQDIFF( + const oclMat& image, const oclMat& templ, oclMat& result, int cn) + { + CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U ) + || (image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F); + CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1); + CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1); + + Context *clCxt = image.clCxt; + string kernelName = "matchTemplate_Naive_SQDIFF"; + + vector< pair > args; + + args.push_back( make_pair( sizeof(cl_mem), (void *)&image.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&templ.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {32, 8, 1}; + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); + } + + ////////////////////////////////////////////////////////////////////// + // CCORR + void matchTemplate_CCORR( + const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) + { + result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F); + if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth())) + { + matchTemplateNaive_CCORR(image, templ, result, image.channels()); + return; + } + else + { + CV_Error(CV_StsBadArg, "Not supported yet for this size template"); + if(image.depth() == CV_8U && templ.depth() == CV_8U) + { + image.convertTo(buf.imagef, CV_32F); + templ.convertTo(buf.templf, CV_32F); + } + CV_Assert(image.channels() == 1); + oclMat o_result(image.size(), CV_MAKETYPE(CV_32F, image.channels())); + filter2D(buf.imagef,o_result,CV_32F,buf.templf, Point(0,0)); + result = o_result(Rect(0,0,image.rows - templ.rows + 1, image.cols - templ.cols + 1)); + } + } + + void matchTemplate_CCORR_NORMED( + const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) + { + matchTemplate_CCORR(image,templ,result,buf); + buf.image_sums.resize(1); + buf.image_sqsums.resize(1); + + integral(image.reshape(1), buf.image_sums[0], buf.image_sqsums[0]); #if SQRSUM_FIXED - templ_sqsum = sqrSum(templ); + unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; #else - oclMat templ_sqr = templ; - multiply(templ,templ, templ_sqr); - templ_sqsum = sum(templ_sqr); -#endif //SQRSUM_FIXED - templ_sqsum -= scale * templ_sum * templ_sum; - -#else - // temp fix for non-double supported machine - Mat o_templ = templ, o_image = image; - - vector o_mat_vector; - o_mat_vector.resize(image.channels()); - buf.images.resize(image.channels()); - split(o_image, o_mat_vector); - for(int i = 0; i < o_mat_vector.size(); i ++) - { - buf.images[i] = oclMat(o_mat_vector[i]); - } - templ_sum = sum(o_templ); - templ_sqsum = sum(o_templ.mul(o_templ)); + oclMat templ_c1 = templ.reshape(1); + multiply(templ_c1, templ_c1, templ_c1); + unsigned long long templ_sqsum = (unsigned long long)sum(templ_c1)[0]; #endif - float templ_sqsum_sum = 0; - for(int i = 0; i < image.channels(); i ++) - { - templ_sqsum_sum += templ_sqsum[i] - scale * templ_sum[i] * templ_sum[i]; - } - templ_sum *= scale; - buf.image_sums.resize(buf.images.size()); - buf.image_sqsums.resize(buf.images.size()); - - for(int i = 0; i < image.channels(); i ++) - { - integral(buf.images[i], buf.image_sums[i], buf.image_sqsums[i]); - } - - switch(image.channels()) - { - case 4: - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[1].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[2].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[1].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[2].data) ); - args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[3].data) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) ); - args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) ); - args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum_sum) ); - break; - default: - CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels"); - break; - } - } - openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); - } + Context *clCxt = image.clCxt; + string kernelName = "normalizeKernel"; + vector< pair > args; + + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); + args.push_back( make_pair( sizeof(cl_ulong), (void *)&templ_sqsum)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {32, 8, 1}; + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U); + } + + void matchTemplateNaive_CCORR( + const oclMat& image, const oclMat& templ, oclMat& result, int cn) + { + CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U ) + || (image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F); + CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1); + CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1); + + Context *clCxt = image.clCxt; + string kernelName = "matchTemplate_Naive_CCORR"; + + vector< pair > args; + + args.push_back( make_pair( sizeof(cl_mem), (void *)&image.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&templ.data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {32, 8, 1}; + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); + } + ////////////////////////////////////////////////////////////////////// + // CCOFF + void matchTemplate_CCOFF( + const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) + { + CV_Assert(image.depth() == CV_8U && templ.depth() == CV_8U); + + matchTemplate_CCORR(image,templ,result,buf); + + Context *clCxt = image.clCxt; + string kernelName; + + kernelName = "matchTemplate_Prepared_CCOFF"; + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {32, 8, 1}; + + vector< pair > args; + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + // to be continued in the following section + if(image.channels() == 1) + { + buf.image_sums.resize(1); + integral(image, buf.image_sums[0]); + + float templ_sum = 0; + templ_sum = (float)sum(templ)[0] / templ.size().area(); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) ); + } + else + { + Vec4f templ_sum = Vec4f::all(0); + split(image,buf.images); + templ_sum = sum(templ) / templ.size().area(); + buf.image_sums.resize(buf.images.size()); + + for(int i = 0; i < image.channels(); i ++) + { + integral(buf.images[i], buf.image_sums[i]); + } + switch(image.channels()) + { + case 4: + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[1].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[2].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) ); + break; + default: + CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels"); + break; + } + } + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); + } + + void matchTemplate_CCOFF_NORMED( + const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) + { + image.convertTo(buf.imagef, CV_32F); + templ.convertTo(buf.templf, CV_32F); + + matchTemplate_CCORR(buf.imagef, buf.templf, result, buf); + float scale = 1.f/templ.size().area(); + + Context *clCxt = image.clCxt; + string kernelName; + + kernelName = "matchTemplate_Prepared_CCOFF_NORMED"; + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {32, 8, 1}; + + vector< pair > args; + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.rows) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.cols) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + args.push_back( make_pair( sizeof(cl_float),(void *)&scale) ); + // to be continued in the following section + if(image.channels() == 1) + { + buf.image_sums.resize(1); + buf.image_sqsums.resize(1); + integral(image, buf.image_sums[0], buf.image_sqsums[0]); + float templ_sum = 0; + float templ_sqsum = 0; + templ_sum = (float)sum(templ)[0]; +#if SQRSUM_FIXED + templ_sqsum = sqrSum(templ)[0]; +#else + oclMat templ_sqr = templ; + multiply(templ,templ, templ_sqr); + templ_sqsum = sum(templ_sqr)[0]; +#endif //SQRSUM_FIXED + templ_sqsum -= scale * templ_sum * templ_sum; + templ_sum *= scale; + + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum) ); + } + else + { + Vec4f templ_sum = Vec4f::all(0); + Vec4f templ_sqsum = Vec4f::all(0); + + split(image,buf.images); + templ_sum = sum(templ); +#if SQRSUM_FIXED + templ_sqsum = sqrSum(templ); +#else + oclMat templ_sqr = templ; + multiply(templ,templ, templ_sqr); + templ_sqsum = sum(templ_sqr); +#endif //SQRSUM_FIXED + templ_sqsum -= scale * templ_sum * templ_sum; + + float templ_sqsum_sum = 0; + for(int i = 0; i < image.channels(); i ++) + { + templ_sqsum_sum += templ_sqsum[i] - scale * templ_sum[i] * templ_sum[i]; + } + templ_sum *= scale; + buf.image_sums.resize(buf.images.size()); + buf.image_sqsums.resize(buf.images.size()); + + for(int i = 0; i < image.channels(); i ++) + { + integral(buf.images[i], buf.image_sums[i], buf.image_sqsums[i]); + } + + switch(image.channels()) + { + case 4: + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[1].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[2].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[1].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[2].data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[3].data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) ); + args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum_sum) ); + break; + default: + CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels"); + break; + } + } + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); + } }/*ocl*/} /*cv*/ void cv::ocl::matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method) { - MatchTemplateBuf buf; - matchTemplate(image,templ, result, method,buf); + MatchTemplateBuf buf; + matchTemplate(image,templ, result, method,buf); } void cv::ocl::matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method, MatchTemplateBuf& buf) { - CV_Assert(image.type() == templ.type()); - CV_Assert(image.cols >= templ.cols && image.rows >= templ.rows); + CV_Assert(image.type() == templ.type()); + CV_Assert(image.cols >= templ.cols && image.rows >= templ.rows); - typedef void (*Caller)(const oclMat&, const oclMat&, oclMat&, MatchTemplateBuf&); + typedef void (*Caller)(const oclMat&, const oclMat&, oclMat&, MatchTemplateBuf&); - const Caller callers[] = { - ::matchTemplate_SQDIFF, ::matchTemplate_SQDIFF_NORMED, - ::matchTemplate_CCORR, ::matchTemplate_CCORR_NORMED, - ::matchTemplate_CCOFF, ::matchTemplate_CCOFF_NORMED - }; + const Caller callers[] = { + ::matchTemplate_SQDIFF, ::matchTemplate_SQDIFF_NORMED, + ::matchTemplate_CCORR, ::matchTemplate_CCORR_NORMED, + ::matchTemplate_CCOFF, ::matchTemplate_CCOFF_NORMED + }; - Caller caller = callers[method]; - CV_Assert(caller); - caller(image, templ, result, buf); + Caller caller = callers[method]; + CV_Assert(caller); + caller(image, templ, result, buf); } #endif // diff --git a/modules/ocl/src/pyrdown.cpp b/modules/ocl/src/pyrdown.cpp index 3f0a241cf..058d54311 100644 --- a/modules/ocl/src/pyrdown.cpp +++ b/modules/ocl/src/pyrdown.cpp @@ -1,4 +1,49 @@ - +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Dachuan Zhao, dachuan@multicorewareinc.com +// Yao Wang, yao@multicorewareinc.com +// +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ #include "precomp.hpp" using namespace cv; @@ -24,7 +69,6 @@ namespace cv template void pyrdown_run(const oclMat &src, const oclMat &dst) { - CV_Assert(src.cols / 2 == dst.cols && src.rows / 2 == dst.rows); CV_Assert(src.type() == dst.type()); CV_Assert(src.depth() != CV_8S); @@ -108,7 +152,7 @@ void cv::ocl::pyrDown(const oclMat& src, oclMat& dst) dst.create((src.rows + 1) / 2, (src.cols + 1) / 2, src.type()); - //dst.step = dst.rows; + dst.download_channels = src.download_channels; pyrdown_run(src, dst); } diff --git a/modules/ocl/src/pyrup.cpp b/modules/ocl/src/pyrup.cpp index ee0dfe382..0190faada 100644 --- a/modules/ocl/src/pyrup.cpp +++ b/modules/ocl/src/pyrup.cpp @@ -16,6 +16,7 @@ // // @Authors // Zhang Chunpeng chunpeng@multicorewareinc.com +// Yao Wang, yao@multicorewareinc.com // // // Redistribution and use in source and binary forms, with or without modification, @@ -61,8 +62,9 @@ namespace cv { namespace ocl { extern const char *pyr_up; void pyrUp(const cv::ocl::oclMat& src,cv::ocl::oclMat& dst) - { + { dst.create(src.rows * 2, src.cols * 2, src.type()); + dst.download_channels=src.download_channels; Context *clCxt = src.clCxt; const std::string kernelName = "pyrUp"; diff --git a/modules/ocl/src/surf.cpp b/modules/ocl/src/surf.cpp index 7d9798de7..af744ff78 100644 --- a/modules/ocl/src/surf.cpp +++ b/modules/ocl/src/surf.cpp @@ -149,8 +149,7 @@ namespace //loadGlobalConstants(maxCandidates, maxFeatures, img_rows, img_cols, surf_.nOctaveLayers, static_cast(surf_.hessianThreshold)); bindImgTex(img); - oclMat integral_sqsum; - integral(img, surf_.sum, integral_sqsum); // the two argumented integral version is incorrect + integral(img, surf_.sum); // the two argumented integral version is incorrect bindSumTex(surf_.sum); maskSumTex = 0; diff --git a/modules/ocl/test/test_columnsum.cpp b/modules/ocl/test/test_columnsum.cpp index c5cbee706..abe113eb5 100644 --- a/modules/ocl/test/test_columnsum.cpp +++ b/modules/ocl/test/test_columnsum.cpp @@ -74,12 +74,10 @@ PARAM_TEST_CASE(ColumnSum, cv::Size, bool ) TEST_P(ColumnSum, Accuracy) { cv::Mat src = randomMat(size, CV_32FC1); - //cv::Mat src(size,CV_32FC1); + cv::ocl::oclMat d_dst; + cv::ocl::oclMat d_src(src); - //cv::ocl::oclMat d_dst = ::createMat(size,src.type(),useRoi); - cv::ocl::oclMat d_dst = loadMat(src,useRoi); - - cv::ocl::columnSum(loadMat(src,useRoi),d_dst); + cv::ocl::columnSum(d_src,d_dst); cv::Mat dst(d_dst); diff --git a/modules/ocl/test/test_pyrdown.cpp b/modules/ocl/test/test_pyrdown.cpp index b19db39f9..ede1a30e6 100644 --- a/modules/ocl/test/test_pyrdown.cpp +++ b/modules/ocl/test/test_pyrdown.cpp @@ -16,6 +16,7 @@ // // @Authors // Dachuan Zhao, dachuan@multicorewareinc.com +// Yao Wang yao@multicorewareinc.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -43,9 +44,6 @@ // //M*/ -//#define PRINT_CPU_TIME 1000 -//#define PRINT_TIME - #include "precomp.hpp" #include @@ -58,66 +56,15 @@ using namespace cvtest; using namespace testing; using namespace std; -PARAM_TEST_CASE(PyrDown, MatType, bool) +PARAM_TEST_CASE(PyrDown, MatType, int) { - int type; - cv::Scalar val; - - //src mat - cv::Mat mat1; - cv::Mat mat2; - cv::Mat mask; - cv::Mat dst; - cv::Mat dst1; //bak, for two outputs - - // set up roi - int roicols; - int roirows; - int src1x; - int src1y; - int src2x; - int src2y; - int dstx; - int dsty; - int maskx; - int masky; - - - //src mat with roi - cv::Mat mat1_roi; - cv::Mat mat2_roi; - cv::Mat mask_roi; - cv::Mat dst_roi; - cv::Mat dst1_roi; //bak - //std::vector oclinfo; - //ocl dst mat for testing - cv::ocl::oclMat gdst_whole; - cv::ocl::oclMat gdst1_whole; //bak - - //ocl mat with roi - cv::ocl::oclMat gmat1; - cv::ocl::oclMat gmat2; - cv::ocl::oclMat gdst; - cv::ocl::oclMat gdst1; //bak - cv::ocl::oclMat gmask; + int type; + int channels; virtual void SetUp() { type = GET_PARAM(0); - - cv::RNG &rng = TS::ptr()->get_rng(); - - cv::Size size(MWIDTH, MHEIGHT); - - mat1 = randomMat(rng, size, type, 5, 16, false); - mat2 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); - dst1 = randomMat(rng, size, type, 5, 16, false); - mask = randomMat(rng, size, CV_8UC1, 0, 2, false); - - cv::threshold(mask, mask, 0.5, 255., CV_8UC1); - - val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); + channels = GET_PARAM(1); //int devnums = getDevice(oclinfo); //CV_Assert(devnums > 0); @@ -127,169 +74,36 @@ PARAM_TEST_CASE(PyrDown, MatType, bool) void Cleanup() { - mat1.release(); - mat2.release(); - mask.release(); - dst.release(); - dst1.release(); - mat1_roi.release(); - mat2_roi.release(); - mask_roi.release(); - dst_roi.release(); - dst1_roi.release(); - - gdst_whole.release(); - gdst1_whole.release(); - gmat1.release(); - gmat2.release(); - gdst.release(); - gdst1.release(); - gmask.release(); } - void random_roi() - { - cv::RNG &rng = TS::ptr()->get_rng(); - -#ifdef RANDOMROI - //randomize ROI - roicols = rng.uniform(1, mat1.cols); - roirows = rng.uniform(1, mat1.rows); - src1x = rng.uniform(0, mat1.cols - roicols); - src1y = rng.uniform(0, mat1.rows - roirows); - dstx = rng.uniform(0, dst.cols - roicols); - dsty = rng.uniform(0, dst.rows - roirows); -#else - roicols = mat1.cols; - roirows = mat1.rows; - src1x = 0; - src1y = 0; - dstx = 0; - dsty = 0; -#endif - maskx = rng.uniform(0, mask.cols - roicols); - masky = rng.uniform(0, mask.rows - roirows); - src2x = rng.uniform(0, mat2.cols - roicols); - src2y = rng.uniform(0, mat2.rows - roirows); - mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); - mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows)); - mask_roi = mask(Rect(maskx, masky, roicols, roirows)); - dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - dst1_roi = dst1(Rect(dstx, dsty, roicols, roirows)); - - gdst_whole = dst; - gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - - gdst1_whole = dst1; - gdst1 = gdst1_whole(Rect(dstx, dsty, roicols, roirows)); - - gmat1 = mat1_roi; - gmat2 = mat2_roi; - gmask = mask_roi; //end - } - }; -#define VARNAME(A) string(#A); - - -void PrePrint() -{ - //for(int i = 0; i < MHEIGHT; i++) - //{ - // printf("(%d) ", i); - // for(int k = 0; k < MWIDTH; k++) - // { - // printf("%d ", mat1_roi.data[i * MHEIGHT + k]); - // } - // printf("\n"); - //} -} - -void PostPrint() -{ - //dst_roi.convertTo(dst_roi,CV_32S); - //cpu_dst.convertTo(cpu_dst,CV_32S); - //dst_roi -= cpu_dst; - //cpu_dst -= dst_roi; - //for(int i = 0; i < MHEIGHT / 2; i++) - //{ - // printf("(%d) ", i); - // for(int k = 0; k < MWIDTH / 2; k++) - // { - // if(gmat1.depth() == 0) - // { - // if(gmat1.channels() == 1) - // { - // printf("%d ", dst_roi.data[i * MHEIGHT / 2 + k]); - // } - // else - // { - // printf("%d ", ((unsigned*)dst_roi.data)[i * MHEIGHT / 2 + k]); - // } - // } - // else if(gmat1.depth() == 5) - // { - // printf("%.6f ", ((float*)dst_roi.data)[i * MHEIGHT / 2 + k]); - // } - // } - // printf("\n"); - //} - //for(int i = 0; i < MHEIGHT / 2; i++) - //{ - // printf("(%d) ", i); - // for(int k = 0; k < MWIDTH / 2; k++) - // { - // if(gmat1.depth() == 0) - // { - // if(gmat1.channels() == 1) - // { - // printf("%d ", cpu_dst.data[i * MHEIGHT / 2 + k]); - // } - // else - // { - // printf("%d ", ((unsigned*)cpu_dst.data)[i * MHEIGHT / 2 + k]); - // } - // } - // else if(gmat1.depth() == 5) - // { - // printf("%.6f ", ((float*)cpu_dst.data)[i * MHEIGHT / 2 + k]); - // } - // } - // printf("\n"); - //} -} - -////////////////////////////////PyrDown///////////////////////////////////////////////// -//struct PyrDown : ArithmTestBase {}; TEST_P(PyrDown, Mat) { for(int j = 0; j < LOOP_TIMES; j++) { - random_roi(); + cv::Size size(MWIDTH, MHEIGHT); + cv::RNG &rng = TS::ptr()->get_rng(); + cv::Mat src=randomMat(rng, size, CV_MAKETYPE(type, channels), 0, 100, false); - cv::pyrDown(mat1_roi, dst_roi); - cv::ocl::pyrDown(gmat1, gdst); + cv::ocl::oclMat gsrc(src), gdst; + cv::Mat dst_cpu; + cv::pyrDown(src, dst_cpu); + cv::ocl::pyrDown(gsrc, gdst); - cv::Mat cpu_dst; - gdst.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); + cv::Mat dst; + gdst.download(dst); + char s[1024]={0}; - EXPECT_MAT_NEAR(dst_roi, cpu_dst, dst_roi.depth() == CV_32F ? 1e-5f : 1.0f, s); + EXPECT_MAT_NEAR(dst, dst_cpu, dst.depth() == CV_32F ? 1e-4f : 1.0f, s); Cleanup(); } } - - - -//********test**************** INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrDown, Combine( - Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), - Values(false))); // Values(false) is the reserved parameter + Values(CV_8U, CV_32F), Values(1, 3, 4))); #endif // HAVE_OPENCL diff --git a/modules/ocl/test/test_pyrup.cpp b/modules/ocl/test/test_pyrup.cpp index 6bc043e36..c50aeb52b 100644 --- a/modules/ocl/test/test_pyrup.cpp +++ b/modules/ocl/test/test_pyrup.cpp @@ -16,6 +16,7 @@ // // @Authors // Zhang Chunpeng chunpeng@multicorewareinc.com +// Yao Wang yao@multicorewareinc.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -48,44 +49,49 @@ #ifdef HAVE_OPENCL +using namespace cv; +using namespace cvtest; +using namespace testing; +using namespace std; -PARAM_TEST_CASE(PyrUp,cv::Size,int) +PARAM_TEST_CASE(PyrUp, MatType, int) { - cv::Size size; int type; + int channels; //std::vector oclinfo; virtual void SetUp() { //int devnums = cv::ocl::getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); //CV_Assert(devnums > 0); - size = GET_PARAM(0); - type = GET_PARAM(1); + type = GET_PARAM(0); + channels = GET_PARAM(1); } }; TEST_P(PyrUp,Accuracy) { - cv::Mat src = randomMat(size,type); - + for(int j = 0; j < LOOP_TIMES; j++) + { + Size size(MWIDTH, MHEIGHT); + Mat src = randomMat(size,CV_MAKETYPE(type, channels)); + Mat dst_gold; + pyrUp(src,dst_gold); + ocl::oclMat dst; + ocl::oclMat srcMat(src); + ocl::pyrUp(srcMat,dst); + Mat cpu_dst; + dst.download(cpu_dst); + char s[100]={0}; - cv::Mat dst_gold; - cv::pyrUp(src,dst_gold); - - cv::ocl::oclMat dst; - cv::ocl::oclMat srcMat(src); - cv::ocl::pyrUp(srcMat,dst); - char s[100]={0}; - - EXPECT_MAT_NEAR(dst_gold, dst, (src.depth() == CV_32F ? 1e-4f : 1.0),s); + EXPECT_MAT_NEAR(dst_gold, cpu_dst, (src.depth() == CV_32F ? 1e-4f : 1.0),s); + } } -#if 1 + INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrUp, testing::Combine( - testing::Values(cv::Size(32, 32)), - testing::Values(MatType(CV_8UC1),MatType(CV_16UC1),MatType(CV_32FC1),MatType(CV_8UC4), - MatType(CV_16UC4),MatType(CV_32FC4)))); -#endif + Values(CV_8U, CV_32F), Values(1, 3, 4))); + #endif // HAVE_OPENCL \ No newline at end of file From c8bfc0fd890bdea4ba7f14918c64c78a31c4d9e5 Mon Sep 17 00:00:00 2001 From: yao Date: Mon, 3 Sep 2012 17:23:13 +0800 Subject: [PATCH 080/103] A little fix to ocl accuracy tests, make them more uniformed --- modules/ocl/test/test_canny.cpp | 8 ++------ modules/ocl/test/test_hog.cpp | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/ocl/test/test_canny.cpp b/modules/ocl/test/test_canny.cpp index 5cb1d0058..e728c99be 100644 --- a/modules/ocl/test/test_canny.cpp +++ b/modules/ocl/test/test_canny.cpp @@ -45,11 +45,7 @@ #include "precomp.hpp" -#ifdef WIN32 -#define FILTER_IMAGE "C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg" -#else -#define FILTER_IMAGE "/Users/Test/Valve_original.PNG" // user need to specify a valid image path -#endif +#define FILTER_IMAGE "../../../samples/gpu/road.png" #define SHOW_RESULT 0 //////////////////////////////////////////////////////// @@ -107,6 +103,6 @@ TEST_P(Canny, Accuracy) EXPECT_MAT_SIMILAR(edges_gold, edges, 1e-2); } -INSTANTIATE_TEST_CASE_P(ocl_ImgProc, Canny, testing::Combine( +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Canny, testing::Combine( testing::Values(AppertureSize(3), AppertureSize(5)), testing::Values(L2gradient(false), L2gradient(true)))); diff --git a/modules/ocl/test/test_hog.cpp b/modules/ocl/test/test_hog.cpp index 4c2a42f99..d4e95a47a 100644 --- a/modules/ocl/test/test_hog.cpp +++ b/modules/ocl/test/test_hog.cpp @@ -184,7 +184,7 @@ TEST_P(HOG, Detect) } -INSTANTIATE_TEST_CASE_P(OCL_ObjDetect, HOG, testing::Combine( +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, HOG, testing::Combine( testing::Values(cv::Size(64, 128), cv::Size(48, 96)), testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)))); From 11b403900ea91b93384a9a216cdc13e7a8077dcb Mon Sep 17 00:00:00 2001 From: niko Date: Mon, 3 Sep 2012 18:07:31 +0800 Subject: [PATCH 081/103] add channel 3 for test/main.cpp add remap --- modules/ocl/src/filtering.cpp | 1 - modules/ocl/src/imgproc.cpp | 44 +- modules/ocl/src/initialization.cpp | 4 +- modules/ocl/src/kernels/imgproc_remap.cl | 528 +++++++++++++++++++++ modules/ocl/test/main.cpp | 1 + modules/ocl/test/test_arithm.cpp | 32 +- modules/ocl/test/test_blend.cpp | 2 +- modules/ocl/test/test_canny.cpp | 2 +- modules/ocl/test/test_filters.cpp | 14 +- modules/ocl/test/test_hog.cpp | 4 +- modules/ocl/test/test_imgproc.cpp | 200 +++++--- modules/ocl/test/test_match_template.cpp | 4 +- modules/ocl/test/test_matrix_operation.cpp | 8 +- modules/ocl/test/test_split_merge.cpp | 4 +- 14 files changed, 751 insertions(+), 97 deletions(-) diff --git a/modules/ocl/src/filtering.cpp b/modules/ocl/src/filtering.cpp index 02c13702f..bbce18103 100644 --- a/modules/ocl/src/filtering.cpp +++ b/modules/ocl/src/filtering.cpp @@ -1445,7 +1445,6 @@ void cv::ocl::sepFilter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat Ptr cv::ocl::createDerivFilter_GPU( int srcType, int dstType, int dx, int dy, int ksize, int borderType ) { - CV_Assert(dstType == srcType); Mat kx, ky; getDerivKernels( kx, ky, dx, dy, ksize, false, CV_32F ); return createSeparableLinearFilter_GPU(srcType, dstType, diff --git a/modules/ocl/src/imgproc.cpp b/modules/ocl/src/imgproc.cpp index 5e6966b97..4052f23f9 100644 --- a/modules/ocl/src/imgproc.cpp +++ b/modules/ocl/src/imgproc.cpp @@ -256,8 +256,9 @@ namespace cv Context *clCxt = src.clCxt; CV_Assert(interpolation == INTER_LINEAR || interpolation == INTER_NEAREST || interpolation == INTER_CUBIC || interpolation== INTER_LANCZOS4); - CV_Assert((map1.type() == CV_16SC2)&&(!map2.data) || (map1.type()== CV_32FC2)&&!map2.data);//more - CV_Assert((!map2.data || map2.size()== map1.size())); + CV_Assert((map1.type() == CV_16SC2 && !map2.data) || (map1.type()== CV_32FC2 && !map2.data) || (map1.type() == CV_32FC1 && map2.type() == CV_32FC1)); + CV_Assert(!map2.data || map2.size()== map1.size()); + CV_Assert(dst.size() == map1.size()); dst.create(map1.size(), src.type()); @@ -279,6 +280,14 @@ namespace cv kernelName = "remapNNSConstant"; } + else if(map1.type() == CV_32FC1 && map2.type() == CV_32FC1) + { + if(interpolation == INTER_LINEAR && borderType == BORDER_CONSTANT) + kernelName = "remapLNF1Constant"; + else if (interpolation == INTER_NEAREST && borderType == BORDER_CONSTANT) + kernelName = "remapNNF1Constant"; + } + int channels = dst.channels(); int depth = dst.depth(); int type = src.type(); @@ -402,7 +411,36 @@ namespace cv { args.push_back( make_pair(sizeof(cl_float4),(void*)&borderValue)); } - } + } + if(map1.channels() == 1) + { + args.push_back( make_pair(sizeof(cl_mem),(void*)&dst.data)); + args.push_back( make_pair(sizeof(cl_mem),(void*)&src.data)); + // args.push_back( make_pair(sizeof(cl_mem),(void*)&srcImage)); //imageBuffer + args.push_back( make_pair(sizeof(cl_mem),(void*)&map1.data)); + args.push_back( make_pair(sizeof(cl_mem),(void*)&map2.data)); + args.push_back( make_pair(sizeof(cl_int),(void*)&dst.offset)); + args.push_back( make_pair(sizeof(cl_int),(void*)&src.offset)); + args.push_back( make_pair(sizeof(cl_int),(void*)&map1.offset)); + args.push_back( make_pair(sizeof(cl_int),(void*)&dst.step)); + args.push_back( make_pair(sizeof(cl_int),(void*)&src.step)); + args.push_back( make_pair(sizeof(cl_int),(void*)&map1.step)); + args.push_back( make_pair(sizeof(cl_int),(void*)&src.cols)); + args.push_back( make_pair(sizeof(cl_int),(void*)&src.rows)); + args.push_back( make_pair(sizeof(cl_int),(void*)&dst.cols)); + args.push_back( make_pair(sizeof(cl_int),(void*)&dst.rows)); + args.push_back( make_pair(sizeof(cl_int),(void*)&map1.cols)); + args.push_back( make_pair(sizeof(cl_int),(void*)&map1.rows)); + args.push_back( make_pair(sizeof(cl_int), (void *)&cols)); + if(src.clCxt -> impl -> double_support != 0) + { + args.push_back( make_pair(sizeof(cl_double4),(void*)&borderValue)); + } + else + { + args.push_back( make_pair(sizeof(cl_float4),(void*)&borderValue)); + } + } openCLExecuteKernel(clCxt,&imgproc_remap,kernelName,globalThreads,localThreads,args,src.channels(),src.depth()); } diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 5075d3093..42ad8bc12 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -391,7 +391,7 @@ namespace cv size_t region[3] = {width, height, 1}; if(kind == clMemcpyHostToDevice) { - if(dpitch == width || channels==3) + if(dpitch == width || channels==3 || height == 1) { openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)dst, CL_TRUE, 0, width*height, src, 0, NULL, NULL)); @@ -404,7 +404,7 @@ namespace cv } else if(kind == clMemcpyDeviceToHost) { - if(spitch == width || channels==3) + if(spitch == width || channels==3 || height == 1) { openCLSafeCall(clEnqueueReadBuffer(clCxt->impl->clCmdQueue, (cl_mem)src, CL_TRUE, 0, width*height, dst, 0, NULL, NULL)); diff --git a/modules/ocl/src/kernels/imgproc_remap.cl b/modules/ocl/src/kernels/imgproc_remap.cl index c81188bf2..5408ea8e4 100644 --- a/modules/ocl/src/kernels/imgproc_remap.cl +++ b/modules/ocl/src/kernels/imgproc_remap.cl @@ -144,7 +144,53 @@ __kernel void remapNNFConstant_C1_D0(__global unsigned char* dst, __global unsig *d = dst_data; } +} +__kernel void remapNNF1Constant_C1_D0(__global unsigned char* dst, __global unsigned char const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows, int threadCols, F4 nVal) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if(x < threadCols && y < dst_rows) + { + x = x << 2; + int gx = x - (dst_offset&3); + int4 Gx = (int4)(gx, gx+1, gx+2, gx+3); + + uchar4 nval =convert_uchar4(nVal); + uchar val = nval.s0; + + int dstStart = (y * dst_step + x + dst_offset) - (dst_offset&3); + + int map1Start = y * map1_step + (x << 2) + map1_offset - ((dst_offset & 3) << 2); + float4 map1_data; + float4 map2_data; + + map1_data = *((__global float4 *)((__global char*)map1 + map1Start)); + map2_data = *((__global float4 *)((__global char*)map2 + map1Start)); + float8 map_data = (float8)(map1_data.s0, map2_data.s0, map1_data.s1, map2_data.s1, map1_data.s2, map2_data.s2, map1_data.s3, map2_data.s3); + int8 map_dataZ = convert_int8_sat_rte(map_data); + int4 srcIdx = map_dataZ.odd * src_step + map_dataZ.even + src_offset; + + uchar4 src_data; + + src_data.s0 = *(src + srcIdx.s0); + src_data.s1 = *(src + srcIdx.s1); + src_data.s2 = *(src + srcIdx.s2); + src_data.s3 = *(src + srcIdx.s3); + uchar4 dst_data; + dst_data = convert_uchar4(map_dataZ.even >= (int4)(src_cols) || map_dataZ.odd >= (int4)(src_rows)) ? (uchar4)(val) : src_data; + __global uchar4* d = (__global uchar4 *)(dst + dstStart); + + uchar4 dVal = *d; + + int4 con = (Gx >= 0 && Gx < dst_cols && y >= 0 && y < dst_rows); + + dst_data = (convert_uchar4(con) != convert_uchar4((int4)(0))) ? dst_data : dVal; + *d = dst_data; + } } @@ -244,6 +290,60 @@ __kernel void remapNNFConstant_C4_D0(__global unsigned char* dst, __global unsig } +__kernel void remapNNF1Constant_C4_D0(__global unsigned char* dst, __global unsigned char const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows, int threadCols, F4 nVal) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if(x < threadCols && y < dst_rows) + { + x = x << 4; + int gx = x - (dst_offset&15); + int16 Gx = (int16)(gx, gx+1, gx+2, gx+3, gx+4, gx+5, gx+6, gx+7, gx+8, gx+9, gx+10, gx+11, gx+12, gx+13, gx+14, gx+15); + + uchar4 nval =convert_uchar4(nVal); + + int dstStart = (y * dst_step + x + dst_offset) - (dst_offset&15); + + int map1Start = y * map1_step + x + map1_offset - (dst_offset&15); + float4 map1_data; + float4 map2_data; + + map1_data = *((__global float4 *)((__global char*)map1 + map1Start)); + map2_data = *((__global float4 *)((__global char*)map2 + map1Start)); + float8 map_data = (float8)(map1_data.s0, map2_data.s0, map1_data.s1, map2_data.s1, map1_data.s2, map2_data.s2, map1_data.s3, map2_data.s3); + int8 map1_dataZ = convert_int8_sat_rte(map_data); + + int4 srcIdx = map1_dataZ.odd * src_step + (map1_dataZ.even <<((int4)(2))) + src_offset; + uchar4 src_a, src_b, src_c, src_d; + src_a = *((__global uchar4 *)((__global char*)src + srcIdx.s0)); + src_b = *((__global uchar4 *)((__global char*)src + srcIdx.s1)); + src_c = *((__global uchar4 *)((__global char*)src + srcIdx.s2)); + src_d = *((__global uchar4 *)((__global char*)src + srcIdx.s3)); + + uchar16 dst_data; + uchar4 dst_a, dst_b, dst_c, dst_d; + dst_a = (map1_dataZ.s0 >= src_cols || map1_dataZ.s1 >= src_rows)? nval : src_a; + dst_b = (map1_dataZ.s2 >= src_cols || map1_dataZ.s3 >= src_rows)? nval : src_b; + dst_c = (map1_dataZ.s4 >= src_cols || map1_dataZ.s5 >= src_rows)? nval : src_c; + dst_d = (map1_dataZ.s6 >= src_cols || map1_dataZ.s7 >= src_rows)? nval : src_d; + + dst_data = (uchar16)(dst_a, dst_b, dst_c, dst_d); + __global uchar16* d = (__global uchar16 *)(dst + dstStart); + + uchar16 dVal = *d; + + int16 con = (Gx >= 0 && Gx < (dst_cols<<2) && y >= 0 && y < dst_rows); + dst_data = (convert_uchar16(con) != ((uchar16)(0))) ? dst_data : dVal; + + *d = dst_data; + + } + +} + __kernel void remapNNSConstant_C1_D5(__global float* dst, __global float const * restrict src, __global short * map1, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, @@ -349,6 +449,61 @@ __kernel void remapNNFConstant_C1_D5(__global float* dst, __global float const * } +__kernel void remapNNF1Constant_C1_D5(__global float* dst, __global float const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows ,int threadCols, F4 nVal) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if(x < threadCols && y < dst_rows) + { + x = x << 4; + + int gx = x - (dst_offset&15); + int4 Gx = (int4)(gx, gx+4, gx+8, gx+12); + + float4 nval =convert_float4(nVal); + float val = nval.s0; + + int dstStart = y * dst_step + x + dst_offset - (dst_offset&15); + + int map1Start = y * map1_step + x + map1_offset - (dst_offset&15); + float4 map1_data; + float4 map2_data; + + map1_data = *((__global float4 *)((__global char*)map1 + map1Start)); + map2_data = *((__global float4 *)((__global char*)map2 + map1Start)); + float8 map_data = (float8)(map1_data.s0, map2_data.s0, map1_data.s1, map2_data.s1, map1_data.s2, map2_data.s2, map1_data.s3, map2_data.s3); + int8 map1_dataZ = convert_int8_sat_rte(map_data); + + int4 srcIdx = convert_int4(map1_dataZ.odd) * src_step + convert_int4(map1_dataZ.even <<(int4)(2)) + src_offset; + + float4 src_data; + src_data.s0 = *((__global float *)((__global char*)src + srcIdx.s0)); + src_data.s1 = *((__global float *)((__global char*)src + srcIdx.s1)); + src_data.s2 = *((__global float *)((__global char*)src + srcIdx.s2)); + src_data.s3 = *((__global float *)((__global char*)src + srcIdx.s3)); + float4 dst_data; + + dst_data.s0 = (map1_dataZ.s0 >= src_cols || map1_dataZ.s1 >= src_rows)? val : src_data.s0; + dst_data.s1 = (map1_dataZ.s2 >= src_cols || map1_dataZ.s3 >= src_rows)? val : src_data.s1; + dst_data.s2 = (map1_dataZ.s4 >= src_cols || map1_dataZ.s5 >= src_rows)? val : src_data.s2; + dst_data.s3 = (map1_dataZ.s6 >= src_cols || map1_dataZ.s7 >= src_rows)? val : src_data.s3; + + + __global float4* d = (__global float4 *)((__global uchar*)dst + dstStart); + + float4 dVal = *d; + + int4 con = (Gx >= 0 && Gx < (dst_cols<<2) && y >= 0 && y < dst_rows); + dst_data = (convert_float4(con) != (float4)(0)) ? dst_data : dVal; + + *d = dst_data; + + } + +} __kernel void remapNNSConstant_C4_D5(__global float * dst, __global float const * restrict src, __global short * map1, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, @@ -389,6 +544,29 @@ __kernel void remapNNFConstant_C4_D5(__global float * dst, __global float const } } +__kernel void remapNNF1Constant_C4_D5(__global float * dst, __global float const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows , int threadCols, F4 nVal) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if(x < threadCols && y < dst_rows) + { + int dstIdx = y * dst_step + (x << 4) + dst_offset ; + int mapIdx = y * map1_step + (x << 2) + map1_offset ; + float map1_data = *((__global float *)((__global char*)map1 + mapIdx)); + float map2_data = *((__global float *)((__global char*)map2 + mapIdx)); + float2 map_data = (float2)(map1_data, map2_data); + int2 map1_dataZ = convert_int2_sat_rte(map_data); + int srcIdx = map1_dataZ.y * src_step + (map1_dataZ.x << 4) + src_offset; + float4 nval = convert_float4(nVal); + float4 src_data = *((__global float4 *)((__global uchar *)src + srcIdx)); + *((__global float4 *)((__global uchar*)dst + dstIdx)) = (map1_dataZ.x >= src_cols || map1_dataZ.y >= src_rows) ? nval : src_data; + } +} + + __kernel void remapLNFConstant_C1_D0(__global unsigned char* dst, __global unsigned char const * restrict src, __global float * map1, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, @@ -493,6 +671,113 @@ __kernel void remapLNFConstant_C1_D0(__global unsigned char* dst, __global unsig } } +__kernel void remapLNF1Constant_C1_D0(__global unsigned char* dst, __global unsigned char const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows , int threadCols, F4 nVal) +{ + + int x = get_global_id(0); + int y = get_global_id(1); + if(x < threadCols && y < dst_rows) + { + x = x << 2; + int gx = x - (dst_offset&3); + int4 Gx = (int4)(gx, gx+1, gx+2, gx+3); + + uchar4 nval =convert_uchar4(nVal); + uchar val = nval.s0; + + + int dstStart = (y * dst_step + x + dst_offset) - (dst_offset&3); + + int map1Start = y * map1_step + (x << 2) + map1_offset - ((dst_offset & 3) << 2); + float4 map1_data; + float4 map2_data; + + map1_data = *((__global float4 *)((__global char*)map1 + map1Start)); + map2_data = *((__global float4 *)((__global char*)map2 + map1Start)); + float8 map_data = (float8)(map1_data.s0, map2_data.s0, map1_data.s1, map2_data.s1, map1_data.s2, map2_data.s2, map1_data.s3, map2_data.s3); + int8 map1_dataD = convert_int8(map_data); + float8 temp = map_data - convert_float8(map1_dataD); + + float4 u = temp.even; + float4 v = temp.odd; + float4 ud = (float4)(1.0) - u; + float4 vd = (float4)(1.0) - v; + //float8 map1_dataU = map1_dataD + 1; + + int4 map1_dataDx = map1_dataD.even; + int4 map1_dataDy = map1_dataD.odd; + int4 map1_dataDx1 = map1_dataDx + (int4)(1); + int4 map1_dataDy1 = map1_dataDy + (int4)(1); + + int4 src_StartU = map1_dataDy * src_step + map1_dataDx + src_offset; + int4 src_StartD = src_StartU + src_step; + /* + //not using the vload + int4 src_StartU1 = src_StartU + (int4)(1); + int4 src_StartD1 = src_StartD + (int4)(1); + + uchar4 a, b, c, d; + a.x = *(src_StartU.x + src); + a.y = *(src_StartU.y + src); + a.z = *(src_StartU.z + src); + a.w = *(src_StartU.w + src); + + b.x = *(src_StartU1.x + src); + b.y = *(src_StartU1.y + src); + b.z = *(src_StartU1.z + src); + b.w = *(src_StartU1.w + src); + + c.x = *(src_StartD.x + src); + c.y = *(src_StartD.y + src); + c.z = *(src_StartD.z + src); + c.w = *(src_StartD.w + src); + + d.x = *(src_StartD1.x + src); + d.y = *(src_StartD1.y + src); + d.z = *(src_StartD1.z + src); + d.w = *(src_StartD1.w + src); + */ + uchar2 aU, aD, bU, bD, cU, cD, dU, dD; + + aU = vload2(0, src + src_StartU.s0); + bU = vload2(0, src + src_StartU.s1); + cU = vload2(0, src + src_StartU.s2); + dU = vload2(0, src + src_StartU.s3); + aD = vload2(0, src + src_StartD.s0); + bD = vload2(0, src + src_StartD.s1); + cD = vload2(0, src + src_StartD.s2); + dD = vload2(0, src + src_StartD.s3); + + uchar4 a, b, c, d; + a = (uchar4)(aU.x, bU.x, cU.x, dU.x); + b = (uchar4)(aU.y, bU.y, cU.y, dU.y); + c = (uchar4)(aD.x, bD.x, cD.x, dD.x); + d = (uchar4)(aD.y, bD.y, cD.y, dD.y); + + int4 ac =(map1_dataDx >= src_cols || map1_dataDy >= src_rows || map1_dataDy< 0 || map1_dataDy < 0); + int4 bc =(map1_dataDx1 >= src_cols || map1_dataDy >= src_rows || map1_dataDx1 < 0 || map1_dataDy < 0); + int4 cc =(map1_dataDx >= src_cols || map1_dataDy1 >= src_rows || map1_dataDy1 < 0 || map1_dataDx < 0); + int4 dc =(map1_dataDx1 >= src_cols || map1_dataDy1 >= src_rows || map1_dataDy1 < 0 || map1_dataDy1 < 0); + a = (convert_uchar4(ac) == (uchar4)(0))? a : val; + b = (convert_uchar4(bc) == (uchar4)(0))? b : val; + c = (convert_uchar4(cc) == (uchar4)(0))? c : val; + d = (convert_uchar4(dc) == (uchar4)(0))? d : val; + + uchar4 dst_data = convert_uchar4_sat_rte((convert_float4(a))* ud * vd +(convert_float4(b))* u * vd + (convert_float4(c))* ud * v + (convert_float4(d)) * u * v ); + + __global uchar4* D = (__global uchar4 *)(dst + dstStart); + + uchar4 dVal = *D; + int4 con = (Gx >= 0 && Gx < dst_cols && y >= 0 && y < dst_rows); + dst_data = (convert_uchar4(con) != (uchar4)(0)) ? dst_data : dVal; + + *D = dst_data; + } +} + + __kernel void remapLNSConstant_C1_D0(__global unsigned char* dst, __global unsigned char const * restrict src, __global short * map1, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows , int threadCols, F4 nVal) @@ -626,6 +911,97 @@ __kernel void remapLNFConstant_C4_D0(__global unsigned char* dst, __global unsig *D = dst_data; } } + + +__kernel void remapLNF1Constant_C4_D0(__global unsigned char* dst, __global unsigned char const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows , int threadCols, F4 nVal) +{ + + int x = get_global_id(0); + int y = get_global_id(1); + if(x < threadCols && y < dst_rows) + { + x = x << 4; + int gx = x - (dst_offset&15); + int16 Gx = (int16)(gx, gx+1, gx+2, gx+3, gx+4, gx+5, gx+6, gx+7, gx+8, gx+9, gx+10, gx+11, gx+12, gx+13, gx+14, gx+15); + + uchar4 nval =convert_uchar4(nVal); + + int dstStart = (y * dst_step + x + dst_offset) - (dst_offset&15); + + int map1Start = y * map1_step + x + map1_offset - (dst_offset & 15); + float4 map1_data; + float4 map2_data; + + map1_data = *((__global float4 *)((__global char*)map1 + map1Start)); + map2_data = *((__global float4 *)((__global char*)map2 + map1Start)); + float8 map_data = (float8)(map1_data.s0, map2_data.s0, map1_data.s1, map2_data.s1, map1_data.s2, map2_data.s2, map1_data.s3, map2_data.s3); + int8 map1_dataD = convert_int8(map_data); + float8 temp = map_data - convert_float8(map1_dataD); + + float4 u = temp.even; + float4 v = temp.odd; + float4 ud = (float4)(1.0) - u; + float4 vd = (float4)(1.0) - v; + + //float8 map1_dataU = map1_dataD + 1; + + int4 map1_dataDx = map1_dataD.even; + int4 map1_dataDy = map1_dataD.odd; + int4 map1_dataDx1 = map1_dataDx + (int4)(1); + int4 map1_dataDy1 = map1_dataDy + (int4)(1); + + int4 src_StartU = map1_dataDy * src_step + (convert_int4(map1_dataDx) << (int4)(2)) + src_offset; + int4 src_StartD = src_StartU + src_step; + + uchar8 aU, bU, cU, dU, aD, bD, cD, dD; + aU = vload8(0, src + src_StartU.s0); + bU = vload8(0, src + src_StartU.s1); + cU = vload8(0, src + src_StartU.s2); + dU = vload8(0, src + src_StartU.s3); + aD = vload8(0, src + src_StartD.s0); + bD = vload8(0, src + src_StartD.s1); + cD = vload8(0, src + src_StartD.s2); + dD = vload8(0, src + src_StartD.s3); + uchar16 a, b, c, d; + a = (uchar16)(aU.s0123, bU.s0123, cU.s0123, dU.s0123); + b = (uchar16)(aU.s4567, bU.s4567, cU.s4567, dU.s4567); + c = (uchar16)(aD.s0123, bD.s0123, cD.s0123, dD.s0123); + d = (uchar16)(aD.s4567, bD.s4567, cD.s4567, dD.s4567); + int4 ac =(map1_dataDx >= src_cols || map1_dataDy >= src_rows || map1_dataDy< 0 || map1_dataDy < 0); + int4 bc =(map1_dataDx1 >= src_cols || map1_dataDy >= src_rows || map1_dataDx1 < 0 || map1_dataDy < 0); + int4 cc =(map1_dataDx >= src_cols || map1_dataDy1 >= src_rows || map1_dataDy1 < 0 || map1_dataDx < 0); + int4 dc =(map1_dataDx1 >= src_cols || map1_dataDy1 >= src_rows || map1_dataDy1 < 0 || map1_dataDy1 < 0); + + int16 acc = (int16)((int4)(ac.x), (int4)(ac.y), (int4)(ac.z), (int4)(ac.w)); + int16 bcc = (int16)((int4)(bc.x), (int4)(bc.y), (int4)(bc.z), (int4)(bc.w)); + int16 ccc = (int16)((int4)(cc.x), (int4)(cc.y), (int4)(cc.z), (int4)(cc.w)); + int16 dcc = (int16)((int4)(dc.x), (int4)(dc.y), (int4)(dc.z), (int4)(dc.w)); + + uchar16 val = (uchar16)(nval, nval, nval, nval); + a = (convert_uchar16(acc) == (uchar16)(0))? a : val; + b = (convert_uchar16(bcc) == (uchar16)(0))? b : val; + c = (convert_uchar16(ccc) == (uchar16)(0))? c : val; + d = (convert_uchar16(dcc) == (uchar16)(0))? d : val; + + float16 U = (float16)((float4)(u.x), (float4)(u.y), (float4)(u.z), (float4)(u.w)); + float16 V = (float16)((float4)(v.x), (float4)(v.y), (float4)(v.z), (float4)(v.w)); + float16 Ud = (float16)((float4)(ud.x), (float4)(ud.y), (float4)(ud.z), (float4)(ud.w)); + float16 Vd = (float16)((float4)(vd.x), (float4)(vd.y), (float4)(vd.z), (float4)(vd.w)); + + uchar16 dst_data = convert_uchar16_sat_rte((convert_float16(a))* Ud * Vd +(convert_float16(b))* U * Vd + (convert_float16(c))* Ud * V + (convert_float16(d)) * U * V ); + + __global uchar16* D = (__global uchar16 *)(dst + dstStart); + + uchar16 dVal = *D; + int16 con = (Gx >= 0 && Gx < (dst_cols<<2) && y >= 0 && y < dst_rows); + dst_data = (convert_uchar16(con) != (uchar16)(0)) ? dst_data : dVal; + + *D = dst_data; + } +} + __kernel void remapLNSConstant_C4_D0(__global unsigned char* dst, __global unsigned char const * restrict src, __global short * map1, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows, int threadCols, F4 nVal) @@ -774,6 +1150,111 @@ __kernel void remapLNFConstant_C1_D5(__global float* dst, __global float const * *D = dst_data; } } + +__kernel void remapLNF1Constant_C1_D5(__global float* dst, __global float const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows , int threadCols, F4 nVal) +{ + + int x = get_global_id(0); + int y = get_global_id(1); + if(x < threadCols && y < dst_rows) + { + x = x << 4; + int gx = x - (dst_offset&15); + int4 Gx = (int4)(gx, gx+4, gx+8, gx+12); + + float4 nval =convert_float4(nVal); + float4 val = (float4)(nval.s0); + + int dstStart = y * dst_step + x + dst_offset - (dst_offset & 15); + int map1Start = y * map1_step + x + map1_offset - (dst_offset & 15); + float4 map1_data; + float4 map2_data; + + map1_data = *((__global float4 *)((__global char*)map1 + map1Start)); + map2_data = *((__global float4 *)((__global char*)map2 + map1Start)); + float8 map_data = (float8)(map1_data.s0, map2_data.s0, map1_data.s1, map2_data.s1, map1_data.s2, map2_data.s2, map1_data.s3, map2_data.s3); + int8 map1_dataD = convert_int8(map_data); + float8 temp = map_data - convert_float8(map1_dataD); + + float4 u = temp.even; + float4 v = temp.odd; + float4 ud = (float4)(1.0) - u; + float4 vd = (float4)(1.0) - v; + //float8 map1_dataU = map1_dataD + 1; + + int4 map1_dataDx = map1_dataD.even; + int4 map1_dataDy = map1_dataD.odd; + int4 map1_dataDx1 = map1_dataDx + (int4)(1); + int4 map1_dataDy1 = map1_dataDy + (int4)(1); + + int4 src_StartU = map1_dataDy * src_step + (map1_dataDx << (int4)(2)) + src_offset; + int4 src_StartD = src_StartU + src_step; + /* + //not using the vload + int4 src_StartU1 = src_StartU + (int4)(1); + int4 src_StartD1 = src_StartD + (int4)(1); + + float4 a, b, c, d; + a.x = *(src_StartU.x + src); + a.y = *(src_StartU.y + src); + a.z = *(src_StartU.z + src); + a.w = *(src_StartU.w + src); + + b.x = *(src_StartU1.x + src); + b.y = *(src_StartU1.y + src); + b.z = *(src_StartU1.z + src); + b.w = *(src_StartU1.w + src); + + c.x = *(src_StartD.x + src); + c.y = *(src_StartD.y + src); + c.z = *(src_StartD.z + src); + c.w = *(src_StartD.w + src); + + d.x = *(src_StartD1.x + src); + d.y = *(src_StartD1.y + src); + d.z = *(src_StartD1.z + src); + d.w = *(src_StartD1.w + src); + */ + float2 aU, aD, bU, bD, cU, cD, dU, dD; + + aU = vload2(0, (__global float *)((__global char*)src + src_StartU.s0)); + bU = vload2(0, (__global float *)((__global char*)src + src_StartU.s1)); + cU = vload2(0, (__global float *)((__global char*)src + src_StartU.s2)); + dU = vload2(0, (__global float *)((__global char*)src + src_StartU.s3)); + aD = vload2(0, (__global float *)((__global char*)src + src_StartD.s0)); + bD = vload2(0, (__global float *)((__global char*)src + src_StartD.s1)); + cD = vload2(0, (__global float *)((__global char*)src + src_StartD.s2)); + dD = vload2(0, (__global float *)((__global char*)src + src_StartD.s3)); + + float4 a, b, c, d; + a = (float4)(aU.x, bU.x, cU.x, dU.x); + b = (float4)(aU.y, bU.y, cU.y, dU.y); + c = (float4)(aD.x, bD.x, cD.x, dD.x); + d = (float4)(aD.y, bD.y, cD.y, dD.y); + + int4 ac =(map1_dataDx >= (int4)(src_cols) || map1_dataDy >= (int4)(src_rows) || map1_dataDy < (int4)(0) || map1_dataDy < (int4)(0)); + int4 bc =(map1_dataDx1 >= (int4)(src_cols) || map1_dataDy >= (int4)(src_rows) || map1_dataDx1 < (int4)(0) || map1_dataDy < (int4)(0)); + int4 cc =(map1_dataDx >= (int4)(src_cols) || map1_dataDy1 >= (int4)(src_rows) || map1_dataDy1 < (int4)(0) || map1_dataDx < (int4)(0)); + int4 dc =(map1_dataDx1 >= (int4)(src_cols) || map1_dataDy1 >= (int4)(src_rows) || map1_dataDy1 < (int4)(0) || map1_dataDy1 < (int4)(0)); + a = (convert_float4(ac) == (float4)(0))? a : val; + b = (convert_float4(bc) == (float4)(0))? b : val; + c = (convert_float4(cc) == (float4)(0))? c : val; + d = (convert_float4(dc) == (float4)(0))? d : val; + + float4 dst_data = a * ud * vd + b * u * vd + c * ud * v + d * u * v ; + + __global float4* D = (__global float4 *)((__global char*)dst + dstStart); + + float4 dVal = *D; + int4 con = (Gx >= 0 && Gx < (dst_cols << 2) && y >= 0 && y < dst_rows); + dst_data = (convert_float4(con) != (float4)(0)) ? dst_data : dVal; + + *D = dst_data; + } +} + __kernel void remapLNSConstant_C1_D5(__global float* dst, __global float const * restrict src, __global short * map1, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows ,int threadCols, F4 nVal) @@ -873,6 +1354,53 @@ __kernel void remapLNFConstant_C4_D5(__global float * dst, __global float const } } +__kernel void remapLNF1Constant_C4_D5(__global float * dst, __global float const * restrict src, + __global float * map1, __global float * map2, int dst_offset, int src_offset, int map1_offset, int dst_step, int src_step, + int map1_step, int src_cols, int src_rows, int dst_cols, int dst_rows, int map1_cols, int map1_rows , int threadCols, F4 nVal) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if(x < threadCols && y < dst_rows) + { + int dstIdx = y * dst_step + (x << 4) + dst_offset ; + int mapIdx = y * map1_step + (x << 2) + map1_offset ; + float map1_data = *((__global float *)((__global char*)map1 + mapIdx)); + float map2_data = *((__global float *)((__global char*)map2 + mapIdx)); + float2 map_data = (float2)(map1_data, map2_data); + int2 map1_dataZ = convert_int2(map_data); + + int mX = map1_dataZ.x; + int mY = map1_dataZ.y; + int mX1 = map1_dataZ.x + 1; + int mY1 = map1_dataZ.y + 1; + + float u = map1_data - convert_float(map1_dataZ.x); + float v = map2_data - convert_float(map1_dataZ.y); + float ud = 1.0 - u; + float vd = 1.0 - v; + + int srcIdx = map1_dataZ.y * src_step + (map1_dataZ.x << 4) + src_offset; + float8 src_dataU = vload8(0,(__global float *)((__global char*)src + srcIdx)); + float8 src_dataD = vload8(0,(__global float *)((__global char*)src + srcIdx + src_step)); + + float4 a = src_dataU.lo; + float4 b = src_dataU.hi; + float4 c = src_dataD.lo; + float4 d = src_dataD.hi; + + float4 nval = convert_float4(nVal); + a = (mX >= src_cols || mY >= src_rows ) ? nval : a; + b = (mX1 >= src_cols || mY >= src_rows ) ? nval : b; + c = (mX >= src_cols || mY1 >= src_rows ) ? nval : c; + d = (mX1 >= src_cols || mY1 >= src_rows ) ? nval : d; + + float4 dst_data = a * ud * vd + b * u * vd + c * ud * v + d * u * v; + *((__global float4 *)((__global uchar*)dst + dstIdx)) = a * ud * vd + b * u * vd + c * ud * v + d * u * v ; + + } +} + /* //////////////////////////////////////////////////////////////////////// diff --git a/modules/ocl/test/main.cpp b/modules/ocl/test/main.cpp index 641663bca..2fa8d2653 100644 --- a/modules/ocl/test/main.cpp +++ b/modules/ocl/test/main.cpp @@ -88,6 +88,7 @@ int main(int argc, char **argv) std::cout << "no device found\n"; return -1; } + //setDevice(oclinfo[1]); return RUN_ALL_TESTS(); } diff --git a/modules/ocl/test/test_arithm.cpp b/modules/ocl/test/test_arithm.cpp index 91c195756..da18e24af 100644 --- a/modules/ocl/test/test_arithm.cpp +++ b/modules/ocl/test/test_arithm.cpp @@ -1523,7 +1523,7 @@ TEST_P(AddWeighted, Mat) //********test**************** INSTANTIATE_TEST_CASE_P(Arithm, Lut, Combine( - Values(CV_8UC1, CV_8UC4), + Values(CV_8UC1, CV_8UC3, CV_8UC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Exp, Combine( @@ -1535,40 +1535,40 @@ INSTANTIATE_TEST_CASE_P(Arithm, Log, Combine( Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Add, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); INSTANTIATE_TEST_CASE_P(Arithm, Mul, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Div, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Absdiff, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1,CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, CartToPolar, Combine( - Values(CV_32FC1, CV_32FC4), + Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, PolarToCart, Combine( - Values(CV_32FC1, CV_32FC4), + Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Magnitude, Combine( - Values(CV_32FC1, CV_32FC4), + Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Transpose, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32FC1), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32FC1), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Flip, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, MinMax, Combine( @@ -1588,30 +1588,30 @@ INSTANTIATE_TEST_CASE_P(Arithm, CountNonZero, Combine( Values(false))); -INSTANTIATE_TEST_CASE_P(Arithm, Phase, Combine(Values(CV_32FC1, CV_32FC4), Values(false))); +INSTANTIATE_TEST_CASE_P(Arithm, Phase, Combine(Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_and, Combine( - Values(CV_8UC1, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); + Values(CV_8UC1, CV_32SC1, CV_32SC4, CV_32FC1,CV_32FC3, CV_32FC4), Values(false))); //Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_or, Combine( - Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC4), Values(false))); + Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); //Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_xor, Combine( - Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC4), Values(false))); + Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); //Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_not, Combine( - Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC4), Values(false))); + Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); //Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, Compare, Combine(Values(CV_8UC1, CV_32SC1, CV_32FC1), Values(false))); // Values(false) is the reserved parameter -INSTANTIATE_TEST_CASE_P(Arithm, Pow, Combine(Values(CV_32FC1, CV_32FC4), Values(false))); +INSTANTIATE_TEST_CASE_P(Arithm, Pow, Combine(Values(CV_32FC1, CV_32FC3, CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Arithm, MagnitudeSqr, Combine( diff --git a/modules/ocl/test/test_blend.cpp b/modules/ocl/test/test_blend.cpp index 579b75fdc..7d76d418d 100644 --- a/modules/ocl/test/test_blend.cpp +++ b/modules/ocl/test/test_blend.cpp @@ -79,5 +79,5 @@ TEST_P(Blend, Accuracy) INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Blend, Combine( DIFFERENT_SIZES, - testing::Values(MatType(CV_8UC1), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC4)) + testing::Values(MatType(CV_8UC1), MatType(CV_8UC3),MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC4)) )); \ No newline at end of file diff --git a/modules/ocl/test/test_canny.cpp b/modules/ocl/test/test_canny.cpp index e728c99be..e6fb885cf 100644 --- a/modules/ocl/test/test_canny.cpp +++ b/modules/ocl/test/test_canny.cpp @@ -103,6 +103,6 @@ TEST_P(Canny, Accuracy) EXPECT_MAT_SIMILAR(edges_gold, edges, 1e-2); } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Canny, testing::Combine( +INSTANTIATE_TEST_CASE_P(ocl_ImgProc, Canny, testing::Combine( testing::Values(AppertureSize(3), AppertureSize(5)), testing::Values(L2gradient(false), L2gradient(true)))); diff --git a/modules/ocl/test/test_filters.cpp b/modules/ocl/test/test_filters.cpp index 3774b10fa..cb629bfd5 100644 --- a/modules/ocl/test/test_filters.cpp +++ b/modules/ocl/test/test_filters.cpp @@ -822,35 +822,35 @@ TEST_P(GaussianBlur, Mat) -INSTANTIATE_TEST_CASE_P(Filter, Blur, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), +INSTANTIATE_TEST_CASE_P(Filter, Blur, Combine(Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(cv::Size(3, 3), cv::Size(5, 5), cv::Size(7, 7)), Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101))); INSTANTIATE_TEST_CASE_P(Filters, Laplacian, Combine( - Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 3))); //INSTANTIATE_TEST_CASE_P(Filter, ErodeDilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 2, 3))); -INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(false))); +INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(false))); //INSTANTIATE_TEST_CASE_P(Filter, ErodeDilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 2, 3))); -INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(false))); +INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(false))); -INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), +INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine(Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 2), Values(0, 1), Values(3, 5), Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); INSTANTIATE_TEST_CASE_P(Filter, Scharr, Combine( - Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(0, 1), Values(0, 1), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(0, 1), Values(0, 1), Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine( - Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(cv::Size(3, 3), cv::Size(5, 5)), Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); diff --git a/modules/ocl/test/test_hog.cpp b/modules/ocl/test/test_hog.cpp index d4e95a47a..ed759f03c 100644 --- a/modules/ocl/test/test_hog.cpp +++ b/modules/ocl/test/test_hog.cpp @@ -184,9 +184,9 @@ TEST_P(HOG, Detect) } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, HOG, testing::Combine( +INSTANTIATE_TEST_CASE_P(OCL_ObjDetect, HOG, testing::Combine( testing::Values(cv::Size(64, 128), cv::Size(48, 96)), - testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)))); + testing::Values(MatType(CV_8UC1), MatType(CV_8UC3),MatType(CV_8UC4)))); #endif //HAVE_OPENCL diff --git a/modules/ocl/test/test_imgproc.cpp b/modules/ocl/test/test_imgproc.cpp index 775217b60..73ff7d18a 100644 --- a/modules/ocl/test/test_imgproc.cpp +++ b/modules/ocl/test/test_imgproc.cpp @@ -793,14 +793,12 @@ TEST_P(WarpPerspective, Mat) PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int) { int srcType; - // int dstType; int map1Type; int map2Type; cv::Scalar val; int interpolation; int bordertype; - //Scalar& borderValue; cv::Mat src; cv::Mat dst; @@ -833,9 +831,6 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int) //ocl mat for testing cv::ocl::oclMat gdst; - cv::ocl::oclMat gsrc; - cv::ocl::oclMat gmap1; - cv::ocl::oclMat gmap2; //ocl mat with roi cv::ocl::oclMat gsrc_roi; @@ -846,47 +841,57 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int) virtual void SetUp() { srcType = GET_PARAM(0); - // dstType = GET_PARAM(1); map1Type = GET_PARAM(1); map2Type = GET_PARAM(2); interpolation = GET_PARAM(3); bordertype = GET_PARAM(4); - // borderValue = GET_PARAM(6); //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); //CV_Assert(devnums > 0); cv::RNG& rng = TS::ptr()->get_rng(); - //cv::Size size = cv::Size(20, 20); - cv::Size srcSize = cv::Size(100, 100); - cv::Size dstSize = cv::Size(100, 100); - cv::Size map1Size = cv::Size(100, 100); + cv::Size srcSize = cv::Size(MWIDTH, MHEIGHT); + cv::Size dstSize = cv::Size(MWIDTH, MHEIGHT); + cv::Size map1Size = cv::Size(MWIDTH, MHEIGHT); double min = 5, max = 16; if(srcType != nulltype) { src = randomMat(rng, srcSize, srcType, min, max, false); - gsrc = src; } - if((map1Type == CV_16SC2 && map2Type == nulltype) || (map1Type == CV_32FC2&& map2Type == nulltype)) + if((map1Type == CV_16SC2 && map2Type == nulltype) || (map1Type == CV_32FC2 && map2Type == nulltype)) { map1 = randomMat(rng, map1Size, map1Type, min, max, false); - gmap1 = map1; - } else if (map1Type == CV_32FC1 && map2Type == CV_32FC1) { map1 = randomMat(rng, map1Size, map1Type, min, max, false); map2 = randomMat(rng, map1Size, map1Type, min, max, false); - gmap1 = map1; - gmap2 = map2; } else + { cout<<"The wrong input type"<(); + for (int y = 0; y < src.rows; ++y) + { + const uchar* src_row = src.ptr(y); + + for (int x = 0; x < src.cols; ++x) + ++hist_row[src_row[x]]; + } +} + +PARAM_TEST_CASE(histTestBase, MatType, MatType) +{ + int type_src; + + //src mat + cv::Mat src; + cv::Mat dst_hist; + //set up roi + int roicols; + int roirows; + int srcx; + int srcy; + //src mat with roi + cv::Mat src_roi; + //ocl dst mat, dst_hist and gdst_hist don't have roi + cv::ocl::oclMat gdst_hist; + //ocl mat with roi + cv::ocl::oclMat gsrc_roi; +// std::vector oclinfo; + + virtual void SetUp() + { + type_src = GET_PARAM(0); + + cv::RNG &rng = TS::ptr()->get_rng(); + cv::Size size = cv::Size(MWIDTH, MHEIGHT); + + src = randomMat(rng, size, type_src, 0, 256, false); + +// int devnums = getDevice(oclinfo); +// CV_Assert(devnums > 0); + //if you want to use undefault device, set it here + //setDevice(oclinfo[0]); + } + + void random_roi() + { +#ifdef RANDOMROI + cv::RNG &rng = TS::ptr()->get_rng(); + + //randomize ROI + roicols = rng.uniform(1, src.cols); + roirows = rng.uniform(1, src.rows); + srcx = rng.uniform(0, src.cols - roicols); + srcy = rng.uniform(0, src.rows - roirows); +#else + roicols = src.cols; + roirows = src.rows; + srcx = 0; + srcy = 0; +#endif + src_roi = src(Rect(srcx, srcy, roicols, roirows)); + + gsrc_roi = src_roi; + } +}; +///////////////////////////calcHist/////////////////////////////////////// +struct calcHist : histTestBase {}; + +TEST_P(calcHist, Mat) +{ + for(int j = 0; j < LOOP_TIMES; j++) + { + random_roi(); + + cv::Mat cpu_hist; + + calcHistGold(src_roi, dst_hist); + cv::ocl::calcHist(gsrc_roi, gdst_hist); + + gdst_hist.download(cpu_hist); + + char sss[1024]; + sprintf(sss, "roicols=%d,roirows=%d,srcx=%d,srcy=%d\n", roicols, roirows, srcx, srcy); + EXPECT_MAT_NEAR(dst_hist, cpu_hist, 0.0, sss); + } +} + + INSTANTIATE_TEST_CASE_P(ImgprocTestBase, equalizeHist, Combine( ONE_TYPE(CV_8UC1), NULL_TYPE, @@ -1371,13 +1452,13 @@ INSTANTIATE_TEST_CASE_P(ImgprocTestBase, equalizeHist, Combine( // // //INSTANTIATE_TEST_CASE_P(ImgprocTestBase, CopyMakeBorder, Combine( -// Values(CV_8UC1, CV_8UC4, CV_32SC1), +// Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1), // NULL_TYPE, -// Values(CV_8UC1,CV_8UC4,CV_32SC1), +// Values(CV_8UC1,CV_8UC3,CV_8UC4,CV_32SC1), // NULL_TYPE, // NULL_TYPE, // Values(false))); // Values(false) is the reserved parameter -// + INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine( Values(CV_8UC1,CV_32FC1), NULL_TYPE, @@ -1404,21 +1485,21 @@ INSTANTIATE_TEST_CASE_P(ImgprocTestBase, integral, Combine( Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(Imgproc, WarpAffine, Combine( - Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR, (MatType)cv::INTER_CUBIC, (MatType)(cv::INTER_NEAREST | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_LINEAR | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_CUBIC | cv::WARP_INVERSE_MAP)))); INSTANTIATE_TEST_CASE_P(Imgproc, WarpPerspective, Combine - (Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), + (Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR, (MatType)cv::INTER_CUBIC, (MatType)(cv::INTER_NEAREST | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_LINEAR | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_CUBIC | cv::WARP_INVERSE_MAP)))); INSTANTIATE_TEST_CASE_P(Imgproc, Resize, Combine( - Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(cv::Size()), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(cv::Size()), Values(0.5, 1.5, 2), Values(0.5, 1.5, 2), Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR))); @@ -1446,8 +1527,15 @@ INSTANTIATE_TEST_CASE_P(Imgproc, meanShiftProc, Combine( )); INSTANTIATE_TEST_CASE_P(Imgproc, Remap, Combine( - Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), - Values(CV_16SC2, CV_32FC2), NULL_TYPE, + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), + Values(CV_32FC1, CV_16SC2, CV_32FC2),Values(-1,CV_32FC1), Values((int)cv::INTER_NEAREST, (int)cv::INTER_LINEAR), Values((int)cv::BORDER_CONSTANT))); + + +INSTANTIATE_TEST_CASE_P(histTestBase, calcHist, Combine( + ONE_TYPE(CV_8UC1), + ONE_TYPE(CV_32SC1) //no use +)); + #endif // HAVE_OPENCL diff --git a/modules/ocl/test/test_match_template.cpp b/modules/ocl/test/test_match_template.cpp index 08ea02985..8eabe3832 100644 --- a/modules/ocl/test/test_match_template.cpp +++ b/modules/ocl/test/test_match_template.cpp @@ -159,7 +159,7 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U, testing::Combine( DIFFERENT_SIZES, testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), - testing::Values(Channels(1), Channels(4)), + testing::Values(Channels(1), Channels(3),Channels(4)), ALL_TEMPLATE_METHODS ) ); @@ -167,6 +167,6 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U, INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine( DIFFERENT_SIZES, testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), - testing::Values(Channels(1), Channels(4)), + testing::Values(Channels(1), Channels(3),Channels(4)), testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR)))); diff --git a/modules/ocl/test/test_matrix_operation.cpp b/modules/ocl/test/test_matrix_operation.cpp index edf3e564b..7d8a2fb54 100644 --- a/modules/ocl/test/test_matrix_operation.cpp +++ b/modules/ocl/test/test_matrix_operation.cpp @@ -493,15 +493,15 @@ TEST_P(convertC3C4, Accuracy) } INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4))); + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4))); INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(MatrixOperation, SetTo, Combine( - Values(CV_8UC1, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), + Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(false))); // Values(false) is the reserved parameter INSTANTIATE_TEST_CASE_P(MatrixOperation, convertC3C4, Combine( diff --git a/modules/ocl/test/test_split_merge.cpp b/modules/ocl/test/test_split_merge.cpp index ee880c528..91e65e41b 100644 --- a/modules/ocl/test/test_split_merge.cpp +++ b/modules/ocl/test/test_split_merge.cpp @@ -364,11 +364,11 @@ TEST_P(Split, Accuracy) INSTANTIATE_TEST_CASE_P(SplitMerge, Merge, Combine( - Values(CV_8U, CV_32S, CV_32F), Values(1, 4))); + Values(CV_8U, CV_32S, CV_32F), Values(1, 3,4))); INSTANTIATE_TEST_CASE_P(SplitMerge, Split , Combine( - Values(CV_8U, CV_32S, CV_32F), Values(1, 4))); + Values(CV_8U, CV_32S, CV_32F), Values(1, 3,4))); #endif // HAVE_OPENCL From 52581750fc99e6b97e3d9f88ec1e20ac173c5830 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 3 Sep 2012 15:58:30 +0400 Subject: [PATCH 082/103] Fix openexr build on Linux --- 3rdparty/openexr/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt index 60bfa3ca7..ea8c79ed7 100644 --- a/3rdparty/openexr/CMakeLists.txt +++ b/3rdparty/openexr/CMakeLists.txt @@ -15,7 +15,7 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/IlmBaseConfig.h.cmakein" "${CMAKE_CURRENT_BINARY_DIR}/IlmBaseConfig.h" @ONLY) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/OpenEXRConfig.h.cmakein" "${CMAKE_CURRENT_BINARY_DIR}/OpenEXRConfig.h" @ONLY) - + set(OPENEXR_INCLUDE_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/Half" "${CMAKE_CURRENT_SOURCE_DIR}/Iex" "${CMAKE_CURRENT_SOURCE_DIR}/IlmThread" @@ -43,6 +43,10 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4334) # vs2005 Win64 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244) # vs2008 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4267) # vs2008 Win64 +if(UNIX AND (CMAKE_COMPILER_IS_GNUCXX OR CV_ICC)) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") +endif() + add_library(IlmImf STATIC ${lib_hdrs} ${lib_srcs}) target_link_libraries(IlmImf ${ZLIB_LIBRARIES}) From 67ff95083d010773b552eaafe994e6bd6380deed Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 3 Sep 2012 17:03:31 +0400 Subject: [PATCH 083/103] added openfabmap code, contributed by Arren Glover. fixed several warnings in the new versions of retina filters --- modules/contrib/doc/openfabmap.rst | 228 + .../include/opencv2/contrib/contrib.hpp | 2 + .../include/opencv2/contrib/openfabmap.hpp | 405 + modules/contrib/src/basicretinafilter.hpp | 926 +- modules/contrib/src/bowmsctrainer.cpp | 139 + modules/contrib/src/chowliutree.cpp | 290 + modules/contrib/src/magnoretinafilter.hpp | 256 +- modules/contrib/src/openfabmap.cpp | 779 ++ modules/contrib/src/retinacolor.hpp | 432 +- modules/contrib/src/templatebuffer.hpp | 836 +- modules/objdetect/src/linemod.cpp | 4 +- .../cpp/fabmap/stlucia_test_small0000.jpeg | Bin 0 -> 30139 bytes .../cpp/fabmap/stlucia_test_small0001.jpeg | Bin 0 -> 32412 bytes .../cpp/fabmap/stlucia_test_small0002.jpeg | Bin 0 -> 39202 bytes .../cpp/fabmap/stlucia_test_small0003.jpeg | Bin 0 -> 31817 bytes .../cpp/fabmap/stlucia_test_small0004.jpeg | Bin 0 -> 29448 bytes .../cpp/fabmap/stlucia_test_small0005.jpeg | Bin 0 -> 30569 bytes .../cpp/fabmap/stlucia_test_small0006.jpeg | Bin 0 -> 34486 bytes .../cpp/fabmap/stlucia_test_small0007.jpeg | Bin 0 -> 36663 bytes .../cpp/fabmap/stlucia_test_small0008.jpeg | Bin 0 -> 32048 bytes .../cpp/fabmap/stlucia_test_small0009.jpeg | Bin 0 -> 30311 bytes samples/cpp/fabmap/train_data_small.yml | 9197 ++++++++++++ samples/cpp/fabmap/vocab_small.yml | 11632 ++++++++++++++++ samples/cpp/fabmap_sample.cpp | 197 + 24 files changed, 24096 insertions(+), 1227 deletions(-) create mode 100644 modules/contrib/doc/openfabmap.rst create mode 100644 modules/contrib/include/opencv2/contrib/openfabmap.hpp create mode 100644 modules/contrib/src/bowmsctrainer.cpp create mode 100644 modules/contrib/src/chowliutree.cpp create mode 100644 modules/contrib/src/openfabmap.cpp create mode 100755 samples/cpp/fabmap/stlucia_test_small0000.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0001.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0002.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0003.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0004.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0005.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0006.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0007.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0008.jpeg create mode 100755 samples/cpp/fabmap/stlucia_test_small0009.jpeg create mode 100644 samples/cpp/fabmap/train_data_small.yml create mode 100644 samples/cpp/fabmap/vocab_small.yml create mode 100644 samples/cpp/fabmap_sample.cpp diff --git a/modules/contrib/doc/openfabmap.rst b/modules/contrib/doc/openfabmap.rst new file mode 100644 index 000000000..49a98a38c --- /dev/null +++ b/modules/contrib/doc/openfabmap.rst @@ -0,0 +1,228 @@ +openFABMAP +======================================== + +.. highlight:: cpp + +The openFABMAP package has been integrated into OpenCV from the openFABMAP project. OpenFABMAP is an open and modifiable code-source which implements the Fast Appearance-based Mapping algorithm (FAB-MAP) developed by Mark Cummins and Paul Newman. The algorithms used in openFABMAP were developed using only the relevant FAB-MAP publications. + +FAB-MAP is an approach to appearance-based place recognition. FAB-MAP compares images of locations that have been visited and determines the probability of re-visiting a location, as well as providing a measure of the probability of being at a new, previously unvisited location. Camera images form the sole input to the system, from which visual bag-of-words models are formed through the extraction of appearance-based (e.g. SURF) features. + +openFABMAP requires training data (e.g. a collection of images from a similar but not identical environment) to construct a visual vocabulary for the visual bag-of-words model, along with a Chow-Liu tree representation of feature likelihood and for use in the Sampled new place method (see below). + +FabMap +-------------------- + +.. ocv:class:: FabMap + +The main FabMap class performs the comparison between visual bags-of-words extracted from one or more images. The FabMap class is instantiated as one of the four inherited FabMap classes (FabMap1, FabMapLUT, FabMapFBO, FabMap2). Each inherited class performs the comparison differently based on algorithm iterations as published (see each class below for specifics). A Chow-Liu tree, detector model parameters and some option flags are common to all Fabmap variants and are supplied on class creation. Training data (visual bag-of-words) is supplied to the class if using the SAMPLED new place method. Test data (visual bag-of-words) is supplied as images to which query bag-of-words are compared against. The common flags are listed below: :: + + enum { + MEAN_FIELD, + SAMPLED, + NAIVE_BAYES, + CHOW_LIU, + MOTION_MODEL + }; + +#. MEAN_FIELD: Use the Mean Field approximation to determine the new place likelihood (cannot be used for FabMap2). +#. SAMPLED: Use the Sampled approximation to determine the new place likelihood. Requires training data (see below). +#. NAIVE_BAYES: Assume a naive Bayes approximation to feature distribution (i.e. all features are independent). Note that a Chow-Liu tree is still required but only the absolute word probabilities are used, feature co-occurrance information is discarded. +#. CHOW_LIU: Use the full Chow-Liu tree to approximate feature distribution. +#. MOTION_MODEL: Update the location distribution using the previous distribution as a (weak) prior. Used for matching in sequences (i.e. successive video frames). + +Training Data +++++++++++++++++++++ + +Training data is required to use the SAMPLED new place method. The SAMPLED method was shown to have improved performance over the alternative MEAN_FIELD method. Training data can be added singularly or as a batch. + +.. ocv:function:: virtual void addTraining(const Mat& queryImgDescriptor) + + :param queryImgDescriptor: bag-of-words image descriptors stored as rows in a Mat + +.. ocv:function:: virtual void addTraining(const vector& queryImgDescriptors) + + :param queryImgDescriptors: a vector containing multiple bag-of-words image descriptors + +.. ocv:function:: const vector& getTrainingImgDescriptors() const + + Returns a vector containing multiple bag-of-words image descriptors + +Test Data +++++++++++++++++++++ + +Test Data is the database of images represented using bag-of-words models. When a compare function is called, each query point is compared to the test data. + +.. ocv:function:: virtual void add(const Mat& queryImgDescriptor) + + :param queryImgDescriptor: bag-of-words image descriptors stored as rows in a Mat + +.. ocv:function:: virtual void add(const vector& queryImgDescriptors) + + :param queryImgDescriptors: a vector containing multiple bag-of-words image descriptors + +.. ocv:function:: const vector& getTestImgDescriptors() const + + Returns a vector containing multiple bag-of-words image descriptors + +Image Comparison +++++++++++++++++++++ + +Image matching is performed calling the compare function. Query bag-of-words image descriptors are provided and compared to test data added to the FabMap class. Alternatively test data can be provided with the call to compare to which the comparison is performed. Results are written to the 'matches' argument. + +.. ocv:function:: void compare(const Mat& queryImgDescriptor, vector& matches, bool addQuery = false, const Mat& mask = Mat()) + + :param queryImgDescriptor: bag-of-words image descriptors stored as rows in a Mat + + :param matches: a vector of image match probabilities + + :param addQuery: if true the queryImg Descriptor is added to the test data after the comparison is performed. + + :param mask: *not implemented* + +.. ocv:function:: void compare(const Mat& queryImgDescriptor, const Mat& testImgDescriptors, vector& matches, const Mat& mask = Mat()) + + :param testImgDescriptors: bag-of-words image descriptors stored as rows in a Mat + +.. ocv:function:: void compare(const Mat& queryImgDescriptor, const vector& testImgDescriptors, vector& matches, const Mat& mask = Mat()) + + :param testImgDescriptors: a vector of multiple bag-of-words image descriptors + +.. ocv:function:: void compare(const vector& queryImgDescriptors, vector& matches, bool addQuery = false, const Mat& mask = Mat()) + + :param queryImgDescriptors: a vector of multiple bag-of-words image descriptors + +.. ocv:function:: void compare(const vector& queryImgDescriptors, const vector& testImgDescriptors, vector& matches, const Mat& mask = Mat()) + + + +FabMap classes +++++++++++++++++++++ + +.. ocv:class:: FabMap1 : public FabMap + +The original FAB-MAP algorithm without any computational improvements as published in [IJRR2008]_ + +.. ocv:function:: FabMap1::FabMap1(const Mat& clTree, double PzGe, double PzGNe, int flags, int numSamples = 0) + + :param clTree: a Chow-Liu tree class + + :param PzGe: the dector model recall. The probability of the feature detector extracting a feature from an object given it is in the scene. This is used to account for detector noise. + + :param PzGNe: the dector model precision. The probability of the feature detector falsing extracting a feature representing an object that is not in the scene. + + :param numSamples: the number of samples to use for the SAMPLED new place calculation + +.. ocv:class:: FabMapLUT : public FabMap + +The original FAB-MAP algorithm implemented as a look-up table for speed enhancements [ICRA2011]_ + +.. ocv:function:: FabMapLUT::FabMapLUT(const Mat& clTree, double PzGe, double PzGNe, int flags, int numSamples = 0, int precision = 6) + + :param precision: the precision with which to store the pre-computed likelihoods + +.. ocv:class:: FabMapFBO : public FabMap + +The accelerated FAB-MAP using a 'fast bail-out' approach as in [TRO2010]_ + +.. ocv:function:: FabMapFBO::FabMapFBO(const Mat& clTree, double PzGe, double PzGNe, int flags, int numSamples = 0, double rejectionThreshold = 1e-8, double PsGd = 1e-8, int bisectionStart = 512, int bisectionIts = 9) + + :param rejectionThreshold: images are not considered a match when the likelihood falls below the Bennett bound by the amount given by the rejectionThreshold. The threshold provides a speed/accuracy trade-off. A lower bound will be more accurate + + :param PsGd: used to calculate the Bennett bound. Provides a speed/accuracy trade-off. A lower bound will be more accurate + + :param bisectionStart: Used to estimate the bound using the bisection method. Must be larger than the largest expected difference between maximum and minimum image likelihoods + + :param bisectionIts: The number of iterations for which to perform the bisection method + + +.. ocv:class:: FabMap2 : public FabMap + +The inverted index FAB-MAP as in [IJRR2010]_. This version of FAB-MAP is the fastest without any loss of accuracy. + +.. ocv:function:: FabMap2::FabMap2(const Mat& clTree, double PzGe, double PzGNe, int flags) + +.. [IJRR2008] M. Cummins and P. Newman, "FAB-MAP: Probabilistic Localization and Mapping in the Space of Appearance," The International Journal of Robotics Research, vol. 27(6), pp. 647-665, 2008 + +.. [TRO2010] M. Cummins and P. Newman, "Accelerating FAB-MAP with concentration inequalities," IEEE Transactions on Robotics, vol. 26(6), pp. 1042-1050, 2010 + +.. [IJRR2010] M. Cummins and P. Newman, "Appearance-only SLAM at large scale with FAB-MAP 2.0," The International Journal of Robotics Research, vol. 30(9), pp. 1100-1123, 2010 + +.. [ICRA2011] A. Glover, et al., "OpenFABMAP: An Open Source Toolbox for Appearance-based Loop Closure Detection," in IEEE International Conference on Robotics and Automation, St Paul, Minnesota, 2011 + +ImageMatch +-------------------- + +.. ocv:struct:: IMatch + +FAB-MAP comparison results are stored in a vector of IMatch structs. Each IMatch structure provides the index of the provided query bag-of-words, the index of the test bag-of-words, the raw log-likelihood of the match (independent of other comparisons), and the match probability (normalised over other comparison likelihoods). + +:: + + struct IMatch { + + IMatch() : + queryIdx(-1), imgIdx(-1), likelihood(-DBL_MAX), match(-DBL_MAX) { + } + IMatch(int _queryIdx, int _imgIdx, double _likelihood, double _match) : + queryIdx(_queryIdx), imgIdx(_imgIdx), likelihood(_likelihood), match( + _match) { + } + + int queryIdx; //query index + int imgIdx; //test index + + double likelihood; //raw loglikelihood + double match; //normalised probability + + bool operator<(const IMatch& m) const { + return match < m.match; + } + + }; + +Chow-Liu Tree +-------------------- + +.. ocv:class:: ChowLiuTree + +The Chow-Liu tree is a probabilistic model of the environment in terms of feature occurance and co-occurance. The Chow-Liu tree is a form of Bayesian network. FAB-MAP uses the model when calculating bag-of-words similarity by taking into account feature saliency. Training data is provided to the ChowLiuTree class in the form of bag-of-words image descriptors. The make function produces a cv::Mat that encodes the tree structure. + +.. ocv:function:: ChowLiuTree::ChowLiuTree() + +.. ocv:function:: void add(const Mat& imgDescriptor) + + :param imgDescriptor: bag-of-words image descriptors stored as rows in a Mat + +.. ocv:function:: void add(const vector& imgDescriptors) + + :param imgDescriptors: a vector containing multiple bag-of-words image descriptors + +.. ocv:function:: const vector& getImgDescriptors() const + + Returns a vector containing multiple bag-of-words image descriptors + +.. ocv:function:: Mat make(double infoThreshold = 0.0) + + :param infoThreshold: a threshold can be set to reduce the amount of memory used when making the Chow-Liu tree, which can occur with large vocabulary sizes. This function can fail if the threshold is set too high. If memory is an issue the value must be set by trial and error (~0.0005) + + +BOWMSCTrainer +-------------------- + +.. ocv:class:: BOWMSCTrainer : public BOWTrainer + +BOWMSCTrainer is a custom clustering algorithm used to produce the feature vocabulary required to create bag-of-words representations. The algorithm is an implementation of [AVC2007]_. Arguments against using K-means for the FAB-MAP algorithm are discussed in [IJRR2010]_. The BOWMSCTrainer inherits from the cv::BOWTrainer class, overwriting the cluster function. + +.. ocv:function:: BOWMSCTrainer::BOWMSCTrainer(double clusterSize = 0.4) + + :param clusterSize: the specificity of the vocabulary produced. A smaller cluster size will instigate a larger vocabulary. + +.. ocv:function:: virtual Mat cluster() const + +Cluster using features added to the class + +.. ocv:function:: virtual Mat cluster(const Mat& descriptors) const + + :param descriptors: feature descriptors provided as rows of the Mat. + +.. [AVC2007] Alexandra Teynor and Hans Burkhardt, "Fast Codebook Generation by Sequential Data Analysis for Object Classification", in Advances in Visual Computing, pp. 610-620, 2007 diff --git a/modules/contrib/include/opencv2/contrib/contrib.hpp b/modules/contrib/include/opencv2/contrib/contrib.hpp index 049c82211..e600583c8 100644 --- a/modules/contrib/include/opencv2/contrib/contrib.hpp +++ b/modules/contrib/include/opencv2/contrib/contrib.hpp @@ -967,6 +967,8 @@ namespace cv #include "opencv2/contrib/retina.hpp" +#include "opencv2/contrib/openfabmap.hpp" + #endif #endif diff --git a/modules/contrib/include/opencv2/contrib/openfabmap.hpp b/modules/contrib/include/opencv2/contrib/openfabmap.hpp new file mode 100644 index 000000000..5d2d84efd --- /dev/null +++ b/modules/contrib/include/opencv2/contrib/openfabmap.hpp @@ -0,0 +1,405 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// This file originates from the openFABMAP project: +// [http://code.google.com/p/openfabmap/] +// +// For published work which uses all or part of OpenFABMAP, please cite: +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6224843] +// +// Original Algorithm by Mark Cummins and Paul Newman: +// [http://ijr.sagepub.com/content/27/6/647.short] +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=5613942] +// [http://ijr.sagepub.com/content/30/9/1100.abstract] +// +// License Agreement +// +// Copyright (C) 2012 Arren Glover [aj.glover@qut.edu.au] and +// Will Maddern [w.maddern@qut.edu.au], all rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#ifndef __OPENCV_OPENFABMAP_H_ +#define __OPENCV_OPENFABMAP_H_ + +#include "opencv2/core/core.hpp" +#include "opencv2/features2d/features2d.hpp" + +#include +#include +#include +#include +#include + +namespace cv { + +namespace of2 { + +using std::list; +using std::map; +using std::multiset; + +/* + Return data format of a FABMAP compare call +*/ +struct CV_EXPORTS IMatch { + + IMatch() : + queryIdx(-1), imgIdx(-1), likelihood(-DBL_MAX), match(-DBL_MAX) { + } + IMatch(int _queryIdx, int _imgIdx, double _likelihood, double _match) : + queryIdx(_queryIdx), imgIdx(_imgIdx), likelihood(_likelihood), match( + _match) { + } + + int queryIdx; //query index + int imgIdx; //test index + + double likelihood; //raw loglikelihood + double match; //normalised probability + + bool operator<(const IMatch& m) const { + return match < m.match; + } + +}; + +/* + Base FabMap class. Each FabMap method inherits from this class. +*/ +class CV_EXPORTS FabMap { +public: + + //FabMap options + enum { + MEAN_FIELD = 1, + SAMPLED = 2, + NAIVE_BAYES = 4, + CHOW_LIU = 8, + MOTION_MODEL = 16 + }; + + FabMap(const Mat& clTree, double PzGe, double PzGNe, int flags, + int numSamples = 0); + virtual ~FabMap(); + + //methods to add training data for sampling method + virtual void addTraining(const Mat& queryImgDescriptor); + virtual void addTraining(const vector& queryImgDescriptors); + + //methods to add to the test data + virtual void add(const Mat& queryImgDescriptor); + virtual void add(const vector& queryImgDescriptors); + + //accessors + const vector& getTrainingImgDescriptors() const; + const vector& getTestImgDescriptors() const; + + //Main FabMap image comparison + void compare(const Mat& queryImgDescriptor, + vector& matches, bool addQuery = false, + const Mat& mask = Mat()); + void compare(const Mat& queryImgDescriptor, + const Mat& testImgDescriptors, vector& matches, + const Mat& mask = Mat()); + void compare(const Mat& queryImgDescriptor, + const vector& testImgDescriptors, + vector& matches, const Mat& mask = Mat()); + void compare(const vector& queryImgDescriptors, vector< + IMatch>& matches, bool addQuery = false, const Mat& mask = + Mat()); + void compare(const vector& queryImgDescriptors, + const vector& testImgDescriptors, + vector& matches, const Mat& mask = Mat()); + +protected: + + void compareImgDescriptor(const Mat& queryImgDescriptor, + int queryIndex, const vector& testImgDescriptors, + vector& matches); + + void addImgDescriptor(const Mat& queryImgDescriptor); + + //the getLikelihoods method is overwritten for each different FabMap + //method. + virtual void getLikelihoods(const Mat& queryImgDescriptor, + const vector& testImgDescriptors, + vector& matches); + virtual double getNewPlaceLikelihood(const Mat& queryImgDescriptor); + + //turn likelihoods into probabilities (also add in motion model if used) + void normaliseDistribution(vector& matches); + + //Chow-Liu Tree + int pq(int q); + double Pzq(int q, bool zq); + double PzqGzpq(int q, bool zq, bool zpq); + + //FAB-MAP Core + double PzqGeq(bool zq, bool eq); + double PeqGL(int q, bool Lzq, bool eq); + double PzqGL(int q, bool zq, bool zpq, bool Lzq); + double PzqGzpqL(int q, bool zq, bool zpq, bool Lzq); + double (FabMap::*PzGL)(int q, bool zq, bool zpq, bool Lzq); + + //data + Mat clTree; + vector trainingImgDescriptors; + vector testImgDescriptors; + vector priorMatches; + + //parameters + double PzGe; + double PzGNe; + double Pnew; + + double mBias; + double sFactor; + + int flags; + int numSamples; + +}; + +/* + The original FAB-MAP algorithm, developed based on: + http://ijr.sagepub.com/content/27/6/647.short +*/ +class CV_EXPORTS FabMap1: public FabMap { +public: + FabMap1(const Mat& clTree, double PzGe, double PzGNe, int flags, + int numSamples = 0); + virtual ~FabMap1(); +protected: + + //FabMap1 implementation of likelihood comparison + void getLikelihoods(const Mat& queryImgDescriptor, const vector< + Mat>& testImgDescriptors, vector& matches); +}; + +/* + A computationally faster version of the original FAB-MAP algorithm. A look- + up-table is used to precompute many of the reoccuring calculations +*/ +class CV_EXPORTS FabMapLUT: public FabMap { +public: + FabMapLUT(const Mat& clTree, double PzGe, double PzGNe, + int flags, int numSamples = 0, int precision = 6); + virtual ~FabMapLUT(); +protected: + + //FabMap look-up-table implementation of the likelihood comparison + void getLikelihoods(const Mat& queryImgDescriptor, const vector< + Mat>& testImgDescriptors, vector& matches); + + //procomputed data + int (*table)[8]; + + //data precision + int precision; +}; + +/* + The Accelerated FAB-MAP algorithm, developed based on: + http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=5613942 +*/ +class CV_EXPORTS FabMapFBO: public FabMap { +public: + FabMapFBO(const Mat& clTree, double PzGe, double PzGNe, int flags, + int numSamples = 0, double rejectionThreshold = 1e-8, double PsGd = + 1e-8, int bisectionStart = 512, int bisectionIts = 9); + virtual ~FabMapFBO(); + +protected: + + //FabMap Fast Bail-out implementation of the likelihood comparison + void getLikelihoods(const Mat& queryImgDescriptor, const vector< + Mat>& testImgDescriptors, vector& matches); + + //stucture used to determine word comparison order + struct WordStats { + WordStats() : + q(0), info(0), V(0), M(0) { + } + + WordStats(int _q, double _info) : + q(_q), info(_info), V(0), M(0) { + } + + int q; + double info; + mutable double V; + mutable double M; + + bool operator<(const WordStats& w) const { + return info < w.info; + } + + }; + + //private fast bail-out necessary functions + void setWordStatistics(const Mat& queryImgDescriptor, multiset& wordData); + double limitbisection(double v, double m); + double bennettInequality(double v, double m, double delta); + static bool compInfo(const WordStats& first, const WordStats& second); + + //parameters + double PsGd; + double rejectionThreshold; + int bisectionStart; + int bisectionIts; +}; + +/* + The FAB-MAP2.0 algorithm, developed based on: + http://ijr.sagepub.com/content/30/9/1100.abstract +*/ +class CV_EXPORTS FabMap2: public FabMap { +public: + + FabMap2(const Mat& clTree, double PzGe, double PzGNe, int flags); + virtual ~FabMap2(); + + //FabMap2 builds the inverted index and requires an additional training/test + //add function + void addTraining(const Mat& queryImgDescriptors) { + FabMap::addTraining(queryImgDescriptors); + } + void addTraining(const vector& queryImgDescriptors); + + void add(const Mat& queryImgDescriptors) { + FabMap::add(queryImgDescriptors); + } + void add(const vector& queryImgDescriptors); + +protected: + + //FabMap2 implementation of the likelihood comparison + void getLikelihoods(const Mat& queryImgDescriptor, const vector< + Mat>& testImgDescriptors, vector& matches); + double getNewPlaceLikelihood(const Mat& queryImgDescriptor); + + //the likelihood function using the inverted index + void getIndexLikelihoods(const Mat& queryImgDescriptor, vector< + double>& defaults, map >& invertedMap, + vector& matches); + void addToIndex(const Mat& queryImgDescriptor, + vector& defaults, + map >& invertedMap); + + //data + vector d1, d2, d3, d4; + vector > children; + + // TODO: inverted map a vector? + + vector trainingDefaults; + map > trainingInvertedMap; + + vector testDefaults; + map > testInvertedMap; + +}; +/* + A Chow-Liu tree is required by FAB-MAP. The Chow-Liu tree provides an + estimate of the full distribution of visual words using a minimum spanning + tree. The tree is generated through training data. +*/ +class CV_EXPORTS ChowLiuTree { +public: + ChowLiuTree(); + virtual ~ChowLiuTree(); + + //add data to the chow-liu tree before calling make + void add(const Mat& imgDescriptor); + void add(const vector& imgDescriptors); + + const vector& getImgDescriptors() const; + + Mat make(double infoThreshold = 0.0); + +private: + vector imgDescriptors; + Mat mergedImgDescriptors; + + typedef struct info { + float score; + short word1; + short word2; + } info; + + //probabilities extracted from mergedImgDescriptors + double P(int a, bool za); + double JP(int a, bool za, int b, bool zb); //a & b + double CP(int a, bool za, int b, bool zb); // a | b + + //calculating mutual information of all edges + void createBaseEdges(list& edges, double infoThreshold); + double calcMutInfo(int word1, int word2); + static bool sortInfoScores(const info& first, const info& second); + + //selecting minimum spanning egdges with maximum information + bool reduceEdgesToMinSpan(list& edges); + + //building the tree sctructure + Mat buildTree(int root_word, list &edges); + void recAddToTree(Mat &cltree, int q, int pq, + list &remaining_edges); + vector extractChildren(list &remaining_edges, int q); + +}; + +/* + A custom vocabulary training method based on: + http://www.springerlink.com/content/d1h6j8x552532003/ +*/ +class CV_EXPORTS BOWMSCTrainer: public BOWTrainer { +public: + BOWMSCTrainer(double clusterSize = 0.4); + virtual ~BOWMSCTrainer(); + + // Returns trained vocabulary (i.e. cluster centers). + virtual Mat cluster() const; + virtual Mat cluster(const Mat& descriptors) const; + +protected: + + double clusterSize; + +}; + +} + +} + +#endif /* OPENFABMAP_H_ */ diff --git a/modules/contrib/src/basicretinafilter.hpp b/modules/contrib/src/basicretinafilter.hpp index 0039c9a6f..0cc1b8d75 100644 --- a/modules/contrib/src/basicretinafilter.hpp +++ b/modules/contrib/src/basicretinafilter.hpp @@ -115,541 +115,541 @@ //using namespace std; namespace cv { -class BasicRetinaFilter -{ -public: + class BasicRetinaFilter + { + public: - /** - * constructor of the base bio-inspired toolbox, parameters are only linked to imae input size and number of filtering capabilities of the object - * @param NBrows: number of rows of the input image - * @param NBcolumns: number of columns of the input image - * @param parametersListSize: specifies the number of parameters set (each parameters set represents a specific low pass spatio-temporal filter) - * @param useProgressiveFilter: specifies if the filter has irreguar (progressive) filtering capabilities (this can be activated later using setProgressiveFilterConstants_xxx methods) - */ - BasicRetinaFilter(const unsigned int NBrows, const unsigned int NBcolumns, const unsigned int parametersListSize=1, const bool useProgressiveFilter=false); + /** + * constructor of the base bio-inspired toolbox, parameters are only linked to imae input size and number of filtering capabilities of the object + * @param NBrows: number of rows of the input image + * @param NBcolumns: number of columns of the input image + * @param parametersListSize: specifies the number of parameters set (each parameters set represents a specific low pass spatio-temporal filter) + * @param useProgressiveFilter: specifies if the filter has irreguar (progressive) filtering capabilities (this can be activated later using setProgressiveFilterConstants_xxx methods) + */ + BasicRetinaFilter(const unsigned int NBrows, const unsigned int NBcolumns, const unsigned int parametersListSize=1, const bool useProgressiveFilter=false); - /** - * standrad destructore - */ - ~BasicRetinaFilter(); + /** + * standrad destructore + */ + ~BasicRetinaFilter(); - /** - * function which clears the output buffer of the object - */ - inline void clearOutputBuffer(){_filterOutput=0;}; + /** + * function which clears the output buffer of the object + */ + inline void clearOutputBuffer(){_filterOutput=0;}; - /** - * function which clears the secondary buffer of the object - */ - inline void clearSecondaryBuffer(){_localBuffer=0;}; + /** + * function which clears the secondary buffer of the object + */ + inline void clearSecondaryBuffer(){_localBuffer=0;}; - /** - * function which clears the output and the secondary buffer of the object - */ - inline void clearAllBuffers(){clearOutputBuffer();clearSecondaryBuffer();}; + /** + * function which clears the output and the secondary buffer of the object + */ + inline void clearAllBuffers(){clearOutputBuffer();clearSecondaryBuffer();}; - /** - * resize basic retina filter object (resize all allocated buffers - * @param NBrows: the new height size - * @param NBcolumns: the new width size - */ - void resize(const unsigned int NBrows, const unsigned int NBcolumns); + /** + * resize basic retina filter object (resize all allocated buffers + * @param NBrows: the new height size + * @param NBcolumns: the new width size + */ + void resize(const unsigned int NBrows, const unsigned int NBcolumns); - /** - * forbiden method inherited from parent std::valarray - * prefer not to use this method since the filter matrix become vectors - */ - void resize(const unsigned int){std::cerr<<"error, not accessible method"< &runFilter_LPfilter(const std::valarray &inputFrame, const unsigned int filterIndex=0); // run the LP filter for a new frame input and save result in _filterOutput + /** + * low pass filter call and run (models the homogeneous cells network at the retina level, for example horizontal cells or photoreceptors) + * @param inputFrame: the input image to be processed + * @param filterIndex: the offset which specifies the parameter set that should be used for the filtering + * @return the processed image, the output is reachable later by using function getOutput() + */ + const std::valarray &runFilter_LPfilter(const std::valarray &inputFrame, const unsigned int filterIndex=0); // run the LP filter for a new frame input and save result in _filterOutput - /** - * low pass filter call and run (models the homogeneous cells network at the retina level, for example horizontal cells or photoreceptors) - * @param inputFrame: the input image to be processed - * @param outputFrame: the output buffer in which the result is writed - * @param filterIndex: the offset which specifies the parameter set that should be used for the filtering - */ - void runFilter_LPfilter(const std::valarray &inputFrame, std::valarray &outputFrame, const unsigned int filterIndex=0); // run LP filter on a specific output adress + /** + * low pass filter call and run (models the homogeneous cells network at the retina level, for example horizontal cells or photoreceptors) + * @param inputFrame: the input image to be processed + * @param outputFrame: the output buffer in which the result is writed + * @param filterIndex: the offset which specifies the parameter set that should be used for the filtering + */ + void runFilter_LPfilter(const std::valarray &inputFrame, std::valarray &outputFrame, const unsigned int filterIndex=0); // run LP filter on a specific output adress - /** - * low pass filter call and run (models the homogeneous cells network at the retina level, for example horizontal cells or photoreceptors) - * @param inputOutputFrame: the input image to be processed on which the result is rewrited - * @param filterIndex: the offset which specifies the parameter set that should be used for the filtering - */ - void runFilter_LPfilter_Autonomous(std::valarray &inputOutputFrame, const unsigned int filterIndex=0);// run LP filter on the input data and rewrite it + /** + * low pass filter call and run (models the homogeneous cells network at the retina level, for example horizontal cells or photoreceptors) + * @param inputOutputFrame: the input image to be processed on which the result is rewrited + * @param filterIndex: the offset which specifies the parameter set that should be used for the filtering + */ + void runFilter_LPfilter_Autonomous(std::valarray &inputOutputFrame, const unsigned int filterIndex=0);// run LP filter on the input data and rewrite it - /** - * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) - * @param inputOutputFrame: the input image to be processed - * @param localLuminance: an image which represents the local luminance of the inputFrame parameter, in general, it is its low pass spatial filtering - * @return the processed image, the output is reachable later by using function getOutput() - */ - const std::valarray &runFilter_LocalAdapdation(const std::valarray &inputOutputFrame, const std::valarray &localLuminance);// run local adaptation filter and save result in _filterOutput + /** + * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) + * @param inputOutputFrame: the input image to be processed + * @param localLuminance: an image which represents the local luminance of the inputFrame parameter, in general, it is its low pass spatial filtering + * @return the processed image, the output is reachable later by using function getOutput() + */ + const std::valarray &runFilter_LocalAdapdation(const std::valarray &inputOutputFrame, const std::valarray &localLuminance);// run local adaptation filter and save result in _filterOutput - /** - * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) - * @param inputFrame: the input image to be processed - * @param localLuminance: an image which represents the local luminance of the inputFrame parameter, in general, it is its low pass spatial filtering - * @param outputFrame: the output buffer in which the result is writed - */ - void runFilter_LocalAdapdation(const std::valarray &inputFrame, const std::valarray &localLuminance, std::valarray &outputFrame); // run local adaptation filter on a specific output adress + /** + * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) + * @param inputFrame: the input image to be processed + * @param localLuminance: an image which represents the local luminance of the inputFrame parameter, in general, it is its low pass spatial filtering + * @param outputFrame: the output buffer in which the result is writed + */ + void runFilter_LocalAdapdation(const std::valarray &inputFrame, const std::valarray &localLuminance, std::valarray &outputFrame); // run local adaptation filter on a specific output adress - /** - * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) - * @param inputFrame: the input image to be processed - * @return the processed image, the output is reachable later by using function getOutput() - */ - const std::valarray &runFilter_LocalAdapdation_autonomous(const std::valarray &inputFrame);// run local adaptation filter and save result in _filterOutput + /** + * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) + * @param inputFrame: the input image to be processed + * @return the processed image, the output is reachable later by using function getOutput() + */ + const std::valarray &runFilter_LocalAdapdation_autonomous(const std::valarray &inputFrame);// run local adaptation filter and save result in _filterOutput - /** - * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) - * @param inputFrame: the input image to be processed - * @param outputFrame: the output buffer in which the result is writen - */ - void runFilter_LocalAdapdation_autonomous(const std::valarray &inputFrame, std::valarray &outputFrame); // run local adaptation filter on a specific output adress + /** + * local luminance adaptation call and run (contrast enhancement property of the photoreceptors) + * @param inputFrame: the input image to be processed + * @param outputFrame: the output buffer in which the result is writen + */ + void runFilter_LocalAdapdation_autonomous(const std::valarray &inputFrame, std::valarray &outputFrame); // run local adaptation filter on a specific output adress - /** - * run low pass filtering with progressive parameters (models the retina log sampling of the photoreceptors and its low pass filtering effect consequence: more powerfull low pass filtering effect on the corners) - * @param inputFrame: the input image to be processed - * @param filterIndex: the index which specifies the parameter set that should be used for the filtering - * @return the processed image, the output is reachable later by using function getOutput() if outputFrame is NULL - */ - inline void runProgressiveFilter(std::valarray &inputFrame, const unsigned int filterIndex=0){_spatiotemporalLPfilter_Irregular(&inputFrame[0], filterIndex);}; + /** + * run low pass filtering with progressive parameters (models the retina log sampling of the photoreceptors and its low pass filtering effect consequence: more powerfull low pass filtering effect on the corners) + * @param inputFrame: the input image to be processed + * @param filterIndex: the index which specifies the parameter set that should be used for the filtering + * @return the processed image, the output is reachable later by using function getOutput() if outputFrame is NULL + */ + inline void runProgressiveFilter(std::valarray &inputFrame, const unsigned int filterIndex=0){_spatiotemporalLPfilter_Irregular(&inputFrame[0], filterIndex);}; - /** - * run low pass filtering with progressive parameters (models the retina log sampling of the photoreceptors and its low pass filtering effect consequence: more powerfull low pass filtering effect on the corners) - * @param inputFrame: the input image to be processed - * @param outputFrame: the output buffer in which the result is writen - * @param filterIndex: the index which specifies the parameter set that should be used for the filtering - */ - inline void runProgressiveFilter(const std::valarray &inputFrame, - std::valarray &outputFrame, - const unsigned int filterIndex=0) - {_spatiotemporalLPfilter_Irregular(get_data(inputFrame), &outputFrame[0], filterIndex);}; + /** + * run low pass filtering with progressive parameters (models the retina log sampling of the photoreceptors and its low pass filtering effect consequence: more powerfull low pass filtering effect on the corners) + * @param inputFrame: the input image to be processed + * @param outputFrame: the output buffer in which the result is writen + * @param filterIndex: the index which specifies the parameter set that should be used for the filtering + */ + inline void runProgressiveFilter(const std::valarray &inputFrame, + std::valarray &outputFrame, + const unsigned int filterIndex=0) + {_spatiotemporalLPfilter_Irregular(get_data(inputFrame), &outputFrame[0], filterIndex);}; - /** - * first order spatio-temporal low pass filter setup function - * @param beta: gain of the filter (generally set to zero) - * @param tau: time constant of the filter (unit is frame for video processing) - * @param k: spatial constant of the filter (unit is pixels) - * @param filterIndex: the index which specifies the parameter set that should be used for the filtering - */ - void setLPfilterParameters(const float beta, const float tau, const float k, const unsigned int filterIndex=0); // change the parameters of the filter + /** + * first order spatio-temporal low pass filter setup function + * @param beta: gain of the filter (generally set to zero) + * @param tau: time constant of the filter (unit is frame for video processing) + * @param k: spatial constant of the filter (unit is pixels) + * @param filterIndex: the index which specifies the parameter set that should be used for the filtering + */ + void setLPfilterParameters(const float beta, const float tau, const float k, const unsigned int filterIndex=0); // change the parameters of the filter - /** - * first order spatio-temporal low pass filter setup function - * @param beta: gain of the filter (generally set to zero) - * @param tau: time constant of the filter (unit is frame for video processing) - * @param alpha0: spatial constant of the filter (unit is pixels) on the border of the image - * @param filterIndex: the index which specifies the parameter set that should be used for the filtering - */ - void setProgressiveFilterConstants_CentredAccuracy(const float beta, const float tau, const float alpha0, const unsigned int filterIndex=0); + /** + * first order spatio-temporal low pass filter setup function + * @param beta: gain of the filter (generally set to zero) + * @param tau: time constant of the filter (unit is frame for video processing) + * @param alpha0: spatial constant of the filter (unit is pixels) on the border of the image + * @param filterIndex: the index which specifies the parameter set that should be used for the filtering + */ + void setProgressiveFilterConstants_CentredAccuracy(const float beta, const float tau, const float alpha0, const unsigned int filterIndex=0); - /** - * first order spatio-temporal low pass filter setup function - * @param beta: gain of the filter (generally set to zero) - * @param tau: time constant of the filter (unit is frame for video processing) - * @param alpha0: spatial constant of the filter (unit is pixels) on the border of the image - * @param accuracyMap an image (float format) which values range is between 0 and 1, where 0 means, apply no filtering and 1 means apply the filtering as specified in the parameters set, intermediate values allow to smooth variations of the filtering strenght - * @param filterIndex: the index which specifies the parameter set that should be used for the filtering - */ - void setProgressiveFilterConstants_CustomAccuracy(const float beta, const float tau, const float alpha0, const std::valarray &accuracyMap, const unsigned int filterIndex=0); + /** + * first order spatio-temporal low pass filter setup function + * @param beta: gain of the filter (generally set to zero) + * @param tau: time constant of the filter (unit is frame for video processing) + * @param alpha0: spatial constant of the filter (unit is pixels) on the border of the image + * @param accuracyMap an image (float format) which values range is between 0 and 1, where 0 means, apply no filtering and 1 means apply the filtering as specified in the parameters set, intermediate values allow to smooth variations of the filtering strenght + * @param filterIndex: the index which specifies the parameter set that should be used for the filtering + */ + void setProgressiveFilterConstants_CustomAccuracy(const float beta, const float tau, const float alpha0, const std::valarray &accuracyMap, const unsigned int filterIndex=0); - /** - * local luminance adaptation setup, this function should be applied for normal local adaptation (not for tone mapping operation) - * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect - * @param maxInputValue: the maximum amplitude value measured after local adaptation processing (c.f. function runFilter_LocalAdapdation & runFilter_LocalAdapdation_autonomous) - * @param meanLuminance: the a priori meann luminance of the input data (should be 128 for 8bits images but can vary greatly in case of High Dynamic Range Images (HDRI) - */ - void setV0CompressionParameter(const float v0, const float maxInputValue, const float){ _v0=v0*maxInputValue; _localLuminanceFactor=v0; _localLuminanceAddon=maxInputValue*(1.0f-v0); _maxInputValue=maxInputValue;}; + /** + * local luminance adaptation setup, this function should be applied for normal local adaptation (not for tone mapping operation) + * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect + * @param maxInputValue: the maximum amplitude value measured after local adaptation processing (c.f. function runFilter_LocalAdapdation & runFilter_LocalAdapdation_autonomous) + * @param meanLuminance: the a priori meann luminance of the input data (should be 128 for 8bits images but can vary greatly in case of High Dynamic Range Images (HDRI) + */ + void setV0CompressionParameter(const float v0, const float maxInputValue, const float){ _v0=v0*maxInputValue; _localLuminanceFactor=v0; _localLuminanceAddon=maxInputValue*(1.0f-v0); _maxInputValue=maxInputValue;}; - /** - * update local luminance adaptation setup, initial maxInputValue is kept. This function should be applied for normal local adaptation (not for tone mapping operation) - * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect - * @param meanLuminance: the a priori meann luminance of the input data (should be 128 for 8bits images but can vary greatly in case of High Dynamic Range Images (HDRI) - */ - void setV0CompressionParameter(const float v0, const float meanLuminance){ this->setV0CompressionParameter(v0, _maxInputValue, meanLuminance);}; + /** + * update local luminance adaptation setup, initial maxInputValue is kept. This function should be applied for normal local adaptation (not for tone mapping operation) + * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect + * @param meanLuminance: the a priori meann luminance of the input data (should be 128 for 8bits images but can vary greatly in case of High Dynamic Range Images (HDRI) + */ + void setV0CompressionParameter(const float v0, const float meanLuminance){ this->setV0CompressionParameter(v0, _maxInputValue, meanLuminance);}; - /** - * local luminance adaptation setup, this function should be applied for normal local adaptation (not for tone mapping operation) - * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect - */ - void setV0CompressionParameter(const float v0){ _v0=v0*_maxInputValue; _localLuminanceFactor=v0; _localLuminanceAddon=_maxInputValue*(1.0f-v0);}; + /** + * local luminance adaptation setup, this function should be applied for normal local adaptation (not for tone mapping operation) + * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect + */ + void setV0CompressionParameter(const float v0){ _v0=v0*_maxInputValue; _localLuminanceFactor=v0; _localLuminanceAddon=_maxInputValue*(1.0f-v0);}; - /** - * local luminance adaptation setup, this function should be applied for local adaptation applied to tone mapping operation - * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect - * @param maxInputValue: the maximum amplitude value measured after local adaptation processing (c.f. function runFilter_LocalAdapdation & runFilter_LocalAdapdation_autonomous) - * @param meanLuminance: the a priori meann luminance of the input data (should be 128 for 8bits images but can vary greatly in case of High Dynamic Range Images (HDRI) - */ - void setV0CompressionParameterToneMapping(const float v0, const float maxInputValue, const float meanLuminance=128.0f){ _v0=v0*maxInputValue; _localLuminanceFactor=1.0f; _localLuminanceAddon=meanLuminance*_v0; _maxInputValue=maxInputValue;}; + /** + * local luminance adaptation setup, this function should be applied for local adaptation applied to tone mapping operation + * @param v0: compression effect for the local luminance adaptation processing, set a value between 0.6 and 0.9 for best results, a high value yields to a high compression effect + * @param maxInputValue: the maximum amplitude value measured after local adaptation processing (c.f. function runFilter_LocalAdapdation & runFilter_LocalAdapdation_autonomous) + * @param meanLuminance: the a priori meann luminance of the input data (should be 128 for 8bits images but can vary greatly in case of High Dynamic Range Images (HDRI) + */ + void setV0CompressionParameterToneMapping(const float v0, const float maxInputValue, const float meanLuminance=128.0f){ _v0=v0*maxInputValue; _localLuminanceFactor=1.0f; _localLuminanceAddon=meanLuminance*_v0; _maxInputValue=maxInputValue;}; - /** - * update compression parameters while keeping v0 parameter value - * @param meanLuminance the input frame mean luminance - */ - inline void updateCompressionParameter(const float meanLuminance){_localLuminanceFactor=1; _localLuminanceAddon=meanLuminance*_v0;}; + /** + * update compression parameters while keeping v0 parameter value + * @param meanLuminance the input frame mean luminance + */ + inline void updateCompressionParameter(const float meanLuminance){_localLuminanceFactor=1; _localLuminanceAddon=meanLuminance*_v0;}; - /** - * @return the v0 compression parameter used to compute the local adaptation - */ - float getV0CompressionParameter(){ return _v0/_maxInputValue;}; + /** + * @return the v0 compression parameter used to compute the local adaptation + */ + float getV0CompressionParameter(){ return _v0/_maxInputValue;}; - /** - * @return the output result of the object - */ - inline const std::valarray &getOutput() const {return _filterOutput;}; + /** + * @return the output result of the object + */ + inline const std::valarray &getOutput() const {return _filterOutput;}; - /** - * @return number of rows of the filter - */ - inline unsigned int getNBrows(){return _filterOutput.getNBrows();}; + /** + * @return number of rows of the filter + */ + inline unsigned int getNBrows(){return _filterOutput.getNBrows();}; - /** - * @return number of columns of the filter - */ - inline unsigned int getNBcolumns(){return _filterOutput.getNBcolumns();}; + /** + * @return number of columns of the filter + */ + inline unsigned int getNBcolumns(){return _filterOutput.getNBcolumns();}; - /** - * @return number of pixels of the filter - */ - inline unsigned int getNBpixels(){return _filterOutput.getNBpixels();}; + /** + * @return number of pixels of the filter + */ + inline unsigned int getNBpixels(){return _filterOutput.getNBpixels();}; - /** - * force filter output to be normalized between 0 and maxValue - * @param maxValue: the maximum output value that is required - */ - inline void normalizeGrayOutput_0_maxOutputValue(const float maxValue){_filterOutput.normalizeGrayOutput_0_maxOutputValue(maxValue);}; + /** + * force filter output to be normalized between 0 and maxValue + * @param maxValue: the maximum output value that is required + */ + inline void normalizeGrayOutput_0_maxOutputValue(const float maxValue){_filterOutput.normalizeGrayOutput_0_maxOutputValue(maxValue);}; - /** - * force filter output to be normalized around 0 and rescaled with a sigmoide effect (extrem values saturation) - * @param maxValue: the maximum output value that is required - */ - inline void normalizeGrayOutputCentredSigmoide(){_filterOutput.normalizeGrayOutputCentredSigmoide();}; + /** + * force filter output to be normalized around 0 and rescaled with a sigmoide effect (extrem values saturation) + * @param maxValue: the maximum output value that is required + */ + inline void normalizeGrayOutputCentredSigmoide(){_filterOutput.normalizeGrayOutputCentredSigmoide();}; - /** - * force filter output to be normalized : data centering and std normalisation - * @param maxValue: the maximum output value that is required - */ - inline void centerReductImageLuminance(){_filterOutput.centerReductImageLuminance();}; + /** + * force filter output to be normalized : data centering and std normalisation + * @param maxValue: the maximum output value that is required + */ + inline void centerReductImageLuminance(){_filterOutput.centerReductImageLuminance();}; - /** - * @return the maximum input buffer value - */ - inline float getMaxInputValue(){return this->_maxInputValue;}; + /** + * @return the maximum input buffer value + */ + inline float getMaxInputValue(){return this->_maxInputValue;}; - /** - * @return the maximum input buffer value - */ - inline void setMaxInputValue(const float newMaxInputValue){this->_maxInputValue=newMaxInputValue;}; + /** + * @return the maximum input buffer value + */ + inline void setMaxInputValue(const float newMaxInputValue){this->_maxInputValue=newMaxInputValue;}; -protected: + protected: - ///////////////////////// - // data buffers - TemplateBuffer _filterOutput; // primary buffer (contains processing outputs) - std::valarray _localBuffer; // local secondary buffer - ///////////////////////// - // PARAMETERS - unsigned int _halfNBrows; - unsigned int _halfNBcolumns; + ///////////////////////// + // data buffers + TemplateBuffer _filterOutput; // primary buffer (contains processing outputs) + std::valarray _localBuffer; // local secondary buffer + ///////////////////////// + // PARAMETERS + unsigned int _halfNBrows; + unsigned int _halfNBcolumns; - // parameters buffers - std::valarray _filteringCoeficientsTable; - std::valarray _progressiveSpatialConstant;// pointer to a local table containing local spatial constant (allocated with the object) - std::valarray _progressiveGain;// pointer to a local table containing local spatial constant (allocated with the object) + // parameters buffers + std::valarray _filteringCoeficientsTable; + std::valarray _progressiveSpatialConstant;// pointer to a local table containing local spatial constant (allocated with the object) + std::valarray _progressiveGain;// pointer to a local table containing local spatial constant (allocated with the object) - // local adaptation filtering parameters - float _v0; //value used for local luminance adaptation function - float _maxInputValue; - float _meanInputValue; - float _localLuminanceFactor; - float _localLuminanceAddon; + // local adaptation filtering parameters + float _v0; //value used for local luminance adaptation function + float _maxInputValue; + float _meanInputValue; + float _localLuminanceFactor; + float _localLuminanceAddon; - // protected data related to standard low pass filters parameters - float _a; - float _tau; - float _gain; + // protected data related to standard low pass filters parameters + float _a; + float _tau; + float _gain; - ///////////////////////// - // FILTERS METHODS + ///////////////////////// + // FILTERS METHODS - // Basic low pass spation temporal low pass filter used by each retina filters - void _spatiotemporalLPfilter(const float *inputFrame, float *LPfilterOutput, const unsigned int coefTableOffset=0); - float _squaringSpatiotemporalLPfilter(const float *inputFrame, float *outputFrame, const unsigned int filterIndex=0); + // Basic low pass spation temporal low pass filter used by each retina filters + void _spatiotemporalLPfilter(const float *inputFrame, float *LPfilterOutput, const unsigned int coefTableOffset=0); + float _squaringSpatiotemporalLPfilter(const float *inputFrame, float *outputFrame, const unsigned int filterIndex=0); - // LP filter with an irregular spatial filtering + // LP filter with an irregular spatial filtering - // -> rewrites the input buffer - void _spatiotemporalLPfilter_Irregular(float *inputOutputFrame, const unsigned int filterIndex=0); - // writes the output on another buffer - void _spatiotemporalLPfilter_Irregular(const float *inputFrame, float *outputFrame, const unsigned int filterIndex=0); - // LP filter that squares the input and computes the output ONLY on the areas where the integrationAreas map are TRUE - void _localSquaringSpatioTemporalLPfilter(const float *inputFrame, float *LPfilterOutput, const unsigned int *integrationAreas, const unsigned int filterIndex=0); + // -> rewrites the input buffer + void _spatiotemporalLPfilter_Irregular(float *inputOutputFrame, const unsigned int filterIndex=0); + // writes the output on another buffer + void _spatiotemporalLPfilter_Irregular(const float *inputFrame, float *outputFrame, const unsigned int filterIndex=0); + // LP filter that squares the input and computes the output ONLY on the areas where the integrationAreas map are TRUE + void _localSquaringSpatioTemporalLPfilter(const float *inputFrame, float *LPfilterOutput, const unsigned int *integrationAreas, const unsigned int filterIndex=0); - // local luminance adaptation of the input in regard of localLuminance buffer - void _localLuminanceAdaptation(const float *inputFrame, const float *localLuminance, float *outputFrame, const bool updateLuminanceMean=true); - // local luminance adaptation of the input in regard of localLuminance buffer, the input is rewrited and becomes the output - void _localLuminanceAdaptation(float *inputOutputFrame, const float *localLuminance); - // local adaptation applied on a range of values which can be positive and negative - void _localLuminanceAdaptationPosNegValues(const float *inputFrame, const float *localLuminance, float *outputFrame); + // local luminance adaptation of the input in regard of localLuminance buffer + void _localLuminanceAdaptation(const float *inputFrame, const float *localLuminance, float *outputFrame, const bool updateLuminanceMean=true); + // local luminance adaptation of the input in regard of localLuminance buffer, the input is rewrited and becomes the output + void _localLuminanceAdaptation(float *inputOutputFrame, const float *localLuminance); + // local adaptation applied on a range of values which can be positive and negative + void _localLuminanceAdaptationPosNegValues(const float *inputFrame, const float *localLuminance, float *outputFrame); - ////////////////////////////////////////////////////////////// - // 1D directional filters used for the 2D low pass filtering + ////////////////////////////////////////////////////////////// + // 1D directional filters used for the 2D low pass filtering - // 1D filters with image input - void _horizontalCausalFilter_addInput(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); - // 1D filters with image input that is squared in the function // parallelized with TBB - void _squaringHorizontalCausalFilter(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); - // vertical anticausal filter that returns the mean value of its result - float _verticalAnticausalFilter_returnMeanValue(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); + // 1D filters with image input + void _horizontalCausalFilter_addInput(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); + // 1D filters with image input that is squared in the function // parallelized with TBB + void _squaringHorizontalCausalFilter(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); + // vertical anticausal filter that returns the mean value of its result + float _verticalAnticausalFilter_returnMeanValue(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); - // most simple functions: only perform 1D filtering with output=input (no add on) - void _horizontalCausalFilter(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); - void _horizontalAnticausalFilter(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); // parallelized with TBB - void _verticalCausalFilter(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); // parallelized with TBB - void _verticalAnticausalFilter(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); + // most simple functions: only perform 1D filtering with output=input (no add on) + void _horizontalCausalFilter(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); + void _horizontalAnticausalFilter(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); // parallelized with TBB + void _verticalCausalFilter(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); // parallelized with TBB + void _verticalAnticausalFilter(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); - // perform 1D filtering with output with varrying spatial coefficient - void _horizontalCausalFilter_Irregular(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); - void _horizontalCausalFilter_Irregular_addInput(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); - void _horizontalAnticausalFilter_Irregular(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd, const float *spatialConstantBuffer); // parallelized with TBB - void _verticalCausalFilter_Irregular(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd, const float *spatialConstantBuffer); // parallelized with TBB - void _verticalAnticausalFilter_Irregular_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); + // perform 1D filtering with output with varrying spatial coefficient + void _horizontalCausalFilter_Irregular(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); + void _horizontalCausalFilter_Irregular_addInput(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd); + void _horizontalAnticausalFilter_Irregular(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd, const float *spatialConstantBuffer); // parallelized with TBB + void _verticalCausalFilter_Irregular(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd, const float *spatialConstantBuffer); // parallelized with TBB + void _verticalAnticausalFilter_Irregular_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); - // 1D filters in which the output is multiplied by _gain - void _verticalAnticausalFilter_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); // this functions affects _gain at the output // parallelized with TBB - void _horizontalAnticausalFilter_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); // this functions affects _gain at the output + // 1D filters in which the output is multiplied by _gain + void _verticalAnticausalFilter_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); // this functions affects _gain at the output // parallelized with TBB + void _horizontalAnticausalFilter_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd); // this functions affects _gain at the output - // LP filter on specific parts of the picture instead of all the image - // same functions (some of them) but take a binary flag to allow integration, false flag means, 0 at the output... - void _local_squaringHorizontalCausalFilter(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd, const unsigned int *integrationAreas); - void _local_horizontalAnticausalFilter(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd, const unsigned int *integrationAreas); - void _local_verticalCausalFilter(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd, const unsigned int *integrationAreas); - void _local_verticalAnticausalFilter_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd, const unsigned int *integrationAreas); // this functions affects _gain at the output + // LP filter on specific parts of the picture instead of all the image + // same functions (some of them) but take a binary flag to allow integration, false flag means, 0 at the output... + void _local_squaringHorizontalCausalFilter(const float *inputFrame, float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd, const unsigned int *integrationAreas); + void _local_horizontalAnticausalFilter(float *outputFrame, unsigned int IDrowStart, unsigned int IDrowEnd, const unsigned int *integrationAreas); + void _local_verticalCausalFilter(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd, const unsigned int *integrationAreas); + void _local_verticalAnticausalFilter_multGain(float *outputFrame, unsigned int IDcolumnStart, unsigned int IDcolumnEnd, const unsigned int *integrationAreas); // this functions affects _gain at the output #ifdef MAKE_PARALLEL -/****************************************************** -** IF some parallelizing thread methods are available, then, main loops are parallelized using these functors -** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary -** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised -** ==> functors constructors can differ from the parameters used with their related serial functions -*/ + /****************************************************** + ** IF some parallelizing thread methods are available, then, main loops are parallelized using these functors + ** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary + ** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised + ** ==> functors constructors can differ from the parameters used with their related serial functions + */ #define _DEBUG_TBB // define DEBUG_TBB in order to display additionnal data on stdout - class Parallel_horizontalAnticausalFilter: public cv::ParallelLoopBody - { - private: - float *outputFrame; - const unsigned int IDrowEnd, nbColumns; - const float filterParam_a; - public: - // constructor which takes the input image pointer reference reference and limits - Parallel_horizontalAnticausalFilter(float *bufferToProcess, const unsigned int idEnd, const unsigned int nbCols, const float a ) - :outputFrame(bufferToProcess), IDrowEnd(idEnd), nbColumns(nbCols), filterParam_a(a) + class Parallel_horizontalAnticausalFilter: public cv::ParallelLoopBody { + private: + float *outputFrame; + unsigned int IDrowEnd, nbColumns; + float filterParam_a; + public: + // constructor which takes the input image pointer reference reference and limits + Parallel_horizontalAnticausalFilter(float *bufferToProcess, const unsigned int idEnd, const unsigned int nbCols, const float a ) + :outputFrame(bufferToProcess), IDrowEnd(idEnd), nbColumns(nbCols), filterParam_a(a) + { #ifdef DEBUG_TBB - std::cout<<"Parallel_horizontalAnticausalFilter::Parallel_horizontalAnticausalFilter :" - <<"\n\t idEnd="< initialCentres; + initialCentres.push_back(descriptors.row(0)); + for (int i = 1; i < descriptors.rows; i++) { + double minDist = DBL_MAX; + for (size_t j = 0; j < initialCentres.size(); j++) { + minDist = std::min(minDist, + cv::Mahalanobis(descriptors.row(i),initialCentres[j], + icovar)); + } + if (minDist > clusterSize) + initialCentres.push_back(descriptors.row(i)); + } + + std::vector > clusters; + clusters.resize(initialCentres.size()); + for (int i = 0; i < descriptors.rows; i++) { + int index = 0; double dist = 0, minDist = DBL_MAX; + for (size_t j = 0; j < initialCentres.size(); j++) { + dist = cv::Mahalanobis(descriptors.row(i),initialCentres[j],icovar); + if (dist < minDist) { + minDist = dist; + index = (int)j; + } + } + clusters[index].push_back(descriptors.row(i)); + } + + // TODO: throw away small clusters. + + Mat vocabulary; + Mat centre = Mat::zeros(1,descriptors.cols,descriptors.type()); + for (size_t i = 0; i < clusters.size(); i++) { + centre.setTo(0); + for (std::list::iterator Ci = clusters[i].begin(); Ci != clusters[i].end(); Ci++) { + centre += *Ci; + } + centre /= (double)clusters[i].size(); + vocabulary.push_back(centre); + } + + return vocabulary; +} + +} + +} + diff --git a/modules/contrib/src/chowliutree.cpp b/modules/contrib/src/chowliutree.cpp new file mode 100644 index 000000000..ba1ef6561 --- /dev/null +++ b/modules/contrib/src/chowliutree.cpp @@ -0,0 +1,290 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// This file originates from the openFABMAP project: +// [http://code.google.com/p/openfabmap/] +// +// For published work which uses all or part of OpenFABMAP, please cite: +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6224843] +// +// Original Algorithm by Mark Cummins and Paul Newman: +// [http://ijr.sagepub.com/content/27/6/647.short] +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=5613942] +// [http://ijr.sagepub.com/content/30/9/1100.abstract] +// +// License Agreement +// +// Copyright (C) 2012 Arren Glover [aj.glover@qut.edu.au] and +// Will Maddern [w.maddern@qut.edu.au], all rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include "opencv2/contrib/openfabmap.hpp" + +namespace cv { + +namespace of2 { + +ChowLiuTree::ChowLiuTree() { +} + +ChowLiuTree::~ChowLiuTree() { +} + +void ChowLiuTree::add(const Mat& imgDescriptor) { + CV_Assert(!imgDescriptor.empty()); + if (!imgDescriptors.empty()) { + CV_Assert(imgDescriptors[0].cols == imgDescriptor.cols); + CV_Assert(imgDescriptors[0].type() == imgDescriptor.type()); + } + + imgDescriptors.push_back(imgDescriptor); + +} + +void ChowLiuTree::add(const vector& _imgDescriptors) { + for (size_t i = 0; i < _imgDescriptors.size(); i++) { + add(_imgDescriptors[i]); + } +} + +const std::vector& ChowLiuTree::getImgDescriptors() const { + return imgDescriptors; +} + +Mat ChowLiuTree::make(double infoThreshold) { + CV_Assert(!imgDescriptors.empty()); + + unsigned int descCount = 0; + for (size_t i = 0; i < imgDescriptors.size(); i++) + descCount += imgDescriptors[i].rows; + + mergedImgDescriptors = cv::Mat(descCount, imgDescriptors[0].cols, + imgDescriptors[0].type()); + for (size_t i = 0, start = 0; i < imgDescriptors.size(); i++) + { + Mat submut = mergedImgDescriptors.rowRange((int)start, + (int)(start + imgDescriptors[i].rows)); + imgDescriptors[i].copyTo(submut); + start += imgDescriptors[i].rows; + } + + std::list edges; + createBaseEdges(edges, infoThreshold); + + // TODO: if it cv_asserts here they really won't know why. + + CV_Assert(reduceEdgesToMinSpan(edges)); + + return buildTree(edges.front().word1, edges); +} + +double ChowLiuTree::P(int a, bool za) { + + if(za) { + return (0.98 * cv::countNonZero(mergedImgDescriptors.col(a)) / + mergedImgDescriptors.rows) + 0.01; + } else { + return 1 - ((0.98 * cv::countNonZero(mergedImgDescriptors.col(a)) / + mergedImgDescriptors.rows) + 0.01); + } + +} +double ChowLiuTree::JP(int a, bool za, int b, bool zb) { + + double count = 0; + for(int i = 0; i < mergedImgDescriptors.rows; i++) { + if((mergedImgDescriptors.at(i,a) > 0) == za && + (mergedImgDescriptors.at(i,b) > 0) == zb) { + count++; + } + } + return count / mergedImgDescriptors.rows; + +} +double ChowLiuTree::CP(int a, bool za, int b, bool zb){ + + int count = 0, total = 0; + for(int i = 0; i < mergedImgDescriptors.rows; i++) { + if((mergedImgDescriptors.at(i,b) > 0) == zb) { + total++; + if((mergedImgDescriptors.at(i,a) > 0) == za) { + count++; + } + } + } + if(total) { + return (double)(0.98 * count)/total + 0.01; + } else { + return (za) ? 0.01 : 0.99; + } +} + +cv::Mat ChowLiuTree::buildTree(int root_word, std::list &edges) { + + int q = root_word; + cv::Mat cltree(4, (int)edges.size()+1, CV_64F); + + cltree.at(0, q) = q; + cltree.at(1, q) = P(q, true); + cltree.at(2, q) = P(q, true); + cltree.at(3, q) = P(q, true); + //setting P(zq|zpq) to P(zq) gives the root node of the chow-liu + //independence from a parent node. + + //find all children and do the same + vector nextqs = extractChildren(edges, q); + + int pq = q; + vector::iterator nextq; + for(nextq = nextqs.begin(); nextq != nextqs.end(); nextq++) { + recAddToTree(cltree, *nextq, pq, edges); + } + + return cltree; + + +} + +void ChowLiuTree::recAddToTree(cv::Mat &cltree, int q, int pq, + std::list& remaining_edges) { + + cltree.at(0, q) = pq; + cltree.at(1, q) = P(q, true); + cltree.at(2, q) = CP(q, true, pq, true); + cltree.at(3, q) = CP(q, true, pq, false); + + //find all children and do the same + vector nextqs = extractChildren(remaining_edges, q); + + pq = q; + vector::iterator nextq; + for(nextq = nextqs.begin(); nextq != nextqs.end(); nextq++) { + recAddToTree(cltree, *nextq, pq, remaining_edges); + } +} + +vector ChowLiuTree::extractChildren(std::list &remaining_edges, int q) { + + std::vector children; + std::list::iterator edge = remaining_edges.begin(); + + while(edge != remaining_edges.end()) { + if(edge->word1 == q) { + children.push_back(edge->word2); + edge = remaining_edges.erase(edge); + continue; + } + if(edge->word2 == q) { + children.push_back(edge->word1); + edge = remaining_edges.erase(edge); + continue; + } + edge++; + } + + return children; +} + +bool ChowLiuTree::sortInfoScores(const info& first, const info& second) { + return first.score > second.score; +} + +double ChowLiuTree::calcMutInfo(int word1, int word2) { + double accumulation = 0; + + double P00 = JP(word1, false, word2, false); + if(P00) accumulation += P00 * log(P00 / (P(word1, false)*P(word2, false))); + + double P01 = JP(word1, false, word2, true); + if(P01) accumulation += P01 * log(P01 / (P(word1, false)*P(word2, true))); + + double P10 = JP(word1, true, word2, false); + if(P10) accumulation += P10 * log(P10 / (P(word1, true)*P(word2, false))); + + double P11 = JP(word1, true, word2, true); + if(P11) accumulation += P11 * log(P11 / (P(word1, true)*P(word2, true))); + + return accumulation; +} + +void ChowLiuTree::createBaseEdges(std::list& edges, double infoThreshold) { + + int nWords = imgDescriptors[0].cols; + info mutInfo; + + for(int word1 = 0; word1 < nWords; word1++) { + for(int word2 = word1 + 1; word2 < nWords; word2++) { + mutInfo.word1 = (short)word1; + mutInfo.word2 = (short)word2; + mutInfo.score = (float)calcMutInfo(word1, word2); + if(mutInfo.score >= infoThreshold) + edges.push_back(mutInfo); + } + } + edges.sort(sortInfoScores); +} + +bool ChowLiuTree::reduceEdgesToMinSpan(std::list& edges) { + + std::map groups; + std::map::iterator groupIt; + for(int i = 0; i < imgDescriptors[0].cols; i++) groups[i] = i; + int group1, group2; + + std::list::iterator edge = edges.begin(); + while(edge != edges.end()) { + if(groups[edge->word1] != groups[edge->word2]) { + group1 = groups[edge->word1]; + group2 = groups[edge->word2]; + for(groupIt = groups.begin(); groupIt != groups.end(); groupIt++) + if(groupIt->second == group2) groupIt->second = group1; + edge++; + } else { + edge = edges.erase(edge); + } + } + + if(edges.size() != (unsigned int)imgDescriptors[0].cols - 1) { + return false; + } else { + return true; + } + +} + +} + +} + diff --git a/modules/contrib/src/magnoretinafilter.hpp b/modules/contrib/src/magnoretinafilter.hpp index b14abfd5c..991e75daf 100644 --- a/modules/contrib/src/magnoretinafilter.hpp +++ b/modules/contrib/src/magnoretinafilter.hpp @@ -100,143 +100,143 @@ namespace cv { -class MagnoRetinaFilter: public BasicRetinaFilter -{ -public: - /** - * constructor parameters are only linked to image input size - * @param NBrows: number of rows of the input image - * @param NBcolumns: number of columns of the input image - */ - MagnoRetinaFilter(const unsigned int NBrows, const unsigned int NBcolumns); - - - /** - * destructor - */ - virtual ~MagnoRetinaFilter(); - - /** - * function that clears all buffers of the object - */ - void clearAllBuffers(); - - /** - * resize retina magno filter object (resize all allocated buffers) - * @param NBrows: the new height size - * @param NBcolumns: the new width size - */ - void resize(const unsigned int NBrows, const unsigned int NBcolumns); - - /** - * set parameters values - * @param parasolCells_beta: the low pass filter gain used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), typical value is 0 - * @param parasolCells_tau: the low pass filter time constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is frame, typical value is 0 (immediate response) - * @param parasolCells_k: the low pass filter spatial constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is pixels, typical value is 5 - * @param amacrinCellsTemporalCutFrequency: the time constant of the first order high pass fiter of the magnocellular way (motion information channel), unit is frames, tipicall value is 5 - * @param localAdaptIntegration_tau: specifies the temporal constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation - * @param localAdaptIntegration_k: specifies the spatial constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation - */ - void setCoefficientsTable(const float parasolCells_beta, const float parasolCells_tau, const float parasolCells_k, const float amacrinCellsTemporalCutFrequency, const float localAdaptIntegration_tau, const float localAdaptIntegration_k); - - /** - * launch filter that runs all the IPL magno filter (model of the magnocellular channel of the Inner Plexiform Layer of the retina) - * @param OPL_ON: the output of the bipolar ON cells of the retina (available from the ParvoRetinaFilter class (getBipolarCellsON() function) - * @param OPL_OFF: the output of the bipolar OFF cells of the retina (available from the ParvoRetinaFilter class (getBipolarCellsOFF() function) - * @return the processed result without post-processing - */ - const std::valarray &runFilter(const std::valarray &OPL_ON, const std::valarray &OPL_OFF); - - /** - * @return the Magnocellular ON channel filtering output - */ - inline const std::valarray &getMagnoON() const {return _magnoXOutputON;}; - - /** - * @return the Magnocellular OFF channel filtering output - */ - inline const std::valarray &getMagnoOFF() const {return _magnoXOutputOFF;}; - - /** - * @return the Magnocellular Y (sum of the ON and OFF magno channels) filtering output - */ - inline const std::valarray &getMagnoYsaturated() const {return *_magnoYsaturated;}; - - /** - * applies an image normalization which saturates the high output values by the use of an assymetric sigmoide - */ - inline void normalizeGrayOutputNearZeroCentreredSigmoide(){_filterOutput.normalizeGrayOutputNearZeroCentreredSigmoide(&(*_magnoYOutput)[0], &(*_magnoYsaturated)[0]);}; - - /** - * @return the horizontal cells' temporal constant - */ - inline float getTemporalConstant(){return this->_filteringCoeficientsTable[2];}; - -private: - - // related pointers to these buffers - std::valarray _previousInput_ON; - std::valarray _previousInput_OFF; - std::valarray _amacrinCellsTempOutput_ON; - std::valarray _amacrinCellsTempOutput_OFF; - std::valarray _magnoXOutputON; - std::valarray _magnoXOutputOFF; - std::valarray _localProcessBufferON; - std::valarray _localProcessBufferOFF; - // reference to parent buffers and allow better readability - TemplateBuffer *_magnoYOutput; - std::valarray *_magnoYsaturated; - - // varialbles - float _temporalCoefficient; - - // amacrine cells filter : high pass temporal filter - void _amacrineCellsComputing(const float *ONinput, const float *OFFinput); -#ifdef MAKE_PARALLEL -/****************************************************** -** IF some parallelizing thread methods are available, then, main loops are parallelized using these functors -** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary -** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised -** ==> functors constructors can differ from the parameters used with their related serial functions -*/ - class Parallel_amacrineCellsComputing: public cv::ParallelLoopBody + class MagnoRetinaFilter: public BasicRetinaFilter { - private: - const float *OPL_ON, *OPL_OFF; - float *previousInput_ON, *previousInput_OFF, *amacrinCellsTempOutput_ON, *amacrinCellsTempOutput_OFF; - const float temporalCoefficient; public: - Parallel_amacrineCellsComputing(const float *OPL_ON_PTR, const float *OPL_OFF_PTR, float *previousInput_ON_PTR, float *previousInput_OFF_PTR, float *amacrinCellsTempOutput_ON_PTR, float *amacrinCellsTempOutput_OFF_PTR, float temporalCoefficientVal) - :OPL_ON(OPL_ON_PTR), OPL_OFF(OPL_OFF_PTR), previousInput_ON(previousInput_ON_PTR), previousInput_OFF(previousInput_OFF_PTR), amacrinCellsTempOutput_ON(amacrinCellsTempOutput_ON_PTR), amacrinCellsTempOutput_OFF(amacrinCellsTempOutput_OFF_PTR), temporalCoefficient(temporalCoefficientVal) {} - - virtual void operator()( const Range& r ) const { - register const float *OPL_ON_PTR=OPL_ON+r.start; - register const float *OPL_OFF_PTR=OPL_OFF+r.start; - register float *previousInput_ON_PTR= previousInput_ON+r.start; - register float *previousInput_OFF_PTR= previousInput_OFF+r.start; - register float *amacrinCellsTempOutput_ON_PTR= amacrinCellsTempOutput_ON+r.start; - register float *amacrinCellsTempOutput_OFF_PTR= amacrinCellsTempOutput_OFF+r.start; + /** + * constructor parameters are only linked to image input size + * @param NBrows: number of rows of the input image + * @param NBcolumns: number of columns of the input image + */ + MagnoRetinaFilter(const unsigned int NBrows, const unsigned int NBcolumns); - for (int IDpixel=r.start ; IDpixel!=r.end; ++IDpixel) - { - /* Compute ON and OFF amacrin cells high pass temporal filter */ - float magnoXonPixelResult = temporalCoefficient*(*amacrinCellsTempOutput_ON_PTR+ *OPL_ON_PTR-*previousInput_ON_PTR); - *(amacrinCellsTempOutput_ON_PTR++)=((float)(magnoXonPixelResult>0))*magnoXonPixelResult; + /** + * destructor + */ + virtual ~MagnoRetinaFilter(); - float magnoXoffPixelResult = temporalCoefficient*(*amacrinCellsTempOutput_OFF_PTR+ *OPL_OFF_PTR-*previousInput_OFF_PTR); - *(amacrinCellsTempOutput_OFF_PTR++)=((float)(magnoXoffPixelResult>0))*magnoXoffPixelResult; + /** + * function that clears all buffers of the object + */ + void clearAllBuffers(); - /* prepare next loop */ - *(previousInput_ON_PTR++)=*(OPL_ON_PTR++); - *(previousInput_OFF_PTR++)=*(OPL_OFF_PTR++); + /** + * resize retina magno filter object (resize all allocated buffers) + * @param NBrows: the new height size + * @param NBcolumns: the new width size + */ + void resize(const unsigned int NBrows, const unsigned int NBcolumns); - } - } + /** + * set parameters values + * @param parasolCells_beta: the low pass filter gain used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), typical value is 0 + * @param parasolCells_tau: the low pass filter time constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is frame, typical value is 0 (immediate response) + * @param parasolCells_k: the low pass filter spatial constant used for local contrast adaptation at the IPL level of the retina (for ganglion cells local adaptation), unit is pixels, typical value is 5 + * @param amacrinCellsTemporalCutFrequency: the time constant of the first order high pass fiter of the magnocellular way (motion information channel), unit is frames, tipicall value is 5 + * @param localAdaptIntegration_tau: specifies the temporal constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + * @param localAdaptIntegration_k: specifies the spatial constant of the low pas filter involved in the computation of the local "motion mean" for the local adaptation computation + */ + void setCoefficientsTable(const float parasolCells_beta, const float parasolCells_tau, const float parasolCells_k, const float amacrinCellsTemporalCutFrequency, const float localAdaptIntegration_tau, const float localAdaptIntegration_k); - }; + /** + * launch filter that runs all the IPL magno filter (model of the magnocellular channel of the Inner Plexiform Layer of the retina) + * @param OPL_ON: the output of the bipolar ON cells of the retina (available from the ParvoRetinaFilter class (getBipolarCellsON() function) + * @param OPL_OFF: the output of the bipolar OFF cells of the retina (available from the ParvoRetinaFilter class (getBipolarCellsOFF() function) + * @return the processed result without post-processing + */ + const std::valarray &runFilter(const std::valarray &OPL_ON, const std::valarray &OPL_OFF); + + /** + * @return the Magnocellular ON channel filtering output + */ + inline const std::valarray &getMagnoON() const {return _magnoXOutputON;}; + + /** + * @return the Magnocellular OFF channel filtering output + */ + inline const std::valarray &getMagnoOFF() const {return _magnoXOutputOFF;}; + + /** + * @return the Magnocellular Y (sum of the ON and OFF magno channels) filtering output + */ + inline const std::valarray &getMagnoYsaturated() const {return *_magnoYsaturated;}; + + /** + * applies an image normalization which saturates the high output values by the use of an assymetric sigmoide + */ + inline void normalizeGrayOutputNearZeroCentreredSigmoide(){_filterOutput.normalizeGrayOutputNearZeroCentreredSigmoide(&(*_magnoYOutput)[0], &(*_magnoYsaturated)[0]);}; + + /** + * @return the horizontal cells' temporal constant + */ + inline float getTemporalConstant(){return this->_filteringCoeficientsTable[2];}; + + private: + + // related pointers to these buffers + std::valarray _previousInput_ON; + std::valarray _previousInput_OFF; + std::valarray _amacrinCellsTempOutput_ON; + std::valarray _amacrinCellsTempOutput_OFF; + std::valarray _magnoXOutputON; + std::valarray _magnoXOutputOFF; + std::valarray _localProcessBufferON; + std::valarray _localProcessBufferOFF; + // reference to parent buffers and allow better readability + TemplateBuffer *_magnoYOutput; + std::valarray *_magnoYsaturated; + + // varialbles + float _temporalCoefficient; + + // amacrine cells filter : high pass temporal filter + void _amacrineCellsComputing(const float *ONinput, const float *OFFinput); +#ifdef MAKE_PARALLEL + /****************************************************** + ** IF some parallelizing thread methods are available, then, main loops are parallelized using these functors + ** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary + ** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised + ** ==> functors constructors can differ from the parameters used with their related serial functions + */ + class Parallel_amacrineCellsComputing: public cv::ParallelLoopBody + { + private: + const float *OPL_ON, *OPL_OFF; + float *previousInput_ON, *previousInput_OFF, *amacrinCellsTempOutput_ON, *amacrinCellsTempOutput_OFF; + float temporalCoefficient; + public: + Parallel_amacrineCellsComputing(const float *OPL_ON_PTR, const float *OPL_OFF_PTR, float *previousInput_ON_PTR, float *previousInput_OFF_PTR, float *amacrinCellsTempOutput_ON_PTR, float *amacrinCellsTempOutput_OFF_PTR, float temporalCoefficientVal) + :OPL_ON(OPL_ON_PTR), OPL_OFF(OPL_OFF_PTR), previousInput_ON(previousInput_ON_PTR), previousInput_OFF(previousInput_OFF_PTR), amacrinCellsTempOutput_ON(amacrinCellsTempOutput_ON_PTR), amacrinCellsTempOutput_OFF(amacrinCellsTempOutput_OFF_PTR), temporalCoefficient(temporalCoefficientVal) {} + + virtual void operator()( const Range& r ) const { + register const float *OPL_ON_PTR=OPL_ON+r.start; + register const float *OPL_OFF_PTR=OPL_OFF+r.start; + register float *previousInput_ON_PTR= previousInput_ON+r.start; + register float *previousInput_OFF_PTR= previousInput_OFF+r.start; + register float *amacrinCellsTempOutput_ON_PTR= amacrinCellsTempOutput_ON+r.start; + register float *amacrinCellsTempOutput_OFF_PTR= amacrinCellsTempOutput_OFF+r.start; + + for (int IDpixel=r.start ; IDpixel!=r.end; ++IDpixel) + { + + /* Compute ON and OFF amacrin cells high pass temporal filter */ + float magnoXonPixelResult = temporalCoefficient*(*amacrinCellsTempOutput_ON_PTR+ *OPL_ON_PTR-*previousInput_ON_PTR); + *(amacrinCellsTempOutput_ON_PTR++)=((float)(magnoXonPixelResult>0))*magnoXonPixelResult; + + float magnoXoffPixelResult = temporalCoefficient*(*amacrinCellsTempOutput_OFF_PTR+ *OPL_OFF_PTR-*previousInput_OFF_PTR); + *(amacrinCellsTempOutput_OFF_PTR++)=((float)(magnoXoffPixelResult>0))*magnoXoffPixelResult; + + /* prepare next loop */ + *(previousInput_ON_PTR++)=*(OPL_ON_PTR++); + *(previousInput_OFF_PTR++)=*(OPL_OFF_PTR++); + + } + } + + }; #endif -}; + }; } diff --git a/modules/contrib/src/openfabmap.cpp b/modules/contrib/src/openfabmap.cpp new file mode 100644 index 000000000..99795c9e7 --- /dev/null +++ b/modules/contrib/src/openfabmap.cpp @@ -0,0 +1,779 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// This file originates from the openFABMAP project: +// [http://code.google.com/p/openfabmap/] +// +// For published work which uses all or part of OpenFABMAP, please cite: +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6224843] +// +// Original Algorithm by Mark Cummins and Paul Newman: +// [http://ijr.sagepub.com/content/27/6/647.short] +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=5613942] +// [http://ijr.sagepub.com/content/30/9/1100.abstract] +// +// License Agreement +// +// Copyright (C) 2012 Arren Glover [aj.glover@qut.edu.au] and +// Will Maddern [w.maddern@qut.edu.au], all rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + +#include "precomp.hpp" +#include "opencv2/contrib/openfabmap.hpp" + + +/* + Calculate the sum of two log likelihoods +*/ +namespace cv { + +namespace of2 { + +static double logsumexp(double a, double b) { + return a > b ? log(1 + exp(b - a)) + a : log(1 + exp(a - b)) + b; +} + +FabMap::FabMap(const Mat& _clTree, double _PzGe, + double _PzGNe, int _flags, int _numSamples) : + clTree(_clTree), PzGe(_PzGe), PzGNe(_PzGNe), flags( + _flags), numSamples(_numSamples) { + + CV_Assert(flags & MEAN_FIELD || flags & SAMPLED); + CV_Assert(flags & NAIVE_BAYES || flags & CHOW_LIU); + if (flags & NAIVE_BAYES) { + PzGL = &FabMap::PzqGL; + } else { + PzGL = &FabMap::PzqGzpqL; + } + + //check for a valid Chow-Liu tree + CV_Assert(clTree.type() == CV_64FC1); + cv::checkRange(clTree.row(0), false, NULL, 0, clTree.cols); + cv::checkRange(clTree.row(1), false, NULL, DBL_MIN, 1); + cv::checkRange(clTree.row(2), false, NULL, DBL_MIN, 1); + cv::checkRange(clTree.row(3), false, NULL, DBL_MIN, 1); + + // TODO: Add default values for member variables + Pnew = 0.9; + sFactor = 0.99; + mBias = 0.5; +} + +FabMap::~FabMap() { +} + +const std::vector& FabMap::getTrainingImgDescriptors() const { + return trainingImgDescriptors; +} + +const std::vector& FabMap::getTestImgDescriptors() const { + return testImgDescriptors; +} + +void FabMap::addTraining(const Mat& queryImgDescriptor) { + CV_Assert(!queryImgDescriptor.empty()); + vector queryImgDescriptors; + for (int i = 0; i < queryImgDescriptor.rows; i++) { + queryImgDescriptors.push_back(queryImgDescriptor.row(i)); + } + addTraining(queryImgDescriptors); +} + +void FabMap::addTraining(const vector& queryImgDescriptors) { + for (size_t i = 0; i < queryImgDescriptors.size(); i++) { + CV_Assert(!queryImgDescriptors[i].empty()); + CV_Assert(queryImgDescriptors[i].rows == 1); + CV_Assert(queryImgDescriptors[i].cols == clTree.cols); + CV_Assert(queryImgDescriptors[i].type() == CV_32F); + trainingImgDescriptors.push_back(queryImgDescriptors[i]); + } +} + +void FabMap::add(const cv::Mat& queryImgDescriptor) { + CV_Assert(!queryImgDescriptor.empty()); + vector queryImgDescriptors; + for (int i = 0; i < queryImgDescriptor.rows; i++) { + queryImgDescriptors.push_back(queryImgDescriptor.row(i)); + } + add(queryImgDescriptors); +} + +void FabMap::add(const std::vector& queryImgDescriptors) { + for (size_t i = 0; i < queryImgDescriptors.size(); i++) { + CV_Assert(!queryImgDescriptors[i].empty()); + CV_Assert(queryImgDescriptors[i].rows == 1); + CV_Assert(queryImgDescriptors[i].cols == clTree.cols); + CV_Assert(queryImgDescriptors[i].type() == CV_32F); + testImgDescriptors.push_back(queryImgDescriptors[i]); + } +} + +void FabMap::compare(const Mat& queryImgDescriptor, + vector& matches, bool addQuery, + const Mat& mask) { + CV_Assert(!queryImgDescriptor.empty()); + vector queryImgDescriptors; + for (int i = 0; i < queryImgDescriptor.rows; i++) { + queryImgDescriptors.push_back(queryImgDescriptor.row(i)); + } + compare(queryImgDescriptors,matches,addQuery,mask); +} + +void FabMap::compare(const Mat& queryImgDescriptor, + const Mat& testImgDescriptor, vector& matches, + const Mat& mask) { + CV_Assert(!queryImgDescriptor.empty()); + vector queryImgDescriptors; + for (int i = 0; i < queryImgDescriptor.rows; i++) { + queryImgDescriptors.push_back(queryImgDescriptor.row(i)); + } + + CV_Assert(!testImgDescriptor.empty()); + vector _testImgDescriptors; + for (int i = 0; i < testImgDescriptor.rows; i++) { + _testImgDescriptors.push_back(testImgDescriptor.row(i)); + } + compare(queryImgDescriptors,_testImgDescriptors,matches,mask); + +} + +void FabMap::compare(const Mat& queryImgDescriptor, + const vector& _testImgDescriptors, + vector& matches, const Mat& mask) { + CV_Assert(!queryImgDescriptor.empty()); + vector queryImgDescriptors; + for (int i = 0; i < queryImgDescriptor.rows; i++) { + queryImgDescriptors.push_back(queryImgDescriptor.row(i)); + } + compare(queryImgDescriptors,_testImgDescriptors,matches,mask); +} + +void FabMap::compare(const vector& queryImgDescriptors, + vector& matches, bool addQuery, const Mat& /*mask*/) { + + // TODO: add first query if empty (is this necessary) + + for (size_t i = 0; i < queryImgDescriptors.size(); i++) { + CV_Assert(!queryImgDescriptors[i].empty()); + CV_Assert(queryImgDescriptors[i].rows == 1); + CV_Assert(queryImgDescriptors[i].cols == clTree.cols); + CV_Assert(queryImgDescriptors[i].type() == CV_32F); + + // TODO: add mask + + compareImgDescriptor(queryImgDescriptors[i], + (int)i, testImgDescriptors, matches); + if (addQuery) + add(queryImgDescriptors[i]); + } +} + +void FabMap::compare(const vector& queryImgDescriptors, + const vector& _testImgDescriptors, + vector& matches, const Mat& /*mask*/) { + if (_testImgDescriptors[0].data != this->testImgDescriptors[0].data) { + CV_Assert(!(flags & MOTION_MODEL)); + for (size_t i = 0; i < _testImgDescriptors.size(); i++) { + CV_Assert(!_testImgDescriptors[i].empty()); + CV_Assert(_testImgDescriptors[i].rows == 1); + CV_Assert(_testImgDescriptors[i].cols == clTree.cols); + CV_Assert(_testImgDescriptors[i].type() == CV_32F); + } + } + + for (size_t i = 0; i < queryImgDescriptors.size(); i++) { + CV_Assert(!queryImgDescriptors[i].empty()); + CV_Assert(queryImgDescriptors[i].rows == 1); + CV_Assert(queryImgDescriptors[i].cols == clTree.cols); + CV_Assert(queryImgDescriptors[i].type() == CV_32F); + + // TODO: add mask + + compareImgDescriptor(queryImgDescriptors[i], + (int)i, _testImgDescriptors, matches); + } +} + +void FabMap::compareImgDescriptor(const Mat& queryImgDescriptor, + int queryIndex, const vector& _testImgDescriptors, + vector& matches) { + + vector queryMatches; + queryMatches.push_back(IMatch(queryIndex,-1, + getNewPlaceLikelihood(queryImgDescriptor),0)); + getLikelihoods(queryImgDescriptor,_testImgDescriptors,queryMatches); + normaliseDistribution(queryMatches); + for (size_t j = 1; j < queryMatches.size(); j++) { + queryMatches[j].queryIdx = queryIndex; + } + matches.insert(matches.end(), queryMatches.begin(), queryMatches.end()); +} + +void FabMap::getLikelihoods(const Mat& /*queryImgDescriptor*/, + const vector& /*testImgDescriptors*/, vector& /*matches*/) { + +} + +double FabMap::getNewPlaceLikelihood(const Mat& queryImgDescriptor) { + if (flags & MEAN_FIELD) { + double logP = 0; + bool zq, zpq; + if(flags & NAIVE_BAYES) { + for (int q = 0; q < clTree.cols; q++) { + zq = queryImgDescriptor.at(0,q) > 0; + + logP += log(Pzq(q, false) * PzqGeq(zq, false) + + Pzq(q, true) * PzqGeq(zq, true)); + } + } else { + for (int q = 0; q < clTree.cols; q++) { + zq = queryImgDescriptor.at(0,q) > 0; + zpq = queryImgDescriptor.at(0,pq(q)) > 0; + + double alpha, beta, p; + alpha = Pzq(q, zq) * PzqGeq(!zq, false) * PzqGzpq(q, !zq, zpq); + beta = Pzq(q, !zq) * PzqGeq(zq, false) * PzqGzpq(q, zq, zpq); + p = Pzq(q, false) * beta / (alpha + beta); + + alpha = Pzq(q, zq) * PzqGeq(!zq, true) * PzqGzpq(q, !zq, zpq); + beta = Pzq(q, !zq) * PzqGeq(zq, true) * PzqGzpq(q, zq, zpq); + p += Pzq(q, true) * beta / (alpha + beta); + + logP += log(p); + } + } + return logP; + } + + if (flags & SAMPLED) { + CV_Assert(!trainingImgDescriptors.empty()); + CV_Assert(numSamples > 0); + + vector sampledImgDescriptors; + + // TODO: this method can result in the same sample being added + // multiple times. Is this desired? + + for (int i = 0; i < numSamples; i++) { + int index = rand() % trainingImgDescriptors.size(); + sampledImgDescriptors.push_back(trainingImgDescriptors[index]); + } + + vector matches; + getLikelihoods(queryImgDescriptor,sampledImgDescriptors,matches); + + double averageLogLikelihood = -DBL_MAX + matches.front().likelihood + 1; + for (int i = 0; i < numSamples; i++) { + averageLogLikelihood = + logsumexp(matches[i].likelihood, averageLogLikelihood); + } + + return averageLogLikelihood - log((double)numSamples); + } + return 0; +} + +void FabMap::normaliseDistribution(vector& matches) { + CV_Assert(!matches.empty()); + + if (flags & MOTION_MODEL) { + + matches[0].match = matches[0].likelihood + log(Pnew); + + if (priorMatches.size() > 2) { + matches[1].match = matches[1].likelihood; + matches[1].match += log( + (2 * (1-mBias) * priorMatches[1].match + + priorMatches[1].match + + 2 * mBias * priorMatches[2].match) / 3); + for (size_t i = 2; i < priorMatches.size()-1; i++) { + matches[i].match = matches[i].likelihood; + matches[i].match += log( + (2 * (1-mBias) * priorMatches[i-1].match + + priorMatches[i].match + + 2 * mBias * priorMatches[i+1].match)/3); + } + matches[priorMatches.size()-1].match = + matches[priorMatches.size()-1].likelihood; + matches[priorMatches.size()-1].match += log( + (2 * (1-mBias) * priorMatches[priorMatches.size()-2].match + + priorMatches[priorMatches.size()-1].match + + 2 * mBias * priorMatches[priorMatches.size()-1].match)/3); + + for(size_t i = priorMatches.size(); i < matches.size(); i++) { + matches[i].match = matches[i].likelihood; + } + } else { + for(size_t i = 1; i < matches.size(); i++) { + matches[i].match = matches[i].likelihood; + } + } + + double logsum = -DBL_MAX + matches.front().match + 1; + + //calculate the normalising constant + for (size_t i = 0; i < matches.size(); i++) { + logsum = logsumexp(logsum, matches[i].match); + } + + //normalise + for (size_t i = 0; i < matches.size(); i++) { + matches[i].match = exp(matches[i].match - logsum); + } + + //smooth final probabilities + for (size_t i = 0; i < matches.size(); i++) { + matches[i].match = sFactor*matches[i].match + + (1 - sFactor)/matches.size(); + } + + //update our location priors + priorMatches = matches; + + } else { + + double logsum = -DBL_MAX + matches.front().likelihood + 1; + + for (size_t i = 0; i < matches.size(); i++) { + logsum = logsumexp(logsum, matches[i].likelihood); + } + for (size_t i = 0; i < matches.size(); i++) { + matches[i].match = exp(matches[i].likelihood - logsum); + } + for (size_t i = 0; i < matches.size(); i++) { + matches[i].match = sFactor*matches[i].match + + (1 - sFactor)/matches.size(); + } + } +} + +int FabMap::pq(int q) { + return (int)clTree.at(0,q); +} + +double FabMap::Pzq(int q, bool zq) { + return (zq) ? clTree.at(1,q) : 1 - clTree.at(1,q); +} + +double FabMap::PzqGzpq(int q, bool zq, bool zpq) { + if (zpq) { + return (zq) ? clTree.at(2,q) : 1 - clTree.at(2,q); + } else { + return (zq) ? clTree.at(3,q) : 1 - clTree.at(3,q); + } +} + +double FabMap::PzqGeq(bool zq, bool eq) { + if (eq) { + return (zq) ? PzGe : 1 - PzGe; + } else { + return (zq) ? PzGNe : 1 - PzGNe; + } +} + +double FabMap::PeqGL(int q, bool Lzq, bool eq) { + double alpha, beta; + alpha = PzqGeq(Lzq, true) * Pzq(q, true); + beta = PzqGeq(Lzq, false) * Pzq(q, false); + + if (eq) { + return alpha / (alpha + beta); + } else { + return 1 - (alpha / (alpha + beta)); + } +} + +double FabMap::PzqGL(int q, bool zq, bool /*zpq*/, bool Lzq) { + return PeqGL(q, Lzq, false) * PzqGeq(zq, false) + + PeqGL(q, Lzq, true) * PzqGeq(zq, true); +} + + +double FabMap::PzqGzpqL(int q, bool zq, bool zpq, bool Lzq) { + double p; + double alpha, beta; + + alpha = Pzq(q, zq) * PzqGeq(!zq, false) * PzqGzpq(q, !zq, zpq); + beta = Pzq(q, !zq) * PzqGeq( zq, false) * PzqGzpq(q, zq, zpq); + p = PeqGL(q, Lzq, false) * beta / (alpha + beta); + + alpha = Pzq(q, zq) * PzqGeq(!zq, true) * PzqGzpq(q, !zq, zpq); + beta = Pzq(q, !zq) * PzqGeq( zq, true) * PzqGzpq(q, zq, zpq); + p += PeqGL(q, Lzq, true) * beta / (alpha + beta); + + return p; +} + + +FabMap1::FabMap1(const Mat& _clTree, double _PzGe, double _PzGNe, int _flags, + int _numSamples) : FabMap(_clTree, _PzGe, _PzGNe, _flags, + _numSamples) { +} + +FabMap1::~FabMap1() { +} + +void FabMap1::getLikelihoods(const Mat& queryImgDescriptor, + const vector& testImgDescriptors, vector& matches) { + + for (size_t i = 0; i < testImgDescriptors.size(); i++) { + bool zq, zpq, Lzq; + double logP = 0; + for (int q = 0; q < clTree.cols; q++) { + + zq = queryImgDescriptor.at(0,q) > 0; + zpq = queryImgDescriptor.at(0,pq(q)) > 0; + Lzq = testImgDescriptors[i].at(0,q) > 0; + + logP += log((this->*PzGL)(q, zq, zpq, Lzq)); + + } + matches.push_back(IMatch(0,(int)i,logP,0)); + } +} + +FabMapLUT::FabMapLUT(const Mat& _clTree, double _PzGe, double _PzGNe, + int _flags, int _numSamples, int _precision) : +FabMap(_clTree, _PzGe, _PzGNe, _flags, _numSamples), precision(_precision) { + + int nWords = clTree.cols; + double precFactor = (double)pow(10.0, precision); + + table = new int[nWords][8]; + + for (int q = 0; q < nWords; q++) { + for (unsigned char i = 0; i < 8; i++) { + + bool Lzq = (bool) ((i >> 2) & 0x01); + bool zq = (bool) ((i >> 1) & 0x01); + bool zpq = (bool) (i & 1); + + table[q][i] = -(int)(log((this->*PzGL)(q, zq, zpq, Lzq)) + * precFactor); + } + } +} + +FabMapLUT::~FabMapLUT() { + delete[] table; +} + +void FabMapLUT::getLikelihoods(const Mat& queryImgDescriptor, + const vector& testImgDescriptors, vector& matches) { + + double precFactor = (double)pow(10.0, -precision); + + for (size_t i = 0; i < testImgDescriptors.size(); i++) { + unsigned long long int logP = 0; + for (int q = 0; q < clTree.cols; q++) { + logP += table[q][(queryImgDescriptor.at(0,pq(q)) > 0) + + ((queryImgDescriptor.at(0, q) > 0) << 1) + + ((testImgDescriptors[i].at(0,q) > 0) << 2)]; + } + matches.push_back(IMatch(0,(int)i,-precFactor*(double)logP,0)); + } +} + +FabMapFBO::FabMapFBO(const Mat& _clTree, double _PzGe, double _PzGNe, + int _flags, int _numSamples, double _rejectionThreshold, + double _PsGd, int _bisectionStart, int _bisectionIts) : +FabMap(_clTree, _PzGe, _PzGNe, _flags, _numSamples), PsGd(_PsGd), + rejectionThreshold(_rejectionThreshold), bisectionStart(_bisectionStart), + bisectionIts(_bisectionIts) { +} + + +FabMapFBO::~FabMapFBO() { +} + +void FabMapFBO::getLikelihoods(const Mat& queryImgDescriptor, + const vector& testImgDescriptors, vector& matches) { + + std::multiset wordData; + setWordStatistics(queryImgDescriptor, wordData); + + vector matchIndices; + vector queryMatches; + + for (size_t i = 0; i < testImgDescriptors.size(); i++) { + queryMatches.push_back(IMatch(0,(int)i,0,0)); + matchIndices.push_back((int)i); + } + + double currBest = -DBL_MAX; + double bailedOut = DBL_MAX; + + for (std::multiset::iterator wordIter = wordData.begin(); + wordIter != wordData.end(); wordIter++) { + bool zq = queryImgDescriptor.at(0,wordIter->q) > 0; + bool zpq = queryImgDescriptor.at(0,pq(wordIter->q)) > 0; + + currBest = -DBL_MAX; + + for (size_t i = 0; i < matchIndices.size(); i++) { + bool Lzq = + testImgDescriptors[matchIndices[i]].at(0,wordIter->q) > 0; + queryMatches[matchIndices[i]].likelihood += + log((this->*PzGL)(wordIter->q,zq,zpq,Lzq)); + currBest = + std::max(queryMatches[matchIndices[i]].likelihood, currBest); + } + + if (matchIndices.size() == 1) + continue; + + double delta = std::max(limitbisection(wordIter->V, wordIter->M), + -log(rejectionThreshold)); + + vector::iterator matchIter = matchIndices.begin(); + while (matchIter != matchIndices.end()) { + if (currBest - queryMatches[*matchIter].likelihood > delta) { + queryMatches[*matchIter].likelihood = bailedOut; + matchIter = matchIndices.erase(matchIter); + } else { + matchIter++; + } + } + } + + for (size_t i = 0; i < queryMatches.size(); i++) { + if (queryMatches[i].likelihood == bailedOut) { + queryMatches[i].likelihood = currBest + log(rejectionThreshold); + } + } + matches.insert(matches.end(), queryMatches.begin(), queryMatches.end()); + +} + +void FabMapFBO::setWordStatistics(const Mat& queryImgDescriptor, + std::multiset& wordData) { + //words are sorted according to information = -ln(P(zq|zpq)) + //in non-log format this is lowest probability first + for (int q = 0; q < clTree.cols; q++) { + wordData.insert(WordStats(q,PzqGzpq(q, + queryImgDescriptor.at(0,q) > 0, + queryImgDescriptor.at(0,pq(q)) > 0))); + } + + double d = 0, V = 0, M = 0; + bool zq, zpq; + + for (std::multiset::reverse_iterator wordIter = + wordData.rbegin(); + wordIter != wordData.rend(); wordIter++) { + + zq = queryImgDescriptor.at(0,wordIter->q) > 0; + zpq = queryImgDescriptor.at(0,pq(wordIter->q)) > 0; + + d = log((this->*PzGL)(wordIter->q, zq, zpq, true)) - + log((this->*PzGL)(wordIter->q, zq, zpq, false)); + + V += pow(d, 2.0) * 2 * + (Pzq(wordIter->q, true) - pow(Pzq(wordIter->q, true), 2.0)); + M = std::max(M, fabs(d)); + + wordIter->V = V; + wordIter->M = M; + } +} + +double FabMapFBO::limitbisection(double v, double m) { + double midpoint, left_val, mid_val; + double left = 0, right = bisectionStart; + + left_val = bennettInequality(v, m, left) - PsGd; + + for(int i = 0; i < bisectionIts; i++) { + + midpoint = (left + right)*0.5; + mid_val = bennettInequality(v, m, midpoint)- PsGd; + + if(left_val * mid_val > 0) { + left = midpoint; + left_val = mid_val; + } else { + right = midpoint; + } + } + + return (right + left) * 0.5; +} + +double FabMapFBO::bennettInequality(double v, double m, double delta) { + double DMonV = delta * m / v; + double f_delta = log(DMonV + sqrt(pow(DMonV, 2.0) + 1)); + return exp((v / pow(m, 2.0))*(cosh(f_delta) - 1 - DMonV * f_delta)); +} + +bool FabMapFBO::compInfo(const WordStats& first, const WordStats& second) { + return first.info < second.info; +} + +FabMap2::FabMap2(const Mat& _clTree, double _PzGe, double _PzGNe, + int _flags) : +FabMap(_clTree, _PzGe, _PzGNe, _flags) { + CV_Assert(flags & SAMPLED); + + children.resize(clTree.cols); + + for (int q = 0; q < clTree.cols; q++) { + d1.push_back(log((this->*PzGL)(q, false, false, true) / + (this->*PzGL)(q, false, false, false))); + d2.push_back(log((this->*PzGL)(q, false, true, true) / + (this->*PzGL)(q, false, true, false)) - d1[q]); + d3.push_back(log((this->*PzGL)(q, true, false, true) / + (this->*PzGL)(q, true, false, false))- d1[q]); + d4.push_back(log((this->*PzGL)(q, true, true, true) / + (this->*PzGL)(q, true, true, false))- d1[q]); + children[pq(q)].push_back(q); + } + +} + +FabMap2::~FabMap2() { +} + + +void FabMap2::addTraining(const vector& queryImgDescriptors) { + for (size_t i = 0; i < queryImgDescriptors.size(); i++) { + CV_Assert(!queryImgDescriptors[i].empty()); + CV_Assert(queryImgDescriptors[i].rows == 1); + CV_Assert(queryImgDescriptors[i].cols == clTree.cols); + CV_Assert(queryImgDescriptors[i].type() == CV_32F); + trainingImgDescriptors.push_back(queryImgDescriptors[i]); + addToIndex(queryImgDescriptors[i], trainingDefaults, trainingInvertedMap); + } +} + + +void FabMap2::add(const vector& queryImgDescriptors) { + for (size_t i = 0; i < queryImgDescriptors.size(); i++) { + CV_Assert(!queryImgDescriptors[i].empty()); + CV_Assert(queryImgDescriptors[i].rows == 1); + CV_Assert(queryImgDescriptors[i].cols == clTree.cols); + CV_Assert(queryImgDescriptors[i].type() == CV_32F); + testImgDescriptors.push_back(queryImgDescriptors[i]); + addToIndex(queryImgDescriptors[i], testDefaults, testInvertedMap); + } +} + +void FabMap2::getLikelihoods(const Mat& queryImgDescriptor, + const vector& testImgDescriptors, vector& matches) { + + if (&testImgDescriptors== &(this->testImgDescriptors)) { + getIndexLikelihoods(queryImgDescriptor, testDefaults, testInvertedMap, + matches); + } else { + CV_Assert(!(flags & MOTION_MODEL)); + vector defaults; + std::map > invertedMap; + for (size_t i = 0; i < testImgDescriptors.size(); i++) { + addToIndex(testImgDescriptors[i],defaults,invertedMap); + } + getIndexLikelihoods(queryImgDescriptor, defaults, invertedMap, matches); + } +} + +double FabMap2::getNewPlaceLikelihood(const Mat& queryImgDescriptor) { + + CV_Assert(!trainingImgDescriptors.empty()); + + vector matches; + getIndexLikelihoods(queryImgDescriptor, trainingDefaults, + trainingInvertedMap, matches); + + double averageLogLikelihood = -DBL_MAX + matches.front().likelihood + 1; + for (size_t i = 0; i < matches.size(); i++) { + averageLogLikelihood = + logsumexp(matches[i].likelihood, averageLogLikelihood); + } + + return averageLogLikelihood - log((double)trainingDefaults.size()); + +} + +void FabMap2::addToIndex(const Mat& queryImgDescriptor, + vector& defaults, + std::map >& invertedMap) { + defaults.push_back(0); + for (int q = 0; q < clTree.cols; q++) { + if (queryImgDescriptor.at(0,q) > 0) { + defaults.back() += d1[q]; + invertedMap[q].push_back((int)defaults.size()-1); + } + } +} + +void FabMap2::getIndexLikelihoods(const Mat& queryImgDescriptor, + std::vector& defaults, + std::map >& invertedMap, + std::vector& matches) { + + vector::iterator LwithI, child; + + std::vector likelihoods = defaults; + + for (int q = 0; q < clTree.cols; q++) { + if (queryImgDescriptor.at(0,q) > 0) { + for (LwithI = invertedMap[q].begin(); + LwithI != invertedMap[q].end(); LwithI++) { + + if (queryImgDescriptor.at(0,pq(q)) > 0) { + likelihoods[*LwithI] += d4[q]; + } else { + likelihoods[*LwithI] += d3[q]; + } + } + for (child = children[q].begin(); child != children[q].end(); + child++) { + + if (queryImgDescriptor.at(0,*child) == 0) { + for (LwithI = invertedMap[*child].begin(); + LwithI != invertedMap[*child].end(); LwithI++) { + + likelihoods[*LwithI] += d2[*child]; + } + } + } + } + } + + for (size_t i = 0; i < likelihoods.size(); i++) { + matches.push_back(IMatch(0,(int)i,likelihoods[i],0)); + } +} + +} + +} diff --git a/modules/contrib/src/retinacolor.hpp b/modules/contrib/src/retinacolor.hpp index 67834629e..c3957cd3a 100644 --- a/modules/contrib/src/retinacolor.hpp +++ b/modules/contrib/src/retinacolor.hpp @@ -86,255 +86,255 @@ namespace cv { -class RetinaColor: public BasicRetinaFilter -{ -public: - /** - * @typedef which allows to select the type of photoreceptors color sampling - */ + class RetinaColor: public BasicRetinaFilter + { + public: + /** + * @typedef which allows to select the type of photoreceptors color sampling + */ - /** - * constructor of the retina color processing model - * @param NBrows: number of rows of the input image - * @param NBcolumns: number of columns of the input image - * @param samplingMethod: the chosen color sampling method - */ - RetinaColor(const unsigned int NBrows, const unsigned int NBcolumns, const RETINA_COLORSAMPLINGMETHOD samplingMethod=RETINA_COLOR_DIAGONAL); + /** + * constructor of the retina color processing model + * @param NBrows: number of rows of the input image + * @param NBcolumns: number of columns of the input image + * @param samplingMethod: the chosen color sampling method + */ + RetinaColor(const unsigned int NBrows, const unsigned int NBcolumns, const RETINA_COLORSAMPLINGMETHOD samplingMethod=RETINA_COLOR_DIAGONAL); - /** - * standard destructor - */ - virtual ~RetinaColor(); + /** + * standard destructor + */ + virtual ~RetinaColor(); - /** - * function that clears all buffers of the object - */ - void clearAllBuffers(); + /** + * function that clears all buffers of the object + */ + void clearAllBuffers(); - /** - * resize retina color filter object (resize all allocated buffers) - * @param NBrows: the new height size - * @param NBcolumns: the new width size - */ - void resize(const unsigned int NBrows, const unsigned int NBcolumns); + /** + * resize retina color filter object (resize all allocated buffers) + * @param NBrows: the new height size + * @param NBcolumns: the new width size + */ + void resize(const unsigned int NBrows, const unsigned int NBcolumns); - /** - * color multiplexing function: a demultiplexed RGB frame of size M*N*3 is transformed into a multiplexed M*N*1 pixels frame where each pixel is either Red, or Green or Blue - * @param inputRGBFrame: the input RGB frame to be processed - * @return, nothing but the multiplexed frame is available by the use of the getMultiplexedFrame() function - */ - inline void runColorMultiplexing(const std::valarray &inputRGBFrame){runColorMultiplexing(inputRGBFrame, *_multiplexedFrame);}; + /** + * color multiplexing function: a demultiplexed RGB frame of size M*N*3 is transformed into a multiplexed M*N*1 pixels frame where each pixel is either Red, or Green or Blue + * @param inputRGBFrame: the input RGB frame to be processed + * @return, nothing but the multiplexed frame is available by the use of the getMultiplexedFrame() function + */ + inline void runColorMultiplexing(const std::valarray &inputRGBFrame){runColorMultiplexing(inputRGBFrame, *_multiplexedFrame);}; - /** - * color multiplexing function: a demultipleed RGB frame of size M*N*3 is transformed into a multiplexed M*N*1 pixels frame where each pixel is either Red, or Green or Blue if using RGB images - * @param demultiplexedInputFrame: the demultiplexed input frame to be processed of size M*N*3 - * @param multiplexedFrame: the resulting multiplexed frame - */ - void runColorMultiplexing(const std::valarray &demultiplexedInputFrame, std::valarray &multiplexedFrame); + /** + * color multiplexing function: a demultipleed RGB frame of size M*N*3 is transformed into a multiplexed M*N*1 pixels frame where each pixel is either Red, or Green or Blue if using RGB images + * @param demultiplexedInputFrame: the demultiplexed input frame to be processed of size M*N*3 + * @param multiplexedFrame: the resulting multiplexed frame + */ + void runColorMultiplexing(const std::valarray &demultiplexedInputFrame, std::valarray &multiplexedFrame); - /** - * color demultiplexing function: a multiplexed frame of size M*N*1 pixels is transformed into a RGB demultiplexed M*N*3 pixels frame - * @param multiplexedColorFrame: the input multiplexed frame to be processed - * @param adaptiveFiltering: specifies if an adaptive filtering has to be perform rather than standard filtering (adaptive filtering allows a better rendering) - * @param maxInputValue: the maximum input data value (should be 255 for 8 bits images but it can change in the case of High Dynamic Range Images (HDRI) - * @return, nothing but the output demultiplexed frame is available by the use of the getDemultiplexedColorFrame() function, also use getLuminance() and getChrominance() in order to retreive either luminance or chrominance - */ - void runColorDemultiplexing(const std::valarray &multiplexedColorFrame, const bool adaptiveFiltering=false, const float maxInputValue=255.0); + /** + * color demultiplexing function: a multiplexed frame of size M*N*1 pixels is transformed into a RGB demultiplexed M*N*3 pixels frame + * @param multiplexedColorFrame: the input multiplexed frame to be processed + * @param adaptiveFiltering: specifies if an adaptive filtering has to be perform rather than standard filtering (adaptive filtering allows a better rendering) + * @param maxInputValue: the maximum input data value (should be 255 for 8 bits images but it can change in the case of High Dynamic Range Images (HDRI) + * @return, nothing but the output demultiplexed frame is available by the use of the getDemultiplexedColorFrame() function, also use getLuminance() and getChrominance() in order to retreive either luminance or chrominance + */ + void runColorDemultiplexing(const std::valarray &multiplexedColorFrame, const bool adaptiveFiltering=false, const float maxInputValue=255.0); - /** - * activate color saturation as the final step of the color demultiplexing process - * -> this saturation is a sigmoide function applied to each channel of the demultiplexed image. - * @param saturateColors: boolean that activates color saturation (if true) or desactivate (if false) - * @param colorSaturationValue: the saturation factor - * */ - void setColorSaturation(const bool saturateColors=true, const float colorSaturationValue=4.0){_saturateColors=saturateColors; _colorSaturationValue=colorSaturationValue;}; + /** + * activate color saturation as the final step of the color demultiplexing process + * -> this saturation is a sigmoide function applied to each channel of the demultiplexed image. + * @param saturateColors: boolean that activates color saturation (if true) or desactivate (if false) + * @param colorSaturationValue: the saturation factor + * */ + void setColorSaturation(const bool saturateColors=true, const float colorSaturationValue=4.0){_saturateColors=saturateColors; _colorSaturationValue=colorSaturationValue;}; - /** - * set parameters of the low pass spatio-temporal filter used to retreive the low chrominance - * @param beta: gain of the filter (generally set to zero) - * @param tau: time constant of the filter (unit is frame for video processing), typically 0 when considering static processing, 1 or more if a temporal smoothing effect is required - * @param k: spatial constant of the filter (unit is pixels), typical value is 2.5 - */ - void setChrominanceLPfilterParameters(const float beta, const float tau, const float k){setLPfilterParameters(beta, tau, k);}; + /** + * set parameters of the low pass spatio-temporal filter used to retreive the low chrominance + * @param beta: gain of the filter (generally set to zero) + * @param tau: time constant of the filter (unit is frame for video processing), typically 0 when considering static processing, 1 or more if a temporal smoothing effect is required + * @param k: spatial constant of the filter (unit is pixels), typical value is 2.5 + */ + void setChrominanceLPfilterParameters(const float beta, const float tau, const float k){setLPfilterParameters(beta, tau, k);}; - /** - * apply to the retina color output the Krauskopf transformation which leads to an opponent color system: output colorspace if Acr1cr2 if input of the retina was LMS color space - * @param result: the input buffer to fill with the transformed colorspace retina output - * @return true if process ended successfully - */ - bool applyKrauskopfLMS2Acr1cr2Transform(std::valarray &result); + /** + * apply to the retina color output the Krauskopf transformation which leads to an opponent color system: output colorspace if Acr1cr2 if input of the retina was LMS color space + * @param result: the input buffer to fill with the transformed colorspace retina output + * @return true if process ended successfully + */ + bool applyKrauskopfLMS2Acr1cr2Transform(std::valarray &result); - /** - * apply to the retina color output the CIE Lab color transformation - * @param result: the input buffer to fill with the transformed colorspace retina output - * @return true if process ended successfully - */ - bool applyLMS2LabTransform(std::valarray &result); + /** + * apply to the retina color output the CIE Lab color transformation + * @param result: the input buffer to fill with the transformed colorspace retina output + * @return true if process ended successfully + */ + bool applyLMS2LabTransform(std::valarray &result); - /** - * @return the multiplexed frame result (use this after function runColorMultiplexing) - */ - inline const std::valarray &getMultiplexedFrame() const {return *_multiplexedFrame;}; + /** + * @return the multiplexed frame result (use this after function runColorMultiplexing) + */ + inline const std::valarray &getMultiplexedFrame() const {return *_multiplexedFrame;}; - /** - * @return the demultiplexed frame result (use this after function runColorDemultiplexing) - */ - inline const std::valarray &getDemultiplexedColorFrame() const {return _demultiplexedColorFrame;}; + /** + * @return the demultiplexed frame result (use this after function runColorDemultiplexing) + */ + inline const std::valarray &getDemultiplexedColorFrame() const {return _demultiplexedColorFrame;}; - /** - * @return the luminance of the processed frame (use this after function runColorDemultiplexing) - */ - inline const std::valarray &getLuminance() const {return *_luminance;}; + /** + * @return the luminance of the processed frame (use this after function runColorDemultiplexing) + */ + inline const std::valarray &getLuminance() const {return *_luminance;}; - /** - * @return the chrominance of the processed frame (use this after function runColorDemultiplexing) - */ - inline const std::valarray &getChrominance() const {return _chrominance;}; + /** + * @return the chrominance of the processed frame (use this after function runColorDemultiplexing) + */ + inline const std::valarray &getChrominance() const {return _chrominance;}; - /** - * standard 0 to 255 image clipping function appled to RGB images (of size M*N*3 pixels) - * @param inputOutputBuffer: the image to be normalized (rewrites the input), if no parameter, then, the built in buffer reachable by getOutput() function is normalized - * @param maxOutputValue: the maximum value allowed at the output (values superior to it would be clipped - */ - void clipRGBOutput_0_maxInputValue(float *inputOutputBuffer, const float maxOutputValue=255.0); + /** + * standard 0 to 255 image clipping function appled to RGB images (of size M*N*3 pixels) + * @param inputOutputBuffer: the image to be normalized (rewrites the input), if no parameter, then, the built in buffer reachable by getOutput() function is normalized + * @param maxOutputValue: the maximum value allowed at the output (values superior to it would be clipped + */ + void clipRGBOutput_0_maxInputValue(float *inputOutputBuffer, const float maxOutputValue=255.0); - /** - * standard 0 to 255 image normalization function appled to RGB images (of size M*N*3 pixels) - * @param maxOutputValue: the maximum value allowed at the output (values superior to it would be clipped - */ - void normalizeRGBOutput_0_maxOutputValue(const float maxOutputValue=255.0); + /** + * standard 0 to 255 image normalization function appled to RGB images (of size M*N*3 pixels) + * @param maxOutputValue: the maximum value allowed at the output (values superior to it would be clipped + */ + void normalizeRGBOutput_0_maxOutputValue(const float maxOutputValue=255.0); - /** - * return the color sampling map: a Nrows*Mcolumns image in which each pixel value is the ofsset adress which gives the adress of the sampled pixel on an Nrows*Mcolumns*3 color image ordered by layers: layer1, layer2, layer3 - */ - inline const std::valarray &getSamplingMap() const {return _colorSampling;}; + /** + * return the color sampling map: a Nrows*Mcolumns image in which each pixel value is the ofsset adress which gives the adress of the sampled pixel on an Nrows*Mcolumns*3 color image ordered by layers: layer1, layer2, layer3 + */ + inline const std::valarray &getSamplingMap() const {return _colorSampling;}; - /** - * function used (to bypass processing) to manually set the color output - * @param demultiplexedImage: the color image (luminance+chrominance) which has to be written in the object buffer - */ - inline void setDemultiplexedColorFrame(const std::valarray &demultiplexedImage){_demultiplexedColorFrame=demultiplexedImage;}; + /** + * function used (to bypass processing) to manually set the color output + * @param demultiplexedImage: the color image (luminance+chrominance) which has to be written in the object buffer + */ + inline void setDemultiplexedColorFrame(const std::valarray &demultiplexedImage){_demultiplexedColorFrame=demultiplexedImage;}; -protected: + protected: - // private functions - RETINA_COLORSAMPLINGMETHOD _samplingMethod; - bool _saturateColors; - float _colorSaturationValue; - // links to parent buffers (more convienient names - TemplateBuffer *_luminance; - std::valarray *_multiplexedFrame; - // instance buffers - std::valarray _colorSampling; // table (size (_nbRows*_nbColumns) which specifies the color of each pixel - std::valarray _RGBmosaic; - std::valarray _tempMultiplexedFrame; - std::valarray _demultiplexedTempBuffer; - std::valarray _demultiplexedColorFrame; - std::valarray _chrominance; - std::valarray _colorLocalDensity;// buffer which contains the local density of the R, G and B photoreceptors for a normalization use - std::valarray _imageGradient; + // private functions + RETINA_COLORSAMPLINGMETHOD _samplingMethod; + bool _saturateColors; + float _colorSaturationValue; + // links to parent buffers (more convienient names + TemplateBuffer *_luminance; + std::valarray *_multiplexedFrame; + // instance buffers + std::valarray _colorSampling; // table (size (_nbRows*_nbColumns) which specifies the color of each pixel + std::valarray _RGBmosaic; + std::valarray _tempMultiplexedFrame; + std::valarray _demultiplexedTempBuffer; + std::valarray _demultiplexedColorFrame; + std::valarray _chrominance; + std::valarray _colorLocalDensity;// buffer which contains the local density of the R, G and B photoreceptors for a normalization use + std::valarray _imageGradient; - // variables - float _pR, _pG, _pB; // probabilities of color R, G and B - bool _objectInit; + // variables + float _pR, _pG, _pB; // probabilities of color R, G and B + bool _objectInit; - // protected functions - void _initColorSampling(); - void _interpolateImageDemultiplexedImage(float *inputOutputBuffer); - void _interpolateSingleChannelImage111(float *inputOutputBuffer); - void _interpolateBayerRGBchannels(float *inputOutputBuffer); - void _applyRIFfilter(const float *sourceBuffer, float *destinationBuffer); - void _getNormalizedContoursImage(const float *inputFrame, float *outputFrame); - // -> special adaptive filters dedicated to low pass filtering on the chrominance (skeeps filtering on the edges) - void _adaptiveSpatialLPfilter(const float *inputFrame, float *outputFrame); - void _adaptiveHorizontalCausalFilter_addInput(const float *inputFrame, float *outputFrame, const unsigned int IDrowStart, const unsigned int IDrowEnd); // TBB parallelized - void _adaptiveVerticalAnticausalFilter_multGain(float *outputFrame, const unsigned int IDcolumnStart, const unsigned int IDcolumnEnd); - void _computeGradient(const float *luminance); - void _normalizeOutputs_0_maxOutputValue(void); + // protected functions + void _initColorSampling(); + void _interpolateImageDemultiplexedImage(float *inputOutputBuffer); + void _interpolateSingleChannelImage111(float *inputOutputBuffer); + void _interpolateBayerRGBchannels(float *inputOutputBuffer); + void _applyRIFfilter(const float *sourceBuffer, float *destinationBuffer); + void _getNormalizedContoursImage(const float *inputFrame, float *outputFrame); + // -> special adaptive filters dedicated to low pass filtering on the chrominance (skeeps filtering on the edges) + void _adaptiveSpatialLPfilter(const float *inputFrame, float *outputFrame); + void _adaptiveHorizontalCausalFilter_addInput(const float *inputFrame, float *outputFrame, const unsigned int IDrowStart, const unsigned int IDrowEnd); // TBB parallelized + void _adaptiveVerticalAnticausalFilter_multGain(float *outputFrame, const unsigned int IDcolumnStart, const unsigned int IDcolumnEnd); + void _computeGradient(const float *luminance); + void _normalizeOutputs_0_maxOutputValue(void); - // color space transform - void _applyImageColorSpaceConversion(const std::valarray &inputFrame, std::valarray &outputFrame, const float *transformTable); + // color space transform + void _applyImageColorSpaceConversion(const std::valarray &inputFrame, std::valarray &outputFrame, const float *transformTable); #ifdef MAKE_PARALLEL -/****************************************************** -** IF some parallelizing thread methods are available, then, main loops are parallelized using these functors -** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary -** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised -** ==> functors constructors can differ from the parameters used with their related serial functions -*/ + /****************************************************** + ** IF some parallelizing thread methods are available, then, main loops are parallelized using these functors + ** ==> main idea paralellise main filters loops, then, only the most used methods are parallelized... TODO : increase the number of parallelised methods as necessary + ** ==> functors names = Parallel_$$$ where $$$= the name of the serial method that is parallelised + ** ==> functors constructors can differ from the parameters used with their related serial functions + */ -/* Template : - class Parallel_ : public cv::ParallelLoopBody - { - private: + /* Template : + class Parallel_ : public cv::ParallelLoopBody + { + private: - public: - Parallel_() - : {} - - virtual void operator()( const cv::Range& r ) const { + public: + Parallel_() + : {} + + virtual void operator()( const cv::Range& r ) const { } - }: -*/ - class Parallel_adaptiveHorizontalCausalFilter_addInput: public cv::ParallelLoopBody - { - private: - float *outputFrame; - const float *inputFrame, *imageGradient; - const unsigned int nbColumns; - public: - Parallel_adaptiveHorizontalCausalFilter_addInput(const float *inputImg, float *bufferToProcess, const float *imageGrad, const unsigned int nbCols) - :outputFrame(bufferToProcess), inputFrame(inputImg), imageGradient(imageGrad), nbColumns(nbCols) {}; - - virtual void operator()( const Range& r ) const { - register float* outputPTR=outputFrame+r.start*nbColumns; - register const float* inputPTR=inputFrame+r.start*nbColumns; - register const float *imageGradientPTR= imageGradient+r.start*nbColumns; - for (int IDrow=r.start; IDrow!=r.end; ++IDrow) - { - register float result=0; - for (unsigned int index=0; indexmaxValue) - *inputOutputBufferPTR=maxValue; - else if (*inputOutputBufferPTRmaxValue) + *inputOutputBufferPTR=maxValue; + else if (*inputOutputBufferPTR class TemplateBuffer : public std::valarray -{ -public: - /** - * constructor for monodimensional array - * @param dim: the size of the vector + * @class TemplateBuffer + * @brief this class is a simple template memory buffer which contains basic functions to get information on or normalize the buffer content + * note that thanks to the parent STL template class "valarray", it is possible to perform easily operations on the full array such as addition, product etc. + * @author Alexandre BENOIT (benoit.alexandre.vision@gmail.com), helped by Gelu IONESCU (gelu.ionescu@lis.inpg.fr) + * creation date: september 2007 */ - TemplateBuffer(const size_t dim=0) - : std::valarray((type)0, dim) - { - _NBrows=1; - _NBcolumns=dim; - _NBdepths=1; - _NBpixels=dim; - _doubleNBpixels=2*dim; - } - - /** - * constructor by copy for monodimensional array - * @param pVal: the pointer to a buffer to copy - * @param dim: the size of the vector - */ - TemplateBuffer(const type* pVal, const size_t dim) - : std::valarray(pVal, dim) - { - _NBrows=1; - _NBcolumns=dim; - _NBdepths=1; - _NBpixels=dim; - _doubleNBpixels=2*dim; - } - - /** - * constructor for bidimensional array - * @param dimRows: the size of the vector - * @param dimColumns: the size of the vector - * @param depth: the number of layers of the buffer in its third dimension (3 of color images, 1 for gray images. - */ - TemplateBuffer(const size_t dimRows, const size_t dimColumns, const size_t depth=1) - : std::valarray((type)0, dimRows*dimColumns*depth) - { -#ifdef TEMPLATEBUFFERDEBUG - std::cout<<"TemplateBuffer::TemplateBuffer: new buffer, size="<(toCopy) + template class TemplateBuffer : public std::valarray { - memcpy(Buffer(), toCopy.Buffer(), this->size()); - }*/ - /** - * destructor - */ - virtual ~TemplateBuffer() - { -#ifdef TEMPLATEBUFFERDEBUG - std::cout<<"~TemplateBuffer"<::operator=(0);};//memset(Buffer(), 0, sizeof(type)*_NBpixels);}; - - /** - * @return the numbers of rows (height) of the images used by the object - */ - inline unsigned int getNBrows(){return (unsigned int)_NBrows;}; - - /** - * @return the numbers of columns (width) of the images used by the object - */ - inline unsigned int getNBcolumns(){return (unsigned int)_NBcolumns;}; - - /** - * @return the numbers of pixels (width*height) of the images used by the object - */ - inline unsigned int getNBpixels(){return (unsigned int)_NBpixels;}; - - /** - * @return the numbers of pixels (width*height) of the images used by the object - */ - inline unsigned int getDoubleNBpixels(){return (unsigned int)_doubleNBpixels;}; - - /** - * @return the numbers of depths (3rd dimension: 1 for gray images, 3 for rgb images) of the images used by the object - */ - inline unsigned int getDepthSize(){return (unsigned int)_NBdepths;}; - - /** - * resize the buffer and recompute table index etc. - */ - void resizeBuffer(const size_t dimRows, const size_t dimColumns, const size_t depth=1) - { - this->resize(dimRows*dimColumns*depth); - _NBrows=dimRows; - _NBcolumns=dimColumns; - _NBdepths=depth; - _NBpixels=dimRows*dimColumns; - _doubleNBpixels=2*dimRows*dimColumns; - } - - inline TemplateBuffer & operator=(const std::valarray &b) - { - //std::cout<<"TemplateBuffer & operator= affect vector: "<::operator=(b); - return *this; - } - - inline TemplateBuffer & operator=(const type &b) - { - //std::cout<<"TemplateBuffer & operator= affect value: "<::operator=(b); - return *this; - } - - /* inline const type &operator[](const unsigned int &b) - { - return (*this)[b]; - } - */ - /** - * @return the buffer adress in non const mode - */ - inline type* Buffer() { return &(*this)[0]; } - - /////////////////////////////////////////////////////// - // Standard Image manipulation functions - - /** - * standard 0 to 255 image normalization function - * @param inputOutputBuffer: the image to be normalized (rewrites the input), if no parameter, then, the built in buffer reachable by getOutput() function is normalized - * @param nbPixels: specifies the number of pixel on which the normalization should be performed, if 0, then all pixels specified in the constructor are processed - * @param maxOutputValue: the maximum output value - */ - static void normalizeGrayOutput_0_maxOutputValue(type *inputOutputBuffer, const size_t nbPixels, const type maxOutputValue=(type)255.0); - - /** - * standard 0 to 255 image normalization function - * @param inputOutputBuffer: the image to be normalized (rewrites the input), if no parameter, then, the built in buffer reachable by getOutput() function is normalized - * @param nbPixels: specifies the number of pixel on which the normalization should be performed, if 0, then all pixels specified in the constructor are processed - * @param maxOutputValue: the maximum output value - */ - void normalizeGrayOutput_0_maxOutputValue(const type maxOutputValue=(type)255.0){normalizeGrayOutput_0_maxOutputValue(this->Buffer(), this->size(), maxOutputValue);}; - - /** - * sigmoide image normalization function (saturates min and max values) - * @param meanValue: specifies the mean value of th pixels to be processed - * @param sensitivity: strenght of the sigmoide - * @param inputPicture: the image to be normalized if no parameter, then, the built in buffer reachable by getOutput() function is normalized - * @param outputBuffer: the ouput buffer on which the result is writed, if no parameter, then, the built in buffer reachable by getOutput() function is normalized - * @param maxOutputValue: the maximum output value - */ - static void normalizeGrayOutputCentredSigmoide(const type meanValue, const type sensitivity, const type maxOutputValue, type *inputPicture, type *outputBuffer, const unsigned int nbPixels); - - /** - * sigmoide image normalization function on the current buffer (saturates min and max values) - * @param meanValue: specifies the mean value of th pixels to be processed - * @param sensitivity: strenght of the sigmoide - * @param maxOutputValue: the maximum output value - */ - inline void normalizeGrayOutputCentredSigmoide(const type meanValue=(type)0.0, const type sensitivity=(type)2.0, const type maxOutputValue=(type)255.0){ (void)maxOutputValue; normalizeGrayOutputCentredSigmoide(meanValue, sensitivity, 255.0, this->Buffer(), this->Buffer(), this->getNBpixels());}; - - /** - * sigmoide image normalization function (saturates min and max values), in this function, the sigmoide is centered on low values (high saturation of the medium and high values - * @param inputPicture: the image to be normalized if no parameter, then, the built in buffer reachable by getOutput() function is normalized - * @param outputBuffer: the ouput buffer on which the result is writed, if no parameter, then, the built in buffer reachable by getOutput() function is normalized - * @param sensitivity: strenght of the sigmoide - * @param maxOutputValue: the maximum output value - */ - void normalizeGrayOutputNearZeroCentreredSigmoide(type *inputPicture=(type*)NULL, type *outputBuffer=(type*)NULL, const type sensitivity=(type)40, const type maxOutputValue=(type)255.0); - - /** - * center and reduct the image (image-mean)/std - * @param inputOutputBuffer: the image to be normalized if no parameter, the result is rewrited on it - */ - void centerReductImageLuminance(type *inputOutputBuffer=(type*)NULL); - - /** - * @return standard deviation of the buffer - */ - double getStandardDeviation() - { - double standardDeviation=0; - double meanValue=getMean(); - - type *bufferPTR=Buffer(); - for (unsigned int i=0;isize();++i) + /** + * constructor for monodimensional array + * @param dim: the size of the vector + */ + TemplateBuffer(const size_t dim=0) + : std::valarray((type)0, dim) { - double diff=(*(bufferPTR++)-meanValue); - standardDeviation+=diff*diff; + _NBrows=1; + _NBcolumns=dim; + _NBdepths=1; + _NBpixels=dim; + _doubleNBpixels=2*dim; } - return sqrt(standardDeviation/this->size()); + + /** + * constructor by copy for monodimensional array + * @param pVal: the pointer to a buffer to copy + * @param dim: the size of the vector + */ + TemplateBuffer(const type* pVal, const size_t dim) + : std::valarray(pVal, dim) + { + _NBrows=1; + _NBcolumns=dim; + _NBdepths=1; + _NBpixels=dim; + _doubleNBpixels=2*dim; + } + + /** + * constructor for bidimensional array + * @param dimRows: the size of the vector + * @param dimColumns: the size of the vector + * @param depth: the number of layers of the buffer in its third dimension (3 of color images, 1 for gray images. + */ + TemplateBuffer(const size_t dimRows, const size_t dimColumns, const size_t depth=1) + : std::valarray((type)0, dimRows*dimColumns*depth) + { +#ifdef TEMPLATEBUFFERDEBUG + std::cout<<"TemplateBuffer::TemplateBuffer: new buffer, size="<(toCopy) + { + memcpy(Buffer(), toCopy.Buffer(), this->size()); + }*/ + /** + * destructor + */ + virtual ~TemplateBuffer() + { +#ifdef TEMPLATEBUFFERDEBUG + std::cout<<"~TemplateBuffer"<::operator=(0);};//memset(Buffer(), 0, sizeof(type)*_NBpixels);}; + + /** + * @return the numbers of rows (height) of the images used by the object + */ + inline unsigned int getNBrows(){return (unsigned int)_NBrows;}; + + /** + * @return the numbers of columns (width) of the images used by the object + */ + inline unsigned int getNBcolumns(){return (unsigned int)_NBcolumns;}; + + /** + * @return the numbers of pixels (width*height) of the images used by the object + */ + inline unsigned int getNBpixels(){return (unsigned int)_NBpixels;}; + + /** + * @return the numbers of pixels (width*height) of the images used by the object + */ + inline unsigned int getDoubleNBpixels(){return (unsigned int)_doubleNBpixels;}; + + /** + * @return the numbers of depths (3rd dimension: 1 for gray images, 3 for rgb images) of the images used by the object + */ + inline unsigned int getDepthSize(){return (unsigned int)_NBdepths;}; + + /** + * resize the buffer and recompute table index etc. + */ + void resizeBuffer(const size_t dimRows, const size_t dimColumns, const size_t depth=1) + { + this->resize(dimRows*dimColumns*depth); + _NBrows=dimRows; + _NBcolumns=dimColumns; + _NBdepths=depth; + _NBpixels=dimRows*dimColumns; + _doubleNBpixels=2*dimRows*dimColumns; + } + + inline TemplateBuffer & operator=(const std::valarray &b) + { + //std::cout<<"TemplateBuffer & operator= affect vector: "<::operator=(b); + return *this; + } + + inline TemplateBuffer & operator=(const type &b) + { + //std::cout<<"TemplateBuffer & operator= affect value: "<::operator=(b); + return *this; + } + + /* inline const type &operator[](const unsigned int &b) + { + return (*this)[b]; + } + */ + /** + * @return the buffer adress in non const mode + */ + inline type* Buffer() { return &(*this)[0]; } + + /////////////////////////////////////////////////////// + // Standard Image manipulation functions + + /** + * standard 0 to 255 image normalization function + * @param inputOutputBuffer: the image to be normalized (rewrites the input), if no parameter, then, the built in buffer reachable by getOutput() function is normalized + * @param nbPixels: specifies the number of pixel on which the normalization should be performed, if 0, then all pixels specified in the constructor are processed + * @param maxOutputValue: the maximum output value + */ + static void normalizeGrayOutput_0_maxOutputValue(type *inputOutputBuffer, const size_t nbPixels, const type maxOutputValue=(type)255.0); + + /** + * standard 0 to 255 image normalization function + * @param inputOutputBuffer: the image to be normalized (rewrites the input), if no parameter, then, the built in buffer reachable by getOutput() function is normalized + * @param nbPixels: specifies the number of pixel on which the normalization should be performed, if 0, then all pixels specified in the constructor are processed + * @param maxOutputValue: the maximum output value + */ + void normalizeGrayOutput_0_maxOutputValue(const type maxOutputValue=(type)255.0){normalizeGrayOutput_0_maxOutputValue(this->Buffer(), this->size(), maxOutputValue);}; + + /** + * sigmoide image normalization function (saturates min and max values) + * @param meanValue: specifies the mean value of th pixels to be processed + * @param sensitivity: strenght of the sigmoide + * @param inputPicture: the image to be normalized if no parameter, then, the built in buffer reachable by getOutput() function is normalized + * @param outputBuffer: the ouput buffer on which the result is writed, if no parameter, then, the built in buffer reachable by getOutput() function is normalized + * @param maxOutputValue: the maximum output value + */ + static void normalizeGrayOutputCentredSigmoide(const type meanValue, const type sensitivity, const type maxOutputValue, type *inputPicture, type *outputBuffer, const unsigned int nbPixels); + + /** + * sigmoide image normalization function on the current buffer (saturates min and max values) + * @param meanValue: specifies the mean value of th pixels to be processed + * @param sensitivity: strenght of the sigmoide + * @param maxOutputValue: the maximum output value + */ + inline void normalizeGrayOutputCentredSigmoide(const type meanValue=(type)0.0, const type sensitivity=(type)2.0, const type maxOutputValue=(type)255.0){ (void)maxOutputValue; normalizeGrayOutputCentredSigmoide(meanValue, sensitivity, 255.0, this->Buffer(), this->Buffer(), this->getNBpixels());}; + + /** + * sigmoide image normalization function (saturates min and max values), in this function, the sigmoide is centered on low values (high saturation of the medium and high values + * @param inputPicture: the image to be normalized if no parameter, then, the built in buffer reachable by getOutput() function is normalized + * @param outputBuffer: the ouput buffer on which the result is writed, if no parameter, then, the built in buffer reachable by getOutput() function is normalized + * @param sensitivity: strenght of the sigmoide + * @param maxOutputValue: the maximum output value + */ + void normalizeGrayOutputNearZeroCentreredSigmoide(type *inputPicture=(type*)NULL, type *outputBuffer=(type*)NULL, const type sensitivity=(type)40, const type maxOutputValue=(type)255.0); + + /** + * center and reduct the image (image-mean)/std + * @param inputOutputBuffer: the image to be normalized if no parameter, the result is rewrited on it + */ + void centerReductImageLuminance(type *inputOutputBuffer=(type*)NULL); + + /** + * @return standard deviation of the buffer + */ + double getStandardDeviation() + { + double standardDeviation=0; + double meanValue=getMean(); + + type *bufferPTR=Buffer(); + for (unsigned int i=0;isize();++i) + { + double diff=(*(bufferPTR++)-meanValue); + standardDeviation+=diff*diff; + } + return sqrt(standardDeviation/this->size()); + }; + + /** + * Clip buffer histogram + * @param minRatio: the minimum ratio of the lower pixel values, range=[0,1] and lower than maxRatio + * @param maxRatio: the aximum ratio of the higher pixel values, range=[0,1] and higher than minRatio + */ + void clipHistogram(double minRatio, double maxRatio, double maxOutputValue) + { + + if (minRatio>=maxRatio) + { + std::cerr<<"TemplateBuffer::clipHistogram: minRatio must be inferior to maxRatio, buffer unchanged"<max()*maxRatio; + const double minThreshold=(this->max()-this->min())*minRatio+this->min(); + + type *bufferPTR=this->Buffer(); + + double deltaH=maxThreshold; + double deltaL=maxThreshold; + + double updatedHighValue=maxThreshold; + double updatedLowValue=maxThreshold; + + for (unsigned int i=0;isize();++i) + { + double curentValue=(double)*(bufferPTR++); + + // updating "closest to the high threshold" pixel value + double highValueTest=maxThreshold-curentValue; + if (highValueTest>0) + { + if (deltaH>highValueTest) + { + deltaH=highValueTest; + updatedHighValue=curentValue; + } + } + + // updating "closest to the low threshold" pixel value + double lowValueTest=curentValue-minThreshold; + if (lowValueTest>0) + { + if (deltaL>lowValueTest) + { + deltaL=lowValueTest; + updatedLowValue=curentValue; + } + } + } + + std::cout<<"Tdebug"<max()"<max()<<"maxThreshold="<min()"<min()<<"minThreshold="<Buffer(); +#ifdef MAKE_PARALLEL // call the TemplateBuffer multitreaded clipping method + parallel_for_(cv::Range(0,this->size()), Parallel_clipBufferValues(bufferPTR, updatedLowValue, updatedHighValue)); +#else + + for (unsigned int i=0;isize();++i, ++bufferPTR) + { + if (*bufferPTRupdatedHighValue) + *bufferPTR=updatedHighValue; + } +#endif + normalizeGrayOutput_0_maxOutputValue(this->Buffer(), this->size(), maxOutputValue); + + } + + /** + * @return the mean value of the vector + */ + inline double getMean(){return this->sum()/this->size();}; + + protected: + size_t _NBrows; + size_t _NBcolumns; + size_t _NBdepths; + size_t _NBpixels; + size_t _doubleNBpixels; + // utilities + static type _abs(const type x); + }; - /** - * Clip buffer histogram - * @param minRatio: the minimum ratio of the lower pixel values, range=[0,1] and lower than maxRatio - * @param maxRatio: the aximum ratio of the higher pixel values, range=[0,1] and higher than minRatio - */ - void clipHistogram(double minRatio, double maxRatio, double maxOutputValue) + /////////////////////////////////////////////////////////////////////// + /// normalize output between 0 and 255, can be applied on images of different size that the declared size if nbPixels parameters is setted up; + template + void TemplateBuffer::normalizeGrayOutput_0_maxOutputValue(type *inputOutputBuffer, const size_t processedPixels, const type maxOutputValue) + { + type maxValue=inputOutputBuffer[0], minValue=inputOutputBuffer[0]; + + // get the min and max value + register type *inputOutputBufferPTR=inputOutputBuffer; + for (register size_t j = 0; j pixValue) + minValue = pixValue; + } + // change the range of the data to 0->255 + + type factor = maxOutputValue/(maxValue-minValue); + type offset = (type)(-minValue*factor); + + inputOutputBufferPTR=inputOutputBuffer; + for (register size_t j = 0; j < processedPixels; ++j, ++inputOutputBufferPTR) + *inputOutputBufferPTR=*(inputOutputBufferPTR)*factor+offset; + + } + // normalize data with a sigmoide close to 0 (saturates values for those superior to 0) + template + void TemplateBuffer::normalizeGrayOutputNearZeroCentreredSigmoide(type *inputBuffer, type *outputBuffer, const type sensitivity, const type maxOutputValue) + { + if (inputBuffer==NULL) + inputBuffer=Buffer(); + if (outputBuffer==NULL) + outputBuffer=Buffer(); + + type X0cube=sensitivity*sensitivity*sensitivity; + + register type *inputBufferPTR=inputBuffer; + register type *outputBufferPTR=outputBuffer; + + for (register size_t j = 0; j < _NBpixels; ++j, ++inputBufferPTR) + { + + type currentCubeLuminance=*inputBufferPTR**inputBufferPTR**inputBufferPTR; + *(outputBufferPTR++)=maxOutputValue*currentCubeLuminance/(currentCubeLuminance+X0cube); + } + } + + // normalize and adjust luminance with a centered to 128 sigmode + template + void TemplateBuffer::normalizeGrayOutputCentredSigmoide(const type meanValue, const type sensitivity, const type maxOutputValue, type *inputBuffer, type *outputBuffer, const unsigned int nbPixels) { - if (minRatio>=maxRatio) + if (sensitivity==1.0) { - std::cerr<<"TemplateBuffer::clipHistogram: minRatio must be inferior to maxRatio, buffer unchanged"<::normalizeGrayOutputCentredSigmoide error: 2nd parameter (sensitivity) must not equal 0, copying original data..."<max()*maxRatio; - const double minThreshold=(this->max()-this->min())*minRatio+this->min(); + register type *inputBufferPTR=inputBuffer; + register type *outputBufferPTR=outputBuffer; - type *bufferPTR=this->Buffer(); + for (register size_t j = 0; j < nbPixels; ++j, ++inputBufferPTR) + *(outputBufferPTR++)=(meanValue+(meanValue+X0)*(*(inputBufferPTR)-meanValue)/(_abs(*(inputBufferPTR)-meanValue)+X0)); - double deltaH=maxThreshold; - double deltaL=maxThreshold; + } - double updatedHighValue=maxThreshold; - double updatedLowValue=maxThreshold; + // center and reduct the image (image-mean)/std + template + void TemplateBuffer::centerReductImageLuminance(type *inputOutputBuffer) + { + // if outputBuffer unsassigned, the rewrite the buffer + if (inputOutputBuffer==NULL) + inputOutputBuffer=Buffer(); + type meanValue=0, stdValue=0; - for (unsigned int i=0;isize();++i) + // compute mean value + for (register size_t j = 0; j < _NBpixels; ++j) + meanValue+=inputOutputBuffer[j]; + meanValue/=((type)_NBpixels); + + // compute std value + register type *inputOutputBufferPTR=inputOutputBuffer; + for (size_t index=0;index<_NBpixels;++index) { - double curentValue=(double)*(bufferPTR++); - - // updating "closest to the high threshold" pixel value - double highValueTest=maxThreshold-curentValue; - if (highValueTest>0) - { - if (deltaH>highValueTest) - { - deltaH=highValueTest; - updatedHighValue=curentValue; - } - } - - // updating "closest to the low threshold" pixel value - double lowValueTest=curentValue-minThreshold; - if (lowValueTest>0) - { - if (deltaL>lowValueTest) - { - deltaL=lowValueTest; - updatedLowValue=curentValue; - } - } + type inputMinusMean=*(inputOutputBufferPTR++)-meanValue; + stdValue+=inputMinusMean*inputMinusMean; } - std::cout<<"Tdebug"<max()"<max()<<"maxThreshold="<min()"<min()<<"minThreshold="<Buffer(); -#ifdef MAKE_PARALLEL // call the TemplateBuffer multitreaded clipping method - parallel_for_(cv::Range(0,this->size()), Parallel_clipBufferValues(bufferPTR, updatedLowValue, updatedHighValue)); -#else - - for (unsigned int i=0;isize();++i, ++bufferPTR) - { - if (*bufferPTRupdatedHighValue) - *bufferPTR=updatedHighValue; - } -#endif - normalizeGrayOutput_0_maxOutputValue(this->Buffer(), this->size(), maxOutputValue); - + stdValue=sqrt(stdValue/((type)_NBpixels)); + // adjust luminance in regard of mean and std value; + inputOutputBufferPTR=inputOutputBuffer; + for (size_t index=0;index<_NBpixels;++index, ++inputOutputBufferPTR) + *inputOutputBufferPTR=(*(inputOutputBufferPTR)-meanValue)/stdValue; } - /** - * @return the mean value of the vector - */ - inline double getMean(){return this->sum()/this->size();}; -protected: - size_t _NBrows; - size_t _NBcolumns; - size_t _NBdepths; - size_t _NBpixels; - size_t _doubleNBpixels; - // utilities - static type _abs(const type x); - -}; - -/////////////////////////////////////////////////////////////////////// -/// normalize output between 0 and 255, can be applied on images of different size that the declared size if nbPixels parameters is setted up; -template -void TemplateBuffer::normalizeGrayOutput_0_maxOutputValue(type *inputOutputBuffer, const size_t processedPixels, const type maxOutputValue) -{ - type maxValue=inputOutputBuffer[0], minValue=inputOutputBuffer[0]; - - // get the min and max value - register type *inputOutputBufferPTR=inputOutputBuffer; - for (register size_t j = 0; j pixValue) - minValue = pixValue; - } - // change the range of the data to 0->255 - - type factor = maxOutputValue/(maxValue-minValue); - type offset = (type)(-minValue*factor); - - inputOutputBufferPTR=inputOutputBuffer; - for (register size_t j = 0; j < processedPixels; ++j, ++inputOutputBufferPTR) - *inputOutputBufferPTR=*(inputOutputBufferPTR)*factor+offset; - -} -// normalize data with a sigmoide close to 0 (saturates values for those superior to 0) -template -void TemplateBuffer::normalizeGrayOutputNearZeroCentreredSigmoide(type *inputBuffer, type *outputBuffer, const type sensitivity, const type maxOutputValue) -{ - if (inputBuffer==NULL) - inputBuffer=Buffer(); - if (outputBuffer==NULL) - outputBuffer=Buffer(); - - type X0cube=sensitivity*sensitivity*sensitivity; - - register type *inputBufferPTR=inputBuffer; - register type *outputBufferPTR=outputBuffer; - - for (register size_t j = 0; j < _NBpixels; ++j, ++inputBufferPTR) + template + type TemplateBuffer::_abs(const type x) { - type currentCubeLuminance=*inputBufferPTR**inputBufferPTR**inputBufferPTR; - *(outputBufferPTR++)=maxOutputValue*currentCubeLuminance/(currentCubeLuminance+X0cube); + if (x>0) + return x; + else + return -x; } -} -// normalize and adjust luminance with a centered to 128 sigmode -template -void TemplateBuffer::normalizeGrayOutputCentredSigmoide(const type meanValue, const type sensitivity, const type maxOutputValue, type *inputBuffer, type *outputBuffer, const unsigned int nbPixels) -{ - - if (sensitivity==1.0) + template < > + inline int TemplateBuffer::_abs(const int x) { - std::cerr<<"TemplateBuffer::TemplateBuffer::normalizeGrayOutputCentredSigmoide error: 2nd parameter (sensitivity) must not equal 0, copying original data..."< -void TemplateBuffer::centerReductImageLuminance(type *inputOutputBuffer) -{ - // if outputBuffer unsassigned, the rewrite the buffer - if (inputOutputBuffer==NULL) - inputOutputBuffer=Buffer(); - type meanValue=0, stdValue=0; - - // compute mean value - for (register size_t j = 0; j < _NBpixels; ++j) - meanValue+=inputOutputBuffer[j]; - meanValue/=((type)_NBpixels); - - // compute std value - register type *inputOutputBufferPTR=inputOutputBuffer; - for (size_t index=0;index<_NBpixels;++index) + template < > + inline double TemplateBuffer::_abs(const double x) { - type inputMinusMean=*(inputOutputBufferPTR++)-meanValue; - stdValue+=inputMinusMean*inputMinusMean; + return std::fabs(x); } - stdValue=sqrt(stdValue/((type)_NBpixels)); - // adjust luminance in regard of mean and std value; - inputOutputBufferPTR=inputOutputBuffer; - for (size_t index=0;index<_NBpixels;++index, ++inputOutputBufferPTR) - *inputOutputBufferPTR=(*(inputOutputBufferPTR)-meanValue)/stdValue; -} - - -template -type TemplateBuffer::_abs(const type x) -{ - - if (x>0) - return x; - else - return -x; -} - -template < > -inline int TemplateBuffer::_abs(const int x) -{ - return std::abs(x); -} -template < > -inline double TemplateBuffer::_abs(const double x) -{ - return std::fabs(x); -} - -template < > -inline float TemplateBuffer::_abs(const float x) -{ - return std::fabs(x); -} + template < > + inline float TemplateBuffer::_abs(const float x) + { + return std::fabs(x); + } } #endif diff --git a/modules/objdetect/src/linemod.cpp b/modules/objdetect/src/linemod.cpp index 3eff82a7a..d6d0227d9 100644 --- a/modules/objdetect/src/linemod.cpp +++ b/modules/objdetect/src/linemod.cpp @@ -856,8 +856,8 @@ bool DepthNormalPyramid::extractTemplate(Template& templ) const std::stable_sort(candidates.begin(), candidates.end()); // Use heuristic based on object area for initial distance threshold - int area = static_cast(no_mask ? normal.total() : countNonZero(local_mask)); - float distance = sqrtf(static_cast(area)) / sqrtf(static_cast(num_features)) + 1.5f; + float area = no_mask ? (float)normal.total() : (float)countNonZero(local_mask); + float distance = sqrtf(area) / sqrtf((float)num_features) + 1.5f; selectScatteredFeatures(candidates, templ.features, num_features, distance); // Size determined externally, needs to match templates for other modalities diff --git a/samples/cpp/fabmap/stlucia_test_small0000.jpeg b/samples/cpp/fabmap/stlucia_test_small0000.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..cc4d54ec7df592508593f17e0e8d323296b3c3cd GIT binary patch literal 30139 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 literal 0 HcmV?d00001 diff --git a/samples/cpp/fabmap/stlucia_test_small0001.jpeg b/samples/cpp/fabmap/stlucia_test_small0001.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..e849f49362baaf21758e89946050f251b1df0a45 GIT binary patch literal 32412 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

    k+vm-%)L-Yt7Dr???_do9 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

  • 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 literal 0 HcmV?d00001 diff --git a/samples/cpp/fabmap/stlucia_test_small0002.jpeg b/samples/cpp/fabmap/stlucia_test_small0002.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..1823ac138b7870fa49582a4913b2fca2d9ae1cb4 GIT binary patch literal 39202 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

    ZhFy-U+$Nfi;i9?L^j(cl!}K1 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 Zx}lGwatSwm3rHx)?+_7C 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 literal 0 HcmV?d00001 diff --git a/samples/cpp/fabmap/stlucia_test_small0005.jpeg b/samples/cpp/fabmap/stlucia_test_small0005.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..32a3c4e8f50a296ad410ed8fa8e23cc788f98c2a GIT binary patch literal 30569 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 literal 0 HcmV?d00001 diff --git a/samples/cpp/fabmap/stlucia_test_small0007.jpeg b/samples/cpp/fabmap/stlucia_test_small0007.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..443f1ffe21ca116640e6030112773d391ff8cefe GIT binary patch literal 36663 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

    #Iy`-|GqgX+FUMMo6WIP%|w z&{~Uasj>~p2^<@%Viw5K^fy%EBQA2(7kvp+$J+0JE#6zZKi3=Nr@sMAjwN|2J33GLXA zkA8P#({SmEQcYH#tMSaVac|FhblFdP5>(%~zC}a9qqfs{y*=`i!_zLK$ESO3iWarz zGhGU!PeUnb9X4fzq;h^>U+>ydY4BsIOQ_f3AT0X|WuaI8d)my3YB zRmaD^{A35g{r3FV405ejdO?>wJvm^Lbu6f-_uFMVOyJcPWKMECW*$&loNYlX1bTMZ z>lDu#rIn(YT8P?@+v<>$f95vn4-(AsIK^tgVOJ^%0C}X>&Cn^W8Q0O zu4;W4u48FSsx?-WrF^e`HrrCsHt2)s=(+U*Q%Yp1&brG1Xjk`s)sGhEeJx4BVZ{kn z^xmF@bw4Fe1vq*_o3~H%-BmwJX$zX-DiaswfNkX~o8M=pczdZ<&;+ek#+w1pXPH%K z@$1=J{X+0rUY?iSXH;=l6cz1AthAGFPU`sYirpfP&`M7fX$wwt+LS+2nM`$lNCYLZ z)K&hQH~4eKu)6(c^l13wj4+a)E%uqeUGIC};kNu|@a28R+f{Q`@pUuh-O|l|J{i3+g~W{-}(i~<*F9xH;Y1fG^ywe>EN$Dfgi(A)bxtbcqaS3V7Rm5Wk z!LdeF9asK)9A&?TeG5NjNT_(5##m7&-~FVD2*0Shjn35!Y|WGHZu<)#wr^aSleO(& z)JZboG=`Z;PeRE_z5Yaewq4V|3R!h>mYTc>?8jQj>uyYuf4;DJl8`3bm8HQeE5s+PVo}zu}N|X)m4+Q)-Po@VL#!uwP%v)$lYOxh1wnBoe zEbXs!k$;}W63j*pYdQj+EGno_v5Xg?x@9>H{Y}H2N4>u5c2}eLxP}jhzUu$%}a6f+gt*>SYktD#E5!aY! z{m3!y6Mp*`!SNi5@;VWeV@N{LWfNCt(0tFX+py;`%7gDiuWFt&n9CRFOds?N#*#tB|&)saWnG@HV*Q`ilx`@Md9I^z0!pfF_#r(1FIppZ&UPB;Gm>9PzuCx^uY*RM1P+;>e%GP=L} zyG*jbj+)S`VRTf)!W)tOr^cRzC8hN;>_^H9)9~Q%LEnt0Q!r@jEX>a9G0=n+CBLr< zKsM*OC-&UA%DgxDdd@tCq*{@0Pk#1T>K_{E7hgQkjIP~3rlez^eS{v zk?{ce#QcAK+Bli>eC`E}l`TTXsqj}&#c~>#T(7jXlvzXO2P3}FqvUmlGSpV-l|R&6 zTJPmZ;md=5JB`bq{vGsEn;)WqbNiO&A^4XD}!|snAuuiV&T!%tzwXZ5=9%&w=6UFzwcY};(F=jlx z!vuYUbv`5J5kVFo61}Ht7Ka(6!#c^DF&W#nMpDD_*AXXciNV)4x`QskC(9}st2N}r75@s~ah zs$<{9;ne=H!bq|0_Vy-DZO<)JsM<4|F&z)YYDC5oqtah+Bg-Un@xA{5mhj}h9`VeH zLRCtZ&D%G9er5c^Pb88rak4F2Rdn`R-jLRzQrls)B_j2B;Y+{BFSj4hYq=JwXGOC={gs0C0|Z=bheVdgF;u+F?|T{)`KSLBg7&N42f}Te8!y i9ynbB0_k;J+LoY;bS%`{J^c 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

    tkIW~St*5WinZof*8F13l{{XeN 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 b^DdR2P@tpsY1)=_OeyXUr%-Ik@jw6BE>48b literal 0 HcmV?d00001 diff --git a/samples/cpp/fabmap/stlucia_test_small0009.jpeg b/samples/cpp/fabmap/stlucia_test_small0009.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..ce51ea3f433dd8da70d6807aab66ad4d0bd568ba GIT binary patch literal 30311 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 Q0P5Bd{{R9EgOUXQ+3f_CF8}}l literal 0 HcmV?d00001 diff --git a/samples/cpp/fabmap/train_data_small.yml b/samples/cpp/fabmap/train_data_small.yml new file mode 100644 index 000000000..956cb9512 --- /dev/null +++ b/samples/cpp/fabmap/train_data_small.yml @@ -0,0 +1,9197 @@ +%YAML:1.0 +BOWImageDescs: !!opencv-matrix + rows: 162 + cols: 545 + dt: f + data: [ 1.27388537e-002, 0., 1.27388537e-002, 3.82165611e-002, + 1.91082805e-002, 0., 0., 6.36942685e-003, 0., 1.27388537e-002, 0., + 0., 6.36942685e-003, 1.27388537e-002, 6.36942685e-003, + 6.36942685e-003, 0., 1.27388537e-002, 2.54777074e-002, + 1.91082805e-002, 0., 1.91082805e-002, 1.91082805e-002, 0., 0., 0., + 1.27388537e-002, 0., 0., 1.27388537e-002, 6.36942685e-003, + 2.54777074e-002, 0., 6.36942685e-003, 0., 6.36942685e-003, 0., 0., + 1.27388537e-002, 1.27388537e-002, 6.36942685e-003, 0., + 6.36942685e-003, 0., 0., 6.36942685e-003, 0., 6.36942685e-003, + 2.54777074e-002, 6.36942685e-003, 0., 0., 6.36942685e-003, + 6.36942685e-003, 6.36942685e-003, 6.36942685e-003, + 6.36942685e-003, 0., 6.36942685e-003, 6.36942685e-003, 0., 0., 0., + 6.36942685e-003, 1.91082805e-002, 0., 0., 0., 6.36942685e-003, 0., + 1.27388537e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 6.36942685e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.27388537e-002, 6.36942685e-003, 0., 0., 0., 0., 0., + 6.36942685e-003, 2.54777074e-002, 0., 0., 0., 1.27388537e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, + 1.27388537e-002, 0., 6.36942685e-003, 0., 0., 6.36942685e-003, 0., + 0., 0., 6.36942685e-003, 0., 0., 0., 0., 6.36942685e-003, 0., + 6.36942685e-003, 0., 0., 0., 6.36942685e-003, 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.27388537e-002, 0., 0., 0., 6.36942685e-003, + 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.36942685e-003, 0., 6.36942685e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.27388537e-002, 0., 0., 0., 0., 0., + 1.27388537e-002, 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.27388537e-002, 6.36942685e-003, 0., 0., 0., + 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.27388537e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., + 1.27388537e-002, 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., + 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.36942685e-003, 0., 1.27388537e-002, 0., + 6.36942685e-003, 0., 0., 0., 6.36942685e-003, 0., 0., 0., + 1.27388537e-002, 0., 1.91082805e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, + 0., 0., 0., 0., 0., 1.27388537e-002, 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., + 0., 1.27388537e-002, 0., 0., 0., 0., 0., 6.36942685e-003, + 6.36942685e-003, 0., 1.27388537e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 6.36942685e-003, 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.36942685e-003, 6.36942685e-003, 6.36942685e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 1.27388537e-002, 0., 6.36942685e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.24719103e-002, + 2.24719103e-002, 5.61797759e-003, 2.80898884e-002, + 5.61797759e-003, 1.68539323e-002, 0., 0., 5.61797759e-003, 0., + 1.12359552e-002, 0., 1.68539323e-002, 0., 1.12359552e-002, 0., 0., + 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, + 5.61797759e-003, 1.12359552e-002, 2.24719103e-002, 0., 0., + 5.61797759e-003, 3.37078646e-002, 0., 5.61797759e-003, + 1.68539323e-002, 5.61797759e-003, 0., 0., 1.12359552e-002, + 1.12359552e-002, 1.12359552e-002, 0., 5.61797759e-003, + 3.37078646e-002, 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 0., 5.61797759e-003, 0., 0., + 1.68539323e-002, 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, + 0., 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 1.12359552e-002, 0., 0., 0., 0., + 1.68539323e-002, 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 1.68539323e-002, 0., 0., + 5.61797759e-003, 1.12359552e-002, 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 0., 1.68539323e-002, 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 0., 0., 1.12359552e-002, 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 0., 2.24719103e-002, 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 0., 1.12359552e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.12359552e-002, 0., + 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 1.68539323e-002, + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.12359552e-002, 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 3.37078646e-002, 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 1.12359552e-002, 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 5.61797759e-003, 0., 1.68539323e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.18343197e-002, 5.91715984e-003, 0., 3.55029590e-002, + 1.18343197e-002, 1.18343197e-002, 0., 0., 1.18343197e-002, 0., 0., + 5.91715984e-003, 5.91715984e-003, 1.18343197e-002, 0., 0., + 5.91715984e-003, 1.77514795e-002, 5.91715984e-003, 0., + 5.91715984e-003, 5.91715984e-003, 1.77514795e-002, 0., + 5.91715984e-003, 5.91715984e-003, 5.91715984e-003, 0., + 5.91715984e-003, 0., 5.91715984e-003, 0., 0., 1.18343197e-002, + 5.91715984e-003, 5.91715984e-003, 0., 0., 1.18343197e-002, 0., 0., + 5.91715984e-003, 0., 0., 0., 2.36686394e-002, 5.91715984e-003, + 5.91715984e-003, 1.18343197e-002, 0., 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 1.77514795e-002, 0., 5.91715984e-003, 0., 0., 0., + 0., 5.91715984e-003, 0., 0., 0., 0., 0., 5.91715984e-003, 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.18343197e-002, 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 5.91715984e-003, + 5.91715984e-003, 0., 0., 0., 1.18343197e-002, 0., 5.91715984e-003, + 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., + 1.77514795e-002, 0., 0., 5.91715984e-003, 0., 0., 1.18343197e-002, + 0., 5.91715984e-003, 5.91715984e-003, 0., 0., 0., 0., + 3.55029590e-002, 0., 0., 5.91715984e-003, 2.95857992e-002, 0., 0., + 0., 0., 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 5.91715984e-003, 0., 0., 0., + 0., 5.91715984e-003, 0., 1.77514795e-002, 0., 0., 0., 0., 0., 0., + 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., + 1.18343197e-002, 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 1.18343197e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 5.91715984e-003, 5.91715984e-003, 0., + 5.91715984e-003, 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 1.77514795e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 2.95857992e-002, 0., 0., 5.91715984e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.18343197e-002, 0., 0., 0., 5.91715984e-003, 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 0., 0., 1.77514795e-002, 0., 0., + 2.36686394e-002, 0., 5.91715984e-003, 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 1.18343197e-002, 0., 0., 5.91715984e-003, + 0., 0., 0., 5.91715984e-003, 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.18343197e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 1.18343197e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.18343197e-002, 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, + 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 0., 5.91715984e-003, 0., 1.18343197e-002, 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, + 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.10497242e-002, 0., 5.52486209e-003, 5.52486209e-003, 0., 0., 0., + 5.52486209e-003, 1.10497242e-002, 0., 0., 0., 1.10497242e-002, + 1.10497242e-002, 0., 5.52486209e-003, 0., 5.52486209e-003, + 1.10497242e-002, 0., 0., 5.52486209e-003, 1.65745858e-002, + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 5.52486209e-003, + 2.20994484e-002, 5.52486209e-003, 0., 0., 0., 1.10497242e-002, + 1.10497242e-002, 0., 5.52486209e-003, 1.10497242e-002, + 1.65745858e-002, 0., 0., 0., 5.52486209e-003, 0., 1.10497242e-002, + 5.52486209e-003, 0., 1.10497242e-002, 1.65745858e-002, 0., + 1.10497242e-002, 0., 0., 5.52486209e-003, 1.65745858e-002, 0., 0., + 5.52486209e-003, 2.76243109e-002, 5.52486209e-003, 0., 0., 0., 0., + 0., 0., 0., 1.10497242e-002, 0., 0., 0., 1.10497242e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., + 0., 0., 5.52486209e-003, 1.65745858e-002, 0., 1.10497242e-002, 0., + 0., 0., 0., 0., 5.52486209e-003, 5.52486209e-003, 0., 0., + 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 5.52486209e-003, + 1.10497242e-002, 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 0., 2.20994484e-002, 5.52486209e-003, 0., 5.52486209e-003, 0., + 5.52486209e-003, 1.10497242e-002, 0., 1.10497242e-002, 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 1.10497242e-002, 0., 0., 0., 5.52486209e-003, 0., + 0., 0., 0., 1.10497242e-002, 0., 0., 0., 0., 1.10497242e-002, + 1.10497242e-002, 0., 0., 0., 1.10497242e-002, 0., 0., + 1.10497242e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 5.52486209e-003, 1.10497242e-002, + 0., 0., 5.52486209e-003, 0., 5.52486209e-003, 0., 5.52486209e-003, + 1.10497242e-002, 0., 0., 1.10497242e-002, 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., + 0., 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 1.65745858e-002, + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., + 1.10497242e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 5.52486209e-003, 0., 5.52486209e-003, 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.10497242e-002, 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., + 0., 5.52486209e-003, 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., + 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 5.52486209e-003, + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 5.52486209e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., + 1.10497242e-002, 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, + 1.10497242e-002, 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 5.52486209e-003, 0., 5.52486209e-003, 0., 0., + 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., + 5.52486209e-003, 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 5.52486209e-003, 1.10497242e-002, + 0., 0., 0., 0., 0., 5.52486209e-003, 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.92307699e-002, 9.61538497e-003, 0., 9.61538497e-003, 0., + 1.92307699e-002, 9.61538497e-003, 0., 1.92307699e-002, 0., 0., 0., + 0., 1.92307699e-002, 1.92307699e-002, 1.92307699e-002, + 9.61538497e-003, 0., 1.92307699e-002, 0., 9.61538497e-003, 0., + 1.92307699e-002, 0., 1.92307699e-002, 0., 9.61538497e-003, 0., 0., + 9.61538497e-003, 0., 0., 1.92307699e-002, 0., 0., 0., + 9.61538497e-003, 9.61538497e-003, 0., 0., 0., 0., 0., + 1.92307699e-002, 0., 0., 2.88461559e-002, 0., 0., 9.61538497e-003, + 0., 9.61538497e-003, 0., 0., 0., 9.61538497e-003, 9.61538497e-003, + 0., 0., 0., 9.61538497e-003, 0., 9.61538497e-003, 0., 0., 0., 0., + 9.61538497e-003, 0., 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.61538497e-003, 0., 0., 0., 0., 1.92307699e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., + 9.61538497e-003, 9.61538497e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 3.84615399e-002, 9.61538497e-003, 0., 9.61538497e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.92307699e-002, + 9.61538497e-003, 0., 0., 9.61538497e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.61538497e-003, 0., 0., 0., 0., 0., 0., + 9.61538497e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.61538497e-003, 0., 0., 0., 0., 0., 0., + 9.61538497e-003, 0., 0., 0., 9.61538497e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 4.80769239e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., 9.61538497e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.92307699e-002, 2.88461559e-002, 9.61538497e-003, + 0., 0., 0., 9.61538497e-003, 9.61538497e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., 0., 0., + 1.92307699e-002, 0., 0., 0., 9.61538497e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.92307699e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.61538497e-003, 0., 1.92307699e-002, 0., 0., + 9.61538497e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., + 0., 0., 0., 9.61538497e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.92307699e-002, 9.61538497e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.61538497e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.61538497e-003, 0., 0., 2.88461559e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.61538497e-003, 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., 0., 0., + 9.61538497e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.61538497e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.39860138e-002, 6.99300691e-003, 6.99300691e-003, 0., + 6.99300691e-003, 6.99300691e-003, 0., 1.39860138e-002, + 6.99300691e-003, 0., 6.99300691e-003, 6.99300691e-003, + 1.39860138e-002, 6.99300691e-003, 0., 0., 0., 1.39860138e-002, 0., + 6.99300691e-003, 6.99300691e-003, 0., 6.99300691e-003, + 6.99300691e-003, 6.99300691e-003, 6.99300691e-003, + 2.79720277e-002, 0., 0., 2.09790207e-002, 0., 6.99300691e-003, 0., + 6.99300691e-003, 0., 6.99300691e-003, 0., 0., 3.49650346e-002, 0., + 0., 0., 0., 0., 0., 2.09790207e-002, 1.39860138e-002, + 6.99300691e-003, 6.99300691e-003, 0., 0., 1.39860138e-002, 0., 0., + 0., 0., 0., 0., 0., 1.39860138e-002, 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 6.99300691e-003, + 6.99300691e-003, 1.39860138e-002, 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 1.39860138e-002, 0., 0., 0., + 6.99300691e-003, 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 2.79720277e-002, 0., 0., 0., 2.09790207e-002, 0., + 0., 6.99300691e-003, 6.99300691e-003, 0., 0., 0., 6.99300691e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 6.99300691e-003, 0., 0., 6.99300691e-003, 0., 6.99300691e-003, 0., + 0., 6.99300691e-003, 0., 0., 6.99300691e-003, 0., 0., 0., + 6.99300691e-003, 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 6.99300691e-003, 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 2.09790207e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 6.99300691e-003, 0., 0., 0., 0., 1.39860138e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 0., 1.39860138e-002, 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.39860138e-002, 6.99300691e-003, 0., 0., 1.39860138e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., + 6.99300691e-003, 0., 1.39860138e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.99300691e-003, 0., 2.79720277e-002, 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.39860138e-002, 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 2.09790207e-002, 0., + 0., 6.99300691e-003, 0., 0., 0., 0., 1.39860138e-002, + 6.99300691e-003, 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 2.09790207e-002, + 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 6.99300691e-003, 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 7.29927002e-003, 0., 7.29927002e-003, 0., + 1.45985400e-002, 0., 7.29927002e-003, 1.45985400e-002, 0., + 1.45985400e-002, 7.29927002e-003, 1.45985400e-002, + 7.29927002e-003, 0., 0., 0., 2.18978096e-002, 0., 2.91970801e-002, + 7.29927002e-003, 0., 7.29927002e-003, 0., 0., 0., 1.45985400e-002, + 0., 0., 4.37956192e-002, 0., 7.29927002e-003, 0., 1.45985400e-002, + 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 7.29927002e-003, + 1.45985400e-002, 0., 7.29927002e-003, 2.18978096e-002, + 2.18978096e-002, 0., 0., 7.29927002e-003, 0., 0., 0., + 1.45985400e-002, 7.29927002e-003, 0., 0., 7.29927002e-003, 0., 0., + 0., 7.29927002e-003, 0., 0., 0., 0., 7.29927002e-003, + 2.91970801e-002, 0., 0., 0., 7.29927002e-003, 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 7.29927002e-003, 0., 7.29927002e-003, + 0., 0., 0., 1.45985400e-002, 1.45985400e-002, 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 7.29927002e-003, 0., 0., 0., + 1.45985400e-002, 0., 0., 0., 0., 1.45985400e-002, 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 7.29927002e-003, 0., 0., 0., + 2.91970801e-002, 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., 0., + 0., 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 1.45985400e-002, + 0., 0., 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.45985400e-002, 0., 1.45985400e-002, 0., 2.18978096e-002, + 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.29927002e-003, 0., 0., 0., 0., 0., 0., 1.45985400e-002, 0., + 0., 7.29927002e-003, 0., 0., 7.29927002e-003, 0., 7.29927002e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 1.45985400e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., + 1.45985400e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.45985400e-002, 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., 0., + 1.45985400e-002, 0., 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., + 0., 0., 0., 7.29927002e-003, 0., 0., 0., 7.29927002e-003, + 7.29927002e-003, 0., 1.45985400e-002, 0., 7.29927002e-003, 0., 0., + 0., 0., 7.29927002e-003, 0., 0., 0., 0., 0., 7.29927002e-003, 0., + 0., 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.29927002e-003, 0., 7.29927002e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.29927002e-003, 0., 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., + 0., 0., 7.29927002e-003, 0., 0., 0., 7.29927002e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.29927002e-003, 0., 0., 0., 0., + 6.41025649e-003, 6.41025649e-003, 1.92307699e-002, + 6.41025649e-003, 0., 1.28205130e-002, 0., 0., 0., 6.41025649e-003, + 1.28205130e-002, 1.28205130e-002, 0., 0., 6.41025649e-003, 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., + 6.41025649e-003, 6.41025649e-003, 6.41025649e-003, 0., 0., 0., + 6.41025649e-003, 0., 0., 6.41025649e-003, 6.41025649e-003, 0., + 6.41025649e-003, 6.41025649e-003, 0., 0., 1.92307699e-002, + 6.41025649e-003, 6.41025649e-003, 1.28205130e-002, + 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 6.41025649e-003, + 1.92307699e-002, 0., 0., 0., 0., 0., 0., 0., 0., 1.28205130e-002, + 0., 0., 6.41025649e-003, 1.28205130e-002, 0., 1.28205130e-002, 0., + 6.41025649e-003, 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., + 0., 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 1.28205130e-002, 0., 0., 0., + 1.28205130e-002, 6.41025649e-003, 0., 0., 0., 6.41025649e-003, + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 1.28205130e-002, 0., 0., 0., 6.41025649e-003, 0., + 1.92307699e-002, 0., 0., 1.28205130e-002, 3.20512839e-002, 0., 0., + 0., 0., 0., 1.28205130e-002, 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 1.92307699e-002, 0., 0., 0., + 6.41025649e-003, 6.41025649e-003, 0., 0., 6.41025649e-003, 0., + 1.28205130e-002, 0., 1.28205130e-002, 0., 0., 0., 1.28205130e-002, + 0., 3.20512839e-002, 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 6.41025649e-003, + 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 0., + 0., 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 1.28205130e-002, 6.41025649e-003, 0., + 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 0., 6.41025649e-003, + 1.28205130e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.41025649e-003, 0., 6.41025649e-003, 6.41025649e-003, 0., + 1.92307699e-002, 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., + 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., + 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 1.28205130e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 1.28205130e-002, 0., 0., 0., 0., 0., 6.41025649e-003, + 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 6.41025649e-003, + 0., 0., 2.56410260e-002, 0., 0., 0., 0., 0., 1.28205130e-002, 0., + 0., 0., 0., 1.28205130e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., + 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 6.41025649e-003, 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.61290318e-002, + 2.15053763e-002, 0., 5.37634408e-003, 2.68817209e-002, 0., + 1.07526882e-002, 1.61290318e-002, 0., 0., 5.37634408e-003, + 5.37634408e-003, 0., 1.07526882e-002, 0., 0., 0., 0., 0., 0., 0., + 1.07526882e-002, 1.07526882e-002, 5.37634408e-003, + 1.07526882e-002, 5.37634408e-003, 5.37634408e-003, 0., + 5.37634408e-003, 0., 5.37634408e-003, 5.37634408e-003, + 5.37634408e-003, 0., 0., 0., 0., 2.15053763e-002, 0., + 5.37634408e-003, 0., 0., 0., 0., 2.15053763e-002, 1.61290318e-002, + 2.68817209e-002, 0., 0., 0., 0., 0., 0., 0., 2.15053763e-002, 0., + 1.07526882e-002, 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.37634408e-003, 0., 5.37634408e-003, 5.37634408e-003, + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.37634408e-003, 0., 5.37634408e-003, + 1.07526882e-002, 0., 5.37634408e-003, 0., 5.37634408e-003, 0., + 5.37634408e-003, 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.07526882e-002, 0., 5.37634408e-003, 5.37634408e-003, 0., + 5.37634408e-003, 0., 5.37634408e-003, 5.37634408e-003, + 5.37634408e-003, 0., 0., 0., 5.37634408e-003, 0., 3.22580636e-002, + 0., 0., 5.37634408e-003, 1.61290318e-002, 5.37634408e-003, 0., + 5.37634408e-003, 0., 1.07526882e-002, 5.37634408e-003, 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 5.37634408e-003, + 5.37634408e-003, 1.07526882e-002, 5.37634408e-003, 0., + 2.68817209e-002, 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., + 1.07526882e-002, 0., 0., 0., 0., 5.37634408e-003, 1.61290318e-002, + 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.37634408e-003, 5.37634408e-003, 5.37634408e-003, 0., 0., + 1.07526882e-002, 0., 0., 0., 0., 0., 1.07526882e-002, 0., 0., 0., + 0., 0., 1.61290318e-002, 0., 1.07526882e-002, 0., 5.37634408e-003, + 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 1.07526882e-002, + 5.37634408e-003, 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 5.37634408e-003, 1.07526882e-002, 0., 0., 0., + 0., 5.37634408e-003, 5.37634408e-003, 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.07526882e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.37634408e-003, 0., 5.37634408e-003, 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 5.37634408e-003, 0., 5.37634408e-003, 0., 0., + 0., 1.07526882e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 5.37634408e-003, 0., 5.37634408e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 1.61290318e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., 5.37634408e-003, 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 5.37634408e-003, + 5.37634408e-003, 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 1.07526882e-002, 0., 0., 5.37634408e-003, 0., + 0., 5.37634408e-003, 0., 0., 0., 0., 0., 1.61290318e-002, 0., 0., + 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., 5.37634408e-003, + 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, + 5.37634408e-003, 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 5.37634408e-003, 0., 0., 5.37634408e-003, + 0., 1.01522841e-002, 0., 2.03045681e-002, 5.07614203e-003, 0., + 2.53807101e-002, 0., 5.07614203e-003, 0., 0., 5.07614203e-003, + 5.07614203e-003, 1.01522841e-002, 5.07614203e-003, 0., 0., 0., 0., + 1.01522841e-002, 1.52284261e-002, 5.07614203e-003, 0., + 5.07614203e-003, 0., 5.07614203e-003, 5.07614203e-003, 0., + 1.01522841e-002, 0., 1.52284261e-002, 0., 0., 0., 1.01522841e-002, + 0., 0., 5.07614203e-003, 5.07614203e-003, 1.01522841e-002, + 1.01522841e-002, 5.07614203e-003, 0., 5.07614203e-003, 0., 0., + 1.01522841e-002, 5.07614203e-003, 0., 2.03045681e-002, + 1.52284261e-002, 0., 1.01522841e-002, 0., 5.07614203e-003, + 5.07614203e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.01522841e-002, 0., 0., 0., 5.07614203e-003, 0., 1.01522841e-002, + 0., 0., 5.07614203e-003, 0., 0., 0., 0., 0., 5.07614203e-003, 0., + 0., 2.03045681e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.07614203e-003, 5.07614203e-003, 0., 5.07614203e-003, 0., 0., 0., + 5.07614203e-003, 0., 1.52284261e-002, 0., 5.07614203e-003, + 5.07614203e-003, 0., 0., 0., 1.01522841e-002, 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 0., 0., 5.07614203e-003, 0., 5.07614203e-003, + 0., 5.07614203e-003, 0., 0., 0., 1.52284261e-002, 0., + 5.07614203e-003, 5.07614203e-003, 5.07614203e-003, 0., 0., 0., 0., + 0., 5.07614203e-003, 0., 1.52284261e-002, 0., 5.07614203e-003, 0., + 0., 5.07614203e-003, 5.07614203e-003, 5.07614203e-003, + 5.07614203e-003, 0., 0., 5.07614203e-003, 5.07614203e-003, 0., + 5.07614203e-003, 0., 0., 0., 5.07614203e-003, 5.07614203e-003, 0., + 2.03045681e-002, 5.07614203e-003, 0., 0., 0., 0., 1.52284261e-002, + 0., 2.53807101e-002, 0., 5.07614203e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 1.01522841e-002, 0., 0., 5.07614203e-003, 0., + 0., 0., 0., 5.07614203e-003, 0., 0., 1.52284261e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.07614203e-003, 0., 0., + 1.01522841e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.07614203e-003, 0., 0., 1.01522841e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.07614203e-003, + 0., 5.07614203e-003, 0., 5.07614203e-003, 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 0., 0., 0., 0., 5.07614203e-003, 0., 0., 0., + 0., 0., 0., 5.07614203e-003, 0., 0., 0., 0., 1.01522841e-002, 0., + 5.07614203e-003, 2.53807101e-002, 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 5.07614203e-003, 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 2.03045681e-002, 0., 0., 5.07614203e-003, 0., + 0., 0., 0., 0., 0., 1.01522841e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.07614203e-003, 0., 0., 5.07614203e-003, 0., 0., 0., + 0., 5.07614203e-003, 0., 0., 0., 5.07614203e-003, 5.07614203e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.07614203e-003, 0., + 2.03045681e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 0., 0., 0., 0., 0., 0., 5.07614203e-003, + 5.07614203e-003, 0., 0., 0., 0., 0., 0., 5.07614203e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.07614203e-003, 0., 0., 0., + 5.07614203e-003, 0., 0., 0., 0., 0., 5.07614203e-003, 0., 0., + 5.07614203e-003, 0., 0., 0., 0., 0., 0., 0., 5.07614203e-003, 0., + 0., 0., 5.07614203e-003, 5.07614203e-003, 0., 0., 0., 0., 0., 0., + 0., 5.07614203e-003, 0., 0., 0., 0., 0., 0., 5.07614203e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 1.01522841e-002, 0., 0., 0., 0., + 1.01522841e-002, 0., 0., 0., 0., 5.07614203e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.01522841e-002, 5.07614203e-003, 0., 0., + 5.07614203e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.07614203e-003, 0., 0., 0., 0., 0., 5.07614203e-003, 0., 0., + 0., 0., 0., 0., 5.07614203e-003, 5.07614203e-003, 0., + 5.07614203e-003, 0., 5.07614203e-003, 0., 5.07614203e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.07614203e-003, 0., 0., 0., 0., 0., 5.07614203e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 2.13903747e-002, 0., 0., + 5.34759369e-003, 5.34759369e-003, 1.06951874e-002, + 5.34759369e-003, 5.34759369e-003, 1.06951874e-002, + 5.34759369e-003, 5.34759369e-003, 0., 0., 1.06951874e-002, 0., + 5.34759369e-003, 0., 5.34759369e-003, 0., 0., 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.60427801e-002, 5.34759369e-003, 5.34759369e-003, 0., 0., 0., 0., + 2.13903747e-002, 2.13903747e-002, 0., 3.20855603e-002, 0., 0., 0., + 5.34759369e-003, 1.06951874e-002, 0., 1.60427801e-002, + 5.34759369e-003, 5.34759369e-003, 0., 0., 0., 0., 1.06951874e-002, + 1.06951874e-002, 0., 0., 0., 0., 0., 0., 0., 0., 1.60427801e-002, + 5.34759369e-003, 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., 0., + 5.34759369e-003, 0., 0., 0., 5.34759369e-003, 0., 0., 0., 0., + 5.34759369e-003, 5.34759369e-003, 0., 5.34759369e-003, 0., 0., 0., + 0., 1.06951874e-002, 0., 0., 0., 1.06951874e-002, 0., 0., 0., + 5.34759369e-003, 0., 0., 5.34759369e-003, 5.34759369e-003, + 5.34759369e-003, 0., 0., 5.34759369e-003, 1.06951874e-002, + 5.34759369e-003, 5.34759369e-003, 0., 5.34759369e-003, 0., 0., 0., + 5.34759369e-003, 1.60427801e-002, 5.34759369e-003, + 5.34759369e-003, 0., 2.13903747e-002, 0., 0., 0., 0., 0., 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 1.06951874e-002, 5.34759369e-003, + 0., 0., 0., 0., 1.60427801e-002, 0., 0., 0., 5.34759369e-003, 0., + 0., 0., 0., 0., 2.13903747e-002, 0., 0., 0., 0., 1.06951874e-002, + 2.13903747e-002, 0., 5.88235296e-002, 0., 0., 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 0., 5.34759369e-003, 0., + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.34759369e-003, 0., 0., 5.34759369e-003, 0., 5.34759369e-003, + 0., 0., 0., 0., 0., 0., 5.34759369e-003, 5.34759369e-003, + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 5.34759369e-003, 0., + 5.34759369e-003, 5.34759369e-003, 0., 0., 0., 5.34759369e-003, 0., + 0., 1.06951874e-002, 0., 0., 0., 5.34759369e-003, 0., 0., 0., + 5.34759369e-003, 1.60427801e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.06951874e-002, 0., 0., 0., 0., 0., 0., + 0., 5.34759369e-003, 0., 5.34759369e-003, 0., 0., 0., 0., 0., 0., + 0., 2.13903747e-002, 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, + 5.34759369e-003, 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.06951874e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 5.34759369e-003, + 5.34759369e-003, 1.60427801e-002, 0., 0., 0., 0., 5.34759369e-003, + 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, 5.34759369e-003, 0., + 1.06951874e-002, 0., 0., 0., 0., 1.06951874e-002, 0., + 5.34759369e-003, 5.34759369e-003, 0., 5.34759369e-003, 0., + 5.34759369e-003, 5.34759369e-003, 0., 0., 0., 5.34759369e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 1.06951874e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.34759369e-003, 0., 1.06951874e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.34759369e-003, 0., 0., + 5.34759369e-003, 0., 0., 0., 0., 5.34759369e-003, 0., 0., 0., 0., + 0., 0., 0., 6.62251655e-003, 6.62251655e-003, 6.62251655e-003, 0., + 1.32450331e-002, 0., 0., 6.62251655e-003, 6.62251655e-003, 0., + 6.62251655e-003, 0., 1.98675506e-002, 6.62251655e-003, + 6.62251655e-003, 0., 6.62251655e-003, 1.98675506e-002, + 6.62251655e-003, 6.62251655e-003, 0., 0., 6.62251655e-003, 0., 0., + 0., 3.31125818e-002, 0., 6.62251655e-003, 1.32450331e-002, 0., + 1.32450331e-002, 6.62251655e-003, 0., 0., 0., 0., 0., 0., + 1.98675506e-002, 0., 0., 0., 0., 0., 0., 0., 1.32450331e-002, + 3.97351012e-002, 0., 6.62251655e-003, 6.62251655e-003, 0., 0., 0., + 1.98675506e-002, 0., 0., 0., 0., 0., 0., 6.62251655e-003, 0., 0., + 0., 0., 0., 0., 0., 1.32450331e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.64900662e-002, 0., 0., 0., 0., 0., 0., + 6.62251655e-003, 0., 0., 1.98675506e-002, 0., 6.62251655e-003, + 1.98675506e-002, 0., 0., 0., 0., 0., 0., 6.62251655e-003, + 6.62251655e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.62251655e-003, 0., 6.62251655e-003, 0., 1.32450331e-002, + 0., 0., 0., 1.32450331e-002, 0., 0., 6.62251655e-003, + 6.62251655e-003, 0., 0., 6.62251655e-003, 0., 0., 0., 0., + 1.98675506e-002, 0., 0., 0., 0., 0., 0., 1.32450331e-002, 0., 0., + 0., 2.64900662e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.62251655e-003, 0., 0., 0., 0., 0., 3.31125818e-002, 0., + 6.62251655e-003, 0., 0., 0., 0., 6.62251655e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.62251655e-003, + 6.62251655e-003, 0., 0., 0., 6.62251655e-003, 0., 0., 0., 0., 0., + 1.32450331e-002, 0., 0., 0., 0., 0., 0., 1.32450331e-002, 0., 0., + 0., 6.62251655e-003, 0., 6.62251655e-003, 0., 0., 0., 0., 0., 0., + 6.62251655e-003, 0., 0., 0., 0., 0., 0., 0., 1.32450331e-002, 0., + 0., 0., 0., 0., 0., 0., 6.62251655e-003, 1.32450331e-002, 0., + 6.62251655e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.62251655e-003, 6.62251655e-003, 0., 6.62251655e-003, 0., 0., 0., + 0., 0., 0., 6.62251655e-003, 0., 0., 0., 0., 6.62251655e-003, 0., + 6.62251655e-003, 1.98675506e-002, 0., 6.62251655e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.62251655e-003, 0., 0., 0., + 1.32450331e-002, 0., 0., 0., 0., 0., 6.62251655e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.62251655e-003, 0., 0., 0., 0., + 0., 0., 0., 6.62251655e-003, 0., 0., 0., 6.62251655e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 6.62251655e-003, 0., 0., 0., + 6.62251655e-003, 0., 6.62251655e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.62251655e-003, 6.62251655e-003, 0., 0., 6.62251655e-003, + 0., 0., 0., 0., 0., 0., 6.62251655e-003, 0., 0., 0., 0., 0., 0., + 0., 1.98675506e-002, 0., 0., 0., 0., 0., 1.32450331e-002, 0., 0., + 0., 0., 0., 0., 6.62251655e-003, 0., 6.62251655e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.62251655e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.62251655e-003, 0., 0., 0., 0., 1.32450331e-002, 0., 0., + 1.98675506e-002, 0., 0., 0., 6.62251655e-003, 0., 0., 0., + 6.62251655e-003, 0., 6.62251655e-003, 0., 0., 6.62251655e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.62251655e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.62251655e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.62251655e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.42857144e-002, 2.14285720e-002, 7.14285718e-003, + 3.57142873e-002, 0., 0., 7.14285718e-003, 7.14285718e-003, 0., 0., + 7.14285718e-003, 7.14285718e-003, 0., 7.14285718e-003, + 7.14285718e-003, 1.42857144e-002, 7.14285718e-003, + 2.85714287e-002, 0., 0., 7.14285718e-003, 0., 0., 0., + 2.85714287e-002, 0., 4.28571440e-002, 7.14285718e-003, 0., 0., 0., + 7.14285718e-003, 0., 0., 0., 0., 5.71428575e-002, 7.14285718e-003, + 0., 0., 7.14285718e-003, 1.42857144e-002, 7.14285718e-003, + 7.14285718e-003, 7.14285718e-003, 7.14285718e-003, + 5.71428575e-002, 0., 0., 0., 7.14285718e-003, 7.14285718e-003, 0., + 7.14285718e-003, 0., 0., 7.14285718e-003, 0., 0., 0., 0., + 7.14285718e-003, 7.14285718e-003, 0., 0., 7.14285718e-003, + 7.14285718e-003, 7.14285718e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.42857144e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, 7.14285718e-003, + 0., 0., 7.14285718e-003, 0., 0., 0., 0., 0., 7.14285718e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.42857144e-002, 0., 0., + 7.14285718e-003, 0., 0., 0., 4.28571440e-002, 0., 7.14285718e-003, + 7.14285718e-003, 2.14285720e-002, 0., 0., 0., 7.14285718e-003, 0., + 0., 0., 7.14285718e-003, 0., 0., 0., 0., 7.14285718e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.14285718e-003, 0., 0., 0., 7.14285718e-003, 7.14285718e-003, + 1.42857144e-002, 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., + 7.14285718e-003, 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.14285718e-003, 0., 7.14285718e-003, 0., + 0., 0., 7.14285718e-003, 0., 0., 0., 0., 7.14285718e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.42857144e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 2.85714287e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.42857144e-002, 0., 0., 0., 7.14285718e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., + 1.42857144e-002, 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., 0., + 0., 0., 7.14285718e-003, 7.14285718e-003, 0., 0., 0., 0., + 7.14285718e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, 0., 7.14285718e-003, + 0., 1.42857144e-002, 0., 0., 0., 7.14285718e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., + 0., 0., 0., 7.14285718e-003, 0., 7.14285718e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.14285718e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, + 7.14285718e-003, 0., 7.14285718e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, + 0., 7.14285718e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.14285718e-003, + 0., 0., 0., 0., 7.14285718e-003, 0., 0., 0., 0., 0., + 2.34375000e-002, 7.81250000e-003, 0., 7.81250000e-003, + 7.81250000e-003, 1.56250000e-002, 0., 1.56250000e-002, + 7.81250000e-003, 0., 7.81250000e-003, 7.81250000e-003, 0., + 2.34375000e-002, 0., 7.81250000e-003, 0., 0., 1.56250000e-002, + 7.81250000e-003, 0., 0., 0., 0., 7.81250000e-003, 0., + 7.81250000e-003, 0., 7.81250000e-003, 7.81250000e-003, 0., + 7.81250000e-003, 0., 7.81250000e-003, 0., 0., 0., 0., + 1.56250000e-002, 0., 0., 0., 7.81250000e-003, 0., 0., 0., + 2.34375000e-002, 7.81250000e-003, 1.56250000e-002, 0., + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 7.81250000e-003, 7.81250000e-003, 0., 0., 0., 0., + 7.81250000e-003, 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., + 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.81250000e-003, 2.34375000e-002, 0., 0., + 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.81250000e-003, 7.81250000e-003, 0., 0., + 0., 7.81250000e-003, 0., 0., 7.81250000e-003, 3.90625000e-002, 0., + 0., 0., 2.34375000e-002, 1.56250000e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 7.81250000e-003, + 7.81250000e-003, 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., + 0., 7.81250000e-003, 0., 7.81250000e-003, 0., 7.81250000e-003, + 7.81250000e-003, 0., 0., 0., 0., 7.81250000e-003, 7.81250000e-003, + 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 7.81250000e-003, 0., + 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 7.81250000e-003, 0., + 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.56250000e-002, 7.81250000e-003, 0., 0., 0., 7.81250000e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., + 1.56250000e-002, 0., 1.56250000e-002, 7.81250000e-003, 0., 0., 0., + 7.81250000e-003, 0., 7.81250000e-003, 0., 0., 0., 7.81250000e-003, + 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 7.81250000e-003, + 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.56250000e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.34375000e-002, 0., 7.81250000e-003, 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 1.56250000e-002, 0., 7.81250000e-003, + 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, + 0., 0., 7.81250000e-003, 0., 0., 0., 0., 7.81250000e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 7.81250000e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.81250000e-003, 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., + 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., + 0., 7.81250000e-003, 0., 0., 0., 7.81250000e-003, 0., + 5.15463902e-003, 5.15463902e-003, 0., 1.54639166e-002, 0., + 3.60824727e-002, 0., 0., 1.03092780e-002, 5.15463902e-003, + 1.03092780e-002, 0., 0., 1.54639166e-002, 5.15463902e-003, + 5.15463902e-003, 0., 5.15463902e-003, 5.15463902e-003, + 2.06185561e-002, 0., 5.15463902e-003, 1.54639166e-002, 0., 0., + 5.15463902e-003, 1.03092780e-002, 0., 5.15463902e-003, + 1.54639166e-002, 5.15463902e-003, 5.15463902e-003, + 5.15463902e-003, 5.15463902e-003, 1.03092780e-002, 0., + 5.15463902e-003, 0., 2.57731955e-002, 5.15463902e-003, 0., 0., 0., + 1.03092780e-002, 5.15463902e-003, 5.15463902e-003, 0., + 5.15463902e-003, 2.06185561e-002, 0., 0., 0., 0., 0., 0., + 1.03092780e-002, 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, + 2.06185561e-002, 0., 0., 0., 0., 0., 5.15463902e-003, 0., + 1.03092780e-002, 0., 0., 0., 0., 5.15463902e-003, 1.03092780e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., + 5.15463902e-003, 0., 5.15463902e-003, 5.15463902e-003, + 5.15463902e-003, 0., 0., 5.15463902e-003, 0., 1.03092780e-002, 0., + 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 5.15463902e-003, 0., + 0., 0., 0., 5.15463902e-003, 3.09278332e-002, 2.06185561e-002, + 5.15463902e-003, 1.03092780e-002, 0., 0., 0., 0., 0., + 2.57731955e-002, 0., 0., 0., 4.12371121e-002, 0., 0., 0., 0., + 1.03092780e-002, 0., 0., 0., 0., 0., 1.03092780e-002, 0., 0., 0., + 0., 5.15463902e-003, 0., 0., 5.15463902e-003, 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 5.15463902e-003, 0., 1.03092780e-002, + 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 5.15463902e-003, 5.15463902e-003, 0., + 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.03092780e-002, 0., 5.15463902e-003, 5.15463902e-003, 0., 0., 0., + 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 5.15463902e-003, 0., + 1.03092780e-002, 0., 0., 5.15463902e-003, 5.15463902e-003, + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 5.15463902e-003, 5.15463902e-003, 0., 0., + 0., 5.15463902e-003, 0., 0., 5.15463902e-003, 1.03092780e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, + 5.15463902e-003, 5.15463902e-003, 0., 5.15463902e-003, + 1.54639166e-002, 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.03092780e-002, 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.15463902e-003, 0., 1.03092780e-002, 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 2.06185561e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 1.03092780e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.54639166e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 5.15463902e-003, 0., 5.15463902e-003, 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, + 0., 0., 1.03092780e-002, 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 1.03092780e-002, 0., 0., 0., 0., 5.15463902e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, + 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.24637695e-003, 7.24637695e-003, 1.44927539e-002, + 1.44927539e-002, 0., 7.24637695e-003, 0., 0., 1.44927539e-002, 0., + 7.24637695e-003, 0., 1.44927539e-002, 1.44927539e-002, 0., 0., 0., + 7.24637695e-003, 7.24637695e-003, 1.44927539e-002, 0., 0., + 2.17391308e-002, 0., 0., 0., 3.62318829e-002, 7.24637695e-003, + 7.24637695e-003, 5.07246405e-002, 7.24637695e-003, + 1.44927539e-002, 0., 1.44927539e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.24637695e-003, 0., 2.17391308e-002, 0., 0., + 0., 7.24637695e-003, 0., 0., 7.24637695e-003, 0., 7.24637695e-003, + 0., 0., 0., 0., 0., 7.24637695e-003, 0., 7.24637695e-003, 0., 0., + 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.24637695e-003, 0., 0., 0., 7.24637695e-003, 1.44927539e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.24637695e-003, 0., 0., 0., + 7.24637695e-003, 3.62318829e-002, 2.17391308e-002, 0., + 7.24637695e-003, 0., 0., 7.24637695e-003, 0., 7.24637695e-003, + 1.44927539e-002, 0., 0., 0., 6.52173907e-002, 7.24637695e-003, 0., + 0., 1.44927539e-002, 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., + 7.24637695e-003, 0., 0., 0., 0., 0., 1.44927539e-002, 0., 0., 0., + 0., 0., 0., 0., 7.24637695e-003, 0., 0., 0., 7.24637695e-003, + 7.24637695e-003, 0., 0., 1.44927539e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 1.44927539e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.24637695e-003, 7.24637695e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.24637695e-003, + 0., 1.44927539e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 1.44927539e-002, 0., 0., 0., 0., 0., 1.44927539e-002, 0., 0., 0., + 0., 0., 0., 0., 7.24637695e-003, 0., 0., 0., 0., 0., 0., + 1.44927539e-002, 0., 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.24637695e-003, 2.17391308e-002, 0., 0., 7.24637695e-003, 0., + 0., 2.17391308e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.24637695e-003, 7.24637695e-003, + 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.44927539e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.24637695e-003, 0., + 0., 0., 0., 0., 7.24637695e-003, 7.24637695e-003, 7.24637695e-003, + 0., 2.17391308e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.44927539e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.24637695e-003, + 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.24637695e-003, 0., 0., 0., 0., 0., 0., 7.24637695e-003, 0., 0., + 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.44927539e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.24637695e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.24637695e-003, 0., 0., 0., 5.78034669e-003, 2.31213868e-002, 0., + 2.31213868e-002, 0., 1.73410401e-002, 5.78034669e-003, + 5.78034669e-003, 5.78034669e-003, 0., 0., 1.15606934e-002, 0., 0., + 5.78034669e-003, 1.15606934e-002, 0., 1.15606934e-002, 0., 0., + 5.78034669e-003, 0., 0., 0., 1.15606934e-002, 0., 5.78034669e-003, + 1.73410401e-002, 0., 1.15606934e-002, 0., 0., 0., 5.78034669e-003, + 0., 0., 2.31213868e-002, 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 5.78034669e-003, 0., 1.15606934e-002, 0., 0., + 5.78034669e-003, 0., 0., 0., 1.73410401e-002, 0., 0., 0., + 2.31213868e-002, 0., 0., 5.78034669e-003, 0., 0., 5.78034669e-003, + 0., 0., 0., 5.78034669e-003, 2.31213868e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 0., 5.78034669e-003, 5.78034669e-003, 0., 0., 0., 0., + 1.15606934e-002, 0., 5.78034669e-003, 5.78034669e-003, 0., 0., 0., + 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 0., 0., 0., 5.78034669e-003, 1.15606934e-002, 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 5.78034669e-003, 4.62427735e-002, 0., + 0., 5.78034669e-003, 2.31213868e-002, 5.78034669e-003, 0., 0., 0., + 1.15606934e-002, 1.15606934e-002, 0., 0., 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 5.78034669e-003, 5.78034669e-003, 0., 1.73410401e-002, 0., + 1.15606934e-002, 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 5.78034669e-003, 0., + 0., 0., 0., 0., 0., 1.15606934e-002, 0., 1.15606934e-002, 0., 0., + 0., 0., 5.78034669e-003, 0., 0., 0., 5.78034669e-003, 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.20231202e-002, 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., + 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 2.89017335e-002, 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 0., 1.15606934e-002, 0., 1.15606934e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.15606934e-002, 0., 0., 0., 0., 5.78034669e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 5.78034669e-003, + 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.78034669e-003, 5.78034669e-003, + 1.15606934e-002, 0., 0., 5.78034669e-003, 0., 0., 5.78034669e-003, + 0., 0., 0., 5.78034669e-003, 0., 5.78034669e-003, 0., 0., 0., 0., + 1.15606934e-002, 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 1.15606934e-002, 0., 0., 5.78034669e-003, 0., 0., 0., + 1.73410401e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.78034669e-003, 0., 0., 0., 5.78034669e-003, 5.78034669e-003, + 0., 0., 0., 0., 0., 0., 7.57575780e-003, 7.57575780e-003, 0., + 1.51515156e-002, 7.57575780e-003, 0., 2.27272734e-002, 0., 0., + 1.51515156e-002, 0., 0., 0., 2.27272734e-002, 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 7.57575780e-003, 7.57575780e-003, 0., 0., + 2.27272734e-002, 0., 1.51515156e-002, 1.51515156e-002, 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 7.57575780e-003, 0., 7.57575780e-003, + 0., 0., 7.57575780e-003, 1.51515156e-002, 0., 0., 7.57575780e-003, + 1.51515156e-002, 3.03030312e-002, 0., 0., 7.57575780e-003, + 7.57575780e-003, 0., 0., 0., 0., 7.57575780e-003, 0., + 3.78787890e-002, 0., 0., 7.57575780e-003, 7.57575780e-003, + 7.57575780e-003, 0., 0., 0., 2.27272734e-002, 0., 1.51515156e-002, + 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., + 1.51515156e-002, 0., 0., 7.57575780e-003, 0., 7.57575780e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 4.54545468e-002, 0., 7.57575780e-003, 0., 3.03030312e-002, 0., 0., + 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., + 1.51515156e-002, 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 7.57575780e-003, + 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 4.54545468e-002, 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 1.51515156e-002, 0., 0., 7.57575780e-003, 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., + 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 1.51515156e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.57575780e-003, 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.51515156e-002, 0., 0., 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 0., 0., 7.57575780e-003, + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., + 0., 0., 7.57575780e-003, 0., 0., 7.57575780e-003, 7.57575780e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.51515156e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., + 7.57575780e-003, 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., + 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, + 0., 7.57575780e-003, 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.57575780e-003, 7.57575780e-003, 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.40845068e-002, 1.40845068e-002, 7.04225339e-003, + 2.11267602e-002, 0., 0., 7.04225339e-003, 0., 7.04225339e-003, 0., + 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 1.40845068e-002, + 7.04225339e-003, 0., 7.04225339e-003, 7.04225339e-003, 0., 0., 0., + 1.40845068e-002, 7.04225339e-003, 7.04225339e-003, + 1.40845068e-002, 0., 1.40845068e-002, 0., 7.04225339e-003, 0., 0., + 0., 0., 2.11267602e-002, 7.04225339e-003, 0., 0., 0., 0., + 7.04225339e-003, 0., 7.04225339e-003, 2.11267602e-002, + 7.04225339e-003, 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 1.40845068e-002, 0., 2.11267602e-002, + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 0., 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 7.04225339e-003, 7.04225339e-003, 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, + 0., 7.04225339e-003, 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 1.40845068e-002, 0., 0., 0., + 1.40845068e-002, 7.04225339e-003, 0., 7.04225339e-003, + 7.04225339e-003, 1.40845068e-002, 7.04225339e-003, 0., + 1.40845068e-002, 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 0., 7.04225339e-003, 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., + 1.40845068e-002, 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.40845068e-002, 0., + 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.81690136e-002, 7.04225339e-003, 0., + 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., + 1.40845068e-002, 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 1.40845068e-002, 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 2.11267602e-002, 0., + 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.40845068e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 7.04225339e-003, 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 2.11267602e-002, 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., + 0., 0., 0., 0., 1.40845068e-002, 7.04225339e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., + 7.04225339e-003, 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., + 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 2.11267602e-002, + 0., 0., 0., 7.04225339e-003, 0., 0., 0., 7.04225339e-003, 0., 0., + 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.04225339e-003, 7.04225339e-003, 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.40845068e-002, 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 2.58064512e-002, 0., 1.93548389e-002, + 1.93548389e-002, 0., 0., 0., 0., 6.45161280e-003, 0., 0., + 1.29032256e-002, 6.45161280e-003, 6.45161280e-003, + 1.29032256e-002, 6.45161280e-003, 6.45161280e-003, + 1.93548389e-002, 0., 0., 1.29032256e-002, 0., 6.45161280e-003, 0., + 1.29032256e-002, 0., 0., 1.93548389e-002, 1.93548389e-002, + 6.45161280e-003, 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., + 0., 6.45161280e-003, 0., 6.45161280e-003, 6.45161280e-003, + 1.93548389e-002, 6.45161280e-003, 1.29032256e-002, 0., 0., + 6.45161280e-003, 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., + 0., 6.45161280e-003, 6.45161280e-003, 0., 0., 0., 0., + 1.93548389e-002, 0., 6.45161280e-003, 0., 0., 6.45161280e-003, 0., + 0., 0., 0., 1.29032256e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.45161280e-003, 6.45161280e-003, 0., 0., + 0., 0., 6.45161280e-003, 6.45161280e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., + 6.45161280e-003, 0., 0., 6.45161280e-003, 0., 0., 0., 0., + 1.29032256e-002, 0., 0., 0., 2.58064512e-002, 6.45161280e-003, 0., + 0., 0., 0., 0., 0., 1.93548389e-002, 0., 0., 0., 0., + 6.45161280e-003, 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.45161280e-003, 0., 0., 1.29032256e-002, + 6.45161280e-003, 6.45161280e-003, 0., 0., 2.58064512e-002, 0., + 1.29032256e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.29032256e-002, + 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.29032256e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.45161280e-003, 0., 0., 6.45161280e-003, 0., 0., + 0., 2.58064512e-002, 0., 0., 1.29032256e-002, 0., 0., + 1.29032256e-002, 0., 1.29032256e-002, 0., 6.45161280e-003, + 1.93548389e-002, 0., 0., 0., 6.45161280e-003, 0., 6.45161280e-003, + 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 3.22580636e-002, + 0., 0., 1.93548389e-002, 0., 0., 0., 0., 0., 6.45161280e-003, + 6.45161280e-003, 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 0., 0., 0., 0., 0., 1.29032256e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.29032256e-002, 0., 0., 0., 0., 0., + 6.45161280e-003, 6.45161280e-003, 0., 6.45161280e-003, 0., 0., + 6.45161280e-003, 0., 0., 6.45161280e-003, 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., + 6.45161280e-003, 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.29032256e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 6.45161280e-003, 6.45161280e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., + 6.45161280e-003, 0., 6.45161280e-003, 0., 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.65289249e-002, 0., 2.47933865e-002, + 8.26446246e-003, 4.13223132e-002, 0., 8.26446246e-003, + 8.26446246e-003, 8.26446246e-003, 0., 0., 1.65289249e-002, + 2.47933865e-002, 0., 8.26446246e-003, 8.26446246e-003, + 1.65289249e-002, 8.26446246e-003, 0., 0., 0., 8.26446246e-003, 0., + 0., 0., 0., 0., 0., 1.65289249e-002, 0., 0., 0., 1.65289249e-002, + 0., 0., 0., 0., 8.26446246e-003, 8.26446246e-003, 0., 0., 0., 0., + 0., 8.26446246e-003, 8.26446246e-003, 0., 2.47933865e-002, 0., 0., + 8.26446246e-003, 0., 0., 0., 8.26446246e-003, 0., 1.65289249e-002, + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 8.26446246e-003, 0., 0., 1.65289249e-002, 0., + 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 8.26446246e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.26446246e-003, 1.65289249e-002, 8.26446246e-003, + 0., 0., 8.26446246e-003, 8.26446246e-003, 0., 0., 0., + 1.65289249e-002, 0., 0., 0., 2.47933865e-002, 8.26446246e-003, 0., + 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.26446246e-003, 0., 8.26446246e-003, 0., 0., + 1.65289249e-002, 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 2.47933865e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 1.65289249e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, + 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 1.65289249e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 8.26446246e-003, 0., 8.26446246e-003, 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 8.26446246e-003, 0., 0., + 8.26446246e-003, 8.26446246e-003, 0., 0., 0., 8.26446246e-003, 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.26446246e-003, 0., 0., 0., 8.26446246e-003, 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., + 0., 0., 0., 0., 1.65289249e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.26446246e-003, 8.26446246e-003, 0., 0., 0., 8.26446246e-003, + 8.26446246e-003, 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 3.30578499e-002, + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, + 0., 0., 0., 8.26446246e-003, 0., 8.26446246e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.26446246e-003, 8.26446246e-003, 0., 0., 0., 0., + 1.65289249e-002, 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 7.35294120e-003, + 2.20588241e-002, 0., 0., 1.47058824e-002, 1.47058824e-002, 0., + 1.47058824e-002, 7.35294120e-003, 0., 7.35294120e-003, 0., + 1.47058824e-002, 0., 1.47058824e-002, 7.35294120e-003, + 2.20588241e-002, 0., 0., 2.20588241e-002, 1.47058824e-002, + 7.35294120e-003, 0., 7.35294120e-003, 0., 0., 7.35294120e-003, + 1.47058824e-002, 7.35294120e-003, 0., 1.47058824e-002, 0., 0., + 7.35294120e-003, 0., 7.35294120e-003, 0., 0., 7.35294120e-003, 0., + 0., 0., 0., 0., 7.35294120e-003, 7.35294120e-003, 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 1.47058824e-002, + 7.35294120e-003, 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., + 7.35294120e-003, 0., 7.35294120e-003, 0., 0., 0., 0., + 7.35294120e-003, 7.35294120e-003, 0., 0., 0., 0., 0., + 7.35294120e-003, 7.35294120e-003, 7.35294120e-003, 0., + 7.35294120e-003, 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.47058824e-002, 0., 0., 7.35294120e-003, 2.94117648e-002, 0., + 0., 0., 7.35294120e-003, 7.35294120e-003, 0., 0., 7.35294120e-003, + 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.47058824e-002, 0., 0., 0., 7.35294120e-003, + 0., 0., 0., 7.35294120e-003, 0., 7.35294120e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 7.35294120e-003, 0., + 7.35294120e-003, 7.35294120e-003, 0., 0., 0., 2.94117648e-002, 0., + 0., 0., 0., 1.47058824e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.35294120e-003, 0., 2.20588241e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 7.35294120e-003, 0., 0., 1.47058824e-002, 0., + 7.35294120e-003, 7.35294120e-003, 7.35294120e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.47058824e-002, 0., 0., + 1.47058824e-002, 0., 7.35294120e-003, 7.35294120e-003, 0., + 7.35294120e-003, 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 7.35294120e-003, 7.35294120e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., + 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 2.20588241e-002, 0., 1.47058824e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.47058824e-002, 0., 0., 0., 0., 0., + 0., 7.35294120e-003, 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., + 0., 7.35294120e-003, 0., 0., 0., 0., 7.35294120e-003, + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 0., 0., 0., 7.35294120e-003, 0., 7.35294120e-003, 7.35294120e-003, + 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., + 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.35294120e-003, 0., 0., 7.35294120e-003, 0., + 1.11731840e-002, 0., 5.58659201e-003, 1.11731840e-002, 0., + 4.46927361e-002, 0., 1.11731840e-002, 0., 0., 5.58659201e-003, + 1.11731840e-002, 0., 1.67597756e-002, 0., 5.58659201e-003, + 1.11731840e-002, 1.67597756e-002, 1.67597756e-002, + 2.23463681e-002, 0., 0., 2.23463681e-002, 1.11731840e-002, 0., 0., + 1.67597756e-002, 0., 0., 1.11731840e-002, 1.11731840e-002, 0., 0., + 5.58659201e-003, 5.58659201e-003, 0., 0., 0., 5.58659201e-003, 0., + 0., 0., 0., 5.58659201e-003, 0., 0., 0., 5.58659201e-003, + 5.58659201e-003, 1.11731840e-002, 0., 5.58659201e-003, 0., 0., 0., + 5.58659201e-003, 0., 0., 5.58659201e-003, 0., 0., 0., + 1.11731840e-002, 0., 0., 0., 0., 0., 2.79329605e-002, + 5.58659201e-003, 5.58659201e-003, 0., 5.58659201e-003, 0., 0., 0., + 0., 0., 5.58659201e-003, 0., 0., 0., 1.11731840e-002, 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, 0., + 5.58659201e-003, 0., 0., 5.58659201e-003, 0., 0., 0., + 1.11731840e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.11731840e-002, 2.23463681e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 2.23463681e-002, 0., 5.58659201e-003, 0., 5.58659211e-002, + 1.11731840e-002, 0., 1.11731840e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 5.58659201e-003, 5.58659201e-003, 5.58659201e-003, 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 5.58659201e-003, 0., 0., 5.58659201e-003, + 5.58659201e-003, 5.58659201e-003, 0., 1.11731840e-002, 0., 0., 0., + 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.11731840e-002, 1.11731840e-002, 5.58659201e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 5.58659201e-003, 0., + 0., 0., 0., 0., 0., 0., 5.58659201e-003, 0., 1.67597756e-002, 0., + 0., 5.58659201e-003, 5.58659201e-003, 0., 0., 0., 0., + 1.67597756e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, 0., 5.58659201e-003, + 0., 5.58659201e-003, 1.67597756e-002, 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 5.58659201e-003, 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 1.11731840e-002, 0., 0., 0., 1.11731840e-002, + 0., 0., 0., 1.11731840e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.58659201e-003, 0., 0., 5.58659201e-003, 0., 0., 0., 0., + 0., 5.58659201e-003, 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., + 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 1.11731840e-002, 0., 0., 0., + 5.58659201e-003, 0., 1.67597756e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 2.79329605e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., 0., 5.58659201e-003, + 5.58659201e-003, 0., 0., 1.11731840e-002, 0., 0., 5.58659201e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.58659201e-003, 5.58659201e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, + 0., 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, + 0., 1.05820103e-002, 5.29100513e-003, 0., 1.05820103e-002, 0., + 5.29100513e-003, 0., 1.58730149e-002, 0., 5.29100513e-003, + 1.58730149e-002, 5.29100513e-003, 5.29100513e-003, + 1.05820103e-002, 5.29100513e-003, 1.05820103e-002, + 1.58730149e-002, 2.64550261e-002, 1.05820103e-002, + 1.05820103e-002, 0., 0., 5.29100513e-003, 1.05820103e-002, + 5.29100513e-003, 5.29100513e-003, 0., 5.29100513e-003, 0., 0., + 5.29100513e-003, 0., 5.29100513e-003, 1.05820103e-002, 0., + 1.05820103e-002, 0., 0., 1.58730149e-002, 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 2.11640205e-002, 1.05820103e-002, 0., 0., + 5.29100513e-003, 5.29100513e-003, 0., 5.29100513e-003, + 1.58730149e-002, 0., 0., 5.29100513e-003, 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 5.29100513e-003, + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 5.29100513e-003, + 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., + 5.29100513e-003, 1.05820103e-002, 0., 0., 0., 1.05820103e-002, 0., + 0., 0., 5.29100513e-003, 0., 0., 0., 0., 5.29100513e-003, + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 5.29100513e-003, 2.64550261e-002, + 0., 0., 0., 3.70370373e-002, 5.29100513e-003, 0., 5.29100513e-003, + 0., 5.29100513e-003, 0., 0., 2.11640205e-002, 0., 0., 0., 0., 0., + 0., 0., 5.29100513e-003, 5.29100513e-003, 0., 5.29100513e-003, + 5.29100513e-003, 0., 1.05820103e-002, 0., 5.29100513e-003, 0., 0., + 0., 0., 1.05820103e-002, 5.29100513e-003, 5.29100513e-003, 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.11640205e-002, 0., 0., 1.05820103e-002, 0., 0., 0., + 5.29100513e-003, 5.29100513e-003, 5.29100513e-003, 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 5.29100513e-003, 0., 0., + 1.05820103e-002, 5.29100513e-003, 1.05820103e-002, + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 0., 0., + 1.05820103e-002, 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 5.29100513e-003, 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., + 0., 0., 0., 0., 5.29100513e-003, 0., 5.29100513e-003, 0., 0., 0., + 0., 0., 0., 0., 1.05820103e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 5.29100513e-003, 0., 5.29100513e-003, 0., 0., 1.05820103e-002, + 5.29100513e-003, 1.05820103e-002, 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 1.05820103e-002, 0., 0., 0., + 0., 0., 1.58730149e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 0., 0., 5.29100513e-003, 0., 0., 0., 0., 1.05820103e-002, + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., + 0., 0., 1.05820103e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 1.05820103e-002, 0., 0., 5.29100513e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.05820103e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 1.05820103e-002, + 1.05820103e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, + 1.75438598e-002, 0., 1.16959065e-002, 1.16959065e-002, + 5.84795326e-003, 3.50877196e-002, 0., 0., 5.84795326e-003, 0., + 5.84795326e-003, 0., 1.16959065e-002, 5.84795326e-003, + 5.84795326e-003, 0., 0., 0., 0., 1.75438598e-002, 0., + 1.16959065e-002, 1.75438598e-002, 0., 0., 0., 0., 0., 0., + 2.33918130e-002, 1.16959065e-002, 0., 0., 5.84795326e-003, + 5.84795326e-003, 5.84795326e-003, 0., 0., 1.16959065e-002, + 5.84795326e-003, 0., 0., 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 5.84795326e-003, 1.16959065e-002, 0., 0., + 1.16959065e-002, 0., 5.84795326e-003, 5.84795326e-003, + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., + 1.75438598e-002, 0., 0., 0., 5.84795326e-003, 0., 5.84795326e-003, + 0., 2.33918130e-002, 0., 0., 5.84795326e-003, 0., 5.84795326e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 1.16959065e-002, + 0., 0., 0., 0., 5.84795326e-003, 0., 1.16959065e-002, + 1.16959065e-002, 0., 0., 0., 0., 0., 1.75438598e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., + 0., 0., 0., 0., 0., 5.84795326e-003, 0., 5.84795326e-003, 0., 0., + 1.75438598e-002, 0., 0., 0., 4.09356728e-002, 5.84795326e-003, 0., + 0., 0., 1.16959065e-002, 5.84795326e-003, 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 5.84795326e-003, 5.84795326e-003, 0., 0., 0., + 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 5.84795326e-003, + 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 2.33918130e-002, 0., + 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 5.84795326e-003, + 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 0., 0., 5.84795326e-003, 5.84795326e-003, + 1.75438598e-002, 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 5.84795326e-003, + 0., 5.84795326e-003, 5.84795326e-003, 0., 5.84795326e-003, 0., 0., + 5.84795326e-003, 1.16959065e-002, 0., 0., 5.84795326e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 1.16959065e-002, + 0., 1.16959065e-002, 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, + 0., 0., 0., 0., 0., 0., 5.84795326e-003, 5.84795326e-003, 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 1.75438598e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 1.16959065e-002, 0., 0., + 5.84795326e-003, 0., 1.75438598e-002, 0., 0., 0., 5.84795326e-003, + 0., 0., 0., 0., 5.84795326e-003, 0., 2.11640205e-002, + 5.29100513e-003, 2.11640205e-002, 0., 1.05820103e-002, + 5.29100513e-003, 0., 1.05820103e-002, 1.05820103e-002, + 5.29100513e-003, 0., 0., 1.05820103e-002, 5.29100513e-003, + 5.29100513e-003, 0., 0., 1.05820103e-002, 0., 1.05820103e-002, + 5.29100513e-003, 5.29100513e-003, 5.29100513e-003, + 1.05820103e-002, 0., 5.29100513e-003, 1.58730149e-002, + 1.05820103e-002, 1.05820103e-002, 1.05820103e-002, 0., 0., 0., + 1.05820103e-002, 5.29100513e-003, 0., 0., 0., 5.29100513e-003, + 1.58730149e-002, 0., 0., 0., 5.29100513e-003, 0., 5.29100513e-003, + 5.29100513e-003, 1.58730149e-002, 3.70370373e-002, + 5.29100513e-003, 0., 0., 1.05820103e-002, 0., 5.29100513e-003, + 5.29100513e-003, 0., 0., 1.05820103e-002, 5.29100513e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 1.58730149e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.05820103e-002, 0., 5.29100513e-003, 5.29100513e-003, 0., + 5.29100513e-003, 0., 5.29100513e-003, 0., 5.29100513e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.05820103e-002, 0., 0., + 0., 5.29100513e-003, 5.29100513e-003, 1.05820103e-002, 0., + 1.58730149e-002, 0., 0., 0., 5.29100513e-003, 0., 1.05820103e-002, + 0., 5.29100513e-003, 1.05820103e-002, 2.11640205e-002, 0., 0., 0., + 0., 0., 0., 0., 2.11640205e-002, 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 1.05820103e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 5.29100513e-003, 5.29100513e-003, 0., 5.29100513e-003, 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 1.05820103e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 5.29100513e-003, 0., 5.29100513e-003, 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 1.05820103e-002, 0., 5.29100513e-003, 0., + 0., 1.58730149e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.05820103e-002, 1.58730149e-002, 0., + 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.29100513e-003, 0., 5.29100513e-003, 5.29100513e-003, + 5.29100513e-003, 0., 0., 1.05820103e-002, 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., + 0., 0., 2.11640205e-002, 0., 1.05820103e-002, 0., 0., 0., 0., 0., + 0., 5.29100513e-003, 0., 0., 1.05820103e-002, 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 1.58730149e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.05820103e-002, 0., + 1.05820103e-002, 0., 5.29100513e-003, 5.29100513e-003, 0., 0., 0., + 1.05820103e-002, 0., 5.29100513e-003, 0., 0., 5.29100513e-003, 0., + 0., 5.29100513e-003, 0., 0., 0., 0., 1.58730149e-002, + 5.29100513e-003, 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 5.29100513e-003, 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.29100513e-003, 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 6.06060587e-003, + 6.06060587e-003, 2.42424235e-002, 3.03030293e-002, 0., + 6.06060587e-003, 0., 0., 6.06060587e-003, 0., 6.06060587e-003, + 1.21212117e-002, 0., 1.81818176e-002, 6.06060587e-003, + 6.06060587e-003, 0., 3.63636352e-002, 0., 6.06060587e-003, + 1.21212117e-002, 6.06060587e-003, 0., 0., 1.81818176e-002, 0., + 6.06060587e-003, 3.03030293e-002, 6.06060587e-003, 0., 0., + 1.21212117e-002, 1.21212117e-002, 0., 0., 0., 3.03030293e-002, + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 0., 0., 0., + 6.06060587e-003, 3.63636352e-002, 0., 0., 6.06060587e-003, 0., 0., + 0., 6.06060587e-003, 0., 1.21212117e-002, 0., 1.21212117e-002, 0., + 0., 6.06060587e-003, 6.06060587e-003, 1.81818176e-002, 0., 0., 0., + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 1.21212117e-002, 0., 6.06060587e-003, 0., + 0., 0., 0., 6.06060587e-003, 0., 1.81818176e-002, 6.06060587e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.21212117e-002, + 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 1.21212117e-002, 0., + 0., 0., 3.03030293e-002, 0., 0., 0., 0., 6.06060587e-003, 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 6.06060587e-003, 6.06060587e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 1.81818176e-002, 6.06060587e-003, 0., 0., 0., 0., + 6.06060587e-003, 0., 1.21212117e-002, 0., 1.21212117e-002, 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 1.21212117e-002, + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 0., 0., + 6.06060587e-003, 6.06060587e-003, 6.06060587e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, + 0., 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 1.21212117e-002, 0., 0., 0., 6.06060587e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.21212117e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., + 1.81818176e-002, 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, + 1.81818176e-002, 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 1.21212117e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, + 1.21212117e-002, 0., 1.21212117e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 1.21212117e-002, 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.06060587e-003, 6.06060587e-003, 0., 0., 0., + 6.06060587e-003, 0., 0., 6.06060587e-003, 0., 0., 0., 0., + 6.06060587e-003, 1.81818176e-002, 0., 0., 8.77192989e-003, 0., + 1.75438598e-002, 0., 0., 0., 8.77192989e-003, 0., 0., 0., + 1.75438598e-002, 0., 1.75438598e-002, 0., 0., 8.77192989e-003, 0., + 0., 0., 1.75438598e-002, 8.77192989e-003, 2.63157897e-002, 0., 0., + 0., 8.77192989e-003, 8.77192989e-003, 0., 4.38596494e-002, + 8.77192989e-003, 0., 0., 2.63157897e-002, 0., 0., 0., 0., + 1.75438598e-002, 0., 0., 0., 8.77192989e-003, 0., 8.77192989e-003, + 8.77192989e-003, 1.75438598e-002, 8.77192989e-003, + 4.38596494e-002, 0., 0., 0., 0., 8.77192989e-003, 0., + 8.77192989e-003, 0., 3.50877196e-002, 0., 8.77192989e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.77192989e-003, 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.75438598e-002, + 8.77192989e-003, 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., + 1.75438598e-002, 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., + 1.75438598e-002, 0., 0., 8.77192989e-003, 3.50877196e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.77192989e-003, + 8.77192989e-003, 0., 8.77192989e-003, 8.77192989e-003, + 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.77192989e-003, 0., 0., 0., 0., 0., 0., 8.77192989e-003, + 1.75438598e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.77192989e-003, 0., 0., 0., 8.77192989e-003, 0., 0., 0., + 0., 0., 0., 1.75438598e-002, 0., 0., 0., 0., 0., 8.77192989e-003, + 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 8.77192989e-003, 0., + 0., 8.77192989e-003, 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.63157897e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.75438598e-002, 0., 0., 0., 0., 0., + 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.77192989e-003, 0., 0., 4.38596494e-002, 0., 0., 0., 0., + 8.77192989e-003, 0., 1.75438598e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.77192989e-003, + 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.75438598e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 1.75438598e-002, + 0., 0., 0., 0., 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.77192989e-003, 0., 0., 0., 0., 0., 8.77192989e-003, + 0., 0., 1.89873427e-002, 6.32911408e-003, 6.32911408e-003, + 1.26582282e-002, 1.89873427e-002, 0., 6.32911408e-003, 0., + 6.32911408e-003, 6.32911408e-003, 6.32911408e-003, + 6.32911408e-003, 6.32911408e-003, 0., 6.32911408e-003, 0., + 6.32911408e-003, 0., 1.26582282e-002, 1.26582282e-002, 0., + 3.16455700e-002, 0., 0., 0., 1.89873427e-002, 0., 1.26582282e-002, + 6.32911408e-003, 0., 6.32911408e-003, 0., 0., 6.32911408e-003, 0., + 0., 0., 1.26582282e-002, 0., 0., 0., 0., 6.32911408e-003, + 6.32911408e-003, 6.32911408e-003, 6.32911408e-003, + 6.32911408e-003, 6.32911408e-003, 0., 6.32911408e-003, + 6.32911408e-003, 6.32911408e-003, 0., 0., 0., 0., 6.32911408e-003, + 0., 6.32911408e-003, 0., 0., 1.26582282e-002, 0., 0., + 6.32911408e-003, 0., 0., 6.32911408e-003, 6.32911408e-003, + 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., + 0., 0., 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.32911408e-003, 0., 1.26582282e-002, 0., 0., 0., 1.26582282e-002, + 6.32911408e-003, 0., 0., 6.32911408e-003, 6.32911408e-003, 0., 0., + 0., 0., 0., 0., 0., 1.89873427e-002, 0., 0., 0., 0., 0., + 6.32911408e-003, 6.32911408e-003, 0., 6.32911408e-003, 0., 0., 0., + 0., 1.26582282e-002, 0., 0., 0., 4.43037972e-002, 0., 0., 0., 0., + 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., + 0., 6.32911408e-003, 0., 0., 0., 6.32911408e-003, 0., 0., + 6.32911408e-003, 0., 6.32911408e-003, 6.32911408e-003, 0., 0., 0., + 0., 6.32911408e-003, 0., 6.32911408e-003, 0., 0., 0., 0., 0., 0., + 1.26582282e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.26582282e-002, 0., 0., 1.89873427e-002, 0., 0., 0., 0., 0., 0., + 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, + 0., 1.26582282e-002, 0., 0., 0., 0., 6.32911408e-003, 0., 0., 0., + 6.32911408e-003, 0., 0., 0., 0., 0., 6.32911408e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., 0., 0., + 6.32911408e-003, 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., + 6.32911408e-003, 0., 0., 1.26582282e-002, 0., 0., 0., + 6.32911408e-003, 6.32911408e-003, 0., 0., 0., 0., 0., 0., + 1.89873427e-002, 0., 0., 6.32911408e-003, 0., 6.32911408e-003, 0., + 0., 0., 6.32911408e-003, 6.32911408e-003, 1.26582282e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 1.26582282e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.26582282e-002, 6.32911408e-003, + 0., 0., 6.32911408e-003, 0., 0., 0., 0., 0., 0., 6.32911408e-003, + 0., 0., 0., 0., 0., 1.89873427e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.26582282e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., 0., 0., 0., + 2.53164563e-002, 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., + 0., 0., 6.32911408e-003, 0., 0., 0., 0., 1.26582282e-002, 0., + 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.89873427e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.32911408e-003, 6.32911408e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., 0., 0., + 0., 6.32911408e-003, 0., 6.32911408e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., 0., 0., 0., 0., + 6.32911408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.32911408e-003, 0., 0., 0., + 0., 0., 1.58730168e-002, 0., 0., 0., 0., 0., 0., 2.38095261e-002, + 0., 0., 0., 7.93650839e-003, 0., 7.93650839e-003, 0., + 7.93650839e-003, 0., 7.93650839e-003, 0., 1.58730168e-002, 0., + 7.93650839e-003, 3.96825410e-002, 0., 0., 7.93650839e-003, + 2.38095261e-002, 0., 7.93650839e-003, 7.93650839e-003, + 7.93650839e-003, 7.93650839e-003, 0., 1.58730168e-002, + 1.58730168e-002, 0., 0., 0., 2.38095261e-002, 0., 0., 0., + 1.58730168e-002, 0., 0., 1.58730168e-002, 7.93650839e-003, 0., + 1.58730168e-002, 0., 0., 0., 7.93650839e-003, 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., + 2.38095261e-002, 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.38095261e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 7.93650839e-003, 0., 0., 0., 7.93650839e-003, + 7.93650839e-003, 0., 7.93650839e-003, 1.58730168e-002, 0., 0., 0., + 0., 0., 0., 1.58730168e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 2.38095261e-002, 0., + 7.93650839e-003, 0., 3.96825410e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., + 7.93650839e-003, 0., 0., 0., 2.38095261e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., + 0., 0., 7.93650839e-003, 0., 7.93650839e-003, 0., 7.93650839e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., + 0., 0., 0., 0., 7.93650839e-003, 7.93650839e-003, 0., 0., 0., 0., + 0., 0., 7.93650839e-003, 0., 1.58730168e-002, 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., + 7.93650839e-003, 7.93650839e-003, 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.58730168e-002, 0., 0., 0., + 1.58730168e-002, 1.58730168e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., 7.93650839e-003, 0., + 0., 0., 0., 0., 0., 1.58730168e-002, 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, + 0., 7.93650839e-003, 0., 0., 0., 7.93650839e-003, 7.93650839e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 1.58730168e-002, 0., + 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, + 0., 0., 0., 0., 0., 2.38095261e-002, 0., 0., 7.93650839e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 1.58730168e-002, + 0., 1.19047621e-002, 0., 0., 5.95238106e-003, 1.19047621e-002, + 1.78571437e-002, 0., 1.78571437e-002, 0., 5.95238106e-003, + 5.95238106e-003, 5.95238106e-003, 5.95238106e-003, + 1.78571437e-002, 0., 0., 0., 0., 5.95238106e-003, 1.19047621e-002, + 5.95238106e-003, 0., 4.16666679e-002, 0., 0., 0., 1.78571437e-002, + 0., 2.38095243e-002, 2.38095243e-002, 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 1.19047621e-002, 0., + 0., 0., 5.95238106e-003, 5.95238106e-003, 0., 1.19047621e-002, + 1.19047621e-002, 3.57142873e-002, 0., 0., 5.95238106e-003, 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 1.19047621e-002, + 5.95238106e-003, 1.78571437e-002, 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 1.19047621e-002, 0., 0., 5.95238106e-003, 0., + 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 5.95238106e-003, 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 0., 1.19047621e-002, + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 2.38095243e-002, 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., + 2.97619049e-002, 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 1.19047621e-002, 0., 1.19047621e-002, 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 5.95238106e-003, 0., 0., 0., 5.95238106e-003, + 5.95238106e-003, 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 0., 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.78571437e-002, 0., 0., 0., + 1.78571437e-002, 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., 0., + 0., 0., 0., 1.19047621e-002, 5.95238106e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 1.19047621e-002, 0., 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 0., 1.19047621e-002, 1.78571437e-002, 0., + 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.95238106e-003, 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 1.08695654e-002, 1.63043477e-002, + 5.43478271e-003, 1.08695654e-002, 1.08695654e-002, 0., 0., + 5.43478271e-003, 1.08695654e-002, 0., 0., 0., 5.43478271e-003, + 5.43478271e-003, 5.43478271e-003, 0., 1.08695654e-002, + 1.08695654e-002, 1.63043477e-002, 1.08695654e-002, 0., 0., + 1.63043477e-002, 5.43478271e-003, 0., 0., 0., 5.43478271e-003, + 2.17391308e-002, 1.08695654e-002, 0., 5.43478271e-003, + 5.43478271e-003, 1.08695654e-002, 5.43478271e-003, 0., 0., + 5.43478271e-003, 3.80434804e-002, 5.43478271e-003, 0., 0., + 1.08695654e-002, 5.43478271e-003, 0., 1.08695654e-002, + 5.43478271e-003, 0., 2.17391308e-002, 0., 0., 5.43478271e-003, + 5.43478271e-003, 0., 1.63043477e-002, 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 2.17391308e-002, 0., 5.43478271e-003, 0., + 0., 0., 5.43478271e-003, 5.43478271e-003, 0., 0., 5.43478271e-003, + 0., 5.43478271e-003, 0., 0., 0., 0., 1.08695654e-002, 0., 0., + 5.43478271e-003, 0., 5.43478271e-003, 0., 0., 0., 0., 0., + 5.43478271e-003, 5.43478271e-003, 5.43478271e-003, 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 5.43478271e-003, + 0., 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 1.63043477e-002, + 5.43478271e-003, 0., 0., 2.71739140e-002, 5.43478271e-003, 0., 0., + 0., 0., 1.08695654e-002, 0., 0., 0., 0., 0., 0., 1.08695654e-002, + 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 5.43478271e-003, 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 5.43478271e-003, 0., 1.08695654e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.63043477e-002, 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 1.08695654e-002, 0., 1.08695654e-002, + 5.43478271e-003, 5.43478271e-003, 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 5.43478271e-003, 0., 0., 1.08695654e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 5.43478271e-003, + 1.08695654e-002, 0., 0., 5.43478271e-003, 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.08695654e-002, 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.08695654e-002, 0., 0., 0., 0., 5.43478271e-003, 5.43478271e-003, + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 5.43478271e-003, 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 0., 5.43478271e-003, 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.43478271e-003, 5.43478271e-003, 0., 1.08695654e-002, + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.36986300e-002, 0., 0., 6.84931502e-003, 6.84931502e-003, 0., 0., + 0., 2.73972601e-002, 6.84931502e-003, 6.84931502e-003, 0., + 1.36986300e-002, 6.84931502e-003, 0., 0., 0., 6.84931502e-003, + 6.84931502e-003, 6.84931502e-003, 0., 0., 6.84931502e-003, 0., 0., + 0., 2.05479451e-002, 0., 6.84931502e-003, 1.36986300e-002, 0., + 1.36986300e-002, 0., 1.36986300e-002, 0., 0., 6.84931502e-003, + 6.84931502e-003, 1.36986300e-002, 6.84931502e-003, 0., 0., + 6.84931502e-003, 1.36986300e-002, 0., 1.36986300e-002, + 1.36986300e-002, 1.36986300e-002, 4.10958901e-002, + 6.84931502e-003, 0., 6.84931502e-003, 0., 0., 0., 6.84931502e-003, + 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 3.42465751e-002, 0., 0., 0., 6.84931502e-003, 6.84931502e-003, 0., + 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 1.36986300e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., + 1.36986300e-002, 1.36986300e-002, 0., 0., 0., 0., 1.36986300e-002, + 6.84931502e-003, 0., 0., 0., 6.84931502e-003, 0., 0., + 1.36986300e-002, 1.36986300e-002, 0., 0., 0., 2.73972601e-002, 0., + 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., + 2.05479451e-002, 0., 1.36986300e-002, 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 6.84931502e-003, 6.84931502e-003, 0., 0., 0., + 1.36986300e-002, 0., 0., 0., 1.36986300e-002, 0., 6.84931502e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.84931502e-003, 0., 0., 6.84931502e-003, 2.05479451e-002, 0., + 0., 0., 0., 0., 0., 0., 1.36986300e-002, 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., + 0., 6.84931502e-003, 0., 0., 6.84931502e-003, 0., 0., + 6.84931502e-003, 0., 0., 6.84931502e-003, 0., 0., 6.84931502e-003, + 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.36986300e-002, 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., + 0., 6.84931502e-003, 0., 0., 0., 0., 0., 1.36986300e-002, 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.05479451e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., + 0., 0., 0., 0., 1.36986300e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.36986300e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 6.84931502e-003, + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., + 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, + 1.36986300e-002, 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.36986300e-002, 0., + 1.69491526e-002, 8.47457629e-003, 0., 0., 2.54237279e-002, 0., 0., + 0., 0., 8.47457629e-003, 0., 0., 2.54237279e-002, 0., + 8.47457629e-003, 8.47457629e-003, 8.47457629e-003, + 2.54237279e-002, 8.47457629e-003, 1.69491526e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.47457629e-003, 8.47457629e-003, 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 1.69491526e-002, 0., 0., 8.47457629e-003, + 1.69491526e-002, 1.69491526e-002, 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 8.47457629e-003, 8.47457629e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.47457629e-003, 8.47457629e-003, 0., + 8.47457629e-003, 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.47457629e-003, 8.47457629e-003, 0., 8.47457629e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 6.77966103e-002, 0., 0., 1.69491526e-002, 0., 0., 2.54237279e-002, + 0., 1.69491526e-002, 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 8.47457629e-003, 0., 0., 0., 0., 4.23728824e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 0., 0., 1.69491526e-002, 8.47457629e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 1.69491526e-002, 0., 0., + 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.69491526e-002, 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 8.47457629e-003, 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 8.47457629e-003, 0., 8.47457629e-003, 0., 0., 0., 8.47457629e-003, + 8.47457629e-003, 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.54237279e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.69491526e-002, + 0., 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.47457629e-003, 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.80272095e-003, 6.80272095e-003, + 6.80272095e-003, 2.04081628e-002, 1.36054419e-002, + 4.08163257e-002, 0., 6.80272095e-003, 6.80272095e-003, 0., 0., + 6.80272095e-003, 6.80272095e-003, 0., 0., 1.36054419e-002, 0., + 6.80272095e-003, 0., 6.80272095e-003, 6.80272095e-003, + 6.80272095e-003, 4.76190448e-002, 0., 6.80272095e-003, 0., + 1.36054419e-002, 0., 6.80272095e-003, 2.04081628e-002, 0., + 6.80272095e-003, 0., 6.80272095e-003, 0., 1.36054419e-002, 0., 0., + 2.04081628e-002, 2.04081628e-002, 0., 0., 6.80272095e-003, 0., 0., + 1.36054419e-002, 1.36054419e-002, 1.36054419e-002, + 2.04081628e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 6.80272095e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 1.36054419e-002, 0., 0., + 1.36054419e-002, 2.04081628e-002, 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 2.72108838e-002, 6.80272095e-003, + 0., 0., 0., 0., 0., 0., 2.72108838e-002, 0., 0., 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 6.80272095e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 6.80272095e-003, + 0., 6.80272095e-003, 0., 6.80272095e-003, 0., 2.72108838e-002, 0., + 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 6.80272095e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.36054419e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., + 6.80272095e-003, 6.80272095e-003, 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 1.36054419e-002, 0., 6.80272095e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.80272095e-003, 0., 0., 1.36054419e-002, 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 6.80272095e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.36054419e-002, 0., 0., 0., + 0., 0., 0., 6.80272095e-003, 0., 0., 6.80272095e-003, + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.36054419e-002, + 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 6.80272095e-003, 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.80272095e-003, 0., 0., 1.36054419e-002, + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.04081628e-002, 0., + 0., 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.36054419e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.80272095e-003, 0., 6.80272095e-003, 0., 1.36054419e-002, + 0., 0., 0., 0., 6.80272095e-003, 0., 5.81395347e-003, + 5.81395347e-003, 1.74418613e-002, 4.06976752e-002, + 5.81395347e-003, 0., 5.81395347e-003, 5.81395347e-003, + 5.81395347e-003, 1.16279069e-002, 0., 1.16279069e-002, + 5.81395347e-003, 0., 0., 5.81395347e-003, 1.74418613e-002, 0., + 2.32558139e-002, 1.16279069e-002, 1.16279069e-002, + 1.16279069e-002, 0., 5.81395347e-003, 0., 2.32558139e-002, 0., + 5.81395347e-003, 1.74418613e-002, 0., 0., 0., 5.81395347e-003, 0., + 0., 0., 0., 1.16279069e-002, 1.16279069e-002, 0., 0., 0., + 1.74418613e-002, 0., 1.16279069e-002, 0., 0., 1.16279069e-002, 0., + 5.81395347e-003, 0., 0., 5.81395347e-003, 5.81395347e-003, + 1.16279069e-002, 0., 0., 5.81395347e-003, 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 5.81395347e-003, + 5.81395347e-003, 1.16279069e-002, 0., 1.16279069e-002, 0., 0., 0., + 5.81395347e-003, 0., 0., 5.81395347e-003, 0., 0., 0., 0., + 5.81395347e-003, 0., 0., 1.16279069e-002, 0., 0., 0., 0., 0., 0., + 0., 5.81395347e-003, 0., 0., 0., 0., 1.16279069e-002, 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 5.81395347e-003, 0., 0., 0., + 2.32558139e-002, 0., 0., 0., 3.48837227e-002, 0., 0., 0., 0., 0., + 0., 0., 1.16279069e-002, 0., 0., 5.81395347e-003, 0., + 1.16279069e-002, 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.74418613e-002, 0., 5.81395347e-003, 0., 0., + 0., 0., 1.74418613e-002, 0., 0., 0., 0., 0., 0., 1.16279069e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., + 5.81395347e-003, 0., 1.16279069e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 1.16279069e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16279069e-002, 0., 0., 0., 0., 0., 0., 5.81395347e-003, + 1.16279069e-002, 0., 0., 0., 0., 0., 1.74418613e-002, 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 5.81395347e-003, + 5.81395347e-003, 5.81395347e-003, 0., 5.81395347e-003, + 1.74418613e-002, 5.81395347e-003, 0., 0., 0., 0., 5.81395347e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.16279069e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 1.16279069e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 1.16279069e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16279069e-002, 0., 1.74418613e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.81395347e-003, 0., 0., 0., 5.81395347e-003, 0., 0., + 1.16279069e-002, 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., + 1.16279069e-002, 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 2.32558139e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.74418613e-002, 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 1.16279069e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.12359552e-002, 0., + 1.68539323e-002, 2.24719103e-002, 1.12359552e-002, 0., + 1.12359552e-002, 5.61797759e-003, 0., 1.12359552e-002, + 5.61797759e-003, 5.61797759e-003, 1.12359552e-002, + 5.61797759e-003, 5.61797759e-003, 0., 1.12359552e-002, + 1.12359552e-002, 2.80898884e-002, 0., 5.61797759e-003, + 1.68539323e-002, 0., 0., 0., 1.12359552e-002, 0., 5.61797759e-003, + 1.12359552e-002, 5.61797759e-003, 5.61797759e-003, 0., 0., + 3.37078646e-002, 0., 0., 5.61797759e-003, 1.68539323e-002, + 1.12359552e-002, 0., 5.61797759e-003, 0., 1.12359552e-002, + 5.61797759e-003, 0., 5.61797759e-003, 0., 1.68539323e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, + 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., + 0., 1.12359552e-002, 0., 0., 0., 5.61797759e-003, 5.61797759e-003, + 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 1.68539323e-002, 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 1.68539323e-002, 0., 5.61797759e-003, 0., 3.93258445e-002, 0., 0., + 0., 0., 0., 0., 0., 1.68539323e-002, 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 5.61797759e-003, 5.61797759e-003, 2.24719103e-002, 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 1.12359552e-002, 0., 0., 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 1.12359552e-002, 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.61797759e-003, 0., 0., 5.61797759e-003, 0., + 1.12359552e-002, 0., 5.61797759e-003, 1.12359552e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 1.12359552e-002, 5.61797759e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, + 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.12359552e-002, 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 1.12359552e-002, 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 1.68539323e-002, 0., 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 1.69491526e-002, 0., 8.47457629e-003, + 2.54237279e-002, 1.69491526e-002, 0., 0., 1.69491526e-002, 0., 0., + 0., 0., 8.47457629e-003, 1.69491526e-002, 0., 8.47457629e-003, + 8.47457629e-003, 8.47457629e-003, 0., 8.47457629e-003, 0., + 1.69491526e-002, 1.69491526e-002, 0., 1.69491526e-002, 0., + 1.69491526e-002, 0., 8.47457629e-003, 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., + 3.38983051e-002, 8.47457629e-003, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 8.47457629e-003, 1.69491526e-002, 0., 0., 0., + 0., 0., 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 0., 0., 2.54237279e-002, 0., 0., 0., 1.69491526e-002, 0., + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, + 8.47457629e-003, 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 2.54237279e-002, 0., 0., 0., + 4.23728824e-002, 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 0., 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 8.47457629e-003, + 0., 1.69491526e-002, 2.54237279e-002, 0., 0., 0., 0., 0., + 8.47457629e-003, 8.47457629e-003, 0., 0., 8.47457629e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 1.69491526e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.69491526e-002, 8.47457629e-003, 0., 0., 0., + 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 8.47457629e-003, + 0., 0., 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.54237279e-002, 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.47457629e-003, 3.38983051e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 8.47457629e-003, 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.69491526e-002, 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 7.40740728e-003, 0., 7.40740728e-003, 7.40740728e-003, + 2.22222209e-002, 0., 7.40740728e-003, 7.40740728e-003, 0., 0., 0., + 0., 0., 0., 7.40740728e-003, 0., 0., 7.40740728e-003, + 1.48148146e-002, 7.40740728e-003, 0., 7.40740728e-003, 0., 0., 0., + 2.22222209e-002, 0., 7.40740728e-003, 1.48148146e-002, + 7.40740728e-003, 7.40740728e-003, 0., 7.40740728e-003, + 7.40740728e-003, 0., 0., 0., 7.40740728e-003, 7.40740728e-003, + 7.40740728e-003, 0., 7.40740728e-003, 0., 7.40740728e-003, + 1.48148146e-002, 0., 7.40740728e-003, 1.48148146e-002, + 7.40740728e-003, 0., 0., 1.48148146e-002, 0., 0., 1.48148146e-002, + 0., 0., 0., 1.48148146e-002, 0., 0., 7.40740728e-003, 0., + 1.48148146e-002, 7.40740728e-003, 0., 0., 1.48148146e-002, 0., + 7.40740728e-003, 0., 7.40740728e-003, 0., 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 1.48148146e-002, 0., 0., 0., + 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., 0., 0., 0., + 1.48148146e-002, 0., 7.40740728e-003, 0., 7.40740728e-003, + 1.48148146e-002, 0., 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., + 0., 7.40740728e-003, 0., 7.40740728e-003, 1.48148146e-002, 0., + 1.48148146e-002, 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., + 5.18518500e-002, 7.40740728e-003, 0., 0., 0., 1.48148146e-002, 0., + 0., 0., 0., 0., 0., 0., 7.40740728e-003, 7.40740728e-003, 0., 0., + 0., 0., 0., 1.48148146e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.48148146e-002, 0., 0., 0., 0., 0., 0., + 1.48148146e-002, 0., 7.40740728e-003, 0., 0., 0., 0., 0., + 7.40740728e-003, 7.40740728e-003, 1.48148146e-002, 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., + 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.48148146e-002, 7.40740728e-003, 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.40740728e-003, 0., 0., 0., 7.40740728e-003, 0., 0., + 7.40740728e-003, 0., 0., 7.40740728e-003, 7.40740728e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., + 0., 7.40740728e-003, 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., + 1.48148146e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.40740728e-003, 0., 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., 0., 7.40740728e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., + 0., 0., 0., 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., + 1.48148146e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.40740728e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.48148146e-002, 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.40740728e-003, 0., 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., + 0., 0., 0., 0., 0., 7.40740728e-003, 0., 0., 0., 0., 0., + 1.48148146e-002, 0., 0., 8.54700897e-003, 8.54700897e-003, 0., 0., + 2.56410278e-002, 0., 8.54700897e-003, 0., 0., 0., 0., + 2.56410278e-002, 8.54700897e-003, 0., 8.54700897e-003, 0., 0., 0., + 3.41880359e-002, 0., 8.54700897e-003, 8.54700897e-003, 0., 0., 0., + 4.27350439e-002, 0., 0., 8.54700897e-003, 1.70940179e-002, 0., 0., + 8.54700897e-003, 1.70940179e-002, 0., 0., 0., 4.27350439e-002, + 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, + 3.41880359e-002, 0., 0., 0., 0., 0., 8.54700897e-003, + 8.54700897e-003, 0., 8.54700897e-003, 0., 1.70940179e-002, 0., + 8.54700897e-003, 0., 0., 1.70940179e-002, 0., 0., 0., + 8.54700897e-003, 0., 8.54700897e-003, 0., 0., 0., 0., + 1.70940179e-002, 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., + 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, 0., + 8.54700897e-003, 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 2.56410278e-002, 0., 0., 0., + 7.69230798e-002, 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., + 8.54700897e-003, 0., 0., 0., 8.54700897e-003, 0., 0., 0., + 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, + 0., 0., 0., 8.54700897e-003, 0., 0., 8.54700897e-003, 0., + 8.54700897e-003, 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.70940179e-002, + 0., 0., 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.54700897e-003, 0., 0., 1.70940179e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.56410278e-002, 0., + 8.54700897e-003, 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., + 0., 2.56410278e-002, 0., 0., 0., 8.54700897e-003, 8.54700897e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, + 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.54700897e-003, 0., 8.54700897e-003, 0., 8.54700897e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.70940179e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, 0., 0., 0., 0., 0., + 0., 0., 8.54700897e-003, 0., 8.54700897e-003, 0., 0., 0., + 8.54700897e-003, 0., 8.54700897e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.54700897e-003, + 0., 0., 8.54700897e-003, 0., 8.54700897e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.54700897e-003, 0., 8.54700897e-003, 0., 0., 0., 0., 0., + 1.68067235e-002, 0., 0., 1.68067235e-002, 2.52100863e-002, + 2.52100863e-002, 0., 0., 8.40336177e-003, 8.40336177e-003, + 1.68067235e-002, 1.68067235e-002, 8.40336177e-003, 0., 0., 0., 0., + 1.68067235e-002, 0., 0., 0., 0., 8.40336177e-003, 0., + 8.40336177e-003, 0., 2.52100863e-002, 0., 0., 8.40336177e-003, 0., + 1.68067235e-002, 0., 1.68067235e-002, 0., 0., 0., 0., + 1.68067235e-002, 1.68067235e-002, 0., 0., 0., 8.40336177e-003, 0., + 1.68067235e-002, 1.68067235e-002, 1.68067235e-002, + 3.36134471e-002, 0., 8.40336177e-003, 0., 8.40336177e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., 8.40336177e-003, + 0., 0., 0., 0., 0., 0., 8.40336177e-003, 8.40336177e-003, 0., 0., + 0., 0., 8.40336177e-003, 0., 8.40336177e-003, 0., 8.40336177e-003, + 0., 8.40336177e-003, 8.40336177e-003, 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 8.40336177e-003, 0., 0., + 2.52100863e-002, 0., 0., 0., 1.68067235e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 8.40336177e-003, 0., 0., 0., 8.40336177e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 1.68067235e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., + 1.68067235e-002, 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., + 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.68067235e-002, 0., 8.40336177e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, + 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., + 0., 0., 8.40336177e-003, 0., 0., 0., 2.52100863e-002, + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.68067235e-002, 0., 0., + 8.40336177e-003, 2.52100863e-002, 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.40336177e-003, 0., 0., 8.40336177e-003, 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.52100863e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.68067235e-002, + 1.68067235e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.68067235e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.68067235e-002, 0., + 8.40336177e-003, 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., + 1.39860138e-002, 0., 6.99300691e-003, 2.09790207e-002, + 1.39860138e-002, 1.39860138e-002, 0., 0., 0., 0., 6.99300691e-003, + 6.99300691e-003, 6.99300691e-003, 6.99300691e-003, 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 2.09790207e-002, 6.99300691e-003, + 6.99300691e-003, 0., 2.79720277e-002, 0., 2.09790207e-002, + 1.39860138e-002, 0., 6.99300691e-003, 0., 6.99300691e-003, 0., 0., + 0., 0., 2.79720277e-002, 1.39860138e-002, 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 4.89510484e-002, 6.99300691e-003, 0., + 0., 6.99300691e-003, 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., + 1.39860138e-002, 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.39860138e-002, 0., 0., + 0., 0., 1.39860138e-002, 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 4.89510484e-002, 6.99300691e-003, 0., 0., 1.39860138e-002, 0., 0., + 0., 0., 6.99300691e-003, 0., 0., 6.99300691e-003, 0., 0., 0., 0., + 2.79720277e-002, 6.99300691e-003, 0., 0., 6.99300691e-003, 0., + 1.39860138e-002, 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, + 0., 0., 6.99300691e-003, 0., 6.99300691e-003, 0., 0., 0., 0., + 6.99300691e-003, 6.99300691e-003, 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 6.99300691e-003, 6.99300691e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., + 1.39860138e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 6.99300691e-003, 0., 0., 0., 0., 6.99300691e-003, + 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 6.99300691e-003, 0., 0., 6.99300691e-003, + 0., 1.39860138e-002, 0., 1.39860138e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 6.99300691e-003, 0., 6.99300691e-003, 0., 6.99300691e-003, + 0., 0., 6.99300691e-003, 0., 0., 6.99300691e-003, 0., 0., 0., + 2.09790207e-002, 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., + 0., 0., 0., 2.09790207e-002, 0., 0., 0., 0., 0., 6.99300691e-003, + 0., 0., 0., 6.99300691e-003, 0., 6.99300691e-003, 0., 0., 0., 0., + 0., 0., 1.39860138e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 6.99300691e-003, 6.99300691e-003, 0., 0., 0., + 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 1.39860138e-002, 0., + 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 6.99300691e-003, 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.99300691e-003, 0., 0., 0., 0., 0., 6.99300691e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.99300691e-003, 0., + 0., 0., 0., 6.99300691e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.12820529e-003, 5.12820529e-003, 0., + 5.12820529e-003, 0., 2.05128212e-002, 0., 1.02564106e-002, 0., 0., + 5.12820529e-003, 0., 5.12820529e-003, 0., 5.12820529e-003, + 5.12820529e-003, 0., 5.12820529e-003, 1.02564106e-002, + 5.12820529e-003, 0., 0., 2.05128212e-002, 0., 0., 0., + 2.56410260e-002, 0., 0., 1.53846163e-002, 5.12820529e-003, + 5.12820529e-003, 0., 5.12820529e-003, 0., 1.02564106e-002, 0., + 5.12820529e-003, 2.56410260e-002, 5.12820529e-003, + 5.12820529e-003, 0., 5.12820529e-003, 5.12820529e-003, 0., + 1.02564106e-002, 0., 5.12820529e-003, 2.56410260e-002, 0., 0., + 1.02564106e-002, 0., 0., 0., 5.12820529e-003, 0., 1.02564106e-002, + 0., 1.02564106e-002, 5.12820529e-003, 0., 5.12820529e-003, 0., 0., + 0., 0., 0., 1.02564106e-002, 0., 1.02564106e-002, 0., + 5.12820529e-003, 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.12820529e-003, 0., 0., 0., + 5.12820529e-003, 5.12820529e-003, 5.12820529e-003, + 1.02564106e-002, 1.02564106e-002, 0., 0., 1.02564106e-002, 0., + 5.12820529e-003, 0., 5.12820529e-003, 5.12820529e-003, 0., 0., + 5.12820529e-003, 0., 5.12820529e-003, 0., 5.12820529e-003, + 5.12820529e-003, 0., 5.12820529e-003, 0., 5.12820529e-003, + 1.02564106e-002, 0., 0., 0., 0., 0., 0., 5.12820529e-003, + 5.12820529e-003, 5.12820529e-003, 0., 0., 0., 1.53846163e-002, 0., + 5.12820529e-003, 0., 5.12820529e-003, 5.12820529e-003, 0., 0., + 5.12820529e-003, 0., 0., 0., 0., 2.05128212e-002, 5.12820529e-003, + 5.12820529e-003, 5.12820529e-003, 0., 0., 0., 5.12820529e-003, 0., + 0., 0., 0., 0., 0., 5.12820529e-003, 0., 0., 0., 0., 0., + 5.12820529e-003, 5.12820529e-003, 1.02564106e-002, 0., 0., 0., + 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.12820529e-003, + 0., 0., 0., 0., 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., + 1.02564106e-002, 0., 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.12820529e-003, 0., 0., 1.02564106e-002, 0., 0., 0., + 0., 5.12820529e-003, 0., 5.12820529e-003, 0., 0., 0., 0., 0., 0., + 5.12820529e-003, 0., 1.02564106e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.02564106e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.12820529e-003, 0., 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.12820529e-003, 0., 0., 0., 0., 5.12820529e-003, + 0., 0., 5.12820529e-003, 0., 5.12820529e-003, 0., 5.12820529e-003, + 0., 1.02564106e-002, 0., 0., 5.12820529e-003, 1.53846163e-002, 0., + 0., 1.02564106e-002, 0., 0., 0., 0., 0., 0., 5.12820529e-003, 0., + 0., 0., 0., 0., 1.02564106e-002, 5.12820529e-003, 0., 0., 0., 0., + 1.02564106e-002, 1.02564106e-002, 0., 5.12820529e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.12820529e-003, 0., 0., 0., 1.02564106e-002, 0., 0., 0., 0., 0., + 0., 1.02564106e-002, 0., 0., 0., 0., 0., 5.12820529e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.02564106e-002, 0., 5.12820529e-003, + 0., 0., 0., 0., 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.12820529e-003, 0., + 0., 5.12820529e-003, 0., 0., 0., 5.12820529e-003, 0., 0., 0., 0., + 0., 5.12820529e-003, 0., 0., 5.12820529e-003, 0., 0., 0., 0., 0., + 2.05128212e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.12820529e-003, 0., 0., 0., 0., 0., 0., 5.12820529e-003, + 5.12820529e-003, 0., 0., 0., 1.02564106e-002, 0., 0., + 5.12820529e-003, 0., 5.12820529e-003, 0., 0., 0., 5.12820529e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.12820529e-003, 0., 0., 0., 0., + 0., 0., 5.12820529e-003, 0., 0., 1.02564106e-002, 0., + 5.12820529e-003, 0., 0., 5.12820529e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.12820529e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.02564106e-002, 0., + 5.12820529e-003, 0., 5.12820529e-003, 0., 0., 0., 5.12820529e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.12820529e-003, 0., + 5.12820529e-003, 0., 5.12820529e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.12820529e-003, 0., 0., 0., 0., 1.68539323e-002, 0., + 1.12359552e-002, 5.61797759e-003, 1.12359552e-002, + 1.12359552e-002, 0., 1.12359552e-002, 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 1.68539323e-002, 0., 0., 1.12359552e-002, + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., 0., + 5.61797759e-003, 1.68539323e-002, 0., 0., 5.61797759e-003, 0., 0., + 0., 0., 5.61797759e-003, 1.68539323e-002, 0., 0., 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, 0., + 5.61797759e-003, 0., 1.68539323e-002, 0., 5.61797759e-003, + 1.68539323e-002, 0., 5.61797759e-003, 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, + 1.12359552e-002, 0., 5.61797759e-003, 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 5.61797759e-003, 0., + 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 1.12359552e-002, + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 5.61797759e-003, 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., + 0., 1.12359552e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 0., 1.68539323e-002, 0., 0., 5.61797759e-003, 2.24719103e-002, 0., + 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 5.61797759e-003, + 0., 0., 1.12359552e-002, 1.68539323e-002, 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.12359552e-002, + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 1.68539323e-002, + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.12359552e-002, 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 5.61797759e-003, + 5.61797759e-003, 1.12359552e-002, 5.61797759e-003, 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 1.12359552e-002, 0., 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.12359552e-002, 0., 0., 0., 0., + 2.24719103e-002, 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 1.12359552e-002, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 1.12359552e-002, 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 1.12359552e-002, + 0., 0., 5.61797759e-003, 0., 0., 1.12359552e-002, 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 2.24719103e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.61797759e-003, 1.12359552e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.12359552e-002, + 5.61797759e-003, 0., 0., 5.61797759e-003, 1.12359552e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 1.68539323e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.40540554e-003, 1.62162166e-002, + 5.40540554e-003, 0., 5.40540554e-003, 2.70270277e-002, 0., + 1.62162166e-002, 5.40540554e-003, 1.62162166e-002, + 1.62162166e-002, 5.40540554e-003, 5.40540554e-003, 0., 0., 0., + 5.40540554e-003, 1.62162166e-002, 1.08108111e-002, 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 1.08108111e-002, 5.40540554e-003, 0., + 5.40540554e-003, 1.62162166e-002, 5.40540554e-003, 0., + 1.08108111e-002, 5.40540554e-003, 5.40540554e-003, 0., 0., + 1.08108111e-002, 0., 5.40540554e-003, 0., 5.40540554e-003, + 1.08108111e-002, 0., 5.40540554e-003, 5.40540554e-003, + 1.08108111e-002, 2.16216221e-002, 5.40540554e-003, 0., 0., 0., 0., + 5.40540554e-003, 1.08108111e-002, 0., 1.08108111e-002, 0., 0., 0., + 0., 0., 5.40540554e-003, 1.08108111e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.40540554e-003, 0., 5.40540554e-003, + 5.40540554e-003, 0., 0., 0., 5.40540554e-003, 0., 0., 0., + 1.08108111e-002, 0., 0., 0., 5.40540554e-003, 0., 5.40540554e-003, + 0., 5.40540554e-003, 5.40540554e-003, 0., 1.08108111e-002, 0., 0., + 0., 0., 0., 5.40540554e-003, 0., 1.08108111e-002, 0., 0., 0., + 1.08108111e-002, 5.40540554e-003, 5.40540554e-003, + 1.08108111e-002, 5.94594628e-002, 5.40540554e-003, 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, + 1.08108111e-002, 0., 0., 0., 5.40540554e-003, 5.40540554e-003, 0., + 5.40540554e-003, 0., 0., 0., 0., 5.40540554e-003, 5.40540554e-003, + 0., 5.40540554e-003, 0., 0., 0., 5.40540554e-003, 5.40540554e-003, + 0., 5.40540554e-003, 0., 5.40540554e-003, 0., 0., 5.40540554e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 5.40540554e-003, 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., + 1.08108111e-002, 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.40540554e-003, 0., 0., 3.24324332e-002, 1.62162166e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., + 5.40540554e-003, 0., 5.40540554e-003, 0., 5.40540554e-003, 0., + 5.40540554e-003, 0., 5.40540554e-003, 5.40540554e-003, + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., + 0., 0., 0., 5.40540554e-003, 0., 0., 0., 5.40540554e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.08108111e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.62162166e-002, 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., + 0., 0., 5.40540554e-003, 0., 5.40540554e-003, 5.40540554e-003, 0., + 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 5.40540554e-003, 0., 5.40540554e-003, + 5.40540554e-003, 0., 5.40540554e-003, 5.40540554e-003, 0., 0., 0., + 1.08108111e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., 5.40540554e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.08108111e-002, 0., 0., + 1.08108111e-002, 0., 0., 5.40540554e-003, 1.08108111e-002, 0., 0., + 0., 0., 0., 0., 1.08108111e-002, 5.40540554e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 5.78034669e-003, 0., 1.15606934e-002, 0., 1.15606934e-002, + 5.78034669e-003, 0., 1.15606934e-002, 0., 1.73410401e-002, + 1.15606934e-002, 5.78034669e-003, 1.15606934e-002, + 1.15606934e-002, 0., 0., 0., 4.62427735e-002, 5.78034669e-003, 0., + 5.78034669e-003, 2.31213868e-002, 0., 5.78034669e-003, + 1.15606934e-002, 1.15606934e-002, 5.78034669e-003, + 5.78034669e-003, 1.73410401e-002, 5.78034669e-003, 0., 0., 0., + 1.15606934e-002, 1.73410401e-002, 5.78034669e-003, 0., 0., + 5.78034669e-003, 0., 1.15606934e-002, 1.15606934e-002, + 5.78034669e-003, 1.15606934e-002, 1.15606934e-002, 0., 0., 0., 0., + 0., 5.78034669e-003, 0., 0., 0., 1.15606934e-002, 0., 0., 0., 0., + 1.15606934e-002, 0., 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 5.78034669e-003, 0., + 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 5.78034669e-003, 0., + 1.15606934e-002, 0., 0., 5.78034669e-003, 0., 0., 0., + 5.78034669e-003, 1.15606934e-002, 0., 0., 0., 0., 1.15606934e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., + 0., 0., 0., 1.15606934e-002, 5.78034669e-003, 5.78034669e-003, 0., + 0., 0., 0., 0., 0., 0., 1.15606934e-002, 0., 0., 0., + 1.73410401e-002, 1.15606934e-002, 0., 0., 0., 5.78034669e-003, 0., + 0., 1.15606934e-002, 0., 0., 5.78034669e-003, 0., 1.15606934e-002, + 0., 0., 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 5.78034669e-003, 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.15606934e-002, 5.78034669e-003, 1.15606934e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.15606934e-002, 0., 5.78034669e-003, 0., 0., + 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.78034669e-003, 0., 0., 0., 5.78034669e-003, 0., + 5.78034669e-003, 0., 0., 1.15606934e-002, 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 1.15606934e-002, 0., 0., 5.78034669e-003, + 0., 0., 0., 1.15606934e-002, 0., 0., 0., 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., + 1.15606934e-002, 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.15606934e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 5.78034669e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 0., 1.15606934e-002, 0., 1.15606934e-002, 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 5.78034669e-003, 5.78034669e-003, + 1.15606934e-002, 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.15606934e-002, 0., 0., 0., 1.73410401e-002, 0., 0., 0., 0., 0., + 0., 1.15606934e-002, 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., + 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 1.15606934e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 0., 5.49450563e-003, 0., 0., 0., 1.09890113e-002, 5.49450563e-003, + 0., 1.64835174e-002, 0., 5.49450563e-003, 5.49450563e-003, 0., + 2.19780225e-002, 1.09890113e-002, 1.09890113e-002, + 5.49450563e-003, 5.49450563e-003, 0., 5.49450563e-003, + 2.19780225e-002, 0., 1.64835174e-002, 2.19780225e-002, 0., 0., 0., + 4.94505502e-002, 0., 2.19780225e-002, 5.49450563e-003, + 1.64835174e-002, 1.09890113e-002, 0., 1.09890113e-002, + 1.09890113e-002, 0., 0., 0., 1.64835174e-002, 0., 0., 0., 0., 0., + 1.09890113e-002, 0., 0., 1.09890113e-002, 1.09890113e-002, 0., 0., + 1.09890113e-002, 5.49450563e-003, 5.49450563e-003, + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 2.19780225e-002, 0., + 0., 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., 5.49450563e-003, + 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., + 5.49450563e-003, 1.09890113e-002, 0., 0., 1.09890113e-002, 0., 0., + 0., 0., 5.49450563e-003, 0., 0., 5.49450563e-003, 5.49450563e-003, + 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 2.19780225e-002, 0., 0., + 1.09890113e-002, 5.49450563e-003, 0., 0., 0., 5.49450563e-003, + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 1.64835174e-002, 0., 5.49450563e-003, 0., 0., 1.09890113e-002, + 1.09890113e-002, 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., + 5.49450563e-003, 5.49450563e-003, 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 0., 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 0., 0., 1.09890113e-002, 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 2.19780225e-002, + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.09890113e-002, + 0., 5.49450563e-003, 0., 0., 0., 1.09890113e-002, 1.09890113e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.09890113e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.19780225e-002, 0., 0., 0., + 0., 5.49450563e-003, 0., 0., 0., 0., 0., 1.09890113e-002, 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, + 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, + 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.09890113e-002, 0., 5.49450563e-003, 1.09890113e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 5.49450563e-003, 1.64835174e-002, 0., 0., 0., 1.09890113e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.08695654e-002, 0., 5.43478271e-003, 5.43478271e-003, + 5.43478271e-003, 0., 5.43478271e-003, 3.26086953e-002, + 5.43478271e-003, 0., 1.08695654e-002, 0., 1.08695654e-002, + 5.43478271e-003, 1.08695654e-002, 5.43478271e-003, 0., + 1.08695654e-002, 1.08695654e-002, 5.43478271e-003, 0., 0., + 1.63043477e-002, 1.08695654e-002, 0., 0., 3.26086953e-002, + 5.43478271e-003, 5.43478271e-003, 2.17391308e-002, + 1.08695654e-002, 0., 0., 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 5.43478271e-003, 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 0., 1.08695654e-002, 5.43478271e-003, + 1.63043477e-002, 5.43478271e-003, 1.08695654e-002, 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 1.08695654e-002, + 1.08695654e-002, 5.43478271e-003, 0., 0., 0., 0., 1.08695654e-002, + 1.08695654e-002, 0., 2.17391308e-002, 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 0., 0., 1.08695654e-002, 5.43478271e-003, 0., 0., 2.17391308e-002, + 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 5.43478271e-003, + 1.08695654e-002, 0., 0., 0., 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 3.26086953e-002, 0., 0., + 5.43478271e-003, 2.17391308e-002, 0., 0., 5.43478271e-003, + 5.43478271e-003, 5.43478271e-003, 0., 0., 1.08695654e-002, 0., + 5.43478271e-003, 0., 0., 0., 0., 1.63043477e-002, 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 2.17391308e-002, 5.43478271e-003, 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 5.43478271e-003, 0., 5.43478271e-003, 0., 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 1.63043477e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.08695654e-002, 0., 0., 5.43478271e-003, 0., + 1.08695654e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 0., 0., 1.08695654e-002, 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 1.08695654e-002, 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 0., 5.43478271e-003, 0., 0., 0., 0., 0., 1.08695654e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 0., 5.43478271e-003, 0., 5.43478271e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 5.43478271e-003, 5.43478271e-003, 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 1.08695654e-002, 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., + 0., 0., 0., 0., 0., 5.43478271e-003, 0., 5.43478271e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 1.08695654e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.17391308e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 4.99999989e-003, 9.99999978e-003, 4.99999989e-003, + 1.49999997e-002, 9.99999978e-003, 4.99999989e-003, 0., 0., + 4.99999989e-003, 9.99999978e-003, 9.99999978e-003, + 4.99999989e-003, 1.99999996e-002, 0., 1.49999997e-002, + 4.99999989e-003, 0., 9.99999978e-003, 9.99999978e-003, + 9.99999978e-003, 0., 4.99999989e-003, 1.49999997e-002, 0., 0., 0., + 4.99999989e-003, 0., 9.99999978e-003, 0., 0., 1.49999997e-002, 0., + 0., 1.99999996e-002, 0., 0., 4.99999989e-003, 4.99999989e-003, + 9.99999978e-003, 0., 9.99999978e-003, 0., 1.49999997e-002, 0., + 4.99999989e-003, 0., 4.99999989e-003, 3.50000001e-002, 0., 0., + 4.99999989e-003, 0., 0., 0., 0., 0., 0., 4.99999989e-003, 0., 0., + 0., 4.99999989e-003, 0., 9.99999978e-003, 0., 0., 0., 0., 0., 0., + 0., 4.99999989e-003, 4.99999989e-003, 0., 4.99999989e-003, 0., 0., + 0., 0., 0., 0., 9.99999978e-003, 0., 4.99999989e-003, 0., 0., + 4.99999989e-003, 4.99999989e-003, 0., 0., 0., 0., 4.99999989e-003, + 0., 0., 0., 0., 0., 9.99999978e-003, 0., 9.99999978e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 4.99999989e-003, 1.49999997e-002, + 9.99999978e-003, 0., 0., 0., 0., 0., 0., 9.99999978e-003, + 9.99999978e-003, 0., 0., 0., 0., 1.49999997e-002, 4.99999989e-003, + 0., 4.99999989e-003, 3.50000001e-002, 0., 0., 0., 0., 0., + 4.99999989e-003, 0., 9.99999978e-003, 0., 0., 4.99999989e-003, 0., + 4.99999989e-003, 0., 2.99999993e-002, 0., 0., 0., 4.99999989e-003, + 0., 0., 4.99999989e-003, 0., 4.99999989e-003, 0., 0., 0., 0., 0., + 4.99999989e-003, 0., 0., 4.99999989e-003, 4.99999989e-003, + 4.99999989e-003, 4.99999989e-003, 4.99999989e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 4.99999989e-003, 0., 4.99999989e-003, 0., 0., 4.99999989e-003, 0., + 4.99999989e-003, 0., 0., 4.99999989e-003, 0., 0., 4.99999989e-003, + 4.99999989e-003, 9.99999978e-003, 0., 0., 0., 0., 0., 0., + 4.99999989e-003, 0., 0., 0., 0., 0., 4.99999989e-003, + 4.99999989e-003, 0., 0., 4.99999989e-003, 0., 0., 0., 0., 0., + 4.99999989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 9.99999978e-003, + 4.99999989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 4.99999989e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 4.99999989e-003, 0., 0., 4.99999989e-003, 9.99999978e-003, + 4.99999989e-003, 0., 0., 0., 0., 0., 0., 0., 4.99999989e-003, 0., + 4.99999989e-003, 0., 4.99999989e-003, 0., 4.99999989e-003, + 4.99999989e-003, 0., 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 4.99999989e-003, 4.99999989e-003, 0., 0., 4.99999989e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 4.99999989e-003, 0., 0., 0., 0., + 4.99999989e-003, 4.99999989e-003, 0., 4.99999989e-003, 0., 0., 0., + 0., 0., 0., 0., 1.49999997e-002, 0., 9.99999978e-003, 0., + 4.99999989e-003, 0., 0., 0., 0., 0., 9.99999978e-003, 0., 0., 0., + 0., 0., 4.99999989e-003, 4.99999989e-003, 4.99999989e-003, 0., 0., + 0., 0., 0., 0., 4.99999989e-003, 0., 0., 0., 9.99999978e-003, 0., + 0., 4.99999989e-003, 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 4.99999989e-003, 0., 0., 0., 9.99999978e-003, 0., + 0., 0., 0., 4.99999989e-003, 0., 0., 9.99999978e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 4.99999989e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 4.99999989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 4.99999989e-003, 0., 0., 9.99999978e-003, 0., 4.99999989e-003, + 9.99999978e-003, 0., 0., 0., 4.99999989e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 4.99999989e-003, 0., 4.99999989e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 4.99999989e-003, 0., + 0., 0., 0., 0., 0., 4.99999989e-003, 0., 4.99999989e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 4.99999989e-003, 0., 0., 0., 0., 0., 4.99999989e-003, 0., 0., 0., + 0., 5.81395347e-003, 1.16279069e-002, 0., 0., 0., 5.81395347e-003, + 0., 0., 1.16279069e-002, 2.90697664e-002, 1.16279069e-002, 0., 0., + 0., 5.81395347e-003, 0., 0., 5.81395347e-003, 0., 1.16279069e-002, + 5.81395347e-003, 1.16279069e-002, 5.81395347e-003, 0., + 5.81395347e-003, 0., 5.81395347e-003, 0., 0., 2.32558139e-002, + 5.81395347e-003, 2.90697664e-002, 0., 5.81395347e-003, 0., 0., 0., + 0., 2.90697664e-002, 5.81395347e-003, 5.81395347e-003, 0., + 5.81395347e-003, 5.81395347e-003, 0., 0., 0., 5.81395347e-003, + 4.06976752e-002, 0., 0., 5.81395347e-003, 5.81395347e-003, 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, + 5.81395347e-003, 0., 0., 0., 0., 5.81395347e-003, 0., + 5.81395347e-003, 5.81395347e-003, 5.81395347e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 1.16279069e-002, 0., 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.81395347e-003, 0., 5.81395347e-003, 0., 0., 0., + 1.16279069e-002, 0., 0., 0., 0., 0., 4.06976752e-002, + 5.81395347e-003, 0., 5.81395347e-003, 8.13953504e-002, + 1.16279069e-002, 0., 0., 0., 5.81395347e-003, 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 5.81395347e-003, + 5.81395347e-003, 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 5.81395328e-002, 0., 1.74418613e-002, 0., 5.81395347e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 5.81395347e-003, + 0., 0., 5.81395347e-003, 0., 0., 5.81395347e-003, 0., + 5.81395347e-003, 0., 5.81395347e-003, 5.81395347e-003, 0., 0., 0., + 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, + 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., + 0., 0., 0., 0., 1.74418613e-002, 0., 5.81395347e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 5.81395347e-003, 0., 5.81395347e-003, 0., 0., 0., 5.81395347e-003, + 1.74418613e-002, 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.81395347e-003, 0., 1.16279069e-002, 0., 0., 0., 0., + 0., 5.81395347e-003, 0., 0., 5.81395347e-003, 0., 0., 0., + 1.16279069e-002, 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., + 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 5.81395347e-003, + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 1.16279069e-002, + 0., 0., 0., 0., 0., 0., 0., 1.74418613e-002, 5.81395347e-003, + 5.81395347e-003, 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.16279069e-002, 0., 0., + 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., + 1.16279069e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.16279069e-002, 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.16279069e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.19047621e-002, 5.95238106e-003, 0., + 0., 5.95238106e-003, 0., 0., 0., 1.19047621e-002, 1.19047621e-002, + 0., 5.95238106e-003, 5.95238106e-003, 1.19047621e-002, + 5.95238106e-003, 5.95238106e-003, 0., 5.95238106e-003, + 1.19047621e-002, 0., 0., 5.95238106e-003, 0., 0., 1.19047621e-002, + 5.95238106e-003, 5.95238106e-003, 1.78571437e-002, 0., + 5.95238106e-003, 1.78571437e-002, 0., 1.19047621e-002, 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 1.19047621e-002, 0., 0., + 0., 0., 0., 1.19047621e-002, 0., 0., 2.38095243e-002, + 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., 0., 0., + 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 5.95238106e-003, + 1.19047621e-002, 1.78571437e-002, 0., 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 0., 5.95238106e-003, 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 1.78571437e-002, 5.95238106e-003, + 1.19047621e-002, 5.95238106e-003, 5.95238106e-003, 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., + 0., 1.19047621e-002, 5.95238106e-003, 5.95238106e-003, + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., + 5.95238106e-003, 0., 2.38095243e-002, 0., 0., 0., 1.78571437e-002, + 1.19047621e-002, 0., 5.95238106e-003, 0., 1.19047621e-002, 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 5.95238106e-003, + 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 1.19047621e-002, 5.95238106e-003, 0., 1.19047621e-002, 0., 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 0., 0., 5.95238106e-003, 0., 1.19047621e-002, 0., 0., + 5.95238106e-003, 0., 0., 0., 2.38095243e-002, 5.95238106e-003, + 1.19047621e-002, 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., 5.95238106e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.19047621e-002, + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 5.95238106e-003, + 0., 0., 0., 5.95238106e-003, 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.78571437e-002, 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 1.19047621e-002, 0., 5.95238106e-003, 0., 0., 0., 0., + 1.19047621e-002, 0., 5.95238106e-003, 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 0., 1.19047621e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 5.95238106e-003, 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.19047621e-002, 0., + 5.95238106e-003, 0., 5.95238106e-003, 0., 0., 5.95238106e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 1.63043477e-002, 1.08695654e-002, + 0., 5.43478271e-003, 0., 2.17391308e-002, 0., 0., 0., + 1.63043477e-002, 0., 0., 1.08695654e-002, 5.43478271e-003, + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 2.17391308e-002, + 5.43478271e-003, 0., 5.43478271e-003, 5.43478271e-003, 0., + 1.08695654e-002, 5.43478271e-003, 0., 1.08695654e-002, 0., + 1.08695654e-002, 0., 5.43478271e-003, 0., 5.43478271e-003, 0., + 5.43478271e-003, 5.43478271e-003, 0., 5.43478271e-003, 0., + 1.08695654e-002, 5.43478271e-003, 0., 1.08695654e-002, + 2.17391308e-002, 0., 0., 0., 0., 0., 0., 1.63043477e-002, 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 1.63043477e-002, 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 5.43478271e-003, 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 2.17391308e-002, 0., 0., 5.43478271e-003, + 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 2.71739140e-002, 0., 5.43478271e-003, 5.43478271e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., + 2.71739140e-002, 0., 0., 0., 6.52173907e-002, 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 1.08695654e-002, + 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, 5.43478271e-003, + 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 1.63043477e-002, 0., + 0., 0., 0., 0., 1.63043477e-002, 0., 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.08695654e-002, 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 1.08695654e-002, + 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 3.80434804e-002, 0., 5.43478271e-003, 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.43478271e-003, 0., 0., 5.43478271e-003, 0., 1.63043477e-002, + 0., 5.43478271e-003, 5.43478271e-003, 0., 0., 1.08695654e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 1.08695654e-002, 1.63043477e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.08695654e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.08695654e-002, 0., 1.08695654e-002, 0., 0., 0., + 0., 5.43478271e-003, 0., 0., 1.08695654e-002, 0., 0., + 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.08695654e-002, 0., 0., + 0., 1.08695654e-002, 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.08695654e-002, + 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., + 5.43478271e-003, 1.63043477e-002, 5.43478271e-003, 0., 0., + 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., + 0., 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 5.43478271e-003, 0., 1.08695654e-002, 0., + 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 0., 2.38095243e-002, 0., 5.95238106e-003, 0., 0., 5.95238106e-003, + 0., 0., 5.95238106e-003, 1.19047621e-002, 0., 0., 1.19047621e-002, + 0., 1.19047621e-002, 0., 0., 3.57142873e-002, 0., 0., 0., + 1.19047621e-002, 5.95238106e-003, 5.95238106e-003, 0., 0., + 3.57142873e-002, 0., 1.19047621e-002, 1.78571437e-002, + 5.95238106e-003, 2.38095243e-002, 0., 0., 5.95238106e-003, 0., 0., + 5.95238106e-003, 0., 2.38095243e-002, 0., 0., 0., 0., 0., + 5.95238106e-003, 5.95238106e-003, 5.95238106e-003, + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., + 5.95238106e-003, 0., 0., 1.19047621e-002, 0., 0., 0., + 1.78571437e-002, 0., 5.95238106e-003, 0., 0., 5.95238106e-003, + 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.19047621e-002, 0., + 0., 0., 2.97619049e-002, 0., 0., 0., 5.95238106e-003, 0., + 2.38095243e-002, 0., 0., 0., 1.19047621e-002, 0., 0., 0., 0., 0., + 0., 0., 1.19047621e-002, 0., 0., 1.19047621e-002, 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 1.78571437e-002, 0., 0., 0., + 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 4.16666679e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., + 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 0., 0., 5.95238106e-003, + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., + 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.95238106e-003, 5.95238106e-003, 0., 0., + 1.19047621e-002, 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.19047621e-002, 0., 5.95238106e-003, 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 1.19047621e-002, 0., 5.95238106e-003, + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 2.97619049e-002, 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 1.78571437e-002, 5.95238106e-003, 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 1.75438598e-002, 5.84795326e-003, 5.84795326e-003, 0., + 5.84795326e-003, 5.84795326e-003, 0., 5.84795326e-003, + 1.16959065e-002, 5.84795326e-003, 5.84795326e-003, + 5.84795326e-003, 5.84795326e-003, 5.84795326e-003, 0., + 5.84795326e-003, 0., 1.16959065e-002, 0., 5.84795326e-003, 0., 0., + 0., 0., 0., 0., 1.16959065e-002, 0., 5.84795326e-003, 0., 0., + 5.26315793e-002, 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 1.75438598e-002, 0., 0., 5.84795326e-003, 0., 5.84795326e-003, + 1.75438598e-002, 0., 0., 1.75438598e-002, 5.84795326e-003, 0., 0., + 0., 0., 5.84795326e-003, 1.16959065e-002, 0., 1.75438598e-002, 0., + 0., 0., 0., 5.84795326e-003, 0., 1.16959065e-002, 5.84795326e-003, + 0., 0., 1.16959065e-002, 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 1.16959065e-002, 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.84795326e-003, 0., 0., 1.75438598e-002, 0., + 1.16959065e-002, 5.84795326e-003, 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 0., 5.84795326e-003, 1.16959065e-002, 0., 0., 0., + 0., 5.84795326e-003, 0., 0., 1.16959065e-002, 5.84795326e-003, 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 1.75438598e-002, 0., 0., 0., 3.50877196e-002, 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 0., 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 1.75438598e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 5.84795326e-003, + 1.16959065e-002, 0., 0., 0., 0., 1.16959065e-002, 0., 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16959065e-002, 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 5.84795326e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.33918130e-002, + 0., 1.16959065e-002, 1.75438598e-002, 0., 0., 0., 0., + 5.84795326e-003, 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., + 1.75438598e-002, 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 2.92397663e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 5.84795326e-003, 2.33918130e-002, + 5.84795326e-003, 5.84795326e-003, 1.16959065e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 5.84795326e-003, 0., + 0., 1.16959065e-002, 0., 5.84795326e-003, 0., 0., 5.84795326e-003, + 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.06185561e-002, 0., 5.15463902e-003, 0., + 5.15463902e-003, 1.54639166e-002, 1.54639166e-002, 0., + 5.15463902e-003, 0., 0., 0., 1.03092780e-002, 1.54639166e-002, + 1.54639166e-002, 1.03092780e-002, 1.54639166e-002, + 5.15463902e-003, 5.15463902e-003, 0., 0., 5.15463902e-003, 0., + 3.09278332e-002, 0., 1.03092780e-002, 1.54639166e-002, + 1.03092780e-002, 0., 0., 5.15463902e-003, 5.15463902e-003, 0., + 1.03092780e-002, 0., 1.03092780e-002, 2.06185561e-002, 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.54639166e-002, 0., 2.57731955e-002, 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 5.15463902e-003, 0., 0., 0., 1.03092780e-002, + 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.03092780e-002, 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 5.15463902e-003, 0., + 5.15463902e-003, 1.03092780e-002, 2.57731955e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 1.03092780e-002, 0., + 0., 0., 5.15463902e-003, 0., 0., 0., 0., 3.09278332e-002, 0., 0., + 0., 2.06185561e-002, 0., 0., 1.03092780e-002, 0., 0., 0., 0., + 2.06185561e-002, 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 5.15463902e-003, 5.15463902e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., + 3.09278332e-002, 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.15463902e-003, 0., 0., 1.03092780e-002, + 5.15463902e-003, 0., 5.15463902e-003, 0., 5.15463902e-003, + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.15463902e-003, 0., 5.15463902e-003, 5.15463902e-003, 0., + 1.03092780e-002, 0., 5.15463902e-003, 0., 0., 0., 1.03092780e-002, + 0., 0., 0., 0., 3.09278332e-002, 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 5.15463902e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 2.06185561e-002, + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 5.15463902e-003, 5.15463902e-003, 0., 0., + 1.03092780e-002, 0., 5.15463902e-003, 0., 0., 5.15463902e-003, + 2.57731955e-002, 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 1.03092780e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.15463902e-003, 0., 5.15463902e-003, 0., 0., 0., + 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., + 5.15463902e-003, 0., 5.15463902e-003, 0., 0., 5.15463902e-003, 0., + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 1.03092780e-002, + 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 1.54639166e-002, 0., 0., 5.15463902e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 0., 1.03092780e-002, 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, + 5.15463902e-003, 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.03092780e-002, + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 5.15463902e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.03092780e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., + 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., + 1.63934417e-002, 8.19672085e-003, 8.19672085e-003, + 8.19672085e-003, 0., 0., 0., 3.27868834e-002, 2.45901626e-002, + 8.19672085e-003, 0., 1.63934417e-002, 0., 8.19672085e-003, 0., 0., + 3.27868834e-002, 8.19672085e-003, 0., 1.63934417e-002, 0., 0., 0., + 0., 8.19672085e-003, 1.63934417e-002, 0., 2.45901626e-002, 0., 0., + 8.19672085e-003, 0., 8.19672085e-003, 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 8.19672085e-003, 0., 0., + 8.19672085e-003, 1.63934417e-002, 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 8.19672085e-003, 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 8.19672085e-003, + 8.19672085e-003, 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 2.45901626e-002, 0., 0., 8.19672085e-003, 0., + 0., 0., 0., 0., 0., 0., 8.19672085e-003, 8.19672085e-003, 0., 0., + 0., 0., 0., 0., 0., 1.63934417e-002, 0., 8.19672085e-003, 0., 0., + 0., 8.19672085e-003, 0., 0., 1.63934417e-002, 0., 0., 0., 0., + 1.63934417e-002, 0., 0., 8.19672085e-003, 1.63934417e-002, 0., 0., + 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 2.45901626e-002, 0., + 0., 8.19672085e-003, 8.19672085e-003, 0., 0., 0., 8.19672085e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 3.27868834e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.63934417e-002, 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 8.19672085e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, + 8.19672085e-003, 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 8.19672085e-003, + 0., 0., 0., 8.19672085e-003, 1.63934417e-002, 0., 0., 0., + 1.63934417e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 8.19672085e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., + 1.63934417e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 8.19672085e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., + 0., 0., 8.19672085e-003, 0., 8.19672085e-003, 0., 0., + 8.19672085e-003, 0., 8.19672085e-003, 8.19672085e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.45901626e-002, 0., 0., + 1.63934417e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 1.63934417e-002, + 1.63934417e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.63934417e-002, 8.19672085e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.63934417e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.61290318e-002, 8.06451589e-003, 0., 0., 0., 0., 0., + 0., 1.61290318e-002, 8.06451589e-003, 2.41935477e-002, 0., + 8.06451589e-003, 0., 0., 8.06451589e-003, 0., 0., 8.06451589e-003, + 8.06451589e-003, 0., 8.06451589e-003, 2.41935477e-002, + 8.06451589e-003, 0., 8.06451589e-003, 2.41935477e-002, + 1.61290318e-002, 1.61290318e-002, 2.41935477e-002, + 8.06451589e-003, 1.61290318e-002, 0., 8.06451589e-003, 0., + 8.06451589e-003, 0., 0., 8.06451589e-003, 0., 0., 0., 0., + 1.61290318e-002, 8.06451589e-003, 8.06451589e-003, + 8.06451589e-003, 8.06451589e-003, 2.41935477e-002, 0., 0., + 1.61290318e-002, 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., + 0., 8.06451589e-003, 0., 0., 0., 0., 8.06451589e-003, + 8.06451589e-003, 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.06451589e-003, 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 1.61290318e-002, 0., 0., 0., 0., 0., + 0., 0., 8.06451589e-003, 8.06451589e-003, 0., 0., 8.06451589e-003, + 1.61290318e-002, 0., 0., 8.06451589e-003, 8.06451589e-003, 0., 0., + 0., 0., 8.06451589e-003, 0., 0., 8.06451589e-003, 2.41935477e-002, + 8.06451589e-003, 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.06451589e-003, 0., 8.06451589e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., + 8.06451589e-003, 5.64516112e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.06451589e-003, 0., 8.06451589e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 3.22580636e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.06451589e-003, 8.06451589e-003, 0., 0., 0., + 8.06451589e-003, 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 8.06451589e-003, 0., 0., + 8.06451589e-003, 0., 0., 0., 8.06451589e-003, 0., 8.06451589e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 8.06451589e-003, 0., 0., 0., + 1.61290318e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, + 1.61290318e-002, 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 1.61290318e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.61797759e-003, 1.12359552e-002, 0., 0., 0., + 0., 0., 5.61797759e-003, 2.24719103e-002, 0., 1.68539323e-002, + 5.61797759e-003, 1.12359552e-002, 0., 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 1.12359552e-002, 0., 0., 0., 0., + 1.12359552e-002, 5.61797759e-003, 5.61797759e-003, + 5.61797759e-003, 2.24719103e-002, 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 1.12359552e-002, + 1.12359552e-002, 0., 0., 1.12359552e-002, 5.61797759e-003, 0., 0., + 1.12359552e-002, 1.12359552e-002, 0., 0., 0., 0., 5.61797759e-003, + 2.24719103e-002, 0., 1.68539323e-002, 2.24719103e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.12359552e-002, 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 1.12359552e-002, 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.61797759e-003, 0., 0., 5.61797759e-003, 5.61797759e-003, + 1.68539323e-002, 0., 0., 1.12359552e-002, 1.12359552e-002, 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 1.12359552e-002, 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 1.12359552e-002, + 5.61797759e-003, 0., 1.12359552e-002, 0., 1.68539323e-002, 0., 0., + 0., 2.24719103e-002, 0., 0., 5.61797759e-003, 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 1.12359552e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.68539323e-002, 0., 5.61797759e-003, 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 1.68539323e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 1.12359552e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 2.24719103e-002, 0., 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., + 0., 0., 2.24719103e-002, 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., + 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 1.12359552e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 5.23560215e-003, 5.23560215e-003, 0., 0., 0., 0., + 0., 1.57068074e-002, 1.04712043e-002, 0., 1.57068074e-002, + 1.04712043e-002, 0., 5.23560215e-003, 0., 1.04712043e-002, 0., + 5.23560215e-003, 0., 5.23560215e-003, 1.57068074e-002, + 5.23560215e-003, 0., 0., 5.23560215e-003, 5.23560215e-003, + 1.04712043e-002, 5.23560215e-003, 5.23560215e-003, + 5.23560215e-003, 0., 0., 0., 0., 0., 5.23560215e-003, + 2.09424086e-002, 1.57068074e-002, 0., 0., 1.04712043e-002, 0., 0., + 2.61780098e-002, 0., 0., 1.57068074e-002, 0., 0., 0., 0., 0., + 1.04712043e-002, 3.66492160e-002, 0., 5.23560215e-003, + 5.23560215e-003, 5.23560215e-003, 0., 0., 1.04712043e-002, + 1.04712043e-002, 0., 0., 0., 0., 0., 1.57068074e-002, 0., 0., 0., + 5.23560215e-003, 0., 5.23560215e-003, 0., 0., 5.23560215e-003, + 5.23560215e-003, 0., 0., 0., 0., 1.57068074e-002, 0., + 1.04712043e-002, 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, + 5.23560215e-003, 5.23560215e-003, 0., 0., 0., 5.23560215e-003, 0., + 0., 0., 5.23560215e-003, 0., 0., 0., 0., 5.23560215e-003, 0., + 5.23560215e-003, 5.23560215e-003, 0., 0., 0., 0., 0., + 5.23560215e-003, 1.57068074e-002, 0., 0., 0., 0., 5.23560215e-003, + 0., 1.04712043e-002, 0., 0., 0., 2.09424086e-002, 5.23560215e-003, + 0., 5.23560215e-003, 0., 0., 0., 5.23560215e-003, 5.23560215e-003, + 0., 0., 0., 0., 5.23560215e-003, 1.57068074e-002, 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 5.23560215e-003, 0., 0., 5.23560215e-003, 0., + 1.57068074e-002, 0., 0., 0., 1.57068074e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.23560215e-003, 1.04712043e-002, 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 1.04712043e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, 5.23560215e-003, + 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.23560215e-003, 5.23560215e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.23560215e-003, 0., 0., 1.04712043e-002, 0., + 1.04712043e-002, 0., 5.23560215e-003, 1.57068074e-002, 0., + 5.23560215e-003, 5.23560215e-003, 1.04712043e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., + 5.23560215e-003, 5.23560215e-003, 0., 0., 0., 5.23560215e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., + 5.23560215e-003, 0., 5.23560215e-003, 0., 5.23560215e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.04712043e-002, 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., + 0., 5.23560215e-003, 0., 0., 0., 5.23560215e-003, 5.23560215e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., + 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., + 2.09424086e-002, 0., 0., 0., 0., 1.04712043e-002, 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.04712043e-002, 0., 0., + 5.23560215e-003, 0., 5.23560215e-003, 0., 0., 5.23560215e-003, 0., + 0., 5.23560215e-003, 0., 0., 0., 0., 0., 1.04712043e-002, 0., 0., + 0., 0., 0., 0., 0., 5.23560215e-003, 5.23560215e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 5.23560215e-003, + 0., 0., 0., 5.23560215e-003, 0., 5.23560215e-003, 0., 0., 0., 0., + 0., 0., 0., 5.23560215e-003, 0., 0., 5.23560215e-003, 0., 0., 0., + 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.57068074e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.23560215e-003, 1.04712043e-002, 0., 0., + 0., 0., 0., 0., 1.81818176e-002, 6.06060587e-003, 6.06060587e-003, + 0., 6.06060587e-003, 6.06060587e-003, 0., 0., 6.06060587e-003, + 6.06060587e-003, 0., 1.21212117e-002, 1.21212117e-002, + 6.06060587e-003, 0., 0., 6.06060587e-003, 1.81818176e-002, 0., 0., + 6.06060587e-003, 1.21212117e-002, 1.81818176e-002, 0., + 6.06060587e-003, 6.06060587e-003, 6.06060587e-003, 0., + 1.81818176e-002, 1.21212117e-002, 1.21212117e-002, + 1.21212117e-002, 0., 0., 6.06060587e-003, 6.06060587e-003, + 6.06060587e-003, 0., 1.81818176e-002, 0., 0., 0., 0., + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 3.03030293e-002, + 6.06060587e-003, 0., 1.21212117e-002, 6.06060587e-003, + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., + 1.21212117e-002, 0., 0., 6.06060587e-003, 0., 0., 0., + 6.06060587e-003, 6.06060587e-003, 0., 0., 6.06060587e-003, 0., 0., + 6.06060587e-003, 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., 1.21212117e-002, + 0., 0., 0., 1.21212117e-002, 0., 1.21212117e-002, 0., + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 6.06060587e-003, 0., + 0., 0., 6.06060587e-003, 0., 0., 6.06060587e-003, 6.06060587e-003, + 6.06060587e-003, 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 0., + 0., 0., 2.42424235e-002, 0., 0., 6.06060587e-003, 6.06060587e-003, + 1.21212117e-002, 0., 0., 0., 0., 6.06060587e-003, 0., + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., + 6.06060587e-003, 0., 0., 0., 1.81818176e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., + 6.06060587e-003, 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., + 1.21212117e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.21212117e-002, 0., 0., 3.63636352e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 6.06060587e-003, 0., + 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 6.06060587e-003, 0., + 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., + 1.21212117e-002, 6.06060587e-003, 0., 0., 0., 6.06060587e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.81818176e-002, + 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, + 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.06060587e-003, 6.06060587e-003, 0., 6.06060587e-003, + 6.06060587e-003, 1.21212117e-002, 0., 0., 0., 0., 6.06060587e-003, + 0., 6.06060587e-003, 0., 0., 0., 1.21212117e-002, 0., 0., 0., 0., + 1.21212117e-002, 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., + 0., 0., 0., 0., 6.06060587e-003, 0., 6.06060587e-003, 0., 0., 0., + 0., 0., 1.21212117e-002, 0., 0., 6.06060587e-003, 0., 0., 0., 0., + 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 6.06060587e-003, 0., + 0., 0., 0., 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 6.06060587e-003, + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 6.06060587e-003, 6.06060587e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 7.87401572e-003, + 7.87401572e-003, 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.87401572e-003, 7.87401572e-003, 0., 0., 0., 0., 0., + 7.87401572e-003, 7.87401572e-003, 7.87401572e-003, 0., 0., + 1.57480314e-002, 7.87401572e-003, 7.87401572e-003, 0., + 7.87401572e-003, 0., 0., 7.87401572e-003, 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 7.87401572e-003, 0., + 7.87401572e-003, 0., 1.57480314e-002, 4.72440943e-002, 0., 0., 0., + 0., 0., 1.57480314e-002, 3.14960629e-002, 0., 7.87401572e-003, + 7.87401572e-003, 0., 0., 0., 7.87401572e-003, 0., 7.87401572e-003, + 0., 0., 0., 0., 7.87401572e-003, 7.87401572e-003, 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, + 0., 1.57480314e-002, 0., 7.87401572e-003, 0., 0., 7.87401572e-003, + 7.87401572e-003, 0., 0., 0., 0., 2.36220472e-002, 0., 0., 0., 0., + 1.57480314e-002, 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 7.87401572e-003, 0., 0., + 2.36220472e-002, 0., 0., 0., 4.72440943e-002, 7.87401572e-003, 0., + 0., 0., 7.87401572e-003, 7.87401572e-003, 0., 0., 0., 0., 0., 0., + 0., 1.57480314e-002, 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., + 0., 0., 7.87401572e-003, 0., 0., 0., 1.57480314e-002, + 1.57480314e-002, 0., 0., 0., 7.87401572e-003, 1.57480314e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., + 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 7.87401572e-003, 0., + 0., 0., 1.57480314e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.87401572e-003, 0., 7.87401572e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 2.36220472e-002, 0., 0., 0., 7.87401572e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., + 7.87401572e-003, 2.36220472e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.87401572e-003, 0., 0., 0., 0., 7.87401572e-003, 0., 0., + 1.57480314e-002, 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.36220472e-002, 0., 7.87401572e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.57480314e-002, 0., 0., 0., 1.57480314e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.57480314e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.57480314e-002, 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.87401572e-003, 0., 0., 0., 7.87401572e-003, 0., 0., 0., + 0., 0., 7.87401572e-003, 0., 0., 0., 7.87401572e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.87401572e-003, 0., 0., 0., 1.57480314e-002, 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.87401572e-003, 0., 0., 7.87401572e-003, 0., 0., 0., 0., + 3.17460299e-002, 1.58730149e-002, 5.29100513e-003, + 1.05820103e-002, 0., 5.29100513e-003, 0., 5.29100513e-003, + 1.05820103e-002, 1.05820103e-002, 0., 5.29100513e-003, 0., 0., 0., + 2.11640205e-002, 1.05820103e-002, 0., 0., 0., 0., 1.58730149e-002, + 5.29100513e-003, 0., 0., 0., 1.58730149e-002, 0., 1.58730149e-002, + 5.29100513e-003, 0., 1.58730149e-002, 0., 0., 0., 0., 0., + 1.05820103e-002, 5.29100513e-003, 5.29100513e-003, 0., 0., + 5.29100513e-003, 1.58730149e-002, 0., 5.29100513e-003, 0., + 2.11640205e-002, 1.05820103e-002, 0., 0., 5.29100513e-003, 0., + 5.29100513e-003, 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., + 0., 0., 5.29100513e-003, 5.29100513e-003, 0., 0., 0., 0., 0., + 5.29100513e-003, 5.29100513e-003, 0., 0., 0., 0., 5.29100513e-003, + 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., 5.29100513e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 1.58730149e-002, 0., + 0., 0., 0., 5.29100513e-003, 1.05820103e-002, 5.29100513e-003, 0., + 5.29100513e-003, 0., 0., 0., 5.29100513e-003, 0., 5.29100513e-003, + 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 5.29100513e-003, 0., 3.17460299e-002, + 0., 5.29100513e-003, 0., 4.76190448e-002, 0., 0., 5.29100513e-003, + 0., 0., 0., 0., 1.05820103e-002, 0., 0., 0., 0., 5.29100513e-003, + 0., 0., 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.05820103e-002, 5.29100513e-003, 5.29100513e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 1.05820103e-002, 5.29100513e-003, 0., 0., 0., 0., + 0., 5.29100513e-003, 0., 0., 5.29100513e-003, 5.29100513e-003, + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 5.29100513e-003, 0., + 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 1.05820103e-002, 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 3.17460299e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.05820103e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 5.29100513e-003, 1.58730149e-002, + 5.29100513e-003, 0., 5.29100513e-003, 1.05820103e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.58730149e-002, 0., 0., 0., 0., 5.29100513e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 5.29100513e-003, 0., + 0., 0., 0., 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 0., + 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 5.29100513e-003, + 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 1.05820103e-002, 0., 5.29100513e-003, 0., 0., + 0., 0., 5.29100513e-003, 0., 5.29100513e-003, 1.05820103e-002, 0., + 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.58730149e-002, 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.05820103e-002, 0., 5.29100513e-003, 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 5.29100513e-003, + 2.11640205e-002, 0., 5.29100513e-003, 0., 0., 0., 0., + 5.29100513e-003, 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.29100513e-003, 0., + 0., 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 1.05820103e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 5.29100513e-003, 0., 5.29100513e-003, 0., 0., + 0., 0., 5.29100513e-003, 0., 0., 0., 5.29100513e-003, 0., 0., 0., + 0., 0., 0., 0., 5.29100513e-003, 0., 0., 0., 0., 0., + 5.29100513e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 1.19047621e-002, 1.78571437e-002, + 5.95238106e-003, 0., 1.19047621e-002, 0., 5.95238106e-003, + 1.78571437e-002, 0., 1.78571437e-002, 0., 2.97619049e-002, 0., 0., + 5.95238106e-003, 0., 2.38095243e-002, 5.95238106e-003, + 5.95238106e-003, 0., 0., 1.19047621e-002, 5.95238106e-003, 0., + 5.95238106e-003, 1.78571437e-002, 0., 5.95238106e-003, + 5.95238106e-003, 0., 2.38095243e-002, 5.95238106e-003, 0., + 1.19047621e-002, 0., 0., 0., 0., 1.78571437e-002, 0., 0., + 5.95238106e-003, 0., 0., 2.38095243e-002, 0., 5.95238106e-003, + 2.38095243e-002, 5.95238106e-003, 0., 0., 5.95238106e-003, 0., + 5.95238106e-003, 1.19047621e-002, 0., 0., 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 0., 1.78571437e-002, 0., 0., 0., 0., 5.95238106e-003, + 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 5.95238106e-003, 5.95238106e-003, 0., 0., 5.95238106e-003, 0., + 1.78571437e-002, 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 5.95238106e-003, 0., + 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 1.78571437e-002, 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., + 5.95238106e-003, 0., 1.19047621e-002, 0., 0., 1.19047621e-002, 0., + 0., 0., 0., 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.95238106e-003, 0., 0., 5.95238106e-003, + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.19047621e-002, + 0., 0., 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.19047621e-002, 0., 0., 0., 1.19047621e-002, 0., 0., + 0., 5.95238106e-003, 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.19047621e-002, 0., 0., 0., 0., 0., 5.95238106e-003, + 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 5.95238106e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., 0., 0., + 5.95238106e-003, 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.19047621e-002, 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.95238106e-003, 1.19047621e-002, 0., + 0., 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.95238106e-003, 5.95238106e-003, 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 5.95238106e-003, 0., 0., 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.19047621e-002, 0., 0., 5.95238106e-003, 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.95238106e-003, 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 5.95238106e-003, 0., 0., 0., 0., 0., 1.19047621e-002, 0., 0., + 0., 0., 0., 5.95238106e-003, 0., 0., 0., 5.95238106e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 5.95238106e-003, 0., 5.95238106e-003, + 1.03092780e-002, 1.03092780e-002, 5.15463902e-003, + 1.03092780e-002, 0., 5.15463902e-003, 0., 1.03092780e-002, + 5.15463902e-003, 1.03092780e-002, 5.15463902e-003, + 1.03092780e-002, 1.03092780e-002, 0., 5.15463902e-003, + 1.54639166e-002, 0., 1.54639166e-002, 1.03092780e-002, 0., + 1.03092780e-002, 5.15463902e-003, 5.15463902e-003, + 5.15463902e-003, 0., 0., 1.54639166e-002, 0., 0., 0., + 5.15463902e-003, 5.15463902e-003, 0., 1.54639166e-002, + 5.15463902e-003, 5.15463902e-003, 0., 0., 0., 5.15463902e-003, + 1.03092780e-002, 0., 0., 0., 0., 5.15463902e-003, 0., + 1.03092780e-002, 5.15463902e-003, 1.03092780e-002, 0., 0., 0., 0., + 1.03092780e-002, 5.15463902e-003, 0., 0., 5.15463902e-003, 0., + 5.15463902e-003, 0., 1.54639166e-002, 0., 5.15463902e-003, 0., 0., + 0., 5.15463902e-003, 0., 5.15463902e-003, 0., 5.15463902e-003, + 1.03092780e-002, 0., 0., 0., 5.15463902e-003, 5.15463902e-003, + 1.03092780e-002, 0., 0., 0., 0., 2.06185561e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.15463902e-003, 0., 5.15463902e-003, 0., + 5.15463902e-003, 0., 5.15463902e-003, 5.15463902e-003, 0., 0., 0., + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 5.15463902e-003, + 1.03092780e-002, 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 0., 0., 0., 2.57731955e-002, 5.15463902e-003, 5.15463902e-003, + 5.15463902e-003, 2.57731955e-002, 0., 0., 5.15463902e-003, 0., + 1.03092780e-002, 1.03092780e-002, 0., 5.15463902e-003, 0., 0., + 1.03092780e-002, 0., 0., 1.03092780e-002, 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.03092780e-002, 0., 0., 0., 1.54639166e-002, 5.15463902e-003, 0., + 0., 1.03092780e-002, 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.03092780e-002, 0., 0., 0., 0., 0., 1.03092780e-002, + 5.15463902e-003, 0., 0., 0., 5.15463902e-003, 0., 5.15463902e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, + 5.15463902e-003, 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.15463902e-003, 5.15463902e-003, 0., 0., 0., + 1.03092780e-002, 0., 0., 0., 0., 5.15463902e-003, 5.15463902e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 5.15463902e-003, 0., 5.15463902e-003, 0., 0., 5.15463902e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.03092780e-002, 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 1.03092780e-002, 0., 0., 0., 0., 0., 0., + 5.15463902e-003, 0., 1.03092780e-002, 0., 0., 0., 0., 0., 0., 0., + 1.03092780e-002, 0., 0., 2.57731955e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 5.15463902e-003, 0., 0., 5.15463902e-003, 0., 0., 0., 0., + 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.15463902e-003, 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., + 5.15463902e-003, 0., 0., 0., 1.03092780e-002, 0., 0., + 1.03092780e-002, 0., 5.15463902e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.03092780e-002, 0., 0., 5.15463902e-003, + 1.03092780e-002, 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 5.15463902e-003, 1.03092780e-002, 0., 0., 0., 5.15463902e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.15463902e-003, 0., 0., + 1.03092780e-002, 0., 0., 0., 0., 0., 0., 0., 0., 1.03092780e-002, + 0., 0., 5.15463902e-003, 0., 0., 0., 5.15463902e-003, 0., 0., + 1.03092780e-002, 0., 0., 0., 5.15463902e-003, 0., 0., 0., 0., 0., + 0., 5.15463902e-003, 0., 0., 0., 1.73913036e-002, 0., + 8.69565178e-003, 0., 0., 8.69565178e-003, 0., 0., 0., + 8.69565178e-003, 8.69565178e-003, 0., 1.73913036e-002, 0., 0., + 8.69565178e-003, 8.69565178e-003, 8.69565178e-003, 0., + 3.47826071e-002, 8.69565178e-003, 8.69565178e-003, 0., 0., 0., 0., + 8.69565178e-003, 0., 1.73913036e-002, 0., 8.69565178e-003, 0., 0., + 5.21739125e-002, 0., 8.69565178e-003, 0., 0., 0., 1.73913036e-002, + 0., 0., 0., 8.69565178e-003, 0., 0., 0., 1.73913036e-002, + 1.73913036e-002, 0., 8.69565178e-003, 8.69565178e-003, 0., 0., + 8.69565178e-003, 8.69565178e-003, 0., 0., 8.69565178e-003, 0., 0., + 0., 1.73913036e-002, 0., 8.69565178e-003, 0., 0., 8.69565178e-003, + 1.73913036e-002, 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., + 0., 8.69565178e-003, 0., 0., 8.69565178e-003, 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., + 0., 8.69565178e-003, 0., 8.69565178e-003, 8.69565178e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.73913036e-002, 0., 8.69565178e-003, 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 8.69565178e-003, 0., 8.69565178e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 8.69565178e-003, + 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., 2.60869563e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., + 0., 0., 0., 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., + 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.73913036e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., + 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.60869563e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 2.60869563e-002, 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 1.73913036e-002, + 0., 0., 0., 8.69565178e-003, 0., 8.69565178e-003, 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.60869563e-002, 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., + 0., 0., 0., 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., + 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 1.73913036e-002, + 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.52380989e-003, 0., 0., 9.52380989e-003, 2.85714306e-002, + 0., 1.90476198e-002, 0., 0., 9.52380989e-003, 0., 0., + 2.85714306e-002, 0., 9.52380989e-003, 0., 9.52380989e-003, 0., + 1.90476198e-002, 0., 0., 0., 1.90476198e-002, 0., 9.52380989e-003, + 1.90476198e-002, 0., 1.90476198e-002, 0., 9.52380989e-003, + 9.52380989e-003, 0., 9.52380989e-003, 0., 0., 0., 0., 0., + 2.85714306e-002, 0., 0., 0., 0., 0., 0., 1.90476198e-002, + 9.52380989e-003, 2.85714306e-002, 0., 0., 0., 0., 0., 0., + 9.52380989e-003, 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., + 0., 0., 0., 1.90476198e-002, 9.52380989e-003, 9.52380989e-003, 0., + 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., + 1.90476198e-002, 0., 0., 0., 9.52380989e-003, 0., 0., 0., 0., 0., + 2.85714306e-002, 0., 0., 0., 0., 0., 0., 0., 0., 9.52380989e-003, + 0., 0., 1.90476198e-002, 0., 0., 9.52380989e-003, 0., + 9.52380989e-003, 0., 0., 9.52380989e-003, 9.52380989e-003, 0., 0., + 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., 0., + 1.90476198e-002, 0., 0., 0., 3.80952395e-002, 0., 0., 0., 0., 0., + 0., 0., 1.90476198e-002, 0., 9.52380989e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.52380989e-003, 2.85714306e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 9.52380989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 1.90476198e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.52380989e-003, 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.52380989e-003, 9.52380989e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.52380989e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 9.52380989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., + 0., 1.90476198e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.52380989e-003, 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 9.52380989e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.52380989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.90476198e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.90476198e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., + 9.52380989e-003, 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.52380989e-003, 0., 9.52380989e-003, 0., 0., 0., 0., 0., + 0., 0., 1.90476198e-002, 0., 0., 0., 0., 0., 0., 9.52380989e-003, + 0., 0., 0., 9.52380989e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., + 1.90476198e-002, 0., 0., 0., 9.52380989e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.52380989e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 9.43396240e-003, 0., 0., 9.43396240e-003, + 1.88679248e-002, 0., 0., 0., 1.88679248e-002, 9.43396240e-003, 0., + 0., 0., 3.77358496e-002, 9.43396240e-003, 0., 0., 0., + 9.43396240e-003, 0., 9.43396240e-003, 0., 0., 0., 9.43396240e-003, + 3.77358496e-002, 9.43396240e-003, 9.43396240e-003, 0., + 3.77358496e-002, 1.88679248e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.43396240e-003, 1.88679248e-002, 9.43396240e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, + 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 9.43396240e-003, 9.43396240e-003, 0., 0., 9.43396240e-003, + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., + 1.88679248e-002, 0., 0., 9.43396240e-003, 9.43396240e-003, 0., 0., + 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 9.43396240e-003, 0., 0., 0., 1.88679248e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.88679248e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 1.88679248e-002, + 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 9.43396240e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 9.43396240e-003, + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., + 0., 0., 9.43396240e-003, 0., 0., 0., 4.71698120e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 9.43396240e-003, 0., 9.43396240e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., + 1.88679248e-002, 9.43396240e-003, 0., 0., 0., 0., 1.88679248e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.88679248e-002, 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.83018872e-002, 0., 0., + 1.88679248e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.43396240e-003, 0., 0., 9.43396240e-003, 0., + 1.88679248e-002, 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 9.43396240e-003, 9.43396240e-003, 9.43396240e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 2.54237279e-002, 0., 0., 0., 0., 2.54237279e-002, 8.47457629e-003, + 8.47457629e-003, 0., 1.69491526e-002, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 8.47457629e-003, 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 2.54237279e-002, 0., 1.69491526e-002, + 1.69491526e-002, 0., 1.69491526e-002, 0., 8.47457629e-003, + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 8.47457629e-003, 0., + 0., 0., 8.47457629e-003, 0., 8.47457629e-003, 0., 0., + 2.54237279e-002, 1.69491526e-002, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., 0., + 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., + 1.69491526e-002, 0., 0., 8.47457629e-003, 8.47457629e-003, + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 1.69491526e-002, 8.47457629e-003, 0., 0., 0., 0., 1.69491526e-002, + 0., 0., 0., 3.38983051e-002, 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 8.47457629e-003, 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 0., 0., 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 8.47457629e-003, 0., 8.47457629e-003, 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.69491526e-002, 2.54237279e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 1.69491526e-002, 0., + 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 0., 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 0., 0., 0., 0., 1.69491526e-002, 0., 8.47457629e-003, 0., 0., + 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.91715984e-003, 0., 1.18343197e-002, 0., 2.36686394e-002, 0., + 0., 1.18343197e-002, 2.95857992e-002, 1.18343197e-002, + 5.91715984e-003, 5.91715984e-003, 5.91715984e-003, + 2.36686394e-002, 1.18343197e-002, 0., 5.91715984e-003, 0., + 5.91715984e-003, 1.77514795e-002, 0., 0., 0., 5.91715984e-003, 0., + 5.91715984e-003, 0., 0., 4.14201170e-002, 5.91715984e-003, + 5.91715984e-003, 0., 5.91715984e-003, 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 1.18343197e-002, 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 2.95857992e-002, 0., 0., 0., 0., + 0., 0., 2.95857992e-002, 0., 5.91715984e-003, 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., + 0., 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 5.91715984e-003, + 0., 5.91715984e-003, 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 5.91715984e-003, 5.91715984e-003, 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., + 5.91715984e-003, 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., + 0., 0., 1.18343197e-002, 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 0., 2.36686394e-002, 0., 0., 0., 2.95857992e-002, 1.18343197e-002, + 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 0., 5.91715984e-003, 5.91715984e-003, 0., 0., 5.91715984e-003, 0., + 1.18343197e-002, 0., 5.91715984e-003, 0., 1.77514795e-002, 0., 0., + 0., 0., 5.91715984e-003, 5.91715984e-003, 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 0., 5.91715984e-003, 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.18343197e-002, 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 0., 5.91715984e-003, 0., 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, + 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 5.91715984e-003, 0., 0., 0., 0., + 2.95857992e-002, 5.91715984e-003, 0., 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 5.91715984e-003, 5.91715984e-003, + 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.18343197e-002, 0., + 1.77514795e-002, 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.18343197e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 0., 0., 0., 5.91715984e-003, + 1.18343197e-002, 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 0., 0., 1.18343197e-002, 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., + 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 1.77514795e-002, 0., 0., + 0., 0., 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.14942528e-002, + 1.14942528e-002, 5.74712642e-003, 5.74712642e-003, 0., 0., 0., + 5.74712642e-003, 1.72413792e-002, 0., 1.14942528e-002, 0., + 1.14942528e-002, 1.14942528e-002, 1.14942528e-002, 0., + 5.74712642e-003, 1.14942528e-002, 0., 5.74712642e-003, 0., + 5.74712642e-003, 0., 0., 0., 0., 1.72413792e-002, 0., + 5.74712642e-003, 1.72413792e-002, 5.74712642e-003, + 1.14942528e-002, 0., 1.14942528e-002, 5.74712642e-003, 0., 0., 0., + 5.74712642e-003, 5.74712642e-003, 5.74712642e-003, 0., 0., 0., 0., + 1.14942528e-002, 5.74712642e-003, 1.72413792e-002, 0., + 5.74712642e-003, 0., 0., 0., 5.74712642e-003, 5.74712642e-003, 0., + 0., 0., 0., 0., 0., 0., 1.14942528e-002, 0., 1.14942528e-002, 0., + 0., 0., 5.74712642e-003, 0., 1.14942528e-002, 0., 0., 0., 0., + 1.14942528e-002, 0., 0., 0., 0., 0., 0., 1.72413792e-002, 0., 0., + 0., 0., 0., 0., 5.74712642e-003, 5.74712642e-003, 0., + 5.74712642e-003, 0., 1.72413792e-002, 5.74712642e-003, 0., 0., 0., + 5.74712642e-003, 1.72413792e-002, 1.14942528e-002, 0., 0., 0., 0., + 0., 5.74712642e-003, 1.14942528e-002, 5.74712642e-003, 0., 0., + 5.74712642e-003, 0., 5.74712642e-003, 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 1.72413792e-002, + 5.74712642e-003, 0., 0., 5.74712642e-003, 0., 0., 1.14942528e-002, + 0., 0., 0., 0., 5.74712642e-003, 0., 0., 5.74712642e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., + 1.14942528e-002, 0., 0., 5.74712642e-003, 0., 0., 5.74712642e-003, + 0., 0., 0., 5.74712642e-003, 5.74712642e-003, 0., 1.14942528e-002, + 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 1.72413792e-002, 5.74712642e-003, 0., + 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 1.14942528e-002, 0., + 0., 5.74712642e-003, 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., + 0., 0., 5.74712642e-003, 0., 0., 0., 0., 5.74712642e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., + 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 5.74712642e-003, 0., + 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.14942528e-002, + 5.74712642e-003, 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 1.72413792e-002, + 0., 5.74712642e-003, 0., 0., 0., 5.74712642e-003, 5.74712642e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., + 5.74712642e-003, 0., 0., 1.14942528e-002, 5.74712642e-003, 0., 0., + 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.14942528e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.74712642e-003, 0., 0., 0., 5.74712642e-003, 0., 0., 0., + 0., 0., 0., 5.74712642e-003, 1.14942528e-002, 0., 0., 0., 0., + 5.74712642e-003, 5.74712642e-003, 5.74712642e-003, 0., 0., 0., 0., + 0., 0., 0., 5.74712642e-003, 0., 5.74712642e-003, 5.74712642e-003, + 0., 0., 0., 5.74712642e-003, 0., 0., 0., 5.74712642e-003, 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., + 1.72413792e-002, 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.74712642e-003, 0., 0., 1.72413792e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., + 0., 5.74712642e-003, 0., 0., 5.74712642e-003, 0., 5.74712642e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.14942528e-002, 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 5.78034669e-003, + 5.78034669e-003, 0., 0., 3.46820801e-002, 0., 0., 0., + 1.15606934e-002, 5.78034669e-003, 5.78034669e-003, + 5.78034669e-003, 0., 0., 0., 0., 5.78034669e-003, 5.78034669e-003, + 1.15606934e-002, 1.15606934e-002, 0., 1.15606934e-002, 0., 0., 0., + 2.89017335e-002, 0., 0., 1.15606934e-002, 0., 5.78034669e-003, 0., + 2.31213868e-002, 5.78034669e-003, 0., 5.78034669e-003, + 5.78034669e-003, 1.15606934e-002, 0., 0., 0., 0., 5.78034669e-003, + 0., 5.78034669e-003, 1.15606934e-002, 1.15606934e-002, + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 1.73410401e-002, 0., + 1.15606934e-002, 0., 0., 0., 5.78034669e-003, 0., 5.78034669e-003, + 5.78034669e-003, 0., 0., 5.78034669e-003, 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., + 1.73410401e-002, 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 5.78034669e-003, 0., 0., 0., 1.15606934e-002, 1.15606934e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 1.15606934e-002, 1.15606934e-002, 0., + 5.78034669e-003, 5.78034669e-003, 5.78034669e-003, 0., 0., 0., 0., + 1.73410401e-002, 0., 0., 0., 1.15606934e-002, 5.78034669e-003, 0., + 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 1.15606934e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 1.15606934e-002, 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 5.78034669e-003, 0., 0., 0., 1.15606934e-002, 0., + 0., 0., 0., 0., 1.15606934e-002, 0., 0., 5.78034669e-003, 0., 0., + 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 5.78034669e-003, + 1.15606934e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 1.73410401e-002, 0., + 1.15606934e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.15606934e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.15606934e-002, 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 5.78034669e-003, 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.15606934e-002, 0., 0., 0., 0., 5.78034669e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 5.78034669e-003, 0., 5.78034669e-003, 0., 0., 5.78034669e-003, 0., + 5.78034669e-003, 0., 0., 0., 0., 5.78034669e-003, 5.78034669e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 5.78034669e-003, 0., 0., 5.78034669e-003, 0., + 0., 2.31213868e-002, 0., 0., 0., 1.15606934e-002, 0., 0., 0., 0., + 0., 0., 5.78034669e-003, 5.78034669e-003, 0., 0., 5.78034669e-003, + 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 5.78034669e-003, + 5.78034669e-003, 0., 5.78034669e-003, 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.15606934e-002, 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 5.78034669e-003, 5.78034669e-003, + 5.78034669e-003, 0., 0., 0., 0., 0., 1.73410401e-002, 0., 0., 0., + 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, + 0., 5.78034669e-003, 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.78034669e-003, 5.78034669e-003, + 5.78034669e-003, 0., 0., 0., 0., 5.78034669e-003, 0., 0., 0., 0., + 0., 5.78034669e-003, 5.78034669e-003, 0., 0., 0., 0., 0., + 5.78034669e-003, 0., 0., 0., 5.78034669e-003, 0., 0., 0., + 5.78034669e-003, 0., 0., 5.78034669e-003, 0., 0., 0., 0., 0., 0., + 0., 1.86335407e-002, 0., 0., 0., 0., 1.86335407e-002, 0., 0., 0., + 1.24223605e-002, 0., 0., 6.21118024e-003, 1.24223605e-002, + 6.21118024e-003, 1.24223605e-002, 0., 6.21118024e-003, + 1.24223605e-002, 0., 6.21118024e-003, 6.21118024e-003, + 6.21118024e-003, 6.21118024e-003, 0., 6.21118024e-003, + 2.48447210e-002, 6.21118024e-003, 3.72670814e-002, + 2.48447210e-002, 0., 6.21118024e-003, 0., 0., 6.21118024e-003, 0., + 0., 6.21118024e-003, 0., 6.21118024e-003, 0., 0., 0., + 6.21118024e-003, 0., 6.21118024e-003, 6.21118024e-003, + 2.48447210e-002, 3.10559012e-002, 0., 0., 1.24223605e-002, 0., + 1.24223605e-002, 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., + 1.24223605e-002, 0., 6.21118024e-003, 6.21118024e-003, 0., 0., + 6.21118024e-003, 0., 0., 0., 6.21118024e-003, 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 6.21118024e-003, 0., + 1.24223605e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.21118024e-003, 1.24223605e-002, 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 1.24223605e-002, 0., + 0., 6.21118024e-003, 6.21118024e-003, 6.21118024e-003, + 2.48447210e-002, 0., 0., 0., 0., 0., 0., 0., 3.10559012e-002, + 6.21118024e-003, 0., 0., 4.34782617e-002, 0., 0., 0., 0., 0., 0., + 0., 1.24223605e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., + 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 1.24223605e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.24223605e-002, 0., 6.21118024e-003, 6.21118024e-003, 0., + 6.21118024e-003, 0., 0., 0., 0., 6.21118024e-003, 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., + 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.86335407e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, + 6.21118024e-003, 0., 0., 0., 0., 1.24223605e-002, 0., 0., + 6.21118024e-003, 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 3.10559012e-002, 0., 0., 0., 0., 0., 1.24223605e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.24223605e-002, 0., 0., 0., 0., 0., + 0., 0., 6.21118024e-003, 0., 6.21118024e-003, 0., 1.86335407e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 6.21118024e-003, 6.21118024e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 6.21118024e-003, 6.21118024e-003, + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 1.24223605e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, + 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., + 1.86335407e-002, 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., + 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., + 1.10497242e-002, 1.10497242e-002, 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 5.52486209e-003, 5.52486209e-003, + 5.52486209e-003, 1.10497242e-002, 0., 1.10497242e-002, 0., + 5.52486209e-003, 5.52486209e-003, 0., 0., 5.52486209e-003, 0., + 5.52486209e-003, 1.10497242e-002, 1.10497242e-002, + 5.52486209e-003, 0., 0., 4.41988967e-002, 0., 1.65745858e-002, + 2.20994484e-002, 1.65745858e-002, 0., 0., 5.52486209e-003, 0., 0., + 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., + 1.10497242e-002, 1.65745858e-002, 2.20994484e-002, 0., 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 5.52486209e-003, 0., + 0., 0., 0., 5.52486209e-003, 0., 1.10497242e-002, 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 5.52486209e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 5.52486209e-003, 5.52486209e-003, + 0., 5.52486209e-003, 0., 5.52486209e-003, 2.20994484e-002, 0., 0., + 0., 0., 0., 0., 5.52486209e-003, 1.65745858e-002, 0., + 5.52486209e-003, 0., 0., 0., 5.52486209e-003, 0., 1.10497242e-002, + 0., 0., 0., 0., 0., 3.31491716e-002, 0., 0., 0., 3.31491716e-002, + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 0., 0., 0., 5.52486209e-003, 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 5.52486209e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.10497242e-002, 1.10497242e-002, 0., + 5.52486209e-003, 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 1.65745858e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 0., 0., 0., 0., 5.52486209e-003, 5.52486209e-003, 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., + 2.76243109e-002, 5.52486209e-003, 5.52486209e-003, 0., 0., 0., + 1.10497242e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 2.20994484e-002, 0., + 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 5.52486209e-003, 0., 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 3.31491716e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 1.10497242e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, + 0., 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 0., + 5.52486209e-003, 1.10497242e-002, 0., 0., 0., 1.10497242e-002, 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 5.52486209e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 1.10497242e-002, 0., 0., 0., 0., 0., + 1.10497242e-002, 0., 5.52486209e-003, 0., 5.52486209e-003, 0., + 1.10497242e-002, 0., 0., 5.52486209e-003, 0., 0., 0., 0., + 2.20994484e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.10497242e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 5.52486209e-003, 0., 5.52486209e-003, + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.10497242e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.24223605e-002, 6.21118024e-003, 0., + 1.24223605e-002, 0., 0., 0., 6.21118024e-003, 0., 1.24223605e-002, + 6.21118024e-003, 0., 0., 0., 0., 0., 2.48447210e-002, 0., 0., + 1.24223605e-002, 0., 0., 0., 0., 0., 3.10559012e-002, 0., + 6.21118024e-003, 3.10559012e-002, 6.21118024e-003, + 1.86335407e-002, 0., 1.24223605e-002, 0., 0., 0., 0., + 1.24223605e-002, 0., 0., 0., 6.21118024e-003, 0., 0., 0., + 1.24223605e-002, 0., 4.34782617e-002, 6.21118024e-003, + 6.21118024e-003, 0., 0., 6.21118024e-003, 0., 1.24223605e-002, 0., + 0., 0., 0., 0., 6.21118024e-003, 0., 0., 6.21118024e-003, + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.21118024e-003, 6.21118024e-003, + 1.24223605e-002, 0., 0., 0., 1.24223605e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, + 1.24223605e-002, 0., 1.24223605e-002, 0., 0., 6.21118024e-003, 0., + 0., 1.86335407e-002, 0., 6.21118024e-003, 0., 3.72670814e-002, 0., + 0., 0., 0., 0., 0., 0., 1.24223605e-002, 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.24223605e-002, 0., 1.24223605e-002, + 6.21118024e-003, 0., 6.21118024e-003, 0., 3.72670814e-002, 0., + 6.21118024e-003, 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., + 6.21118024e-003, 6.21118024e-003, 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 6.21118024e-003, 0., 0., 0., 6.21118024e-003, 0., + 0., 0., 0., 0., 6.21118024e-003, 0., 0., 6.21118024e-003, 0., + 6.21118024e-003, 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., + 0., 0., 1.24223605e-002, 6.21118024e-003, 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.48447210e-002, 0., 6.21118024e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.24223605e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., + 6.21118024e-003, 0., 0., 6.21118024e-003, 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., + 0., 6.21118024e-003, 0., 0., 0., 0., 1.24223605e-002, 0., + 3.10559012e-002, 6.21118024e-003, 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., + 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.21118024e-003, 6.21118024e-003, 0., 6.21118024e-003, 0., 0., 0., + 0., 0., 6.21118024e-003, 0., 0., 0., 6.21118024e-003, 0., 0., 0., + 0., 1.86335407e-002, 0., 0., 0., 6.21118024e-003, 0., 0., 0., + 6.21118024e-003, 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.24223605e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.24223605e-002, 0., 0., + 1.24223605e-002, 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.21118024e-003, 0., 1.24223605e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 6.21118024e-003, 0., 0., 0., 6.21118024e-003, + 0., 1.24223605e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.21118024e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.21118024e-003, 0., + 1.16959065e-002, 0., 0., 1.16959065e-002, 0., 0., 0., 0., + 1.75438598e-002, 0., 5.84795326e-003, 0., 5.84795326e-003, 0., 0., + 5.84795326e-003, 5.84795326e-003, 0., 5.84795326e-003, 0., + 5.84795326e-003, 0., 2.33918130e-002, 0., 0., 1.16959065e-002, 0., + 5.84795326e-003, 5.84795326e-003, 2.92397663e-002, 0., + 5.84795326e-003, 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 4.09356728e-002, 1.16959065e-002, 0., + 5.84795326e-003, 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 1.16959065e-002, 0., 0., 5.84795326e-003, 5.84795326e-003, 0., 0., + 0., 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 1.75438598e-002, 0., 0., 0., + 5.84795326e-003, 1.75438598e-002, 0., 0., 0., 1.16959065e-002, 0., + 0., 0., 0., 5.84795326e-003, 0., 5.84795326e-003, 0., + 5.84795326e-003, 0., 0., 0., 5.84795326e-003, 0., 5.84795326e-003, + 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 4.09356728e-002, + 0., 0., 0., 2.92397663e-002, 5.84795326e-003, 0., 5.84795326e-003, + 0., 0., 5.84795326e-003, 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 5.84795326e-003, 5.84795326e-003, 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16959065e-002, 0., 5.84795326e-003, 0., 0., 5.84795326e-003, + 2.33918130e-002, 0., 5.84795326e-003, 0., 5.84795326e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 0., 0., + 1.16959065e-002, 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 5.84795326e-003, 0., 5.84795326e-003, + 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.75438598e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.84795326e-003, 0., 5.84795326e-003, 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.84795326e-003, 0., 0., 1.16959065e-002, 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., + 0., 2.33918130e-002, 0., 0., 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 2.92397663e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.16959065e-002, 0., 1.16959065e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16959065e-002, 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 1.16959065e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., + 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 1.16959065e-002, + 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.84795326e-003, 0., 0., 0., 5.84795326e-003, 0., 0., + 5.84795326e-003, 0., 0., 1.16959065e-002, 0., 5.84795326e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 1.16959065e-002, 0., + 5.84795326e-003, 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 5.84795326e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., + 5.88235306e-003, 0., 1.17647061e-002, 0., 5.88235306e-003, + 1.17647061e-002, 5.88235306e-003, 0., 0., 1.17647061e-002, + 5.88235306e-003, 0., 5.88235306e-003, 0., 1.17647061e-002, 0., 0., + 1.76470596e-002, 0., 1.17647061e-002, 1.17647061e-002, 0., 0., + 2.35294122e-002, 0., 1.17647061e-002, 1.76470596e-002, + 5.88235306e-003, 5.88235306e-003, 0., 5.88235306e-003, 0., 0., 0., + 0., 5.88235306e-003, 1.17647061e-002, 0., 0., 5.88235306e-003, + 1.17647061e-002, 0., 5.88235306e-003, 5.88235306e-003, + 1.17647061e-002, 1.76470596e-002, 0., 0., 5.88235306e-003, 0., 0., + 5.88235306e-003, 5.88235306e-003, 0., 0., 5.88235306e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, 5.88235306e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.17647061e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, 5.88235306e-003, 0., + 0., 0., 0., 0., 0., 0., 1.17647061e-002, 0., 0., 0., + 5.88235306e-003, 0., 0., 0., 0., 5.88235306e-003, 0., 0., + 5.88235306e-003, 0., 0., 0., 0., 5.88235306e-003, 5.88235306e-003, + 0., 0., 0., 0., 0., 0., 5.88235306e-003, 2.94117648e-002, 0., + 5.88235306e-003, 0., 2.35294122e-002, 5.88235306e-003, 0., + 5.88235306e-003, 0., 0., 0., 0., 5.88235306e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.88235306e-003, 5.88235306e-003, 0., 0., + 3.52941193e-002, 0., 0., 0., 5.88235306e-003, 0., 0., 0., 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., + 5.88235306e-003, 0., 0., 0., 5.88235306e-003, 0., 0., 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 5.88235306e-003, + 5.88235306e-003, 0., 1.76470596e-002, 0., 5.88235306e-003, 0., + 1.17647061e-002, 0., 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.17647061e-002, 0., 0., 0., 5.88235306e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, 5.88235306e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.17647061e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., 0., 0., 0., 0., + 1.76470596e-002, 0., 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., + 1.17647061e-002, 0., 2.94117648e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.17647061e-002, 0., 0., 0., 0., 5.88235306e-003, 0., 0., + 0., 5.88235306e-003, 0., 0., 0., 0., 0., 2.35294122e-002, + 1.17647061e-002, 5.88235306e-003, 0., 0., 0., 0., 0., 0., + 5.88235306e-003, 0., 0., 5.88235306e-003, 0., 0., 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 1.17647061e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.88235306e-003, 0., 0., 0., 5.88235306e-003, + 5.88235306e-003, 0., 0., 5.88235306e-003, 0., 0., 1.17647061e-002, + 5.88235306e-003, 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., 0., + 0., 0., 0., 1.17647061e-002, 0., 5.88235306e-003, 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 0., 1.17647061e-002, 0., 0., + 5.88235306e-003, 0., 0., 5.88235306e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.88235306e-003, 0., 0., 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.88235306e-003, 0., 0., 0., 0., 5.88235306e-003, 0., + 5.88235306e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.17647061e-002, 0., + 0., 5.88235306e-003, 0., 0., 5.88235306e-003, 0., 5.81395347e-003, + 0., 0., 0., 0., 0., 5.81395347e-003, 0., 5.81395347e-003, 0., 0., + 0., 5.81395347e-003, 5.81395347e-003, 5.81395347e-003, + 5.81395347e-003, 0., 2.90697664e-002, 5.81395347e-003, 0., + 5.81395347e-003, 0., 2.90697664e-002, 0., 0., 0., 2.32558139e-002, + 0., 1.16279069e-002, 2.90697664e-002, 0., 0., 0., 5.81395347e-003, + 5.81395347e-003, 0., 0., 0., 0., 1.16279069e-002, 0., 0., 0., 0., + 5.81395347e-003, 1.16279069e-002, 0., 2.32558139e-002, + 1.74418613e-002, 0., 5.81395347e-003, 5.81395347e-003, 0., 0., 0., + 1.74418613e-002, 0., 0., 0., 1.16279069e-002, 0., 0., + 5.81395347e-003, 0., 2.90697664e-002, 5.81395347e-003, 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., + 5.81395347e-003, 5.81395347e-003, 0., 5.81395347e-003, 0., + 5.81395347e-003, 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., + 1.16279069e-002, 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., + 0., 1.74418613e-002, 0., 0., 0., 0., 0., 2.32558139e-002, + 5.81395347e-003, 0., 0., 2.32558139e-002, 5.81395347e-003, 0., + 5.81395347e-003, 0., 2.32558139e-002, 0., 0., 0., 0., 0., + 5.81395347e-003, 5.81395347e-003, 5.81395347e-003, + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.81395347e-003, 0., 1.16279069e-002, 0., 0., 0., 0., 0., + 3.48837227e-002, 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., + 0., 0., 0., 1.16279069e-002, 0., 0., 5.81395347e-003, 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 5.81395347e-003, + 0., 0., 0., 5.81395347e-003, 0., 0., 5.81395347e-003, + 5.81395347e-003, 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 2.90697664e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.16279069e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.16279069e-002, 5.81395347e-003, 0., 0., + 0., 0., 5.81395347e-003, 0., 0., 0., 0., 5.81395347e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, + 0., 5.81395347e-003, 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 1.74418613e-002, 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16279069e-002, 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., + 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 5.81395347e-003, 0., 0., 5.81395347e-003, 0., 0., 5.81395347e-003, + 0., 0., 0., 0., 1.16279069e-002, 0., 0., 1.16279069e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.16279069e-002, 0., 0., 0., + 5.81395347e-003, 0., 0., 5.81395347e-003, 5.81395347e-003, 0., 0., + 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.74418613e-002, 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 5.81395347e-003, 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.81395347e-003, + 0., 0., 0., 0., 5.81395347e-003, 5.81395347e-003, 0., + 5.81395347e-003, 0., 5.81395347e-003, 0., 0., 0., 5.81395347e-003, + 0., 0., 5.81395347e-003, 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., 0., 1.16279069e-002, + 0., 0., 0., 0., 0., 5.81395347e-003, 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 9.70873795e-003, 0., 0., + 1.94174759e-002, 0., 0., 0., 0., 1.94174759e-002, 0., + 9.70873795e-003, 1.94174759e-002, 0., 1.94174759e-002, 0., 0., + 9.70873795e-003, 9.70873795e-003, 0., 9.70873795e-003, + 9.70873795e-003, 0., 1.94174759e-002, 0., 1.94174759e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., + 9.70873795e-003, 0., 0., 1.94174759e-002, 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., + 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 9.70873795e-003, + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.94174759e-002, 0., 9.70873795e-003, 0., 0., + 0., 0., 0., 2.91262139e-002, 0., 0., 9.70873795e-003, + 2.91262139e-002, 9.70873795e-003, 0., 9.70873795e-003, 0., + 1.94174759e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.94174759e-002, 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.79611638e-002, 0., 9.70873795e-003, + 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.94174759e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., + 2.91262139e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., + 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.82524277e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 2.91262139e-002, 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.94174759e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 9.70873795e-003, + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., + 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, + 1.94174759e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.94174759e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.94174759e-002, 0., 0., 9.70873795e-003, 0., 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., + 9.70873795e-003, 0., 0., 1.94174759e-002, 0., 0., 0., 0., + 9.70873795e-003, 9.70873795e-003, 0., 9.70873795e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 9.70873795e-003, 0., 9.70873795e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.42424235e-002, 6.06060587e-003, 0., 0., 0., + 6.06060587e-003, 0., 0., 2.42424235e-002, 6.06060587e-003, 0., + 1.21212117e-002, 0., 0., 0., 0., 6.06060587e-003, 0., + 6.06060587e-003, 0., 6.06060587e-003, 0., 1.81818176e-002, + 6.06060587e-003, 0., 0., 0., 0., 0., 6.06060587e-003, + 6.06060587e-003, 6.06060587e-003, 0., 0., 6.06060587e-003, 0., 0., + 0., 6.06060587e-003, 6.06060587e-003, 0., 0., 0., 6.06060587e-003, + 6.06060587e-003, 1.21212117e-002, 0., 1.21212117e-002, + 1.81818176e-002, 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 6.06060587e-003, 0., 6.06060587e-003, 0., 1.21212117e-002, + 2.42424235e-002, 6.06060587e-003, 0., 6.06060587e-003, + 6.06060587e-003, 0., 6.06060587e-003, 0., 1.81818176e-002, 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.21212117e-002, + 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 1.21212117e-002, 0., + 6.06060587e-003, 0., 0., 0., 1.21212117e-002, 6.06060587e-003, + 1.21212117e-002, 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 6.06060587e-003, + 6.06060587e-003, 0., 0., 0., 0., 0., 1.21212117e-002, 0., + 6.06060587e-003, 6.06060587e-003, 3.63636352e-002, + 6.06060587e-003, 0., 1.21212117e-002, 0., 6.06060587e-003, 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 6.06060587e-003, 1.21212117e-002, + 1.81818176e-002, 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.21212117e-002, 6.06060587e-003, 6.06060587e-003, + 0., 0., 0., 1.21212117e-002, 0., 0., 0., 0., 6.06060587e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., + 0., 0., 6.06060587e-003, 0., 0., 0., 6.06060587e-003, + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 6.06060587e-003, + 6.06060587e-003, 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.21212117e-002, 0., 0., 6.06060587e-003, + 1.21212117e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 6.06060587e-003, 0., 6.06060587e-003, 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.21212117e-002, 0., 0., 0., + 6.06060587e-003, 0., 0., 1.81818176e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., + 1.81818176e-002, 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., + 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 1.21212117e-002, 0., 6.06060587e-003, 0., + 1.21212117e-002, 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.21212117e-002, 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., + 1.21212117e-002, 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., + 1.21212117e-002, 0., 0., 0., 0., 0., 1.21212117e-002, 0., 0., 0., + 0., 0., 0., 1.21212117e-002, 0., 0., 6.06060587e-003, 0., 0., 0., + 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 6.06060587e-003, + 6.06060587e-003, 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.21212117e-002, 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., + 0., 0., 0., 0., 6.06060587e-003, 0., 0., 0., 0., 0., 0., + 6.06060587e-003, 0., 1.21212117e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.06060587e-003, 0., 0., 6.06060587e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.06060587e-003, 0., 0., + 0., 0., 0., 0., 1.21951215e-002, 6.09756075e-003, 0., 0., 0., 0., + 0., 6.09756075e-003, 1.21951215e-002, 0., 2.43902430e-002, 0., 0., + 0., 0., 1.21951215e-002, 6.09756075e-003, 1.21951215e-002, + 1.21951215e-002, 6.09756075e-003, 6.09756075e-003, 0., 0., + 1.21951215e-002, 1.82926822e-002, 0., 6.09756075e-003, 0., + 6.09756075e-003, 0., 0., 1.21951215e-002, 0., 0., 0., + 6.09756075e-003, 0., 0., 1.21951215e-002, 0., 0., 6.09756075e-003, + 6.09756075e-003, 0., 0., 0., 1.21951215e-002, 6.09756075e-003, + 1.21951215e-002, 0., 1.21951215e-002, 6.09756075e-003, + 6.09756075e-003, 0., 1.21951215e-002, 6.09756075e-003, 0., 0., + 6.09756075e-003, 0., 0., 0., 6.09756075e-003, 6.09756075e-003, + 6.09756075e-003, 6.09756075e-003, 0., 6.09756075e-003, 0., 0., + 1.21951215e-002, 0., 0., 0., 0., 6.09756075e-003, 0., 0., + 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.09756075e-003, 1.21951215e-002, 0., 0., 0., + 6.09756075e-003, 6.09756075e-003, 6.09756075e-003, + 6.09756075e-003, 0., 0., 0., 6.09756075e-003, 0., 6.09756075e-003, + 0., 1.21951215e-002, 0., 0., 1.82926822e-002, 0., 6.09756075e-003, + 0., 0., 0., 6.09756075e-003, 0., 6.09756075e-003, 0., 0., 0., 0., + 0., 1.21951215e-002, 0., 0., 0., 2.43902430e-002, 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 2.43902430e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.09756075e-003, 1.21951215e-002, 0., + 6.09756075e-003, 6.09756075e-003, 6.09756075e-003, 0., 0., + 1.21951215e-002, 0., 0., 1.21951215e-002, 0., 0., 0., + 6.09756075e-003, 2.43902430e-002, 0., 0., 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 6.09756075e-003, + 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 6.09756075e-003, 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., + 0., 0., 0., 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.21951215e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 6.09756075e-003, + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., + 6.09756075e-003, 0., 0., 6.09756075e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.09756075e-003, 6.09756075e-003, 6.09756075e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., + 0., 6.09756075e-003, 0., 0., 0., 0., 0., 2.43902430e-002, 0., 0., + 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, + 0., 0., 6.09756075e-003, 0., 6.09756075e-003, 0., 0., 0., + 1.21951215e-002, 0., 0., 6.09756075e-003, 0., 0., 0., 0., + 1.21951215e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.09756075e-003, 0., 0., 0., 6.09756075e-003, 0., 0., + 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., 0., 0., 0., + 1.21951215e-002, 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, + 0., 0., 0., 6.09756075e-003, 0., 1.21951215e-002, 0., + 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 6.09756075e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, + 1.21951215e-002, 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., + 0., 0., 0., 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., + 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., 0., 0., + 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 6.09756075e-003, 0., + 0., 0., 5.61797759e-003, 1.68539323e-002, 1.12359552e-002, 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 5.61797759e-003, + 1.12359552e-002, 5.61797759e-003, 5.61797759e-003, + 1.12359552e-002, 1.68539323e-002, 0., 0., 1.12359552e-002, 0., 0., + 1.12359552e-002, 0., 1.12359552e-002, 5.61797759e-003, 0., + 5.61797759e-003, 5.61797759e-003, 0., 1.68539323e-002, 0., + 5.61797759e-003, 1.12359552e-002, 0., 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 0., 0., 1.12359552e-002, 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 1.12359552e-002, 0., + 0., 1.12359552e-002, 0., 0., 1.12359552e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.68539323e-002, 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 1.12359552e-002, + 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 1.68539323e-002, 0., 5.61797759e-003, 1.12359552e-002, 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 0., + 0., 1.12359552e-002, 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 1.12359552e-002, 0., 0., 0., + 5.61797759e-003, 0., 5.05617969e-002, 0., 0., 0., 2.24719103e-002, + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, + 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 3.93258445e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.61797759e-003, 0., 0., 5.61797759e-003, + 1.12359552e-002, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.12359552e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., 0., + 1.12359552e-002, 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.12359552e-002, 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 1.12359552e-002, 5.61797759e-003, 0., + 5.61797759e-003, 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., + 1.68539323e-002, 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 1.12359552e-002, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 0., 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 7.35294120e-003, 7.35294120e-003, 0., + 7.35294120e-003, 7.35294120e-003, 0., 7.35294120e-003, + 2.94117648e-002, 2.20588241e-002, 0., 1.47058824e-002, + 7.35294120e-003, 0., 0., 7.35294120e-003, 0., 0., 0., 0., + 1.47058824e-002, 0., 2.20588241e-002, 7.35294120e-003, 0., 0., + 1.47058824e-002, 0., 1.47058824e-002, 1.47058824e-002, 0., 0., 0., + 1.47058824e-002, 1.47058824e-002, 7.35294120e-003, 0., 0., 0., + 1.47058824e-002, 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., + 1.47058824e-002, 0., 0., 0., 0., 0., 7.35294120e-003, + 7.35294120e-003, 0., 1.47058824e-002, 0., 0., 7.35294120e-003, 0., + 0., 0., 1.47058824e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.35294120e-003, 7.35294120e-003, 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 3.67647074e-002, 0., + 7.35294120e-003, 0., 2.20588241e-002, 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 1.47058824e-002, 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 1.47058824e-002, 0., 7.35294120e-003, + 7.35294120e-003, 0., 0., 7.35294120e-003, 0., 7.35294120e-003, 0., + 0., 0., 1.47058824e-002, 0., 0., 0., 0., 0., 7.35294120e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 0., 2.20588241e-002, 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., + 0., 0., 1.47058824e-002, 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.47058824e-002, 0., 0., 0., 0., 0., 7.35294120e-003, + 7.35294120e-003, 0., 0., 7.35294120e-003, 0., 7.35294120e-003, 0., + 0., 7.35294120e-003, 0., 0., 1.47058824e-002, 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 2.94117648e-002, 0., 0., 0., 0., 7.35294120e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.35294120e-003, 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., + 1.47058824e-002, 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 2.20588241e-002, 0., + 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., 0., + 0., 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, + 0., 0., 0., 0., 0., 1.47058824e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, + 0., 7.35294120e-003, 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., + 0., 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.35294120e-003, 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 1.47058824e-002, 2.94117648e-002, 0., 0., + 0., 1.47058824e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.35294120e-003, 0., 7.35294120e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.35294120e-003, 0., 0., + 2.01342292e-002, 2.68456377e-002, 1.34228189e-002, + 1.34228189e-002, 0., 4.69798669e-002, 0., 0., 0., 6.71140943e-003, + 0., 6.71140943e-003, 1.34228189e-002, 1.34228189e-002, 0., + 1.34228189e-002, 6.71140943e-003, 1.34228189e-002, 0., + 1.34228189e-002, 0., 0., 2.01342292e-002, 1.34228189e-002, 0., 0., + 6.71140943e-003, 0., 6.71140943e-003, 0., 1.34228189e-002, + 1.34228189e-002, 0., 0., 0., 0., 0., 0., 6.71140943e-003, + 2.01342292e-002, 0., 0., 0., 6.71140943e-003, 6.71140943e-003, + 6.71140943e-003, 6.71140943e-003, 1.34228189e-002, + 1.34228189e-002, 0., 0., 1.34228189e-002, 0., 0., 0., + 1.34228189e-002, 0., 6.71140943e-003, 0., 6.71140943e-003, 0., 0., + 0., 0., 6.71140943e-003, 6.71140943e-003, 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 6.71140943e-003, 6.71140943e-003, + 6.71140943e-003, 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 2.01342292e-002, + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 2.01342292e-002, 0., 0., 0., 6.71140943e-003, 0., 0., 0., + 0., 4.02684584e-002, 0., 0., 0., 1.34228189e-002, 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., + 6.71140943e-003, 6.71140943e-003, 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 6.71140943e-003, + 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.71140943e-003, 6.71140943e-003, 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 2.01342292e-002, 0., 0., 1.34228189e-002, + 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.34228189e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, + 6.71140943e-003, 0., 0., 6.71140943e-003, 6.71140943e-003, 0., 0., + 0., 0., 0., 0., 0., 1.34228189e-002, 0., 0., 0., 6.71140943e-003, + 0., 6.71140943e-003, 0., 0., 0., 0., 0., 1.34228189e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 1.34228189e-002, 0., 6.71140943e-003, 0., + 6.71140943e-003, 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.34228189e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 0., 6.71140943e-003, 0., 0., 1.34228189e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 6.71140943e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., + 1.80180185e-002, 0., 0., 9.00900923e-003, 9.00900923e-003, 0., 0., + 0., 9.00900923e-003, 0., 9.00900923e-003, 0., 9.00900923e-003, 0., + 9.00900923e-003, 0., 2.70270277e-002, 0., 0., 0., 0., + 9.00900923e-003, 0., 9.00900923e-003, 0., 0., 0., 9.00900923e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.70270277e-002, + 1.80180185e-002, 0., 0., 0., 9.00900923e-003, 0., 9.00900923e-003, + 0., 0., 9.00900923e-003, 9.00900923e-003, 0., 0., 0., 0., + 1.80180185e-002, 0., 0., 0., 0., 0., 0., 0., 9.00900923e-003, 0., + 9.00900923e-003, 0., 0., 9.00900923e-003, 9.00900923e-003, 0., + 9.00900923e-003, 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.80180185e-002, 0., 0., + 0., 0., 0., 9.00900923e-003, 0., 0., 0., 9.00900923e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 2.70270277e-002, 0., 9.00900923e-003, + 9.00900923e-003, 0., 9.00900923e-003, 0., 0., 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 0., 3.60360369e-002, 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 9.00900923e-003, 0., + 0., 0., 0., 1.80180185e-002, 0., 9.00900923e-003, 0., 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 9.00900923e-003, 0., + 9.00900923e-003, 0., 9.00900923e-003, 9.00900923e-003, 0., 0., 0., + 0., 1.80180185e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., + 1.80180185e-002, 0., 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.00900923e-003, + 0., 0., 0., 0., 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.00900923e-003, 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.00900923e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.00900923e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., + 9.00900923e-003, 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.00900923e-003, 0., + 9.00900923e-003, 1.80180185e-002, 0., 0., 0., 9.00900923e-003, + 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.00900923e-003, 0., 0., 9.00900923e-003, 0., 0., 0., 0., + 0., 1.80180185e-002, 9.00900923e-003, 0., 0., 0., 0., 0., + 1.80180185e-002, 0., 0., 0., 0., 9.00900923e-003, 1.80180185e-002, + 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 9.00900923e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 0., 0., 9.00900923e-003, 0., 0., + 0., 0., 0., 1.80180185e-002, 0., 0., 0., 0., 0., 0., + 1.80180185e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.00900923e-003, 0., 0., 0., 0., 9.00900923e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.00900923e-003, 0., 0., 0., 0., 9.00900923e-003, 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 9.00900923e-003, 0., 0., + 9.00900923e-003, 0., 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.80180185e-002, 0., 0., + 0., 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.00900923e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.00900923e-003, 0., 0., 9.00900923e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.68539323e-002, 2.24719103e-002, 1.12359552e-002, + 1.68539323e-002, 1.12359552e-002, 1.12359552e-002, 0., + 5.61797759e-003, 0., 0., 0., 1.12359552e-002, 0., 0., + 5.61797759e-003, 1.12359552e-002, 5.61797759e-003, + 1.12359552e-002, 5.61797759e-003, 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 1.12359552e-002, 5.61797759e-003, 0., 1.12359552e-002, + 2.24719103e-002, 0., 1.12359552e-002, 5.61797759e-003, + 1.12359552e-002, 2.80898884e-002, 1.12359552e-002, + 5.61797759e-003, 0., 0., 0., 1.68539323e-002, 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 5.61797759e-003, + 1.12359552e-002, 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 1.12359552e-002, 0., 0., 0., 1.12359552e-002, 5.61797759e-003, 0., + 0., 0., 0., 5.61797759e-003, 0., 1.12359552e-002, 0., 0., 0., + 1.68539323e-002, 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 5.61797759e-003, 0., 1.12359552e-002, 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 2.80898884e-002, 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 1.12359552e-002, 0., 0., 5.61797759e-003, 0., 0., 5.61797759e-003, + 1.12359552e-002, 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 0., 0., 5.61797759e-003, 0., 5.61797759e-003, 0., 1.12359552e-002, + 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 5.61797759e-003, 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., + 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 5.61797759e-003, 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 1.12359552e-002, 5.61797759e-003, 0., 5.61797759e-003, + 5.61797759e-003, 1.12359552e-002, 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.68539323e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.61797759e-003, 0., 0., 5.61797759e-003, 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 1.12359552e-002, 0., 0., 5.61797759e-003, 0., + 0., 0., 0., 0., 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., + 5.61797759e-003, 0., 5.61797759e-003, 0., 0., 0., 0., 0., + 5.61797759e-003, 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 5.61797759e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 0., 0., 0., 1.12359552e-002, 0., 5.61797759e-003, 0., 0., 0., 0., + 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., + 0., 0., 1.12359552e-002, 0., 0., 5.61797759e-003, 0., 0., + 1.68539323e-002, 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.61797759e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.61797759e-003, + 5.61797759e-003, 0., 0., 0., 0., 1.12359552e-002, 0., 0., + 5.61797759e-003, 0., 0., 0., 0., 0., 5.61797759e-003, 0., + 6.41025649e-003, 1.92307699e-002, 0., 0., 1.28205130e-002, + 1.28205130e-002, 0., 6.41025649e-003, 1.28205130e-002, + 6.41025649e-003, 0., 0., 0., 6.41025649e-003, 0., 0., + 6.41025649e-003, 6.41025649e-003, 0., 1.28205130e-002, + 6.41025649e-003, 0., 0., 1.92307699e-002, 0., 0., 6.41025649e-003, + 0., 1.28205130e-002, 0., 1.28205130e-002, 6.41025649e-003, 0., + 6.41025649e-003, 1.92307699e-002, 0., 0., 0., 0., 1.28205130e-002, + 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 6.41025649e-003, 0., + 0., 1.28205130e-002, 0., 0., 1.28205130e-002, 1.28205130e-002, 0., + 6.41025649e-003, 0., 0., 1.28205130e-002, 0., 0., 6.41025649e-003, + 0., 6.41025649e-003, 0., 6.41025649e-003, 0., 6.41025649e-003, + 1.92307699e-002, 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., + 0., 6.41025649e-003, 0., 0., 0., 1.28205130e-002, 0., 0., 0., 0., + 0., 0., 0., 6.41025649e-003, 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 2.56410260e-002, 0., 6.41025649e-003, + 0., 1.28205130e-002, 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, + 0., 0., 0., 1.28205130e-002, 6.41025649e-003, 6.41025649e-003, 0., + 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 6.41025649e-003, + 5.12820520e-002, 0., 0., 0., 1.28205130e-002, 6.41025649e-003, 0., + 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., + 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, + 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.28205130e-002, 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., + 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 1.28205130e-002, + 6.41025649e-003, 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.28205130e-002, 0., 0., 6.41025649e-003, + 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 1.28205130e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.28205130e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 1.28205130e-002, 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 6.41025649e-003, 0., + 1.92307699e-002, 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., + 6.41025649e-003, 6.41025649e-003, 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 0., + 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 6.41025649e-003, + 0., 0., 0., 0., 0., 6.41025649e-003, 0., 1.28205130e-002, 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., + 0., 0., 0., 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.41025649e-003, 0., 0., 0., 6.41025649e-003, 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., 6.41025649e-003, + 0., 0., 5.68181835e-003, 1.13636367e-002, 0., 5.68181835e-003, + 5.68181835e-003, 5.68181835e-003, 0., 0., 1.70454551e-002, 0., 0., + 0., 5.68181835e-003, 0., 0., 5.68181835e-003, 5.68181835e-003, + 1.13636367e-002, 1.70454551e-002, 5.68181835e-003, 0., 0., + 5.68181835e-003, 5.68181835e-003, 0., 0., 1.70454551e-002, 0., + 1.13636367e-002, 0., 1.13636367e-002, 0., 0., 0., 1.13636367e-002, + 0., 0., 5.68181835e-003, 5.68181835e-003, 1.70454551e-002, 0., + 5.68181835e-003, 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 5.68181835e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.68181835e-003, 0., 0., 0., 5.68181835e-003, 0., 0., + 5.68181835e-003, 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 5.68181835e-003, 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 5.68181835e-003, 0., 0., 5.68181835e-003, 0., 0., 0., + 5.68181835e-003, 0., 5.68181835e-003, 5.68181835e-003, 0., + 5.68181835e-003, 5.11363670e-002, 0., 0., 0., 0., 0., + 5.68181835e-003, 0., 5.68181835e-003, 0., 0., 0., 1.70454551e-002, + 0., 5.68181835e-003, 0., 0., 0., 0., 5.68181835e-003, 0., + 5.68181835e-003, 0., 0., 0., 0., 0., 1.13636367e-002, 0., + 5.68181835e-003, 0., 1.13636367e-002, 5.68181835e-003, 0., + 1.13636367e-002, 0., 0., 5.68181835e-003, 0., 2.27272734e-002, 0., + 0., 5.68181835e-003, 0., 5.68181835e-003, 0., 1.13636367e-002, 0., + 5.68181835e-003, 0., 0., 0., 0., 5.68181835e-003, 0., 0., 0., 0., + 5.68181835e-003, 0., 5.68181835e-003, 0., 1.13636367e-002, 0., + 5.68181835e-003, 0., 1.13636367e-002, 0., 5.68181835e-003, 0., 0., + 0., 0., 5.68181835e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 1.13636367e-002, 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 0., 5.68181835e-003, 5.68181835e-003, 5.68181835e-003, 0., 0., 0., + 0., 0., 0., 0., 5.68181835e-003, 0., 0., 0., 5.68181835e-003, 0., + 0., 5.68181835e-003, 0., 0., 0., 0., 5.68181835e-003, 0., 0., + 5.68181835e-003, 0., 0., 0., 0., 0., 5.68181835e-003, 0., 0., 0., + 0., 0., 0., 0., 5.68181835e-003, 5.68181835e-003, 0., + 5.68181835e-003, 5.68181835e-003, 0., 0., 0., 5.68181835e-003, 0., + 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., 0., 0., 0., 0., 0., + 5.68181835e-003, 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 0., 5.68181835e-003, 0., 1.13636367e-002, 0., 0., 5.68181835e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 0., 5.68181835e-003, 0., 0., 0., 0., 1.13636367e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.13636367e-002, 0., 0., 0., 1.13636367e-002, 1.70454551e-002, + 5.68181835e-003, 0., 5.68181835e-003, 0., 0., 0., 5.68181835e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., 0., + 1.13636367e-002, 0., 0., 5.68181835e-003, 0., 0., 0., 0., 0., 0., + 0., 5.68181835e-003, 0., 0., 0., 1.70454551e-002, 0., 0., 0., + 1.13636367e-002, 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 3.40909101e-002, 0., 0., 0., 0., 1.13636367e-002, 0., 0., 0., + 5.68181835e-003, 5.68181835e-003, 0., 0., 0., 0., 0., + 5.68181835e-003, 5.68181835e-003, 0., 0., 5.68181835e-003, 0., 0., + 0., 5.68181835e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.68181835e-003, 0., 0., 5.68181835e-003, 0., 5.68181835e-003, 0., + 0., 5.68181835e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.68181835e-003, 0., 5.68181835e-003, 5.68181835e-003, 0., + 0., 0., 1.13636367e-002, 5.68181835e-003, 0., 5.68181835e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.68181835e-003, 0., + 0., 0., 5.68181835e-003, 0., 0., 0., 0., 0., 0., 0., + 1.13636367e-002, 1.13636367e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.39520967e-002, + 1.19760484e-002, 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., + 1.19760484e-002, 1.79640725e-002, 0., 1.19760484e-002, + 5.98802418e-003, 0., 2.39520967e-002, 5.98802418e-003, 0., + 1.79640725e-002, 2.39520967e-002, 5.98802418e-003, 0., + 1.19760484e-002, 0., 1.79640725e-002, 0., 5.98802418e-003, 0., + 1.19760484e-002, 0., 0., 1.19760484e-002, 5.98802418e-003, 0., 0., + 5.98802418e-003, 2.99401209e-002, 0., 5.98802418e-003, 0., 0., 0., + 0., 4.79041934e-002, 5.98802418e-003, 0., 0., 1.19760484e-002, + 5.98802418e-003, 0., 0., 0., 1.19760484e-002, 2.99401209e-002, 0., + 0., 1.19760484e-002, 0., 0., 0., 1.19760484e-002, 0., 0., 0., 0., + 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.19760484e-002, 0., 0., 0., 0., 0., 0., + 5.98802418e-003, 1.79640725e-002, 0., 0., 1.19760484e-002, 0., 0., + 0., 0., 0., 5.98802418e-003, 0., 5.98802418e-003, 5.98802418e-003, + 0., 0., 0., 0., 5.98802418e-003, 0., 5.98802418e-003, 0., 0., 0., + 0., 0., 5.98802418e-003, 5.98802418e-003, 0., 0., 0., 0., 0., 0., + 0., 1.19760484e-002, 0., 0., 0., 4.19161692e-002, 0., 0., + 5.98802418e-003, 0., 5.98802418e-003, 1.19760484e-002, 0., + 5.98802418e-003, 0., 0., 0., 0., 1.19760484e-002, 1.19760484e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.19760484e-002, 1.19760484e-002, 0., 0., 5.98802418e-003, + 5.98802418e-003, 2.39520967e-002, 0., 1.19760484e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., + 0., 0., 0., 5.98802418e-003, 0., 0., 0., 5.98802418e-003, 0., 0., + 5.98802418e-003, 0., 0., 0., 0., 5.98802418e-003, 0., 0., + 5.98802418e-003, 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., + 0., 1.19760484e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.98802418e-003, 5.98802418e-003, 0., 0., + 5.98802418e-003, 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 5.98802418e-003, 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.98802418e-003, 0., 0., 5.98802418e-003, 0., 0., 0., + 0., 1.19760484e-002, 0., 0., 0., 1.19760484e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.98802418e-003, 5.98802418e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, + 5.98802418e-003, 5.98802418e-003, 0., 5.98802418e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 5.98802418e-003, 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 5.98802418e-003, 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.98802418e-003, 0., 5.98802418e-003, 5.98802418e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.19760484e-002, + 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.19760484e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.98802418e-003, 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., + 0., 5.98802418e-003, 0., 0., 0., 2.19780225e-002, 1.09890113e-002, + 1.64835174e-002, 0., 5.49450563e-003, 4.39560451e-002, 0., 0., + 1.64835174e-002, 5.49450563e-003, 5.49450563e-003, + 1.64835174e-002, 0., 5.49450563e-003, 0., 0., 0., 1.09890113e-002, + 0., 0., 0., 1.09890113e-002, 0., 0., 5.49450563e-003, 0., + 1.09890113e-002, 0., 1.64835174e-002, 5.49450563e-003, + 5.49450563e-003, 1.09890113e-002, 0., 1.09890113e-002, + 1.09890113e-002, 5.49450563e-003, 1.09890113e-002, + 5.49450563e-003, 5.49450563e-003, 5.49450563e-003, + 5.49450563e-003, 0., 0., 0., 0., 1.64835174e-002, 1.09890113e-002, + 1.09890113e-002, 2.19780225e-002, 0., 0., 0., 0., 5.49450563e-003, + 5.49450563e-003, 1.09890113e-002, 0., 0., 5.49450563e-003, 0., 0., + 0., 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.49450563e-003, 0., 5.49450563e-003, 0., + 1.09890113e-002, 0., 0., 0., 0., 5.49450563e-003, 5.49450563e-003, + 0., 5.49450563e-003, 1.09890113e-002, 0., 0., 0., 1.09890113e-002, + 5.49450563e-003, 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.09890113e-002, 0., 0., 5.49450563e-003, + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 1.09890113e-002, 0., + 0., 1.09890113e-002, 0., 5.49450563e-003, 0., 0., 1.09890113e-002, + 0., 0., 0., 0., 0., 0., 0., 1.09890113e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 0., 5.49450563e-003, 0., 0., + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., 1.09890113e-002, + 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.09890113e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., + 0., 0., 0., 0., 5.49450563e-003, 0., 0., 1.09890113e-002, 0., 0., + 0., 1.09890113e-002, 0., 0., 0., 1.09890113e-002, 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.09890113e-002, 0., 5.49450563e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 5.49450563e-003, 5.49450563e-003, 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 1.09890113e-002, 0., + 1.64835174e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.09890113e-002, 5.49450563e-003, 0., 5.49450563e-003, 0., 0., + 5.49450563e-003, 0., 0., 1.09890113e-002, 0., 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., + 0., 1.09890113e-002, 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 0., 0., 5.49450563e-003, 0., 0., 5.49450563e-003, 5.49450563e-003, + 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, + 0., 0., 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., + 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.64835174e-002, 0., 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., + 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 0., 0., 0., 0., 1.11111114e-002, + 5.55555569e-003, 1.11111114e-002, 1.66666675e-002, + 1.11111114e-002, 1.11111114e-002, 0., 5.55555569e-003, + 5.55555569e-003, 0., 5.55555569e-003, 0., 0., 5.55555569e-003, 0., + 0., 5.55555569e-003, 5.55555569e-003, 5.55555569e-003, + 5.55555569e-003, 0., 5.55555569e-003, 0., 0., 1.11111114e-002, + 5.55555569e-003, 1.66666675e-002, 5.55555569e-003, + 5.55555569e-003, 2.77777780e-002, 0., 0., 0., 5.55555569e-003, + 5.55555569e-003, 5.55555569e-003, 0., 0., 1.66666675e-002, 0., 0., + 0., 5.55555569e-003, 5.55555569e-003, 0., 5.55555569e-003, 0., + 1.11111114e-002, 2.22222228e-002, 1.11111114e-002, 0., + 1.11111114e-002, 0., 0., 0., 1.11111114e-002, 0., 5.55555569e-003, + 0., 0., 0., 0., 0., 2.22222228e-002, 0., 0., 0., 0., + 5.55555569e-003, 0., 1.11111114e-002, 0., 0., 0., 5.55555569e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.66666675e-002, 0., 0., + 5.55555569e-003, 5.55555569e-003, 0., 5.55555569e-003, 0., + 1.11111114e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, + 2.77777780e-002, 5.55555569e-003, 0., 0., 1.11111114e-002, 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 1.66666675e-002, 0., 0., 0., 0., + 0., 0., 0., 1.11111114e-002, 0., 0., 5.55555569e-003, 0., + 5.55555569e-003, 0., 0., 5.55555569e-003, 5.55555569e-003, 0., 0., + 0., 1.11111114e-002, 1.11111114e-002, 0., 0., 0., 1.11111114e-002, + 1.11111114e-002, 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.55555569e-003, 5.55555569e-003, 0., 0., 1.11111114e-002, + 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, + 0., 5.55555569e-003, 0., 0., 1.11111114e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., + 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 5.55555569e-003, 0., + 5.55555569e-003, 2.22222228e-002, 0., 0., 5.55555569e-003, + 5.55555569e-003, 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., + 1.11111114e-002, 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., + 0., 5.55555569e-003, 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., + 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.11111114e-002, 0., 2.22222228e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, + 5.55555569e-003, 0., 0., 0., 1.11111114e-002, 0., 0., + 5.55555569e-003, 0., 0., 1.11111114e-002, 0., 0., 5.55555569e-003, + 0., 5.55555569e-003, 0., 0., 0., 5.55555569e-003, 0., 0., + 5.55555569e-003, 5.55555569e-003, 0., 5.55555569e-003, 0., 0., + 5.55555569e-003, 0., 0., 5.55555569e-003, 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 1.66666675e-002, 5.55555569e-003, + 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 1.11111114e-002, + 0., 0., 0., 5.55555569e-003, 0., 0., 5.55555569e-003, 0., 0., 0., + 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., + 0., 0., 5.55555569e-003, 0., 0., 0., 5.55555569e-003, 0., 0., 0., + 0., 0., 5.55555569e-003, 0., 5.55555569e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 5.55555569e-003, + 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, 1.67597756e-002, + 5.58659201e-003, 0., 0., 0., 0., 0., 1.67597756e-002, + 5.58659201e-003, 0., 0., 1.67597756e-002, 1.67597756e-002, + 5.58659201e-003, 0., 0., 5.58659201e-003, 1.11731840e-002, + 5.58659201e-003, 5.58659201e-003, 1.11731840e-002, 0., + 1.11731840e-002, 1.11731840e-002, 0., 0., 5.58659201e-003, 0., + 1.67597756e-002, 0., 0., 0., 0., 5.58659201e-003, 5.58659201e-003, + 0., 5.58659201e-003, 0., 2.23463681e-002, 5.58659201e-003, 0., 0., + 1.11731840e-002, 5.58659201e-003, 1.11731840e-002, 0., + 2.23463681e-002, 3.35195512e-002, 1.67597756e-002, 0., 0., 0., 0., + 1.67597756e-002, 5.58659201e-003, 0., 0., 5.58659201e-003, + 5.58659201e-003, 5.58659201e-003, 0., 0., 0., 5.58659201e-003, 0., + 0., 5.58659201e-003, 5.58659201e-003, 0., 5.58659201e-003, + 5.58659201e-003, 5.58659201e-003, 0., 1.11731840e-002, 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 5.58659201e-003, 5.58659201e-003, + 5.58659201e-003, 0., 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., + 5.58659201e-003, 2.23463681e-002, 0., 0., 5.58659201e-003, + 1.11731840e-002, 2.23463681e-002, 0., 5.58659201e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, 5.58659201e-003, + 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., + 1.67597756e-002, 0., 5.58659201e-003, 5.58659201e-003, + 1.67597756e-002, 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., + 0., 1.11731840e-002, 5.58659201e-003, 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 1.67597756e-002, 0., 0., 5.58659201e-003, 0., + 2.79329605e-002, 0., 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., + 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., 5.58659201e-003, + 0., 0., 5.58659201e-003, 5.58659201e-003, 0., 0., 5.58659201e-003, + 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.11731840e-002, 0., 5.58659201e-003, + 5.58659201e-003, 0., 5.58659201e-003, 0., 0., 0., 5.58659201e-003, + 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 5.58659201e-003, + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, + 5.58659201e-003, 0., 5.58659201e-003, 0., 0., 5.58659201e-003, + 1.11731840e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., 1.67597756e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, 5.58659201e-003, 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.11731840e-002, 0., 1.11731840e-002, 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 1.67597756e-002, 0., 0., 5.58659201e-003, 0., 0., 0., + 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 5.58659201e-003, 0., 0., + 5.58659201e-003, 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.58659201e-003, 1.11731840e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.58659201e-003, 0., 0., 5.58659201e-003, 0., 0., 0., + 5.58659201e-003, 0., 0., 0., 5.58659201e-003, 0., 0., 0., + 5.58659201e-003, 0., 0., 5.58659201e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.58659201e-003, 0., 0., 0., + 0., 6.13496918e-003, 0., 6.13496918e-003, 1.22699384e-002, + 6.13496918e-003, 6.13496918e-003, 0., 0., 6.13496918e-003, + 6.13496918e-003, 1.22699384e-002, 0., 1.84049085e-002, + 1.22699384e-002, 6.13496918e-003, 0., 0., 1.22699384e-002, 0., + 6.13496918e-003, 1.22699384e-002, 0., 1.22699384e-002, + 6.13496918e-003, 6.13496918e-003, 6.13496918e-003, 0., 0., + 6.13496918e-003, 6.13496918e-003, 6.13496918e-003, + 1.22699384e-002, 0., 1.22699384e-002, 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 2.45398767e-002, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 6.13496918e-003, 0., 6.13496918e-003, + 6.13496918e-003, 0., 0., 6.13496918e-003, 2.45398767e-002, + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 6.13496918e-003, 0., 6.13496918e-003, 6.13496918e-003, + 6.13496918e-003, 1.84049085e-002, 0., 1.22699384e-002, 0., 0., + 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., 6.13496918e-003, + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., 0., + 1.22699384e-002, 6.13496918e-003, 0., 0., 0., 1.22699384e-002, + 1.84049085e-002, 1.22699384e-002, 6.13496918e-003, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., + 1.22699384e-002, 0., 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 1.22699384e-002, 0., 0., 0., + 1.22699384e-002, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.22699384e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.22699384e-002, 0., 0., 0., 0., 6.13496918e-003, + 0., 0., 0., 1.22699384e-002, 6.13496918e-003, 6.13496918e-003, 0., + 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 6.13496918e-003, 6.13496918e-003, 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 0., 1.22699384e-002, 0., 6.13496918e-003, 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 6.13496918e-003, 0., 0., 6.13496918e-003, 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 6.13496918e-003, 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., 0., 0., + 1.22699384e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, + 0., 0., 1.84049085e-002, 0., 6.13496918e-003, 0., 0., + 6.13496918e-003, 0., 0., 6.13496918e-003, 6.13496918e-003, 0., + 6.13496918e-003, 0., 0., 6.13496918e-003, 1.22699384e-002, 0., 0., + 0., 0., 0., 0., 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 0., 0., 1.22699384e-002, 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 1.19760484e-002, + 1.79640725e-002, 0., 0., 0., 2.39520967e-002, 0., 0., + 1.19760484e-002, 1.19760484e-002, 5.98802418e-003, + 5.98802418e-003, 0., 5.98802418e-003, 0., 0., 0., 1.19760484e-002, + 0., 0., 0., 0., 5.98802418e-003, 0., 5.98802418e-003, 0., + 5.98802418e-003, 5.98802418e-003, 5.98802418e-003, + 5.98802418e-003, 5.98802418e-003, 5.98802418e-003, 0., + 1.79640725e-002, 1.19760484e-002, 0., 0., 1.19760484e-002, + 1.19760484e-002, 5.98802418e-003, 0., 0., 0., 0., 5.98802418e-003, + 5.98802418e-003, 0., 1.19760484e-002, 5.98802418e-003, + 5.98802418e-003, 0., 0., 0., 0., 0., 1.19760484e-002, 0., 0., 0., + 0., 0., 0., 5.98802418e-003, 1.19760484e-002, 1.19760484e-002, 0., + 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 1.79640725e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.19760484e-002, 0., 0., 1.19760484e-002, 0., 0., 5.98802418e-003, + 0., 0., 5.98802418e-003, 0., 1.19760484e-002, 0., 0., + 1.19760484e-002, 0., 0., 5.98802418e-003, 5.98802418e-003, + 5.98802418e-003, 0., 1.19760484e-002, 0., 0., 0., 0., 0., + 5.98802418e-003, 0., 0., 5.98802418e-003, 1.19760484e-002, 0., 0., + 0., 5.98802418e-003, 4.79041934e-002, 0., 5.98802418e-003, + 5.98802418e-003, 2.39520967e-002, 0., 0., 0., 0., 0., 0., 0., + 1.19760484e-002, 0., 0., 1.19760484e-002, 0., 0., 0., 0., 0., + 1.19760484e-002, 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., + 0., 5.98802418e-003, 5.98802418e-003, 0., 0., 0., 0., + 5.98802418e-003, 1.79640725e-002, 0., 5.98802418e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.19760484e-002, 0., 0., 5.98802418e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 0., 0., 0., 0., 5.98802418e-003, 5.98802418e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., + 0., 1.19760484e-002, 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., + 5.98802418e-003, 0., 0., 0., 5.98802418e-003, 5.98802418e-003, + 5.98802418e-003, 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 0., 0., 0., 5.98802418e-003, 5.98802418e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.98802418e-003, 5.98802418e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.98802418e-003, 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 0., 5.98802418e-003, 0., 0., 0., 5.98802418e-003, 0., + 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., + 0., 5.98802418e-003, 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., + 0., 5.98802418e-003, 0., 0., 0., 5.98802418e-003, 5.98802418e-003, + 0., 0., 0., 5.98802418e-003, 5.98802418e-003, 0., 5.98802418e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.19760484e-002, 0., 0., 0., + 5.98802418e-003, 0., 5.98802418e-003, 5.98802418e-003, 0., + 5.98802418e-003, 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., + 0., 0., 0., 0., 0., 5.98802418e-003, 0., 5.98802418e-003, 0., 0., + 1.79640725e-002, 0., 1.19760484e-002, 0., 0., 0., 0., 0., 0., + 1.19760484e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.19760484e-002, + 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.98802418e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.98802418e-003, 0., 0., 5.98802418e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.79640725e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.98802418e-003, 0., 0., 0., + 5.98802418e-003, 0., 5.98802418e-003, 0., 0., 0., 3.44827585e-002, + 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 8.62068962e-003, 8.62068962e-003, 1.72413792e-002, + 1.72413792e-002, 0., 8.62068962e-003, 0., 2.58620679e-002, 0., 0., + 0., 8.62068962e-003, 1.72413792e-002, 0., 0., 8.62068962e-003, 0., + 8.62068962e-003, 1.72413792e-002, 1.72413792e-002, 0., 0., 0., + 1.72413792e-002, 0., 0., 0., 8.62068962e-003, 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 0., 2.58620679e-002, 1.72413792e-002, 0., 0., + 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 8.62068962e-003, + 0., 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 0., + 1.72413792e-002, 0., 8.62068962e-003, 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 3.44827585e-002, 0., 0., 0., 0., + 1.72413792e-002, 0., 0., 0., 0., 0., 0., 8.62068962e-003, + 8.62068962e-003, 0., 0., 0., 0., 0., 1.72413792e-002, 0., + 8.62068962e-003, 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, + 0., 0., 0., 5.17241359e-002, 0., 0., 8.62068962e-003, 0., 0., 0., + 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., + 0., 0., 2.58620679e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 1.72413792e-002, 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 1.72413792e-002, 0., 0., 0., 8.62068962e-003, 0., + 8.62068962e-003, 0., 0., 8.62068962e-003, 8.62068962e-003, + 8.62068962e-003, 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, + 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 8.62068962e-003, + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., + 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 0., 8.62068962e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.72413792e-002, 0., 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.72413792e-002, 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, + 0., 0., 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 3.36134471e-002, 8.40336177e-003, 0., 0., 8.40336177e-003, 0., + 0., 8.40336177e-003, 0., 0., 8.40336177e-003, 0., 8.40336177e-003, + 0., 0., 0., 8.40336177e-003, 0., 8.40336177e-003, 0., 0., + 8.40336177e-003, 8.40336177e-003, 8.40336177e-003, 0., 0., + 1.68067235e-002, 0., 8.40336177e-003, 8.40336177e-003, + 1.68067235e-002, 8.40336177e-003, 0., 8.40336177e-003, + 8.40336177e-003, 8.40336177e-003, 8.40336177e-003, 0., + 8.40336177e-003, 2.52100863e-002, 0., 8.40336177e-003, 0., 0., 0., + 8.40336177e-003, 0., 0., 1.68067235e-002, 0., 0., 8.40336177e-003, + 0., 0., 8.40336177e-003, 2.52100863e-002, 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 1.68067235e-002, 0., 8.40336177e-003, 0., 0., 0., + 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 1.68067235e-002, + 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 8.40336177e-003, + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.52100863e-002, 0., 1.68067235e-002, + 8.40336177e-003, 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., + 2.52100863e-002, 1.68067235e-002, 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., + 0., 0., 8.40336177e-003, 0., 8.40336177e-003, 0., 8.40336177e-003, + 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.68067235e-002, 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.68067235e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., + 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., + 8.40336177e-003, 8.40336177e-003, 0., 0., 8.40336177e-003, 0., 0., + 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 8.40336177e-003, 0., 8.40336177e-003, 0., 0., + 0., 0., 8.40336177e-003, 0., 8.40336177e-003, 0., 0., 0., 0., 0., + 0., 8.40336177e-003, 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., + 0., 0., 0., 8.40336177e-003, 0., 0., 2.52100863e-002, 0., 0., 0., + 0., 0., 8.40336177e-003, 0., 8.40336177e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., + 8.40336177e-003, 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 8.40336177e-003, 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 1.68067235e-002, 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.40336177e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.40336177e-003, 0., 0., 0., 0., 0., 0., 8.40336177e-003, 0., + 7.93650839e-003, 0., 7.93650839e-003, 0., 0., 1.58730168e-002, 0., + 2.38095261e-002, 1.58730168e-002, 0., 7.93650839e-003, + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., + 0., 1.58730168e-002, 7.93650839e-003, 0., 0., 3.17460336e-002, 0., + 0., 1.58730168e-002, 7.93650839e-003, 7.93650839e-003, 0., 0., + 7.93650839e-003, 0., 0., 0., 7.93650839e-003, 1.58730168e-002, 0., + 0., 0., 0., 0., 1.58730168e-002, 7.93650839e-003, 0., + 3.96825410e-002, 7.93650839e-003, 0., 7.93650839e-003, 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 7.93650839e-003, 0., 0., + 7.93650839e-003, 0., 7.93650839e-003, 0., 0., 0., 7.93650839e-003, + 0., 0., 0., 7.93650839e-003, 0., 7.93650839e-003, 7.93650839e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.58730168e-002, 7.93650839e-003, + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 1.58730168e-002, 0., + 0., 0., 0., 0., 0., 0., 1.58730168e-002, 0., 0., 1.58730168e-002, + 0., 0., 0., 0., 0., 3.17460336e-002, 0., 0., 7.93650839e-003, + 2.38095261e-002, 0., 0., 0., 0., 3.17460336e-002, 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 7.93650839e-003, 7.93650839e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., + 0., 1.58730168e-002, 7.93650839e-003, 0., 0., 0., 7.93650839e-003, + 7.93650839e-003, 0., 3.17460336e-002, 0., 0., 7.93650839e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 1.58730168e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 3.96825410e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, + 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 7.93650839e-003, 0., + 1.58730168e-002, 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., + 1.58730168e-002, 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, + 0., 7.93650839e-003, 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., + 0., 0., 7.93650839e-003, 0., 0., 0., 0., 7.93650839e-003, 0., 0., + 0., 7.93650839e-003, 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., + 0., 7.93650839e-003, 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.93650839e-003, 0., 0., 0., 0., 0., 7.93650839e-003, 0., + 0., 0., 7.93650839e-003, 0., 0., 1.58730168e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., 0., 0., 0., + 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 7.93650839e-003, 0., + 0., 7.93650839e-003, 0., 0., 0., 0., 0., 0., 0., 2.09424086e-002, + 1.04712043e-002, 0., 0., 0., 5.23560215e-003, 0., 0., + 5.23560215e-003, 1.57068074e-002, 5.23560215e-003, 0., + 1.57068074e-002, 1.04712043e-002, 0., 0., 5.23560215e-003, + 5.23560215e-003, 1.04712043e-002, 0., 0., 5.23560215e-003, + 5.23560215e-003, 0., 5.23560215e-003, 5.23560215e-003, + 5.23560215e-003, 1.04712043e-002, 5.23560215e-003, + 5.23560215e-003, 0., 1.04712043e-002, 0., 0., 5.23560215e-003, 0., + 0., 5.23560215e-003, 5.23560215e-003, 1.04712043e-002, 0., 0., 0., + 0., 0., 2.09424086e-002, 5.23560215e-003, 1.04712043e-002, + 2.09424086e-002, 1.57068074e-002, 0., 1.04712043e-002, 0., 0., + 5.23560215e-003, 5.23560215e-003, 0., 5.23560215e-003, + 1.57068074e-002, 1.04712043e-002, 5.23560215e-003, 0., + 5.23560215e-003, 5.23560215e-003, 5.23560215e-003, 0., 0., 0., + 5.23560215e-003, 5.23560215e-003, 5.23560215e-003, 0., + 2.09424086e-002, 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., + 5.23560215e-003, 1.04712043e-002, 1.04712043e-002, + 5.23560215e-003, 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 1.04712043e-002, + 0., 0., 5.23560215e-003, 0., 5.23560215e-003, 1.04712043e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.57068074e-002, 1.04712043e-002, + 0., 0., 0., 0., 5.23560215e-003, 0., 2.09424086e-002, 0., 0., + 1.04712043e-002, 0., 0., 5.23560215e-003, 0., 5.23560215e-003, + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 5.23560215e-003, + 5.23560215e-003, 1.04712043e-002, 5.23560215e-003, + 5.23560215e-003, 0., 1.04712043e-002, 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 1.04712043e-002, 0., 5.23560215e-003, + 1.57068074e-002, 0., 5.23560215e-003, 0., 0., 0., 5.23560215e-003, + 0., 0., 5.23560215e-003, 0., 0., 5.23560215e-003, 0., 0., + 1.04712043e-002, 0., 5.23560215e-003, 5.23560215e-003, 0., 0., 0., + 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.23560215e-003, 0., 1.04712043e-002, + 5.23560215e-003, 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.04712043e-002, 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.23560215e-003, 0., 0., 5.23560215e-003, 5.23560215e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.04712043e-002, 0., 0., 0., 0., 1.04712043e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., + 0., 0., 0., 0., 1.04712043e-002, 0., 0., 0., 0., 0., + 2.09424086e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 5.23560215e-003, + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 5.23560215e-003, 0., 5.23560215e-003, 0., 0., 0., + 0., 0., 5.23560215e-003, 5.23560215e-003, 2.09424086e-002, + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, + 0., 0., 0., 0., 0., 0., 1.04712043e-002, 0., 0., 1.04712043e-002, + 0., 0., 0., 0., 1.04712043e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.23560215e-003, 0., 0., 5.23560215e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.23560215e-003, 5.23560215e-003, + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., + 0., 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.04712043e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.23560215e-003, 0., 0., 5.23560215e-003, 0., 0., 0., 0., 0., + 0., 0., 6.02409616e-003, 0., 0., 6.02409616e-003, 6.02409616e-003, + 0., 0., 1.80722885e-002, 1.20481923e-002, 0., 0., 6.02409616e-003, + 6.02409616e-003, 6.02409616e-003, 0., 6.02409616e-003, + 6.02409616e-003, 6.02409616e-003, 6.02409616e-003, 0., 0., + 6.02409616e-003, 1.80722885e-002, 0., 6.02409616e-003, 0., + 6.02409616e-003, 1.20481923e-002, 0., 3.01204808e-002, 0., 0., 0., + 6.02409616e-003, 0., 0., 6.02409616e-003, 0., 0., 0., + 1.20481923e-002, 6.02409616e-003, 0., 0., 0., 0., 6.02409616e-003, + 0., 6.02409616e-003, 1.80722885e-002, 0., 0., 0., 6.02409616e-003, + 6.02409616e-003, 1.20481923e-002, 0., 6.02409616e-003, + 6.02409616e-003, 0., 0., 0., 6.02409616e-003, 0., 6.02409616e-003, + 0., 0., 0., 6.02409616e-003, 6.02409616e-003, 1.20481923e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., 0., 0., + 6.02409616e-003, 0., 0., 0., 0., 6.02409616e-003, 0., + 6.02409616e-003, 0., 0., 6.02409616e-003, 0., 6.02409616e-003, 0., + 6.02409616e-003, 6.02409616e-003, 0., 1.20481923e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.80722885e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.02409616e-003, 0., 0., 0., 0., 1.20481923e-002, 0., + 0., 0., 2.40963846e-002, 1.80722885e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.20481923e-002, 1.20481923e-002, 6.02409616e-003, + 6.02409616e-003, 1.20481923e-002, 6.02409616e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.80722885e-002, 6.02409616e-003, + 0., 0., 0., 0., 6.02409616e-003, 0., 3.01204808e-002, 0., + 1.20481923e-002, 0., 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.20481923e-002, 0., 0., + 0., 0., 1.80722885e-002, 0., 0., 0., 0., 0., 1.20481923e-002, + 6.02409616e-003, 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., + 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 3.01204808e-002, 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., 0., 0., + 6.02409616e-003, 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.02409616e-003, 0., 0., 1.20481923e-002, 0., 0., 0., 0., 0., 0., + 0., 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, + 0., 0., 0., 6.02409616e-003, 0., 0., 0., 0., 1.20481923e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.02409616e-003, 1.20481923e-002, 1.20481923e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., + 6.02409616e-003, 0., 0., 1.20481923e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., + 6.02409616e-003, 0., 0., 0., 0., 6.02409616e-003, 6.02409616e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.80722885e-002, 0., 0., 0., 0., + 6.02409616e-003, 6.02409616e-003, 0., 0., 0., 0., 0., + 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.02409616e-003, 0., 0., 0., 0., 6.02409616e-003, 0., 0., + 6.02409616e-003, 1.20481923e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.02409616e-003, 6.02409616e-003, 0., 6.02409616e-003, + 6.02409616e-003, 0., 0., 0., 6.02409616e-003, 0., 0., 0., + 6.02409616e-003, 0., 0., 6.02409616e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., 0., 0., 0., 0., + 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, 0., 0., 0., + 6.02409616e-003, 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.02409616e-003, 0., 6.02409616e-003, 0., 0., 0., 0., 0., 0., + 6.02409616e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.02409616e-003, + 0., 0., 0., 0., 6.02409616e-003, 0., 0., 0., 6.02409616e-003, + 2.27272734e-002, 0., 2.27272734e-002, 7.57575780e-003, 0., + 1.51515156e-002, 0., 0., 1.51515156e-002, 7.57575780e-003, 0., 0., + 2.27272734e-002, 7.57575780e-003, 0., 0., 7.57575780e-003, + 1.51515156e-002, 7.57575780e-003, 0., 0., 7.57575780e-003, 0., + 7.57575780e-003, 0., 7.57575780e-003, 7.57575780e-003, + 7.57575780e-003, 0., 7.57575780e-003, 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 7.57575780e-003, 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 7.57575780e-003, 1.51515156e-002, 0., + 0., 7.57575780e-003, 0., 0., 0., 1.51515156e-002, 0., + 7.57575780e-003, 0., 0., 0., 0., 2.27272734e-002, 0., 0., + 7.57575780e-003, 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., + 7.57575780e-003, 7.57575780e-003, 0., 0., 0., 7.57575780e-003, 0., + 0., 7.57575780e-003, 7.57575780e-003, 0., 0., 0., 0., 0., + 7.57575780e-003, 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.57575780e-003, 7.57575780e-003, 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 1.51515156e-002, 2.27272734e-002, 0., 0., + 7.57575780e-003, 0., 7.57575780e-003, 7.57575780e-003, 0., + 2.27272734e-002, 3.78787890e-002, 0., 0., 7.57575780e-003, 0., + 7.57575780e-003, 7.57575780e-003, 7.57575780e-003, 0., 0., + 7.57575780e-003, 7.57575780e-003, 7.57575780e-003, 0., + 7.57575780e-003, 7.57575780e-003, 0., 0., 0., 7.57575780e-003, + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 2.27272734e-002, 0., 1.51515156e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 2.27272734e-002, 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.27272734e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 7.57575780e-003, + 0., 0., 2.27272734e-002, 0., 7.57575780e-003, 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.57575780e-003, 0., 0., 7.57575780e-003, 0., + 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 0., 1.51515156e-002, 0., 0., 0., 0., + 0., 0., 2.27272734e-002, 7.57575780e-003, 0., 0., 0., 0., 0., 0., + 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, 0., 7.57575780e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.51515156e-002, 0., 0., 0., 0., 0., 0., 0., 0., 7.57575780e-003, + 7.57575780e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.57575780e-003, 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 9.43396240e-003, 0., 9.43396240e-003, 0., + 9.43396240e-003, 1.88679248e-002, 0., 0., 9.43396240e-003, + 9.43396240e-003, 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 1.88679248e-002, 0., 9.43396240e-003, 9.43396240e-003, + 1.88679248e-002, 0., 9.43396240e-003, 0., 1.88679248e-002, + 9.43396240e-003, 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 9.43396240e-003, 0., 1.88679248e-002, + 9.43396240e-003, 1.88679248e-002, 1.88679248e-002, 0., 0., 0., 0., + 0., 9.43396240e-003, 1.88679248e-002, 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 9.43396240e-003, 0., 0., 9.43396240e-003, 0., 0., + 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.88679248e-002, + 1.88679248e-002, 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.88679248e-002, 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 2.83018872e-002, 0., 0., 0., 3.77358496e-002, 0., 0., 0., 0., + 1.88679248e-002, 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., + 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 9.43396240e-003, 0., 9.43396240e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 9.43396240e-003, 0., + 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 9.43396240e-003, + 0., 1.88679248e-002, 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 9.43396240e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., + 0., 9.43396240e-003, 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, + 0., 0., 0., 0., 0., 9.43396240e-003, 9.43396240e-003, 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., + 9.43396240e-003, 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 1.88679248e-002, 0., 0., 0., 1.88679248e-002, 0., 0., 0., 0., 0., + 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 9.43396240e-003, + 9.43396240e-003, 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 1.72413792e-002, 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 0., + 0., 8.62068962e-003, 0., 0., 0., 0., 0., 1.72413792e-002, + 8.62068962e-003, 0., 0., 1.72413792e-002, 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, 8.62068962e-003, + 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., + 8.62068962e-003, 0., 8.62068962e-003, 0., 1.72413792e-002, + 8.62068962e-003, 0., 0., 0., 2.58620679e-002, 4.31034490e-002, 0., + 0., 0., 0., 0., 8.62068962e-003, 8.62068962e-003, 0., 0., 0., 0., + 0., 0., 0., 2.58620679e-002, 1.72413792e-002, 0., 0., 0., + 8.62068962e-003, 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 0., + 1.72413792e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 1.72413792e-002, 8.62068962e-003, 0., 0., 0., 0., + 0., 0., 8.62068962e-003, 0., 0., 1.72413792e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 4.31034490e-002, 0., 0., 1.72413792e-002, 2.58620679e-002, + 8.62068962e-003, 0., 0., 0., 2.58620679e-002, 8.62068962e-003, 0., + 8.62068962e-003, 0., 0., 0., 0., 1.72413792e-002, 8.62068962e-003, + 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.72413792e-002, 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 1.72413792e-002, 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.58620679e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 8.62068962e-003, 8.62068962e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.72413792e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 0., 0., 0., + 8.62068962e-003, 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 1.72413792e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, 0., 0., + 0., 0., 0., 0., 0., 8.62068962e-003, 0., 8.62068962e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, + 8.62068962e-003, 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, + 0., 0., 0., 8.06451589e-003, 8.06451589e-003, 8.06451589e-003, 0., + 0., 0., 0., 0., 0., 1.61290318e-002, 0., 8.06451589e-003, 0., 0., + 1.61290318e-002, 0., 0., 0., 8.06451589e-003, 0., 0., + 8.06451589e-003, 0., 0., 0., 3.22580636e-002, 0., 1.61290318e-002, + 0., 0., 8.06451589e-003, 8.06451589e-003, 0., 8.06451589e-003, 0., + 0., 0., 8.06451589e-003, 1.61290318e-002, 0., 0., 0., 0., 0., + 2.41935477e-002, 0., 0., 1.61290318e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 8.06451589e-003, 0., 8.06451589e-003, 0., 0., 0., + 1.61290318e-002, 8.06451589e-003, 1.61290318e-002, 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, + 8.06451589e-003, 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 8.06451589e-003, + 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.64516112e-002, 0., 8.06451589e-003, 0., 8.06451589e-003, + 8.06451589e-003, 0., 0., 0., 3.22580636e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 8.06451589e-003, 8.06451589e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 8.06451589e-003, + 8.06451589e-003, 0., 0., 0., 8.06451589e-003, 2.41935477e-002, 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.41935477e-002, 0., + 0., 0., 0., 0., 0., 0., 1.61290318e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., + 0., 0., 2.41935477e-002, 0., 0., 8.06451589e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., + 1.61290318e-002, 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.61290318e-002, 0., 0., + 8.06451589e-003, 0., 0., 8.06451589e-003, 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 8.06451589e-003, 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.06451589e-003, 0., 8.06451589e-003, 0., 0., + 8.06451589e-003, 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.61290318e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.06451589e-003, 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 1.61290318e-002, 0., 0., 8.06451589e-003, 8.06451589e-003, 0., 0., + 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, + 1.61290318e-002, 8.06451589e-003, 0., 8.06451589e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.06451589e-003, 0., 0., 8.06451589e-003, 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 8.06451589e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.06451589e-003, 8.06451589e-003, 0., 0., 0., + 8.06451589e-003, 0., 0., 0., 0., 8.06451589e-003, 8.06451589e-003, + 0., 6.71140943e-003, 1.34228189e-002, 6.71140943e-003, 0., 0., 0., + 0., 0., 0., 6.71140943e-003, 2.68456377e-002, 0., 0., 0., 0., 0., + 0., 6.71140943e-003, 6.71140943e-003, 6.71140943e-003, 0., + 1.34228189e-002, 1.34228189e-002, 1.34228189e-002, 0., 0., 0., 0., + 1.34228189e-002, 2.01342292e-002, 0., 6.71140943e-003, 0., + 2.01342292e-002, 0., 0., 0., 2.01342292e-002, 6.71140943e-003, + 6.71140943e-003, 6.71140943e-003, 0., 0., 6.71140943e-003, 0., 0., + 0., 6.71140943e-003, 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 2.01342292e-002, 0., 0., 0., 6.71140943e-003, 0., 0., + 2.68456377e-002, 1.34228189e-002, 0., 0., 0., 0., 6.71140943e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, + 0., 0., 0., 6.71140943e-003, 6.71140943e-003, 6.71140943e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.34228189e-002, 0., 0., + 0., 6.71140943e-003, 0., 6.71140943e-003, 0., 6.71140943e-003, + 6.71140943e-003, 0., 0., 0., 0., 1.34228189e-002, 0., 0., 0., + 1.34228189e-002, 2.01342292e-002, 0., 6.71140943e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.34228189e-002, 6.71140943e-003, 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.34228189e-002, 0., 0., 0., 0., 1.34228189e-002, 1.34228189e-002, + 0., 6.71140943e-003, 0., 1.34228189e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 6.71140943e-003, 0., 0., 0., 0., + 6.71140943e-003, 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 6.71140943e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.34228189e-002, 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.01342292e-002, 0., 0., 0., 0., 0., + 6.71140943e-003, 6.71140943e-003, 0., 0., 6.71140943e-003, + 6.71140943e-003, 0., 0., 6.71140943e-003, 6.71140943e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.34228189e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 6.71140943e-003, + 6.71140943e-003, 1.34228189e-002, 0., 0., 0., 6.71140943e-003, + 6.71140943e-003, 0., 0., 0., 0., 1.34228189e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., + 6.71140943e-003, 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.34228189e-002, 1.34228189e-002, 0., 0., + 0., 0., 0., 1.34228189e-002, 0., 0., 6.71140943e-003, 0., 0., 0., + 0., 0., 6.71140943e-003, 1.34228189e-002, 0., 6.71140943e-003, + 1.34228189e-002, 0., 0., 0., 0., 1.34228189e-002, 1.34228189e-002, + 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., + 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.34228189e-002, 0., 0., + 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., + 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., + 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 2.01342292e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 0., 0., 0., 0., + 6.71140943e-003, 0., 0., 0., 0., 0., 0., 6.71140943e-003, 0., 0., + 0., 0., 6.71140943e-003, 0., 0., 0., 1.03626940e-002, + 5.18134702e-003, 0., 0., 2.07253881e-002, 0., 0., 0., + 1.03626940e-002, 5.18134702e-003, 1.03626940e-002, + 1.03626940e-002, 0., 1.03626940e-002, 0., 0., 5.18134702e-003, 0., + 0., 0., 1.03626940e-002, 2.59067342e-002, 1.03626940e-002, + 5.18134702e-003, 5.18134702e-003, 5.18134702e-003, + 5.18134702e-003, 1.55440411e-002, 5.18134702e-003, 0., + 1.55440411e-002, 0., 5.18134702e-003, 1.03626940e-002, + 5.18134702e-003, 0., 0., 5.18134702e-003, 0., 0., 0., 0., + 1.03626940e-002, 0., 1.55440411e-002, 0., 1.03626940e-002, + 2.59067342e-002, 5.18134702e-003, 0., 5.18134702e-003, + 5.18134702e-003, 0., 0., 1.03626940e-002, 0., 5.18134702e-003, + 5.18134702e-003, 5.18134702e-003, 0., 0., 1.03626940e-002, + 5.18134702e-003, 0., 5.18134702e-003, 0., 5.18134702e-003, 0., 0., + 0., 0., 0., 1.55440411e-002, 5.18134702e-003, 1.03626940e-002, 0., + 0., 0., 5.18134702e-003, 0., 0., 0., 0., 5.18134702e-003, 0., 0., + 0., 0., 0., 5.18134702e-003, 0., 0., 1.55440411e-002, + 5.18134702e-003, 1.55440411e-002, 0., 0., 5.18134702e-003, + 1.03626940e-002, 1.03626940e-002, 0., 5.18134702e-003, 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 2.07253881e-002, + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, + 5.18134702e-003, 0., 0., 0., 0., 2.07253881e-002, 0., 0., + 5.18134702e-003, 5.69948182e-002, 5.18134702e-003, 0., + 5.18134702e-003, 0., 5.18134702e-003, 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 5.18134702e-003, 5.18134702e-003, 0., 0., + 5.18134702e-003, 0., 1.03626940e-002, 0., 0., 5.18134702e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 1.03626940e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 5.18134702e-003, 1.03626940e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.07253881e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.18134702e-003, 0., 0., 0., 0., 5.18134702e-003, 0., 0., + 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.03626940e-002, 0., 0., 1.03626940e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 2.07253881e-002, 0., 0., 0., 0., + 1.03626940e-002, 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 0., + 0., 1.03626940e-002, 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.03626940e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.18134702e-003, 5.18134702e-003, 0., 0., 0., + 0., 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 5.18134702e-003, 0., + 5.18134702e-003, 0., 0., 5.18134702e-003, 0., 0., 0., + 5.18134702e-003, 0., 0., 5.18134702e-003, 0., 0., 1.55440411e-002, + 5.18134702e-003, 0., 0., 0., 5.18134702e-003, 0., 0., 0., 0., 0., + 5.18134702e-003, 5.18134702e-003, 0., 0., 0., 0., 5.18134702e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.03626940e-002, 0., 0., + 0., 1.03626940e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 5.18134702e-003, 0., 5.18134702e-003, + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 5.18134702e-003, 0., 5.18134702e-003, 0., 0., 0., + 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 5.18134702e-003, 0., 0., 0., 0., 0., + 0., 1.91082805e-002, 3.18471342e-002, 1.27388537e-002, + 6.36942685e-003, 6.36942685e-003, 6.36942685e-003, 0., + 1.27388537e-002, 6.36942685e-003, 0., 6.36942685e-003, 0., + 6.36942685e-003, 6.36942685e-003, 6.36942685e-003, 0., 0., + 6.36942685e-003, 0., 0., 0., 6.36942685e-003, 6.36942685e-003, 0., + 6.36942685e-003, 0., 6.36942685e-003, 0., 1.27388537e-002, + 6.36942685e-003, 0., 6.36942685e-003, 6.36942685e-003, + 6.36942685e-003, 0., 0., 0., 6.36942685e-003, 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 6.36942685e-003, 6.36942685e-003, + 6.36942685e-003, 1.27388537e-002, 1.27388537e-002, 0., + 1.27388537e-002, 0., 0., 0., 6.36942685e-003, 0., 0., 0., + 1.27388537e-002, 0., 0., 1.27388537e-002, 0., 6.36942685e-003, + 6.36942685e-003, 0., 0., 1.27388537e-002, 1.27388537e-002, 0., + 6.36942685e-003, 0., 0., 1.27388537e-002, 6.36942685e-003, 0., + 6.36942685e-003, 0., 0., 0., 0., 6.36942685e-003, 6.36942685e-003, + 1.27388537e-002, 0., 0., 0., 0., 6.36942685e-003, 6.36942685e-003, + 0., 6.36942685e-003, 0., 0., 6.36942685e-003, 0., 0., 0., + 1.27388537e-002, 0., 0., 0., 0., 0., 0., 0., 0., 1.91082805e-002, + 1.27388537e-002, 0., 0., 0., 0., 0., 0., 0., 1.27388537e-002, + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 4.45859879e-002, 0., + 0., 0., 3.18471342e-002, 0., 0., 0., 0., 6.36942685e-003, + 6.36942685e-003, 0., 1.91082805e-002, 0., 6.36942685e-003, 0., 0., + 0., 0., 6.36942685e-003, 0., 0., 0., 6.36942685e-003, + 6.36942685e-003, 0., 6.36942685e-003, 0., 1.27388537e-002, + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, + 6.36942685e-003, 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 6.36942685e-003, 0., 0., 6.36942685e-003, 0., + 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.91082805e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 2.54777074e-002, 0., 0., 0., 0., 0., 6.36942685e-003, 0., + 0., 0., 0., 0., 6.36942685e-003, 0., 0., 6.36942685e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., 6.36942685e-003, 0., + 0., 6.36942685e-003, 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 1.91082805e-002, + 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., 6.36942685e-003, 0., + 0., 0., 0., 6.36942685e-003, 0., 0., 6.36942685e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., + 0., 0., 6.36942685e-003, 0., 0., 0., 0., 6.36942685e-003, 0., 0., + 6.36942685e-003, 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., 6.36942685e-003, 0., + 1.27388537e-002, 1.91082805e-002, 0., 6.36942685e-003, 0., 0., 0., + 1.27388537e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.36942685e-003, 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.36942685e-003, 0., 0., 0., + 0., 0., 6.36942685e-003, 0., 6.36942685e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.85185187e-002, + 1.23456791e-002, 0., 1.23456791e-002, 0., 1.23456791e-002, 0., + 6.17283955e-003, 1.23456791e-002, 0., 1.23456791e-002, + 6.17283955e-003, 6.17283955e-003, 1.23456791e-002, 0., 0., + 6.17283955e-003, 6.17283955e-003, 6.17283955e-003, 0., 0., + 6.17283955e-003, 1.85185187e-002, 6.17283955e-003, 0., + 6.17283955e-003, 0., 0., 1.23456791e-002, 0., 0., 6.17283955e-003, + 0., 6.17283955e-003, 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.17283955e-003, 0., 1.23456791e-002, 6.17283955e-003, + 6.17283955e-003, 0., 6.17283955e-003, 1.85185187e-002, 0., 0., + 6.17283955e-003, 3.08641978e-002, 0., 0., 6.17283955e-003, 0., + 1.23456791e-002, 0., 1.23456791e-002, 0., 0., 6.17283955e-003, 0., + 0., 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.17283955e-003, 0., 1.23456791e-002, 0., 0., 0., + 1.23456791e-002, 6.17283955e-003, 0., 0., 0., 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 1.23456791e-002, 0., 0., 0., 0., 0., + 0., 0., 6.17283955e-003, 0., 0., 0., 0., 6.17283955e-003, 0., 0., + 0., 0., 6.17283955e-003, 4.32098769e-002, 1.85185187e-002, 0., + 2.46913582e-002, 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., 0., + 0., 6.17283955e-003, 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 1.85185187e-002, 0., 6.17283955e-003, 6.17283955e-003, 0., + 1.23456791e-002, 6.17283955e-003, 0., 0., 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., + 0., 0., 0., 0., 0., 6.17283955e-003, 6.17283955e-003, 0., 0., 0., + 0., 0., 0., 6.17283955e-003, 0., 1.23456791e-002, 6.17283955e-003, + 0., 0., 0., 0., 1.23456791e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.85185187e-002, 0., 3.08641978e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.85185187e-002, 0., 0., + 0., 0., 0., 1.23456791e-002, 0., 0., 0., 0., 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.17283955e-003, 0., 1.85185187e-002, 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.85185187e-002, 0., 0., + 6.17283955e-003, 0., 6.17283955e-003, 6.17283955e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.23456791e-002, 0., + 6.17283955e-003, 0., 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.17283955e-003, + 0., 0., 0., 0., 1.23456791e-002, 0., 0., 0., 0., 0., 0., 0., + 6.17283955e-003, 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.23456791e-002, + 6.17283955e-003, 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.17283955e-003, 0., 0., 6.17283955e-003, 0., 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 0., 0., 0., 6.17283955e-003, + 6.17283955e-003, 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., + 6.17283955e-003, 0., 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.17283955e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.23456791e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.17283955e-003, 0., 0., 0., 0., 0., + 6.17283955e-003, 0., 0., 6.17283955e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.17283955e-003, 6.17283955e-003, 0., 0., 0., + 2.74725277e-002, 5.49450563e-003, 5.49450563e-003, 0., + 2.74725277e-002, 0., 0., 1.64835174e-002, 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 0., 1.09890113e-002, + 5.49450563e-003, 5.49450563e-003, 0., 1.64835174e-002, + 1.09890113e-002, 5.49450563e-003, 5.49450563e-003, 0., + 5.49450563e-003, 0., 1.64835174e-002, 5.49450563e-003, + 5.49450563e-003, 0., 0., 0., 1.64835174e-002, 0., 0., + 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., 5.49450563e-003, + 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., 0., + 1.64835174e-002, 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., 5.49450563e-003, + 0., 5.49450563e-003, 4.94505502e-002, 1.09890113e-002, + 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 1.09890113e-002, + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 2.19780225e-002, 0., 0., 5.49450563e-003, 1.09890113e-002, 0., 0., + 0., 0., 0., 0., 0., 5.49450563e-003, 0., 5.49450563e-003, 0., 0., + 0., 0., 5.49450563e-003, 1.09890113e-002, 0., 0., 5.49450563e-003, + 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 1.64835174e-002, + 0., 0., 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 0., 0., 0., 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 1.09890113e-002, 0., 0., 0., 0., + 0., 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., + 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 2.74725277e-002, 5.49450563e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 5.49450563e-003, 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 1.09890113e-002, + 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., + 5.49450563e-003, 0., 5.49450563e-003, 5.49450563e-003, 0., 0., + 5.49450563e-003, 0., 0., 0., 1.09890113e-002, 5.49450563e-003, 0., + 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 1.09890113e-002, 0., 0., 1.09890113e-002, + 0., 1.09890113e-002, 0., 1.09890113e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., + 3.29670347e-002, 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, + 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., 5.49450563e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., 0., 0., + 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 5.49450563e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 5.49450563e-003, 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 1.09890113e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.09890113e-002, 5.49450563e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., + 9.09090880e-003, 9.09090880e-003, 0., 0., 0., 0., 9.09090880e-003, + 0., 0., 0., 0., 2.72727273e-002, 9.09090880e-003, 0., 0., + 2.72727273e-002, 0., 1.81818176e-002, 9.09090880e-003, 0., + 1.81818176e-002, 0., 0., 0., 1.81818176e-002, 0., 0., + 1.81818176e-002, 0., 0., 0., 9.09090880e-003, 0., 0., 0., + 9.09090880e-003, 1.81818176e-002, 9.09090880e-003, 0., 0., 0., + 9.09090880e-003, 0., 9.09090880e-003, 9.09090880e-003, + 1.81818176e-002, 9.09090880e-003, 0., 0., 9.09090880e-003, 0., 0., + 0., 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., + 9.09090880e-003, 9.09090880e-003, 9.09090880e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 9.09090880e-003, 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 9.09090880e-003, 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 3.63636352e-002, 0., 2.72727273e-002, 9.09090880e-003, 0., 0., 0., + 0., 9.09090880e-003, 0., 0., 0., 5.45454547e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 1.81818176e-002, 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., + 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 1.81818176e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.09090880e-003, 0., 9.09090880e-003, 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., + 2.72727273e-002, 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., 1.81818176e-002, + 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., + 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.09090880e-003, 0., 1.81818176e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, + 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.09090880e-003, 0., 0., 1.81818176e-002, 0., 0., + 0., 0., 9.09090880e-003, 0., 0., 0., 0., 9.09090880e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.09090880e-003, 0., 9.09090880e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 9.17431153e-003, 9.17431153e-003, 0., 0., + 0., 0., 0., 9.17431153e-003, 0., 9.17431153e-003, 9.17431153e-003, + 9.17431153e-003, 1.83486231e-002, 1.83486231e-002, 0., 0., + 9.17431153e-003, 0., 0., 0., 0., 9.17431153e-003, 9.17431153e-003, + 0., 9.17431153e-003, 3.66972461e-002, 0., 9.17431153e-003, + 9.17431153e-003, 9.17431153e-003, 9.17431153e-003, + 9.17431153e-003, 0., 0., 0., 0., 0., 9.17431153e-003, + 2.75229346e-002, 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, 0., + 0., 0., 9.17431153e-003, 0., 0., 0., 1.83486231e-002, 0., 0., 0., + 0., 0., 0., 1.83486231e-002, 0., 2.75229346e-002, 0., 0., 0., 0., + 0., 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 9.17431153e-003, 0., 0., 0., 9.17431153e-003, 0., 0., 0., 0., 0., + 0., 9.17431153e-003, 0., 0., 0., 0., 2.75229346e-002, + 9.17431153e-003, 0., 0., 0., 0., 9.17431153e-003, 0., 0., + 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.17431153e-003, 0., 0., 1.83486231e-002, 1.83486231e-002, 0., 0., + 0., 0., 9.17431153e-003, 0., 0., 0., 9.17431153e-003, + 9.17431153e-003, 0., 0., 9.17431153e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 9.17431153e-003, 1.83486231e-002, 0., 0., 0., 0., 0., + 9.17431153e-003, 0., 0., 0., 0., 9.17431153e-003, 0., 0., 0., 0., + 9.17431153e-003, 0., 9.17431153e-003, 0., 0., 9.17431153e-003, 0., + 1.83486231e-002, 0., 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.17431153e-003, 9.17431153e-003, 0., 0., 0., 0., 0., + 1.83486231e-002, 0., 0., 1.83486231e-002, 9.17431153e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.17431153e-003, 0., 0., 0., 0., 0., + 9.17431153e-003, 0., 0., 0., 1.83486231e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 1.83486231e-002, 9.17431153e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 1.83486231e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, + 0., 0., 0., 0., 0., 0., 9.17431153e-003, 9.17431153e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, 0., 0., 0., + 0., 0., 0., 9.17431153e-003, 9.17431153e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.83486231e-002, 0., 0., + 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, + 0., 0., 0., 0., 0., 9.17431153e-003, 0., 9.17431153e-003, 0., 0., + 9.17431153e-003, 0., 0., 1.83486231e-002, 0., 0., 9.17431153e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.17431153e-003, 0., 0., 0., 0., 0., 0., 0., 0., 9.17431153e-003, + 0., 0., 0., 9.17431153e-003, 9.17431153e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.81250000e-003, 0., 0., 2.34375000e-002, 0., 0., + 7.81250000e-003, 7.81250000e-003, 7.81250000e-003, 0., 0., + 7.81250000e-003, 1.56250000e-002, 0., 0., 7.81250000e-003, 0., + 7.81250000e-003, 7.81250000e-003, 0., 2.34375000e-002, 0., 0., 0., + 2.34375000e-002, 0., 2.34375000e-002, 1.56250000e-002, + 1.56250000e-002, 0., 0., 0., 1.56250000e-002, 7.81250000e-003, 0., + 0., 3.12500000e-002, 7.81250000e-003, 0., 0., 0., 2.34375000e-002, + 0., 0., 0., 7.81250000e-003, 0., 0., 0., 7.81250000e-003, 0., 0., + 0., 3.90625000e-002, 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, + 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 7.81250000e-003, + 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 1.56250000e-002, 0., 0., 0., 1.56250000e-002, + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 0., + 0., 0., 5.46875000e-002, 0., 0., 0., 0., 7.81250000e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.81250000e-003, 7.81250000e-003, 0., 0., + 7.81250000e-003, 0., 7.81250000e-003, 0., 2.34375000e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.81250000e-003, 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 1.56250000e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.81250000e-003, 7.81250000e-003, 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.56250000e-002, 0., 0., 0., 0., 1.56250000e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.56250000e-002, 7.81250000e-003, 0., 0., + 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.56250000e-002, 0., 0., 0., 0., 0., 7.81250000e-003, 0., + 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., 0., + 3.12500000e-002, 0., 0., 0., 1.56250000e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.81250000e-003, 0., 1.56250000e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.81250000e-003, 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.81250000e-003, 0., 0., 1.56250000e-002, 0., 0., 0., + 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 7.81250000e-003, 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., + 6.75675692e-003, 1.35135138e-002, 6.75675692e-003, 0., + 6.75675692e-003, 1.35135138e-002, 0., 0., 1.35135138e-002, 0., 0., + 0., 0., 2.70270277e-002, 0., 6.75675692e-003, 6.75675692e-003, + 2.02702712e-002, 0., 1.35135138e-002, 0., 6.75675692e-003, + 6.75675692e-003, 0., 0., 0., 2.02702712e-002, 0., 6.75675692e-003, + 3.37837860e-002, 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., + 2.02702712e-002, 6.75675692e-003, 0., 0., 0., 0., 0., 0., + 1.35135138e-002, 0., 1.35135138e-002, 0., 6.75675692e-003, 0., + 1.35135138e-002, 0., 0., 1.35135138e-002, 0., 0., 1.35135138e-002, + 0., 0., 0., 6.75675692e-003, 0., 6.75675692e-003, 6.75675692e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., + 0., 0., 6.75675692e-003, 6.75675692e-003, 0., 0., 6.75675692e-003, + 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., 2.02702712e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., + 0., 0., 1.35135138e-002, 1.35135138e-002, 0., 0., 0., + 6.75675692e-003, 6.75675692e-003, 6.75675692e-003, 0., 0., + 6.75675692e-003, 0., 6.75675692e-003, 0., 0., 0., 0., 0., 0., + 4.05405425e-002, 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 1.35135138e-002, 6.75675692e-003, 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.35135138e-002, 0., 0., + 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 6.75675692e-003, 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 0., 2.02702712e-002, 0., 0., 0., 0., + 0., 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 1.35135138e-002, 0., 0., 6.75675692e-003, 0., 6.75675692e-003, + 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.35135138e-002, 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.75675692e-003, 0., 6.75675692e-003, 0., + 6.75675692e-003, 2.70270277e-002, 0., 6.75675692e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, + 6.75675692e-003, 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., + 2.02702712e-002, 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., + 0., 6.75675692e-003, 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., + 0., 6.75675692e-003, 0., 2.02702712e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., 6.75675692e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., + 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.70270277e-002, 0., + 6.75675692e-003, 0., 6.75675692e-003, 0., 0., 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., + 6.75675692e-003, 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.75675692e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.35135138e-002, 0., 0., 0., 0., 0., 0., 0., 6.75675692e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.66666675e-002, + 8.33333377e-003, 0., 0., 8.33333377e-003, 0., 0., 0., + 3.33333351e-002, 1.66666675e-002, 0., 0., 8.33333377e-003, 0., + 8.33333377e-003, 0., 0., 8.33333377e-003, 0., 8.33333377e-003, + 8.33333377e-003, 0., 2.50000022e-002, 0., 0., 0., 3.33333351e-002, + 0., 1.66666675e-002, 1.66666675e-002, 0., 2.50000022e-002, 0., + 8.33333377e-003, 8.33333377e-003, 0., 0., 0., 1.66666675e-002, + 8.33333377e-003, 0., 0., 0., 0., 8.33333377e-003, 0., 0., + 1.66666675e-002, 1.66666675e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., + 0., 1.66666675e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.33333377e-003, 0., 0., 0., 8.33333377e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 1.66666675e-002, 0., 0., 0., 2.50000022e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., + 1.66666675e-002, 0., 0., 0., 8.33333377e-003, 8.33333377e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 3.33333351e-002, 0., 0., 0., + 8.33333377e-003, 0., 8.33333377e-003, 8.33333377e-003, 0., + 1.66666675e-002, 8.33333377e-003, 0., 1.66666675e-002, 0., 0., + 8.33333377e-003, 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., + 1.66666675e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.33333377e-003, 2.50000022e-002, 0., 0., 0., 1.66666675e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., + 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., + 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., + 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., 8.33333377e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, + 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 8.33333377e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 1.66666675e-002, 1.66666675e-002, + 1.66666675e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.66666675e-002, 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, + 8.33333377e-003, 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., + 1.66666675e-002, 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.66666675e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 8.33333377e-003, 8.33333377e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 2.45398767e-002, 1.22699384e-002, 0., + 6.13496918e-003, 3.06748450e-002, 6.13496918e-003, 0., 0., + 1.22699384e-002, 1.22699384e-002, 6.13496918e-003, + 6.13496918e-003, 1.22699384e-002, 0., 0., 6.13496918e-003, 0., + 2.45398767e-002, 6.13496918e-003, 0., 1.22699384e-002, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 0., 6.13496918e-003, 6.13496918e-003, 6.13496918e-003, 0., 0., + 1.84049085e-002, 1.22699384e-002, 0., 0., 0., 0., 0., + 1.22699384e-002, 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., + 0., 6.13496918e-003, 6.13496918e-003, 1.22699384e-002, 0., + 1.22699384e-002, 0., 6.13496918e-003, 0., 0., 1.22699384e-002, + 1.84049085e-002, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, + 1.22699384e-002, 0., 0., 1.22699384e-002, 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 6.13496918e-003, + 0., 0., 0., 1.84049085e-002, 0., 0., 0., 0., 1.84049085e-002, 0., + 0., 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 1.22699384e-002, + 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 1.22699384e-002, 1.22699384e-002, 0., 6.13496918e-003, 0., 0., + 1.84049085e-002, 0., 0., 0., 0., 0., 0., 1.84049085e-002, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 1.84049085e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.13496918e-003, 6.13496918e-003, 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 0., 0., 0., 0., 0., 1.22699384e-002, 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 6.13496918e-003, 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 0., 0., 0., 1.22699384e-002, 0., 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.22699384e-002, 6.13496918e-003, 1.84049085e-002, 0., 0., 0., 0., + 1.22699384e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.84049085e-002, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 1.22699384e-002, 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 2.45398767e-002, 6.13496918e-003, 6.13496918e-003, 0., 0., + 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 0., 0., 1.84049085e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 2.45398767e-002, + 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, + 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.22699384e-002, 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.18343197e-002, 5.91715984e-003, + 5.91715984e-003, 0., 0., 2.95857992e-002, 0., 0., 0., 0., 0., 0., + 1.18343197e-002, 1.77514795e-002, 5.91715984e-003, 0., 0., + 1.18343197e-002, 0., 0., 0., 0., 5.91715984e-003, 1.18343197e-002, + 0., 0., 1.18343197e-002, 5.91715984e-003, 5.91715984e-003, 0., 0., + 1.77514795e-002, 0., 1.18343197e-002, 0., 0., 0., 0., + 1.18343197e-002, 1.77514795e-002, 5.91715984e-003, 0., 0., 0., 0., + 1.18343197e-002, 0., 1.18343197e-002, 1.77514795e-002, + 5.91715984e-003, 0., 5.91715984e-003, 0., 0., 5.91715984e-003, 0., + 0., 1.18343197e-002, 0., 0., 0., 0., 0., 5.91715984e-003, + 5.91715984e-003, 1.18343197e-002, 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 1.18343197e-002, 0., 0., 1.18343197e-002, + 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 0., 1.18343197e-002, 0., 0., + 0., 0., 0., 0., 1.18343197e-002, 0., 0., 0., 0., 1.18343197e-002, + 5.91715984e-003, 1.77514795e-002, 5.91715984e-003, 0., + 5.91715984e-003, 0., 0., 0., 0., 1.18343197e-002, 5.91715984e-003, + 0., 5.91715984e-003, 3.55029590e-002, 0., 0., 1.18343197e-002, 0., + 1.18343197e-002, 0., 0., 1.18343197e-002, 0., 0., 0., 0., 0., 0., + 1.77514795e-002, 0., 0., 5.91715984e-003, 5.91715984e-003, + 5.91715984e-003, 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 2.36686394e-002, 0., + 1.18343197e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.18343197e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.91715984e-003, 0., 5.91715984e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, + 5.91715984e-003, 0., 1.18343197e-002, 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 5.91715984e-003, 1.18343197e-002, 0., 0., 0., 0., 1.18343197e-002, + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., + 5.91715984e-003, 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., + 0., 5.91715984e-003, 1.77514795e-002, 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.18343197e-002, 0., 0., 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 0., 0., 0., 0., 0., + 1.18343197e-002, 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., + 1.77514795e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 1.77514795e-002, 0., 0., 0., 0., 0., + 1.18343197e-002, 0., 1.18343197e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, + 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.91715984e-003, 0., 5.91715984e-003, 5.91715984e-003, 0., 0., + 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 5.91715984e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.92307699e-002, + 6.41025649e-003, 1.28205130e-002, 1.28205130e-002, 0., + 6.41025649e-003, 0., 0., 6.41025649e-003, 3.20512839e-002, 0., 0., + 1.28205130e-002, 6.41025649e-003, 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 1.28205130e-002, + 0., 0., 6.41025649e-003, 0., 0., 1.92307699e-002, 2.56410260e-002, + 6.41025649e-003, 6.41025649e-003, 6.41025649e-003, + 6.41025649e-003, 0., 0., 0., 0., 1.92307699e-002, 2.56410260e-002, + 6.41025649e-003, 6.41025649e-003, 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 6.41025649e-003, 3.20512839e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., + 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 6.41025649e-003, 0., 0., 1.92307699e-002, + 0., 0., 0., 6.41025649e-003, 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 6.41025649e-003, 6.41025649e-003, 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, + 1.28205130e-002, 6.41025649e-003, 6.41025649e-003, + 1.28205130e-002, 0., 0., 0., 0., 1.92307699e-002, 0., 0., 0., + 1.92307699e-002, 6.41025649e-003, 0., 6.41025649e-003, 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 6.41025649e-003, 0., 6.41025649e-003, + 0., 1.92307699e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 1.92307699e-002, 0., 0., + 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 0., + 0., 0., 0., 0., 6.41025649e-003, 0., 0., 6.41025649e-003, 0., 0., + 0., 0., 1.28205130e-002, 6.41025649e-003, 0., 0., 0., 0., 0., 0., + 0., 1.28205130e-002, 6.41025649e-003, 6.41025649e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.28205130e-002, 0., 0., 0., 0., + 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.41025649e-003, 6.41025649e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.28205130e-002, 1.92307699e-002, 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 3.20512839e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.41025649e-003, 0., 6.41025649e-003, 0., 6.41025649e-003, + 0., 0., 6.41025649e-003, 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 6.41025649e-003, 0., 0., + 1.28205130e-002, 0., 0., 0., 0., 0., 0., 0., 1.92307699e-002, + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.28205130e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., + 0., 0., 1.92307699e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.41025649e-003, 0., 0., 0., 0., 6.41025649e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.41025649e-003, 0., + 0., 0., 0., 0., 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.41025649e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.01010101e-002, 1.01010101e-002, 5.05050505e-003, 0., 0., + 1.01010101e-002, 1.01010101e-002, 0., 1.51515156e-002, + 1.01010101e-002, 1.01010101e-002, 5.05050505e-003, + 5.05050505e-003, 1.01010101e-002, 3.03030312e-002, + 5.05050505e-003, 0., 5.05050505e-003, 5.05050505e-003, 0., + 1.01010101e-002, 5.05050505e-003, 1.01010101e-002, 0., 0., + 5.05050505e-003, 0., 1.01010101e-002, 5.05050505e-003, 0., + 1.01010101e-002, 0., 0., 5.05050505e-003, 0., 1.51515156e-002, + 5.05050505e-003, 0., 0., 0., 0., 0., 1.51515156e-002, 0., 0., + 3.03030312e-002, 5.05050505e-003, 0., 5.05050505e-003, 0., + 1.01010101e-002, 1.01010101e-002, 5.05050505e-003, 0., + 5.05050505e-003, 5.05050505e-003, 5.05050505e-003, 0., 0., + 5.05050505e-003, 5.05050505e-003, 1.01010101e-002, 0., 0., 0., + 5.05050505e-003, 1.01010101e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 1.01010101e-002, 5.05050505e-003, 0., 0., + 1.01010101e-002, 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., + 1.01010101e-002, 0., 5.05050505e-003, 0., 1.01010101e-002, + 5.05050505e-003, 0., 0., 5.05050505e-003, 0., 4.54545468e-002, 0., + 5.05050505e-003, 0., 4.04040404e-002, 0., 0., 5.05050505e-003, 0., + 0., 0., 0., 2.52525248e-002, 0., 0., 0., 0., 5.05050505e-003, + 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.01010101e-002, 0., + 1.01010101e-002, 5.05050505e-003, 0., 1.01010101e-002, 0., 0., 0., + 1.01010101e-002, 1.01010101e-002, 0., 0., 0., 0., 0., 0., + 1.01010101e-002, 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 0., 0., 1.01010101e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.01010101e-002, + 0., 0., 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., + 2.52525248e-002, 0., 0., 5.05050505e-003, 1.01010101e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, + 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 2.02020202e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 1.01010101e-002, 0., 0., 5.05050505e-003, + 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.05050505e-003, 0., 0., 0., 0., 0., 5.05050505e-003, 0., + 1.51515156e-002, 0., 0., 0., 0., 0., 0., 5.05050505e-003, + 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., 5.05050505e-003, + 5.05050505e-003, 0., 1.01010101e-002, 0., 0., 1.01010101e-002, 0., + 0., 0., 1.01010101e-002, 1.01010101e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.05050505e-003, 0., 0., 5.05050505e-003, 0., + 5.05050505e-003, 0., 0., 1.01010101e-002, 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.05050505e-003, 0., 0., 0., 0., 1.01010101e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.02020202e-002, 0., 0., + 0., 0., 5.05050505e-003, 0., 0., 5.05050505e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., + 0., 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 5.49450563e-003, 5.49450563e-003, + 1.09890113e-002, 0., 0., 0., 5.49450563e-003, 1.09890113e-002, + 5.49450563e-003, 0., 5.49450563e-003, 0., 1.09890113e-002, + 5.49450563e-003, 5.49450563e-003, 5.49450563e-003, + 2.74725277e-002, 0., 5.49450563e-003, 0., 0., 1.09890113e-002, 0., + 1.09890113e-002, 5.49450563e-003, 5.49450563e-003, 0., + 1.64835174e-002, 0., 5.49450563e-003, 1.09890113e-002, 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 1.09890113e-002, 0., 0., + 1.64835174e-002, 0., 0., 5.49450563e-003, 5.49450563e-003, + 1.64835174e-002, 3.29670347e-002, 0., 0., 5.49450563e-003, 0., 0., + 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., + 1.09890113e-002, 5.49450563e-003, 1.64835174e-002, + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.09890113e-002, 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, + 5.49450563e-003, 0., 5.49450563e-003, 5.49450563e-003, + 5.49450563e-003, 0., 0., 1.09890113e-002, 0., 0., 0., 0., + 5.49450563e-003, 5.49450563e-003, 0., 1.09890113e-002, 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 5.49450563e-003, 0., 5.49450563e-003, + 1.09890113e-002, 0., 0., 0., 2.19780225e-002, 5.49450563e-003, 0., + 0., 2.74725277e-002, 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.09890113e-002, 0., 0., 5.49450563e-003, 0., 0., 0., + 1.09890113e-002, 5.49450563e-003, 5.49450563e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.09890113e-002, 5.49450563e-003, 0., + 5.49450563e-003, 0., 2.19780225e-002, 0., 0., 0., 1.09890113e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 0., 5.49450563e-003, 0., 5.49450563e-003, + 5.49450563e-003, 0., 1.09890113e-002, 0., 0., 0., 5.49450563e-003, + 0., 0., 0., 0., 0., 0., 0., 1.09890113e-002, 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.09890113e-002, 0., 0., 0., 0., 0., 5.49450563e-003, 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.49450563e-003, 5.49450563e-003, 5.49450563e-003, + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.09890113e-002, 0., 0., 1.09890113e-002, 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 5.49450563e-003, 0., 0., 0., + 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.49450563e-003, 1.09890113e-002, 5.49450563e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 3.29670347e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.09890113e-002, + 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 5.49450563e-003, 0., 1.64835174e-002, 0., + 0., 0., 0., 1.09890113e-002, 0., 0., 0., 5.49450563e-003, 0., 0., + 0., 0., 0., 0., 5.49450563e-003, 0., 0., 0., 2.74725277e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.09890113e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.49450563e-003, 0., 0., 1.09890113e-002, 0., 0., + 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 5.49450563e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.49450563e-003, 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 1.09890113e-002, 0., 0., 0., 0., 5.49450563e-003, 0., 0., + 5.20833349e-003, 5.20833349e-003, 0., 0., 5.20833349e-003, 0., 0., + 0., 0., 1.04166670e-002, 0., 5.20833349e-003, 1.04166670e-002, 0., + 5.20833349e-003, 0., 5.20833349e-003, 3.12500000e-002, 0., 0., 0., + 5.20833349e-003, 5.20833349e-003, 1.04166670e-002, + 1.04166670e-002, 5.20833349e-003, 5.20833349e-003, + 5.20833349e-003, 1.04166670e-002, 2.08333340e-002, + 1.04166670e-002, 1.04166670e-002, 0., 0., 5.20833349e-003, 0., 0., + 0., 0., 2.60416679e-002, 0., 0., 0., 5.20833349e-003, + 5.20833349e-003, 1.56250000e-002, 0., 1.56250000e-002, + 1.56250000e-002, 5.20833349e-003, 5.20833349e-003, + 5.20833349e-003, 0., 0., 0., 5.20833349e-003, 0., 0., + 5.20833349e-003, 0., 0., 0., 1.56250000e-002, 0., 0., + 1.04166670e-002, 0., 5.20833349e-003, 5.20833349e-003, 0., 0., 0., + 0., 0., 0., 1.04166670e-002, 0., 0., 0., 5.20833349e-003, 0., 0., + 0., 0., 5.20833349e-003, 5.20833349e-003, 0., 0., 0., 0., 0., 0., + 5.20833349e-003, 0., 0., 2.08333340e-002, 0., 0., 0., + 5.20833349e-003, 5.20833349e-003, 5.20833349e-003, + 5.20833349e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.20833349e-003, 0., 0., 0., 0., 0., 0., 5.20833349e-003, + 5.20833349e-003, 0., 5.20833349e-003, 0., 0., 1.56250000e-002, 0., + 5.20833349e-003, 5.20833349e-003, 1.56250000e-002, + 5.20833349e-003, 0., 0., 0., 5.20833349e-003, 0., 0., + 5.20833349e-003, 0., 0., 0., 0., 5.20833349e-003, 0., + 5.20833349e-003, 5.20833349e-003, 0., 5.20833349e-003, 0., + 5.20833349e-003, 0., 0., 0., 5.20833349e-003, 0., 0., + 5.20833349e-003, 0., 0., 0., 0., 0., 0., 5.20833349e-003, + 4.16666679e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.20833349e-003, 0., 0., 0., + 0., 1.56250000e-002, 0., 0., 0., 0., 1.04166670e-002, 0., + 5.20833349e-003, 0., 0., 5.20833349e-003, 0., 0., 0., 0., 0., + 5.20833349e-003, 0., 0., 0., 0., 0., 0., 5.20833349e-003, 0., 0., + 0., 0., 0., 0., 0., 5.20833349e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.20833349e-003, 0., 0., 0., 0., 0., 5.20833349e-003, + 0., 0., 0., 0., 0., 0., 0., 5.20833349e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.20833349e-003, 0., 0., 0., 0., + 5.20833349e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.20833349e-003, 0., 0., 0., 5.20833349e-003, + 0., 1.04166670e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.20833349e-003, 0., 0., 0., 0., 3.64583358e-002, 5.20833349e-003, + 0., 0., 0., 1.04166670e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.04166670e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.56250000e-002, 0., 5.20833349e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.20833349e-003, 0., 5.20833349e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.04166670e-002, 0., 5.20833349e-003, + 0., 0., 5.20833349e-003, 0., 0., 0., 5.20833349e-003, 0., 0., 0., + 0., 5.20833349e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.20833349e-003, 0., 0., 0., 5.20833349e-003, 0., 0., 0., + 0., 5.20833349e-003, 5.20833349e-003, 0., 5.20833349e-003, 0., 0., + 0., 5.20833349e-003, 0., 0., 1.04166670e-002, 0., 0., 0., 0., 0., + 0., 0., 5.20833349e-003, 0., 0., 0., 5.20833349e-003, 0., 0., 0., + 5.20833349e-003, 0., 1.04166670e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.20833349e-003, + 1.04166670e-002, 5.20833349e-003, 1.04166670e-002, 0., 0., + 5.20833349e-003, 0., 0., 0., 2.08333340e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.20833349e-003, + 0., 0., 5.20833349e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.20833349e-003, 0., 0., 0., 1.04166670e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.20833349e-003, 0., 0., 5.20833349e-003, 0., 5.20833349e-003, + 5.20833349e-003, 0., 0., 0., 0., 0., 5.20833349e-003, + 1.04166670e-002, 0., 0., 0., 0., 0., 0., 5.20833349e-003, 0., 0., + 0., 0., 0., 5.20833349e-003, 0., 1.08108111e-002, 5.40540554e-003, + 1.62162166e-002, 0., 0., 0., 0., 0., 1.08108111e-002, + 5.40540554e-003, 0., 0., 5.40540554e-003, 5.40540554e-003, 0., 0., + 5.40540554e-003, 5.40540554e-003, 5.40540554e-003, 0., + 1.08108111e-002, 1.08108111e-002, 1.08108111e-002, + 5.40540554e-003, 0., 0., 5.40540554e-003, 5.40540554e-003, + 5.40540554e-003, 0., 5.40540554e-003, 1.62162166e-002, 0., 0., + 1.08108111e-002, 0., 0., 0., 1.08108111e-002, 5.40540554e-003, + 5.40540554e-003, 0., 5.40540554e-003, 0., 0., 5.40540554e-003, 0., + 1.62162166e-002, 1.62162166e-002, 0., 0., 0., 0., 0., + 5.40540554e-003, 1.62162166e-002, 5.40540554e-003, 0., 0., 0., 0., + 0., 1.08108111e-002, 5.40540554e-003, 0., 1.08108111e-002, 0., + 5.40540554e-003, 5.40540554e-003, 0., 0., 0., 0., 0., + 5.40540554e-003, 1.62162166e-002, 5.40540554e-003, 0., 0., 0., 0., + 0., 0., 0., 1.08108111e-002, 5.40540554e-003, 0., 0., 0., 0., 0., + 0., 1.08108111e-002, 0., 5.40540554e-003, 0., 0., 0., 0., + 2.16216221e-002, 5.40540554e-003, 0., 0., 5.40540554e-003, 0., 0., + 0., 0., 0., 0., 0., 5.40540554e-003, 5.40540554e-003, + 1.62162166e-002, 5.40540554e-003, 0., 0., 5.40540554e-003, + 1.08108111e-002, 0., 1.62162166e-002, 1.62162166e-002, 0., 0., 0., + 0., 1.08108111e-002, 5.40540554e-003, 0., 1.08108111e-002, 0., + 5.40540554e-003, 0., 1.08108111e-002, 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 5.40540554e-003, 0., 0., 1.08108111e-002, + 5.40540554e-003, 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., + 1.62162166e-002, 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., + 0., 4.32432443e-002, 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.40540554e-003, 0., 0., 5.40540554e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., + 5.40540554e-003, 0., 1.08108111e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 5.40540554e-003, 0., + 5.40540554e-003, 0., 0., 0., 0., 5.40540554e-003, 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 2.16216221e-002, 5.40540554e-003, 0., 0., 0., 0., + 1.08108111e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, + 0., 0., 0., 5.40540554e-003, 1.08108111e-002, 5.40540554e-003, + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.16216221e-002, 0., + 5.40540554e-003, 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 1.62162166e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.08108111e-002, 0., 1.08108111e-002, + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.40540554e-003, 5.40540554e-003, 0., 0., 0., 5.40540554e-003, + 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., 0., 0., + 0., 5.40540554e-003, 0., 0., 5.40540554e-003, 5.40540554e-003, + 5.40540554e-003, 0., 0., 5.40540554e-003, 0., 0., 1.08108111e-002, + 0., 0., 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.08108111e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.40540554e-003, 0., 0., 0., 5.40540554e-003, 0., 0., + 5.40540554e-003, 0., 0., 0., 0., 0., 0., 0., 5.40540554e-003, 0., + 0., 1.62162166e-002, 0., 5.40540554e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 6.89655170e-003, 0., 6.89655170e-003, 0., 0., + 6.89655170e-003, 2.06896551e-002, 6.89655170e-003, 0., + 6.89655170e-003, 6.89655170e-003, 0., 0., 6.89655170e-003, 0., + 2.75862068e-002, 6.89655170e-003, 1.37931034e-002, 0., 0., + 1.37931034e-002, 0., 6.89655170e-003, 2.06896551e-002, + 6.89655170e-003, 0., 1.37931034e-002, 6.89655170e-003, 0., + 6.89655170e-003, 0., 0., 0., 0., 0., 6.89655170e-003, + 6.89655170e-003, 2.06896551e-002, 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 1.37931034e-002, 0., 0., 0., 0., 0., + 1.37931034e-002, 6.89655170e-003, 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 1.37931034e-002, 0., 0., 0., 0., + 1.37931034e-002, 0., 0., 0., 0., 1.37931034e-002, 0., 0., 0., 0., + 0., 0., 6.89655170e-003, 0., 0., 0., 6.89655170e-003, 0., 0., 0., + 1.37931034e-002, 0., 0., 0., 0., 0., 6.89655170e-003, 0., 0., + 6.89655170e-003, 6.89655170e-003, 1.37931034e-002, 0., 0., + 1.37931034e-002, 0., 0., 0., 0., 0., 0., 6.89655170e-003, 0., 0., + 0., 0., 6.89655170e-003, 0., 6.89655170e-003, 6.89655170e-003, + 6.89655170e-003, 0., 0., 0., 6.89655170e-003, 0., 0., 0., + 6.89655170e-003, 0., 2.75862068e-002, 6.89655170e-003, 0., + 1.37931034e-002, 0., 1.37931034e-002, 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 0., 6.89655170e-003, 0., 0., 0., + 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 6.89655170e-003, 0., 0., 0., 6.89655170e-003, + 2.75862068e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 6.89655170e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.89655170e-003, + 6.89655170e-003, 0., 0., 0., 0., 0., 6.89655170e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.37931034e-002, 0., 0., 0., + 0., 0., 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.89655170e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.89655170e-003, 6.89655170e-003, 0., + 0., 0., 2.06896551e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.89655170e-003, + 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.89655170e-003, 0., 0., 0., 0., 0., 1.37931034e-002, 0., + 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 6.89655170e-003, 0., + 6.89655170e-003, 2.06896551e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 0., 0., 6.89655170e-003, 0., 0., 0., + 1.37931034e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.89655170e-003, 0., 0., 0., 0., 0., + 1.37931034e-002, 0., 0., 0., 0., 2.06896551e-002, 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 0., 0., 0., 0., 6.89655170e-003, 0., 0., + 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 6.89655170e-003, 1.37931034e-002, 0., 0., 0., + 6.89655170e-003, 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., 2.06896551e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.37931034e-002, 0., + 0., 0., 6.89655170e-003, 0., 6.89655170e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.89655170e-003, 0., 6.89655170e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.89655170e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.89655170e-003, 0., 0., 0., 6.89655170e-003, 0., 0., 0., + 0., 0., 0., 0., 6.89655170e-003, 0., 0., 1.22699384e-002, 0., 0., + 0., 0., 6.13496918e-003, 0., 0., 0., 1.22699384e-002, + 1.84049085e-002, 6.13496918e-003, 3.06748450e-002, 0., 0., + 1.22699384e-002, 0., 2.45398767e-002, 6.13496918e-003, 0., 0., + 6.13496918e-003, 1.22699384e-002, 0., 1.22699384e-002, + 6.13496918e-003, 0., 0., 1.22699384e-002, 6.13496918e-003, 0., + 6.13496918e-003, 0., 1.22699384e-002, 1.22699384e-002, + 1.22699384e-002, 0., 0., 6.13496918e-003, 1.22699384e-002, 0., 0., + 0., 0., 0., 3.06748450e-002, 0., 1.22699384e-002, 1.22699384e-002, + 1.22699384e-002, 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 6.13496918e-003, 0., 0., 0., 1.22699384e-002, + 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 6.13496918e-003, 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, + 0., 6.13496918e-003, 0., 0., 6.13496918e-003, 0., 0., 0., + 1.22699384e-002, 1.22699384e-002, 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 6.13496918e-003, 0., 1.22699384e-002, 6.13496918e-003, + 0., 0., 0., 0., 1.84049085e-002, 0., 6.13496918e-003, 0., + 4.29447852e-002, 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., + 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, + 6.13496918e-003, 0., 0., 0., 0., 1.22699384e-002, 0., + 6.13496918e-003, 0., 1.22699384e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., 0., 0., + 0., 1.22699384e-002, 0., 0., 6.13496918e-003, 0., 0., + 6.13496918e-003, 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 1.22699384e-002, 0., + 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 1.22699384e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 1.22699384e-002, 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 1.22699384e-002, 0., 0., 0., 6.13496918e-003, 6.13496918e-003, 0., + 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 1.22699384e-002, 0., 6.13496918e-003, 1.22699384e-002, + 6.13496918e-003, 6.13496918e-003, 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 1.84049085e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 1.22699384e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 1.75438598e-002, 5.84795326e-003, 0., 0., 0., 0., + 0., 5.84795326e-003, 1.16959065e-002, 1.16959065e-002, + 5.84795326e-003, 1.16959065e-002, 1.75438598e-002, + 5.84795326e-003, 0., 5.84795326e-003, 5.84795326e-003, 0., 0., 0., + 0., 0., 5.84795326e-003, 0., 5.84795326e-003, 5.84795326e-003, 0., + 0., 3.50877196e-002, 0., 5.84795326e-003, 5.84795326e-003, 0., + 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 0., 5.84795326e-003, 1.75438598e-002, 5.84795326e-003, + 2.33918130e-002, 3.50877196e-002, 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 1.75438598e-002, 0., 0., 5.84795326e-003, + 5.84795326e-003, 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., + 5.84795326e-003, 5.84795326e-003, 0., 0., 5.84795326e-003, 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 5.84795326e-003, 1.16959065e-002, 1.16959065e-002, 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 0., + 5.84795326e-003, 1.16959065e-002, 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 1.75438598e-002, 5.84795326e-003, 0., 0., + 5.84795326e-003, 0., 1.16959065e-002, 0., 0., 0., 2.33918130e-002, + 5.84795326e-003, 0., 5.84795326e-003, 0., 5.84795326e-003, 0., + 5.84795326e-003, 1.75438598e-002, 0., 0., 0., 0., 0., 0., 0., + 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.16959065e-002, 5.84795326e-003, 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., + 5.84795326e-003, 5.84795326e-003, 2.33918130e-002, 0., 0., 0., 0., + 0., 0., 5.84795326e-003, 5.84795326e-003, 5.84795326e-003, 0., 0., + 0., 5.84795326e-003, 0., 5.84795326e-003, 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 0., 1.16959065e-002, 5.84795326e-003, 0., 0., 5.84795326e-003, 0., + 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 5.84795326e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., + 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 5.84795326e-003, 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., + 2.33918130e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, + 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 1.16959065e-002, + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, + 5.84795326e-003, 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 5.84795326e-003, 0., 0., 0., 0., + 5.84795326e-003, 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, + 0., 0., 0., 0., 5.84795326e-003, 0., 0., 0., 0., 0., 0., 0., + 5.84795326e-003, 0., 1.16959065e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.16959065e-002, 0., 0., 0., 0., 0., 5.84795326e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.84795326e-003, 0., 0., + 0., 0., 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., 0., 0., + 0., 0., 1.14285713e-002, 0., 5.71428565e-003, 5.71428565e-003, + 5.71428565e-003, 1.14285713e-002, 1.14285713e-002, 0., + 5.71428565e-003, 0., 1.71428565e-002, 0., 1.14285713e-002, + 5.71428565e-003, 1.14285713e-002, 0., 1.14285713e-002, + 1.14285713e-002, 5.71428565e-003, 0., 0., 2.85714287e-002, + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14285713e-002, 5.71428565e-003, 0., 0., 0., 0., 1.14285713e-002, + 0., 5.71428565e-003, 2.85714287e-002, 5.71428565e-003, + 5.71428565e-003, 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., + 0., 0., 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 0., 0., 5.71428565e-003, 5.71428565e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.14285713e-002, 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 1.14285713e-002, 0., + 0., 5.71428565e-003, 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 1.71428565e-002, 0., 1.14285713e-002, 0., 0., 0., 0., 0., + 0., 0., 5.71428565e-003, 5.71428565e-003, 5.71428565e-003, 0., 0., + 1.14285713e-002, 0., 1.71428565e-002, 0., 0., 0., 3.42857130e-002, + 0., 0., 1.14285713e-002, 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 1.14285713e-002, 0., 5.71428565e-003, 1.71428565e-002, + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 5.71428565e-003, 1.14285713e-002, + 0., 0., 0., 0., 5.71428565e-003, 0., 1.14285713e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 5.71428565e-003, 0., 0., 0., 0., 0., 5.71428565e-003, + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 2.28571426e-002, 0., 0., 5.71428565e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.71428565e-003, 0., 0., 0., 0., 1.14285713e-002, + 5.71428565e-003, 0., 0., 0., 1.14285713e-002, 0., 1.14285713e-002, + 5.71428565e-003, 0., 0., 1.14285713e-002, 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 1.14285713e-002, 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14285713e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 1.14285713e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.14285713e-002, 0., 0., 0., 0., 5.71428565e-003, + 5.71428565e-003, 1.14285713e-002, 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14285713e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14285713e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 5.71428565e-003, 0., 0., + 0., 0., 1.71428565e-002, 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.14285713e-002, 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 5.71428565e-003, 0., 0., 0., 1.14285713e-002, 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 1.14285713e-002, 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 1.14285713e-002, 5.71428565e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.28571426e-002, 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., + 5.71428565e-003, 5.71428565e-003, 1.14285713e-002, 0., + 1.14285713e-002, 0., 5.71428565e-003, 0., 5.71428565e-003, + 1.14285713e-002, 5.71428565e-003, 5.71428565e-003, + 5.71428565e-003, 5.71428565e-003, 5.71428565e-003, + 5.71428565e-003, 5.71428565e-003, 0., 5.71428565e-003, + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 5.71428565e-003, 0., + 5.71428565e-003, 0., 5.71428565e-003, 5.71428565e-003, + 1.14285713e-002, 5.71428565e-003, 1.14285713e-002, 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 1.14285713e-002, + 2.28571426e-002, 0., 0., 5.71428565e-003, 0., 0., 0., + 1.14285713e-002, 0., 5.71428565e-003, 5.71428565e-003, 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 1.14285713e-002, + 1.14285713e-002, 1.14285713e-002, 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 5.71428565e-003, 0., + 1.14285713e-002, 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 5.71428565e-003, 5.71428565e-003, 0., 0., 0., 0., 0., + 5.71428565e-003, 1.14285713e-002, 5.71428565e-003, 0., + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 0., 5.71428565e-003, + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 1.14285713e-002, + 5.71428565e-003, 0., 0., 1.71428565e-002, 5.71428565e-003, 0., 0., + 0., 5.71428565e-003, 1.14285713e-002, 0., 0., 0., 2.28571426e-002, + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 1.14285713e-002, 0., 0., 0., 0., 0., + 0., 0., 5.71428565e-003, 0., 5.71428565e-003, 5.71428565e-003, 0., + 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 1.71428565e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.71428565e-003, 1.14285713e-002, 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 5.71428565e-003, 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 0., 5.71428565e-003, + 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.71428565e-003, 0., 5.71428565e-003, 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 5.71428565e-003, + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 1.14285713e-002, 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 1.71428565e-002, 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14285713e-002, 0., 0., 0., 0., 1.14285713e-002, 1.14285713e-002, + 0., 0., 5.71428565e-003, 0., 0., 1.14285713e-002, 0., + 5.71428565e-003, 5.71428565e-003, 0., 0., 1.14285713e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., + 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.71428565e-002, 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 1.71428565e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 5.71428565e-003, + 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.18134702e-003, 5.18134702e-003, + 5.18134702e-003, 1.55440411e-002, 0., 5.18134702e-003, 0., + 1.03626940e-002, 0., 5.18134702e-003, 1.03626940e-002, + 5.18134702e-003, 0., 1.03626940e-002, 0., 5.18134702e-003, + 5.18134702e-003, 1.03626940e-002, 0., 0., 0., 0., 2.07253881e-002, + 0., 1.03626940e-002, 0., 1.55440411e-002, 5.18134702e-003, + 1.03626940e-002, 0., 5.18134702e-003, 1.03626940e-002, 0., 0., 0., + 1.03626940e-002, 0., 0., 5.18134702e-003, 2.59067342e-002, 0., 0., + 0., 5.18134702e-003, 0., 5.18134702e-003, 5.18134702e-003, + 1.03626940e-002, 1.55440411e-002, 0., 5.18134702e-003, 0., 0., 0., + 0., 2.07253881e-002, 0., 0., 0., 1.03626940e-002, 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 5.18134702e-003, 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 1.03626940e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., + 1.03626940e-002, 0., 0., 0., 0., 1.03626940e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 1.03626940e-002, 0., 0., 0., 1.03626940e-002, 0., + 0., 5.18134702e-003, 5.18134702e-003, 0., 0., 5.18134702e-003, 0., + 0., 0., 0., 0., 3.10880821e-002, 0., 0., 5.18134702e-003, + 4.66321222e-002, 0., 0., 1.03626940e-002, 0., 5.18134702e-003, + 1.03626940e-002, 0., 2.07253881e-002, 0., 5.18134702e-003, 0., 0., + 0., 0., 1.55440411e-002, 0., 5.18134702e-003, 0., 1.03626940e-002, + 0., 0., 5.18134702e-003, 0., 5.18134702e-003, 0., 0., + 5.18134702e-003, 0., 3.10880821e-002, 5.18134702e-003, + 5.18134702e-003, 0., 5.18134702e-003, 5.18134702e-003, + 5.18134702e-003, 5.18134702e-003, 1.55440411e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 0., 0., + 0., 5.18134702e-003, 0., 0., 0., 0., 5.18134702e-003, 0., 0., + 5.18134702e-003, 0., 1.03626940e-002, 1.55440411e-002, 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, + 5.18134702e-003, 0., 0., 0., 5.18134702e-003, 0., 5.18134702e-003, + 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.18134702e-003, 0., 0., 1.55440411e-002, 0., 0., 0., 0., + 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, + 0., 0., 2.59067342e-002, 0., 0., 0., 0., 0., 1.03626940e-002, 0., + 5.18134702e-003, 0., 0., 0., 5.18134702e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 5.18134702e-003, 0., 0., 0., 1.55440411e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, 5.18134702e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.18134702e-003, 0., 5.18134702e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 1.03626940e-002, 0., 0., + 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 5.18134702e-003, 0., 5.18134702e-003, 0., + 0., 0., 0., 0., 0., 5.18134702e-003, 0., 5.18134702e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, 5.18134702e-003, + 1.03626940e-002, 0., 5.18134702e-003, 0., 1.55440411e-002, 0., 0., + 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.03626940e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.18134702e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.18134702e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.18134702e-003, 0., 0., 5.18134702e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.18134702e-003, 0., 0., 0., 0., 0., 0., 0., 2.28571426e-002, + 5.71428565e-003, 5.71428565e-003, 5.71428565e-003, 0., + 1.71428565e-002, 0., 0., 1.71428565e-002, 0., 5.71428565e-003, + 1.14285713e-002, 0., 0., 5.71428565e-003, 0., 0., 5.71428565e-003, + 1.14285713e-002, 0., 0., 0., 2.28571426e-002, 5.71428565e-003, + 5.71428565e-003, 5.71428565e-003, 1.14285713e-002, 0., + 2.28571426e-002, 5.71428565e-003, 1.14285713e-002, + 5.71428565e-003, 5.71428565e-003, 0., 0., 1.14285713e-002, 0., + 5.71428565e-003, 5.71428565e-003, 1.14285713e-002, 0., 0., 0., + 5.71428565e-003, 5.71428565e-003, 1.14285713e-002, 0., 0., + 5.71428565e-003, 0., 5.71428565e-003, 1.14285713e-002, 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 1.14285713e-002, 0., 0., 0., 5.71428565e-003, + 5.71428565e-003, 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., + 0., 0., 0., 0., 0., 0., 1.14285713e-002, 5.71428565e-003, + 5.71428565e-003, 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., 0., + 1.71428565e-002, 0., 0., 0., 0., 1.14285713e-002, 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 1.14285713e-002, 0., + 0., 5.71428565e-003, 0., 2.28571426e-002, 0., 0., 5.71428565e-003, + 3.42857130e-002, 0., 0., 5.71428565e-003, 0., 5.71428565e-003, + 1.14285713e-002, 0., 0., 0., 0., 5.71428565e-003, 0., + 1.14285713e-002, 0., 5.71428565e-003, 0., 5.71428565e-003, + 5.71428565e-003, 5.71428565e-003, 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.14285713e-002, + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.71428565e-003, 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., + 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., + 5.71428565e-003, 5.71428565e-003, 0., 5.71428565e-003, 0., + 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 2.28571426e-002, 0., 5.71428565e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14285713e-002, 5.71428565e-003, 0., 0., 5.71428565e-003, + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.14285713e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 1.14285713e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 0., 0., 1.14285713e-002, 0., 5.71428565e-003, 0., 5.71428565e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., + 1.14285713e-002, 0., 0., 0., 0., 0., 1.14285713e-002, 0., 0., 0., + 0., 5.71428565e-003, 1.14285713e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., + 5.71428565e-003, 5.71428565e-003, 0., 0., 5.71428565e-003, 0., + 1.14285713e-002, 0., 5.71428565e-003, 5.71428565e-003, 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., 0., 0., + 1.14285713e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.14285713e-002, 0., 5.71428565e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.14285713e-002, 0., + 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., + 0., 0., 0., 0., 0., 5.71428565e-003, 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 1.07526882e-002, 0., 1.07526882e-002, + 1.61290318e-002, 0., 5.37634408e-003, 0., 0., 0., 0., + 1.07526882e-002, 5.37634408e-003, 5.37634408e-003, + 1.07526882e-002, 0., 4.30107526e-002, 1.07526882e-002, + 5.37634408e-003, 0., 0., 2.15053763e-002, 5.37634408e-003, + 1.07526882e-002, 5.37634408e-003, 5.37634408e-003, 0., + 2.15053763e-002, 5.37634408e-003, 0., 1.07526882e-002, 0., 0., + 1.07526882e-002, 0., 5.37634408e-003, 0., 1.07526882e-002, + 2.15053763e-002, 0., 0., 0., 0., 0., 5.37634408e-003, 0., + 1.07526882e-002, 1.07526882e-002, 5.37634408e-003, 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., + 0., 0., 1.07526882e-002, 5.37634408e-003, 0., 0., 0., + 5.37634408e-003, 0., 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.37634408e-003, 0., 1.61290318e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.07526882e-002, + 5.37634408e-003, 5.37634408e-003, 0., 0., 5.37634408e-003, 0., 0., + 5.37634408e-003, 0., 5.37634408e-003, 0., 5.37634408e-003, + 1.61290318e-002, 0., 0., 0., 0., 0., 5.37634408e-003, 0., + 5.37634408e-003, 0., 0., 0., 0., 5.37634408e-003, 1.61290318e-002, + 0., 0., 0., 2.68817209e-002, 0., 0., 0., 0., 0., 0., 0., + 1.61290318e-002, 0., 0., 0., 0., 0., 0., 5.37634408e-003, + 5.37634408e-003, 0., 0., 1.07526882e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.61290318e-002, 5.37634408e-003, 0., 0., 0., 0., + 1.61290318e-002, 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 2.15053763e-002, 0., 5.37634408e-003, 0., + 5.37634408e-003, 0., 0., 1.07526882e-002, 0., 0., 5.37634408e-003, + 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 5.37634408e-003, 5.37634408e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., + 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., 5.37634408e-003, 0., + 0., 0., 0., 0., 0., 5.37634408e-003, 0., 5.37634408e-003, 0., 0., + 1.07526882e-002, 0., 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, + 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., + 5.37634408e-003, 5.37634408e-003, 0., 0., 0., 2.15053763e-002, + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.37634408e-003, 5.37634408e-003, 5.37634408e-003, 0., 0., 0., + 1.61290318e-002, 0., 0., 0., 1.61290318e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 5.37634408e-003, 0., + 1.07526882e-002, 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 1.07526882e-002, 0., 5.37634408e-003, 0., 5.37634408e-003, + 1.61290318e-002, 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.37634408e-003, 5.37634408e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.37634408e-003, 0., 0., 0., 0., 5.37634408e-003, + 1.07526882e-002, 0., 0., 1.07526882e-002, 0., 0., 0., 0., + 5.37634408e-003, 0., 5.37634408e-003, 5.37634408e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, 5.37634408e-003, 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 5.37634408e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.07526882e-002, 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 1.07526882e-002, + 5.37634408e-003, 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.37634408e-003, + 0., 0., 5.37634408e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 2.05479451e-002, 0., 6.84931502e-003, 6.84931502e-003, 0., + 6.84931502e-003, 0., 6.84931502e-003, 6.84931502e-003, + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 1.36986300e-002, + 6.84931502e-003, 0., 6.84931502e-003, 1.36986300e-002, + 2.05479451e-002, 6.84931502e-003, 0., 6.84931502e-003, + 1.36986300e-002, 0., 2.05479451e-002, 0., 0., 6.84931502e-003, 0., + 6.84931502e-003, 0., 0., 0., 0., 6.84931502e-003, 1.36986300e-002, + 0., 0., 0., 0., 0., 0., 2.05479451e-002, 0., 2.05479451e-002, 0., + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 6.84931502e-003, + 0., 0., 6.84931502e-003, 0., 6.84931502e-003, 6.84931502e-003, 0., + 0., 0., 6.84931502e-003, 6.84931502e-003, 0., 6.84931502e-003, 0., + 0., 6.84931502e-003, 6.84931502e-003, 0., 6.84931502e-003, 0., 0., + 0., 0., 0., 1.36986300e-002, 0., 0., 0., 0., 0., 6.84931502e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 1.36986300e-002, 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 1.36986300e-002, + 6.84931502e-003, 0., 0., 0., 0., 4.10958901e-002, 0., 0., 0., + 2.73972601e-002, 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.36986300e-002, 6.84931502e-003, 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 1.36986300e-002, 0., 0., 0., + 1.36986300e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 1.36986300e-002, + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 6.84931502e-003, + 6.84931502e-003, 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.36986300e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., + 3.42465751e-002, 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.84931502e-003, 0., 0., 0., 1.36986300e-002, 0., 0., 0., 0., + 0., 6.84931502e-003, 6.84931502e-003, 0., 6.84931502e-003, 0., 0., + 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, + 0., 6.84931502e-003, 0., 0., 0., 6.84931502e-003, 0., + 6.84931502e-003, 0., 6.84931502e-003, 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 1.36986300e-002, 2.05479451e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 6.84931502e-003, 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., + 6.84931502e-003, 6.84931502e-003, 0., 0., 0., 0., 6.84931502e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., + 6.84931502e-003, 6.84931502e-003, 0., 6.84931502e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.36986300e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.36986300e-002, + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 6.84931502e-003, 0., 0., 0., 6.84931502e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 6.84931502e-003, 1.36986300e-002, 0., 0., 0., + 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 6.84931502e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.84931502e-003, 0., + 0., 0., 0., 0., 0., 6.84931502e-003, 0., 0., 0., 0., 0., 0., + 6.84931502e-003, 0., 0., 6.84931502e-003, 0., 0., 0., + 6.84931502e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.10497242e-002, 1.10497242e-002, 0., 0., + 5.52486209e-003, 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., + 0., 1.10497242e-002, 0., 5.52486209e-003, 5.52486209e-003, 0., + 1.10497242e-002, 0., 2.20994484e-002, 0., 0., 0., 0., + 5.52486209e-003, 5.52486209e-003, 5.52486209e-003, 0., + 1.10497242e-002, 0., 0., 1.10497242e-002, 5.52486209e-003, 0., + 5.52486209e-003, 1.65745858e-002, 5.52486209e-003, 0., + 5.52486209e-003, 0., 1.10497242e-002, 0., 0., 0., 1.10497242e-002, + 4.41988967e-002, 0., 0., 0., 0., 0., 5.52486209e-003, + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, + 5.52486209e-003, 0., 0., 0., 5.52486209e-003, 0., 5.52486209e-003, + 1.10497242e-002, 0., 5.52486209e-003, 1.10497242e-002, 0., 0., + 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.52486209e-003, 5.52486209e-003, 0., + 5.52486209e-003, 5.52486209e-003, 0., 0., 1.10497242e-002, 0., 0., + 0., 1.10497242e-002, 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 5.52486209e-003, + 1.10497242e-002, 0., 0., 0., 5.52486209e-003, 2.20994484e-002, 0., + 0., 1.10497242e-002, 3.86740342e-002, 1.65745858e-002, 0., 0., 0., + 0., 0., 5.52486209e-003, 2.76243109e-002, 0., 0., 0., 0., + 5.52486209e-003, 1.10497242e-002, 0., 0., 0., 0., 0., + 1.65745858e-002, 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., + 5.52486209e-003, 0., 0., 0., 0., 5.52486209e-003, 1.10497242e-002, + 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.52486209e-003, 1.10497242e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 5.52486209e-003, 0., + 0., 0., 0., 5.52486209e-003, 0., 0., 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 5.52486209e-003, + 0., 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 5.52486209e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.10497242e-002, 0., 0., 0., 5.52486209e-003, 0., 0., + 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 5.52486209e-003, + 0., 0., 0., 0., 0., 0., 2.20994484e-002, 0., 0., 0., 0., + 1.10497242e-002, 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 1.10497242e-002, + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.10497242e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, + 5.52486209e-003, 0., 0., 1.65745858e-002, 0., 5.52486209e-003, 0., + 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., + 5.52486209e-003, 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 1.10497242e-002, 1.10497242e-002, 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., + 1.10497242e-002, 0., 0., 0., 1.65745858e-002, 0., 0., 0., + 5.52486209e-003, 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 5.52486209e-003, 0., 5.52486209e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.52486209e-003, 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.10497242e-002, 0., 0., 0., 0., 1.65745858e-002, 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 5.52486209e-003, 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.52486209e-003, 0., 0., 0., 0., 0., 0., 8.69565178e-003, + 0., 0., 8.69565178e-003, 0., 0., 8.69565178e-003, 1.73913036e-002, + 8.69565178e-003, 8.69565178e-003, 2.60869563e-002, 0., 0., + 8.69565178e-003, 0., 0., 1.73913036e-002, 2.60869563e-002, 0., 0., + 0., 8.69565178e-003, 0., 8.69565178e-003, 0., 2.60869563e-002, + 1.73913036e-002, 0., 0., 8.69565178e-003, 0., 0., 0., + 2.60869563e-002, 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, + 0., 8.69565178e-003, 8.69565178e-003, 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 8.69565178e-003, 0., 0., 8.69565178e-003, + 0., 0., 1.73913036e-002, 8.69565178e-003, 0., 8.69565178e-003, 0., + 0., 8.69565178e-003, 0., 0., 8.69565178e-003, 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., + 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 8.69565178e-003, + 0., 0., 0., 2.60869563e-002, 0., 0., 0., 8.69565178e-003, + 8.69565178e-003, 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 8.69565178e-003, 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 8.69565178e-003, 8.69565178e-003, + 0., 0., 0., 5.21739125e-002, 0., 0., 0., 8.69565178e-003, 0., 0., + 0., 8.69565178e-003, 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 4.34782580e-002, 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.73913036e-002, 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 3.47826071e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., + 1.73913036e-002, 0., 0., 0., 8.69565178e-003, 0., 8.69565178e-003, + 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 8.69565178e-003, 8.69565178e-003, + 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 1.73913036e-002, + 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 8.69565178e-003, + 8.69565178e-003, 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 8.69565178e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 8.69565178e-003, + 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., + 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.69565178e-003, 8.69565178e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, + 0., 0., 0., 0., 0., 1.73913036e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.69565178e-003, 8.69565178e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.69565178e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 1.63043477e-002, + 0., 0., 0., 1.08695654e-002, 0., 0., 5.43478271e-003, + 1.08695654e-002, 5.43478271e-003, 1.08695654e-002, + 1.63043477e-002, 5.43478271e-003, 5.43478271e-003, + 1.08695654e-002, 0., 0., 5.43478271e-003, 5.43478271e-003, 0., + 1.08695654e-002, 1.08695654e-002, 1.08695654e-002, 0., 0., + 5.43478271e-003, 5.43478271e-003, 5.43478271e-003, + 5.43478271e-003, 0., 5.43478271e-003, 0., 1.08695654e-002, 0., + 1.08695654e-002, 0., 0., 5.43478271e-003, 5.43478271e-003, + 1.08695654e-002, 0., 0., 5.43478271e-003, 0., 5.43478271e-003, + 1.08695654e-002, 1.63043477e-002, 2.71739140e-002, 0., 0., + 5.43478271e-003, 0., 5.43478271e-003, 0., 1.08695654e-002, 0., 0., + 0., 0., 0., 0., 5.43478271e-003, 0., 1.08695654e-002, + 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 5.43478271e-003, 0., + 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 1.08695654e-002, 0., + 0., 0., 0., 0., 5.43478271e-003, 0., 0., 5.43478271e-003, + 1.08695654e-002, 1.08695654e-002, 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 1.63043477e-002, 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., + 1.08695654e-002, 0., 0., 5.43478271e-003, 2.17391308e-002, + 1.63043477e-002, 0., 0., 0., 1.08695654e-002, 5.43478271e-003, 0., + 0., 0., 0., 5.43478271e-003, 0., 5.43478271e-003, 1.08695654e-002, + 0., 0., 5.43478271e-003, 0., 5.43478271e-003, 5.43478271e-003, 0., + 0., 0., 0., 0., 0., 5.43478271e-003, 0., 1.08695654e-002, 0., + 5.43478271e-003, 0., 0., 5.43478271e-003, 5.43478271e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 1.08695654e-002, 0., 0., 5.43478271e-003, + 0., 0., 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 1.08695654e-002, 5.43478271e-003, 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.43478271e-003, 5.43478271e-003, 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., + 0., 0., 0., 0., 5.43478271e-003, 0., 0., 1.08695654e-002, 0., 0., + 1.08695654e-002, 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 1.08695654e-002, 0., 0., 1.08695654e-002, + 0., 0., 0., 0., 5.43478271e-003, 1.63043477e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 0., 1.63043477e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 5.43478271e-003, 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.08695654e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 1.08695654e-002, 0., 0., + 1.08695654e-002, 0., 0., 0., 0., 5.43478271e-003, 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 5.43478271e-003, + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., 5.43478271e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 1.08695654e-002, 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 5.43478271e-003, + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.08695654e-002, 0., 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., + 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.43478271e-003, 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.43478271e-003, 0., 0., 0., 0., 0., 0., 5.43478271e-003, 0., 0., + 0., 0., 0., 5.43478271e-003, 0., 0., 5.91715984e-003, + 1.18343197e-002, 0., 0., 0., 1.18343197e-002, 0., 0., + 5.91715984e-003, 0., 0., 0., 2.36686394e-002, 0., 0., + 5.91715984e-003, 0., 0., 5.91715984e-003, 5.91715984e-003, + 5.91715984e-003, 1.18343197e-002, 4.14201170e-002, + 1.77514795e-002, 5.91715984e-003, 5.91715984e-003, 0., 0., + 2.36686394e-002, 5.91715984e-003, 5.91715984e-003, + 1.18343197e-002, 5.91715984e-003, 5.91715984e-003, 0., 0., + 5.91715984e-003, 5.91715984e-003, 0., 5.91715984e-003, 0., 0., 0., + 5.91715984e-003, 0., 1.18343197e-002, 0., 1.18343197e-002, + 1.18343197e-002, 5.91715984e-003, 0., 1.77514795e-002, 0., 0., + 1.18343197e-002, 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., + 1.18343197e-002, 1.18343197e-002, 5.91715984e-003, 0., 0., 0., 0., + 1.18343197e-002, 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 1.18343197e-002, 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.91715984e-003, 5.91715984e-003, 0., 1.18343197e-002, + 0., 5.91715984e-003, 0., 0., 2.36686394e-002, 0., 1.77514795e-002, + 0., 0., 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 0., 5.91715984e-003, 0., 5.91715984e-003, 0., 0., + 0., 5.91715984e-003, 1.77514795e-002, 0., 0., 0., 0., 0., + 2.36686394e-002, 0., 0., 0., 1.77514795e-002, 0., 0., 0., 0., 0., + 1.18343197e-002, 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 1.18343197e-002, 0., 0., 5.91715984e-003, 0., + 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., 5.91715984e-003, + 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., 5.91715984e-003, + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 5.91715984e-003, 5.91715984e-003, + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.95857992e-002, 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 5.91715984e-003, 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., + 1.77514795e-002, 0., 5.91715984e-003, 5.91715984e-003, 0., 0., 0., + 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., + 1.18343197e-002, 0., 0., 5.91715984e-003, 1.77514795e-002, + 1.18343197e-002, 0., 0., 0., 1.77514795e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.91715984e-003, 5.91715984e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 5.91715984e-003, 5.91715984e-003, 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 0., 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 1.18343197e-002, 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 5.91715984e-003, 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 5.91715984e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 5.91715984e-003, 0., 5.91715984e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.91715984e-003, 0., 0., 0., 5.91715984e-003, 0., 0., 0., 0., 0., + 0., 5.91715984e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 3.44827585e-002, 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 0., + 8.62068962e-003, 8.62068962e-003, 8.62068962e-003, 0., + 8.62068962e-003, 8.62068962e-003, 0., 0., 2.58620679e-002, 0., 0., + 0., 0., 0., 0., 8.62068962e-003, 8.62068962e-003, 8.62068962e-003, + 0., 8.62068962e-003, 0., 0., 0., 1.72413792e-002, 8.62068962e-003, + 0., 8.62068962e-003, 8.62068962e-003, 8.62068962e-003, 0., 0., + 8.62068962e-003, 0., 1.72413792e-002, 0., 0., 8.62068962e-003, 0., + 0., 8.62068962e-003, 8.62068962e-003, 1.72413792e-002, 0., 0., 0., + 0., 0., 8.62068962e-003, 2.58620679e-002, 0., 0., 0., + 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 8.62068962e-003, + 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 8.62068962e-003, + 0., 0., 0., 0., 0., 8.62068962e-003, 0., 8.62068962e-003, 0., 0., + 0., 0., 0., 0., 8.62068962e-003, 0., 8.62068962e-003, 0., 0., + 8.62068962e-003, 0., 0., 0., 8.62068962e-003, 0., 0., + 8.62068962e-003, 8.62068962e-003, 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 0., 0., + 8.62068962e-003, 3.44827585e-002, 0., 0., 0., 1.72413792e-002, + 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 8.62068962e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 3.44827585e-002, 0., 0., 0., 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.62068962e-003, 0., 0., 1.72413792e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.72413792e-002, 0., 0., + 1.72413792e-002, 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 1.72413792e-002, 8.62068962e-003, 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.72413792e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 8.62068962e-003, 0., 0., 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., + 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 0., 1.72413792e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 1.72413792e-002, 0., 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.72413792e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.62068962e-003, 0., 0., 0., 0., + 0., 0., 8.62068962e-003, 0., 0., 8.62068962e-003, 0., 0., 0., 0., + 0., 8.62068962e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.62068962e-003, 8.62068962e-003, 8.62068962e-003, 0., 0., 0., 0., + 7.19424477e-003, 7.19424477e-003, 1.43884895e-002, + 2.15827338e-002, 7.19424477e-003, 1.43884895e-002, 0., + 7.19424477e-003, 1.43884895e-002, 1.43884895e-002, + 1.43884895e-002, 0., 0., 7.19424477e-003, 0., 1.43884895e-002, 0., + 1.43884895e-002, 7.19424477e-003, 7.19424477e-003, + 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 0., 0., 0., + 1.43884895e-002, 0., 0., 2.15827338e-002, 0., 7.19424477e-003, 0., + 1.43884895e-002, 0., 7.19424477e-003, 7.19424477e-003, 0., 0., 0., + 0., 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 2.87769791e-002, + 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 1.43884895e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 1.43884895e-002, 7.19424477e-003, 0., + 0., 0., 1.43884895e-002, 0., 1.43884895e-002, 0., 0., 0., + 7.19424477e-003, 0., 0., 7.19424477e-003, 7.19424477e-003, 0., 0., + 0., 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 7.19424477e-003, + 0., 0., 0., 7.19424477e-003, 0., 7.19424477e-003, 0., + 7.19424477e-003, 7.19424477e-003, 0., 0., 0., 0., 7.19424477e-003, + 1.43884895e-002, 0., 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., + 2.87769791e-002, 0., 0., 0., 2.15827338e-002, 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 7.19424477e-003, 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.43884895e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., + 7.19424477e-003, 0., 0., 7.19424477e-003, 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 7.19424477e-003, 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.19424477e-003, 0., 0., 0., 0., 7.19424477e-003, 0., + 0., 0., 7.19424477e-003, 7.19424477e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 7.19424477e-003, 0., 0., 0., 0., 0., 0., 7.19424477e-003, + 0., 0., 0., 0., 0., 0., 1.43884895e-002, 0., 0., 7.19424477e-003, + 0., 0., 7.19424477e-003, 0., 0., 0., 0., 0., 7.19424477e-003, 0., + 0., 0., 7.19424477e-003, 0., 0., 0., 0., 7.19424477e-003, 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 1.43884895e-002, 0., 0., 7.19424477e-003, + 0., 0., 0., 7.19424477e-003, 0., 1.43884895e-002, 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 0., 7.19424477e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., 0., + 0., 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., 0., 0., 0., + 0., 1.43884895e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., 0., + 0., 0., 0., 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 7.19424477e-003, 0., + 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 0., 1.43884895e-002, + 0., 7.19424477e-003, 0., 7.19424477e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.43884895e-002, 0., 0., 0., 7.19424477e-003, 0., + 7.19424477e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.00000038e-003, 0., 0., 8.00000038e-003, + 8.00000038e-003, 0., 0., 8.00000038e-003, 0., 0., 0., + 8.00000038e-003, 2.40000002e-002, 0., 0., 1.60000008e-002, 0., + 1.60000008e-002, 0., 0., 1.60000008e-002, 0., 4.00000028e-002, + 8.00000038e-003, 8.00000038e-003, 0., 1.60000008e-002, 0., 0., + 8.00000038e-003, 0., 2.40000002e-002, 0., 8.00000038e-003, + 8.00000038e-003, 8.00000038e-003, 0., 0., 8.00000038e-003, 0., 0., + 0., 1.60000008e-002, 8.00000038e-003, 0., 0., 8.00000038e-003, + 8.00000038e-003, 8.00000038e-003, 0., 0., 1.60000008e-002, 0., + 8.00000038e-003, 0., 8.00000038e-003, 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 2.40000002e-002, 8.00000038e-003, 0., 0., 0., 0., + 8.00000038e-003, 1.60000008e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.00000038e-003, + 8.00000038e-003, 0., 0., 0., 8.00000038e-003, 0., 0., + 8.00000038e-003, 0., 0., 0., 8.00000038e-003, 0., 1.60000008e-002, + 0., 1.60000008e-002, 0., 0., 0., 8.00000038e-003, 0., + 4.80000004e-002, 0., 0., 0., 1.60000008e-002, 1.60000008e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 8.00000038e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 4.00000028e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 8.00000038e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.60000008e-002, 0., 0., 8.00000038e-003, + 1.60000008e-002, 0., 0., 0., 8.00000038e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.60000008e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 8.00000038e-003, 1.60000008e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 8.00000038e-003, 0., 0., 8.00000038e-003, + 8.00000038e-003, 0., 0., 0., 0., 8.00000038e-003, 0., 0., 0., 0., + 0., 0., 8.00000038e-003, 0., 8.00000038e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 8.00000038e-003, 0., + 8.00000038e-003, 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., + 0., 8.00000038e-003, 0., 0., 2.40000002e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., + 8.00000038e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., 8.00000038e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 8.00000038e-003, 0., 0., 0., 0., 0., + 8.19672085e-003, 2.45901626e-002, 8.19672085e-003, + 8.19672085e-003, 0., 2.45901626e-002, 0., 0., 1.63934417e-002, + 1.63934417e-002, 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., + 0., 8.19672085e-003, 0., 0., 0., 0., 0., 1.63934417e-002, 0., + 2.45901626e-002, 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., + 2.45901626e-002, 8.19672085e-003, 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 1.63934417e-002, 1.63934417e-002, 0., 0., 0., + 0., 0., 8.19672085e-003, 0., 0., 8.19672085e-003, 0., + 8.19672085e-003, 8.19672085e-003, 0., 8.19672085e-003, 0., + 2.45901626e-002, 8.19672085e-003, 8.19672085e-003, 0., 0., 0., + 8.19672085e-003, 0., 8.19672085e-003, 0., 0., 0., 0., + 8.19672085e-003, 0., 8.19672085e-003, 0., 0., 8.19672085e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.63934417e-002, 0., 0., 0., 0., + 0., 0., 8.19672085e-003, 8.19672085e-003, 8.19672085e-003, 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., + 0., 0., 1.63934417e-002, 0., 1.63934417e-002, 0., 8.19672085e-003, + 0., 0., 0., 0., 0., 2.45901626e-002, 0., 0., 8.19672085e-003, + 8.19672085e-003, 0., 0., 0., 0., 1.63934417e-002, 8.19672085e-003, + 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., + 3.27868834e-002, 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 8.19672085e-003, 1.63934417e-002, + 8.19672085e-003, 0., 1.63934417e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, + 1.63934417e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., + 8.19672085e-003, 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.19672085e-003, 0., 0., 8.19672085e-003, 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.63934417e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 1.63934417e-002, 0., 0., 0., 0., + 8.19672085e-003, 8.19672085e-003, 8.19672085e-003, + 8.19672085e-003, 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.19672085e-003, 0., 8.19672085e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., 8.19672085e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., 0., 0., 0., + 0., 0., 0., 8.19672085e-003, 0., 8.19672085e-003, 8.19672085e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 8.19672085e-003, 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.63934417e-002, 0., 0., 8.19672085e-003, 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.19672085e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.99999993e-002, 9.99999978e-003, 0., 0., 0., 9.99999978e-003, 0., + 0., 9.99999978e-003, 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.99999978e-003, 0., 0., 9.99999978e-003, 9.99999978e-003, + 0., 9.99999978e-003, 0., 0., 0., 0., 0., 9.99999978e-003, 0., 0., + 9.99999978e-003, 0., 9.99999978e-003, 0., 0., 0., 9.99999978e-003, + 0., 0., 0., 0., 1.99999996e-002, 0., 0., 9.99999978e-003, 0., + 1.99999996e-002, 9.99999978e-003, 3.99999991e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 1.99999996e-002, 0., 0., 0., 0., 0., 0., 0., + 1.99999996e-002, 0., 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., + 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 9.99999978e-003, 0., 9.99999978e-003, 0., 0., 0., 0., 0., + 9.99999978e-003, 0., 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.99999978e-003, 0., 1.99999996e-002, + 9.99999978e-003, 9.99999978e-003, 0., 0., 0., 0., 0., + 2.99999993e-002, 0., 0., 0., 7.00000003e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., + 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 2.99999993e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.99999978e-003, 0., 0., + 9.99999978e-003, 0., 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.99999978e-003, 0., 0., 0., 0., 0., 9.99999978e-003, 0., + 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.99999996e-002, 0., 0., 9.99999978e-003, 0., 9.99999978e-003, + 1.99999996e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.99999978e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.99999978e-003, 9.99999978e-003, + 0., 0., 9.99999978e-003, 1.99999996e-002, 9.99999978e-003, 0., 0., + 1.99999996e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., 1.99999996e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.99999996e-002, + 9.99999978e-003, 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.99999978e-003, 9.99999978e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.99999996e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., 9.99999978e-003, + 0., 0., 0., 0., 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., 9.99999978e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.99999978e-003, + 0., 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.99999978e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.99999996e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.99999978e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 9.09090880e-003, 9.09090880e-003, 0., 0., 0., 0., + 0., 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 9.09090880e-003, 9.09090880e-003, 0., + 2.72727273e-002, 0., 0., 0., 9.09090880e-003, 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 9.09090880e-003, 0., 0., + 1.81818176e-002, 1.81818176e-002, 0., 0., 0., 1.81818176e-002, 0., + 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 9.09090880e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, 9.09090880e-003, + 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.81818176e-002, 0., 0., 0., 0., 0., 1.81818176e-002, 0., + 9.09090880e-003, 0., 9.09090880e-003, 0., 0., 9.09090880e-003, 0., + 0., 0., 9.09090880e-003, 0., 0., 0., 0., 9.09090880e-003, + 9.09090880e-003, 9.09090880e-003, 0., 0., 1.81818176e-002, 0., 0., + 0., 0., 0., 9.09090880e-003, 0., 9.09090880e-003, 0., 0., 0., 0., + 1.81818176e-002, 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.09090880e-003, 0., 9.09090880e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., + 0., 0., 9.09090880e-003, 9.09090880e-003, 9.09090880e-003, + 1.81818176e-002, 0., 0., 0., 0., 0., 9.09090880e-003, 0., + 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.81818176e-002, 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., + 9.09090880e-003, 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 9.09090880e-003, 0., 0., 0., 0., 0., + 1.81818176e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.81818176e-002, 0., 0., 0., 9.09090880e-003, 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 0., 1.81818176e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., + 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.09090880e-003, 0., 0., 9.09090880e-003, 0., 0., 0., + 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 1.81818176e-002, 0., + 9.09090880e-003, 0., 0., 0., 0., 0., 0., 1.81818176e-002, 0., 0., + 0., 9.09090880e-003, 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.09090880e-003, + 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 9.09090880e-003, 0., + 9.09090880e-003, 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.09090880e-003, 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.09090880e-003, 0., 9.09090880e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 9.09090880e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.09090880e-003, 3.70370373e-002, 9.25925933e-003, + 1.85185187e-002, 9.25925933e-003, 9.25925933e-003, + 1.85185187e-002, 0., 9.25925933e-003, 9.25925933e-003, + 2.77777780e-002, 1.85185187e-002, 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 9.25925933e-003, + 2.77777780e-002, 0., 9.25925933e-003, 9.25925933e-003, 0., 0., 0., + 0., 0., 9.25925933e-003, 0., 0., 0., 1.85185187e-002, 0., 0., 0., + 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., + 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 1.85185187e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, + 9.25925933e-003, 9.25925933e-003, 0., 9.25925933e-003, 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.77777780e-002, 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., + 9.25925933e-003, 1.85185187e-002, 0., 0., 1.85185187e-002, + 1.85185187e-002, 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., + 9.25925933e-003, 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., + 0., 0., 1.85185187e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 9.25925933e-003, 0., 0., 9.25925933e-003, 0., + 9.25925933e-003, 0., 9.25925933e-003, 0., 0., 0., 9.25925933e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., + 0., 0., 9.25925933e-003, 0., 0., 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., + 0., 9.25925933e-003, 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 9.25925933e-003, 0., 0., 9.25925933e-003, 0., 0., 0., 0., + 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 9.25925933e-003, 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 0., 9.25925933e-003, 0., 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.77777780e-002, 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 9.25925933e-003, 0., 0., 0., 0., + 9.25925933e-003, 0., 9.25925933e-003, 0., 9.25925933e-003, 0., 0., + 9.25925933e-003, 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 9.25925933e-003, + 0., 0., 9.25925933e-003, 1.85185187e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., + 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 9.25925933e-003, 0., + 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., + 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., + 4.23728824e-002, 0., 1.69491526e-002, 0., 0., 8.47457629e-003, + 8.47457629e-003, 0., 8.47457629e-003, 0., 0., 8.47457629e-003, + 1.69491526e-002, 1.69491526e-002, 0., 8.47457629e-003, + 8.47457629e-003, 0., 8.47457629e-003, 1.69491526e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.54237279e-002, 0., 0., 0., + 8.47457629e-003, 2.54237279e-002, 8.47457629e-003, 0., + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., + 3.38983051e-002, 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 8.47457629e-003, 8.47457629e-003, 0., 0., 0., + 8.47457629e-003, 0., 8.47457629e-003, 0., 0., 0., 0., + 8.47457629e-003, 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 1.69491526e-002, 0., 0., 0., 0., + 4.23728824e-002, 0., 0., 0., 1.69491526e-002, 8.47457629e-003, 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 1.69491526e-002, 8.47457629e-003, 0., 0., 8.47457629e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 1.69491526e-002, 0., 0., 0., 0., + 2.54237279e-002, 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 1.69491526e-002, 0., 8.47457629e-003, + 0., 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.47457629e-003, 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 1.69491526e-002, 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., + 8.47457629e-003, 0., 0., 0., 8.47457629e-003, 0., 0., + 8.47457629e-003, 2.54237279e-002, 0., 1.69491526e-002, 0., 0., 0., + 0., 0., 0., 0., 8.47457629e-003, 0., 3.38983051e-002, 0., 0., 0., + 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., + 1.69491526e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.69491526e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., + 0., 8.47457629e-003, 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.47457629e-003, + 0., 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.47457629e-003, 0., 0., 0., 0., 0., 0., + 8.47457629e-003, 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., + 0., 3.70370373e-002, 0., 4.62962985e-002, 0., 9.25925933e-003, 0., + 0., 0., 0., 9.25925933e-003, 0., 0., 0., 9.25925933e-003, + 2.77777780e-002, 0., 0., 1.85185187e-002, 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 9.25925933e-003, 9.25925933e-003, 0., + 9.25925933e-003, 0., 1.85185187e-002, 0., 0., 0., 0., + 4.62962985e-002, 9.25925933e-003, 0., 0., 0., 9.25925933e-003, 0., + 9.25925933e-003, 9.25925933e-003, 1.85185187e-002, + 2.77777780e-002, 0., 0., 1.85185187e-002, 9.25925933e-003, + 9.25925933e-003, 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., + 1.85185187e-002, 0., 1.85185187e-002, 0., 9.25925933e-003, 0., 0., + 1.85185187e-002, 3.70370373e-002, 0., 0., 0., 1.85185187e-002, 0., + 0., 0., 0., 0., 0., 9.25925933e-003, 9.25925933e-003, 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 9.25925933e-003, 9.25925933e-003, 0., 0., 0., 0., + 0., 9.25925933e-003, 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., + 0., 0., 0., 1.85185187e-002, 0., 0., 0., 0., 0., 0., + 1.85185187e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.85185187e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.85185187e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.25925933e-003, 9.25925933e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.77777780e-002, 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 1.85185187e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.25925933e-003, 0., 9.25925933e-003, 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., + 9.25925933e-003, 0., 0., 9.25925933e-003, 0., 0., 9.25925933e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.25925933e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 1.94174759e-002, + 9.70873795e-003, 0., 3.88349518e-002, 0., 0., 0., 9.70873795e-003, + 0., 0., 9.70873795e-003, 9.70873795e-003, 0., 0., 0., + 1.94174759e-002, 0., 1.94174759e-002, 0., 0., 2.91262139e-002, 0., + 0., 0., 1.94174759e-002, 0., 0., 0., 1.94174759e-002, + 2.91262139e-002, 0., 9.70873795e-003, 9.70873795e-003, 0., 0., + 1.94174759e-002, 1.94174759e-002, 0., 0., 9.70873795e-003, 0., 0., + 0., 9.70873795e-003, 0., 9.70873795e-003, 9.70873795e-003, 0., 0., + 9.70873795e-003, 9.70873795e-003, 0., 9.70873795e-003, 0., 0., 0., + 0., 9.70873795e-003, 0., 0., 9.70873795e-003, 0., 0., + 9.70873795e-003, 0., 0., 1.94174759e-002, 0., 9.70873795e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 1.94174759e-002, 0., + 0., 0., 0., 0., 0., 9.70873795e-003, 0., 9.70873795e-003, 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 3.88349518e-002, + 0., 0., 0., 1.94174759e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, + 0., 0., 0., 1.94174759e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.94174759e-002, 0., 0., 0., + 0., 0., 0., 0., 9.70873795e-003, 0., 0., 9.70873795e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., + 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 9.70873795e-003, 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 9.70873795e-003, + 0., 0., 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.94174759e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.70873795e-003, 0., 9.70873795e-003, 0., 0., 0., 0., + 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., + 9.70873795e-003, 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 9.70873795e-003, 0., 0., 0., 0., 9.70873795e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 2.91262139e-002, 0., 9.70873795e-003, 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.94174759e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 9.70873795e-003, 0., 9.70873795e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.57480314e-002, 7.87401572e-003, 0., 0., + 3.14960629e-002, 0., 0., 7.87401572e-003, 0., 0., 0., + 7.87401572e-003, 0., 1.57480314e-002, 7.87401572e-003, + 7.87401572e-003, 0., 7.87401572e-003, 0., 0., 7.87401572e-003, + 1.57480314e-002, 7.87401572e-003, 7.87401572e-003, + 7.87401572e-003, 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 7.87401572e-003, 0., 2.36220472e-002, 0., + 7.87401572e-003, 0., 7.87401572e-003, 0., 0., 7.87401572e-003, 0., + 0., 1.57480314e-002, 7.87401572e-003, 7.87401572e-003, + 7.87401572e-003, 7.87401572e-003, 0., 7.87401572e-003, + 1.57480314e-002, 0., 0., 7.87401572e-003, 0., 0., 0., + 1.57480314e-002, 7.87401572e-003, 7.87401572e-003, 0., 0., 0., + 7.87401572e-003, 0., 2.36220472e-002, 0., 0., 0., 7.87401572e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 1.57480314e-002, 0., + 7.87401572e-003, 7.87401572e-003, 0., 0., 0., 0., 1.57480314e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 1.57480314e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 7.87401572e-003, 0., 0., 7.87401572e-003, 0., 0., + 7.87401572e-003, 0., 2.36220472e-002, 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 7.87401572e-003, 0., 0., 0., + 1.57480314e-002, 0., 0., 0., 0., 7.87401572e-003, 7.87401572e-003, + 0., 7.87401572e-003, 0., 0., 7.87401572e-003, 0., 0., 0., 0., + 2.36220472e-002, 7.87401572e-003, 0., 0., 7.87401572e-003, + 1.57480314e-002, 0., 0., 0., 0., 7.87401572e-003, 1.57480314e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., 1.57480314e-002, + 1.57480314e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.57480314e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.57480314e-002, + 0., 0., 0., 0., 0., 0., 0., 3.14960629e-002, 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.57480314e-002, 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.57480314e-002, + 7.87401572e-003, 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, + 0., 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 7.87401572e-003, 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.57480314e-002, 0., 7.87401572e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, + 0., 0., 0., 0., 0., 0., 0., 7.87401572e-003, 0., 7.87401572e-003, + 0., 0., 7.87401572e-003, 0., 0., 1.29032256e-002, 6.45161280e-003, + 6.45161280e-003, 0., 0., 1.29032256e-002, 0., 0., 6.45161280e-003, + 6.45161280e-003, 6.45161280e-003, 0., 1.29032256e-002, 0., + 6.45161280e-003, 0., 1.29032256e-002, 0., 0., 1.29032256e-002, 0., + 0., 6.45161280e-003, 6.45161280e-003, 0., 1.29032256e-002, 0., 0., + 6.45161280e-003, 1.29032256e-002, 0., 6.45161280e-003, 0., + 6.45161280e-003, 6.45161280e-003, 6.45161280e-003, 0., 0., + 6.45161280e-003, 0., 6.45161280e-003, 0., 0., 6.45161280e-003, 0., + 1.29032256e-002, 1.29032256e-002, 6.45161280e-003, + 6.45161280e-003, 0., 0., 1.93548389e-002, 6.45161280e-003, 0., + 6.45161280e-003, 1.29032256e-002, 0., 0., 0., 6.45161280e-003, + 6.45161280e-003, 0., 1.29032256e-002, 6.45161280e-003, + 1.93548389e-002, 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., + 6.45161280e-003, 0., 1.29032256e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., + 0., 0., 0., 1.29032256e-002, 0., 0., 6.45161280e-003, 0., 0., 0., + 0., 0., 0., 6.45161280e-003, 0., 0., 0., 1.29032256e-002, 0., 0., + 0., 0., 0., 0., 6.45161280e-003, 1.29032256e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 1.93548389e-002, 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 0., 0., 6.45161280e-003, 0., 0., 6.45161280e-003, + 0., 0., 0., 0., 6.45161280e-003, 6.45161280e-003, 0., + 1.93548389e-002, 0., 6.45161280e-003, 6.45161280e-003, 0., 0., 0., + 3.22580636e-002, 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 0., 0., 1.29032256e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 0., 0., 6.45161280e-003, 0., 0., 6.45161280e-003, + 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.45161280e-003, 0., 0., 6.45161280e-003, 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., + 6.45161280e-003, 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.45161280e-003, 0., 0., 0., 6.45161280e-003, 0., 0., 0., + 0., 6.45161280e-003, 6.45161280e-003, 0., 0., 1.29032256e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.45161280e-003, 0., 1.29032256e-002, 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., 6.45161280e-003, 0., + 0., 6.45161280e-003, 0., 0., 0., 0., 6.45161280e-003, 0., 0., + 6.45161280e-003, 0., 1.29032256e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.29032256e-002, 0., 6.45161280e-003, 0., 0., 0., + 0., 6.45161280e-003, 0., 1.29032256e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 6.45161280e-003, + 6.45161280e-003, 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 6.45161280e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., + 1.29032256e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.45161280e-003, 0., 0., 0., 1.29032256e-002, 0., 0., 0., 0., + 0., 0., 6.45161280e-003, 6.45161280e-003, 6.45161280e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.29032256e-002, 0., 0., + 1.93548389e-002, 0., 0., 0., 0., 0., 0., 0., 6.45161280e-003, 0., + 0., 1.29032256e-002, 0., 0., 6.45161280e-003, 0., 0., 0., 0., 0., + 1.29032256e-002, 6.45161280e-003, 0., 0., 0., 0., 6.45161280e-003, + 6.45161280e-003, 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, + 1.51515156e-002, 5.05050505e-003, 2.02020202e-002, + 5.05050505e-003, 0., 0., 1.01010101e-002, 5.05050505e-003, 0., 0., + 5.05050505e-003, 2.52525248e-002, 0., 5.05050505e-003, + 5.05050505e-003, 1.01010101e-002, 5.05050505e-003, 0., 0., 0., 0., + 1.01010101e-002, 0., 0., 0., 1.01010101e-002, 0., 5.05050505e-003, + 2.02020202e-002, 0., 5.05050505e-003, 0., 1.01010101e-002, 0., 0., + 5.05050505e-003, 0., 5.05050505e-003, 5.05050505e-003, 0., 0., + 5.05050505e-003, 1.51515156e-002, 0., 2.02020202e-002, 0., + 1.51515156e-002, 5.05050505e-003, 0., 0., 5.05050505e-003, + 5.05050505e-003, 5.05050505e-003, 5.05050505e-003, + 5.05050505e-003, 0., 5.05050505e-003, 0., 0., 5.05050505e-003, 0., + 1.01010101e-002, 0., 0., 5.05050505e-003, 0., 5.05050505e-003, + 1.01010101e-002, 0., 2.52525248e-002, 0., 5.05050505e-003, 0., + 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., + 5.05050505e-003, 5.05050505e-003, 1.01010101e-002, 0., 0., 0., + 1.51515156e-002, 1.01010101e-002, 5.05050505e-003, 0., 0., + 5.05050505e-003, 0., 0., 5.05050505e-003, 5.05050505e-003, + 5.05050505e-003, 0., 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.05050505e-003, 0., 0., 5.05050505e-003, + 5.05050505e-003, 0., 0., 4.54545468e-002, 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 1.01010101e-002, 0., 0., 0., 0., + 5.05050505e-003, 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 5.05050505e-003, + 0., 1.01010101e-002, 0., 0., 5.05050505e-003, 5.05050505e-003, 0., + 0., 0., 1.01010101e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.01010101e-002, 0., 0., 0., 0., 0., 5.05050505e-003, 0., + 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.05050505e-003, 5.05050505e-003, 5.05050505e-003, + 5.05050505e-003, 0., 0., 5.05050505e-003, 0., 0., 5.05050505e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.02020202e-002, + 1.01010101e-002, 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.05050505e-003, 5.05050505e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 2.52525248e-002, 0., 5.05050505e-003, 0., 0., + 0., 5.05050505e-003, 0., 0., 1.01010101e-002, 0., 0., 0., 0., 0., + 0., 5.05050505e-003, 0., 0., 1.01010101e-002, 5.05050505e-003, + 5.05050505e-003, 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., 0., + 5.05050505e-003, 0., 5.05050505e-003, 0., 0., 5.05050505e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., + 2.02020202e-002, 0., 5.05050505e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.01010101e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.05050505e-003, 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., + 5.05050505e-003, 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., + 5.05050505e-003, 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., + 1.01010101e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.05050505e-003, 0., 5.05050505e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 1.51515156e-002, 5.05050505e-003, 0., + 1.01010101e-002, 0., 0., 0., 0., 0., 0., 0., 1.01010101e-002, 0., + 0., 0., 0., 5.05050505e-003, 0., 5.05050505e-003, 5.05050505e-003, + 0., 0., 0., 0., 0., 0., 5.05050505e-003, 0., 0., 5.05050505e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.05050505e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.01010101e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.05050505e-003, 0., 0., 0., 5.05050505e-003, 0., + 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., 5.05050505e-003, 0., + 0., 0., 0., 5.05050505e-003, 0., 0., 0., 0., 0., 5.05050505e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.65289249e-002, 0., + 8.26446246e-003, 1.65289249e-002, 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 1.65289249e-002, 8.26446246e-003, 0., 0., + 8.26446246e-003, 0., 8.26446246e-003, 8.26446246e-003, 0., + 8.26446246e-003, 8.26446246e-003, 1.65289249e-002, + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 1.65289249e-002, + 1.65289249e-002, 0., 8.26446246e-003, 8.26446246e-003, 0., 0., 0., + 2.47933865e-002, 1.65289249e-002, 0., 0., 0., 2.47933865e-002, 0., + 8.26446246e-003, 0., 8.26446246e-003, 2.47933865e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.47933865e-002, 0., 0., 0., + 1.65289249e-002, 2.47933865e-002, 0., 0., 0., 8.26446246e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., + 0., 0., 0., 0., 8.26446246e-003, 0., 0., 8.26446246e-003, 0., 0., + 0., 0., 0., 1.65289249e-002, 0., 0., 0., 0., 8.26446246e-003, 0., + 0., 0., 1.65289249e-002, 0., 1.65289249e-002, 0., 0., 0., 0., 0., + 3.30578499e-002, 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., + 0., 0., 8.26446246e-003, 0., 0., 0., 0., 8.26446246e-003, 0., + 8.26446246e-003, 0., 0., 0., 1.65289249e-002, 0., 0., 0., 0., 0., + 0., 0., 8.26446246e-003, 0., 8.26446246e-003, 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 1.65289249e-002, 0., + 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.26446246e-003, 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.47933865e-002, 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., + 8.26446246e-003, 0., 8.26446246e-003, 0., 0., 0., 8.26446246e-003, + 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.65289249e-002, 0., 0., 8.26446246e-003, + 8.26446246e-003, 0., 0., 0., 0., 1.65289249e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 2.47933865e-002, 8.26446246e-003, + 0., 0., 0., 0., 2.47933865e-002, 8.26446246e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., + 0., 0., 0., 0., 0., 1.65289249e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.26446246e-003, 0., 0., 8.26446246e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.26446246e-003, 0., 2.47933865e-002, 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 8.26446246e-003, 0., 8.26446246e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.26446246e-003, 0., 8.26446246e-003, 0., 0., 0., 0., 0., + 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.26446246e-003, 0., 0., 0., 0., 0., + 1.71428565e-002, 0., 0., 5.71428565e-003, 5.71428565e-003, + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 5.71428565e-003, + 1.14285713e-002, 0., 0., 1.14285713e-002, 0., 1.71428565e-002, 0., + 0., 0., 5.71428565e-003, 1.71428565e-002, 1.14285713e-002, + 5.71428565e-003, 0., 0., 1.71428565e-002, 1.71428565e-002, 0., + 5.71428565e-003, 0., 0., 1.71428565e-002, 1.71428565e-002, + 5.71428565e-003, 0., 0., 1.14285713e-002, 0., 0., 0., 0., + 1.71428565e-002, 5.71428565e-003, 0., 5.71428565e-003, 0., + 2.85714287e-002, 0., 0., 0., 0., 0., 5.71428565e-003, + 1.71428565e-002, 0., 1.14285713e-002, 5.71428565e-003, 0., 0., 0., + 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 5.71428565e-003, 0., + 5.71428565e-003, 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.14285713e-002, 0., 0., + 5.71428565e-003, 5.71428565e-003, 0., 5.71428565e-003, 0., + 1.14285713e-002, 0., 0., 5.71428565e-003, 0., 0., 5.71428565e-003, + 0., 0., 0., 0., 5.71428565e-003, 0., 5.71428565e-003, 0., + 1.14285713e-002, 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., + 0., 1.14285713e-002, 0., 0., 0., 0., 2.28571426e-002, 0., 0., 0., + 5.71428575e-002, 0., 0., 1.71428565e-002, 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 1.14285713e-002, 0., + 1.14285713e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 5.71428565e-003, 1.71428565e-002, + 1.14285713e-002, 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., + 0., 0., 5.71428565e-003, 5.71428565e-003, 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 1.14285713e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.71428565e-003, 5.71428565e-003, 0., 0., + 5.71428565e-003, 0., 0., 1.14285713e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 1.14285713e-002, 0., 5.71428565e-003, 1.14285713e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 1.14285713e-002, 0., 0., 5.71428565e-003, 0., 5.71428565e-003, 0., + 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.14285713e-002, 0., 0., 0., + 0., 5.71428565e-003, 0., 0., 0., 0., 0., 1.14285713e-002, 0., 0., + 0., 0., 0., 1.14285713e-002, 0., 5.71428565e-003, 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 1.14285713e-002, 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., + 0., 5.71428565e-003, 5.71428565e-003, 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.71428565e-003, 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, + 5.71428565e-003, 0., 5.71428565e-003, 5.71428565e-003, 0., 0., 0., + 0., 0., 0., 5.71428565e-003, 0., 0., 0., 5.71428565e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, 0., 5.71428565e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.71428565e-003, + 5.71428565e-003, 0., 0., 5.71428565e-003, 0., 5.71428565e-003, 0., + 0., 0., 0., 0., 0., 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.71428565e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.14942528e-002, 1.14942528e-002, 1.72413792e-002, + 5.74712642e-003, 5.74712642e-003, 0., 0., 5.74712642e-003, 0., 0., + 5.74712642e-003, 0., 1.72413792e-002, 0., 0., 0., 0., + 5.74712642e-003, 5.74712642e-003, 0., 0., 0., 1.14942528e-002, 0., + 0., 5.74712642e-003, 5.74712642e-003, 5.74712642e-003, + 1.14942528e-002, 1.14942528e-002, 5.74712642e-003, + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 1.72413792e-002, + 5.74712642e-003, 0., 0., 0., 0., 5.74712642e-003, 1.72413792e-002, + 5.74712642e-003, 1.14942528e-002, 1.14942528e-002, 0., 0., 0., 0., + 5.74712642e-003, 0., 5.74712642e-003, 0., 5.74712642e-003, 0., + 1.72413792e-002, 0., 0., 5.74712642e-003, 5.74712642e-003, 0., 0., + 0., 0., 5.74712642e-003, 5.74712642e-003, 5.74712642e-003, 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14942528e-002, 0., 0., 0., 0., 0., 0., 5.74712642e-003, + 5.74712642e-003, 0., 5.74712642e-003, 5.74712642e-003, + 5.74712642e-003, 0., 5.74712642e-003, 5.74712642e-003, 0., 0., 0., + 0., 5.74712642e-003, 0., 0., 0., 0., 5.74712642e-003, 0., 0., + 5.74712642e-003, 5.74712642e-003, 0., 0., 1.72413792e-002, 0., + 5.74712642e-003, 5.74712642e-003, 0., 0., 0., 0., 0., + 5.74712642e-003, 1.72413792e-002, 0., 0., 5.74712642e-003, + 2.87356321e-002, 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 1.14942528e-002, 5.74712642e-003, 5.74712642e-003, + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 5.74712642e-003, 0., 0., 0., 0., + 5.74712642e-003, 0., 1.14942528e-002, 0., 0., 5.74712642e-003, 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.74712642e-003, 0., 1.14942528e-002, + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 1.14942528e-002, 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., + 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.14942528e-002, 0., 0., 5.74712642e-003, 0., 0., 5.74712642e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., + 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 1.14942528e-002, + 0., 0., 5.74712642e-003, 0., 0., 0., 0., 5.74712642e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 2.87356321e-002, 0., 0., 0., 1.14942528e-002, 0., 0., 0., 0., + 1.14942528e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.74712642e-003, 5.74712642e-003, 0., 1.14942528e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., + 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.14942528e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 5.74712642e-003, 0., 5.74712642e-003, + 1.14942528e-002, 0., 1.14942528e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.72413792e-002, 0., + 0., 5.74712642e-003, 0., 0., 0., 0., 0., 1.14942528e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., + 1.14942528e-002, 0., 0., 5.74712642e-003, 0., 0., 5.74712642e-003, + 5.74712642e-003, 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 1.14942528e-002, 0., 0., 1.14942528e-002, 0., + 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., + 5.74712642e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.14942528e-002, 0., 0., + 5.74712642e-003, 0., 0., 0., 5.74712642e-003, 0., 5.74712642e-003, + 0., 0., 0., 0., 0., 0., 5.74712642e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 1.14942528e-002, 0., 0., 0., 5.74712642e-003, + 1.14942528e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.14942528e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 1.40845068e-002, 2.11267602e-002, 7.04225339e-003, + 7.04225339e-003, 0., 1.40845068e-002, 0., 1.40845068e-002, + 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., 7.04225339e-003, + 2.81690136e-002, 0., 0., 0., 7.04225339e-003, 0., 0., + 2.11267602e-002, 0., 0., 0., 7.04225339e-003, 0., 7.04225339e-003, + 0., 7.04225339e-003, 0., 0., 2.11267602e-002, 7.04225339e-003, 0., + 0., 0., 2.11267602e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.40845068e-002, 0., 0., 0., 0., 0., 0., 1.40845068e-002, + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 2.11267602e-002, 0., + 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 7.04225339e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 2.11267602e-002, 0., 0., 7.04225339e-003, 7.04225339e-003, 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, + 7.04225339e-003, 7.04225339e-003, 0., 0., 7.04225339e-003, + 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 2.81690136e-002, 0., 7.04225339e-003, 0., 3.52112651e-002, + 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 7.04225339e-003, 1.40845068e-002, 7.04225339e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 7.04225339e-003, 0., 0., 0., 1.40845068e-002, 0., 7.04225339e-003, + 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 7.04225339e-003, 0., 0., 0., 7.04225339e-003, 0., 0., 0., + 1.40845068e-002, 0., 0., 0., 0., 1.40845068e-002, 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 7.04225339e-003, + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 2.11267602e-002, 7.04225339e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, + 1.40845068e-002, 0., 0., 7.04225339e-003, 0., 0., 7.04225339e-003, + 0., 0., 7.04225339e-003, 0., 0., 0., 7.04225339e-003, 0., 0., + 7.04225339e-003, 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 7.04225339e-003, 0., + 0., 7.04225339e-003, 7.04225339e-003, 0., 0., 2.81690136e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., 0., + 1.40845068e-002, 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 2.11267602e-002, 0., 0., 0., 0., 0., 0., + 0., 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., + 7.04225339e-003, 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 7.04225339e-003, 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.04225339e-003, 0., 0., 0., 0., 0., + 1.40845068e-002, 0., 0., 0., 0., 0., 9.43396240e-003, + 1.88679248e-002, 0., 0., 1.88679248e-002, 0., 9.43396240e-003, 0., + 0., 0., 0., 9.43396240e-003, 9.43396240e-003, 0., 9.43396240e-003, + 0., 9.43396240e-003, 0., 0., 0., 0., 1.88679248e-002, + 9.43396240e-003, 2.83018872e-002, 0., 1.88679248e-002, 0., + 9.43396240e-003, 0., 0., 0., 0., 9.43396240e-003, 9.43396240e-003, + 9.43396240e-003, 0., 9.43396240e-003, 9.43396240e-003, + 9.43396240e-003, 0., 0., 0., 1.88679248e-002, 0., 0., + 9.43396240e-003, 0., 0., 0., 9.43396240e-003, 9.43396240e-003, 0., + 9.43396240e-003, 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 9.43396240e-003, 9.43396240e-003, 9.43396240e-003, 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 9.43396240e-003, 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., + 0., 0., 9.43396240e-003, 0., 0., 0., 9.43396240e-003, 0., + 9.43396240e-003, 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 9.43396240e-003, 0., + 0., 0., 0., 0., 0., 6.60377368e-002, 0., 9.43396240e-003, 0., + 5.66037744e-002, 0., 0., 9.43396240e-003, 0., 9.43396240e-003, 0., + 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 9.43396240e-003, + 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 1.88679248e-002, 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 9.43396240e-003, 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, + 9.43396240e-003, 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 9.43396240e-003, 0., 1.88679248e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., + 0., 0., 1.88679248e-002, 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., + 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., + 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.88679248e-002, 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 9.43396240e-003, 0., 0., 1.88679248e-002, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.43396240e-003, 0., 0., 9.43396240e-003, + 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 1.88679248e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 9.43396240e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 9.43396240e-003, 9.43396240e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 9.43396240e-003, 0., 9.43396240e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 8.92857183e-003, 0., 1.78571437e-002, 0., 0., 8.92857183e-003, 0., + 0., 8.92857183e-003, 0., 8.92857183e-003, 0., 0., 1.78571437e-002, + 0., 0., 0., 8.92857183e-003, 0., 0., 0., 4.46428582e-002, 0., + 1.78571437e-002, 0., 0., 8.92857183e-003, 0., 2.67857164e-002, + 1.78571437e-002, 0., 0., 8.92857183e-003, 8.92857183e-003, 0., 0., + 0., 0., 8.92857183e-003, 0., 1.78571437e-002, 0., 1.78571437e-002, + 2.67857164e-002, 0., 1.78571437e-002, 0., 0., 0., 0., + 1.78571437e-002, 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 8.92857183e-003, 1.78571437e-002, 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 0., 0., 0., 8.92857183e-003, 0., 8.92857183e-003, 0., 0., 0., 0., + 0., 0., 0., 1.78571437e-002, 0., 0., 0., 3.57142873e-002, 0., 0., + 1.78571437e-002, 8.92857183e-003, 0., 1.78571437e-002, 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.92857183e-003, 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.92857183e-003, 4.46428582e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, + 8.92857183e-003, 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 8.92857183e-003, 8.92857183e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.78571437e-002, 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 8.92857183e-003, 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.92857183e-003, 0., 8.92857183e-003, 0., + 8.92857183e-003, 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., + 8.92857183e-003, 0., 0., 8.92857183e-003, 0., 0., 0., 0., + 2.67857164e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 8.92857183e-003, 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., + 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, 0., + 6.57894742e-003, 1.31578948e-002, 0., 6.57894742e-003, 0., 0., + 6.57894742e-003, 1.31578948e-002, 0., 0., 6.57894742e-003, 0., + 6.57894742e-003, 6.57894742e-003, 0., 6.57894742e-003, 0., 0., + 6.57894742e-003, 6.57894742e-003, 6.57894742e-003, 0., 0., + 6.57894742e-003, 0., 0., 0., 0., 0., 1.31578948e-002, 0., + 6.57894742e-003, 6.57894742e-003, 0., 0., 0., 6.57894742e-003, 0., + 0., 0., 0., 6.57894742e-003, 0., 0., 1.31578948e-002, 0., + 4.60526310e-002, 0., 0., 1.31578948e-002, 0., 0., 6.57894742e-003, + 6.57894742e-003, 0., 1.31578948e-002, 1.31578948e-002, + 1.31578948e-002, 0., 0., 6.57894742e-003, 1.31578948e-002, 0., 0., + 0., 0., 0., 0., 6.57894742e-003, 0., 6.57894742e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., 0., + 6.57894742e-003, 0., 0., 0., 6.57894742e-003, 0., 6.57894742e-003, + 6.57894742e-003, 0., 0., 1.97368413e-002, 6.57894742e-003, + 6.57894742e-003, 0., 0., 0., 6.57894742e-003, 0., 0., 0., 0., 0., + 0., 6.57894742e-003, 6.57894742e-003, 0., 0., 0., 6.57894742e-003, + 6.57894742e-003, 6.57894742e-003, 0., 1.31578948e-002, 0., 0., 0., + 0., 2.63157897e-002, 0., 0., 0., 2.63157897e-002, 6.57894742e-003, + 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., 0., 0., 0., + 6.57894742e-003, 6.57894742e-003, 6.57894742e-003, 0., 0., 0., + 1.31578948e-002, 6.57894742e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.57894742e-003, 0., 0., 1.31578948e-002, 1.97368413e-002, + 6.57894742e-003, 0., 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, 0., + 0., 0., 1.31578948e-002, 6.57894742e-003, 0., 6.57894742e-003, + 6.57894742e-003, 0., 0., 0., 0., 6.57894742e-003, 0., + 6.57894742e-003, 0., 6.57894742e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.31578948e-002, 0., + 1.31578948e-002, 0., 1.31578948e-002, 0., 0., 0., 0., + 1.31578948e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.57894742e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.57894742e-003, 6.57894742e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, 2.63157897e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.31578948e-002, 6.57894742e-003, 0., 6.57894742e-003, 0., 0., + 1.31578948e-002, 6.57894742e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.57894742e-003, 0., 0., 0., 6.57894742e-003, 0., 0., + 6.57894742e-003, 0., 0., 6.57894742e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., 0., 0., 0., + 6.57894742e-003, 6.57894742e-003, 0., 0., 0., 0., 0., 0., + 6.57894742e-003, 0., 0., 0., 0., 0., 0., 1.31578948e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.31578948e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 2.63157897e-002, 0., 0., 0., 0., 0., 6.57894742e-003, 0., 0., + 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.57894742e-003, 0., 0., 6.57894742e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.57894742e-003, + 0., 6.57894742e-003, 0., 0., 0., 0., 1.31578948e-002, 0., 0., 0., + 0., 0., 0., 0., 6.57894742e-003, 0., 6.57894742e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.57894742e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.57894742e-003, 0., 0., 0., 0., 6.57894742e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 6.13496918e-003, + 6.13496918e-003, 6.13496918e-003, 2.45398767e-002, 0., + 6.13496918e-003, 6.13496918e-003, 0., 0., 0., 1.22699384e-002, 0., + 0., 1.22699384e-002, 0., 0., 6.13496918e-003, 0., 1.22699384e-002, + 0., 1.84049085e-002, 0., 0., 6.13496918e-003, 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 1.22699384e-002, 1.22699384e-002, + 1.22699384e-002, 0., 0., 1.84049085e-002, 0., 0., 0., + 6.13496918e-003, 1.84049085e-002, 0., 0., 0., 6.13496918e-003, + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, + 6.13496918e-003, 0., 6.13496918e-003, 0., 6.13496918e-003, 0., 0., + 0., 1.22699384e-002, 6.13496918e-003, 0., 6.13496918e-003, 0., 0., + 0., 1.22699384e-002, 0., 0., 1.22699384e-002, 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., + 0., 0., 0., 3.06748450e-002, 0., 6.13496918e-003, 0., 0., 0., 0., + 0., 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 6.13496918e-003, 0., + 0., 0., 0., 1.84049085e-002, 6.13496918e-003, 0., 1.22699384e-002, + 3.68098170e-002, 0., 0., 0., 6.13496918e-003, 1.84049085e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.84049085e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 1.84049085e-002, + 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 2.45398767e-002, 0., 6.13496918e-003, 0., 0., + 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., + 6.13496918e-003, 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 2.45398767e-002, 0., 0., + 6.13496918e-003, 0., 6.13496918e-003, 0., 0., 0., 6.13496918e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 6.13496918e-003, 0., 6.13496918e-003, + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, 6.13496918e-003, + 0., 0., 0., 1.22699384e-002, 0., 0., 6.13496918e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.22699384e-002, 0., 6.13496918e-003, 0., 0., 0., 6.13496918e-003, + 0., 0., 0., 1.84049085e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 1.22699384e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.13496918e-003, 0., 0., 6.13496918e-003, 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 1.84049085e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.22699384e-002, 0., 0., 0., 0., 0., 0., + 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 6.13496918e-003, + 1.22699384e-002, 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 6.13496918e-003, 0., 0., 6.13496918e-003, 6.13496918e-003, 0., + 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., 0., + 6.13496918e-003, 0., 0., 0., 0., 0., 0., 6.13496918e-003, 0., + 2.45398767e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.22699384e-002, 0., 6.13496918e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.13496918e-003, 0., 0., 0., 0., 6.13496918e-003, + 0., 0., 0., 0., 0., 7.63358781e-003, 7.63358781e-003, + 7.63358781e-003, 1.52671756e-002, 7.63358781e-003, 0., 0., + 7.63358781e-003, 7.63358781e-003, 0., 1.52671756e-002, + 7.63358781e-003, 0., 7.63358781e-003, 0., 7.63358781e-003, 0., 0., + 0., 0., 0., 7.63358781e-003, 7.63358781e-003, 0., 0., 0., + 3.05343512e-002, 0., 2.29007639e-002, 1.52671756e-002, 0., + 7.63358781e-003, 0., 7.63358781e-003, 7.63358781e-003, 0., + 7.63358781e-003, 0., 7.63358781e-003, 0., 0., 0., 0., + 1.52671756e-002, 0., 0., 0., 2.29007639e-002, 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 7.63358781e-003, 0., + 7.63358781e-003, 0., 0., 7.63358781e-003, 7.63358781e-003, + 7.63358781e-003, 0., 7.63358781e-003, 0., 0., 0., 7.63358781e-003, + 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 7.63358781e-003, 0., + 0., 0., 0., 0., 7.63358781e-003, 0., 0., 0., 7.63358781e-003, 0., + 0., 0., 0., 7.63358781e-003, 7.63358781e-003, 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.63358781e-003, 7.63358781e-003, 0., 0., 0., 0., 3.81679386e-002, + 7.63358781e-003, 7.63358781e-003, 0., 3.81679386e-002, + 1.52671756e-002, 0., 0., 1.52671756e-002, 7.63358781e-003, + 1.52671756e-002, 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 1.52671756e-002, 0., 0., 0., 0., 0., 0., 0., 7.63358781e-003, 0., + 1.52671756e-002, 0., 0., 0., 0., 0., 0., 7.63358781e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 0., 0., 1.52671756e-002, 0., 0., + 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 7.63358781e-003, + 0., 0., 0., 0., 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 3.05343512e-002, 0., 0., 0., + 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.63358781e-003, 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 7.63358781e-003, 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 7.63358781e-003, 0., 0., 7.63358781e-003, + 7.63358781e-003, 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 1.52671756e-002, 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 7.63358781e-003, 7.63358781e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.52671756e-002, 0., + 0., 0., 0., 7.63358781e-003, 0., 0., 0., 0., 2.29007639e-002, 0., + 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 0., 0., 7.63358781e-003, 0., 0., + 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 7.63358781e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.63358781e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 2.29007639e-002, 0., 0., 7.63358781e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.52671756e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 7.63358781e-003, 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.63358781e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 7.63358781e-003, 0., 0., 0., 0., 0., 7.81250000e-003, + 0., 1.56250000e-002, 1.56250000e-002, 7.81250000e-003, + 3.12500000e-002, 0., 1.56250000e-002, 7.81250000e-003, 0., + 7.81250000e-003, 7.81250000e-003, 7.81250000e-003, 0., 0., + 7.81250000e-003, 7.81250000e-003, 7.81250000e-003, + 7.81250000e-003, 7.81250000e-003, 7.81250000e-003, + 7.81250000e-003, 0., 0., 0., 0., 7.81250000e-003, 0., 0., + 1.56250000e-002, 7.81250000e-003, 2.34375000e-002, 0., 0., 0., 0., + 0., 0., 2.34375000e-002, 0., 0., 7.81250000e-003, 0., + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 2.34375000e-002, 0., + 7.81250000e-003, 7.81250000e-003, 0., 0., 1.56250000e-002, 0., 0., + 0., 0., 0., 0., 0., 7.81250000e-003, 7.81250000e-003, + 7.81250000e-003, 7.81250000e-003, 0., 0., 1.56250000e-002, + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.56250000e-002, 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 7.81250000e-003, 0., + 0., 7.81250000e-003, 0., 1.56250000e-002, 0., 0., 0., + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., + 0., 7.81250000e-003, 7.81250000e-003, 0., 0., 0., 0., + 3.90625000e-002, 0., 0., 0., 2.34375000e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 7.81250000e-003, + 0., 0., 0., 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.56250000e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 7.81250000e-003, 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 7.81250000e-003, 0., + 7.81250000e-003, 0., 0., 0., 7.81250000e-003, 0., 7.81250000e-003, + 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., + 1.56250000e-002, 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, + 0., 0., 0., 2.34375000e-002, 0., 0., 0., 0., 0., 7.81250000e-003, + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, + 7.81250000e-003, 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., + 0., 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.81250000e-003, 0., 0., 0., 0., 7.81250000e-003, + 3.12500000e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 1.56250000e-002, 7.81250000e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., + 0., 0., 0., 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 7.81250000e-003, 0., 0., 0., 0., + 7.81250000e-003, 0., 0., 7.81250000e-003, 0., 0., 0., + 7.81250000e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.78571437e-002, 1.78571437e-002, 0., 8.92857183e-003, 0., 0., + 8.92857183e-003, 0., 0., 0., 8.92857183e-003, 8.92857183e-003, 0., + 0., 0., 0., 0., 8.92857183e-003, 8.92857183e-003, 0., + 8.92857183e-003, 0., 0., 0., 2.67857164e-002, 0., 0., + 2.67857164e-002, 0., 1.78571437e-002, 0., 2.67857164e-002, 0., 0., + 0., 0., 1.78571437e-002, 1.78571437e-002, 0., 0., 0., 0., 0., 0., + 3.57142873e-002, 0., 1.78571437e-002, 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 8.92857183e-003, 0., 0., 0., 0., + 8.92857183e-003, 0., 8.92857183e-003, 8.92857183e-003, 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 8.92857183e-003, 0., 0., 8.92857183e-003, 0., 0., + 0., 8.92857183e-003, 1.78571437e-002, 0., 0., 0., 8.92857183e-003, + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.78571437e-002, 0., 0., 0., 0., 0., 8.92857183e-003, 0., + 1.78571437e-002, 0., 0., 0., 1.78571437e-002, 8.92857183e-003, 0., + 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, + 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 8.92857183e-003, 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 8.92857183e-003, 8.92857183e-003, 0., 0., 0., + 0., 0., 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 5.35714328e-002, 0., 1.78571437e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., + 1.78571437e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 1.78571437e-002, 0., 0., + 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 8.92857183e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, + 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.92857183e-003, + 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.92857183e-003, 0., 0., 0., 0., 0., + 8.92857183e-003, 0., 0., 1.78571437e-002, 0., 0., 0., 0., 0., 0., + 0., 8.92857183e-003, 0., 0., 8.92857183e-003, 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.92857183e-003, 8.92857183e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.78571437e-002, 8.92857183e-003, 0., 0., 0., + 8.92857183e-003, 0., 0., 0., 0., 0., 6.80272095e-003, 0., + 6.80272095e-003, 0., 0., 4.08163257e-002, 0., 6.80272095e-003, + 1.36054419e-002, 6.80272095e-003, 0., 0., 6.80272095e-003, + 1.36054419e-002, 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 0., + 0., 0., 6.80272095e-003, 0., 0., 6.80272095e-003, 2.04081628e-002, + 0., 6.80272095e-003, 0., 0., 6.80272095e-003, 0., 2.04081628e-002, + 6.80272095e-003, 0., 0., 0., 2.72108838e-002, 6.80272095e-003, 0., + 0., 0., 6.80272095e-003, 0., 0., 0., 0., 1.36054419e-002, + 6.80272095e-003, 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 0., 0., 0., 0., 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 0., + 0., 6.80272095e-003, 0., 1.36054419e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., + 0., 6.80272095e-003, 0., 0., 0., 0., 0., 1.36054419e-002, + 1.36054419e-002, 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 2.04081628e-002, 0., + 0., 0., 0., 0., 0., 0., 1.36054419e-002, 0., 0., 6.80272095e-003, + 4.08163257e-002, 0., 0., 0., 0., 6.80272095e-003, 0., 0., + 2.04081628e-002, 0., 0., 0., 0., 6.80272095e-003, 1.36054419e-002, + 0., 0., 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 0., + 6.80272095e-003, 0., 0., 6.80272095e-003, 4.08163257e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, + 1.36054419e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 4.76190448e-002, 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.36054419e-002, 0., 0., + 0., 0., 6.80272095e-003, 0., 1.36054419e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 6.80272095e-003, 0., + 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 2.04081628e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., + 2.04081628e-002, 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., + 1.36054419e-002, 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 0., 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., + 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 2.04081628e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.36054419e-002, 0., 0., 0., 0., 0., 6.80272095e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., + 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 1.36054419e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.36054419e-002, 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 6.80272095e-003, 0., + 0., 0., 0., 0., 1.36054419e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., + 0., 0., 1.36054419e-002, 0., 6.80272095e-003, 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 6.80272095e-003, 0., 6.80272095e-003, + 0., 0., 1.36054419e-002, 0., 6.80272095e-003, 0., 0., 0., 0., + 1.36054419e-002, 1.36054419e-002, 1.36054419e-002, + 6.80272095e-003, 6.80272095e-003, 0., 6.80272095e-003, 0., 0., + 6.80272095e-003, 6.80272095e-003, 6.80272095e-003, 0., 0., 0., 0., + 1.36054419e-002, 6.80272095e-003, 6.80272095e-003, 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 0., 6.80272095e-003, + 6.80272095e-003, 0., 0., 6.80272095e-003, 6.80272095e-003, + 6.80272095e-003, 0., 0., 0., 1.36054419e-002, 3.40136066e-002, + 6.80272095e-003, 0., 0., 0., 1.36054419e-002, 6.80272095e-003, + 6.80272095e-003, 6.80272095e-003, 0., 0., 6.80272095e-003, 0., 0., + 6.80272095e-003, 0., 6.80272095e-003, 0., 0., 6.80272095e-003, + 6.80272095e-003, 0., 1.36054419e-002, 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, + 1.36054419e-002, 0., 0., 0., 0., 1.36054419e-002, 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 6.80272095e-003, 0., 6.80272095e-003, + 0., 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 6.80272095e-003, 0., 1.36054419e-002, 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., + 2.04081628e-002, 2.04081628e-002, 0., 6.80272095e-003, 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.36054419e-002, 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., + 1.36054419e-002, 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, + 0., 0., 0., 0., 1.36054419e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 6.80272095e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, + 0., 0., 0., 6.80272095e-003, 6.80272095e-003, 6.80272095e-003, 0., + 6.80272095e-003, 0., 0., 6.80272095e-003, 6.80272095e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., + 6.80272095e-003, 1.36054419e-002, 6.80272095e-003, 0., + 1.36054419e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.80272095e-003, 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.36054419e-002, 0., 2.04081628e-002, 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 6.80272095e-003, + 6.80272095e-003, 0., 0., 6.80272095e-003, 6.80272095e-003, 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 3.40136066e-002, 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 6.80272095e-003, 0., 0., + 6.80272095e-003, 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., + 6.80272095e-003, 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.80272095e-003, 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., + 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.80272095e-003, 0., 0., 6.80272095e-003, 0., 0., 0., 0., + 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.80272095e-003, + 0., 0., 0., 0., 6.80272095e-003, 6.80272095e-003, 0., 0., 0., 0., + 0., 0., 6.80272095e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 6.80272095e-003, 0., 0., 0., 6.80272095e-003, 0., 1.66666675e-002, + 8.33333377e-003, 0., 0., 0., 8.33333377e-003, 0., 1.66666675e-002, + 0., 8.33333377e-003, 8.33333377e-003, 0., 1.66666675e-002, 0., + 8.33333377e-003, 8.33333377e-003, 8.33333377e-003, + 8.33333377e-003, 8.33333377e-003, 1.66666675e-002, 0., 0., + 1.66666675e-002, 8.33333377e-003, 8.33333377e-003, 0., 0., 0., 0., + 1.66666675e-002, 0., 0., 0., 8.33333377e-003, 0., 0., + 8.33333377e-003, 0., 0., 8.33333377e-003, 0., 8.33333377e-003, 0., + 8.33333377e-003, 0., 8.33333377e-003, 0., 8.33333377e-003, + 1.66666675e-002, 0., 0., 1.66666675e-002, 0., 0., 0., + 8.33333377e-003, 0., 8.33333377e-003, 1.66666675e-002, 0., 0., 0., + 0., 0., 0., 8.33333377e-003, 0., 8.33333377e-003, 8.33333377e-003, + 0., 8.33333377e-003, 0., 1.66666675e-002, 0., 0., 0., 0., + 8.33333377e-003, 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 8.33333377e-003, 0., 0., 0., 1.66666675e-002, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.66666675e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 8.33333377e-003, + 8.33333377e-003, 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.33333377e-003, 8.33333377e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.66666675e-002, + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 8.33333377e-003, 8.33333377e-003, 0., 0., + 8.33333377e-003, 0., 0., 8.33333377e-003, 0., 0., 0., 0., + 8.33333377e-003, 0., 8.33333377e-003, 1.66666675e-002, + 8.33333377e-003, 0., 0., 0., 8.33333377e-003, 0., 1.66666675e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 3.33333351e-002, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 1.66666675e-002, 0., + 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 1.66666675e-002, 0., + 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 8.33333377e-003, 0., 0., + 8.33333377e-003, 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.33333377e-003, 0., 8.33333377e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 1.66666675e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.66666675e-002, 8.33333377e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 8.33333377e-003, 0., 0., 0., + 1.66666675e-002, 0., 0., 0., 0., 0., 0., 0., 1.66666675e-002, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 8.33333377e-003, + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 8.33333377e-003, 0., 0., 0., 0., 0., 0., + 8.33333377e-003, 0., 0., 0., 0., 0., 0., 0., 5.10204071e-003, 0., + 0., 0., 1.53061226e-002, 1.02040814e-002, 0., 2.55102031e-002, + 5.10204071e-003, 1.02040814e-002, 5.10204071e-003, + 1.53061226e-002, 1.02040814e-002, 1.53061226e-002, + 1.53061226e-002, 0., 5.10204071e-003, 0., 1.02040814e-002, 0., 0., + 5.10204071e-003, 0., 0., 1.02040814e-002, 5.10204071e-003, + 5.10204071e-003, 0., 0., 0., 5.10204071e-003, 0., 5.10204071e-003, + 2.04081628e-002, 5.10204071e-003, 2.04081628e-002, + 5.10204071e-003, 0., 5.10204071e-003, 0., 1.02040814e-002, 0., + 5.10204071e-003, 1.02040814e-002, 1.02040814e-002, 0., + 1.53061226e-002, 0., 0., 5.10204071e-003, 0., 0., 0., 0., + 5.10204071e-003, 0., 0., 5.10204071e-003, 0., 0., 0., 0., 0., + 1.53061226e-002, 0., 5.10204071e-003, 0., 5.10204071e-003, + 5.10204071e-003, 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.10204071e-003, 0., 0., 0., 0., 5.10204071e-003, + 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., 5.10204071e-003, + 1.53061226e-002, 5.10204071e-003, 0., 0., 0., 0., 1.02040814e-002, + 0., 1.53061226e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.02040814e-002, 0., 0., 1.53061226e-002, 0., 0., 0., 0., + 1.02040814e-002, 0., 0., 0., 1.53061226e-002, 0., 0., 0., 0., + 5.10204071e-003, 1.53061226e-002, 0., 5.10204071e-003, 0., 0., 0., + 0., 5.10204071e-003, 0., 0., 0., 1.02040814e-002, 0., 0., + 5.10204071e-003, 0., 5.10204071e-003, 0., 0., 0., 5.10204071e-003, + 5.10204071e-003, 0., 0., 5.10204071e-003, 1.02040814e-002, 0., 0., + 0., 5.10204071e-003, 1.02040814e-002, 0., 0., 5.10204071e-003, 0., + 0., 0., 0., 0., 5.10204071e-003, 0., 0., 0., 0., 5.10204071e-003, + 5.10204071e-003, 0., 0., 0., 5.10204071e-003, 5.10204071e-003, 0., + 0., 0., 0., 5.10204071e-003, 5.10204071e-003, 0., 5.10204071e-003, + 0., 0., 0., 5.10204071e-003, 0., 0., 0., 1.53061226e-002, 0., 0., + 0., 0., 0., 0., 0., 5.10204071e-003, 0., 0., 0., 0., + 5.10204071e-003, 0., 0., 0., 5.10204071e-003, 0., 0., 0., + 5.10204071e-003, 0., 1.53061226e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 1.02040814e-002, 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.10204071e-003, 0., 5.10204071e-003, 0., 0., 0., + 0., 0., 5.10204071e-003, 0., 0., 0., 0., 5.10204071e-003, 0., 0., + 0., 0., 0., 0., 0., 1.02040814e-002, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.10204071e-003, 5.10204071e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 5.10204071e-003, 2.04081628e-002, 0., 0., 0., 0., + 0., 0., 0., 1.02040814e-002, 5.10204071e-003, 0., 0., 0., + 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 5.10204071e-003, 0., 5.10204071e-003, 5.10204071e-003, + 0., 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 1.53061226e-002, 0., 0., 0., 0., + 0., 5.10204071e-003, 0., 0., 0., 1.02040814e-002, 0., + 5.10204071e-003, 0., 0., 0., 0., 0., 0., 5.10204071e-003, 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.10204071e-003, 0., 0., 1.02040814e-002, 0., 0., 0., 0., + 0., 0., 0., 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.10204071e-003, + 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.10204071e-003, 0., 0., 0., 0., 0., 0., 0., 0., 1.02040814e-002, + 0., 0., 0., 1.02040814e-002, 5.10204071e-003, 5.10204071e-003, 0., + 0., 0., 0., 0., 0., 5.10204071e-003, 0., 0., 0., 0., 0., 0., + 5.10204071e-003, 0., 0., 5.10204071e-003, 0., 0., 5.10204071e-003, + 0., 1.53061226e-002, 0., 0., 0., 0., 0., 5.10204071e-003, 0., 0., + 0., 0., 0., 0., 0., 5.10204071e-003, 0., 0., 5.10204071e-003, 0., + 0., 5.10204071e-003, 0., 0., 0., 0., 0., 0., 5.10204071e-003, 0., + 0., 5.10204071e-003, 0., 0., 0., 1.02040814e-002, 0., 0., 0., 0., + 0., 5.10204071e-003, 0., 0., 0., 0., 5.10204071e-003, 0., 0., 0., + 0., 1.02040814e-002, 0., 0., 0., 5.10204071e-003, 5.10204071e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 1.02040814e-002, 0., 0., + 1.82926822e-002, 1.21951215e-002, 1.82926822e-002, + 1.21951215e-002, 2.43902430e-002, 0., 0., 1.21951215e-002, + 6.09756075e-003, 6.09756075e-003, 0., 6.09756075e-003, + 6.09756075e-003, 6.09756075e-003, 1.82926822e-002, 0., + 6.09756075e-003, 0., 1.82926822e-002, 0., 0., 1.21951215e-002, + 6.09756075e-003, 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., + 0., 0., 1.21951215e-002, 0., 6.09756075e-003, 1.21951215e-002, + 1.82926822e-002, 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., + 6.09756075e-003, 1.82926822e-002, 1.82926822e-002, 0., 0., + 6.09756075e-003, 0., 0., 0., 6.09756075e-003, 0., 0., 0., + 6.09756075e-003, 0., 6.09756075e-003, 0., 0., 0., 6.09756075e-003, + 0., 0., 1.82926822e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 6.09756075e-003, 0., + 1.21951215e-002, 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, + 6.09756075e-003, 6.09756075e-003, 1.21951215e-002, 0., 0., + 1.21951215e-002, 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., + 0., 0., 0., 6.09756075e-003, 0., 6.09756075e-003, 0., + 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 6.09756075e-003, 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 1.21951215e-002, 0., 0., + 6.09756075e-003, 6.09756075e-003, 1.21951215e-002, 0., 0., 0., + 6.09756075e-003, 6.09756075e-003, 0., 6.09756075e-003, 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.21951215e-002, 1.21951215e-002, 0., 0., 6.09756075e-003, 0., 0., + 0., 0., 6.09756075e-003, 0., 6.09756075e-003, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.21951215e-002, 0., 1.21951215e-002, 0., + 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 6.09756075e-003, + 0., 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 6.09756075e-003, 0., 0., 6.09756075e-003, 0., 0., + 0., 0., 6.09756075e-003, 0., 1.21951215e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 1.21951215e-002, 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 6.09756075e-003, 0., 6.09756075e-003, 0., 0., 6.09756075e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.09756075e-003, 2.43902430e-002, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 2.43902430e-002, 0., 6.09756075e-003, 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 6.09756075e-003, 0., 6.09756075e-003, 0., + 0., 0., 0., 6.09756075e-003, 6.09756075e-003, 6.09756075e-003, 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 6.09756075e-003, 1.21951215e-002, + 0., 0., 0., 0., 0., 6.09756075e-003, 0., 6.09756075e-003, 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.09756075e-003, 0., 0., 0., 0., 6.09756075e-003, 0., 0., + 0., 0., 6.09756075e-003, 0., 0., 0., 0., 6.09756075e-003, 0., 0., + 0., 0., 0., 1.21951215e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., + 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., 0., 6.09756075e-003, + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., + 6.09756075e-003, 0., 0., 0., 0., 6.09756075e-003, 0., 0., 0., + 6.09756075e-003, 6.09756075e-003, 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 6.09756075e-003, 6.09756075e-003, 0., 0., 1.21951215e-002, + 0., 0., 0., 0., 0., 0., 0., 0., 6.09756075e-003, 0., + 1.66666675e-002, 1.11111114e-002, 1.11111114e-002, + 1.66666675e-002, 0., 0., 0., 0., 1.66666675e-002, 1.11111114e-002, + 0., 0., 0., 1.11111114e-002, 0., 5.55555569e-003, 0., 0., 0., 0., + 0., 0., 2.77777780e-002, 0., 5.55555569e-003, 5.55555569e-003, + 1.11111114e-002, 0., 5.55555569e-003, 1.11111114e-002, + 5.55555569e-003, 1.11111114e-002, 0., 2.22222228e-002, 0., 0., + 5.55555569e-003, 0., 0., 5.55555569e-003, 5.55555569e-003, + 5.55555569e-003, 0., 0., 0., 1.11111114e-002, 0., 5.55555569e-003, + 3.33333351e-002, 0., 5.55555569e-003, 5.55555569e-003, 0., + 5.55555569e-003, 1.11111114e-002, 0., 0., 0., 0., 0., 0., 0., + 1.11111114e-002, 0., 0., 0., 0., 1.11111114e-002, 1.66666675e-002, + 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 1.11111114e-002, 1.11111114e-002, 0., 0., 0., 0., + 1.11111114e-002, 5.55555569e-003, 0., 0., 0., 5.55555569e-003, 0., + 0., 0., 0., 5.55555569e-003, 0., 0., 1.11111114e-002, + 5.55555569e-003, 0., 0., 5.55555569e-003, 5.55555569e-003, + 1.11111114e-002, 5.55555569e-003, 0., 5.55555569e-003, 0., 0., + 1.66666675e-002, 0., 1.11111114e-002, 0., 0., 0., 2.77777780e-002, + 0., 0., 0., 0., 0., 5.55555569e-003, 5.55555569e-003, 0., 0., + 5.55555569e-003, 0., 0., 1.11111114e-002, 0., 0., 0., + 5.55555569e-003, 0., 0., 1.11111114e-002, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., + 1.11111114e-002, 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., + 0., 1.11111114e-002, 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 5.55555569e-003, 0., 0., 0., 0., 5.55555569e-003, 0., 0., + 0., 1.11111114e-002, 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 1.11111114e-002, 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 4.44444455e-002, 0., 5.55555569e-003, 0., 0., 0., + 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1.66666675e-002, 5.55555569e-003, 5.55555569e-003, + 5.55555569e-003, 0., 5.55555569e-003, 0., 0., 0., 0., + 1.11111114e-002, 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 5.55555569e-003, + 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 1.11111114e-002, 0., 0., 0., 0., 5.55555569e-003, 0., + 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 1.11111114e-002, 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 1.66666675e-002, 0., 0., 5.55555569e-003, + 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 5.55555569e-003, 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., + 1.11111114e-002, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 1.11111114e-002, 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., + 5.55555569e-003, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 5.55555569e-003, 5.55555569e-003, 0., 0., + 0., 5.55555569e-003, 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., + 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., + 1.66666675e-002, 5.55555569e-003, 0., 5.55555569e-003, 0., 0., 0., + 0., 0., 0., 0., 0., 0., 0., 5.55555569e-003, 0., 0., 0., 0., 0., + 0., 5.55555569e-003, 5.55555569e-003, 0., 0. ] diff --git a/samples/cpp/fabmap/vocab_small.yml b/samples/cpp/fabmap/vocab_small.yml new file mode 100644 index 000000000..b3745db13 --- /dev/null +++ b/samples/cpp/fabmap/vocab_small.yml @@ -0,0 +1,11632 @@ +%YAML:1.0 +Vocabulary: !!opencv-matrix + rows: 545 + cols: 64 + dt: f + data: [ -2.23840773e-003, -1.45805170e-004, 5.83372777e-003, + 4.78582736e-003, -6.79995958e-003, -2.73266230e-002, + 3.78876217e-002, 4.05635685e-002, 2.39772238e-002, + -2.35542655e-002, 4.16107289e-002, 3.84643264e-002, + 4.04689985e-004, 3.61579529e-004, 4.87240031e-003, + 4.31159278e-003, -4.20301110e-002, 3.01776617e-003, + 5.38702793e-002, 3.66228931e-002, -1.40395328e-001, + -1.08054712e-001, 2.43867636e-001, 2.04767004e-001, + 2.39047572e-001, -1.60057992e-001, 2.80289233e-001, + 2.17854336e-001, 2.53522228e-002, -1.45573737e-002, + 4.25381958e-002, 3.34862769e-002, -2.99079753e-002, + 2.65644658e-002, 4.65271436e-002, 4.05995697e-002, + -2.59213448e-001, 2.83290684e-001, 3.11675638e-001, + 3.22893202e-001, 1.31321296e-001, 1.04262643e-001, + 2.19351202e-001, 2.08086759e-001, 3.54408175e-002, + -2.20329175e-003, 4.65276241e-002, 3.26152667e-002, + 2.98278494e-004, -6.70515292e-005, 4.70742583e-003, + 4.15264582e-003, -3.09823938e-002, 2.70887669e-002, + 4.53752875e-002, 4.35089581e-002, -5.31507330e-003, + 3.55863273e-002, 3.68984751e-002, 4.59275655e-002, + 1.82320224e-003, 1.15874631e-003, 5.14107989e-003, + 4.71368525e-003, -5.06616198e-004, 2.05147895e-003, + 3.35898064e-003, 4.74551553e-003, 5.69651311e-004, + 2.54006945e-002, 2.10890882e-002, 3.99157405e-002, + -5.01428777e-003, 2.40984391e-002, 2.27562878e-002, + 3.87184992e-002, -5.42908034e-004, 1.05822028e-003, + 3.28905950e-003, 4.05709771e-003, 2.12366469e-002, + 2.64870450e-002, 3.21609490e-002, 3.91589403e-002, + 7.07554519e-002, 2.95910597e-001, 1.54240519e-001, + 3.35204840e-001, -1.39442146e-001, 2.84468114e-001, + 2.11933002e-001, 3.30289334e-001, -3.15708704e-002, + 1.98965147e-002, 4.04352359e-002, 3.58315334e-002, + 2.42719781e-002, -1.79040283e-002, 3.41793112e-002, + 3.60317230e-002, 7.41999894e-002, -2.11056530e-001, + 1.61902398e-001, 2.87930667e-001, -1.50428280e-001, + -2.09661797e-001, 2.18079194e-001, 2.92788655e-001, + -3.38707343e-002, -1.30352816e-002, 4.28731889e-002, + 3.46324556e-002, -1.73740380e-004, -2.19622650e-003, + 3.61105334e-003, 5.24148811e-003, 1.59536241e-004, + -3.20830457e-002, 2.47771144e-002, 4.71860766e-002, + -6.94153551e-003, -2.99014747e-002, 2.62722224e-002, + 4.53941263e-002, -7.28746003e-004, -1.15212682e-003, + 3.75777180e-003, 4.47807414e-003, 6.39962265e-004, + -2.04029749e-003, 3.88975674e-003, 4.78605507e-003, + 6.55037118e-003, -2.74506100e-002, 2.98325233e-002, + 4.05248478e-002, 2.22890135e-002, -2.35787760e-002, + 3.69363390e-002, 4.05068770e-002, 1.07901613e-003, + -1.34838119e-004, 4.41030273e-003, 4.72284202e-003, + -1.30135901e-002, -1.21046929e-002, 2.60815900e-002, + 3.20601314e-002, -1.02646472e-002, -1.42910406e-001, + 1.34074569e-001, 2.06852108e-001, 1.82671413e-001, + -1.93959147e-001, 2.28636637e-001, 2.56080598e-001, + 3.26253287e-002, -2.24077180e-002, 4.24838476e-002, + 4.17442918e-002, -1.28750447e-002, 3.41011286e-002, + 2.84624826e-002, 4.71641980e-002, -2.17288490e-002, + 2.98778594e-001, 1.50262862e-001, 3.59291553e-001, + 1.49900407e-001, 3.13571513e-001, 2.10952431e-001, + 3.86784673e-001, 3.11150756e-002, 2.89170723e-002, + 4.11258191e-002, 4.89541627e-002, 1.84576958e-003, + 2.62546749e-003, 4.46394598e-003, 5.50895790e-003, + 6.29984960e-003, 3.28875147e-002, 2.99717803e-002, + 4.70964052e-002, 1.09767662e-002, 3.03741340e-002, + 2.85561457e-002, 4.38149162e-002, -5.61830275e-005, + 1.74538593e-003, 3.51823610e-003, 4.46260767e-003, + 4.64883233e-005, 5.40048059e-004, 4.64470731e-003, + 5.49857737e-003, 2.72302646e-002, 4.69881259e-002, + 4.20331582e-002, 7.07317963e-002, 2.14038026e-002, + 7.64405429e-002, 4.31087725e-002, 9.58721861e-002, + 1.43965997e-003, 6.74130674e-003, 5.44613181e-003, + 1.04570836e-002, 4.93450686e-002, 4.58037257e-002, + 6.49900213e-002, 5.80696575e-002, 3.06494772e-001, + 4.06743616e-001, 3.47406060e-001, 4.39883322e-001, + -9.67812445e-003, 1.98782235e-001, 1.43346861e-001, + 2.52882421e-001, -1.63476001e-002, 1.96603462e-002, + 3.09653431e-002, 3.33330110e-002, 6.35472685e-002, + 1.48298843e-002, 7.52776712e-002, 4.36739400e-002, + 1.36095494e-001, -3.95558178e-002, 2.02910945e-001, + 1.47791564e-001, -4.28706929e-002, -3.63306254e-002, + 1.03769362e-001, 1.01320960e-001, -1.56269651e-002, + -1.76056765e-003, 2.60859337e-002, 1.93906520e-002, + 3.98196001e-003, 8.07995966e-004, 7.30827404e-003, + 5.61313983e-003, 1.69261470e-002, -1.98163912e-002, + 3.23840007e-002, 3.54515836e-002, -7.70552433e-004, + -1.75696854e-002, 2.10676249e-002, 2.89358180e-002, + -5.75672602e-004, -6.54784264e-004, 3.29677900e-003, + 3.34690255e-003, -4.47988306e-004, -3.96635907e-004, + 3.71261546e-003, 3.28005594e-003, -1.52235792e-003, + -1.06495516e-002, 2.08811723e-002, 2.21505221e-002, + 7.22342450e-003, -1.07294219e-002, 2.27845330e-002, + 2.30260212e-002, 4.22174996e-003, 5.14141633e-004, + 6.54624728e-003, 4.31627501e-003, -1.51944747e-002, + 1.78262137e-003, 2.84746625e-002, 2.23664977e-002, + -2.93665081e-002, -3.15488577e-002, 1.06725529e-001, + 1.03039920e-001, 9.37158242e-002, -5.16995462e-003, + 1.49795786e-001, 1.24505728e-001, 5.87471463e-002, + 2.70866472e-002, 6.83943555e-002, 4.35000397e-002, + -1.81138590e-002, 2.04075500e-002, 3.58537175e-002, + 3.65797319e-002, -2.15239134e-002, 1.88728541e-001, + 1.55168250e-001, 2.44728342e-001, 3.54996055e-001, + 4.11725134e-001, 3.87277037e-001, 4.41488981e-001, + 4.46619876e-002, 6.23290949e-002, 6.35662302e-002, + 6.96495175e-002, 1.75462186e-003, 4.82114172e-003, + 6.19291048e-003, 7.63208140e-003, 2.36442797e-002, + 7.04132691e-002, 4.91044521e-002, 8.04637447e-002, + 3.99896726e-002, 4.86416966e-002, 5.33663444e-002, + 6.54476807e-002, -1.67146209e-003, -1.27220526e-003, + 4.96597355e-003, 4.37750714e-003, 9.66227381e-004, + -2.96014850e-003, 3.18601844e-003, 5.04885847e-003, + 2.96646322e-004, -2.80020218e-002, 1.99545678e-002, + 3.93892080e-002, 5.53441758e-004, -2.60542482e-002, + 2.06031390e-002, 3.82976718e-002, -1.04083400e-003, + -2.53630406e-003, 3.24764173e-003, 4.88804467e-003, + -1.12808356e-002, -3.83649841e-002, 2.16235816e-002, + 4.97278422e-002, -3.02229282e-002, -3.14814776e-001, + 1.10802069e-001, 3.65518302e-001, 3.99985053e-002, + -3.20346057e-001, 1.10861398e-001, 3.72951180e-001, + 9.67699662e-003, -4.15788814e-002, 2.01666486e-002, + 5.28978109e-002, -1.22842155e-002, 3.74811701e-002, + 2.17446107e-002, 4.73767519e-002, -4.65767384e-002, + 2.79764712e-001, 1.10101879e-001, 3.27185929e-001, + 1.82031281e-002, 2.50788867e-001, 1.02298789e-001, + 3.05724591e-001, 9.29293875e-003, 2.95719653e-002, + 1.93833020e-002, 4.38007712e-002, 6.90613408e-004, + 2.61855684e-003, 3.09589389e-003, 4.95227892e-003, + -3.72880558e-003, 2.91409306e-002, 2.12447308e-002, + 4.11369316e-002, -1.88071921e-003, 3.17554809e-002, + 2.25676186e-002, 4.30514589e-002, -7.30705215e-004, + 3.46329086e-003, 3.33467242e-003, 5.61719900e-003, + 1.11681614e-002, 2.10514311e-002, 1.97412595e-002, + 2.70309132e-002, -1.32659357e-003, 2.65401840e-001, + 3.01854145e-002, 3.12005579e-001, -4.93198261e-003, + 2.63774425e-001, 2.30455119e-002, 3.17578882e-001, + -1.09588567e-004, 3.38784605e-002, 4.45968518e-003, + 4.24446501e-002, 2.06787914e-001, 8.61708634e-003, + 2.98929423e-001, 4.71966006e-002, 7.99639598e-002, + 1.55997872e-001, 1.79967463e-001, 2.56197095e-001, + -1.64327305e-002, 1.79949984e-001, 9.07244906e-002, + 2.57656306e-001, -1.10678775e-002, 3.07309907e-002, + 2.03141756e-002, 4.18453403e-002, 2.13108167e-001, + 1.10010048e-002, 2.95161486e-001, 3.54198962e-002, + 6.90176785e-002, 9.03246645e-003, 1.62276179e-001, + 8.97402018e-002, -1.30499443e-002, -3.17033217e-003, + 7.09738731e-002, 6.09545149e-002, -7.68624758e-003, + 5.85683156e-004, 1.48472330e-002, 1.20609803e-002, + 2.52990015e-002, 2.77531939e-003, 3.68549712e-002, + 6.02000300e-003, 9.83278546e-003, -3.72600765e-003, + 2.36107055e-002, 1.33350240e-002, -3.34310881e-003, + -3.31213814e-003, 1.09420540e-002, 9.15892422e-003, + -4.93357307e-004, 5.88192306e-005, 1.88892102e-003, + 1.35786890e-003, 1.41431275e-003, 2.34915479e-003, + 4.66814078e-003, 5.41197229e-003, 3.40519659e-003, + 5.19851930e-002, 3.02428156e-002, 7.31882676e-002, + -2.40552519e-003, 4.28700484e-002, 2.53108777e-002, + 7.04635680e-002, 1.61312276e-003, 3.57554504e-003, + 4.10544593e-003, 8.55881814e-003, 4.32288796e-002, + 8.69551394e-003, 6.30870759e-002, 3.05743460e-002, + 2.54263043e-001, 2.66059548e-001, 3.21135759e-001, + 3.24895352e-001, -6.29717186e-002, 3.50725859e-001, + 1.30241290e-001, 3.82445246e-001, -1.42178191e-002, + 4.82835174e-002, 2.92357150e-002, 5.52612469e-002, + 4.81977016e-002, 5.53501258e-003, 7.02330172e-002, + 2.69483905e-002, 2.83668846e-001, -1.38835702e-002, + 3.24899167e-001, 1.16578944e-001, -2.49049701e-002, + -1.33585492e-002, 8.30738246e-002, 7.70169944e-002, + -1.31388754e-002, 2.51764292e-003, 2.21927613e-002, + 1.53826941e-002, 5.52905956e-003, 1.99346594e-003, + 9.19964071e-003, 4.25843941e-003, 3.39125283e-002, + -8.39921273e-003, 4.28450070e-002, 2.24305950e-002, + -2.35332322e-004, -7.90562015e-003, 1.51584297e-002, + 1.63971093e-002, -8.19770212e-004, -2.38286302e-004, + 2.60267640e-003, 2.13386375e-003, 2.38834647e-003, + -7.50835810e-004, 5.67667419e-003, 3.93949216e-003, + 3.46644372e-002, 2.24967487e-002, 4.52967361e-002, + 3.63315865e-002, -1.59158220e-003, 2.49080583e-002, + 2.77491845e-002, 3.58137079e-002, -1.14613364e-003, + 8.03122937e-004, 4.14975081e-003, 4.02934523e-003, + 3.35200913e-002, 4.02554730e-003, 4.85638604e-002, + 2.57301405e-002, 3.14588130e-001, 9.01470110e-002, + 3.49137962e-001, 1.81718394e-001, -9.10726637e-002, + 4.52047847e-002, 1.62447721e-001, 1.48703501e-001, + -2.54023466e-002, -3.57903284e-003, 3.72706726e-002, + 2.72013806e-002, 3.71433198e-002, -7.94685446e-003, + 4.90551926e-002, 2.96646543e-002, 2.51118809e-001, + -2.23607764e-001, 3.05163950e-001, 2.90560633e-001, + -1.23846576e-001, -2.62217790e-001, 1.99007213e-001, + 3.05309951e-001, -2.14355774e-002, -2.71279141e-002, + 3.81317772e-002, 4.03598920e-002, 1.23749452e-003, + -1.42892252e-003, 4.18460835e-003, 4.50564548e-003, + 1.11593055e-002, -4.12642173e-002, 3.16474959e-002, + 5.63254654e-002, -3.94308614e-003, -4.13183756e-002, + 2.99611446e-002, 5.87938353e-002, 8.41489644e-004, + -2.61648861e-003, 4.27282089e-003, 6.20577345e-003, + 2.15210093e-004, 2.83295522e-004, 4.13683895e-003, + 3.47144506e-003, 2.24962924e-002, 3.05757318e-002, + 3.82054634e-002, 3.97322699e-002, -1.23539129e-002, + 3.19534391e-002, 3.62576172e-002, 4.20490466e-002, + -2.24402105e-003, 2.73249403e-004, 5.04024280e-003, + 4.01930790e-003, 2.34371834e-002, 1.74649209e-002, + 3.88917923e-002, 2.94167884e-002, 2.59323210e-001, + 1.88362703e-001, 2.96269447e-001, 2.28626758e-001, + -2.10341185e-001, 1.39805213e-001, 2.79310644e-001, + 2.17759088e-001, -4.00440432e-002, 2.20531295e-003, + 5.03280796e-002, 3.05585340e-002, 3.67639363e-002, + 1.30418856e-002, 4.60822582e-002, 2.98898723e-002, + 1.21892810e-001, -4.19994332e-002, 2.10125163e-001, + 1.65723249e-001, -2.95721561e-001, -2.20592991e-001, + 3.34229052e-001, 2.60094047e-001, -2.93739606e-002, + -1.51236355e-002, 4.31582890e-002, 3.08249854e-002, + 2.64525320e-003, -6.36742101e-004, 5.07212384e-003, + 4.04421845e-003, -7.38360966e-003, -2.99136601e-002, + 3.33957970e-002, 3.87484021e-002, -3.64676863e-002, + -2.30928771e-002, 4.67360020e-002, 3.81140150e-002, + -3.60798673e-004, 4.20351309e-004, 4.12968360e-003, + 3.57644469e-003, -1.32571859e-003, 6.54139463e-003, + 5.13805589e-003, 9.62157920e-003, -9.01581533e-003, + 6.79364651e-002, 3.23920920e-002, 8.56782421e-002, + -1.68991219e-002, 5.62760048e-002, 3.73047180e-002, + 7.53489062e-002, -1.21674465e-003, 1.32728263e-003, + 5.51139517e-003, 5.83564024e-003, 1.75790899e-002, + 2.52142604e-002, 3.37456688e-002, 3.59918997e-002, + 2.54755560e-002, 2.28996128e-001, 1.38745755e-001, + 2.75865793e-001, -3.02511036e-001, 2.61498988e-001, + 3.62901509e-001, 3.19231212e-001, -5.25892489e-002, + 8.37134849e-003, 7.48365894e-002, 3.50196734e-002, + 1.71684306e-002, -5.33423852e-004, 3.02696563e-002, + 1.78647041e-002, 3.53834182e-002, -3.01275589e-002, + 1.18871912e-001, 9.66245532e-002, -3.01264703e-001, + -3.26512456e-002, 3.65526855e-001, 1.26873955e-001, + -5.87003939e-002, 3.29473522e-003, 8.32590237e-002, + 2.84877084e-002, 9.76657495e-004, -3.77851538e-004, + 3.82327568e-003, 2.91927136e-003, 2.34231842e-003, + -1.27439164e-002, 2.14447062e-002, 2.30826959e-002, + -3.90316918e-002, -1.45740090e-002, 5.10261171e-002, + 2.81349365e-002, -5.98082785e-003, 1.55485666e-003, + 1.03986179e-002, 4.43816138e-003, 4.24821349e-003, + -9.65262123e-004, 1.10907229e-002, 3.79467849e-003, + 2.48473436e-002, 1.57392081e-002, 4.22193334e-002, + 2.61627845e-002, -3.95157821e-002, 1.04935765e-002, + 5.26626520e-002, 2.66714115e-002, -4.14158311e-003, + -1.36935187e-003, 8.94255284e-003, 4.34175879e-003, + 6.31721616e-002, 3.60284955e-003, 9.83192474e-002, + 2.67235599e-002, 1.42045945e-001, 2.18820367e-002, + 2.39691734e-001, 1.14417590e-001, -3.28066468e-001, + -4.71286662e-003, 3.94637257e-001, 1.29491761e-001, + -2.79057734e-002, -1.54427066e-003, 6.27084598e-002, + 2.62700859e-002, 7.24681169e-002, 8.73946643e-004, + 9.77867767e-002, 3.16545591e-002, 4.09985445e-002, + -1.38429254e-001, 2.23940581e-001, 2.13532299e-001, + -2.77560622e-001, -1.55617386e-001, 3.87452602e-001, + 2.43753657e-001, -2.54227873e-002, -2.27912795e-003, + 5.80889918e-002, 3.07432916e-002, 3.89012555e-003, + -2.66907248e-003, 9.42590367e-003, 6.70169247e-003, + -1.00736963e-002, -5.92664964e-002, 4.12332974e-002, + 7.62227699e-002, -1.56080807e-002, -5.07808216e-002, + 4.35443111e-002, 6.94676265e-002, -8.86105583e-004, + -1.44870055e-003, 5.81600470e-003, 5.83413290e-003, + -3.73573927e-003, 9.78440046e-004, 6.85504545e-003, + 3.87491169e-003, -2.19224263e-002, -1.31376786e-002, + 3.95316258e-002, 2.70377696e-002, 6.23588450e-003, + -1.48362331e-002, 3.08888741e-002, 2.64019929e-002, + 2.77890521e-003, 2.45906354e-004, 5.71850827e-003, + 3.83244804e-003, -3.75685766e-002, 9.56751686e-003, + 5.19641526e-002, 2.76500080e-002, -2.36117184e-001, + -4.74616177e-002, 2.93891340e-001, 1.48707137e-001, + 1.18473612e-001, -2.94311438e-002, 2.02028409e-001, + 1.38572618e-001, 3.62572148e-002, 1.28303478e-002, + 4.90970910e-002, 3.13159376e-002, -2.91657858e-002, + 1.26565527e-002, 4.72497456e-002, 2.72762235e-002, + -3.18792224e-001, 1.28836066e-001, 3.76148909e-001, + 2.01063469e-001, 2.76111782e-001, 2.03172594e-001, + 3.19292009e-001, 2.48906136e-001, 2.48469692e-002, + 2.77657490e-002, 4.67640758e-002, 3.99161391e-002, + -1.45657687e-003, -2.75623839e-004, 5.32443076e-003, + 3.47040105e-003, -2.78863832e-002, 3.58197764e-002, + 5.04815690e-002, 4.59184386e-002, 3.41350622e-002, + 3.23147029e-002, 4.98251989e-002, 4.56066616e-002, + -3.50000919e-004, -1.01677484e-004, 5.13664400e-003, + 4.28624591e-003, 9.89927212e-004, 4.41623124e-004, + 3.43245221e-003, 3.06127290e-003, 1.89286843e-003, + 1.23480093e-002, 1.81654338e-002, 2.24024504e-002, + -1.35236196e-002, 1.29921837e-002, 2.60058437e-002, + 2.46718712e-002, -4.42694966e-003, -5.12551575e-004, + 7.96458218e-003, 3.86605365e-003, 1.91252120e-002, + -8.60670640e-004, 2.99247131e-002, 2.14081239e-002, + 3.09080184e-002, 3.07410993e-002, 9.96437967e-002, + 1.02420814e-001, -1.20130114e-001, 2.41689216e-002, + 1.75219774e-001, 1.20190367e-001, -5.40535562e-002, + -9.00703762e-003, 7.24968985e-002, 3.23046595e-002, + 1.93666220e-002, -4.92816344e-002, 3.42974775e-002, + 5.85045181e-002, 4.93223630e-002, -3.84806097e-001, + 1.38155013e-001, 4.22717363e-001, -1.56576321e-001, + -3.81195784e-001, 2.26639539e-001, 4.23939347e-001, + -4.79634181e-002, -3.52039896e-002, 6.88419566e-002, + 5.22088930e-002, -1.17197621e-003, -4.35381755e-003, + 3.86297260e-003, 9.28013865e-003, 3.68626497e-005, + -4.19749916e-002, 2.21945141e-002, 7.20882490e-002, + -3.62213259e-003, -3.90844308e-002, 2.49903947e-002, + 6.82056919e-002, 2.96633661e-005, -2.33535352e-003, + 4.47170343e-003, 6.94447849e-003, 1.26071787e-003, + 7.85933749e-004, 5.09115402e-003, 4.73064696e-003, + -3.12397424e-002, -2.21502539e-002, 4.69744205e-002, + 4.32929769e-002, -1.43592255e-002, -3.46800610e-002, + 4.09755073e-002, 4.52331826e-002, 3.37534957e-003, + -1.84589109e-004, 6.20780513e-003, 4.85807052e-003, + -2.21218057e-002, -3.14107873e-002, 4.37492281e-002, + 4.66236174e-002, -2.38626227e-001, -2.71817803e-001, + 2.90395647e-001, 3.23451370e-001, 1.04014061e-001, + -3.88676301e-002, 2.21614793e-001, 1.87451437e-001, + 5.04132770e-002, 1.61463600e-002, 5.95637336e-002, + 3.70900407e-002, -3.57033648e-002, -8.46630242e-003, + 4.74362187e-002, 3.89632881e-002, -6.24761321e-002, + 7.58465603e-002, 1.93312734e-001, 2.01685980e-001, + 2.85420448e-001, 2.22651139e-001, 3.18631142e-001, + 2.85730332e-001, 3.37439440e-002, 2.36872770e-002, + 5.02690077e-002, 4.14218083e-002, -1.25837862e-003, + 1.67496409e-003, 5.44222072e-003, 5.56924939e-003, + 1.29806548e-002, 4.36843336e-002, 3.88843454e-002, + 5.36862686e-002, 3.30824591e-002, 3.48556265e-002, + 4.84384596e-002, 4.96730916e-002, -2.74709164e-004, + -2.17946261e-004, 4.82326187e-003, 4.55866661e-003, + 1.10241421e-003, 1.05224561e-003, 4.70233988e-003, + 4.51703928e-003, 1.61316730e-002, 4.48866114e-002, + 3.96761335e-002, 5.65250367e-002, -1.83062181e-002, + 3.84612568e-002, 3.75689715e-002, 5.42800836e-002, + 5.89085219e-004, 9.13972210e-004, 4.46719211e-003, + 5.28019760e-003, 3.84759195e-002, 2.15557851e-002, + 5.16407378e-002, 3.62993367e-002, 2.48027727e-001, + 2.17347875e-001, 3.10197592e-001, 2.71540523e-001, + -2.07228765e-001, 2.75205165e-001, 2.55649835e-001, + 3.18704486e-001, -2.45770514e-002, 3.91682014e-002, + 4.25577983e-002, 5.02727777e-002, 4.18820567e-002, + -3.83256422e-003, 5.23491018e-002, 3.44806537e-002, + 1.82845876e-001, -1.91645190e-001, 2.38697797e-001, + 2.52401084e-001, -4.09929715e-002, -1.15990236e-001, + 1.51587695e-001, 1.93411648e-001, -2.86246035e-002, + 4.94819274e-003, 3.90940048e-002, 3.27391028e-002, + 1.23746169e-003, -5.26416115e-004, 4.78526950e-003, + 4.65767365e-003, 1.77884400e-002, -2.61192042e-002, + 3.51225324e-002, 4.27427478e-002, 1.02264890e-002, + -3.17160711e-002, 3.02369948e-002, 4.34940867e-002, + -6.91001944e-004, -2.04336853e-003, 4.19469038e-003, + 4.91001084e-003, 3.36124445e-004, -1.24260364e-003, + 4.62219771e-003, 4.72282479e-003, -3.42963054e-003, + -3.06325871e-002, 3.05556860e-002, 4.63433154e-002, + -1.23451324e-002, -4.16709110e-002, 3.45609896e-002, + 5.59019335e-002, -5.33102371e-004, -3.85896605e-003, + 5.10730967e-003, 6.59612054e-003, -3.57003286e-002, + -3.37480977e-002, 5.08378670e-002, 4.73210625e-002, + -1.23063542e-001, -3.55430156e-001, 2.40266591e-001, + 3.97224247e-001, -3.25407684e-002, -3.04835200e-001, + 2.13020399e-001, 3.57529998e-001, 3.71762775e-002, + -1.93175208e-002, 4.93055135e-002, 4.12396118e-002, + -4.39904034e-002, -1.56847090e-002, 5.47321849e-002, + 3.82458642e-002, -6.79925680e-002, 2.84791994e-003, + 1.90873414e-001, 1.84111685e-001, 1.20009258e-001, + 1.45440593e-001, 2.03442812e-001, 2.19590873e-001, + 3.40065658e-002, 1.89974885e-002, 4.81042899e-002, + 3.89660895e-002, -2.71839928e-003, 1.80459610e-004, + 5.80643490e-003, 5.00546210e-003, 5.18574705e-003, + 2.34277472e-002, 3.22721824e-002, 3.71964872e-002, + 1.98352113e-002, 1.80607196e-002, 3.81789580e-002, + 3.82592008e-002, 6.61502359e-004, -6.48299756e-004, + 5.40223625e-003, 5.16275968e-003, 2.19575968e-003, + -3.84818530e-003, 5.77654224e-003, 6.64186478e-003, + 1.70572996e-002, -5.64606600e-002, 3.98038067e-002, + 6.72801435e-002, 2.66474169e-002, -4.24297899e-002, + 3.97436656e-002, 5.44223711e-002, 3.21891916e-004, + -3.72202863e-004, 3.54885217e-003, 3.39363096e-003, + -1.59808490e-002, -2.03988515e-002, 3.52561288e-002, + 3.63372788e-002, -3.28741944e-003, -2.14131206e-001, + 1.71873078e-001, 2.78277099e-001, 3.32195997e-001, + -3.07503015e-001, 3.73307794e-001, 3.51594985e-001, + 4.04536650e-002, -2.35130750e-002, 5.24488837e-002, + 3.56360041e-002, -1.49691273e-002, 1.18477421e-003, + 3.05151269e-002, 2.42814738e-002, -3.28159817e-002, + 4.47103567e-002, 1.37695044e-001, 1.36804298e-001, + 2.38008112e-001, 1.35608558e-002, 2.87483454e-001, + 1.48942739e-001, 5.52896149e-002, -1.46915931e-002, + 6.55776858e-002, 3.28799784e-002, -1.80373565e-004, + 7.38456947e-005, 3.86283174e-003, 3.41505697e-003, + -5.29089360e-004, 1.36495447e-002, 2.46098954e-002, + 2.68652719e-002, 2.45620143e-002, 1.45513006e-002, + 3.77722085e-002, 2.94708479e-002, 4.65047127e-003, + -1.31051755e-003, 7.13860476e-003, 4.50263685e-003, + -6.98138494e-004, -6.38988335e-004, 4.31709737e-003, + 4.81814519e-003, -6.32832432e-003, -1.80236194e-002, + 2.70679407e-002, 3.37262005e-002, 4.54956805e-003, + -1.73884388e-002, 2.77924761e-002, 3.19622569e-002, + 1.56917039e-003, -3.17301630e-004, 4.84537426e-003, + 4.42272751e-003, -2.64026150e-002, 4.33786772e-003, + 3.96052785e-002, 3.77517752e-002, -5.51256314e-002, + -5.75430170e-002, 1.51520520e-001, 1.73935726e-001, + 7.56346807e-002, -4.17034887e-002, 1.51487157e-001, + 1.49002582e-001, 2.97785737e-002, 3.21124075e-003, + 4.19798531e-002, 3.20670232e-002, -2.55699493e-002, + 5.38893454e-002, 4.54515368e-002, 6.48109615e-002, + -1.27181083e-001, 4.16281521e-001, 2.47511879e-001, + 4.62140173e-001, 3.91330458e-002, 2.79386729e-001, + 2.24591926e-001, 3.39507073e-001, 3.22142653e-002, + 2.84682550e-002, 4.72158976e-002, 4.48138118e-002, + 1.80051115e-003, 9.84718325e-004, 4.72172815e-003, + 5.11968276e-003, -1.18690720e-002, 2.95928717e-002, + 3.16297673e-002, 4.78018112e-002, -1.17865587e-002, + 4.62970138e-002, 3.82096656e-002, 5.96044734e-002, + -3.24207242e-004, 3.17007839e-003, 5.42911002e-003, + 6.24179700e-003, -5.63234848e-004, 4.09285072e-003, + 4.67640255e-003, 8.23435467e-003, -4.17124573e-003, + 3.95206995e-002, 2.60561854e-002, 6.71207756e-002, + -2.89049838e-003, 2.93027963e-002, 2.31961012e-002, + 5.93198128e-002, 1.04806735e-003, 1.85548724e-003, + 3.89577844e-003, 7.21744169e-003, 3.74405496e-002, + 3.83486599e-002, 5.58295324e-002, 5.34969345e-002, + 5.13848811e-002, 3.77152205e-001, 1.79161489e-001, + 4.21310931e-001, -9.38462466e-002, 4.26250219e-001, + 1.80673182e-001, 4.61132646e-001, -2.76903715e-002, + 5.42913079e-002, 4.59185615e-002, 6.53212368e-002, + 3.80461365e-002, 4.67227353e-003, 5.38022555e-002, + 2.78558210e-002, 6.52928501e-002, -1.81847271e-002, + 1.30877972e-001, 1.01120085e-001, -4.55324352e-002, + -7.16318423e-003, 1.07543908e-001, 9.24111903e-002, + -2.86381412e-002, 8.35110433e-003, 4.15160768e-002, + 2.56457347e-002, 2.66725570e-003, 5.66570088e-004, + 5.77612128e-003, 3.40505037e-003, 8.67367722e-003, + -9.18610021e-003, 2.09087338e-002, 2.03439482e-002, + -4.21086559e-003, -8.37657321e-003, 1.71094947e-002, + 1.83828566e-002, -1.89272780e-003, 1.30746994e-004, + 4.35057702e-003, 2.81766360e-003, 5.03752381e-003, + -5.78335137e-004, 9.31086671e-003, 6.97596418e-003, + 4.04164344e-002, 4.16810699e-002, 6.19139560e-002, + 6.68606162e-002, 2.21190937e-002, 2.78675538e-002, + 3.34197208e-002, 3.78318913e-002, -7.01271580e-004, + 7.98847119e-004, 2.55434634e-003, 2.58044759e-003, + 1.02754585e-001, 1.17558232e-002, 1.13603055e-001, + 5.56210279e-002, 1.53082758e-001, 1.46154806e-001, + 2.31830373e-001, 2.14475483e-001, 1.41976622e-003, + 2.10046917e-002, 8.51256698e-002, 7.10659027e-002, + -1.28289526e-002, 5.96782993e-005, 2.05581840e-002, + 1.14321727e-002, 6.67123124e-002, -5.43668233e-002, + 8.49927366e-002, 6.90845847e-002, 3.73792082e-001, + -3.74246061e-001, 4.23202455e-001, 4.09823418e-001, + 6.28216378e-003, -3.11804190e-002, 9.31044072e-002, + 8.46788511e-002, -1.42851928e-002, -2.35565403e-003, + 2.25322954e-002, 1.31483134e-002, -7.87994184e-004, + 7.36919348e-004, 5.94646763e-003, 5.10097574e-003, + 8.43485892e-002, -4.58313189e-002, 9.50149223e-002, + 6.72127157e-002, 3.19486782e-002, -4.18054014e-002, + 4.76678535e-002, 5.17576784e-002, -6.41179504e-004, + -1.64614292e-003, 3.74805019e-003, 3.61942523e-003, + 6.58383535e-004, 1.18744955e-003, 3.97546357e-003, + 3.80331930e-003, -6.24101982e-003, 2.38983333e-002, + 2.67522056e-002, 3.45510505e-002, -3.65258381e-002, + 2.11754758e-002, 4.97307479e-002, 3.74160856e-002, + -3.30050499e-003, -1.00034196e-003, 6.96389098e-003, + 4.47908044e-003, 2.01375615e-002, -2.52593984e-003, + 3.25143449e-002, 2.36946493e-002, 1.01427771e-002, + 4.03900184e-002, 1.36013746e-001, 1.33404315e-001, + -3.30328941e-001, 5.18405624e-002, 3.79156023e-001, + 1.85245275e-001, -3.84104662e-002, -3.23035987e-003, + 5.69899604e-002, 2.88269054e-002, 1.84536688e-002, + -3.16967368e-002, 3.63216735e-002, 4.35001515e-002, + 9.01609883e-002, -2.19776675e-001, 1.76763177e-001, + 2.81991929e-001, -3.25162202e-001, -1.22363165e-001, + 3.82728875e-001, 2.47789726e-001, -3.68449837e-002, + -1.87987881e-003, 5.63869402e-002, 2.89910119e-002, + -1.33167021e-003, -2.67478940e-003, 4.98381862e-003, + 6.58852421e-003, 8.81632511e-003, -4.57292832e-002, + 3.44046503e-002, 6.35011047e-002, -1.66392755e-002, + -4.71162312e-002, 4.21529151e-002, 6.23699278e-002, + -2.00917549e-003, -2.84930080e-004, 5.68251917e-003, + 4.75370185e-003, 1.80544273e-003, -4.31471090e-005, + 4.86758444e-003, 2.91459356e-003, 2.80092675e-002, + 3.05272359e-002, 4.62446548e-002, 3.80837880e-002, + -3.45457494e-002, 3.04860473e-002, 4.68125977e-002, + 3.93562466e-002, -5.64482471e-004, 2.04025084e-004, + 4.28620446e-003, 3.34730628e-003, 2.40965299e-002, + 3.61315673e-003, 3.98608856e-002, 1.84947737e-002, + 3.31346989e-001, 8.23410749e-002, 3.72676909e-001, + 1.52649879e-001, -2.86314726e-001, 1.60884365e-001, + 3.26304823e-001, 2.00045675e-001, -2.53282264e-002, + 1.71123948e-002, 4.27132063e-002, 2.88287010e-002, + 2.81202495e-002, 5.76091977e-003, 4.26688828e-002, + 1.92351285e-002, 3.00343603e-001, -3.14961411e-002, + 3.36743325e-001, 1.19072802e-001, -1.67005897e-001, + -1.66400354e-002, 2.33381763e-001, 1.18663192e-001, + -3.68839502e-002, 1.16336532e-002, 4.93060723e-002, + 2.66845077e-002, 3.04342783e-003, 9.19921033e-004, + 5.58145763e-003, 2.89529050e-003, 3.07930037e-002, + -1.32069429e-002, 4.14950550e-002, 2.31444351e-002, + -1.24327969e-002, -1.46019198e-002, 3.19796540e-002, + 2.37175506e-002, -3.52738844e-003, 5.51524281e-004, + 5.91230812e-003, 3.33590480e-003, 1.37414376e-003, + -2.25896991e-004, 4.95774997e-003, 4.19051666e-003, + 1.69149917e-002, 2.49563754e-002, 3.55922431e-002, + 3.97829562e-002, -9.83540900e-003, 2.47731321e-002, + 3.10027618e-002, 4.03111428e-002, -6.17250684e-004, + 4.49854677e-004, 4.29366948e-003, 4.60455054e-003, + 3.02225314e-002, 1.32084824e-002, 4.46053632e-002, + 3.26861627e-002, 1.92729354e-001, 1.00732550e-001, + 2.55306721e-001, 2.15500534e-001, -1.08658172e-001, + 1.16004318e-001, 1.94621086e-001, 2.22346678e-001, + -2.88404003e-002, 1.07095484e-002, 4.17583510e-002, + 3.58034335e-002, 3.70168984e-002, -7.18389405e-003, + 4.71619964e-002, 3.74235623e-002, 8.39719456e-003, + -2.42681041e-001, 2.13923082e-001, 3.39251190e-001, + -5.01429923e-002, -3.69140714e-001, 1.87279329e-001, + 4.12515074e-001, -2.78191399e-002, -3.32804285e-002, + 4.05107811e-002, 4.79195490e-002, 5.36393374e-004, + -2.89842836e-003, 4.25136462e-003, 5.89225581e-003, + -1.11532211e-002, -3.07406280e-002, 2.90425643e-002, + 4.93610948e-002, -1.61928707e-003, -1.74246170e-002, + 2.26078443e-002, 4.07558121e-002, 6.98779768e-004, + -1.18141191e-003, 3.53922253e-003, 5.09616220e-003, + 8.82607303e-004, -4.95884684e-004, 4.13070386e-003, + 4.64667147e-003, -1.60062425e-002, -4.17196825e-002, + 3.12348008e-002, 5.73412031e-002, 1.47182005e-003, + -5.11823744e-002, 3.15971933e-002, 6.47349209e-002, + -1.32723816e-003, -3.07547441e-003, 4.82989522e-003, + 6.19664928e-003, -2.80217696e-002, -4.51532081e-002, + 4.94651347e-002, 6.31105155e-002, -2.06022292e-001, + -2.72125453e-001, 2.92908639e-001, 4.49570090e-001, + 1.07837409e-001, -2.24769861e-001, 2.14156285e-001, + 3.51343840e-001, 1.98722556e-002, -3.18982117e-002, + 3.96654233e-002, 4.88475747e-002, -3.08895539e-002, + -1.51829440e-002, 4.84469868e-002, 5.15550300e-002, + -9.20621678e-002, -5.02680466e-002, 1.96435809e-001, + 2.54790872e-001, 5.53626679e-002, -4.89128530e-002, + 1.52903080e-001, 1.94468543e-001, 2.39952896e-002, + -1.16555532e-002, 3.57371494e-002, 3.58544290e-002, + -1.70265825e-003, 2.08158192e-004, 5.40921651e-003, + 5.92229934e-003, -1.04794027e-002, 1.84995327e-002, + 3.10572367e-002, 3.93100083e-002, 2.65617343e-003, + 1.81969460e-002, 2.62126662e-002, 3.58002633e-002, + 1.27488864e-003, 7.31205335e-004, 4.46448429e-003, + 4.93388344e-003, 1.42980239e-003, 2.54960760e-004, + 4.61151032e-003, 4.36816551e-003, 1.36019299e-002, + 2.29205396e-002, 3.62480693e-002, 4.47757244e-002, + -1.17766894e-002, 2.11010724e-002, 3.61599997e-002, + 4.42413874e-002, -1.24310004e-003, 2.46367708e-004, + 4.53805830e-003, 4.21015918e-003, 1.25484597e-002, + -7.30976462e-003, 3.57345790e-002, 2.91567445e-002, + 1.69873387e-001, -1.24379210e-001, 2.72533834e-001, + 2.89070249e-001, -9.57392901e-002, -2.25275289e-002, + 2.89393932e-001, 2.48136163e-001, -1.73103735e-002, + -3.57852574e-003, 4.11753654e-002, 3.19498330e-002, + 1.12949805e-002, 4.45119990e-003, 3.52766626e-002, + 2.84482930e-002, 2.12300256e-001, 1.28947869e-001, + 2.95956880e-001, 2.99868524e-001, -1.88016951e-001, + -2.21467130e-002, 3.35298449e-001, 2.68390566e-001, + -1.10384226e-002, -8.51244107e-003, 3.85704264e-002, + 3.13261747e-002, 1.46122405e-003, -1.41291501e-004, + 4.71794000e-003, 4.10273857e-003, 1.39183011e-002, + -2.55074315e-002, 3.81155536e-002, 4.40104976e-002, + -2.22028643e-002, -1.84843093e-002, 4.16928791e-002, + 4.31742258e-002, 5.02285218e-007, 5.55108709e-004, + 4.44004964e-003, 4.12418507e-003, 3.87760974e-003, + -7.58353621e-004, 6.67272089e-003, 4.07037139e-003, + 4.31991257e-002, 2.79247928e-002, 5.56175113e-002, + 4.17700931e-002, 2.79648416e-003, 2.59406716e-002, + 2.67337002e-002, 3.61059569e-002, -1.49655752e-004, + 1.43592618e-003, 3.36773088e-003, 3.67088104e-003, + 4.02040482e-002, -2.41892692e-003, 5.51913828e-002, + 2.30305381e-002, 3.68978232e-001, 7.17703030e-002, + 4.09149617e-001, 1.56966045e-001, -4.06015068e-002, + 5.83019070e-002, 1.03540055e-001, 9.90400463e-002, + -1.22829778e-002, 4.86336928e-003, 2.31508855e-002, + 1.61370952e-002, 3.05507798e-002, -6.98052766e-003, + 4.80294079e-002, 2.33587082e-002, 4.28223491e-001, + -1.41305268e-001, 4.60701704e-001, 1.99027866e-001, + -3.46333012e-002, -5.09534553e-002, 1.07162304e-001, + 9.94921178e-002, -1.27677033e-002, -3.71547253e-003, + 2.36987844e-002, 1.59694050e-002, 1.69674703e-003, + 5.81638422e-004, 5.28557645e-003, 3.76073364e-003, + 5.40124327e-002, -3.32987309e-002, 6.52195737e-002, + 4.90081385e-002, 1.10864099e-002, -3.46896350e-002, + 3.31475288e-002, 4.53536734e-002, -2.40949681e-004, + -1.79581181e-003, 3.57653922e-003, 4.09992691e-003, + 4.50140331e-004, 1.62169209e-003, 5.26480749e-003, + 5.15386648e-003, -1.25963881e-003, 2.88252644e-002, + 3.38862613e-002, 4.58878353e-002, -9.84541979e-003, + 2.26681978e-002, 2.91514210e-002, 4.04687300e-002, + -3.81247606e-004, 5.20769856e-004, 3.88591806e-003, + 4.17396706e-003, 3.55546661e-002, 1.19367028e-002, + 5.63235246e-002, 3.67497839e-002, -6.59136251e-002, + 1.80359706e-001, 3.24767500e-001, 3.04279387e-001, + -1.36861622e-001, 9.75617990e-002, 2.50658244e-001, + 2.48833686e-001, -1.89363007e-002, 9.13301110e-003, + 3.70825306e-002, 2.92979572e-002, 3.22120376e-002, + -1.15756467e-002, 5.63854575e-002, 3.83141786e-002, + 5.04945368e-002, -9.48792621e-002, 3.36740494e-001, + 2.97641307e-001, -1.38091460e-001, 1.08720779e-001, + 2.73554504e-001, 3.03473830e-001, -2.75880061e-002, + 7.80153880e-003, 4.43335772e-002, 3.46074216e-002, + 7.69617211e-004, -9.65687868e-005, 5.53147960e-003, + 5.12566231e-003, 1.11859841e-002, -2.62650102e-002, + 4.08181325e-002, 5.49963787e-002, -6.84863748e-003, + -3.72366831e-002, 3.78905535e-002, 5.93900569e-002, + -1.94035145e-003, -4.46942431e-004, 5.41484123e-003, + 5.61271468e-003, -7.11588887e-004, -3.71292526e-006, + 5.91454282e-003, 3.47895687e-003, -2.89339870e-002, + -2.75948737e-002, 5.01510464e-002, 3.72860245e-002, + 4.70629185e-002, -2.51456369e-002, 6.01770431e-002, + 3.63556966e-002, 2.06766208e-003, 1.09235034e-003, + 5.72754769e-003, 3.20768752e-003, -2.97030061e-002, + -1.63633991e-002, 5.07555678e-002, 2.85181068e-002, + -2.00849205e-001, -1.11773700e-001, 2.77860969e-001, + 1.66473165e-001, 3.98672014e-001, -8.38116407e-002, + 4.37409759e-001, 1.54861093e-001, 2.80071758e-002, + -6.13273168e-003, 4.78500053e-002, 2.04337556e-002, + -4.07708324e-002, -9.69395321e-003, 5.41419275e-002, + 2.53516044e-002, -8.41575041e-002, 2.64919680e-002, + 1.94101855e-001, 1.13964006e-001, 3.12516749e-001, + 2.55565941e-002, 3.59135628e-001, 1.25417560e-001, + 3.74428034e-002, -9.46382061e-003, 5.48927598e-002, + 2.32917257e-002, -3.83153837e-003, -4.90099366e-004, + 6.56587211e-003, 3.34663247e-003, -3.37026082e-003, + 1.32123567e-002, 2.96183750e-002, 2.28380691e-002, + 3.41917798e-002, 1.33528411e-002, 4.62681875e-002, + 2.45943312e-002, 3.78513872e-003, -1.24705641e-003, + 6.96970895e-003, 3.63916019e-003, -8.29251774e-004, + -4.04625134e-005, 4.81630210e-003, 3.18062725e-003, + -1.02135567e-002, -1.66181289e-002, 3.16474214e-002, + 2.67384537e-002, 2.71271653e-002, -1.46471905e-002, + 4.35810387e-002, 2.78550945e-002, 6.96915109e-003, + 2.25744653e-003, 9.14048124e-003, 4.54847701e-003, + -2.33637504e-002, -4.01911419e-003, 3.92615609e-002, + 2.03737970e-002, -7.99917355e-002, -5.38458303e-002, + 1.71351478e-001, 1.13179870e-001, 3.10916841e-001, + 1.86353289e-002, 3.60559553e-001, 1.35549933e-001, + 5.53980768e-002, 1.76782943e-002, 6.97571039e-002, + 2.84575392e-002, -2.86954902e-002, -1.72395259e-004, + 4.26688232e-002, 2.13792268e-002, -4.09252346e-002, + 4.50119004e-002, 1.61574289e-001, 1.13632940e-001, + 4.54430789e-001, 1.56103924e-001, 4.85478461e-001, + 1.94303319e-001, 2.77564451e-002, 9.22238734e-003, + 4.88271862e-002, 2.14804504e-002, -2.13092216e-003, + 4.14742331e-004, 5.63488202e-003, 3.62746185e-003, + 9.40661132e-003, 2.62817312e-002, 3.39161344e-002, + 3.49426530e-002, 6.36723861e-002, 2.93633714e-002, + 7.12636709e-002, 4.04762849e-002, 1.68982442e-004, + -1.23837695e-003, 5.12331771e-003, 3.25017353e-003, + -9.82108060e-004, -8.32006393e-004, 5.31202601e-003, + 4.25132504e-003, -4.95227519e-003, -3.76701467e-002, + 3.30872163e-002, 5.70167489e-002, -1.57988712e-003, + -3.66110504e-002, 2.51725968e-002, 6.20667487e-002, + -2.39295908e-003, -3.26834270e-003, 4.63009067e-003, + 7.78701855e-003, -4.20058854e-002, -9.26621910e-003, + 5.94654605e-002, 2.64846068e-002, -2.52715886e-001, + -2.79938251e-001, 3.20772082e-001, 3.29678088e-001, + 3.83910760e-002, -3.28467786e-001, 1.19357876e-001, + 3.71824503e-001, 1.07546290e-002, -3.98523398e-002, + 2.51158513e-002, 4.92743105e-002, -4.72148247e-002, + -2.88923644e-003, 6.50699288e-002, 2.25365367e-002, + -2.87712514e-001, 3.66899930e-002, 3.36406261e-001, + 1.24754377e-001, 2.50968412e-002, 3.06040179e-002, + 9.43311378e-002, 1.06742918e-001, 1.20985629e-002, + -9.98504838e-005, 2.12908201e-002, 1.94367226e-002, + -5.59439510e-003, -1.24111550e-003, 8.62212386e-003, + 3.42187169e-003, -3.35270353e-002, 1.04624778e-002, + 4.62805815e-002, 2.42543593e-002, 5.96485857e-004, + 1.17723020e-002, 1.84583366e-002, 2.28339192e-002, + 4.63247270e-004, 6.79799065e-004, 2.84932810e-003, + 3.00764199e-003, -2.94958637e-003, 1.65782997e-003, + 7.47142080e-003, 3.14219785e-003, -4.29947935e-002, + -1.33065572e-002, 6.55312389e-002, 2.66569946e-002, + 4.83469479e-003, -1.52406683e-002, 3.36950049e-002, + 2.92297862e-002, 4.21821699e-003, 5.46025462e-004, + 9.37048532e-003, 4.15355945e-003, -2.26233173e-002, + 2.43523717e-003, 5.23093604e-002, 1.36700785e-002, + -3.55755150e-001, -2.71105599e-002, 4.77553844e-001, + 1.03395432e-001, 2.72707306e-002, -3.52606736e-002, + 1.84082508e-001, 1.10759221e-001, 5.81315942e-002, + 1.53060525e-003, 8.88718963e-002, 2.63613556e-002, + -2.41119824e-002, -2.20160559e-003, 5.45895286e-002, + 1.35779837e-002, -3.47375602e-001, 3.27776745e-002, + 4.78795826e-001, 1.09530412e-001, 2.94232406e-002, + 4.21646163e-002, 2.02073202e-001, 1.06839612e-001, + 5.82773127e-002, 2.21337448e-003, 9.18661654e-002, + 2.62792818e-002, -3.38289910e-003, -1.37207471e-003, + 8.15750100e-003, 2.96857394e-003, -4.07727659e-002, + 1.61374081e-002, 6.52055666e-002, 2.99411677e-002, + 4.12037596e-003, 1.71990227e-002, 3.74386944e-002, + 3.05993389e-002, 3.86472698e-003, -5.08413126e-004, + 9.84979421e-003, 4.27141879e-003, 4.17772261e-003, + 6.49777846e-003, 1.07172374e-002, 1.41086346e-002, + -9.92022082e-003, 8.94793496e-002, 4.03430611e-002, + 1.52924463e-001, -3.84547806e-004, 6.83634430e-002, + 3.00866831e-002, 1.32382378e-001, -1.57749199e-003, + 4.52582538e-003, 7.94081017e-003, 1.31349359e-002, + 1.18417867e-001, 2.14056820e-002, 1.82778001e-001, + 5.03992476e-002, 4.28859815e-002, 2.71563351e-001, + 2.06897676e-001, 3.43189627e-001, -7.18206391e-002, + 3.33693832e-001, 1.77947834e-001, 4.05817181e-001, + -9.98187438e-002, 2.74093151e-002, 1.39393091e-001, + 5.17537929e-002, 1.19557492e-001, 1.53188258e-002, + 1.78525880e-001, 3.94865200e-002, 5.03927730e-002, + 3.22342990e-003, 1.57122299e-001, 9.96723399e-002, + -1.00750685e-001, -1.99685916e-002, 1.76948622e-001, + 1.10291354e-001, -9.87683833e-002, -3.55594303e-003, + 1.44022048e-001, 3.20415720e-002, 1.05560618e-002, + 2.48985249e-003, 1.73547808e-002, 4.89800656e-003, + 4.99845017e-003, -5.92993898e-003, 2.44251397e-002, + 1.72289107e-002, -1.75383259e-002, -7.31516909e-003, + 2.86991596e-002, 2.14440189e-002, -9.94609948e-003, + 1.94437546e-003, 1.59174390e-002, 5.56246378e-003, + -1.46691897e-003, 5.78336010e-004, 4.88652848e-003, + 3.68005084e-003, -1.34024955e-003, -1.04918834e-002, + 2.58407462e-002, 2.51803622e-002, 2.46862229e-002, + -9.49828140e-003, 4.20222990e-002, 2.77113840e-002, + 5.45754610e-003, 2.19218084e-003, 8.69189389e-003, + 4.98845568e-003, -2.50467248e-002, 1.22842919e-002, + 4.15801182e-002, 3.06094289e-002, -5.18082194e-002, + 3.37995552e-002, 1.65126160e-001, 1.53380916e-001, + 2.43592232e-001, 3.36746909e-002, 3.43700320e-001, + 1.66511580e-001, 5.29475138e-002, 1.68721117e-002, + 7.13462532e-002, 3.44519690e-002, -2.49897540e-002, + 3.02966461e-002, 4.57733050e-002, 4.51539829e-002, + -9.51977670e-002, 2.34089851e-001, 2.12499425e-001, + 3.02036554e-001, 2.82479674e-001, 2.15039939e-001, + 3.85761052e-001, 2.80138105e-001, 4.13482934e-002, + 1.38863698e-002, 5.92885055e-002, 2.98719667e-002, + 1.28221139e-003, 2.34964048e-003, 5.40695619e-003, + 5.72700892e-003, -8.32718890e-003, 4.44055386e-002, + 3.69981192e-002, 5.65049872e-002, 2.19191872e-002, + 4.33674566e-002, 4.36836109e-002, 5.45167625e-002, + 1.04896678e-003, -6.71892076e-006, 4.91152657e-003, + 3.59626114e-003, -2.60246661e-003, 1.71481154e-003, + 7.63114402e-003, 5.12429466e-003, -4.03376184e-002, + -1.66576020e-002, 5.68739399e-002, 4.07866687e-002, + -9.37322993e-003, -1.90691072e-002, 2.87755635e-002, + 3.41233127e-002, 6.94859948e-004, -8.46471346e-004, + 3.79526755e-003, 3.69578740e-003, -4.35023941e-002, + -9.62770078e-003, 6.63781092e-002, 3.57012190e-002, + -2.89529741e-001, -1.27961114e-001, 3.60951602e-001, + 2.24728331e-001, 6.03925111e-003, -3.81611213e-002, + 1.27240494e-001, 1.40888855e-001, 1.59262922e-002, + -8.77114071e-004, 2.75906045e-002, 2.22755056e-002, + -4.61787619e-002, 1.46949766e-002, 6.42802417e-002, + 3.84527445e-002, -2.34910086e-001, 2.76701808e-001, + 3.27686995e-001, 3.48263681e-001, -7.70635623e-003, + 2.11402848e-001, 1.46402583e-001, 2.76571721e-001, + 1.40228570e-002, 1.93870552e-002, 2.89932657e-002, + 3.39106172e-002, -1.06857880e-003, 5.31880127e-004, + 5.80959162e-003, 4.85768449e-003, -2.01628637e-002, + 3.82937156e-002, 4.54273820e-002, 5.79514354e-002, + -1.78685207e-002, 4.16031182e-002, 3.77997570e-002, + 6.00795336e-002, -1.39915559e-003, 3.40826157e-003, + 4.83534625e-003, 6.62761787e-003, -1.40314351e-003, + 1.34507252e-003, 7.76218623e-003, 5.51237119e-003, + -1.96583178e-002, -2.44641751e-002, 5.22860326e-002, + 4.55261022e-002, 1.45317577e-002, -2.25955620e-002, + 4.55775484e-002, 4.31148559e-002, 2.55248439e-003, + 5.47986070e-004, 6.85400376e-003, 4.95699374e-003, + -4.19742651e-002, -1.21669024e-002, 7.05902576e-002, + 4.16005142e-002, -1.32840037e-001, -8.94111693e-002, + 3.49115759e-001, 2.54492581e-001, 1.37017131e-001, + -4.66351733e-002, 2.90170789e-001, 2.14515388e-001, + 4.45895679e-002, 1.95438261e-004, 6.34036362e-002, + 3.64510641e-002, -5.74061796e-002, -1.61165418e-003, + 7.63359144e-002, 3.97692695e-002, 4.89251912e-002, + 1.58067092e-001, 3.21902931e-001, 2.73245960e-001, + 7.59716183e-002, 1.97337762e-001, 3.03884208e-001, + 2.73392171e-001, 4.29517180e-002, 1.44712087e-002, + 6.24329038e-002, 3.75150107e-002, -2.59948149e-003, + 1.09397795e-003, 7.83136394e-003, 5.46408258e-003, + 1.12996865e-002, 3.09248697e-002, 4.69215624e-002, + 4.85606343e-002, 8.53968039e-003, 2.72372141e-002, + 4.52250279e-002, 4.53648232e-002, 8.94372235e-004, + 2.41726491e-004, 5.92491217e-003, 4.85244021e-003, + -1.40903576e-003, -8.90507692e-007, 4.89218952e-003, + 4.26443666e-003, -1.77858546e-002, -2.20354758e-002, + 3.41736898e-002, 3.88980322e-002, 9.76457726e-003, + -2.15768963e-002, 2.96735726e-002, 3.81731316e-002, + 6.00321218e-004, -5.83299552e-004, 4.58148681e-003, + 4.69760224e-003, -2.10971218e-002, -1.04310960e-002, + 3.93711701e-002, 3.57526876e-002, -1.51606053e-001, + -2.12983470e-002, 2.33225867e-001, 2.13611633e-001, + 9.24635828e-002, -2.10329816e-002, 1.87323734e-001, + 2.06718698e-001, 1.61935445e-002, -8.37448612e-003, + 3.52249816e-002, 3.61254774e-002, -1.87978204e-002, + 2.04227283e-003, 3.57946120e-002, 6.89028278e-002, + -7.46450499e-002, 9.28569138e-002, 1.71603203e-001, + 5.33014536e-001, 2.63063721e-002, 8.39180127e-002, + 1.45311460e-001, 4.82435286e-001, 1.51303606e-002, + 1.67642604e-003, 3.14138308e-002, 6.27509877e-002, + 1.60100491e-004, 3.53178941e-003, 4.54883371e-003, + 7.49536185e-003, -1.07583811e-003, 4.41251621e-002, + 2.75762640e-002, 6.85375333e-002, -6.68003922e-003, + 4.90951426e-002, 2.65841074e-002, 7.22953230e-002, + -1.16300117e-003, 5.17055765e-003, 4.63545322e-003, + 8.87822174e-003, -1.16091559e-003, -1.32736168e-003, + 5.26378723e-003, 6.80209929e-003, -1.28726782e-002, + -2.80939266e-002, 3.43248546e-002, 5.19997366e-002, + -1.09478564e-003, -2.84143761e-002, 3.27871256e-002, + 5.09873442e-002, 3.68861511e-004, -1.60663889e-003, + 4.65880614e-003, 6.42652577e-003, -3.20060141e-002, + 4.21623513e-003, 4.64737490e-002, 5.35398461e-002, + -9.94165465e-002, -4.08936106e-002, 2.09142640e-001, + 3.24193448e-001, 8.36718976e-002, 2.60369945e-002, + 1.77627951e-001, 3.15471798e-001, 1.51287764e-002, + 4.87353466e-003, 3.51394489e-002, 4.27329466e-002, + -2.21638903e-002, 3.46084535e-002, 4.32780795e-002, + 5.26525155e-002, -2.94106960e-001, 1.50713429e-001, + 3.69871944e-001, 3.27524900e-001, 1.26131311e-001, + -3.69696878e-002, 2.16174394e-001, 2.96077371e-001, + 1.68672111e-002, 3.06555699e-003, 3.86780985e-002, + 4.12441418e-002, -6.26371882e-004, -8.17050692e-004, + 4.77662776e-003, 5.69377141e-003, -2.89926659e-002, + 3.98196541e-002, 4.67030704e-002, 6.71586469e-002, + -2.19510635e-003, 5.69822676e-002, 3.76643538e-002, + 7.52915666e-002, -2.66765303e-004, 2.85428343e-003, + 5.69314696e-003, 7.52491131e-003, -9.18843783e-003, + 2.63924641e-003, 1.20140668e-002, 4.82413592e-003, + -1.95528958e-002, -1.31726954e-002, 4.39164117e-002, + 2.70254239e-002, 8.97742715e-003, -1.52177429e-002, + 2.78257821e-002, 2.69922521e-002, 2.27250959e-004, + -2.92777491e-004, 4.23039682e-003, 3.47427744e-003, + -6.69676214e-002, 1.89819504e-002, 8.64558145e-002, + 3.04277744e-002, -2.65465677e-001, -6.45449094e-004, + 3.73301357e-001, 1.33107752e-001, 6.95367083e-002, + -5.77776693e-002, 1.36275843e-001, 1.14135765e-001, + 1.77109614e-002, -4.25556069e-003, 3.18907984e-002, + 2.11644918e-002, -3.28085795e-002, 9.68584511e-003, + 6.28186241e-002, 2.28248965e-002, -4.46789771e-001, + 1.44410163e-001, 5.27516484e-001, 1.89557865e-001, + 7.12090582e-002, 3.13203931e-002, 1.43156335e-001, + 1.06296346e-001, 2.02624835e-002, 1.92301569e-003, + 3.33552696e-002, 2.17506960e-002, -5.39654691e-004, + -1.46354514e-003, 7.22942874e-003, 3.37538612e-003, + -7.07226172e-002, 2.55927667e-002, 8.55576098e-002, + 3.72908413e-002, 1.70146232e-003, 1.86495110e-002, + 3.10686603e-002, 3.02251074e-002, 1.27966423e-003, + 3.97871336e-004, 4.41703759e-003, 3.77890421e-003, + 5.72360866e-003, -1.63266133e-003, 8.24184436e-003, + 4.28640144e-003, 1.05626984e-002, 7.54221249e-003, + 2.18154937e-002, 1.79711934e-002, -1.05806638e-003, + 6.48329221e-003, 1.28087271e-002, 1.39213940e-002, + -6.14859397e-004, 1.28077314e-004, 2.19311845e-003, + 1.92590756e-003, 6.43069297e-002, -2.41935346e-002, + 7.80989155e-002, 4.07582037e-002, 1.18673936e-001, + -1.08949132e-002, 1.74268886e-001, 1.06822729e-001, + -2.00369842e-002, 1.17094098e-002, 7.31786117e-002, + 6.93155527e-002, -1.11003546e-002, -1.85148267e-003, + 1.91142894e-002, 1.47923604e-002, 4.40617800e-002, + -4.04822379e-002, 6.27488717e-002, 5.25459424e-002, + 2.74913102e-001, -4.00513232e-001, 3.25244904e-001, + 4.34939593e-001, -2.81927027e-002, -3.07615012e-001, + 1.39715835e-001, 3.47727358e-001, -1.14661511e-002, + -3.92788313e-002, 2.79398300e-002, 4.78677079e-002, + -5.19864943e-006, -1.22141629e-003, 4.14072024e-003, + 4.85045416e-003, 1.66722517e-002, -4.18125503e-002, + 3.35686542e-002, 6.25395104e-002, 1.01584597e-002, + -5.50983436e-002, 3.64643633e-002, 7.74607733e-002, + 2.16501323e-003, -5.04283095e-003, 5.16946893e-003, + 9.28667840e-003, 3.55724915e-004, 1.56175531e-003, + 4.24759975e-003, 5.23077790e-003, 6.31232606e-003, + 3.63167189e-002, 3.00651956e-002, 5.58400452e-002, + -9.15933773e-003, 3.52820307e-002, 3.18862088e-002, + 5.64292111e-002, -5.08213299e-004, 9.78757977e-004, + 4.13047336e-003, 5.11607807e-003, 2.68853251e-002, + 6.81048585e-003, 4.14324850e-002, 3.53803635e-002, + 1.75981089e-001, 1.07409544e-001, 2.54122764e-001, + 3.54103595e-001, -2.03560248e-001, 1.09503455e-001, + 3.05689454e-001, 3.89076114e-001, -2.63544675e-002, + 7.24151824e-003, 4.23099697e-002, 3.93533371e-002, + 2.45407224e-002, -1.96986017e-003, 4.08603176e-002, + 2.74269879e-002, 1.75637275e-001, -4.21638228e-002, + 2.50617921e-001, 1.88746929e-001, -1.86518833e-001, + -3.65162157e-002, 2.77257264e-001, 2.08560839e-001, + -2.68864725e-002, 6.82722253e-004, 4.27449793e-002, + 3.13445143e-002, 1.79230445e-003, 4.13984299e-006, + 4.94025694e-003, 3.92910698e-003, 1.61281265e-002, + -2.06321944e-002, 3.41071710e-002, 3.59256603e-002, + -1.85074452e-002, -2.12109983e-002, 3.72946262e-002, + 3.71087492e-002, -1.78461976e-003, 1.97266825e-004, + 5.07350359e-003, 4.33710730e-003, -2.82683503e-003, + -1.19359128e-003, 6.62868097e-003, 5.99570293e-003, + 3.14087514e-003, -2.78334226e-002, 3.19014974e-002, + 4.70953844e-002, 9.51705780e-003, -2.25657690e-002, + 3.14052664e-002, 4.61520329e-002, -6.42713567e-004, + -1.36902626e-003, 4.89500165e-003, 5.97935729e-003, + -4.94960323e-002, 1.60539020e-002, 6.20331578e-002, + 4.37189676e-002, -5.16156815e-002, -4.26899716e-002, + 1.58083543e-001, 1.85904980e-001, 6.59719631e-002, + -1.16300061e-001, 1.40631273e-001, 2.20451578e-001, + 1.59964077e-002, -1.07376324e-002, 3.11893504e-002, + 3.68786380e-002, -6.57976568e-002, 6.31026104e-002, + 8.42285678e-002, 7.75944665e-002, -2.09056288e-001, + 3.22616488e-001, 2.76107848e-001, 4.08580899e-001, + 6.72071874e-002, 2.36650810e-001, 1.65921494e-001, + 3.26123953e-001, 2.13882718e-002, 3.37665044e-002, + 3.99016738e-002, 5.22956401e-002, -2.36839376e-004, + 3.40330950e-003, 7.25060888e-003, 9.96027049e-003, + -1.93952154e-002, 1.05671309e-001, 4.55407239e-002, + 1.37151212e-001, -4.94999904e-003, 1.25414938e-001, + 4.20850217e-002, 1.51789695e-001, -2.28748797e-003, + 1.15029998e-002, 6.91376021e-003, 1.57425646e-002, + 1.01292710e-004, 7.75000546e-004, 6.13448257e-003, + 4.08252655e-003, 1.58378351e-002, 3.23358402e-002, + 4.15963605e-002, 4.47639078e-002, -2.81866826e-002, + 3.08029819e-002, 5.91036528e-002, 4.57183421e-002, + -4.89510363e-004, -4.88330552e-004, 5.17472159e-003, + 4.00333293e-003, 2.51277462e-002, 6.02834811e-003, + 5.26072085e-002, 2.39137616e-002, 9.37835053e-002, + 7.77309984e-002, 3.26493591e-001, 1.70971930e-001, + -2.39648804e-001, 5.17886542e-002, 4.94340211e-001, + 1.78267375e-001, -1.62629448e-002, 1.11845434e-002, + 4.61893119e-002, 2.68542189e-002, 3.59777622e-002, + 4.00343118e-003, 6.09206446e-002, 2.32155658e-002, + -5.67094088e-002, -3.24830413e-002, 4.06495154e-001, + 1.43362358e-001, -4.12356183e-002, -9.68782324e-003, + 3.40103000e-001, 1.64706782e-001, -3.36525142e-002, + 1.27345305e-002, 5.54034449e-002, 3.01225875e-002, + 3.14629218e-003, 2.33554485e-004, 7.67135667e-003, + 3.80830793e-003, -9.58425738e-003, -1.62040088e-002, + 5.56353740e-002, 3.23054418e-002, -4.65717539e-003, + -1.78196784e-002, 4.25983630e-002, 3.52242589e-002, + -2.80691520e-003, -1.92486899e-004, 6.48346310e-003, + 4.52047959e-003, 1.24665094e-003, -3.37444908e-005, + 5.06259222e-003, 2.51999847e-003, 2.27144193e-002, + 1.35618877e-002, 4.17194143e-002, 2.52264012e-002, + -2.53066756e-002, 1.78256445e-002, 5.86067699e-002, + 2.98717078e-002, -1.40612246e-003, -3.39382415e-004, + 5.53003233e-003, 2.90397182e-003, 1.75282657e-002, + 2.44915579e-003, 3.87448557e-002, 1.49052450e-002, + 1.87096372e-001, 1.82819813e-002, 2.83652872e-001, + 1.15578242e-001, -1.58099920e-001, 7.22708106e-002, + 5.14822900e-001, 1.48862153e-001, -2.05490422e-002, + 1.82561844e-003, 4.55027707e-002, 1.78512894e-002, + 2.05973256e-002, 1.21212367e-003, 3.98578718e-002, + 1.45431561e-002, 1.26497388e-001, -2.61046570e-002, + 2.62088180e-001, 1.08118817e-001, -6.99524209e-002, + -4.35422771e-002, 5.21675229e-001, 1.33391872e-001, + -2.84821559e-002, 2.66567897e-003, 5.05591929e-002, + 1.87074710e-002, 2.10965960e-003, 3.12293327e-004, + 5.13789617e-003, 2.35026376e-003, 1.23891970e-002, + -9.37899575e-003, 3.64371166e-002, 2.03726515e-002, + -8.13251641e-003, -1.58545393e-002, 5.81441633e-002, + 2.73617879e-002, -3.43430392e-003, 5.72711520e-004, + 6.80775708e-003, 3.07082571e-003, -9.54177137e-003, + 1.27386372e-003, 1.27402144e-002, 4.44702990e-003, + -1.88990291e-002, -1.44343041e-002, 3.82997319e-002, + 2.60588694e-002, 3.99023294e-002, -1.74541641e-002, + 6.01189882e-002, 3.11379880e-002, 1.09690977e-002, + 3.46884783e-003, 2.11342834e-002, 6.52383314e-003, + -8.35700557e-002, 1.06626190e-002, 1.04226783e-001, + 2.72677913e-002, -1.88338384e-001, -3.14152311e-003, + 2.73256510e-001, 1.07427791e-001, 2.56466478e-001, + -4.84275185e-002, 3.75586987e-001, 1.24479160e-001, + 1.33077264e-001, -1.71911716e-003, 1.97551519e-001, + 3.69825289e-002, -7.15641454e-002, 6.95573352e-003, + 9.85657573e-002, 2.50269659e-002, -2.48267427e-001, + 6.08396269e-002, 3.27597201e-001, 1.19589448e-001, + 1.73018396e-001, 1.06932512e-002, 3.09445024e-001, + 1.07091010e-001, 1.52826846e-001, -1.88631490e-002, + 2.13139310e-001, 4.12904918e-002, -6.46950910e-003, + -8.54161452e-004, 1.16918562e-002, 4.04640287e-003, + -4.00559679e-002, 1.62444171e-002, 5.61752245e-002, + 2.90836766e-002, 1.68094765e-002, 1.27711864e-002, + 4.27627303e-002, 2.57688463e-002, 1.55277997e-002, + -2.98985583e-003, 2.30497159e-002, 6.21123472e-003, + 2.62268283e-003, 7.83565396e-004, 5.09114657e-003, + 4.21787659e-003, -2.26900773e-003, 2.91970149e-002, + 2.98764799e-002, 3.80678363e-002, -2.11513247e-002, + 2.46979017e-002, 3.56316492e-002, 3.63162942e-002, + -7.18257565e-004, 1.72859145e-004, 4.06398019e-003, + 3.69973108e-003, 4.03324738e-002, -1.28402896e-002, + 4.83624898e-002, 3.22873630e-002, 1.27727032e-001, + 8.37465748e-002, 2.20958903e-001, 1.94604769e-001, + -2.32852980e-001, 1.79212585e-001, 2.74806440e-001, + 2.24685460e-001, -2.76726931e-002, 8.44205357e-003, + 4.05019037e-002, 2.80209389e-002, 2.27456279e-002, + -2.11514644e-002, 3.82920206e-002, 3.21732573e-002, + 3.29599679e-001, -2.17517018e-001, 3.58417213e-001, + 2.56203949e-001, -2.14408293e-001, -8.92898664e-002, + 2.71941453e-001, 1.89257994e-001, -3.39757130e-002, + -2.06033536e-003, 4.54764664e-002, 2.86364015e-002, + 1.21602701e-004, 3.84825456e-004, 3.91394133e-003, + 3.23355384e-003, 3.58550958e-002, -2.56310608e-002, + 4.60496880e-002, 3.70559357e-002, -9.38699022e-003, + -3.05866040e-002, 3.72684486e-002, 4.01390716e-002, + -2.19259481e-003, -6.60316728e-005, 5.01982495e-003, + 3.92271206e-003, 1.69397751e-003, 1.92131952e-003, + 6.84812292e-003, 7.15827616e-003, 3.86785306e-002, + 9.07425359e-002, 5.33939935e-002, 1.22309782e-001, + 7.52597908e-003, 1.03035882e-001, 3.34443115e-002, + 1.39795274e-001, 1.22735277e-004, 9.92296636e-003, + 5.25453547e-003, 1.57190394e-002, 4.60208841e-002, + 7.30598532e-003, 8.10112581e-002, 2.79394165e-002, + 4.28355396e-001, 1.67501226e-001, 4.73816991e-001, + 2.27511033e-001, -3.76131572e-002, 8.46083611e-002, + 1.15576059e-001, 1.50661290e-001, -1.88525431e-002, + 1.18515231e-002, 3.40956077e-002, 2.52493657e-002, + 7.61251822e-002, 1.52429324e-002, 1.03591017e-001, + 3.13384496e-002, 2.98198998e-001, 3.79915759e-002, + 3.66490990e-001, 1.18047692e-001, -3.99042703e-002, + -7.59334117e-003, 9.72533226e-002, 6.83696195e-002, + -1.58719160e-002, 1.15384825e-003, 2.85790060e-002, + 1.34379398e-002, 1.13253575e-002, 2.78079743e-003, + 1.50677813e-002, 5.39503293e-003, 3.03690769e-002, + -7.06699071e-003, 4.48745377e-002, 2.09102444e-002, + -4.76954691e-003, -7.19787693e-003, 1.77053027e-002, + 1.51757598e-002, -1.18896901e-003, -1.65145306e-004, + 3.46992211e-003, 1.96957658e-003, -1.12952723e-003, + -4.67568985e-004, 4.64640372e-003, 3.31668509e-003, + -1.75885037e-002, -3.48075554e-002, 4.08908464e-002, + 4.41984087e-002, 1.79482549e-002, -3.35605703e-002, + 3.85457315e-002, 4.53580469e-002, 7.62137410e-004, + -7.82251533e-004, 4.80935862e-003, 4.17679362e-003, + -2.73774303e-002, -8.38513300e-003, 4.30194065e-002, + 2.39167977e-002, -2.68101901e-001, -1.60783872e-001, + 3.28703374e-001, 2.17175022e-001, 2.25667849e-001, + -1.84548229e-001, 2.81171292e-001, 2.40843371e-001, + 3.00048348e-002, -1.15150195e-002, 4.53631245e-002, + 3.04951966e-002, -3.17916162e-002, -6.56117545e-003, + 4.65598591e-002, 2.27673780e-002, -2.57733077e-001, + 1.17746321e-002, 3.16187948e-001, 1.30513504e-001, + 2.45742515e-001, 6.05590269e-002, 2.89561421e-001, + 1.43730402e-001, 3.03243678e-002, 4.19283868e-004, + 4.71218564e-002, 2.59615090e-002, -3.61595862e-003, + -1.16245274e-003, 6.32426655e-003, 3.40484455e-003, + -2.24902425e-002, 1.23885125e-002, 4.15641367e-002, + 2.48705484e-002, 2.87588667e-002, 1.29095251e-002, + 4.08623703e-002, 2.57937126e-002, 2.09415564e-003, + -9.73700662e-004, 5.62020997e-003, 3.62803577e-003, + 1.82777899e-003, 3.35287943e-004, 5.73225971e-003, + 3.09680053e-003, 1.19816903e-002, 2.26839185e-002, + 3.55720632e-002, 3.01396847e-002, -5.60194477e-002, + 2.22157650e-002, 6.61498234e-002, 3.17218117e-002, + -1.49685540e-003, -9.64540639e-004, 5.00647211e-003, + 3.06457584e-003, 2.96356361e-002, 4.59942548e-003, + 4.51519340e-002, 1.91363785e-002, 1.16840176e-001, + 5.16182519e-002, 1.84264690e-001, 1.03660516e-001, + -4.38472629e-001, 8.34785774e-002, 4.76708233e-001, + 1.32442743e-001, -2.11176965e-002, 2.96303537e-003, + 3.97652425e-002, 1.74964983e-002, 2.93119680e-002, + 5.37677959e-004, 4.36871611e-002, 1.75168440e-002, + 1.07176691e-001, -3.65292430e-002, 1.67659700e-001, + 8.89495164e-002, -3.63938421e-001, 4.23904555e-003, + 4.10424709e-001, 1.05458863e-001, -3.33030745e-002, + 8.44096672e-003, 4.90718707e-002, 2.02178769e-002, + 2.14610761e-003, -1.84569653e-005, 5.17759938e-003, + 2.57589947e-003, 1.29876221e-002, -1.45941814e-002, + 2.83449702e-002, 2.19956115e-002, -3.85970995e-002, + -1.19952532e-002, 5.15138432e-002, 2.32630782e-002, + -4.76643862e-003, 1.70734164e-003, 7.39020435e-003, + 3.66471778e-003, 7.26971251e-004, 2.15545297e-003, + 4.57167253e-003, 5.13185328e-003, -1.23596098e-002, + 2.75571868e-002, 3.33885476e-002, 4.46263514e-002, + -1.51240628e-003, 1.55778332e-002, 2.76741143e-002, + 3.67818326e-002, 4.50968597e-004, 9.61611629e-004, + 4.26810095e-003, 4.61527612e-003, 3.62615474e-002, + 4.91127092e-003, 4.86716218e-002, 3.49784419e-002, + -6.65372387e-002, 1.60774902e-001, 2.73390621e-001, + 2.94778228e-001, 5.03430329e-003, 3.02051961e-001, + 2.35672340e-001, 3.56049836e-001, -3.21634971e-002, + 2.21902318e-002, 4.71734628e-002, 4.07049954e-002, + 2.67027691e-002, -2.00254731e-002, 4.16458175e-002, + 3.44990902e-002, 9.33364779e-002, -2.00409919e-001, + 2.38255024e-001, 2.72387356e-001, 1.16895838e-002, + -1.67303205e-001, 2.70337343e-001, 2.74630874e-001, + -3.72102931e-002, -1.39367785e-002, 5.21427020e-002, + 3.70821245e-002, 1.29474705e-004, -4.56788111e-004, + 4.06568777e-003, 4.10553487e-003, 9.01050493e-003, + -2.05947943e-002, 3.02670486e-002, 3.77534032e-002, + 8.25584633e-004, -2.57664621e-002, 3.32191847e-002, + 4.32637855e-002, -5.52236394e-004, -9.53810173e-004, + 4.79148841e-003, 4.82157944e-003, -2.57506873e-003, + -1.83840818e-003, 8.02148972e-003, 7.11557735e-003, + -5.90607151e-003, -8.42882246e-002, 4.51226681e-002, + 1.13743573e-001, -3.97908222e-003, -9.45924744e-002, + 3.38357240e-002, 1.27510950e-001, -1.99651555e-003, + -8.08174349e-003, 5.31815737e-003, 1.34033281e-002, + -5.44208512e-002, -4.94793616e-003, 7.67848492e-002, + 3.18527892e-002, -2.78487593e-001, -1.28065512e-001, + 3.55041772e-001, 2.81757414e-001, 5.66720963e-002, + -1.37184918e-001, 1.34886459e-001, 3.16654861e-001, + 1.42935729e-002, -1.73984654e-002, 2.83187535e-002, + 4.33334075e-002, -5.37524596e-002, 4.66604531e-003, + 7.53754899e-002, 2.84372400e-002, -2.48834416e-001, + 1.61181211e-001, 3.29113543e-001, 2.25671113e-001, + 2.46867146e-002, 1.45939335e-001, 1.16228774e-001, + 2.11345926e-001, 1.18129216e-002, 1.33849401e-002, + 2.50243358e-002, 3.11401263e-002, -3.76529712e-003, + 5.81882137e-004, 8.21573287e-003, 4.97254403e-003, + -1.99663732e-002, 4.47501168e-002, 4.42005880e-002, + 6.27168566e-002, -6.01704884e-003, 4.74334210e-002, + 2.77915020e-002, 6.55142367e-002, -4.38152289e-004, + 4.65280516e-003, 4.10036463e-003, 7.91479647e-003, + -1.91111269e-003, -9.53427370e-005, 5.35262702e-003, + 4.24561091e-003, -1.17292497e-002, -2.61886343e-002, + 3.88232246e-002, 4.09875289e-002, 1.92790129e-003, + -2.77530756e-002, 3.02245487e-002, 4.37734500e-002, + -7.81893323e-004, -2.09684740e-003, 4.13836678e-003, + 5.41985221e-003, -3.50134298e-002, -1.38832694e-002, + 4.84971590e-002, 3.30356732e-002, -1.87234387e-001, + -1.60121366e-001, 2.64434636e-001, 2.22690970e-001, + 2.85957139e-002, -1.86964050e-001, 1.39659926e-001, + 2.50334203e-001, 1.64704341e-002, -1.60680898e-002, + 2.85847019e-002, 3.73090506e-002, -3.75042781e-002, + 4.54051560e-003, 4.83944379e-002, 3.52817290e-002, + -9.71777588e-002, 2.12434381e-001, 2.19442755e-001, + 2.94010878e-001, 8.53681192e-002, 3.71140838e-001, + 1.68792650e-001, 4.07280684e-001, 1.48737067e-002, + 4.66606170e-002, 3.03776469e-002, 5.60498536e-002, + -1.30532193e-003, 2.18329299e-003, 5.14517585e-003, + 5.03636571e-003, 1.05054416e-002, 3.76638137e-002, + 3.47955897e-002, 5.03469966e-002, 9.91088711e-003, + 2.75123287e-002, 3.04114819e-002, 4.64169532e-002, + -1.77237729e-003, 1.68881973e-003, 4.36157826e-003, + 5.65992482e-003, -2.19124332e-002, 3.41106812e-003, + 2.79062074e-002, 7.24234385e-003, -2.82213259e-002, + -1.30651901e-002, 4.72960770e-002, 2.92002447e-002, + 2.43018679e-002, -1.17240679e-002, 3.43982838e-002, + 2.57842951e-002, 2.22305302e-003, 4.93490894e-004, + 6.35943608e-003, 3.86787392e-003, -1.98080733e-001, + 9.15028714e-003, 2.39909247e-001, 3.83786298e-002, + -2.52312154e-001, 1.08923232e-002, 3.29173088e-001, + 1.33940607e-001, 1.95703730e-001, -2.28059199e-002, + 2.34189659e-001, 1.19789585e-001, 2.90271994e-002, + 5.02924318e-004, 4.99406867e-002, 2.73566023e-002, + -1.82854444e-001, -6.90150401e-003, 2.21967623e-001, + 4.59975116e-002, -2.47658834e-001, 1.09415933e-001, + 3.44517708e-001, 2.17634141e-001, 1.52343184e-001, + 8.36554840e-002, 2.15686709e-001, 1.65102407e-001, + 3.27785015e-002, 2.38796184e-003, 5.40966056e-002, + 3.31281759e-002, -1.20021086e-002, -7.25400983e-004, + 1.97462030e-002, 7.92020373e-003, -4.17707786e-002, + 5.04480414e-002, 6.95293099e-002, 7.33898357e-002, + 8.32931232e-003, 3.91818210e-002, 3.97024229e-002, + 5.46845496e-002, 2.96809897e-003, 1.80026982e-003, + 7.05421064e-003, 6.25462504e-003, -1.65306177e-004, + -3.92519141e-004, 4.57852986e-003, 4.60482109e-003, + 2.51011029e-002, 1.55348489e-002, 4.49424908e-002, + 4.55734059e-002, 1.02032656e-002, 2.74443179e-002, + 4.37169299e-002, 4.98711951e-002, -4.55340167e-004, + 3.36962228e-004, 4.85617714e-003, 5.03661949e-003, + 1.70926005e-002, 1.55665614e-002, 4.47047539e-002, + 3.60126048e-002, 1.99847624e-001, 1.12172596e-001, + 3.38170737e-001, 3.37872952e-001, -3.59039828e-002, + -1.95322223e-002, 2.59845138e-001, 2.56284773e-001, + -1.65826082e-002, 5.31114312e-003, 4.75918464e-002, + 3.59595902e-002, 3.10448930e-002, -1.57764985e-003, + 5.01003116e-002, 3.63513678e-002, -4.11987528e-002, + -1.38914302e-001, 2.97826260e-001, 2.89614797e-001, + 1.52766287e-001, -6.66577667e-002, 3.24640125e-001, + 2.51496524e-001, -2.11208872e-002, 5.51304023e-004, + 4.78222556e-002, 3.37564908e-002, 8.11756123e-004, + -1.13514019e-003, 4.73579671e-003, 4.96924669e-003, + 5.27022406e-003, -1.37087647e-002, 3.46499346e-002, + 4.25632633e-002, 1.76256932e-002, -2.00950019e-002, + 4.24684882e-002, 4.78123836e-002, -1.22557278e-004, + -1.42612564e-003, 5.37360134e-003, 5.57624409e-003, + -2.31040595e-003, -9.60370875e-004, 5.81289362e-003, + 5.60552208e-003, 4.94613172e-003, -3.39954644e-002, + 3.74880955e-002, 5.10010161e-002, 1.42092239e-002, + -2.12992970e-002, 3.66283990e-002, 4.54302803e-002, + -6.89296576e-004, -8.17949549e-005, 4.64251777e-003, + 5.26814489e-003, -3.54702361e-002, 2.37988122e-002, + 5.06955869e-002, 4.42867242e-002, -1.54898733e-001, + 5.53877056e-002, 2.60765612e-001, 2.97452062e-001, + 1.06513053e-001, -1.84277177e-001, 2.08500788e-001, + 3.13605845e-001, 2.47807000e-002, -1.79763921e-002, + 4.06998582e-002, 4.52198051e-002, -2.17165593e-002, + 6.88338187e-003, 4.28397879e-002, 2.79972218e-002, + -2.53142864e-001, 8.51888955e-002, 3.56578559e-001, + 2.06059128e-001, 8.88043642e-002, 2.31836036e-001, + 2.40353301e-001, 2.88952500e-001, 2.61044875e-002, + 2.58658882e-002, 4.35209461e-002, 4.31966782e-002, + -1.18849846e-003, -4.66435624e-004, 5.37846843e-003, + 3.97032220e-003, -1.37377381e-002, 2.71601249e-002, + 4.61064912e-002, 4.08176854e-002, 1.57107655e-002, + 2.46434081e-002, 4.10664044e-002, 4.09042947e-002, + -2.31277663e-004, 9.36450204e-004, 5.21331979e-003, + 4.66875779e-003, -7.36554386e-004, 1.05511898e-003, + 6.81241369e-003, 3.92379984e-003, -6.09043837e-002, + -2.74536852e-002, 7.56991282e-002, 4.11264338e-002, + 1.96198770e-003, -2.23520827e-002, 3.78208160e-002, + 3.34035009e-002, 3.52805178e-003, 2.83308764e-004, + 6.36398001e-003, 4.08650981e-003, -4.07525338e-002, + -1.91538595e-002, 6.55777529e-002, 3.38566601e-002, + -3.70056123e-001, -1.96215838e-001, 4.45056587e-001, + 2.41488174e-001, 1.58089802e-001, -1.39968069e-002, + 2.23763555e-001, 1.27894729e-001, 3.20874825e-002, + 5.18741878e-003, 4.71558906e-002, 2.61661913e-002, + -6.34398088e-002, -1.22298943e-002, 7.90171176e-002, + 3.52548659e-002, -2.06226498e-001, 5.93411103e-002, + 2.99776196e-001, 1.70053512e-001, 2.00059041e-001, + 7.88139701e-002, 2.48023868e-001, 1.47623941e-001, + 2.41582841e-002, 4.85607423e-003, 4.24464270e-002, + 2.54072417e-002, -6.33325893e-003, -1.49027526e-003, + 9.49805789e-003, 4.90677962e-003, -1.65013727e-002, + 1.90178584e-002, 4.10728380e-002, 3.36465538e-002, + 2.18606722e-002, 2.12603342e-002, 4.00022864e-002, + 3.28076966e-002, 1.05659629e-003, 1.06224128e-004, + 5.17339585e-003, 3.97232920e-003, -7.10183382e-003, + 5.57336061e-005, 1.21888788e-002, 6.90203765e-003, + -1.46903209e-002, -2.58391127e-002, 3.65981646e-002, + 4.11959104e-002, 3.84653686e-003, -2.20312197e-002, + 2.49643940e-002, 3.74040045e-002, 1.58012437e-003, + -1.59879608e-004, 4.98809479e-003, 5.24985977e-003, + -6.96644038e-002, 2.49346700e-002, 1.01480760e-001, + 5.49240932e-002, -1.97840810e-001, 1.22910134e-001, + 2.65590608e-001, 2.59955645e-001, 5.56140095e-002, + 3.39354500e-002, 1.60945177e-001, 1.63870335e-001, + 1.94912273e-002, -1.31509107e-004, 3.94036695e-002, + 2.26848256e-002, -4.56740968e-002, -2.87897866e-002, + 7.46989921e-002, 7.26806074e-002, -2.08579853e-001, + -6.80772886e-002, 3.07035893e-001, 3.86709780e-001, + 4.87396419e-002, 2.01636180e-002, 1.90007403e-001, + 2.87398905e-001, 1.94700416e-002, 5.10342559e-003, + 3.22437473e-002, 4.04890589e-002, -2.54385383e-003, + 7.89425243e-003, 8.88224784e-003, 1.56576149e-002, + 5.46615617e-003, 1.55782789e-001, 5.29342405e-002, + 1.88774630e-001, -1.13069098e-002, 1.51782408e-001, + 4.28995527e-002, 1.78600565e-001, -1.81669532e-003, + 1.14870556e-002, 5.02708834e-003, 1.43854348e-002, + -8.48111871e-004, 1.60250568e-003, 6.39591226e-003, + 4.78400663e-003, -5.19748079e-004, 2.92234179e-002, + 4.00849991e-002, 4.96516712e-002, 2.73517217e-003, + 3.35701145e-002, 4.21382636e-002, 5.31656630e-002, + -2.24760221e-003, 8.29571625e-004, 5.70955174e-003, + 5.17955888e-003, 2.15963367e-002, 1.06934067e-002, + 5.68631776e-002, 2.78764591e-002, -3.13944519e-002, + 1.51973262e-001, 3.19444299e-001, 2.37181172e-001, + -6.87080920e-002, 2.65863985e-002, 3.86785686e-001, + 2.35572666e-001, -2.61794012e-002, -1.03098145e-002, + 4.88233194e-002, 3.42737176e-002, 3.15629616e-002, + 5.18447533e-003, 6.18327036e-002, 2.46517081e-002, + -6.52320832e-002, -7.60818599e-003, 3.36535424e-001, + 1.38077691e-001, -2.13086739e-001, -5.90134859e-002, + 4.50309157e-001, 1.61933467e-001, -9.76539217e-003, + -6.12434046e-003, 3.99014130e-002, 2.29132529e-002, + 2.86078965e-003, -1.34604794e-004, 7.60102551e-003, + 3.50237917e-003, -7.97159504e-003, -1.21011641e-002, + 4.75000106e-002, 2.85885688e-002, -3.47996652e-002, + -8.89977813e-003, 6.01916201e-002, 2.93050036e-002, + -4.87120618e-004, 6.56316755e-004, 4.84638894e-003, + 3.28093930e-003, 5.86336886e-004, -1.46308495e-003, + 5.37910964e-003, 5.93220396e-003, -7.73199461e-003, + -4.65394035e-002, 3.96416299e-002, 6.36998788e-002, + 2.39646132e-003, -5.61831519e-002, 4.07373123e-002, + 6.95721731e-002, 2.08434090e-003, -2.50843819e-003, + 5.57818357e-003, 6.41468214e-003, -3.16979103e-002, + -2.14253087e-002, 5.02939075e-002, 4.71803583e-002, + -9.86820534e-002, -1.94748625e-001, 2.54088491e-001, + 3.04015756e-001, 1.74212843e-001, 2.09118612e-002, + 2.59474814e-001, 3.10536653e-001, 4.21855971e-002, + 1.64555181e-002, 5.39797544e-002, 4.96297218e-002, + -3.92721146e-002, -9.72342037e-004, 5.52383922e-002, + 3.50826681e-002, -3.49682122e-002, 3.75173166e-002, + 2.34874055e-001, 1.70737535e-001, 3.55231702e-001, + 1.60024446e-002, 3.91961187e-001, 1.90092131e-001, + 2.36670505e-002, 7.13682408e-003, 4.44928184e-002, + 3.62026058e-002, -2.20839866e-003, -6.67733140e-004, + 6.20428752e-003, 4.82847961e-003, -4.11335193e-003, + 1.93616431e-002, 3.53347994e-002, 3.37011144e-002, + 3.66289914e-002, 1.42978625e-002, 4.89954725e-002, + 3.44458111e-002, 1.95812015e-003, -2.11857236e-003, + 5.96937072e-003, 5.27717033e-003, -8.61863326e-003, + 2.30891700e-003, 1.13929240e-002, 5.09342272e-003, + 8.84655304e-003, -1.33910608e-002, 2.89479308e-002, + 2.35108510e-002, 6.43765405e-002, -2.77465992e-002, + 7.88133740e-002, 3.99612188e-002, -2.90343747e-003, + 2.10012007e-003, 8.74952134e-003, 4.65406058e-003, + -1.15977995e-001, 4.17658389e-002, 1.26113445e-001, + 4.89066951e-002, -4.16163006e-004, -4.30360530e-003, + 2.13535190e-001, 1.20621867e-001, 3.09764206e-001, + -1.25833601e-001, 3.76895964e-001, 1.87226877e-001, + 3.46875787e-002, -1.07441125e-002, 8.08798820e-002, + 3.67636085e-002, -7.36448094e-002, 2.65580025e-002, + 9.74181592e-002, 3.87173854e-002, -2.25177228e-001, + 1.40709028e-001, 4.39784616e-001, 2.11102486e-001, + 1.38709798e-001, 2.11543776e-002, 2.24876314e-001, + 1.46166787e-001, 8.13937113e-002, -2.55152080e-002, + 1.02271967e-001, 4.44186665e-002, -1.83690118e-003, + -4.33886744e-004, 9.00064316e-003, 3.89512000e-003, + -6.11469932e-002, 4.53346185e-002, 9.12907347e-002, + 5.29268645e-002, 1.04350010e-002, 1.73166376e-002, + 3.76003347e-002, 3.41104753e-002, 6.90125488e-003, + -1.65710086e-003, 1.00229075e-002, 5.41283237e-003, + 1.50438267e-004, -1.55858893e-003, 4.30637226e-003, + 6.94020744e-003, 8.79475474e-003, -1.50391143e-002, + 2.87656579e-002, 5.94964400e-002, 3.49844503e-003, + -4.09506308e-003, 2.44225226e-002, 6.02105446e-002, + -9.27398505e-004, -6.87617518e-004, 4.26856475e-003, + 8.00189003e-003, -2.77336799e-002, -1.28131500e-002, + 3.91117483e-002, 4.94445749e-002, -4.12131734e-002, + -1.68297112e-001, 1.46367595e-001, 4.68811333e-001, + 5.70503622e-002, -2.39916563e-001, 1.37036026e-001, + 5.73962092e-001, 1.63566973e-002, -2.90565789e-002, + 3.12745236e-002, 7.17171058e-002, -3.00697666e-002, + 1.19415587e-002, 4.14903536e-002, 3.20039578e-002, + -3.80519368e-002, 1.17628522e-001, 1.29251942e-001, + 1.95339337e-001, 3.91693227e-002, 1.55848429e-001, + 1.15821965e-001, 2.28084400e-001, 1.79596338e-002, + 2.24414673e-002, 2.98419762e-002, 4.05059457e-002, + -1.51313387e-003, 2.45591975e-003, 4.89379978e-003, + 5.36922598e-003, 2.43183831e-003, 3.48025374e-002, + 2.51340624e-002, 5.00458777e-002, 6.12320937e-003, + 3.48792411e-002, 2.30998825e-002, 5.22557124e-002, + 3.49409383e-004, 2.96899816e-003, 4.30125045e-003, + 6.17266633e-003, 8.20905901e-003, -8.20665678e-004, + 1.33831007e-002, 4.87024896e-003, 1.02105942e-002, + 6.46910397e-003, 2.75989436e-002, 2.19608266e-002, + -2.11761724e-002, 7.73508800e-003, 4.01736349e-002, + 2.24093758e-002, -9.69466940e-003, -1.11446378e-003, + 1.54403877e-002, 5.51378494e-003, 8.67767707e-002, + -2.81824032e-003, 1.18808918e-001, 2.95438264e-002, + 4.19924222e-002, -2.32304316e-002, 1.70611069e-001, + 1.20178044e-001, -1.73099428e-001, -7.31522292e-002, + 2.82943606e-001, 1.67059362e-001, -7.86331519e-002, + -6.36854488e-003, 1.23059846e-001, 3.44696231e-002, + 8.04535821e-002, -2.36815177e-002, 1.06172867e-001, + 4.91273589e-002, -3.53969336e-002, -3.19678396e-001, + 2.32226163e-001, 3.80956948e-001, -3.97885144e-002, + -1.91384897e-001, 2.84696251e-001, 3.33316356e-001, + -8.08369145e-002, -7.52563728e-003, 1.22712024e-001, + 3.99691910e-002, 1.52624154e-003, -6.03169436e-003, + 7.53959036e-003, 1.10080922e-002, -2.23102327e-003, + -6.47798255e-002, 3.83900702e-002, 1.01883136e-001, + 1.16505418e-002, -7.20591471e-002, 4.35554869e-002, + 1.00853942e-001, -2.95078056e-003, -4.88383090e-003, + 8.21291283e-003, 1.00437496e-002, 8.12370563e-004, + -3.52694158e-004, 4.45717340e-003, 3.37631139e-003, + 3.16575170e-002, 2.11769883e-002, 4.45162095e-002, + 3.36201824e-002, -2.56419331e-002, 2.25883853e-002, + 4.37760241e-002, 3.48373242e-002, -1.81760057e-003, + -5.65489172e-004, 4.78350278e-003, 3.52326757e-003, + 1.89714022e-002, 8.72360449e-003, 3.75165716e-002, + 2.56621856e-002, 2.78562039e-001, 8.86186585e-002, + 3.35062981e-001, 1.93071440e-001, -2.97520489e-001, + 1.35635687e-002, 3.50203663e-001, 1.71108022e-001, + -1.98744964e-002, 2.06284760e-003, 3.63080390e-002, + 2.45467834e-002, 3.10017355e-002, 2.42831558e-003, + 4.38434929e-002, 3.48619260e-002, 1.27062008e-001, + -1.02708459e-001, 2.65736610e-001, 3.08699399e-001, + -2.05880851e-001, -8.21589381e-002, 2.77145177e-001, + 2.25586236e-001, -2.36491598e-002, 3.33046936e-003, + 3.75509784e-002, 2.76729744e-002, 1.04072131e-003, + -9.30539682e-004, 4.56303125e-003, 4.40640049e-003, + 6.99423766e-003, -2.98039746e-002, 3.26230898e-002, + 4.42988984e-002, -8.20128340e-003, -2.80531477e-002, + 3.23732942e-002, 4.09515537e-002, -1.14590209e-003, + -7.01907557e-004, 4.28752182e-003, 4.00067819e-003, + -4.68697806e-004, 5.38673194e-004, 4.88681998e-003, + 2.81818840e-003, -2.01711431e-002, -1.02868152e-003, + 4.75773066e-002, 2.88336296e-002, 9.23425239e-003, + -1.52910664e-003, 3.79591025e-002, 2.96106078e-002, + 2.88265030e-004, 7.33429973e-004, 5.46451425e-003, + 3.66254081e-003, 7.46992882e-003, 3.65342782e-003, + 4.21109498e-002, 1.80875268e-002, -1.99096888e-001, + 6.16831370e-002, 4.10335690e-001, 1.63482875e-001, + 1.26601219e-001, 7.38497674e-002, 3.18788737e-001, + 1.66247413e-001, -5.18881995e-003, 7.18280021e-003, + 4.55884039e-002, 2.41523422e-002, 6.16844837e-003, + -3.79724195e-003, 4.40365896e-002, 1.75872389e-002, + -1.96959615e-001, -8.10786113e-002, 4.23331648e-001, + 1.57594338e-001, 1.73714027e-001, -3.81084569e-002, + 3.66747350e-001, 1.47094861e-001, -1.05744964e-002, + -2.37544693e-004, 4.60216105e-002, 2.15822756e-002, + -9.91384150e-004, -5.02826821e-004, 5.73594496e-003, + 2.87601608e-003, -1.76473856e-002, 2.69871176e-004, + 4.68756706e-002, 2.67860163e-002, 1.96770951e-002, + 2.91234523e-004, 4.52562347e-002, 2.67017968e-002, + -8.15299572e-004, -7.29915278e-004, 5.58733754e-003, + 3.27909901e-003, 3.12386639e-003, -4.80906630e-004, + 7.26101780e-003, 2.87472433e-003, -1.63509580e-003, + 1.60254315e-002, 5.72704673e-002, 2.74047162e-002, + -2.37356462e-002, 1.18933870e-002, 4.46808040e-002, + 2.45677009e-002, -2.01270124e-003, -3.17781814e-004, + 4.81493725e-003, 2.83777853e-003, 3.02158538e-002, + -4.03238228e-003, 5.46368249e-002, 1.74508356e-002, + 2.19738018e-002, 3.22319679e-002, 4.76854414e-001, + 1.24777175e-001, -1.81658998e-001, 5.63228168e-002, + 3.32694173e-001, 1.26034021e-001, -2.21070256e-002, + 2.42534373e-003, 3.93956490e-002, 1.80969462e-002, + 2.12713536e-002, -1.39483134e-003, 4.96425852e-002, + 1.63682699e-002, 1.05042800e-001, -4.57462445e-002, + 4.61783648e-001, 1.30350724e-001, -2.06591919e-001, + -9.18109808e-003, 3.43043149e-001, 1.26063332e-001, + -2.24714652e-002, 1.48726953e-003, 4.05132510e-002, + 1.86391715e-002, 1.54308241e-003, 4.49942949e-004, + 6.39701355e-003, 2.61314469e-003, 1.76221225e-002, + -1.34903789e-002, 5.67427464e-002, 2.56354995e-002, + -2.74428129e-002, -1.06082736e-002, 4.87003997e-002, + 2.52725538e-002, -2.14840192e-003, 5.19111287e-004, + 5.17898193e-003, 2.94149364e-003, -7.42218131e-003, + -1.07996631e-003, 1.31111443e-002, 6.32454222e-003, + 3.68605508e-003, -4.29624356e-002, 4.15230989e-002, + 7.15881437e-002, 6.18804188e-004, -3.81450094e-002, + 3.03605553e-002, 7.47205541e-002, -1.74228312e-003, + -3.82792228e-003, 5.19199483e-003, 9.51539166e-003, + -1.22957416e-001, -8.85932427e-003, 1.52967185e-001, + 3.50218341e-002, -1.21626146e-001, -2.78336555e-001, + 2.32596993e-001, 3.29369664e-001, 3.47768664e-002, + -3.35771829e-001, 1.24847911e-001, 3.80204350e-001, + 1.28995143e-002, -3.99384871e-002, 2.83349063e-002, + 5.19114807e-002, -1.19486511e-001, -1.29910279e-003, + 1.50498956e-001, 3.34297866e-002, -1.67115450e-001, + 1.33943304e-001, 2.43118465e-001, 2.10039631e-001, + 2.48973798e-002, 1.26970664e-001, 1.15697473e-001, + 2.02308029e-001, 1.35558592e-002, 1.25084547e-002, + 2.53159385e-002, 3.12567279e-002, -9.41064581e-003, + 2.46220705e-004, 1.48342149e-002, 5.24144433e-003, + -1.17203649e-002, 3.72340344e-002, 4.17254753e-002, + 5.46450950e-002, -8.34239880e-004, 4.21175435e-002, + 2.86128074e-002, 5.88546954e-002, -1.48525243e-004, + 4.29951586e-003, 4.05485602e-003, 7.39108771e-003, + -1.23966858e-003, 1.35402018e-002, 5.88599825e-003, + 1.77884605e-002, -1.85484942e-002, 1.34000003e-001, + 4.03550193e-002, 1.66864932e-001, -2.17707753e-002, + 1.08471178e-001, 4.64142300e-002, 1.49730131e-001, + -1.54392468e-003, 2.53369333e-003, 7.90089555e-003, + 1.23992069e-002, 2.13476960e-002, 2.19986797e-003, + 3.47623453e-002, 3.60944942e-002, -1.48037053e-003, + 1.04354635e-001, 1.20239571e-001, 1.94147542e-001, + -2.10740060e-001, 2.33036429e-001, 2.76267290e-001, + 3.08905214e-001, -8.74499232e-002, 3.31678577e-002, + 1.17241934e-001, 6.26994595e-002, 2.62651294e-002, + -4.88275215e-002, 4.91946898e-002, 6.42977208e-002, + 1.42653286e-001, -2.44268268e-001, 2.04026029e-001, + 2.98996150e-001, -1.07945718e-001, -1.06517874e-001, + 2.00058788e-001, 2.05977380e-001, -9.52278227e-002, + 1.04551313e-004, 1.19689398e-001, 4.63818945e-002, + -2.57298443e-003, -2.95171910e-003, 7.79771619e-003, + 1.18626598e-002, 1.99654922e-002, -7.77061135e-002, + 5.25462367e-002, 1.12864636e-001, 5.84073970e-003, + -9.47170630e-002, 4.76058275e-002, 1.17908254e-001, + -4.85184835e-003, -4.61698370e-003, 1.06288791e-002, + 1.03105670e-002, -1.22219877e-004, 1.96291669e-003, + 4.92525194e-003, 5.41333621e-003, -7.31364870e-003, + 2.81141493e-002, 4.04719263e-002, 4.43377905e-002, + 1.27881309e-002, 3.30714062e-002, 4.44729403e-002, + 4.67408225e-002, -4.80944291e-003, 5.22675924e-004, + 8.76400527e-003, 5.15973475e-003, 2.23703831e-002, + 1.90925859e-002, 3.77053767e-002, 3.38410661e-002, + -6.47988245e-002, 1.92830443e-001, 2.16275424e-001, + 2.46700078e-001, 1.72318462e-002, 1.02552548e-001, + 2.76852041e-001, 2.01491937e-001, -7.33717829e-002, + -6.13174355e-003, 9.22469720e-002, 3.64419110e-002, + 2.09725574e-002, -2.48798244e-002, 3.59432250e-002, + 4.06844728e-002, -5.90579510e-002, -2.47625798e-001, + 1.90312833e-001, 3.18223745e-001, -1.28796130e-001, + -2.95902342e-001, 2.90183842e-001, 3.68265271e-001, + -5.48656993e-002, -2.46359184e-002, 7.95982182e-002, + 4.32383120e-002, -9.43829364e-004, -4.61890781e-003, + 4.47807042e-003, 8.14849231e-003, -1.17613049e-002, + -4.26137224e-002, 3.12423445e-002, 6.50047064e-002, + -6.74507441e-003, -3.13584581e-002, 3.34230252e-002, + 5.49074970e-002, -4.22068551e-004, -4.06497944e-004, + 5.57367690e-003, 5.40800020e-003, -2.25375727e-004, + -5.47707547e-004, 4.09725448e-003, 3.79674183e-003, + 4.24940996e-002, 2.45128516e-002, 5.26743345e-002, + 4.15254235e-002, 2.65238229e-002, 3.35801654e-002, + 3.79658975e-002, 4.16835919e-002, 1.62467870e-004, + 1.81717973e-003, 3.04549700e-003, 3.68503202e-003, + 3.43614817e-002, 3.64862904e-002, 4.78550158e-002, + 4.73732613e-002, 2.92264581e-001, 3.14518809e-001, + 3.20873231e-001, 3.39491606e-001, 9.84274689e-003, + 8.72145221e-002, 1.17007799e-001, 1.44916520e-001, + -1.20558292e-002, 2.05024891e-003, 2.02210937e-002, + 1.93098541e-002, 4.89435643e-002, -8.52141343e-003, + 5.48078120e-002, 4.51418869e-002, 1.00437790e-001, + -2.59767562e-001, 1.79486290e-001, 3.24498922e-001, + -3.34164575e-002, -2.70093739e-001, 1.22753926e-001, + 3.01640630e-001, -1.07165202e-002, -2.97360085e-002, + 2.32902262e-002, 3.83230187e-002, 8.40469787e-004, + -2.77518854e-003, 3.67036392e-003, 6.41687959e-003, + 2.56709196e-003, -3.57832424e-002, 2.51771566e-002, + 5.87118492e-002, 7.06625916e-003, -3.59803662e-002, + 2.64152884e-002, 5.94717599e-002, 1.56470540e-003, + -3.40360799e-003, 3.85449338e-003, 7.11641042e-003, + 1.73329154e-003, 6.52334362e-004, 3.81806330e-003, + 2.77954247e-003, 1.28515987e-002, 2.64937449e-002, + 2.79382505e-002, 3.40290256e-002, -2.12242436e-002, + 2.41335742e-002, 3.27010527e-002, 3.34456079e-002, + -1.44295802e-003, 2.91063945e-004, 3.67708760e-003, + 2.83035380e-003, 2.37708539e-002, 2.56461278e-003, + 3.54120545e-002, 1.98160242e-002, 1.36494324e-001, + 3.08789480e-002, 2.23915830e-001, 1.59051180e-001, + -2.23135233e-001, 2.67338119e-002, 2.74716973e-001, + 1.70270666e-001, -1.89142283e-002, 1.70867192e-003, + 3.20278853e-002, 2.21597515e-002, 2.19427608e-002, + -1.63626997e-003, 3.60594615e-002, 2.49494389e-002, + 2.72658229e-001, 9.25067216e-002, 3.16752464e-001, + 2.86145836e-001, -2.86270857e-001, 1.72732517e-001, + 3.32478255e-001, 3.32147658e-001, -2.40012873e-002, + 1.15121370e-002, 3.92692648e-002, 3.05000953e-002, + 1.68406370e-003, 3.59723112e-004, 4.37758025e-003, + 3.34130297e-003, 2.99497098e-002, -2.79692151e-002, + 4.23052572e-002, 4.25305218e-002, -2.27582324e-002, + -2.77322847e-002, 4.42707874e-002, 4.51701209e-002, + -2.64080404e-003, 4.52427514e-004, 5.16474945e-003, + 4.28507617e-003, 9.22725711e-004, -2.49010348e-003, + 3.96157103e-003, 5.52080479e-003, -1.67376117e-003, + -2.96682082e-002, 2.95223314e-002, 4.51510176e-002, + 1.94146100e-003, -3.10791973e-002, 3.20025347e-002, + 4.50976901e-002, 2.71594443e-004, -2.45912420e-003, + 4.13131202e-003, 5.34946145e-003, -1.80860758e-002, + -2.61850823e-002, 3.03969458e-002, 4.44399342e-002, + -5.04124351e-002, -2.87478656e-001, 1.48474753e-001, + 3.31518263e-001, 9.64880511e-002, -2.30922788e-001, + 1.83244780e-001, 3.04624081e-001, 2.93813329e-002, + -8.22512340e-003, 3.98181528e-002, 4.24008481e-002, + -1.86209958e-002, 2.99344342e-002, 3.27226482e-002, + 4.44576666e-002, -1.35509253e-001, 2.09930420e-001, + 1.99663520e-001, 2.70251453e-001, 2.56678581e-001, + 1.93267539e-001, 2.97200412e-001, 2.53559440e-001, + 2.80964188e-002, 3.14830802e-002, 4.24908288e-002, + 4.56007309e-002, 2.79808970e-004, 7.37117545e-004, + 4.22278419e-003, 4.58082510e-003, -1.62153486e-002, + 2.53302716e-002, 3.71671617e-002, 4.11295891e-002, + 2.44651474e-002, 2.46007405e-002, 4.39370535e-002, + 3.92880440e-002, 1.15885795e-003, -6.83638384e-004, + 4.70872456e-003, 4.43171058e-003, -2.59128795e-003, + -5.77428285e-003, 6.90237479e-003, 1.06537221e-002, + -1.61563023e-003, -9.51967388e-002, 3.40222418e-002, + 1.22856155e-001, -1.28205083e-002, -1.01016432e-001, + 3.15336920e-002, 1.26722246e-001, -1.11505820e-003, + -8.12672917e-003, 4.12105769e-003, 1.18448194e-002, + -4.46803272e-002, 2.75374274e-003, 5.56591190e-002, + 3.96266617e-002, -1.05079435e-001, -7.57556350e-004, + 1.63487405e-001, 2.25484803e-001, 2.01506149e-002, + 1.99133903e-002, 1.01632021e-001, 2.10599720e-001, + 1.21266292e-002, 4.73676389e-003, 2.29355134e-002, + 3.15547511e-002, -3.00290082e-002, 3.70905958e-002, + 4.50101420e-002, 4.96930704e-002, -1.30851999e-001, + 3.55257630e-001, 1.84218913e-001, 4.04320538e-001, + 3.54435369e-002, 3.48093003e-001, 1.14981674e-001, + 3.95181894e-001, 7.37102469e-003, 4.34654020e-002, + 2.41966918e-002, 5.32058030e-002, 7.44609279e-004, + 2.74971267e-003, 4.85625258e-003, 6.47388073e-003, + -3.72483511e-003, 4.41837497e-002, 2.47344784e-002, + 6.60912320e-002, -2.30216677e-003, 4.68229391e-002, + 2.38951370e-002, 7.13309050e-002, -2.22772616e-003, + 5.17328223e-003, 4.80832718e-003, 9.34130792e-003, + 2.51238840e-003, 1.88885932e-003, 6.79677725e-003, + 5.87887364e-003, -2.13891380e-002, 5.66043109e-002, + 5.31652011e-002, 6.66076094e-002, -4.87122387e-002, + 3.61359343e-002, 6.03028871e-002, 5.53632304e-002, + 1.64740172e-003, -9.78567870e-004, 4.26467694e-003, + 4.64604190e-003, 4.84992117e-002, 7.54592707e-003, + 6.12038262e-002, 3.40735540e-002, 7.52970874e-002, + 1.22684002e-001, 1.91020042e-001, 1.81569323e-001, + -3.57159078e-001, 4.10335332e-001, 3.83024096e-001, + 4.31458205e-001, -3.21299061e-002, 5.66559583e-002, + 5.16338870e-002, 6.70729354e-002, 4.16055657e-002, + 2.74202344e-003, 5.47250435e-002, 2.86765117e-002, + 1.12020284e-001, -5.47982045e-002, 1.63653821e-001, + 1.16146632e-001, -9.22978818e-002, -2.31483690e-002, + 1.50954232e-001, 1.24802090e-001, -4.71594855e-002, + 2.46463418e-002, 5.58595955e-002, 4.44860011e-002, + 2.48214183e-003, 6.24834734e-004, 5.59437042e-003, + 3.52689927e-003, 1.18135056e-002, -1.33146625e-002, + 2.70369444e-002, 2.39794496e-002, -5.95018687e-003, + -1.47755118e-002, 2.41099969e-002, 2.50279643e-002, + -2.38196598e-003, 3.54772899e-004, 4.47601965e-003, + 3.83197772e-003, 2.40692243e-004, 1.38347142e-003, + 5.09824045e-003, 5.58520807e-003, -4.42042388e-003, + 2.44814791e-002, 3.44778188e-002, 4.81973179e-002, + -5.44923823e-003, 1.84220020e-002, 3.11794411e-002, + 4.45882790e-002, -9.30748356e-005, 8.45215574e-004, + 4.15264117e-003, 5.01339743e-003, 2.21847091e-002, + 9.20145959e-003, 4.65904027e-002, 3.89643572e-002, + -1.24568539e-002, 8.66978765e-002, 2.74910390e-001, + 3.21889222e-001, 6.52902760e-003, 2.05787614e-001, + 2.74224192e-001, 3.56812149e-001, -3.06353364e-002, + 1.25580514e-002, 4.75036465e-002, 4.05169725e-002, + 2.59647314e-002, 5.84103260e-003, 4.74147126e-002, + 3.61741148e-002, 4.80577983e-002, 9.33291763e-002, + 2.43000403e-001, 2.88781554e-001, -1.54893622e-001, + -1.27345636e-001, 2.98793286e-001, 2.98992515e-001, + -2.40622368e-002, -1.65438522e-002, 4.47592176e-002, + 3.96565460e-002, 1.62371760e-003, -4.54376917e-004, + 5.48681011e-003, 5.34112751e-003, -5.07376343e-003, + -2.92026233e-002, 3.59580480e-002, 4.95430082e-002, + -2.63428092e-002, -1.54181989e-002, 4.36801165e-002, + 4.65812460e-002, -1.03992461e-004, 7.05042214e-004, + 4.52256063e-003, 4.92217764e-003, 8.25293464e-005, + 5.39758475e-003, 4.80862055e-003, 1.01635950e-002, + 4.75146808e-003, 7.16937259e-002, 3.04609835e-002, + 9.48473141e-002, 4.75895446e-004, 7.07235634e-002, + 3.17955986e-002, 9.31262448e-002, -8.47499818e-004, + 4.30717971e-003, 5.11938846e-003, 9.03934054e-003, + 3.36437672e-002, 1.00488085e-002, 4.57433686e-002, + 4.56756689e-002, 6.25655279e-002, 1.00696206e-001, + 1.70984119e-001, 2.88986474e-001, -7.54981786e-002, + 7.54051208e-002, 1.94156110e-001, 2.65768468e-001, + -3.52180339e-002, 1.07312510e-002, 4.98360395e-002, + 3.99569720e-002, 2.89499275e-002, -4.49512340e-002, + 4.40503620e-002, 6.13632798e-002, 1.25162378e-001, + -3.46517861e-001, 1.99500307e-001, 4.42625701e-001, + -2.45848466e-002, -2.07260668e-001, 1.75584897e-001, + 3.15695822e-001, -3.01397610e-002, -1.38763608e-002, + 4.44217026e-002, 3.91816013e-002, -1.23579870e-003, + 3.73396142e-005, 4.55770455e-003, 7.21360417e-003, + 1.13895154e-002, -2.06114221e-002, 3.00113149e-002, + 6.12802804e-002, 1.21584460e-002, -4.18125503e-002, + 3.22441384e-002, 7.14861527e-002, -1.47159255e-004, + -3.72003578e-003, 4.88744862e-003, 8.24165717e-003, + -1.79127941e-003, -1.69239589e-003, 5.77180879e-003, + 4.76464583e-003, 1.38556585e-002, -4.26605083e-002, + 5.04138246e-002, 5.41799366e-002, 1.47016952e-002, + -2.36049499e-002, 3.68036143e-002, 4.36294973e-002, + -1.98261975e-003, -1.16823951e-003, 4.67918580e-003, + 5.08068921e-003, -4.01011743e-002, -1.14573045e-002, + 5.56089543e-002, 3.39657664e-002, -8.33081976e-002, + -1.62704453e-001, 3.00144702e-001, 2.66339779e-001, + 9.33380052e-002, -3.89790803e-001, 2.20962763e-001, + 4.37648058e-001, 2.16205902e-002, -4.80655134e-002, + 3.95926349e-002, 5.85443862e-002, -3.67467254e-002, + 2.36811792e-003, 5.24227694e-002, 3.18726040e-002, + -1.25521392e-001, 1.20118216e-001, 2.50252277e-001, + 2.08928704e-001, -3.67872156e-002, 1.11321568e-001, + 1.91721708e-001, 1.89622715e-001, 2.59643011e-002, + 2.20945873e-003, 3.79311889e-002, 3.19989324e-002, + -2.47121137e-003, -4.09981876e-004, 6.12672605e-003, + 4.35566204e-003, -1.05434163e-002, 1.56244701e-002, + 4.00401950e-002, 3.54572609e-002, -8.18431098e-003, + 1.90653652e-002, 3.46494950e-002, 3.61684524e-002, + 7.25696969e-004, 9.96676041e-004, 4.61134035e-003, + 4.57612518e-003, 1.27702230e-003, -4.60632564e-003, + 5.39319078e-003, 9.42065008e-003, 2.91906297e-003, + -6.83882684e-002, 3.65250260e-002, 9.19547006e-002, + 4.04103566e-003, -6.55113384e-002, 3.87290567e-002, + 8.92826319e-002, -2.98144034e-004, -3.89578682e-003, + 5.54050598e-003, 8.98450334e-003, -2.15072930e-002, + -7.86609203e-003, 3.86300795e-002, 5.37806973e-002, + -8.68916735e-002, -7.11086914e-002, 1.99202240e-001, + 4.09053028e-001, 1.42175496e-001, -7.84789473e-002, + 2.44444668e-001, 4.46999103e-001, 3.44251171e-002, + -1.85878528e-003, 5.04217111e-002, 6.31169006e-002, + -2.11399905e-002, 8.57273303e-003, 3.76519635e-002, + 3.90836373e-002, -6.69221058e-002, 8.11920688e-002, + 1.84240609e-001, 2.44613990e-001, 1.64758429e-001, + 1.24717668e-001, 2.40619138e-001, 2.49911740e-001, + 3.36355343e-002, 1.35248294e-002, 4.95795310e-002, + 4.32810672e-002, -3.79237579e-004, 1.66931935e-003, + 5.01009496e-003, 5.87941287e-003, -1.72817803e-004, + 3.65217291e-002, 3.24916430e-002, 5.27922846e-002, + 1.70139540e-002, 3.41512822e-002, 3.68220061e-002, + 5.18910810e-002, 1.22538069e-003, 9.96495597e-004, + 5.39974682e-003, 5.78471739e-003, 2.33551284e-004, + -2.66932184e-004, 4.94427839e-003, 3.28407786e-003, + 2.01862380e-002, 1.15599930e-002, 3.89787331e-002, + 3.36964242e-002, -1.48410080e-002, 1.28960470e-002, + 3.67284976e-002, 3.91592309e-002, -8.04729643e-004, + -4.37328184e-004, 4.30075917e-003, 4.37030196e-003, + 2.70407624e-003, -3.45145771e-003, 3.87120657e-002, + 2.21714377e-002, 1.55509084e-001, -6.53854460e-002, + 3.10876131e-001, 1.91462636e-001, -2.00077727e-001, + -1.84413522e-001, 2.98247874e-001, 2.99244195e-001, + 1.66050997e-003, -7.42121786e-003, 3.43614109e-002, + 3.13543826e-002, 1.35483688e-005, 3.18663660e-003, + 3.80790010e-002, 2.24238671e-002, 1.31838948e-001, + 2.51484532e-002, 3.29770356e-001, 2.04069600e-001, + -9.81072113e-002, 2.19275773e-001, 2.54220814e-001, + 3.40529084e-001, -5.94496634e-003, 1.77395456e-002, + 3.88080478e-002, 3.63339223e-002, -5.81239510e-005, + 1.47779996e-004, 4.99857543e-003, 3.12588573e-003, + 2.01484486e-002, -8.29818100e-003, 4.42516766e-002, + 3.81469503e-002, -2.69098533e-003, -1.57537777e-002, + 3.58674861e-002, 4.32395563e-002, -1.57527055e-003, + -2.15714725e-004, 4.23743669e-003, 4.06650035e-003, + -7.03471061e-003, 1.31529511e-003, 1.09345736e-002, + 3.67978727e-003, -2.18366124e-002, -1.81495324e-002, + 5.79929724e-002, 3.33615988e-002, -4.73473374e-005, + -2.09696479e-002, 3.20975706e-002, 3.68513614e-002, + 7.12880515e-004, -1.31089007e-003, 4.47757402e-003, + 4.58666543e-003, -6.45989478e-002, 5.13581140e-003, + 8.75046104e-002, 2.07393263e-002, -2.17008829e-001, + -6.04435876e-002, 4.29193795e-001, 1.50881752e-001, + 7.10558146e-003, -4.47870605e-002, 1.56287342e-001, + 1.54345363e-001, 1.82342511e-002, -3.23910685e-003, + 3.16726677e-002, 2.57061664e-002, -6.62174672e-002, + -5.61509049e-004, 8.78204033e-002, 1.96117330e-002, + -1.53485641e-001, 8.83154273e-002, 5.05718172e-001, + 1.74388304e-001, 5.00247031e-002, 2.38025323e-001, + 1.84939206e-001, 2.89228916e-001, 1.45805059e-002, + 2.98572592e-002, 3.30661051e-002, 4.12984081e-002, + -7.22136116e-003, -7.73749431e-004, 1.07722282e-002, + 3.54368612e-003, 2.43392983e-003, 2.89728623e-002, + 7.59452656e-002, 4.23004068e-002, 1.45970611e-002, + 2.50877738e-002, 4.44883518e-002, 4.77143601e-002, + -1.58423150e-003, 1.53555535e-003, 5.49014891e-003, + 5.79111790e-003, -4.66384721e-004, 5.49312332e-004, + 4.04639076e-003, 4.35531698e-003, 1.81212146e-002, + 2.78957505e-002, 3.58213373e-002, 4.44516093e-002, + 2.76294001e-003, 4.22828868e-002, 3.53838801e-002, + 5.39620593e-002, -2.46407883e-003, 1.20199879e-003, + 5.34284580e-003, 5.41094039e-003, 2.24659033e-002, + 2.58156992e-002, 3.87963131e-002, 3.96634154e-002, + 1.56173646e-001, 2.28688434e-001, 2.37844720e-001, + 2.93032736e-001, -1.77880645e-001, -3.43566909e-002, + 2.77109712e-001, 2.82779485e-001, -3.50040421e-002, + -1.59302242e-002, 4.75749858e-002, 4.10158634e-002, + 3.00995540e-002, 4.27642278e-003, 4.33635898e-002, + 3.30078192e-002, 8.72076601e-002, -2.41398886e-002, + 1.92041174e-001, 1.83807060e-001, -3.39364052e-001, + 1.08773159e-002, 3.76702130e-001, 2.81266809e-001, + -2.12542154e-002, -1.34004606e-003, 3.98138463e-002, + 3.66233066e-002, 1.47831521e-003, -4.99295478e-004, + 4.69900900e-003, 4.59312974e-003, 2.96252733e-003, + -2.71509290e-002, 3.24783400e-002, 4.28748094e-002, + -3.18390988e-002, -2.35561579e-002, 4.60848212e-002, + 4.75535467e-002, -1.48170837e-003, 9.73401417e-004, + 5.09234611e-003, 5.08767972e-003, 1.15789613e-002, + 1.62201412e-002, 2.40273885e-002, 2.26146933e-002, + -2.10904442e-002, 2.35465348e-001, 7.72660598e-002, + 3.13180387e-001, 4.42176573e-002, 1.90889105e-001, + 7.06328154e-002, 2.51980394e-001, -1.21593126e-003, + 1.79134943e-002, 5.70499105e-003, 2.71156393e-002, + 1.57662243e-001, -2.20622420e-002, 2.63532877e-001, + 4.80095707e-002, 8.01456869e-002, 6.67961091e-002, + 1.62772119e-001, 1.73188955e-001, 2.31185462e-002, + 5.34867272e-002, 8.54807645e-002, 1.32009178e-001, + -1.98305883e-002, 1.95711162e-002, 3.21200937e-002, + 2.42865346e-002, 1.64754957e-001, -3.94283794e-002, + 2.93788046e-001, 6.67415559e-002, 1.61186770e-001, + -1.43687755e-001, 2.69048184e-001, 3.13817948e-001, + 1.00524891e-002, -5.14715984e-002, 1.14133857e-001, + 1.81085333e-001, -1.62142143e-002, -1.76348649e-002, + 2.22028177e-002, 3.04187462e-002, 1.58622488e-002, + -2.85204570e-003, 2.92637050e-002, 1.44554153e-002, + 4.40131128e-002, -3.96232158e-002, 6.65981770e-002, + 1.05395161e-001, 3.51972505e-003, -7.47706741e-002, + 3.15710828e-002, 1.16811000e-001, -8.91002361e-004, + -1.06527898e-002, 3.98510927e-003, 1.72128826e-002, + 3.06298654e-003, 2.16686130e-002, 1.07673332e-002, + 3.91326584e-002, 1.27473362e-002, 2.99600154e-001, + 3.43754217e-002, 3.86584491e-001, -2.20081280e-003, + 3.17402363e-001, 2.80651078e-002, 4.08931941e-001, + -1.12089154e-004, 3.63334790e-002, 5.75711532e-003, + 4.98820879e-002, 1.06650829e-001, 7.01709390e-002, + 1.34368777e-001, 9.69581008e-002, 1.13351360e-001, + 1.62404299e-001, 1.89859301e-001, 3.34625006e-001, + -2.83815712e-002, 1.02266222e-001, 9.74304602e-002, + 2.68778980e-001, -2.36423351e-002, 3.67669240e-002, + 3.74047831e-002, 5.31625226e-002, 5.77210225e-002, + 1.75216757e-002, 8.06177109e-002, 3.28934118e-002, + 2.46247780e-002, 3.69451307e-002, 9.21278894e-002, + 1.19079754e-001, -1.78840701e-002, 2.70853899e-002, + 6.71056509e-002, 9.75957513e-002, -9.11568198e-003, + 1.34793075e-003, 1.94973219e-002, 1.30273066e-002, + 5.05332882e-003, 6.76018128e-004, 7.72095658e-003, + 3.89315747e-003, 2.57974211e-003, -4.89369500e-003, + 1.34949116e-002, 1.76596679e-002, -3.29486281e-003, + -5.24728326e-003, 7.46815465e-003, 1.47171216e-002, + -8.73528246e-004, -2.39803136e-004, 2.14184332e-003, + 2.24888930e-003, -1.23082995e-004, -1.88729656e-003, + 5.36931772e-003, 5.10155456e-003, 2.16921903e-002, + -3.40725817e-002, 4.88602854e-002, 5.03168330e-002, + 4.95262817e-002, -1.84262656e-002, 6.53368980e-002, + 5.64949960e-002, -4.49395389e-004, 4.89068567e-004, + 5.56473667e-003, 6.00634515e-003, -1.36577766e-002, + -3.35089373e-003, 3.57576460e-002, 2.95374263e-002, + 5.10752620e-003, -4.11100015e-002, 2.04582259e-001, + 1.82358742e-001, 2.00281918e-001, -2.43340924e-001, + 2.87278742e-001, 3.89808863e-001, 5.99900112e-002, + -1.27810845e-002, 7.33572096e-002, 6.25038594e-002, + -1.33543592e-002, -7.23744975e-004, 3.59366089e-002, + 2.88454257e-002, -3.46996263e-002, -4.73970687e-003, + 1.74184322e-001, 1.67772442e-001, 3.11880410e-001, + 1.54878929e-001, 3.74529213e-001, 2.70005554e-001, + 5.33408597e-002, 2.58619934e-002, 6.92637414e-002, + 4.88884151e-002, -4.91514569e-004, 2.19039517e-004, + 5.20196045e-003, 4.38722549e-003, 1.65933296e-002, + 2.96493005e-002, 3.98706496e-002, 4.45215032e-002, + 5.34379669e-002, 3.95455025e-002, 6.59420416e-002, + 5.94261065e-002, 8.25498893e-004, -8.37619475e-004, + 5.94672794e-003, 5.54657495e-003, 8.65527138e-004, + 3.37905622e-005, 3.86980246e-003, 3.52465967e-003, + 1.29830220e-003, 4.37972369e-003, 2.87536513e-002, + 3.12169474e-002, -1.46992784e-002, 4.85270750e-003, + 5.28677292e-002, 3.08932047e-002, 6.68344495e-004, + 1.46230785e-004, 4.36576875e-003, 3.48658301e-003, + -2.94506026e-004, -1.51154948e-002, 3.20782438e-002, + 3.32027748e-002, 5.56496009e-002, -1.28414318e-001, + 2.14014113e-001, 2.42984548e-001, -6.30112514e-002, + -3.31884809e-002, 3.87725204e-001, 1.96937695e-001, + 2.57746340e-003, -4.79576964e-004, 3.76079194e-002, + 2.75245328e-002, 4.06019716e-003, -5.58988051e-003, + 2.82953363e-002, 5.77558838e-002, 4.19354104e-002, + -3.39918844e-002, 1.61815584e-001, 4.76060480e-001, + -4.74359840e-003, -8.23315084e-002, 2.23791763e-001, + 4.23615128e-001, -9.05321038e-004, -1.03577208e-002, + 3.62869315e-002, 5.45922481e-002, -3.32591793e-004, + 1.11220451e-003, 3.08939372e-003, 4.98199137e-003, + -2.65438762e-003, 4.25784383e-003, 2.23738942e-002, + 4.33958732e-002, -2.57125916e-003, 2.42775623e-005, + 3.30257192e-002, 4.22165804e-002, 1.04107929e-003, + 2.62978516e-004, 3.65654426e-003, 5.11859218e-003, + 1.28278590e-003, 7.48605467e-004, 3.67415627e-003, + 3.61531135e-003, 6.73687086e-003, 2.63255890e-002, + 2.71721184e-002, 3.83111723e-002, -5.26902732e-004, + 2.57426463e-002, 2.46127900e-002, 4.04557884e-002, + 4.72494779e-004, 1.89158355e-003, 3.58690531e-003, + 4.87058470e-003, 2.54992023e-002, 2.48740870e-003, + 3.55160423e-002, 2.52447315e-002, 2.31430292e-001, + 1.61664680e-001, 2.80883461e-001, 2.60514081e-001, + -5.02783582e-002, 2.64979422e-001, 1.57515779e-001, + 3.08018744e-001, -2.45036352e-002, 1.71629842e-002, + 3.50713246e-002, 3.71713787e-002, 2.77987663e-002, + 1.09124917e-003, 3.80379222e-002, 2.45521031e-002, + 2.70439386e-001, -5.11925183e-002, 3.18299294e-001, + 2.13705868e-001, -1.60070196e-001, -2.29550749e-001, + 2.21577480e-001, 2.90852696e-001, -2.34394222e-002, + -2.85128839e-002, 3.72472294e-002, 4.14172783e-002, + 2.13764561e-003, -4.49471816e-004, 4.47308691e-003, + 3.76633345e-003, 9.80581250e-003, -3.55021209e-002, + 3.44092697e-002, 4.56379168e-002, -1.81081425e-002, + -2.81487592e-002, 3.38815376e-002, 4.41234410e-002, + 6.43402571e-004, -4.60845797e-004, 3.79992742e-003, + 4.43805521e-003, 5.36228006e-004, -2.06610374e-003, + 4.66774357e-003, 5.72758634e-003, 1.40961530e-002, + -3.37279513e-002, 3.64751779e-002, 5.37959673e-002, + 4.72118892e-003, -3.78795005e-002, 3.54411379e-002, + 5.64703308e-002, 3.17138364e-003, -2.87021254e-003, + 7.61066563e-003, 7.55515322e-003, -1.25271603e-002, + -8.80690385e-003, 3.03172600e-002, 2.90365629e-002, + 7.16134235e-002, -7.76727647e-002, 1.76459804e-001, + 1.82456344e-001, 1.97169166e-002, -8.12171996e-002, + 2.00149715e-001, 2.25194111e-001, 6.07882142e-002, + 5.42068807e-003, 7.21572787e-002, 5.03230691e-002, + -1.99873224e-002, 2.78855972e-002, 3.96729484e-002, + 5.11409715e-002, 2.43355967e-002, 1.28342688e-001, + 1.72545999e-001, 3.19969654e-001, 2.19818413e-001, + 2.09660694e-001, 3.05945277e-001, 3.58919680e-001, + 7.31117949e-002, 7.24184141e-002, 9.43640321e-002, + 9.20257792e-002, 3.09893186e-003, 1.52211748e-002, + 8.38299096e-003, 1.88492816e-002, 7.75790215e-003, + 1.72206119e-001, 4.78638895e-002, 1.93175182e-001, + 2.98244338e-002, 1.62227467e-001, 6.08990788e-002, + 1.81972951e-001, -1.51894812e-004, 7.00243376e-003, + 9.41616297e-003, 1.39451856e-002, 1.16274669e-003, + 1.62802244e-005, 5.26803965e-003, 5.02525875e-003, + 1.32558541e-002, 2.77810078e-002, 3.87222320e-002, + 5.78174703e-002, -1.75557435e-002, 3.02531794e-002, + 3.51771824e-002, 6.32217154e-002, -1.51240127e-003, + -3.05958703e-004, 4.52109007e-003, 5.99159161e-003, + 2.12252606e-002, 1.59332936e-003, 5.57250306e-002, + 3.49039920e-002, 1.35828242e-001, -1.05803959e-001, + 3.25697750e-001, 3.36189121e-001, -1.80865675e-001, + -1.40696973e-001, 2.77097493e-001, 3.56632620e-001, + -1.84258074e-002, -1.18503335e-003, 4.48247641e-002, + 3.82076874e-002, 2.52767857e-002, -4.16713534e-003, + 5.21950759e-002, 3.21496911e-002, -1.05310783e-001, + -1.06182478e-001, 3.21646810e-001, 2.40162507e-001, + -1.12358676e-002, -1.44657731e-001, 1.79866791e-001, + 2.47413933e-001, -1.58104245e-002, -1.09452503e-002, + 3.52567732e-002, 2.97921430e-002, 6.27911999e-004, + -1.78352685e-003, 5.03690960e-003, 4.90693096e-003, + -1.12684835e-002, -2.35388335e-002, 3.37046534e-002, + 4.32895981e-002, -4.50920407e-003, -1.69486757e-002, + 2.46122535e-002, 3.55487503e-002, 1.60759682e-005, + -1.46104011e-003, 3.22966021e-003, 4.12843004e-003, + -8.69608385e-008, 4.96440660e-003, 8.83160438e-003, + 1.51689779e-002, 2.02326644e-002, 1.34684965e-001, + 5.04313000e-002, 1.75326765e-001, 2.40011737e-002, + 1.49524882e-001, 6.23297542e-002, 1.80546135e-001, + -2.97599589e-003, 7.38297123e-003, 1.25257205e-002, + 1.65146850e-002, 8.43448788e-002, 5.51588014e-002, + 1.06184378e-001, 9.04930905e-002, 1.51264817e-001, + 3.08895916e-001, 2.38879949e-001, 3.67803991e-001, + -1.65365398e-001, 1.23536028e-001, 2.71949500e-001, + 2.54337728e-001, -8.42671245e-002, -1.37754073e-002, + 1.28227547e-001, 6.22237995e-002, 8.40069875e-002, + 1.92504190e-002, 1.04891576e-001, 4.41971570e-002, + 4.89748381e-002, 1.34232817e-002, 1.19695097e-001, + 8.83360729e-002, -1.86844915e-001, 4.72807214e-002, + 2.44394392e-001, 1.33087501e-001, -7.99883306e-002, + 3.76729257e-002, 1.19183443e-001, 6.42249659e-002, + 7.03541841e-003, 1.29510497e-003, 9.66657232e-003, + 4.17915126e-003, 6.10502297e-003, -4.32496378e-003, + 1.65778585e-002, 1.40455309e-002, -1.57807563e-002, + -3.26155825e-003, 2.56928466e-002, 1.51474960e-002, + -5.64011652e-003, 2.27094418e-003, 9.96483397e-003, + 4.53894725e-003, 5.25174488e-004, -3.21016487e-005, + 9.75013524e-003, 1.16321854e-002, 4.35950346e-002, + 5.47326058e-002, 8.12636912e-002, 1.10627964e-001, + -3.58870402e-002, 1.00300841e-001, 6.34212717e-002, + 1.23559244e-001, -1.52281398e-004, 6.46739453e-003, + 1.03215761e-002, 1.31933531e-002, 1.30988769e-002, + 7.28843957e-002, 8.31302479e-002, 1.07378773e-001, + 3.43977332e-001, 2.38595635e-001, 3.95055383e-001, + 3.07389349e-001, -1.99818864e-001, 1.26445949e-001, + 2.43584096e-001, 2.14314416e-001, -7.91306235e-003, + 4.68737595e-002, 6.70070276e-002, 6.55030534e-002, + 3.38820294e-002, 2.00402271e-002, 4.90883216e-002, + 4.52265851e-002, 2.54438818e-002, -1.88116115e-002, + 9.91776884e-002, 1.45049199e-001, -4.03250344e-002, + -2.90267877e-002, 1.02910005e-001, 1.42897367e-001, + -1.76689010e-002, 7.42195128e-003, 3.61094810e-002, + 3.31596397e-002, 2.48789933e-004, -1.02181723e-002, + 5.79160452e-003, 1.86435021e-002, -1.51093276e-002, + -1.29900649e-001, 3.19201276e-002, 1.84772745e-001, + 1.04245432e-002, -1.25262633e-001, 3.15998867e-002, + 1.80173576e-001, 2.55646580e-003, -9.23236739e-003, + 5.62068308e-003, 1.50679825e-002, 1.48978946e-003, + 1.57248776e-003, 6.07189769e-003, 4.46584076e-003, + -1.28119309e-002, 2.50388868e-002, 4.78922017e-002, + 4.01850678e-002, 7.70737696e-003, 2.69865263e-002, + 6.75654039e-002, 3.86463292e-002, -1.86443632e-003, + 3.68579131e-005, 5.54701686e-003, 3.56366672e-003, + 4.20762561e-002, 6.37826370e-003, 5.77158220e-002, + 2.68527549e-002, -7.84672424e-002, 1.96081042e-001, + 2.90613800e-001, 2.55851746e-001, -1.61071476e-002, + 1.61956370e-001, 5.41186154e-001, 2.36172259e-001, + -3.27235833e-002, 8.52079876e-003, 5.25726601e-002, + 2.50693150e-002, 3.49153765e-002, -5.90604916e-003, + 5.33541515e-002, 2.45472938e-002, 9.85565111e-002, + -5.89460433e-002, 2.15069667e-001, 1.58404887e-001, + -1.48929834e-001, -4.31929193e-002, 3.27090502e-001, + 1.69235766e-001, -3.76356803e-002, 6.28451351e-003, + 5.80177344e-002, 2.67149266e-002, 1.81665318e-003, + 2.98342260e-004, 5.81195764e-003, 3.27071152e-003, + 1.37078483e-002, -1.70746911e-002, 3.29508074e-002, + 3.04770581e-002, -1.61918290e-002, -1.73851270e-002, + 4.21899371e-002, 3.12943645e-002, -3.10294400e-003, + 9.20502003e-004, 6.94482960e-003, 4.02118126e-003, + -3.40937893e-003, -8.17511056e-004, 7.26177823e-003, + 5.89491148e-003, 1.31414470e-003, -4.26158458e-002, + 4.36045267e-002, 5.94104156e-002, 2.46496126e-002, + -3.40857059e-002, 4.71704379e-002, 5.54718524e-002, + -5.84799447e-004, -1.77249240e-004, 5.52742789e-003, + 5.41778328e-003, -4.37566377e-002, 1.33741396e-002, + 6.28035739e-002, 3.94107029e-002, -1.17717609e-001, + 3.76490653e-002, 2.78456479e-001, 2.43937790e-001, + 1.55214235e-001, -1.44252107e-001, 3.22522610e-001, + 2.89112091e-001, 2.32936144e-002, -2.01359596e-002, + 5.10336459e-002, 4.40745354e-002, -3.01843807e-002, + 6.73058163e-003, 5.80831431e-002, 3.52814421e-002, + -2.56830961e-001, -5.09573903e-004, 3.67746949e-001, + 2.54436284e-001, 6.53493479e-002, -3.08709312e-002, + 2.73755819e-001, 2.41604954e-001, 3.60095501e-002, + -7.19514769e-003, 5.70473373e-002, 4.03868556e-002, + -2.03352980e-003, -1.48077530e-003, 7.20995478e-003, + 5.34721371e-003, -3.14975902e-002, 2.10409947e-002, + 5.44213057e-002, 4.54206690e-002, 6.52502384e-003, + 2.40915492e-002, 4.14997488e-002, 4.48031127e-002, + 2.29175272e-003, -3.29906979e-005, 6.64252881e-003, + 5.63611183e-003, -9.49059241e-003, 3.09647265e-004, + 1.29010268e-002, 5.60804550e-003, 2.05616038e-002, + -3.31789590e-002, 5.88825606e-002, 5.34275472e-002, + -1.53242135e-002, -3.79350446e-002, 4.41093035e-002, + 6.18371293e-002, -8.99274135e-004, -3.96916969e-003, + 5.32312412e-003, 7.41007784e-003, -1.09724186e-001, + 5.83832990e-003, 1.27667695e-001, 3.04135606e-002, + 1.49719128e-002, -1.11102916e-001, 3.72743845e-001, + 2.22970322e-001, -1.15995981e-001, -1.64539188e-001, + 2.22285435e-001, 2.56501228e-001, 1.57296751e-002, + -1.44340005e-002, 2.96741333e-002, 3.36369723e-002, + -9.18495432e-002, 7.74337258e-003, 1.12030841e-001, + 3.12025957e-002, -1.03255801e-001, 2.03962997e-001, + 3.27785164e-001, 2.89341837e-001, -5.06281070e-002, + 1.96293592e-001, 1.71748355e-001, 2.88943529e-001, + 1.46105941e-002, 2.56536398e-002, 3.00942436e-002, + 4.00821455e-002, -5.65932831e-003, 4.33929585e-004, + 1.01944320e-002, 4.97881696e-003, -8.91146157e-003, + 3.48469801e-002, 4.77048419e-002, 5.69624268e-002, + -2.68929312e-003, 3.76855619e-002, 3.54229994e-002, + 6.21924475e-002, -6.42029569e-004, 3.96116544e-003, + 4.92240442e-003, 7.97605235e-003, 1.07921602e-003, + 6.20884355e-004, 4.87232395e-003, 4.06199787e-003, + 9.20054782e-003, 1.93710383e-002, 3.32513154e-002, + 3.49701978e-002, 1.72078405e-002, 2.68758759e-002, + 3.98116075e-002, 3.96788791e-002, -2.69526313e-003, + 1.20589032e-003, 6.35249447e-003, 4.86313831e-003, + 3.36535312e-002, 5.71798952e-003, 4.63519096e-002, + 2.81039849e-002, 7.93219656e-002, 1.75275460e-001, + 2.46898860e-001, 2.39451632e-001, 8.47723782e-002, + 9.96281430e-002, 2.98230320e-001, 2.20930740e-001, + -4.98853587e-002, -1.29031967e-002, 6.16726913e-002, + 3.71467471e-002, 3.18180956e-002, -1.27326725e-002, + 4.59976867e-002, 3.12258005e-002, 2.01633900e-001, + -1.16647512e-001, 3.00584406e-001, 2.53032297e-001, + -2.12415695e-001, -1.98646113e-001, 3.54038984e-001, + 2.95596153e-001, -2.65893023e-002, -2.54449360e-002, + 5.00257537e-002, 4.09210399e-002, 9.05830238e-004, + -5.45001880e-004, 4.74084029e-003, 4.38157935e-003, + 1.62221268e-002, -3.40629593e-002, 3.82286794e-002, + 4.88344803e-002, -2.27273088e-002, -3.20988670e-002, + 4.42925170e-002, 4.86763753e-002, 4.54039546e-004, + 3.56700708e-004, 5.01123210e-003, 4.47404338e-003, + -1.44134380e-003, 1.88235706e-003, 4.01732372e-003, + 5.31598646e-003, 6.68788515e-003, 2.60233674e-002, + 2.52397954e-002, 4.37321216e-002, 1.38338311e-002, + 4.26588878e-002, 3.18344533e-002, 5.56590967e-002, + -1.26712854e-004, 3.86536005e-003, 5.21022175e-003, + 6.55852025e-003, 1.87493730e-002, 4.67958301e-002, + 3.46395895e-002, 5.46571948e-002, 1.06081672e-001, + 3.93154114e-001, 1.91705614e-001, 4.17226493e-001, + -1.82305649e-002, 2.52133548e-001, 2.07446739e-001, + 3.24790388e-001, -4.51705530e-002, 1.98860792e-003, + 5.70125580e-002, 4.25158143e-002, 2.24714465e-002, + 6.86257472e-003, 3.22759934e-002, 2.62765549e-002, + 4.33130972e-002, -2.44772378e-002, 1.33596703e-001, + 1.22791134e-001, -2.44677782e-001, -1.45542845e-001, + 2.92755187e-001, 2.06158802e-001, -3.29289213e-002, + -2.35648323e-002, 5.50908484e-002, 4.26803082e-002, + 9.43250488e-004, -7.40030548e-004, 3.78845935e-003, + 3.44767072e-003, -3.80789186e-003, -2.11690050e-002, + 2.72302795e-002, 3.15607786e-002, -3.78122218e-002, + -1.63077917e-002, 4.99034822e-002, 3.65065746e-002, + -9.25651926e-004, 1.71749911e-003, 6.08301349e-003, + 4.85861860e-003, 1.13664637e-003, 2.77909148e-003, + 5.55911567e-003, 6.44167094e-003, 1.50881708e-002, + 5.95350154e-002, 3.64503935e-002, 7.80605897e-002, + 9.18881595e-003, 7.24333674e-002, 3.91849801e-002, + 8.81988928e-002, -2.30704411e-003, 4.52245260e-003, + 6.89602131e-003, 8.24652798e-003, 5.28386496e-002, + 9.72243771e-003, 7.14471191e-002, 3.45735177e-002, + 2.25104585e-001, 2.50488430e-001, 2.91423202e-001, + 3.03268313e-001, -8.18655118e-002, 1.67449832e-001, + 2.43857399e-001, 2.37386405e-001, -5.95385320e-002, + 4.44001565e-003, 7.78706968e-002, 3.63899134e-002, + 5.17994054e-002, -2.42439844e-003, 7.59232342e-002, + 2.90994551e-002, 2.96021163e-001, -2.56259590e-002, + 3.48816484e-001, 1.51918352e-001, -1.70105815e-001, + 1.27740074e-002, 2.65333563e-001, 1.36558011e-001, + -5.76588511e-002, 3.42574413e-003, 8.01081583e-002, + 3.24811898e-002, 4.42119734e-003, 1.65348453e-003, + 8.96701124e-003, 4.61452547e-003, 4.21528593e-002, + -1.38007635e-002, 5.22706285e-002, 3.04771606e-002, + -1.89469736e-002, -1.36360861e-002, 3.92872989e-002, + 2.73522008e-002, -5.05761104e-003, 1.17507391e-003, + 8.99556838e-003, 4.35906695e-003, 4.45711077e-004, + 9.32626834e-004, 3.19248415e-003, 2.82241427e-003, + -8.57623818e-004, 1.76345389e-002, 2.11219545e-002, + 2.58173309e-002, -3.63559760e-002, 1.90537274e-002, + 4.79786098e-002, 3.38414684e-002, -5.84913231e-003, + -1.71454635e-003, 9.20489058e-003, 5.38843777e-003, + 1.35097401e-002, 3.12438374e-003, 2.41273884e-002, + 1.46969333e-002, 2.79993620e-002, 3.77453640e-002, + 9.24753621e-002, 8.44339952e-002, -3.03173810e-001, + 3.44906151e-002, 3.52640271e-001, 1.43438324e-001, + -5.38948365e-002, -7.05463113e-003, 7.13458285e-002, + 3.30724940e-002, 1.43044172e-002, -5.83881512e-003, + 2.51355842e-002, 1.79260392e-002, 3.79957771e-003, + -8.03274289e-002, 1.03681743e-001, 1.27281517e-001, + -4.31041062e-001, -2.61547446e-001, 4.62310612e-001, + 2.91696072e-001, -3.00652608e-002, -1.51207866e-002, + 5.37048914e-002, 3.32520753e-002, 1.11835725e-004, + -3.49408481e-003, 4.24271310e-003, 5.66141959e-003, + -2.10977495e-002, -4.74559292e-002, 3.72308269e-002, + 5.82145713e-002, -5.58655299e-002, -3.84631008e-002, + 6.72160685e-002, 5.73425591e-002, 3.71804315e-004, + 7.72000581e-004, 5.10333758e-003, 4.49107029e-003, + 7.39997486e-003, -4.18536511e-004, 1.15082031e-002, + 4.47465107e-003, 1.55923842e-003, 1.71683896e-002, + 3.30129303e-002, 2.82511152e-002, -4.33601663e-002, + 1.78285912e-002, 5.82760721e-002, 4.01920564e-002, + -6.57038484e-003, -1.91310083e-003, 1.16106477e-002, + 6.91739470e-003, 8.24109986e-002, -1.31531712e-002, + 1.04092315e-001, 3.66929099e-002, 6.70612678e-002, + 9.37914476e-003, 1.64912969e-001, 1.06242254e-001, + -2.42193863e-001, 1.08691975e-001, 3.13543290e-001, + 1.89043745e-001, -8.64729062e-002, 4.75019775e-003, + 1.09655425e-001, 4.93897870e-002, 7.07161799e-002, + -1.19842347e-002, 1.01394527e-001, 4.17526364e-002, + 1.56859055e-001, -6.87215105e-002, 2.40000516e-001, + 1.45255387e-001, -3.44056845e-001, -2.16367960e-001, + 4.00603175e-001, 2.72822708e-001, -6.87216148e-002, + -2.41568405e-002, 9.96042117e-002, 5.55051751e-002, + 4.73161601e-003, 3.55727680e-004, 1.18464939e-002, + 5.27140871e-003, 1.48222493e-002, -3.01995445e-002, + 4.96222228e-002, 4.27069850e-002, -7.18837976e-002, + -3.64939049e-002, 8.66823122e-002, 5.74083216e-002, + 6.15082536e-005, 1.19818270e-003, 9.35305003e-003, + 6.64891675e-003, 2.89341464e-004, 2.91441288e-003, + 5.81410667e-003, 9.96389333e-003, -1.37929805e-003, + 5.81978261e-002, 3.38372365e-002, 8.44084397e-002, + -1.03070755e-002, 5.70067465e-002, 3.72837186e-002, + 8.52429271e-002, -1.50497700e-003, 2.44055619e-003, + 6.06038701e-003, 8.55911896e-003, 3.34790982e-002, + 9.12422966e-003, 5.07697389e-002, 5.29969893e-002, + 8.65660831e-002, 8.42465833e-002, 1.96463093e-001, + 3.35478097e-001, -8.32318440e-002, 1.69686124e-001, + 1.99573323e-001, 3.05845290e-001, -4.68200222e-002, + 2.44431030e-002, 6.15278669e-002, 5.04447408e-002, + 3.47841121e-002, -1.09779919e-002, 5.31856194e-002, + 5.66302501e-002, 1.12976700e-001, -3.05578578e-002, + 1.97755367e-001, 3.65947813e-001, -1.19604617e-001, + -1.12572260e-001, 2.06580430e-001, 3.05857033e-001, + -4.63389792e-002, -2.27051247e-002, 6.30062297e-002, + 5.11312298e-002, -4.01750876e-004, -1.00835841e-002, + 5.34370914e-003, 1.69194508e-002, 4.94422857e-003, + -1.36332422e-001, 3.33788730e-002, 1.76555574e-001, + -5.80904214e-003, -1.26220256e-001, 3.48347686e-002, + 1.64783567e-001, -9.14639677e-004, -8.28203280e-003, + 6.34397566e-003, 1.50025943e-002, -2.28060433e-003, + 4.23602964e-004, 6.72167446e-003, 2.74624489e-003, + -5.61005669e-003, -1.73921641e-002, 7.61997402e-002, + 3.21001336e-002, 9.01705865e-003, -1.41513133e-002, + 4.13631536e-002, 3.27320211e-002, 1.33506197e-003, + -5.20705886e-004, 5.32058394e-003, 3.63830337e-003, + -2.85401978e-002, -8.03705771e-003, 5.58048338e-002, + 2.17450745e-002, -5.34177013e-002, -9.31477472e-002, + 5.98729610e-001, 1.77922696e-001, 5.10586165e-002, + -1.10275194e-001, 2.32712567e-001, 1.90897092e-001, + 2.71967053e-002, -4.64135874e-003, 4.09105308e-002, + 2.90839300e-002, -3.92460078e-002, -6.78836228e-003, + 5.80536835e-002, 2.70429030e-002, -7.18922913e-002, + 4.39744852e-002, 3.42099339e-001, 1.97103307e-001, + 1.66122511e-001, 1.09304354e-001, 2.42503718e-001, + 2.20396116e-001, 2.10516118e-002, 1.38062201e-002, + 3.86878178e-002, 3.27172540e-002, -3.78967472e-003, + -3.45965469e-004, 6.88717561e-003, 3.73282586e-003, + 9.31892486e-004, 2.08256450e-002, 4.20116857e-002, + 3.64932865e-002, 2.02465300e-002, 1.59274805e-002, + 4.00486067e-002, 3.63475382e-002, 1.19747769e-004, + -5.69499563e-004, 4.90263477e-003, 4.58956137e-003, + -9.28676309e-005, 2.20248965e-003, 2.92798481e-003, + 4.72699851e-003, 1.50132924e-003, 2.77782753e-002, + 1.81654934e-002, 4.07214984e-002, -1.09689194e-004, + 2.71780156e-002, 1.74754076e-002, 4.02889289e-002, + 1.59636184e-004, 2.36715726e-003, 2.59951944e-003, + 4.76571685e-003, 2.18348615e-002, 2.56390460e-002, + 2.88818497e-002, 3.84213328e-002, 5.34553602e-002, + 2.49024510e-001, 1.15123190e-001, 2.87934065e-001, + -4.00300734e-002, 2.53985375e-001, 1.05018593e-001, + 2.89976329e-001, -1.87224522e-002, 2.81328894e-002, + 2.54903547e-002, 3.89502831e-002, 2.02975366e-002, + -3.63492072e-002, 2.75469106e-002, 4.54293415e-002, + 5.21606803e-002, -3.47772002e-001, 1.15415908e-001, + 3.77471030e-001, -3.56716365e-002, -3.53269696e-001, + 1.06108621e-001, 3.83693844e-001, -1.67498477e-002, + -3.91139016e-002, 2.48172525e-002, 4.79396395e-002, + -4.67530306e-004, -1.56367349e-003, 2.60419631e-003, + 4.48991405e-003, -2.79195752e-004, -1.73735172e-002, + 1.58364531e-002, 3.57004441e-002, 3.38498183e-004, + -1.68682747e-002, 1.51587008e-002, 3.57193574e-002, + 6.65560074e-004, -1.75902620e-003, 2.46480480e-003, + 4.64928057e-003, -3.61374510e-003, 1.06622872e-003, + 8.71437043e-003, 4.65720193e-003, -2.96752546e-002, + -2.88943499e-002, 5.78083992e-002, 4.94448319e-002, + 6.62464229e-003, -2.74689104e-002, 3.86888869e-002, + 5.23482226e-002, -1.20145280e-003, -1.68223598e-003, + 5.22239599e-003, 6.18878333e-003, -5.79075925e-002, + -6.67349435e-003, 8.22638199e-002, 3.13038267e-002, + -3.37060124e-001, -1.44177169e-001, 4.15860265e-001, + 2.37207219e-001, 4.87453230e-002, -2.05545127e-001, + 1.63114488e-001, 2.61529833e-001, 1.64549761e-002, + -2.41957232e-002, 3.30053456e-002, 3.71994451e-002, + -7.64987692e-002, -1.82128605e-002, 9.63686481e-002, + 4.24055941e-002, -2.42750123e-001, 4.79172990e-002, + 3.47129881e-001, 2.48744667e-001, -2.73161125e-003, + 8.55695233e-002, 1.50161073e-001, 1.76264137e-001, + 1.89458337e-002, 3.79054970e-003, 3.11407540e-002, + 2.59976089e-002, -6.72530709e-003, -7.79882481e-004, + 1.10866176e-002, 6.21424010e-003, -1.83734242e-002, + 2.96540391e-002, 5.12338020e-002, 5.17326035e-002, + -1.22122411e-002, 2.68673133e-002, 3.57843414e-002, + 4.42214534e-002, 3.97742173e-004, 1.57390721e-003, + 4.16042516e-003, 4.90509206e-003, 4.77333844e-004, + 5.37861197e-004, 5.33526018e-003, 4.41233441e-003, + -4.72834259e-002, -4.07388657e-002, 6.27048090e-002, + 5.66129573e-002, -4.53496439e-004, -4.69041914e-002, + 4.33743410e-002, 5.93196675e-002, -1.94337743e-004, + -1.93542382e-003, 5.31792361e-003, 5.86839067e-003, + -3.20390910e-002, -7.19967261e-002, 5.01963384e-002, + 8.05111080e-002, -2.76129276e-001, -3.14482272e-001, + 3.50102663e-001, 3.86542499e-001, 9.47851837e-002, + -1.45823747e-001, 1.88888043e-001, 2.49522462e-001, + 1.48757510e-002, -2.91766133e-002, 3.13850865e-002, + 4.44193445e-002, -2.67970376e-002, 1.66834556e-002, + 4.11802977e-002, 5.23972660e-002, -4.45177220e-002, + 2.28358597e-001, 1.66393980e-001, 2.84915060e-001, + -3.01972758e-002, 1.30291671e-001, 1.52350828e-001, + 2.03037471e-001, 1.48848956e-002, 7.92065728e-003, + 2.64247656e-002, 3.16285864e-002, 5.12239058e-004, + 2.84170196e-003, 5.36591467e-003, 7.10428180e-003, + -1.51880495e-002, 3.18845101e-002, 3.73750478e-002, + 5.12029715e-002, -1.57753304e-002, 3.23315337e-002, + 3.47339660e-002, 4.65497151e-002, 2.40173285e-005, + 2.53072963e-003, 4.30182647e-003, 5.60729019e-003, + 1.38046918e-003, 1.69433159e-004, 5.02821757e-003, + 4.31721378e-003, 1.89457703e-002, 2.10332330e-002, + 3.41987312e-002, 3.99526507e-002, 8.01386021e-004, + 2.70558838e-002, 2.93403249e-002, 4.42073867e-002, + -1.09663862e-003, 1.03883992e-003, 4.50252555e-003, + 5.13152778e-003, 2.73763277e-002, 8.69454816e-003, + 4.48965244e-002, 3.07965577e-002, 1.46554276e-001, + 8.07897672e-002, 2.26644471e-001, 2.07127899e-001, + -5.41738644e-002, -3.12492102e-002, 1.83792740e-001, + 2.45171994e-001, -2.74009537e-002, -7.67935487e-003, + 4.23589200e-002, 3.85910384e-002, 3.04029677e-002, + -5.72041096e-003, 4.68938090e-002, 3.48830447e-002, + 8.49509314e-002, -1.06957458e-001, 2.31050685e-001, + 3.10427547e-001, -1.80965006e-001, -2.14841828e-001, + 2.68586040e-001, 5.13728499e-001, -2.62678042e-002, + -3.76304798e-002, 4.55172285e-002, 6.31285906e-002, + 5.74547157e-004, -3.44047905e-003, 4.71054204e-003, + 7.08782487e-003, -9.33654141e-003, -5.42936139e-002, + 3.48209478e-002, 7.67921880e-002, -1.12769920e-002, + -2.29724441e-002, 3.21924426e-002, 6.23474009e-002, + 7.56548019e-004, 9.53452138e-004, 4.11686674e-003, + 6.37877081e-003, -6.56859390e-003, 1.16427522e-003, + 9.48857423e-003, 3.90681252e-003, -6.21081190e-003, + -1.18164560e-002, 2.64398307e-002, 2.74670385e-002, + 2.07944005e-003, -1.20492559e-002, 2.10373458e-002, + 2.48803739e-002, 1.24007475e-003, -2.42586451e-004, + 3.69105744e-003, 3.30799934e-003, -7.43903890e-002, + 9.20904055e-003, 8.93115029e-002, 2.87300646e-002, + -7.69404694e-002, -2.77620032e-002, 1.53614745e-001, + 1.18803345e-001, 5.72572537e-002, -1.58297457e-002, + 1.11093357e-001, 1.09468415e-001, 2.02685669e-002, + 4.63121943e-003, 3.02225873e-002, 2.31662430e-002, + -6.60674796e-002, 3.25243846e-002, 8.31635222e-002, + 4.58990186e-002, -8.70187134e-002, 3.84821087e-001, + 1.84657261e-001, 4.17104602e-001, 8.67294595e-002, + 4.10927862e-001, 1.44993916e-001, 4.47140455e-001, + 1.96166560e-002, 5.15637286e-002, 3.45950648e-002, + 6.02979399e-002, -1.23238642e-004, 2.05349526e-003, + 6.08939072e-003, 5.49284881e-003, 3.38067627e-003, + 4.13269177e-002, 2.62319483e-002, 5.88413216e-002, + 4.02665790e-003, 3.63149494e-002, 2.25721635e-002, + 5.63326553e-002, -1.92746019e-003, 3.13635659e-003, + 4.33258619e-003, 6.90767262e-003, 5.69540534e-005, + -1.32416037e-003, 5.23107266e-003, 4.32833331e-003, + 2.41326615e-002, -2.61927228e-002, 4.60466109e-002, + 4.26998101e-002, 4.91339788e-002, -2.53106002e-002, + 5.82773983e-002, 4.71544079e-002, 1.16992171e-003, + 9.58128192e-004, 4.03501792e-003, 3.77317122e-003, + -1.67122278e-002, 2.41981907e-004, 4.13877517e-002, + 2.77334154e-002, 1.20675385e-001, -3.94947492e-002, + 2.83629745e-001, 1.75296485e-001, 2.60654479e-001, + -1.65144026e-001, 3.54824811e-001, 2.62782663e-001, + 4.53326069e-002, -1.83963850e-002, 5.62965684e-002, + 2.95720715e-002, -1.99248251e-002, 3.21196346e-003, + 4.21055332e-002, 2.75120307e-002, 1.69415683e-001, + 1.01008713e-001, 3.07571054e-001, 1.77535400e-001, + 1.67430192e-001, 1.99380353e-001, 3.09215635e-001, + 2.71475226e-001, 5.26377074e-002, 1.23349624e-002, + 6.43677115e-002, 2.95671485e-002, 2.36357999e-004, + 1.60414481e-003, 5.25568891e-003, 4.26283432e-003, + 3.42482664e-002, 3.48388962e-002, 5.00035509e-002, + 4.76845503e-002, 3.23145874e-002, 2.96686105e-002, + 4.70607802e-002, 4.82110865e-002, 7.09447020e-004, + 6.46352191e-006, 4.26503038e-003, 3.70703056e-003, + 7.33548717e-004, -5.19235502e-004, 3.36975884e-003, + 4.85880440e-003, 7.60770403e-003, 6.89786859e-003, + 2.23930776e-002, 4.54504974e-002, -3.83415027e-003, + 1.01942876e-002, 2.14913059e-002, 4.40303273e-002, + -9.42585175e-004, -1.42632751e-004, 3.25369858e-003, + 4.64371033e-003, 7.46617652e-003, -6.27262564e-003, + 2.62310412e-002, 3.72666344e-002, 6.67020231e-002, + -1.09661356e-001, 1.52526468e-001, 3.30811590e-001, + -5.45070581e-002, -1.47410125e-001, 1.50329813e-001, + 3.61650944e-001, -9.54751018e-003, -1.19013358e-002, + 2.61489265e-002, 3.87533680e-002, 6.61386037e-003, + 4.63497918e-003, 2.68772542e-002, 5.40589839e-002, + 4.68552597e-002, 7.27368668e-002, 1.41640216e-001, + 5.05957365e-001, -5.06618805e-002, 8.74428377e-002, + 1.42659619e-001, 4.42887008e-001, -8.40514526e-003, + 6.62656408e-003, 2.51805410e-002, 4.62189540e-002, + 3.50320479e-004, 1.02709957e-004, 3.11562745e-003, + 5.45241358e-003, 2.58989749e-003, -4.06068284e-003, + 2.13735942e-002, 4.76458743e-002, -1.61433429e-003, + -3.23452358e-003, 2.15710383e-002, 4.84894961e-002, + -6.23154570e-004, 6.13919983e-004, 3.10594286e-003, + 5.20453975e-003, 3.73077899e-004, 1.87467784e-003, + 5.98467700e-003, 6.15559332e-003, -3.20107141e-003, + 1.83188710e-002, 2.70963106e-002, 4.67441715e-002, + -2.47014570e-003, 1.92007814e-002, 2.84967348e-002, + 4.74859551e-002, -2.27301661e-003, 7.02468853e-004, + 4.83502587e-003, 5.62064163e-003, 2.08965894e-002, + 4.05742991e-004, 3.91561128e-002, 3.65858637e-002, + 3.15222815e-002, 1.40836090e-002, 1.34923548e-001, + 2.31604874e-001, -3.79269458e-002, 6.51878398e-003, + 1.48719326e-001, 2.69068420e-001, -2.86001898e-002, + 3.11259390e-003, 4.04234119e-002, 3.57692949e-002, + 2.69355606e-002, 1.29530663e-002, 4.41374853e-002, + 6.49582446e-002, 3.57707292e-002, 1.71601087e-001, + 1.35424927e-001, 4.62578624e-001, -3.25986445e-002, + 1.91871107e-001, 1.49705365e-001, 5.27283370e-001, + -3.48239020e-002, 2.26272885e-002, 4.60198410e-002, + 6.56392500e-002, 2.61858164e-004, -8.97160918e-003, + 4.07639425e-003, 1.50352782e-002, 1.46965333e-003, + -1.06860258e-001, 2.16802824e-002, 1.39215395e-001, + 9.91490204e-004, -1.04308710e-001, 2.16919556e-002, + 1.43536836e-001, 2.68023810e-004, -6.91173784e-003, + 4.34115203e-003, 1.35962935e-002, 6.18679551e-005, + -1.82830496e-004, 4.01279470e-003, 5.51044103e-003, + 7.97778647e-003, 2.01511849e-002, 2.77588014e-002, + 4.84052226e-002, 3.97847005e-004, 3.29046100e-002, + 2.42063310e-002, 5.52795306e-002, -6.61084894e-004, + 1.78765506e-003, 3.82478163e-003, 5.95532078e-003, + 2.46783700e-002, 2.04826314e-002, 4.06620875e-002, + 4.23966758e-002, 7.21957758e-002, 1.16066173e-001, + 2.37992972e-001, 3.69812280e-001, -9.42135602e-002, + -1.12558745e-001, 2.00838074e-001, 4.47144210e-001, + -1.82117820e-002, -7.60587025e-003, 3.41910087e-002, + 4.37668785e-002, 2.36811098e-002, -1.20774545e-002, + 3.95656638e-002, 3.85235660e-002, -1.62511710e-002, + -1.35408759e-001, 2.23580629e-001, 3.09028506e-001, + -6.16990998e-002, 3.71268317e-002, 1.87640548e-001, + 3.78891945e-001, -1.69352982e-002, 1.59196393e-003, + 3.16520110e-002, 4.26048860e-002, 7.39720199e-005, + -1.09189481e-003, 3.88931367e-003, 5.50676603e-003, + 1.61955366e-003, -2.00329479e-002, 2.62168515e-002, + 4.88102362e-002, -1.72095629e-003, -2.35741306e-002, + 2.47166101e-002, 5.05742840e-002, -3.95942276e-004, + -1.20510941e-003, 3.57434433e-003, 5.32635208e-003, + 1.91839773e-003, 4.57531773e-004, 5.25985099e-003, + 4.09036549e-003, 8.74710921e-003, 2.49107890e-002, + 3.45176086e-002, 3.76662947e-002, -2.44426467e-002, + 1.82810277e-002, 4.06030118e-002, 3.74551229e-002, + 2.62929552e-005, -3.24057735e-004, 4.41613747e-003, + 4.48423717e-003, 3.56716849e-002, 4.31856170e-004, + 4.87761609e-002, 2.88040880e-002, 1.01086266e-001, + 7.26305842e-002, 2.42528647e-001, 1.84956759e-001, + -1.99511692e-001, 1.37431741e-001, 2.70613551e-001, + 2.36852169e-001, -1.44600524e-002, 2.17300355e-002, + 3.61289121e-002, 3.81431133e-002, 2.94107776e-002, + -1.40059991e-002, 4.58350703e-002, 3.42678912e-002, + 1.15458213e-001, -2.16179654e-001, 2.76253641e-001, + 3.31268430e-001, 1.14881131e-003, -1.25532985e-001, + 2.26148307e-001, 4.60717857e-001, -3.04317195e-002, + -2.42346385e-003, 4.44327183e-002, 5.49968667e-002, + 3.59341997e-004, -8.37984378e-004, 4.42245137e-003, + 4.97831451e-003, 4.78376809e-004, -2.67613009e-002, + 3.19371969e-002, 5.07990941e-002, 2.84169917e-003, + -3.16613838e-002, 2.89815329e-002, 5.82942590e-002, + 3.96356372e-005, -2.81634089e-003, 4.37215297e-003, + 7.06175715e-003, 2.81426730e-003, -3.30638315e-004, + 5.42435516e-003, 3.25267715e-003, 2.27596015e-002, + 2.12366655e-002, 4.08021808e-002, 3.19593586e-002, + -5.63460868e-003, 2.78968513e-002, 4.34862114e-002, + 4.04409058e-002, -2.72316672e-003, 5.18569781e-004, + 6.89155422e-003, 4.51510539e-003, 3.01335100e-002, + -3.25996801e-003, 4.35842015e-002, 1.94103736e-002, + 2.75416493e-001, 6.41916171e-002, 3.42330754e-001, + 1.54611662e-001, -1.96811967e-002, 1.39043331e-001, + 3.11173856e-001, 2.06926599e-001, -5.19828051e-002, + 8.87091924e-003, 6.87478632e-002, 3.15460786e-002, + 2.72254646e-002, -2.07598973e-003, 4.19356339e-002, + 1.90164037e-002, 3.51368695e-001, -2.56534163e-002, + 4.00920630e-001, 1.67174906e-001, -8.85509402e-002, + -1.17264584e-001, 2.63362944e-001, 2.06337228e-001, + -4.59932722e-002, -5.45775052e-003, 6.53853193e-002, + 3.18789780e-002, 2.39677192e-003, 6.48125657e-004, + 5.42123290e-003, 3.42254993e-003, 3.21353972e-002, + -2.67191809e-002, 4.79292311e-002, 3.91239859e-002, + -1.38112605e-002, -3.06168031e-002, 4.03212570e-002, + 4.40464914e-002, -1.39702554e-003, -4.31978406e-004, + 6.41646981e-003, 4.77021793e-003, 3.12466430e-003, + -2.28975471e-002, 7.66196847e-003, 2.89713778e-002, + 6.33611344e-003, -2.39555299e-001, 3.71616073e-002, + 2.77512044e-001, -5.41646592e-003, -2.40187228e-001, + 4.26309370e-002, 2.79004425e-001, -4.33657598e-003, + -2.34539453e-002, 9.75193083e-003, 3.02398074e-002, + -4.12821062e-002, -6.58996543e-003, 5.72507232e-002, + 4.77848798e-002, -7.15928674e-002, -1.61514178e-001, + 1.91557199e-001, 3.33098799e-001, 7.30017349e-002, + -1.21224083e-001, 1.68804094e-001, 3.19350928e-001, + 1.84654705e-002, -1.47228558e-002, 3.82439680e-002, + 4.87658903e-002, -5.30842915e-002, 1.94350607e-003, + 6.63302615e-002, 3.51443142e-002, -1.28262728e-001, + -3.25834937e-002, 2.29937434e-001, 1.97367877e-001, + 1.26699030e-001, -5.02422191e-002, 1.77830756e-001, + 2.02469721e-001, 2.54471432e-002, -1.92714005e-003, + 3.58501263e-002, 3.57589424e-002, -5.65284351e-003, + -2.31867773e-004, 8.83126818e-003, 5.27112978e-003, + -1.71663351e-002, 1.26550114e-002, 3.42237167e-002, + 2.89255828e-002, 1.34525960e-002, 8.67335033e-003, + 2.65099965e-002, 2.70900838e-002, 2.39379960e-003, + -3.88949498e-004, 4.75939037e-003, 4.90011647e-003, + -6.13736454e-004, -2.92004755e-004, 5.39444899e-003, + 5.36379730e-003, -2.81786956e-002, -3.09203714e-002, + 4.98314053e-002, 5.93405813e-002, -1.12266466e-002, + -3.24536189e-002, 3.79851833e-002, 5.59274070e-002, + -2.24416377e-004, -1.72029366e-003, 5.10276295e-003, + 5.98944956e-003, -3.56481597e-002, -1.63817860e-003, + 5.41838296e-002, 4.82429415e-002, -2.55131066e-001, + -1.09933458e-001, 3.44240397e-001, 4.12937194e-001, + 4.48624231e-002, -1.13450691e-001, 1.65998623e-001, + 2.45582357e-001, 1.88860856e-002, -7.97424745e-003, + 3.58502083e-002, 3.30560878e-002, -3.13844383e-002, + 1.98408752e-003, 5.31432033e-002, 3.45267169e-002, + -3.22585732e-001, 8.40642955e-003, 3.89903516e-001, + 2.09805474e-001, 8.32365528e-002, 4.14517708e-002, + 1.64400324e-001, 1.50986373e-001, 1.84640680e-002, + 4.98420000e-003, 3.42278890e-002, 2.64226496e-002, + -3.27542704e-003, -1.41565164e-003, 7.43143214e-003, + 4.94316453e-003, -3.47828455e-002, 1.91059876e-002, + 5.22384308e-002, 3.87741663e-002, 7.03252247e-003, + 1.66761745e-002, 3.08123510e-002, 3.27913947e-002, + 5.67097275e-004, 6.58561362e-007, 4.78072697e-003, + 4.05374402e-003, -2.01321527e-004, -1.18435419e-003, + 3.48160113e-003, 3.41328001e-003, 9.63453762e-003, + -2.08370835e-002, 2.58495286e-002, 3.02494224e-002, + 6.08110949e-002, -2.31621116e-002, 6.91817701e-002, + 3.95062529e-002, 6.89319056e-003, 2.74352450e-003, + 1.17317960e-002, 5.72071271e-003, -1.04950955e-002, + -1.19031302e-003, 2.41610836e-002, 1.72983967e-002, + 1.49107911e-002, -3.12254261e-002, 1.15572385e-001, + 1.04173429e-001, 4.04793084e-001, -1.02258146e-001, + 4.37901706e-001, 1.69308394e-001, 9.02732164e-002, + -1.11598549e-002, 1.13972120e-001, 3.53254005e-002, + -1.05809318e-002, 2.02802904e-002, 2.67510302e-002, + 3.12443040e-002, 9.52728558e-003, 1.69847757e-001, + 1.28200665e-001, 2.13020340e-001, 2.77720273e-001, + 1.34713680e-001, 3.34627628e-001, 2.27208853e-001, + 1.04058497e-001, -8.78034532e-003, 1.23796709e-001, + 4.04838547e-002, 1.81666506e-003, 6.16327580e-003, + 5.35797561e-003, 1.02028633e-002, 9.79472417e-003, + 7.45098814e-002, 3.76465097e-002, 9.57273841e-002, + 2.08109654e-002, 7.48619586e-002, 4.64533977e-002, + 9.56255570e-002, 5.26591204e-003, 4.06117353e-004, + 9.84816160e-003, 8.08466133e-003, 1.71453448e-003, + 5.75919228e-004, 5.01344353e-003, 3.78345768e-003, + 8.16216506e-003, 1.81635804e-002, 3.06533836e-002, + 3.65683064e-002, 1.13464370e-002, 2.04712190e-002, + 4.33445536e-002, 4.37897034e-002, -9.66559339e-004, + 5.94095793e-004, 6.89170230e-003, 4.78759175e-003, + 3.00303418e-002, 4.43214923e-003, 4.87857535e-002, + 2.27850415e-002, 7.71964714e-002, 7.76663348e-002, + 2.24471122e-001, 1.85265824e-001, 1.57701507e-001, + 1.60339788e-001, 4.08423662e-001, 2.45926961e-001, + -4.37496752e-002, 9.80627351e-003, 6.81254715e-002, + 3.21070626e-002, 3.07010747e-002, -6.43588882e-003, + 4.94124517e-002, 2.23643500e-002, 5.52364625e-002, + -1.15019105e-001, 2.35876769e-001, 1.96587592e-001, + 1.86581567e-001, -1.90175712e-001, 4.19416487e-001, + 2.66966313e-001, -4.42502126e-002, -1.04129110e-002, + 6.68301359e-002, 3.23840454e-002, 1.83410093e-003, + -6.19308848e-004, 4.76668170e-003, 3.40204709e-003, + 6.52513700e-003, -1.45020494e-002, 2.91067641e-002, + 3.43834907e-002, 1.17684118e-002, -2.13846881e-002, + 4.04844321e-002, 4.23832312e-002, -1.07075530e-003, + -1.72811968e-003, 6.49946183e-003, 4.80324402e-003, + 9.20474122e-004, 1.27918058e-004, 4.90651606e-003, + 4.16024914e-003, 1.43593643e-002, 2.35797167e-002, + 3.78634408e-002, 4.74189036e-002, -7.64353620e-003, + 2.45216060e-002, 3.60984467e-002, 5.33401407e-002, + 9.23751912e-004, 2.57440872e-004, 5.01757162e-003, + 5.44496393e-003, 1.07974280e-002, 8.72202776e-003, + 4.19123657e-002, 3.17334235e-002, 2.21872315e-001, + 3.73384962e-003, 3.26943815e-001, 2.75918782e-001, + -4.26727422e-002, 9.89571884e-002, 2.65677214e-001, + 3.33519071e-001, -1.82207078e-002, 2.05792040e-002, + 4.71296944e-002, 4.43636104e-002, 2.71830894e-002, + 1.23542212e-002, 5.16881272e-002, 3.69923487e-002, + 5.22292741e-002, 1.27249360e-001, 2.88938433e-001, + 3.26171517e-001, 6.22039177e-002, -3.60567868e-002, + 2.57878631e-001, 3.03057164e-001, -1.99615154e-002, + 5.91387157e-004, 4.59620580e-002, 4.01826799e-002, + 2.92548258e-003, -3.11809679e-004, 5.89012774e-003, + 5.33019612e-003, 9.43231047e-004, -2.70790253e-002, + 3.92526872e-002, 5.50332703e-002, -1.48342084e-003, + -2.21039634e-002, 3.79055701e-002, 5.50907031e-002, + 1.28618150e-004, -1.44833454e-003, 4.94491262e-003, + 6.00678241e-003, 1.81224430e-003, -1.05697196e-002, + 6.16982765e-003, 1.46749429e-002, 9.54157673e-003, + -1.27110168e-001, 4.06619199e-002, 1.50962636e-001, + -8.38937517e-003, -1.31518394e-001, 4.38847467e-002, + 1.58133179e-001, -3.61305242e-003, -1.16220703e-002, + 7.74174416e-003, 1.60133690e-002, -1.70947332e-002, + -2.36188415e-002, 2.96801161e-002, 4.13464233e-002, + -4.21366505e-002, -1.62019759e-001, 1.22083075e-001, + 2.59747416e-001, 2.18571108e-002, -1.66411489e-001, + 1.21662855e-001, 2.80145884e-001, 1.75116323e-002, + -1.64970849e-002, 3.42777818e-002, 4.23091613e-002, + -1.31019661e-002, 3.31670418e-002, 2.78341174e-002, + 4.82943319e-002, -1.87809858e-002, 2.96601087e-001, + 1.14447996e-001, 3.56841981e-001, 1.66157596e-002, + 3.16043317e-001, 1.16816960e-001, 3.66272032e-001, + 1.52570484e-002, 3.53752635e-002, 3.26626264e-002, + 5.18245213e-002, 2.50881445e-003, 9.70678963e-003, + 6.15595700e-003, 1.41277323e-002, 1.06076486e-002, + 9.83134210e-002, 3.72478366e-002, 1.27534211e-001, + -8.41326546e-003, 9.41439569e-002, 3.79238352e-002, + 1.27418607e-001, -3.23687657e-003, 8.82302038e-003, + 7.35660829e-003, 1.41352285e-002, -1.64404802e-003, + 3.92447342e-004, 4.82142251e-003, 3.15649295e-003, + -1.83749329e-002, -1.58861950e-002, 3.72349583e-002, + 2.99023036e-002, 1.66936796e-002, -1.83714572e-002, + 5.38590737e-002, 3.17759253e-002, 2.91193207e-003, + 8.75714177e-004, 6.88603753e-003, 3.11024114e-003, + -2.38313451e-002, -3.62528744e-003, 4.06976417e-002, + 1.97391361e-002, -1.69369966e-001, -5.82701750e-002, + 2.47128814e-001, 1.38084248e-001, 1.68469667e-001, + -6.56760186e-002, 4.75791186e-001, 1.38608858e-001, + 2.97641512e-002, 1.88729074e-003, 5.62591292e-002, + 1.86232328e-002, -2.17575897e-002, 4.50327480e-003, + 3.87341529e-002, 1.93069503e-002, -1.85957253e-001, + 6.38704076e-002, 2.58918196e-001, 1.29283771e-001, + 1.78002775e-001, 4.91814278e-002, 5.26999056e-001, + 1.20286942e-001, 2.72888895e-002, 7.17976247e-004, + 5.65995201e-002, 1.82215646e-002, -1.48999854e-003, + -3.62582301e-004, 4.75414842e-003, 2.78097973e-003, + -2.57614814e-002, 1.16593447e-002, 4.09605838e-002, + 2.48943362e-002, 2.27263775e-002, 1.54914754e-002, + 6.48234934e-002, 2.71732286e-002, 2.28209305e-003, + -8.69906333e-004, 7.19930232e-003, 3.02038714e-003, + 2.15283083e-003, -1.03846833e-003, 7.41043873e-003, + 3.86316935e-003, 6.36200458e-002, 1.85453333e-002, + 7.43713677e-002, 3.35111171e-002, 5.42623550e-003, + 1.43855158e-002, 2.39103083e-002, 2.33878121e-002, + -1.14925625e-003, 6.69531000e-004, 3.35156219e-003, + 2.60140235e-003, 3.00251618e-002, 8.29054322e-003, + 5.88875487e-002, 2.62247548e-002, 4.16477829e-001, + 9.59530100e-002, 4.87053782e-001, 1.69658020e-001, + -8.88054073e-003, 1.48125859e-002, 1.08007938e-001, + 8.39666054e-002, -1.47291282e-002, -1.84091667e-004, + 2.69065164e-002, 1.51565177e-002, 5.58463633e-002, + 1.62923895e-002, 7.44118243e-002, 3.90527509e-002, + 2.51060545e-001, -4.18364406e-002, 3.58623594e-001, + 2.08874196e-001, -9.04270727e-003, -1.14901058e-001, + 1.26962930e-001, 1.79194406e-001, -1.49709219e-002, + -1.41674876e-002, 3.23483497e-002, 2.65388172e-002, + 3.62401758e-003, -3.83121497e-003, 6.70421869e-003, + 1.04230074e-002, 5.92165627e-003, -9.31462422e-002, + 4.05674651e-002, 1.43465325e-001, 5.05873468e-003, + -9.68122706e-002, 3.39880437e-002, 1.47926018e-001, + 1.12899230e-003, -9.59601626e-003, 5.30394912e-003, + 1.67218838e-002, 8.24340968e-004, 2.49260105e-003, + 4.66691842e-003, 8.53133854e-003, 1.23416148e-002, + 4.63266298e-002, 3.38055678e-002, 8.62741992e-002, + 1.89903397e-002, 5.94463795e-002, 3.63817327e-002, + 9.81378853e-002, 1.45299884e-003, 5.68654714e-003, + 4.38441522e-003, 1.09752137e-002, 5.88627756e-002, + 9.26223118e-003, 6.96791112e-002, 5.54952249e-002, + 1.67349413e-001, 2.77220219e-001, 2.28151664e-001, + 3.64908695e-001, 7.17163377e-004, 1.99986890e-001, + 1.10109948e-001, 2.51462996e-001, -9.81207564e-003, + 2.05822960e-002, 2.23116037e-002, 3.16888914e-002, + 3.94334644e-002, -2.84751467e-002, 6.23225123e-002, + 4.89907041e-002, 3.42380941e-001, -2.24685863e-001, + 3.77891481e-001, 2.80112624e-001, -1.28449332e-002, + -3.45924869e-002, 9.24160257e-002, 9.99017730e-002, + -9.33077279e-003, -1.08606345e-003, 1.85161605e-002, + 1.55095952e-002, 3.93646682e-004, 9.63852392e-004, + 6.33800263e-003, 5.05425874e-003, 5.65369800e-002, + -2.87129171e-002, 6.85374290e-002, 4.91225608e-002, + 1.72351599e-002, -2.86089350e-002, 3.17395367e-002, + 3.80408876e-002, -1.46741440e-004, -1.21634302e-003, + 2.77845212e-003, 3.18037439e-003, 2.90887593e-003, + 1.01042364e-003, 6.66655134e-003, 6.12202985e-003, + -3.46626592e-004, 4.25331034e-002, 4.31754440e-002, + 6.05596229e-002, -9.99998115e-003, 3.47037911e-002, + 4.24779020e-002, 5.64086363e-002, -4.23930556e-004, + 6.14948163e-004, 5.96437603e-003, 6.04854757e-003, + 4.84874919e-002, -1.26212742e-002, 6.31966367e-002, + 3.95596325e-002, 7.42610618e-002, -2.43160725e-002, + 3.34331304e-001, 2.77823389e-001, -5.67018986e-002, + 1.26083717e-001, 2.63533920e-001, 2.41162732e-001, + -3.29856351e-002, 1.80903431e-002, 5.46210594e-002, + 3.81465182e-002, 2.50853933e-002, -1.51462452e-002, + 4.77615893e-002, 3.74578275e-002, 2.48156726e-001, + -1.87747598e-001, 3.68923366e-001, 3.51646692e-001, + 3.60826738e-002, -5.34147657e-002, 2.17152625e-001, + 2.10634261e-001, -3.78820375e-002, 3.70443659e-003, + 5.43114021e-002, 3.34283598e-002, -1.09538611e-004, + 9.71348956e-004, 5.12104621e-003, 4.95364144e-003, + 2.66056322e-002, -1.95497442e-002, 4.49500866e-002, + 4.75237891e-002, 1.93452574e-002, -3.72578762e-002, + 4.22570072e-002, 5.22306561e-002, -1.57073874e-003, + -1.76029641e-003, 5.75392554e-003, 5.36788162e-003, + -9.14825534e-004, -8.80310254e-004, 5.38215926e-003, + 4.33205394e-003, 5.21465950e-003, -3.38053666e-002, + 4.33093160e-002, 4.40932624e-002, 5.30197062e-002, + -2.50672717e-002, 6.31301403e-002, 4.27887440e-002, + -3.06701957e-004, 1.06290949e-003, 4.52589849e-003, + 4.04087361e-003, -2.07198933e-002, -6.74040476e-003, + 3.87595743e-002, 2.95916945e-002, -1.11944906e-001, + -4.83164936e-002, 2.11025566e-001, 1.74817413e-001, + 3.27829063e-001, -2.87847489e-001, 3.85699928e-001, + 3.43288451e-001, 3.44330855e-002, -4.07961644e-002, + 5.02957627e-002, 5.15679196e-002, -1.96855515e-002, + 3.11825122e-003, 3.55701782e-002, 2.91165281e-002, + -4.37406898e-002, 1.20760009e-001, 1.78096369e-001, + 1.93183109e-001, 9.29959416e-002, 2.07731828e-001, + 2.32177913e-001, 2.79255271e-001, 4.73063923e-002, + 3.18703661e-003, 5.74427284e-002, 4.48784530e-002, + -2.98399536e-004, 1.05906208e-003, 4.83281445e-003, + 4.67650592e-003, 1.03038736e-002, 2.49111969e-002, + 3.70531641e-002, 4.00314666e-002, 1.80148855e-002, + 2.94665080e-002, 4.28064205e-002, 4.57234941e-002, + 8.82897351e-004, 1.80123886e-003, 5.13969036e-003, + 5.36526786e-003, 1.17372640e-003, -3.82596394e-003, + 5.69205917e-003, 6.03580102e-003, 3.08722928e-002, + -3.71636897e-002, 4.61173728e-002, 5.02632745e-002, + 5.30462200e-003, -2.56294515e-002, 2.87182499e-002, + 4.06738110e-002, -3.20921303e-004, -1.41783862e-003, + 3.90886329e-003, 4.46093082e-003, -2.17698459e-002, + -1.84212793e-002, 3.92034017e-002, 3.47842202e-002, + 1.46407992e-001, -2.57573783e-001, 2.60830969e-001, + 3.15066546e-001, 5.20534366e-002, -3.59882414e-001, + 2.27762550e-001, 4.11584347e-001, 4.06653136e-002, + -3.09844576e-002, 5.05621620e-002, 4.89158072e-002, + -1.81607045e-002, 1.12315379e-002, 3.44120152e-002, + 2.96527222e-002, 2.41250787e-002, 1.07040152e-001, + 1.70361027e-001, 1.91243649e-001, 1.28568679e-001, + 1.48618609e-001, 2.18056202e-001, 2.34440267e-001, + 4.16820571e-002, 1.70182772e-002, 5.16944975e-002, + 4.07478251e-002, 4.49292944e-004, 1.32560416e-003, + 4.76974249e-003, 4.81889257e-003, 1.01765888e-002, + 3.16657387e-002, 3.54873799e-002, 4.66458984e-002, + 1.88336670e-002, 3.00407261e-002, 3.77432518e-002, + 4.68445793e-002, 1.26930245e-003, 5.83097048e-004, + 5.08362195e-003, 5.15837315e-003, 4.51536058e-003, + -6.30015158e-004, 7.17256172e-003, 3.42827453e-003, + 1.50481751e-003, 8.09004158e-003, 2.06233114e-002, + 1.97090432e-002, -2.61747073e-002, 7.95795489e-003, + 3.58824693e-002, 2.35213432e-002, -4.74452553e-003, + -1.53268292e-003, 9.06166155e-003, 5.23514021e-003, + 4.54923436e-002, -7.87566043e-003, 6.21051192e-002, + 2.48834733e-002, 4.88572605e-002, -8.26616678e-003, + 1.40771180e-001, 1.09917209e-001, -1.65044159e-001, + 4.62013707e-002, 2.26691097e-001, 1.36358693e-001, + -5.59300929e-002, 5.15262084e-003, 7.71782398e-002, + 4.33438495e-002, 4.86216880e-002, -2.23657954e-002, + 6.64402544e-002, 4.14840057e-002, 5.44595532e-002, + -1.79753125e-001, 1.76959991e-001, 2.76977748e-001, + -1.86743975e-001, -3.23111504e-001, 2.45216891e-001, + 4.09035057e-001, -6.48325905e-002, -5.03575429e-002, + 8.63393918e-002, 7.52198175e-002, 8.10848956e-004, + -1.84038971e-002, 6.93113403e-003, 2.33080611e-002, + -1.96736250e-002, -1.87951162e-001, 4.26854677e-002, + 2.22669140e-001, -2.24048235e-002, -1.56806976e-001, + 4.17777337e-002, 1.96762100e-001, 4.39157768e-004, + -9.87916626e-003, 6.82700984e-003, 1.80123989e-002, + -1.77077372e-002, 7.52239339e-006, 2.44247466e-002, + 5.45470417e-003, -1.32334651e-002, -2.65540667e-002, + 5.10200597e-002, 4.22737040e-002, 3.94944428e-003, + -2.42635105e-002, 3.21283899e-002, 4.08864170e-002, + 1.71553867e-004, -1.80931750e-003, 5.38295927e-003, + 5.32866456e-003, -1.70849711e-001, 9.89076216e-004, + 2.10647061e-001, 3.49141620e-002, -1.05339997e-001, + -9.64723080e-002, 3.20783913e-001, 1.85270011e-001, + 6.67648986e-002, -8.55200440e-002, 1.98685676e-001, + 1.79234564e-001, 1.55347129e-002, -4.36372636e-003, + 3.59015018e-002, 3.03908736e-002, -1.60337940e-001, + 2.25986913e-003, 1.96217433e-001, 3.80732268e-002, + -1.85693994e-001, 9.50805992e-002, 3.30457121e-001, + 2.52243072e-001, 7.69932196e-002, 2.23927181e-002, + 2.31279865e-001, 2.88399011e-001, 2.60731932e-002, + 9.04501975e-003, 4.44467589e-002, 4.62201238e-002, + -1.19487746e-002, 2.25587119e-003, 1.88990906e-002, + 8.65814742e-003, -1.11155529e-002, 9.59074423e-002, + 5.83304651e-002, 1.31050125e-001, 2.26843543e-003, + 1.08841300e-001, 4.35165949e-002, 1.48622662e-001, + -5.42826368e-004, 7.78748048e-003, 6.57071313e-003, + 1.52426269e-002, 3.77982797e-004, -2.39333371e-003, + 6.12187013e-003, 6.85055554e-003, -4.57958085e-003, + -5.79439737e-002, 3.58104259e-002, 7.21580610e-002, + 2.02425253e-002, -4.74769361e-002, 3.76996771e-002, + 6.55148253e-002, 2.66869029e-005, -7.84699747e-004, + 4.69531352e-003, 4.89120465e-003, -2.93799359e-002, + -3.04847620e-002, 5.26182465e-002, 4.94426899e-002, + -8.21013972e-002, -1.68493018e-001, 2.21307099e-001, + 2.91143119e-001, 2.01612368e-001, -2.01489419e-001, + 2.90814996e-001, 3.44116360e-001, 4.16495800e-002, + -2.73821801e-002, 6.35688603e-002, 4.84878868e-002, + -4.10652719e-002, -1.02877300e-002, 5.87255806e-002, + 4.68403138e-002, 2.62671430e-002, -6.12613037e-002, + 2.24031076e-001, 2.94217259e-001, 9.22827944e-002, + -4.58325706e-002, 2.49358132e-001, 3.14052165e-001, + 5.74267395e-002, -1.14586996e-002, 7.23505095e-002, + 5.06185964e-002, -1.47735584e-003, 2.94127665e-003, + 6.88582612e-003, 9.11731366e-003, 2.67762179e-003, + 5.69573715e-002, 4.14255261e-002, 8.20592865e-002, + 7.18305213e-003, 4.47388440e-002, 4.11017463e-002, + 7.19377846e-002, 3.11324839e-003, 6.55033858e-004, + 7.42117828e-003, 8.73263832e-003, -1.09105720e-004, + 3.17236263e-004, 5.44745149e-003, 4.21351288e-003, + 6.14835590e-004, 2.11462565e-002, 4.78719734e-002, + 4.81511541e-002, -8.36266670e-003, 1.98088214e-002, + 2.81212442e-002, 4.77564149e-002, -5.15299733e-004, + 9.28265858e-004, 3.51609266e-003, 4.85769706e-003, + 7.64055504e-003, 2.87408911e-004, 4.67224047e-002, + 2.22137850e-002, 6.13904670e-002, 5.86459152e-002, + 4.83767658e-001, 2.25772396e-001, -6.95771053e-002, + 3.90264094e-002, 1.87775582e-001, 2.94917911e-001, + -1.74354259e-002, 7.91245233e-003, 3.36113013e-002, + 3.32661681e-002, 1.06511442e-002, 1.47309562e-003, + 5.20217828e-002, 1.82299558e-002, -1.02220215e-002, + -2.92978249e-002, 5.47850847e-001, 1.42934918e-001, + -5.24625517e-002, -7.47075751e-002, 1.78034544e-001, + 1.76643968e-001, -1.44187426e-002, -7.83698913e-003, + 3.17337252e-002, 2.56432090e-002, 1.21156836e-003, + 5.43804708e-005, 6.97531831e-003, 3.33430641e-003, + -6.77335029e-003, -1.49149345e-002, 6.21738806e-002, + 3.43041942e-002, -7.54580833e-003, -7.31904712e-003, + 2.90180873e-002, 3.07608452e-002, -6.00914878e-004, + -1.62647411e-004, 3.51832877e-003, 3.81053123e-003, + -3.94202163e-003, 1.24621519e-003, 6.30647875e-003, + 2.72270944e-003, -3.96461710e-002, -1.24041941e-002, + 5.29382937e-002, 2.31701266e-002, 3.31146382e-002, + -1.36308977e-002, 4.49249856e-002, 2.49353107e-002, + 8.36578838e-004, 8.17770429e-004, 5.37381740e-003, + 3.38728516e-003, -2.76293717e-002, 3.93432472e-003, + 4.26195040e-002, 1.55946780e-002, -3.64180207e-001, + 5.97567484e-003, 4.02398586e-001, 1.12554856e-001, + 2.39854321e-001, -5.61563112e-002, 2.82966167e-001, + 1.23238564e-001, 1.82982888e-002, -8.40071030e-003, + 4.15301025e-002, 2.46791020e-002, -2.41217092e-002, + 3.65454791e-004, 3.99578921e-002, 1.46849835e-002, + -3.58765721e-001, 7.43032396e-002, 3.98976564e-001, + 1.34190753e-001, 1.50542185e-001, 5.74452281e-002, + 2.17210084e-001, 1.32333443e-001, 2.56350916e-002, + -3.07174609e-003, 4.21839170e-002, 2.47446131e-002, + -2.27116840e-003, -5.32404345e-004, 5.24953101e-003, + 2.47064559e-003, -3.81738767e-002, 2.03275960e-002, + 5.23648039e-002, 2.98299287e-002, 1.03695858e-002, + 2.14775316e-002, 3.34829390e-002, 3.14595625e-002, + 1.91582949e-003, 2.91765667e-004, 5.25544584e-003, + 3.80066410e-003, 2.89618620e-004, 1.10340700e-003, + 3.73637024e-003, 5.96147915e-003, -2.65994878e-003, + 1.55719398e-002, 2.78765708e-002, 5.36468849e-002, + -7.95364566e-003, -1.11135084e-003, 3.37510332e-002, + 5.30682951e-002, -9.33317788e-005, -7.51856773e-004, + 4.09037992e-003, 5.54494653e-003, 1.02812918e-002, + -2.06317399e-002, 4.05115150e-002, 5.48612475e-002, + 9.99446493e-003, -1.59633934e-001, 2.29201213e-001, + 5.24965465e-001, -6.06865287e-002, 5.35664521e-002, + 2.55002290e-001, 3.70572776e-001, -1.04617793e-003, + 1.29613141e-002, 3.74115855e-002, 3.98670323e-002, + -2.34552380e-003, -3.52888322e-003, 3.21510695e-002, + 3.25390734e-002, 1.28385782e-001, 2.37673968e-002, + 2.29985386e-001, 2.16592431e-001, 6.85705021e-002, + 3.31941061e-002, 2.32383817e-001, 2.57119298e-001, + -9.15157702e-003, 6.56758901e-003, 3.83365378e-002, + 3.55585627e-002, 3.00658023e-004, 5.95371122e-004, + 3.82785220e-003, 4.00372641e-003, 1.07001932e-002, + -5.86283067e-003, 2.98825130e-002, 3.75984497e-002, + 6.72252150e-003, -1.73600819e-002, 3.12981643e-002, + 4.28169891e-002, -2.78869556e-004, -1.24549703e-003, + 4.29221056e-003, 4.79799137e-003, 2.67186854e-003, + 8.94724053e-006, 6.30975747e-003, 4.12600022e-003, + 7.93014129e-004, 1.69133078e-002, 4.23345305e-002, + 3.34622972e-002, 1.89557057e-002, 1.97221078e-002, + 4.10278067e-002, 3.53127830e-002, -2.19257476e-004, + 1.45146088e-003, 4.94546304e-003, 4.19589784e-003, + 4.16785292e-002, 3.70034296e-003, 5.84318191e-002, + 2.76379604e-002, -1.13416798e-002, 1.09704547e-001, + 3.37160677e-001, 1.96451291e-001, 1.49498656e-001, + 9.44341049e-002, 2.76976973e-001, 1.66842222e-001, + -2.00197455e-002, 2.24745437e-003, 3.63280587e-002, + 2.33561881e-002, 3.56713794e-002, -1.93419699e-002, + 4.92533483e-002, 3.91433388e-002, 7.89594278e-002, + -2.44785309e-001, 2.41824567e-001, 3.83015424e-001, + 1.41952923e-002, -2.84608215e-001, 1.80937186e-001, + 3.78860831e-001, -1.62413977e-002, -3.51480171e-002, + 3.39127816e-002, 4.76940610e-002, 6.37955964e-005, + -4.96500987e-004, 3.50534497e-003, 4.77496255e-003, + 1.42052665e-003, -1.96377803e-002, 2.19083373e-002, + 4.57695350e-002, 3.17807426e-003, -1.61654856e-002, + 2.10586097e-002, 4.71598431e-002, 2.00618291e-003, + -1.65004574e-003, 3.84690799e-003, 6.43092953e-003, + 2.07435642e-003, 4.31420573e-004, 4.61803796e-003, + 3.74295469e-003, -1.17841549e-003, 2.36109644e-002, + 2.96828393e-002, 3.26051489e-002, -4.38484251e-002, + 1.88496187e-002, 5.23062684e-002, 3.47284302e-002, + -8.21188150e-004, -1.48791180e-003, 4.92349919e-003, + 4.08525532e-003, 3.41462605e-002, -8.80931225e-003, + 4.37170155e-002, 2.85100937e-002, 8.65714625e-002, + 2.74056904e-002, 1.66892141e-001, 1.34286210e-001, + -3.35248321e-001, 1.46516308e-001, 3.64468873e-001, + 2.01447338e-001, -2.79261675e-002, 1.73951369e-002, + 4.62843627e-002, 3.30038778e-002, 2.42298059e-002, + -3.45893502e-002, 3.95067073e-002, 4.39483970e-002, + 1.73994169e-001, -3.40172499e-001, 2.27439508e-001, + 3.61324966e-001, -9.73008573e-002, -1.40015796e-001, + 2.33539417e-001, 2.45423511e-001, -4.81073894e-002, + 9.03374329e-003, 5.82566634e-002, 3.65170352e-002, + -1.16245809e-003, -8.86177353e-004, 4.07968229e-003, + 4.53907484e-003, 1.39241358e-002, -2.90402956e-002, + 3.07569373e-002, 4.38754037e-002, 1.40174776e-002, + -4.64054756e-002, 3.56466807e-002, 5.56205586e-002, + -2.47544469e-003, -2.17692205e-003, 5.57487365e-003, + 5.45539940e-003, 2.10910453e-003, -4.06313688e-004, + 4.96956334e-003, 2.35398719e-003, 3.01903933e-002, + 1.50193060e-002, 4.15527113e-002, 2.20894814e-002, + -2.83371620e-002, 1.36181116e-002, 4.11717035e-002, + 2.20335461e-002, -3.50992708e-003, -6.94340677e-004, + 5.54211205e-003, 2.77867727e-003, 2.33740844e-002, + -1.50345115e-003, 3.85779440e-002, 1.56889670e-002, + 2.71237761e-001, 4.48433012e-002, 3.10179949e-001, + 1.08028643e-001, -2.88554668e-001, 2.31837854e-002, + 3.31245035e-001, 1.08195268e-001, -2.84288861e-002, + -5.24381269e-003, 4.05829363e-002, 1.85589623e-002, + 2.35502142e-002, -1.04699587e-003, 3.88297550e-002, + 1.57816093e-002, 2.80500621e-001, -4.64845635e-002, + 3.20336401e-001, 1.13392390e-001, -3.44386697e-001, + -7.71420598e-002, 3.78186852e-001, 1.30212888e-001, + -2.13494189e-002, -4.46908735e-003, 3.61517929e-002, + 1.74995512e-002, 2.36851652e-003, 3.12743359e-004, + 5.11393277e-003, 2.44790944e-003, 2.77275071e-002, + -1.92491654e-002, 4.21104319e-002, 2.65625268e-002, + -4.14638668e-002, -2.03547534e-002, 5.13344929e-002, + 2.79174838e-002, -1.49185816e-003, 3.66133230e-004, + 4.34653182e-003, 2.56167515e-003, -4.82546777e-004, + 8.14254337e-004, 4.46094293e-003, 3.52807995e-003, + -4.05639596e-002, -2.64247172e-002, 5.34367077e-002, + 4.07927819e-002, 1.45648662e-002, -2.64035165e-002, + 4.09743190e-002, 4.01855558e-002, 1.99037418e-003, + 6.55231197e-005, 5.49529772e-003, 4.27258201e-003, + -1.20463986e-002, -1.29751079e-002, 3.50548588e-002, + 2.92011350e-002, -3.75443995e-001, -5.03987744e-002, + 4.14879650e-001, 2.17881963e-001, 1.89858377e-001, + -1.79910026e-002, 2.64216006e-001, 1.88787535e-001, + 2.76132766e-002, -1.99032668e-003, 4.39910106e-002, + 3.09180934e-002, -3.30590345e-002, -2.53317561e-002, + 4.64196876e-002, 5.02985418e-002, -1.47115126e-001, + -8.13128054e-002, 2.39342511e-001, 3.00183415e-001, + 1.88768178e-001, 6.66946769e-002, 2.53345311e-001, + 2.04353228e-001, 2.09992770e-002, 6.10105810e-004, + 3.81637625e-002, 3.25379968e-002, -2.60758842e-003, + 9.80956946e-004, 5.73727954e-003, 5.36576752e-003, + -6.63519092e-003, 3.00421566e-002, 3.44486013e-002, + 4.42136601e-002, 1.71690937e-002, 2.47194041e-002, + 3.65825742e-002, 4.00261991e-002, 4.23919118e-004, + 3.16203979e-004, 4.64043440e-003, 4.53786692e-003, + -3.56691936e-003, -1.47014635e-003, 1.02764610e-002, + 8.08009785e-003, 5.34071103e-002, 5.24637997e-002, + 9.31957215e-002, 7.58594796e-002, 9.92475636e-003, + 4.00698520e-002, 5.48778139e-002, 5.76214232e-002, + -1.61392558e-002, -2.90618977e-003, 2.09105201e-002, + 6.82256324e-003, 6.25742897e-002, 4.81890403e-002, + 9.84695554e-002, 9.26701427e-002, 2.01510370e-001, + 2.11082146e-001, 3.26656014e-001, 2.90964127e-001, + -7.84019455e-002, 5.28291129e-002, 1.91133007e-001, + 1.41293555e-001, -1.90169349e-001, -9.03520640e-003, + 2.19832540e-001, 3.82665657e-002, 6.77380636e-002, + -1.36373527e-002, 9.11791772e-002, 5.53615391e-002, + 8.37476030e-002, -1.88397110e-001, 2.10516855e-001, + 2.70799637e-001, -8.85705352e-002, -6.10203519e-002, + 2.05734029e-001, 1.58850610e-001, -1.71845749e-001, + 5.54455584e-003, 2.03767970e-001, 4.90017757e-002, + 2.01359205e-003, -2.90890294e-003, 6.52724039e-003, + 9.94793419e-003, 2.11343057e-002, -5.63294254e-002, + 4.84789163e-002, 8.82393792e-002, 1.43941324e-002, + -4.77926359e-002, 5.83602414e-002, 6.63959458e-002, + -1.33471098e-002, 2.51228386e-003, 1.72555763e-002, + 9.87787079e-003, 2.17777956e-003, 5.67050418e-004, + 5.82611049e-003, 5.45673445e-003, -3.03299390e-002, + -3.58790085e-002, 5.28848357e-002, 6.08011968e-002, + -4.37262021e-002, -7.35825002e-002, 6.32381290e-002, + 8.53088051e-002, -5.70921577e-004, -4.50625736e-003, + 6.00393210e-003, 7.44324084e-003, -4.14827652e-002, + -5.53181469e-002, 6.38721958e-002, 6.92603886e-002, + -2.54547536e-001, -4.35968876e-001, 3.45436066e-001, + 4.95792687e-001, -2.44764499e-002, -1.21702440e-001, + 1.78065017e-001, 2.22687006e-001, 2.00447589e-002, + -8.13247263e-003, 3.43679450e-002, 3.06091886e-002, + -5.05792536e-002, -1.45518230e-002, 6.31573945e-002, + 4.35329303e-002, -7.55495429e-002, 3.97204645e-002, + 1.72285914e-001, 1.59182668e-001, 4.35511060e-002, + 3.74847874e-002, 1.25466794e-001, 1.44714683e-001, + 1.81623995e-002, 2.75270734e-003, 3.10526621e-002, + 2.74530016e-002, -2.61209020e-003, 2.18323927e-004, + 6.41126372e-003, 5.52855665e-003, -6.23021508e-003, + 2.29570922e-002, 2.90556382e-002, 3.87151726e-002, + 1.56730972e-003, 2.00467184e-002, 2.53731981e-002, + 3.39965150e-002, 5.11069957e-004, 8.16334796e-004, + 4.03755531e-003, 4.29850072e-003, 1.41956494e-003, + 1.34115908e-004, 7.54652126e-003, 4.96148597e-003, + 1.59447826e-002, 3.66905332e-002, 6.56107366e-002, + 5.70183955e-002, -1.44415116e-003, 4.24282961e-002, + 3.96796130e-002, 6.11045361e-002, -9.26901412e-004, + 2.14825384e-003, 6.68815291e-003, 5.66210644e-003, + 3.99944484e-002, 2.96033709e-003, 6.99780360e-002, + 3.13098766e-002, 1.63007557e-001, 1.50402114e-001, + 5.76265454e-001, 2.57686079e-001, -6.75063878e-002, + 1.00149103e-001, 2.46229932e-001, 1.66161150e-001, + -3.26280408e-002, 9.92711820e-003, 6.37223721e-002, + 2.71098297e-002, 3.47966142e-002, 3.29876854e-003, + 6.19585179e-002, 2.81408131e-002, 2.05604345e-001, + -5.81823401e-002, 3.77255768e-001, 1.79321557e-001, + -6.19551986e-002, -1.93697202e-003, 1.65072277e-001, + 1.13306113e-001, -4.12837863e-002, 6.80993684e-003, + 5.86988479e-002, 2.31786892e-002, 2.07194337e-003, + 1.07316801e-003, 7.11535476e-003, 3.78365233e-003, + 3.03741395e-002, -1.65279768e-002, 4.84914966e-002, + 2.89315265e-002, -2.29261746e-003, -1.22220069e-002, + 3.01976148e-002, 2.39973273e-002, -3.27422633e-003, + 3.17719852e-004, 6.26748055e-003, 3.26235802e-003, + 1.03587518e-002, -3.07533261e-003, 1.35828592e-002, + 4.99839615e-003, 1.98028535e-002, 5.89271821e-003, + 3.45190428e-002, 1.78731475e-002, -2.16708407e-002, + 1.03815924e-002, 3.53062563e-002, 1.87561233e-002, + -7.83631578e-003, -7.83876225e-004, 1.19542582e-002, + 4.06571524e-003, 7.25692660e-002, -2.48592962e-002, + 1.02418959e-001, 3.54194567e-002, 2.48378411e-001, + -3.56728807e-002, 3.09612155e-001, 1.04968853e-001, + -1.26788795e-001, 1.94368046e-002, 1.99240595e-001, + 7.37686306e-002, -8.76573622e-002, -4.57811449e-003, + 1.09009512e-001, 2.80926786e-002, 1.99685451e-002, + -8.57444573e-003, 7.29750246e-002, 2.56393421e-002, + 4.54411209e-001, -1.29574910e-001, 4.96573329e-001, + 1.65759936e-001, -1.44816458e-001, -2.43556947e-002, + 2.16742977e-001, 8.60012248e-002, -8.55450705e-002, + -3.53215757e-004, 1.08614884e-001, 2.83822119e-002, + -1.99933723e-003, 1.46731758e-003, 9.18669254e-003, + 3.45991435e-003, 7.93430507e-002, -2.45650485e-002, + 8.93894434e-002, 3.42552587e-002, -2.00023204e-002, + -1.44932587e-002, 4.34716418e-002, 2.37052068e-002, + -7.51220295e-003, 1.20172009e-003, 1.21320970e-002, + 4.13263682e-003, 1.58194068e-003, 1.15301483e-003, + 6.15172600e-003, 5.12615778e-003, -3.40383238e-004, + 4.13417891e-002, 4.54057083e-002, 5.33450469e-002, + -7.60150328e-002, 4.53879572e-002, 9.01818946e-002, + 6.27788454e-002, 1.03703851e-003, -1.77927723e-003, + 7.95174390e-003, 6.07462414e-003, 2.70644985e-002, + 3.52750812e-003, 4.65705208e-002, 2.78788805e-002, + 1.03035189e-001, 1.24013564e-002, 1.98826879e-001, + 1.47207528e-001, -3.97412896e-001, 2.36225113e-001, + 4.58425701e-001, 3.03237855e-001, -5.49223609e-002, + 3.60968821e-002, 8.54638517e-002, 5.64432628e-002, + 2.63260771e-002, -3.72053101e-003, 4.47022878e-002, + 3.07876430e-002, 5.44722751e-002, -7.96962604e-002, + 1.81072414e-001, 1.76651835e-001, -8.60578418e-002, + -8.24673623e-002, 2.15867683e-001, 2.08586812e-001, + -9.28842723e-002, 2.44577620e-002, 1.05652355e-001, + 5.36154844e-002, 4.89670434e-004, -3.50345159e-003, + 5.51807741e-003, 7.32674217e-003, -2.51668878e-003, + -5.27785569e-002, 3.71201001e-002, 6.94502145e-002, + -4.95869666e-003, -5.51631302e-002, 3.63920741e-002, + 7.29352608e-002, -4.82410146e-003, -2.62751174e-003, + 8.94907396e-003, 7.88427703e-003, -1.14653613e-002, + 9.85054721e-005, 1.82415284e-002, 9.71999858e-003, + -4.51716408e-003, -9.46174189e-002, 7.86934569e-002, + 1.28141195e-001, -2.10226793e-002, -9.59587619e-002, + 5.66897690e-002, 1.32944524e-001, -1.84065849e-003, + -6.62017614e-003, 7.08946399e-003, 1.39005883e-002, + -1.77031472e-001, -3.76397133e-004, 2.06264451e-001, + 3.97699885e-002, -1.66395292e-001, -1.08181074e-001, + 3.78817558e-001, 2.86990821e-001, -6.67377710e-002, + -1.43699765e-001, 1.88416809e-001, 2.45289475e-001, + 1.13764964e-002, -2.20306274e-002, 3.04424949e-002, + 3.77230011e-002, -1.92234248e-001, -1.18389782e-002, + 2.18624383e-001, 3.50411832e-002, -1.83629885e-001, + -4.28859666e-002, 3.40646654e-001, 1.68236569e-001, + -5.23082465e-002, -2.32460257e-002, 1.50205970e-001, + 1.33863270e-001, 8.41017067e-003, -2.11417093e-003, + 2.30619423e-002, 2.19395757e-002, -2.13791654e-002, + -2.99642864e-003, 2.60117147e-002, 6.84084464e-003, + -2.97131278e-002, 7.12682027e-003, 4.94422130e-002, + 2.65106689e-002, -1.56545406e-003, 9.70755611e-003, + 2.06394456e-002, 2.28620898e-002, 1.51201632e-004, + 5.92931290e-004, 2.84550735e-003, 3.29332054e-003, + 2.87039508e-003, -2.92273751e-003, 5.15063666e-003, + 6.25011977e-003, -2.41341884e-003, -3.79598103e-002, + 2.48989332e-002, 5.39868437e-002, 2.39855913e-003, + -3.84744070e-002, 2.49338802e-002, 5.28734401e-002, + -1.07839704e-003, -2.55158427e-003, 3.95357795e-003, + 5.46494173e-003, -1.88811999e-002, -5.37979789e-002, + 3.77575345e-002, 6.25194833e-002, -6.44850582e-002, + -4.10249650e-001, 1.66113630e-001, 4.56135750e-001, + 1.22875638e-001, -3.85639966e-001, 1.92509964e-001, + 4.33360308e-001, 2.79071797e-002, -4.72617298e-002, + 4.18688916e-002, 5.81854358e-002, -1.84454750e-002, + -2.71977484e-003, 2.89371889e-002, 2.53099576e-002, + -2.59791091e-002, 3.21819782e-002, 1.07581586e-001, + 1.16890885e-001, 7.60340765e-002, 1.36564551e-002, + 1.29477456e-001, 1.20489888e-001, 2.89817899e-002, + -8.08072835e-003, 3.82132754e-002, 2.77814027e-002, + -7.30284024e-004, 3.25747096e-004, 3.41667142e-003, + 3.31238657e-003, -2.26534088e-003, 1.12237846e-002, + 1.92107912e-002, 2.31894627e-002, 6.73362426e-003, + 1.10484315e-002, 2.09309142e-002, 2.32318193e-002, + 2.02956819e-003, 1.07048363e-004, 4.43599792e-003, + 3.51776020e-003, 1.15714148e-002, 5.11005661e-003, + 2.03093179e-002, 1.02689303e-002, -6.31626043e-003, + 1.19069062e-001, 4.68760021e-002, 1.50057524e-001, + -4.44165356e-002, 1.24437027e-001, 6.27774373e-002, + 1.49491832e-001, -4.19286219e-003, 4.72460501e-003, + 1.15651162e-002, 9.84418392e-003, 1.70612127e-001, + -1.03993984e-002, 2.03653693e-001, 3.23239863e-002, + 2.91575324e-002, 8.29053521e-002, 1.99773386e-001, + 1.62491888e-001, -2.11648881e-001, 1.49304703e-001, + 3.35659593e-001, 2.05625281e-001, -1.48804262e-001, + 1.57367941e-002, 1.98700830e-001, 3.87964845e-002, + 1.63211226e-001, 5.47261909e-004, 2.05679581e-001, + 3.83131094e-002, 7.15711564e-002, -1.41989924e-002, + 2.44172469e-001, 1.08589754e-001, -1.12728864e-001, + 9.91186872e-003, 2.65748918e-001, 9.92686301e-002, + -1.71578780e-001, 2.75157820e-002, 2.16747805e-001, + 4.24630530e-002, 1.32811889e-002, 2.09920364e-003, + 1.92391910e-002, 7.91439414e-003, 1.97727438e-002, + -1.98821574e-002, 4.28679399e-002, 3.07906736e-002, + -1.08812088e-002, -1.12594431e-002, 3.70054469e-002, + 2.16797609e-002, -1.70287695e-002, 3.02536925e-003, + 2.25223042e-002, 7.13726878e-003, 7.82367133e-004, + -1.90204580e-003, 4.09657788e-003, 4.97780368e-003, + 1.16198640e-002, -2.04924699e-002, 3.15632969e-002, + 4.75035869e-002, 8.04091617e-003, -2.45493967e-002, + 2.84411069e-002, 5.05774468e-002, -3.87385262e-005, + -1.91732240e-003, 4.07275837e-003, 5.60520310e-003, + -2.80449679e-003, 2.37705582e-003, 3.03682256e-002, + 3.35294530e-002, 5.27143404e-002, -1.61291696e-002, + 1.71058252e-001, 2.84809709e-001, 2.35560387e-002, + 9.15595144e-002, 1.93910807e-001, 5.23589611e-001, + 1.28407637e-002, 7.01445201e-003, 3.82948183e-002, + 7.00189024e-002, -5.79436542e-003, 1.33469924e-002, + 3.45128179e-002, 3.02302502e-002, -3.23486105e-002, + -2.54728599e-003, 2.14022756e-001, 2.31885448e-001, + 1.54229671e-001, -1.04133114e-001, 2.73041099e-001, + 3.96115601e-001, 8.89610033e-003, 5.71912108e-003, + 4.30686884e-002, 4.91254851e-002, -8.06216049e-005, + -4.49635845e-004, 4.39526793e-003, 3.91912088e-003, + -4.70918277e-003, 1.38344374e-002, 3.61316353e-002, + 4.24920395e-002, 1.47048049e-002, 2.19751634e-002, + 3.91494669e-002, 4.87100296e-002, 6.01112552e-004, + -4.72195650e-004, 5.15036797e-003, 5.33796474e-003, + 1.37680222e-003, 1.10616162e-003, 5.20052528e-003, + 5.30487159e-003, 1.41104385e-002, 3.70438471e-002, + 3.36884037e-002, 5.66899963e-002, 6.97378349e-003, + 3.73664014e-002, 3.19883563e-002, 5.77618629e-002, + 4.84314398e-004, 2.36032112e-003, 4.13807621e-003, + 6.42038416e-003, 5.23791946e-002, 1.47465467e-002, + 6.38903379e-002, 3.53736877e-002, 1.20182596e-001, + 1.99094325e-001, 2.20249802e-001, 2.64560252e-001, + -9.58455913e-003, 1.37647629e-001, 1.51822150e-001, + 2.17833549e-001, -2.16035545e-002, 1.47271166e-002, + 3.27121839e-002, 3.15667018e-002, 5.54000102e-002, + -1.88007299e-002, 6.74560666e-002, 3.73070389e-002, + -1.91078405e-003, -3.35321814e-001, 2.86631852e-001, + 3.75499606e-001, 1.33016929e-001, -2.42126465e-001, + 2.46761724e-001, 2.94863492e-001, -2.41457447e-002, + -1.27851749e-002, 3.75227779e-002, 3.10493559e-002, + 9.28804395e-004, -1.65637024e-003, 5.39178867e-003, + 4.78188647e-003, 1.04976323e-004, -2.44162176e-002, + 3.47964205e-002, 4.37843725e-002, 2.40434781e-002, + -3.48202325e-002, 4.10634428e-002, 5.26041761e-002, + 1.21385441e-003, -3.87992640e-003, 5.22370776e-003, + 6.61025243e-003, -3.70401947e-004, 1.52464432e-003, + 3.34715843e-003, 6.84986170e-003, -6.65065745e-005, + 1.80765353e-002, 1.76666528e-002, 5.65608330e-002, + -8.38330889e-004, 1.74706578e-002, 1.78968441e-002, + 5.66304810e-002, -3.87149950e-004, 1.20122801e-003, + 3.14781745e-003, 6.48948830e-003, 1.30051374e-002, + 1.89371016e-002, 2.85970904e-002, 6.26740605e-002, + 2.51143388e-002, 1.52231261e-001, 1.15233883e-001, + 5.67627192e-001, -5.62570430e-002, 1.35334209e-001, + 1.42666012e-001, 5.83254218e-001, -2.47970484e-002, + 9.82452370e-003, 3.92094180e-002, 6.24788143e-002, + 1.37677658e-002, -1.69326318e-003, 2.85686329e-002, + 2.50548497e-002, 1.08213099e-002, -2.88059935e-002, + 1.11038357e-001, 1.41683549e-001, -7.78764263e-002, + -3.97381932e-002, 1.58096388e-001, 1.61449209e-001, + -2.66763251e-002, -6.30402239e-003, 4.27860096e-002, + 2.93461978e-002, 6.99893921e-004, -1.23499543e-003, + 3.65411164e-003, 4.36573988e-003, -2.66477873e-005, + -1.54749071e-002, 2.01678891e-002, 3.47049162e-002, + -1.15397563e-002, -1.71859898e-002, 2.48308424e-002, + 3.64503749e-002, -2.10819114e-003, -5.35008730e-004, + 5.36014652e-003, 4.30902326e-003, -2.74277409e-003, + 1.08955905e-003, 8.03830754e-003, 3.31800780e-003, + -4.58923392e-002, -1.89108104e-002, 7.64036030e-002, + 3.48437466e-002, 7.43011013e-003, -1.65824667e-002, + 2.98996754e-002, 3.34651209e-002, 1.57458431e-004, + -4.55168949e-004, 3.73991788e-003, 3.85755394e-003, + -2.95322686e-002, -2.31468678e-003, 6.07944503e-002, + 1.94854010e-002, -3.21806312e-001, 1.98847502e-002, + 5.33819020e-001, 1.73681140e-001, 5.72664104e-002, + 3.20060328e-002, 1.54639810e-001, 1.57837659e-001, + 8.45384412e-003, 1.06075007e-004, 2.65813656e-002, + 2.50525232e-002, -3.79981361e-002, -7.36629311e-003, + 6.42939210e-002, 2.47323941e-002, -2.83599675e-001, + 2.47543765e-004, 4.08480078e-001, 2.19947949e-001, + 3.06573715e-002, -3.08870692e-002, 1.32238224e-001, + 2.05227792e-001, 1.03618391e-002, -2.76188296e-003, + 2.68374663e-002, 2.94455625e-002, -3.87750147e-003, + -4.27651103e-004, 7.94667285e-003, 4.36626375e-003, + -2.96430308e-002, 3.68025191e-002, 5.29608913e-002, + 6.13942742e-002, -3.61237046e-003, 3.80289815e-002, + 2.82509290e-002, 6.27428517e-002, -9.02639440e-005, + 2.57383264e-003, 4.14165342e-003, 6.76513137e-003, + -3.41219176e-003, 2.05946824e-004, 7.72836525e-003, + 4.28085215e-003, -2.17016991e-002, -3.80780213e-002, + 5.28462343e-002, 5.59466295e-002, -3.63916568e-002, + -4.50059697e-002, 5.20534515e-002, 5.99261746e-002, + -5.21701528e-004, -3.22830677e-003, 4.47474374e-003, + 5.85464807e-003, -5.48149645e-002, -1.37693062e-003, + 7.39732087e-002, 2.40775701e-002, -3.07783812e-001, + -2.11163387e-001, 3.91726851e-001, 2.61332899e-001, + -1.00725271e-001, -1.51284575e-001, 1.92123458e-001, + 2.03195527e-001, 1.40019907e-002, -9.02412925e-003, + 2.57640500e-002, 2.26185266e-002, -5.75711466e-002, + -1.76899356e-003, 7.82598108e-002, 2.20349040e-002, + -3.60545784e-001, 4.15453687e-002, 4.18028146e-001, + 1.42748430e-001, -5.31399390e-003, 6.43926039e-002, + 1.31017059e-001, 1.30755186e-001, 1.17937727e-002, + 8.35587829e-003, 2.44494043e-002, 2.04920433e-002, + -6.47854852e-003, -1.84040854e-003, 1.00298179e-002, + 4.21752734e-003, -4.13328409e-002, 1.52920289e-002, + 5.69869354e-002, 3.21877003e-002, -2.88933539e-003, + 1.55650824e-002, 2.67238840e-002, 2.87398025e-002, + 6.56597986e-005, 3.91842361e-004, 3.31543246e-003, + 3.45755485e-003, 3.06791672e-003, -6.24236825e-004, + 5.74120134e-003, 3.56121804e-003, 1.50307342e-002, + 1.38628958e-002, 2.82610413e-002, 2.36662254e-002, + -2.45962199e-003, 1.25058498e-002, 2.07038298e-002, + 2.24627368e-002, -2.85505294e-003, -5.12391271e-004, + 4.94227326e-003, 3.87609261e-003, 4.08195518e-002, + -9.80988424e-003, 5.33841066e-002, 2.95618940e-002, + 1.41797662e-001, 2.07527112e-002, 1.94433361e-001, + 1.19586468e-001, -8.58261883e-002, -1.28589803e-002, + 1.53331667e-001, 1.30182669e-001, -4.75986004e-002, + -3.41626778e-002, 5.67238554e-002, 4.73676138e-002, + 3.97600941e-002, -1.19482139e-002, 5.51989041e-002, + 3.26227508e-002, 1.76917538e-001, -1.14693202e-001, + 2.55759418e-001, 1.89051285e-001, -3.77938032e-001, + -3.37045580e-001, 4.09167230e-001, 3.68912190e-001, + -2.57755313e-002, -4.49117199e-002, 5.03511056e-002, + 5.84483407e-002, 1.98717485e-003, -1.61486480e-003, + 6.25056541e-003, 4.98232665e-003, 5.86288865e-004, + -5.51928617e-002, 4.83641364e-002, 6.34929314e-002, + -4.74447012e-002, -3.75959948e-002, 6.06290437e-002, + 5.57196252e-002, 1.55492721e-003, 8.89796473e-004, + 4.78098309e-003, 4.57485113e-003, 2.32570851e-003, + -4.61000454e-005, 5.33271721e-003, 3.50850448e-003, + 4.88811173e-003, 6.74983673e-003, 2.05036309e-002, + 1.79786254e-002, -2.35402789e-002, 8.20016582e-003, + 3.69760804e-002, 2.05052476e-002, -1.11714629e-002, + -2.09381105e-003, 1.70895122e-002, 5.55117009e-003, + 3.55839282e-002, -1.62688699e-002, 5.16472049e-002, + 3.51973958e-002, 4.62788455e-002, 2.86854128e-003, + 1.27446324e-001, 9.87818986e-002, -1.65281788e-001, + 1.02066835e-002, 2.36638039e-001, 9.76615697e-002, + -1.17021002e-001, -6.40790444e-003, 1.52675554e-001, + 3.62193547e-002, 3.37887928e-002, -6.64581060e-002, + 6.30477965e-002, 7.90274069e-002, 2.48829052e-001, + -3.66321445e-001, 3.04878056e-001, 4.06875074e-001, + -1.39927432e-001, -1.19348444e-001, 2.61016369e-001, + 1.96960986e-001, -1.16238281e-001, 2.13985739e-004, + 1.49088681e-001, 3.65309455e-002, -2.06618034e-003, + -1.78462046e-003, 7.03047495e-003, 8.73623602e-003, + 3.69863249e-002, -7.26447701e-002, 5.99827208e-002, + 9.97110158e-002, 1.65194776e-002, -9.33406204e-002, + 6.03881702e-002, 1.07704751e-001, -7.51533173e-003, + -3.42265330e-003, 1.29981749e-002, 9.10419319e-003, + -1.80508872e-003, 2.12717947e-004, 4.70349658e-003, + 4.25139675e-003, -1.38466023e-002, -1.22785475e-002, + 3.08468733e-002, 4.18176986e-002, 1.95937022e-003, + -1.41376313e-002, 2.44666170e-002, 4.34284396e-002, + 2.05769640e-004, -1.55254296e-004, 3.82689992e-003, + 4.62718401e-003, -6.24190271e-003, 1.33972345e-002, + 3.95702235e-002, 3.44763212e-002, -1.56583622e-001, + 1.88542932e-001, 2.44617164e-001, 3.55492949e-001, + 4.03271504e-002, 1.66625351e-001, 1.55895501e-001, + 3.32995355e-001, 2.05395790e-003, 1.63328573e-002, + 3.48845981e-002, 3.86462249e-002, -6.38879929e-003, + -7.70076364e-003, 4.18864898e-002, 3.31981666e-002, + -1.64861485e-001, -1.40449539e-001, 2.58063078e-001, + 3.67556006e-001, 6.05277531e-002, -1.15619034e-001, + 1.70414984e-001, 3.43002141e-001, -2.26436663e-004, + -8.43981933e-003, 3.72785591e-002, 3.84266078e-002, + -1.59260537e-003, -6.40274724e-004, 4.80833044e-003, + 4.60673077e-003, -1.45996725e-002, 9.17916466e-003, + 3.28245051e-002, 4.49648686e-002, 2.00779038e-003, + 9.16458108e-003, 2.52255462e-002, 4.40596677e-002, + 1.79938448e-004, -8.80469997e-006, 4.19697911e-003, + 4.67996206e-003, 3.82736442e-003, -1.47625646e-002, + 6.15786528e-003, 2.87267603e-002, 3.20863053e-002, + -1.75742760e-001, 5.46934567e-002, 2.55141199e-001, + -1.45298941e-002, -1.79312140e-001, 4.94085513e-002, + 2.56484002e-001, -9.64415725e-004, -1.01419725e-002, + 7.65354279e-003, 2.51454897e-002, 3.80204222e-003, + -4.41900222e-003, 1.66263636e-002, 2.16370504e-002, + 2.96718650e-003, -2.02334486e-002, 9.00744498e-002, + 1.67315602e-001, 1.96137801e-001, 1.01551991e-002, + 2.61346638e-001, 2.53470033e-001, 4.46058251e-002, + 3.72872048e-004, 8.32137391e-002, 5.76087013e-002, + 7.48848263e-003, 1.21367595e-003, 1.97274294e-002, + 1.92875955e-002, 8.05120096e-002, 9.78798941e-002, + 1.34171054e-001, 1.72494054e-001, 1.64211005e-001, + 2.10006863e-001, 2.50987917e-001, 3.34447294e-001, + 4.83485386e-002, 2.67696269e-002, 8.11100006e-002, + 7.48602003e-002, 7.05685979e-003, 1.51296956e-002, + 8.77191778e-003, 2.01675426e-002, 3.66060399e-002, + 1.79609865e-001, 7.07273036e-002, 2.27580771e-001, + 5.63408853e-003, 1.19803786e-001, 8.34077895e-002, + 1.65095791e-001, -3.83524527e-003, 3.64747993e-003, + 1.27672656e-002, 1.41506819e-002, -9.08240792e-004, + 8.55964376e-004, 7.63409957e-003, 6.91754464e-003, + 3.89121734e-002, 5.90996593e-002, 5.83460070e-002, + 8.21392983e-002, 7.66094134e-004, 5.59316836e-002, + 3.67648937e-002, 7.82606155e-002, -6.81548379e-003, + 1.47348634e-004, 9.65367071e-003, 7.87802786e-003, + 5.38743362e-002, 2.69446597e-002, 8.16549435e-002, + 4.18973900e-002, 1.95151150e-001, 1.74369559e-001, + 2.57831395e-001, 2.13222459e-001, -2.29261369e-001, + -1.90966837e-002, 2.91934729e-001, 1.49338380e-001, + -6.53886795e-002, -2.32485719e-002, 8.35308209e-002, + 3.73969525e-002, 6.89538047e-002, 1.73443798e-002, + 8.53613988e-002, 2.96787657e-002, 7.10650012e-002, + 1.43032477e-004, 1.49820998e-001, 7.83228800e-002, + -4.26771998e-001, -9.48134065e-002, 4.61324453e-001, + 1.42411768e-001, -2.34566219e-002, -7.50664389e-003, + 5.52680381e-002, 2.49793343e-002, 6.33119559e-003, + 9.81841702e-004, 9.01949219e-003, 3.23741930e-003, + 2.05036066e-003, -9.99634806e-003, 2.59505864e-002, + 1.77629013e-002, -6.84816465e-002, -1.90864410e-002, + 7.71601051e-002, 2.92942394e-002, -5.22628892e-004, + 1.13108603e-003, 6.81534875e-003, 3.70208151e-003, + 1.62208604e-003, 1.16287998e-003, 6.02226378e-003, + 4.77323122e-003, -8.61352775e-003, 3.21521424e-002, + 3.88680138e-002, 4.59227227e-002, -2.64585428e-002, + 2.77195517e-002, 4.46678586e-002, 4.72423173e-002, + -1.23506505e-003, 2.60845845e-004, 5.09942882e-003, + 4.94038360e-003, 3.65488045e-002, -1.50532171e-003, + 5.44468984e-002, 2.95599923e-002, 1.36571778e-002, + 7.06909597e-002, 2.35949054e-001, 1.83431238e-001, + -1.72302216e-001, 1.61880925e-001, 2.96505839e-001, + 2.63676643e-001, -3.89818847e-002, 1.30138258e-002, + 5.24068475e-002, 3.77169214e-002, 3.84665541e-002, + -8.70760530e-003, 5.75954765e-002, 2.92047057e-002, + -3.79103050e-002, -1.39585793e-001, 3.12056482e-001, + 2.16379195e-001, -1.58542603e-001, -2.98350126e-001, + 3.02868098e-001, 3.51077199e-001, -3.36919688e-002, + -2.14860104e-002, 4.88510467e-002, 3.97981852e-002, + 1.92001334e-003, -1.60568266e-003, 6.50510378e-003, + 4.93893214e-003, -1.91012584e-002, -3.33800614e-002, + 5.01080453e-002, 4.83681709e-002, -2.17047017e-002, + -1.88618619e-002, 4.01641168e-002, 4.12308797e-002, + -7.52015476e-005, -2.28680598e-004, 4.32163570e-003, + 4.35865903e-003, 2.70490479e-002, -6.84825704e-004, + 3.43067050e-002, 6.17356366e-003, 2.39735134e-002, + 2.27893274e-002, 4.21003662e-002, 3.11050676e-002, + -9.66988504e-003, 1.03852572e-002, 2.88341567e-002, + 2.25668754e-002, -7.61128124e-003, -2.56301532e-003, + 1.00554246e-002, 6.16265368e-003, 2.50551522e-001, + 2.68245279e-003, 2.91790307e-001, 3.62576060e-002, + 1.14721224e-001, 5.16858697e-003, 2.07068607e-001, + 9.26084071e-002, -1.47486687e-001, 2.43814401e-002, + 2.30100513e-001, 1.20975390e-001, -8.39462802e-002, + -1.49480198e-002, 1.17761582e-001, 5.79998344e-002, + 2.15490162e-001, 1.45044457e-003, 2.54375815e-001, + 5.29582873e-002, 1.25617504e-001, -1.51660472e-001, + 2.43653700e-001, 2.25837618e-001, -1.23329937e-001, + -2.05825970e-001, 1.99427903e-001, 2.92766958e-001, + -9.02467221e-002, -2.81001697e-003, 1.10291027e-001, + 6.96278661e-002, 1.48751903e-002, -3.79739387e-004, + 2.19930466e-002, 9.06850956e-003, -6.24362566e-003, + -7.02111199e-002, 5.97794354e-002, 9.92358923e-002, + -9.06269625e-003, -6.96127862e-002, 5.14767580e-002, + 1.15182832e-001, -2.38024490e-003, -1.97118358e-003, + 9.73811187e-003, 9.38718487e-003, 1.17059308e-003, + 2.05368524e-005, 3.94058926e-003, 4.11478197e-003, + -1.21010132e-002, -1.78996138e-002, 3.03023569e-002, + 3.99378203e-002, -9.05270223e-003, -3.60604040e-002, + 3.19008604e-002, 5.10208085e-002, 1.85278492e-004, + -2.39122077e-003, 4.08741459e-003, 6.24525594e-003, + -1.35850739e-002, -3.95950973e-002, 3.09544206e-002, + 5.37258163e-002, -9.28112119e-002, -2.36258626e-001, + 2.06774756e-001, 3.57305378e-001, 9.06552747e-002, + 2.68377122e-002, 1.87125638e-001, 3.51409703e-001, + 1.34615460e-002, 7.77042750e-003, 2.71302219e-002, + 5.48958220e-002, -1.20140063e-002, 2.21604668e-002, + 2.90827639e-002, 4.90229167e-002, 1.88260823e-002, + 2.27099672e-001, 1.63243756e-001, 3.59339952e-001, + 6.84766620e-002, 7.20704719e-002, 1.51662365e-001, + 4.14011836e-001, 1.05738100e-002, 2.59768305e-004, + 2.36111321e-002, 6.20392635e-002, 1.34602957e-003, + 2.72351643e-003, 3.87334614e-003, 5.61112864e-003, + 2.50762422e-003, 2.45754030e-002, 2.49570794e-002, + 4.29275446e-002, -8.11550359e-004, 2.86219213e-002, + 2.07919199e-002, 4.53207903e-002, -6.36888319e-004, + 2.97988043e-003, 3.08256946e-003, 5.85132698e-003, + 1.10182846e-002, -2.79207923e-003, 1.96487363e-002, + 6.21868996e-003, 1.25084445e-002, 4.61043557e-003, + 2.71300655e-002, 1.57057568e-002, -6.32894412e-003, + 2.65450240e-003, 1.97184607e-002, 1.57960616e-002, + -1.44749442e-002, -4.69847675e-003, 2.14987192e-002, + 8.17656424e-003, 1.47206277e-001, -1.22231748e-002, + 2.51753181e-001, 4.20641005e-002, 5.26786223e-002, + 7.07090273e-003, 1.92369491e-001, 9.22124982e-002, + -2.58383658e-002, -1.76173681e-003, 1.50639549e-001, + 9.36209485e-002, -1.38693482e-001, -7.27060996e-003, + 2.09240690e-001, 3.58006097e-002, 1.54830366e-001, + -6.99616503e-003, 2.47881278e-001, 4.26463336e-002, + 7.52865821e-002, -1.05373777e-001, 1.85593292e-001, + 2.15765759e-001, -1.21312708e-001, -1.51962832e-001, + 2.29232714e-001, 2.59889036e-001, -1.35756359e-001, + -3.33890840e-002, 2.05378175e-001, 5.56154884e-002, + 7.87807070e-003, -1.46997301e-002, 1.83449443e-002, + 2.45136060e-002, 8.24750587e-003, -1.93263665e-001, + 3.84137034e-002, 2.77849585e-001, -2.58357134e-002, + -1.82060033e-001, 4.69984263e-002, 2.69569874e-001, + -1.98798883e-003, -1.09475553e-002, 1.33612463e-002, + 2.12974362e-002, -1.03651386e-004, 3.42746149e-003, + 3.87865538e-003, 5.18378895e-003, -2.70733647e-002, + 4.38179336e-002, 4.17963080e-002, 5.23216762e-002, + -3.93696167e-002, 2.27921307e-002, 5.00496626e-002, + 4.38828431e-002, 9.72006295e-004, -9.05438792e-004, + 4.21113614e-003, 4.63688653e-003, 1.53591372e-002, + 1.69566472e-003, 2.47943643e-002, 2.26543434e-002, + -1.51467184e-002, 9.82322693e-002, 1.41803861e-001, + 1.67497352e-001, -2.57571965e-001, 3.66989821e-001, + 2.87033588e-001, 3.91064197e-001, -3.10255755e-002, + 5.54798022e-002, 4.40977179e-002, 6.44582957e-002, + 1.46722347e-002, -2.72763669e-002, 2.58744787e-002, + 3.70310768e-002, 4.03834619e-002, -2.55324185e-001, + 1.19679973e-001, 2.84334034e-001, -5.26406355e-002, + -2.56601214e-001, 1.37626931e-001, 3.10623854e-001, + -3.79404612e-002, -1.60005912e-002, 4.49377075e-002, + 4.84186485e-002, -1.18090957e-003, -3.24822217e-003, + 3.78579879e-003, 6.98036747e-003, -7.38616986e-003, + -3.94425318e-002, 2.59774439e-002, 5.87496236e-002, + -9.75577277e-004, -4.13582996e-002, 2.45748889e-002, + 5.96196502e-002, -9.79117103e-005, -3.49405175e-003, + 3.77443037e-003, 6.88561331e-003, 9.70340217e-004, + 6.68021676e-004, 4.10342962e-003, 3.57557298e-003, + 1.17320390e-002, 2.27749050e-002, 2.91489828e-002, + 3.68467420e-002, -6.21194392e-003, 2.32785959e-002, + 2.49584429e-002, 3.76470201e-002, -1.93215208e-004, + 1.13768328e-003, 3.46699846e-003, 4.09401115e-003, + 2.49638073e-002, 8.39341898e-003, 4.06371020e-002, + 2.82993671e-002, 1.15032107e-001, 1.21473789e-001, + 2.58370131e-001, 2.36102149e-001, -9.12555233e-002, + 9.18864980e-002, 1.73926979e-001, 2.25072071e-001, + -1.52149918e-002, 1.35464640e-002, 2.90765706e-002, + 3.05304416e-002, 2.61468235e-002, -4.29180590e-003, + 4.37493287e-002, 3.42919789e-002, 2.11766198e-001, + -1.79170985e-002, 2.87803710e-001, 4.04025048e-001, + -8.32301378e-002, 9.83695388e-002, 1.81242645e-001, + 4.87117946e-001, -2.71322727e-002, 7.62897264e-003, + 3.81772034e-002, 4.42665406e-002, 9.01051855e-004, + -1.87269936e-004, 4.08086227e-003, 4.29510744e-003, + 1.76048744e-002, -2.84400024e-002, 3.52592133e-002, + 4.84885089e-002, -1.36308477e-003, -3.67296450e-002, + 2.68296730e-002, 5.63360602e-002, -2.24978532e-004, + -1.76622241e-003, 4.00562398e-003, 6.20573992e-003, + 2.39285757e-003, 6.89114095e-004, 8.92397948e-003, + 7.39591941e-003, 1.79410409e-002, 5.55616617e-002, + 4.47599553e-002, 8.60066116e-002, 6.86877454e-003, + 7.19159395e-002, 3.61338742e-002, 9.40202475e-002, + -1.51869422e-003, 5.51153067e-003, 6.63688639e-003, + 1.01911733e-002, 8.41937214e-002, 1.44711919e-002, + 1.08053610e-001, 4.19539437e-002, 1.91650987e-001, + 2.36072943e-001, 2.68174529e-001, 2.92722672e-001, + -4.06847037e-002, 1.49789780e-001, 1.53167129e-001, + 2.29088798e-001, -5.34304976e-002, 9.04857181e-003, + 6.52994439e-002, 4.30457592e-002, 9.65435877e-002, + -1.20250462e-003, 1.16165280e-001, 3.44101973e-002, + 1.06911682e-001, -1.47572771e-001, 2.44407699e-001, + 2.11413816e-001, -1.28516227e-001, -3.01024050e-001, + 2.04677716e-001, 3.50684822e-001, -4.03924845e-002, + -3.18475328e-002, 6.20971508e-002, 5.63536063e-002, + 6.57607894e-003, -2.47886666e-004, 1.07915634e-002, + 6.16172981e-003, -9.62983817e-003, -4.51312587e-002, + 5.08295670e-002, 6.72423914e-002, -1.78609006e-002, + -2.59389449e-002, 4.59052064e-002, 6.37313947e-002, + 1.17163104e-003, -6.98963559e-005, 6.55550743e-003, + 7.25533813e-003, -1.06967040e-004, 8.26718227e-004, + 5.13120787e-003, 4.77318978e-003, -3.24981399e-002, + -3.22498716e-002, 4.95307706e-002, 5.13757542e-002, + -2.23821364e-002, -4.17967774e-002, 5.08044027e-002, + 5.67234382e-002, 8.31860816e-004, -1.81219040e-003, + 5.58810495e-003, 5.61108859e-003, -3.30744311e-002, + -2.65054647e-002, 4.99097407e-002, 4.44244742e-002, + -2.99735099e-001, -2.03918770e-001, 3.61009419e-001, + 3.40502053e-001, -5.05651236e-002, -9.96610075e-002, + 2.60790199e-001, 2.28453413e-001, 3.18538025e-002, + -3.96433845e-003, 4.47580032e-002, 3.37284841e-002, + -5.13346046e-002, -1.32723944e-002, 6.10941015e-002, + 4.68703099e-002, -1.10169575e-001, 3.08302771e-002, + 2.17644438e-001, 2.58864075e-001, 5.19696362e-002, + 2.15851933e-001, 2.13513181e-001, 2.75007874e-001, + 2.31907889e-002, 2.32532211e-002, 4.23328765e-002, + 4.01153602e-002, -2.67685251e-003, 1.16107194e-003, + 6.34597382e-003, 6.14679419e-003, -2.20540538e-003, + 3.53972092e-002, 3.58454548e-002, 4.98482250e-002, + 1.02983657e-002, 2.60643363e-002, 3.81390229e-002, + 4.59006689e-002, -1.23990793e-003, 5.13078528e-004, + 5.60203427e-003, 5.41330129e-003, -1.35241495e-002, + 2.13620238e-004, 2.06730999e-002, 6.48547243e-003, + -1.53612858e-002, -2.81669777e-002, 4.07239795e-002, + 5.20357341e-002, -8.98674503e-003, -2.23584082e-002, + 2.93790437e-002, 4.77689356e-002, 5.27967240e-005, + -1.70024310e-003, 3.78364418e-003, 5.40492963e-003, + -1.69750825e-001, 2.08226661e-003, 2.12656796e-001, + 3.43257263e-002, -1.33057415e-001, -1.66287974e-001, + 2.41251528e-001, 2.13063374e-001, -1.00080390e-002, + -1.65259555e-001, 1.32692054e-001, 1.96903184e-001, + 1.06437225e-002, -1.85134541e-002, 2.39597410e-002, + 2.88606752e-002, -1.77872658e-001, 7.44023826e-003, + 2.21580759e-001, 4.03177142e-002, -1.41448498e-001, + 3.13311934e-001, 2.97782660e-001, 3.71222377e-001, + -9.54941884e-002, 1.14280388e-001, 1.75231472e-001, + 1.97041512e-001, 1.52777201e-002, 2.08700192e-003, + 2.56989729e-002, 2.23504156e-002, -9.00160521e-003, + 1.35847344e-003, 1.98977720e-002, 6.39222562e-003, + -2.63894815e-002, 5.41677698e-002, 6.89711198e-002, + 7.54081458e-002, -4.95041311e-002, 6.15689084e-002, + 6.23987801e-002, 7.55310804e-002, -7.16296199e-004, + 3.89817660e-003, 4.89080697e-003, 6.47186860e-003, + 3.98698685e-005, -1.05521793e-003, 5.84879005e-003, + 3.28823947e-003, 5.36942631e-002, 2.52552461e-002, + 7.20391870e-002, 3.52777839e-002, 5.53023210e-003, + 1.74229890e-002, 3.08262277e-002, 2.63905637e-002, + -5.22155175e-003, -8.74981284e-004, 7.24770036e-003, + 4.14265692e-003, 2.25798618e-002, 9.19882022e-003, + 5.04839495e-002, 2.36541964e-002, 3.52479488e-001, + 1.21663958e-001, 4.84843552e-001, 1.72135711e-001, + -6.64514005e-002, 3.49435373e-003, 1.73392177e-001, + 1.09648280e-001, -5.74043766e-002, -2.14436315e-002, + 6.67066425e-002, 3.45392004e-002, 5.44992723e-002, + 2.36885119e-002, 6.88984990e-002, 3.34420912e-002, + 1.87246099e-001, 5.06492779e-002, 3.03388536e-001, + 1.40016392e-001, -2.59850770e-001, -1.53221160e-001, + 3.20479810e-001, 1.97534308e-001, -3.13718170e-002, + -2.39731520e-002, 5.16943745e-002, 3.61901112e-002, + 7.49462657e-003, 1.99104263e-003, 9.48054157e-003, + 4.33178525e-003, 3.21810832e-003, -1.77167896e-002, + 3.63582931e-002, 2.83572897e-002, -5.60720824e-002, + -2.89188717e-002, 6.49824217e-002, 3.93444635e-002, + 7.95509142e-004, 3.30914831e-004, 5.06167579e-003, + 3.55706015e-003, 1.85941812e-003, 8.69608833e-004, + 4.84401686e-003, 4.04066639e-003, -4.82021458e-002, + -4.38980870e-002, 6.12520054e-002, 5.73581420e-002, + 8.18254519e-003, -5.17133772e-002, 4.67864089e-002, + 6.34094775e-002, -5.99110826e-005, -1.26955518e-003, + 5.42875659e-003, 5.25524188e-003, -2.42859237e-002, + -5.56003861e-002, 5.18759973e-002, 6.46374896e-002, + -3.87063414e-001, -3.39285523e-001, 4.31698173e-001, + 3.86092544e-001, 1.66836083e-001, -1.80991992e-001, + 2.27329150e-001, 2.47178346e-001, 2.28840504e-002, + -3.62328961e-002, 4.22494113e-002, 4.65700589e-002, + -4.43630219e-002, -3.61148529e-002, 5.61251342e-002, + 5.23855537e-002, -5.79676032e-002, 1.82311924e-003, + 1.40561298e-001, 1.33089915e-001, 5.98192215e-002, + 2.79435124e-002, 1.16890974e-001, 1.12097286e-001, + 2.23740060e-002, -7.06675369e-003, 3.22793797e-002, + 2.69947760e-002, -1.82836573e-003, 3.21400468e-004, + 4.69138799e-003, 4.31861356e-003, -2.00031954e-003, + 1.24630947e-002, 2.08763704e-002, 2.37789042e-002, + 5.76614030e-003, 1.22851040e-002, 2.01909114e-002, + 2.29146220e-002, 1.25764275e-003, 4.92458872e-004, + 3.71642527e-003, 3.50781740e-003, 1.20348495e-003, + 1.72416074e-003, 4.10596840e-003, 4.18272009e-003, + 8.26224778e-003, 3.34666260e-002, 3.52320857e-002, + 4.77686524e-002, 2.35431399e-002, 4.19716947e-002, + 4.29758616e-002, 5.64190075e-002, 2.45268364e-003, + 4.70324466e-003, 5.92461601e-003, 7.31546711e-003, + 4.45825569e-002, 1.21625410e-002, 5.50570562e-002, + 3.17408666e-002, 1.22561246e-001, 3.00992042e-001, + 3.33865166e-001, 3.56897324e-001, 1.31786346e-001, + 2.62969017e-001, 2.45355755e-001, 3.00048888e-001, + -1.15499673e-002, 1.80970505e-002, 2.96120960e-002, + 2.96610333e-002, 3.87850367e-002, -4.31514066e-003, + 5.26699461e-002, 2.79314406e-002, 2.68324345e-001, + -8.45376179e-002, 3.35654169e-001, 1.95814922e-001, + 3.12873721e-003, -4.28246185e-002, 1.22002549e-001, + 1.18627504e-001, -1.17365699e-002, -2.49678409e-003, + 2.36644950e-002, 1.78527720e-002, 2.37836037e-003, + 1.28441071e-003, 5.57986321e-003, 4.00313456e-003, + 3.70390266e-002, -1.83547586e-002, 4.95511517e-002, + 3.52726094e-002, 7.28771277e-003, -1.76381916e-002, + 2.69160066e-002, 2.94426363e-002, 1.77758979e-004, + -7.49962579e-004, 3.03392578e-003, 3.09457071e-003, + -1.19149801e-003, -1.08149182e-003, 4.39706119e-003, + 3.69879347e-003, 3.64244846e-003, -1.96105037e-002, + 2.57881284e-002, 2.96051465e-002, 1.44342724e-002, + -2.39679627e-002, 4.46302965e-002, 3.75758708e-002, + 2.49624755e-002, 2.37988378e-003, 2.84343120e-002, + 6.75866148e-003, -1.56284384e-002, -3.55908880e-003, + 3.20439562e-002, 2.03037541e-002, -1.02747139e-002, + -4.79186922e-002, 1.34019956e-001, 1.07858457e-001, + 9.44288075e-002, -3.63510400e-002, 3.05357516e-001, + 1.63497373e-001, 2.47091368e-001, 2.27037109e-002, + 2.65645623e-001, 4.47422378e-002, -1.55569008e-002, + 8.85960064e-004, 3.19817178e-002, 2.03545690e-002, + -1.67914778e-002, 8.68693087e-003, 1.38204277e-001, + 1.27875894e-001, 3.09672058e-001, 1.47580504e-001, + 4.46895063e-001, 2.54223824e-001, 1.92097187e-001, + 2.75932699e-002, 2.16839731e-001, 4.95694913e-002, + -9.88232903e-004, 2.96607357e-003, 4.63947421e-003, + 6.46318309e-003, 1.35022392e-002, 4.57524024e-002, + 3.45665291e-002, 6.27924129e-002, 8.68114680e-002, + 8.04832578e-002, 1.07415333e-001, 9.52414051e-002, + 8.04744475e-003, -5.75166312e-004, 1.52557530e-002, + 7.63598597e-003, 1.90311242e-002, -2.40314077e-003, + 2.56034527e-002, 5.08742174e-003, 3.33953127e-002, + 5.16029075e-003, 4.59046029e-002, 1.84002928e-002, + 6.91922731e-004, 2.88150809e-003, 1.29961511e-002, + 1.07593508e-002, -3.49466893e-004, 2.61488321e-006, + 1.75058388e-003, 1.43331382e-003, 1.60334691e-001, + -6.34170510e-003, 2.00514466e-001, 3.11112795e-002, + 2.31425747e-001, 3.52172856e-003, 3.19053590e-001, + 9.93250981e-002, -5.27968339e-004, 2.09930795e-003, + 8.22112113e-002, 6.81145042e-002, -5.19519113e-003, + -4.74159257e-004, 1.36507638e-002, 1.07876873e-002, + 1.47521466e-001, -5.95817855e-003, 1.82952717e-001, + 3.90304551e-002, 2.32741252e-001, -2.16770694e-001, + 3.35168809e-001, 2.96427101e-001, 3.99672164e-004, + -2.19943225e-001, 1.03204735e-001, 2.78349578e-001, + -5.40162856e-003, -2.82574240e-002, 1.82372164e-002, + 3.80537175e-002, 7.98942614e-003, -7.62632489e-003, + 1.18681518e-002, 1.17544346e-002, 8.63514096e-003, + -1.53867066e-001, 4.35971469e-002, 1.82709262e-001, + 1.08698299e-002, -1.55900583e-001, 3.36352065e-002, + 1.89235881e-001, 2.52159080e-003, -1.79909524e-002, + 5.13185328e-003, 2.42942888e-002, -3.86357633e-003, + -2.73850933e-003, 8.40738695e-003, 8.13048333e-003, + -5.87489689e-004, -4.98416424e-002, 3.80313285e-002, + 7.77640417e-002, -9.18287877e-003, -4.70381938e-002, + 3.35176326e-002, 7.79544190e-002, -4.34074755e-004, + -3.51445586e-003, 5.28656784e-003, 8.38974304e-003, + -7.22312182e-002, 2.13446412e-002, 8.78918841e-002, + 5.16420044e-002, -9.14717019e-002, -1.01260342e-001, + 2.10852563e-001, 2.39998281e-001, -2.58193091e-002, + -1.59349129e-001, 1.44568756e-001, 2.21881643e-001, + 2.15368923e-002, -1.32458406e-002, 3.42412181e-002, + 3.29471342e-002, -4.47856262e-002, 3.53517421e-002, + 7.56701753e-002, 5.50080612e-002, -3.77302855e-001, + 1.89642251e-001, 4.38134164e-001, 3.15078944e-001, + 5.52166551e-002, 1.25871912e-001, 1.67149231e-001, + 2.37094998e-001, 2.09910143e-002, 1.95019562e-002, + 3.55134234e-002, 3.78143340e-002, -7.25829450e-004, + -1.23684446e-003, 8.17917753e-003, 5.82051696e-003, + -5.25934063e-002, 3.40433717e-002, 7.16307387e-002, + 5.70832379e-002, 2.14485032e-003, 2.96874903e-002, + 3.95551883e-002, 5.24301939e-002, -1.32778302e-006, + 9.94460657e-004, 5.07492991e-003, 6.27018884e-003, + -3.23928311e-004, 1.49933272e-003, 6.74494868e-003, + 3.32968868e-003, -6.72481433e-002, -2.50052325e-002, + 7.95577094e-002, 3.87396626e-002, -3.66781629e-003, + -2.33786553e-002, 2.67899148e-002, 3.53628099e-002, + 4.78151545e-004, -1.46027957e-003, 3.55862128e-003, + 4.15524095e-003, -2.56476868e-002, -5.80201810e-003, + 5.69369160e-002, 1.87090710e-002, -4.76102054e-001, + -1.29274681e-001, 5.19352973e-001, 1.66201890e-001, + 2.50380598e-002, -4.75100502e-002, 1.03745520e-001, + 9.97768715e-002, 1.21787591e-002, -5.20892907e-003, + 2.26638373e-002, 1.75256841e-002, -5.70426472e-002, + -1.50220022e-002, 7.90800080e-002, 2.47148462e-002, + -3.45961243e-001, -1.38807315e-002, 3.98294896e-001, + 1.14090107e-001, 3.13989148e-002, 3.09592374e-002, + 9.67002735e-002, 8.23300183e-002, 1.06661506e-002, + 2.87019694e-003, 2.10336745e-002, 1.49638858e-002, + -8.95086769e-003, -2.67435261e-003, 1.19088925e-002, + 4.40928247e-003, -3.19541208e-002, 1.05092973e-002, + 4.68084812e-002, 2.56876126e-002, 3.04058054e-003, + 1.38933808e-002, 1.94687359e-002, 2.46347077e-002, + 3.76121461e-004, 8.52892175e-004, 2.90752365e-003, + 3.19174374e-003, -1.74157950e-003, 1.64007500e-003, + 7.24167190e-003, 3.96097684e-003, -3.20685096e-002, + -1.45699894e-002, 5.32972887e-002, 2.91964598e-002, + -1.15637865e-003, -1.07215988e-002, 2.11115684e-002, + 2.45072674e-002, 7.31576991e-004, -3.65216634e-004, + 3.43297073e-003, 3.10700596e-003, -3.03997062e-002, + -3.78691056e-003, 5.89896888e-002, 2.73270514e-002, + -2.58094132e-001, -4.21430059e-002, 3.54403883e-001, + 1.49993807e-001, 2.55393647e-002, -3.06155551e-002, + 1.02922983e-001, 1.21110864e-001, 1.29136136e-002, + 1.20980018e-004, 2.42782179e-002, 2.08029076e-002, + -4.06285003e-002, 5.40943816e-003, 6.80232644e-002, + 4.76889834e-002, -2.63116241e-001, 1.66703194e-001, + 3.47084403e-001, 5.30446410e-001, 3.10972258e-002, + -2.61637819e-004, 1.51869357e-001, 2.56316096e-001, + 1.77619644e-002, 5.56571649e-005, 2.90770344e-002, + 2.90308557e-002, -1.43988605e-003, -8.67041468e-004, + 6.98374351e-003, 5.53098414e-003, -3.48292179e-002, + 9.22923256e-003, 5.58213033e-002, 6.74077943e-002, + -3.11009306e-002, 3.54543440e-002, 5.26124351e-002, + 5.78895733e-002, 1.22508034e-003, 1.45630341e-003, + 4.19611065e-003, 4.44500148e-003, 7.90028658e-004, + -4.80999530e-004, 5.71519975e-003, 2.30272324e-003, + 1.69104885e-003, 4.29736637e-003, 5.07244319e-002, + 2.16224492e-002, 7.24891480e-003, 4.40300442e-003, + 5.46884909e-002, 2.42669284e-002, -2.98203994e-003, + -2.29227124e-004, 6.98046107e-003, 3.33554135e-003, + 9.58750024e-003, -8.05163931e-004, 4.34402749e-002, + 1.29191540e-002, -1.83201432e-002, 1.86561067e-002, + 4.12497044e-001, 1.13015942e-001, 7.86208287e-002, + 9.46782064e-003, 4.61269885e-001, 1.21605575e-001, + -2.62066610e-002, -3.03415977e-003, 5.62672503e-002, + 1.89947542e-002, 1.03797000e-002, 1.70705968e-003, + 4.48550470e-002, 1.36639467e-002, -3.30627640e-003, + -8.51789955e-003, 4.35526192e-001, 1.13804020e-001, + 3.35606001e-002, -2.38368008e-002, 4.57458317e-001, + 1.34065419e-001, -2.14574430e-002, -1.18186011e-003, + 5.23424074e-002, 1.75685529e-002, 6.78375131e-004, + 2.53583479e-004, 6.07082993e-003, 2.44880933e-003, + 4.66674613e-003, -5.58829634e-003, 5.43123558e-002, + 2.44626831e-002, -4.35855798e-003, -7.17898039e-003, + 5.49796820e-002, 2.64951084e-002, -1.71965128e-003, + -2.20981718e-004, 6.22865139e-003, 2.76658847e-003, + 9.02252330e-004, -9.02517757e-004, 4.21836600e-003, + 3.39861657e-003, 3.12446686e-003, 5.17200259e-003, + 2.37624217e-002, 2.25288719e-002, -1.24041922e-002, + 7.04277819e-003, 2.83728708e-002, 2.31743120e-002, + -1.58788711e-002, -1.08444085e-003, 2.66969595e-002, + 4.74068150e-003, 1.61481258e-002, -4.20043431e-003, + 3.88615616e-002, 2.58607548e-002, 2.58022863e-002, + -4.28768583e-002, 1.37508139e-001, 1.36825740e-001, + -7.89732486e-002, -2.62764543e-002, 1.96789473e-001, + 1.45689398e-001, -1.44741416e-001, -1.28571410e-002, + 2.36176372e-001, 3.46129946e-002, 2.16463096e-002, + -1.60517674e-002, 4.76604402e-002, 5.80994934e-002, + 7.57112447e-003, -5.73348925e-002, 1.71171606e-001, + 2.85092682e-001, -1.02245219e-001, -1.18261985e-001, + 2.34709978e-001, 2.76372910e-001, -1.40970200e-001, + -1.19846556e-002, 2.30256215e-001, 5.01368903e-002, + 1.41083333e-003, -3.12350038e-002, 6.33377675e-003, + 4.18054424e-002, 3.09599284e-003, -2.46471822e-001, + 3.45784612e-002, 3.17137003e-001, -1.25991646e-002, + -2.36383244e-001, 4.38380204e-002, 3.02401066e-001, + -5.05522592e-003, -1.93533711e-002, 1.76845212e-002, + 2.66413838e-002, -1.00809382e-003, -4.95219720e-004, + 5.90430060e-003, 5.05420845e-003, 6.89927314e-004, + -3.08543444e-002, 3.79687846e-002, 4.46711592e-002, + 3.70318517e-002, -2.91046686e-002, 4.92666140e-002, + 4.32745814e-002, 1.88998575e-003, 6.69714762e-004, + 4.55419486e-003, 3.40860221e-003, -2.21881848e-002, + 3.66380648e-003, 4.65914644e-002, 3.43693979e-002, + -8.00025761e-002, 2.12891977e-002, 2.28287101e-001, + 2.12390780e-001, 2.81302691e-001, -8.63127187e-002, + 3.52442682e-001, 1.97802052e-001, 3.51786911e-002, + -4.40564146e-003, 4.73026522e-002, 2.36157756e-002, + -2.27466226e-002, -2.51641800e-003, 4.82367314e-002, + 3.84670235e-002, -1.00387573e-001, -5.32503240e-002, + 2.47183830e-001, 2.68763334e-001, 3.26810628e-001, + 9.68248472e-002, 3.87035996e-001, 2.40516707e-001, + 3.20061259e-002, 6.53688051e-003, 4.49231043e-002, + 2.47845817e-002, -8.06183962e-004, 1.36633185e-004, + 6.05399860e-003, 5.68357389e-003, 5.61926281e-003, + 3.80941182e-002, 4.11810391e-002, 5.35609759e-002, + 3.90191451e-002, 3.33131924e-002, 5.12483604e-002, + 4.76814024e-002, 1.16959179e-003, -5.87249815e-004, + 4.05293889e-003, 3.37092672e-003, 8.49662349e-003, + -3.05353664e-004, 1.19083980e-002, 5.94876427e-003, + 1.26975402e-002, 1.24475705e-002, 2.65752748e-002, + 2.55493708e-002, -4.30618459e-003, 8.85988493e-003, + 1.76795255e-002, 2.19207015e-002, -9.84183745e-004, + 1.68230501e-004, 3.66705609e-003, 3.06794699e-003, + 1.03565156e-001, -2.84971539e-002, 1.22936711e-001, + 5.51312417e-002, 9.86948833e-002, -1.18892659e-002, + 1.75863817e-001, 1.31010458e-001, -4.37558703e-002, + 3.87892220e-003, 1.02972172e-001, 1.02222525e-001, + -1.06558772e-002, 6.95119437e-004, 2.83989627e-002, + 1.93237774e-002, 1.05732255e-001, -5.34436665e-002, + 1.32150501e-001, 7.96161890e-002, 2.55580544e-001, + -2.44477093e-001, 3.25885385e-001, 3.37170571e-001, + -3.10328938e-002, -1.22067146e-001, 1.22326352e-001, + 2.20863819e-001, -2.12104507e-002, -2.46767029e-002, + 3.98123413e-002, 4.03812453e-002, 2.74505606e-003, + -1.04620103e-002, 8.48148763e-003, 2.05154531e-002, + 3.10126878e-002, -2.07978517e-001, 5.02654053e-002, + 2.82056272e-001, 1.01783937e-002, -2.26702958e-001, + 3.85931320e-002, 3.02737713e-001, 9.47979279e-004, + -2.41731331e-002, 7.13347085e-003, 3.49345244e-002, + -1.93630622e-005, 1.84503139e-003, 4.89430828e-003, + 3.89772258e-003, 5.92932152e-003, 2.59679332e-002, + 3.30115259e-002, 3.68545055e-002, -2.14470476e-002, + 3.87482755e-002, 6.66400492e-002, 5.26542366e-002, + -1.84487924e-002, -4.91144194e-004, 2.43405551e-002, + 5.75977471e-003, 1.87686160e-002, 1.94139441e-003, + 3.28042582e-002, 1.47143323e-002, 4.83184792e-002, + 4.08203751e-002, 1.38996109e-001, 1.01905480e-001, + 1.12733981e-002, 8.42738003e-002, 4.82205331e-001, + 1.71598405e-001, -2.05836445e-001, -9.41928665e-005, + 2.29555205e-001, 3.08672283e-002, 2.29558554e-002, + -2.64015724e-003, 3.72008383e-002, 1.61690284e-002, + 5.88465817e-002, -9.55595821e-003, 1.50403216e-001, + 1.01045892e-001, -1.06644921e-001, -1.54723510e-001, + 4.45733964e-001, 2.27773011e-001, -1.83696941e-001, + -3.80635960e-003, 2.05120742e-001, 3.88505347e-002, + 1.59599714e-003, -1.80544914e-003, 5.61793847e-003, + 4.37735580e-003, 3.44996504e-003, -3.19538452e-002, + 3.41449529e-002, 4.26940955e-002, -4.46109660e-002, + -5.21579199e-002, 8.86287317e-002, 6.48798347e-002, + -1.34079494e-002, -1.39535300e-003, 2.01129653e-002, + 8.01844057e-003, 2.80911685e-004, -1.73327862e-003, + 4.00827220e-003, 5.38913859e-003, 1.05805974e-002, + -3.52309160e-002, 2.97360215e-002, 5.30115366e-002, + 2.60529798e-002, -3.42200659e-002, 4.43336666e-002, + 5.73338866e-002, 3.49682197e-003, 9.50391754e-004, + 6.85214577e-003, 6.92250393e-003, -1.48448413e-002, + 5.48382197e-003, 2.94914208e-002, 2.93442141e-002, + 4.96152453e-002, 6.23829961e-002, 1.59839049e-001, + 2.11490780e-001, 2.45481551e-001, 8.59075338e-002, + 2.95003384e-001, 2.70723194e-001, 4.35767993e-002, + -5.45060029e-004, 5.87911569e-002, 4.41728272e-002, + -9.05477069e-003, 3.31023671e-002, 3.19191106e-002, + 4.83586676e-002, 6.66936859e-002, 2.79790640e-001, + 1.89648405e-001, 3.78308177e-001, 1.08947054e-001, + 1.76506460e-001, 2.08529934e-001, 3.89438629e-001, + 3.97680067e-002, 5.43950917e-003, 5.23699634e-002, + 5.16126566e-002, 3.00604454e-003, 4.61148843e-003, + 5.08555770e-003, 8.04807432e-003, 1.26966778e-002, + 4.69653830e-002, 3.05841658e-002, 6.67111576e-002, + 1.98901212e-003, 4.80992757e-002, 2.35337224e-002, + 6.61806092e-002, 1.24361439e-004, 3.40004964e-003, + 3.73138371e-003, 6.48838608e-003, -1.37527403e-003, + 1.92892947e-003, 8.01235158e-003, 7.86328129e-003, + 6.53081015e-002, 4.60427329e-002, 8.07231963e-002, + 7.35031962e-002, 2.97494177e-002, 3.92606258e-002, + 4.68786545e-002, 4.83056195e-002, -6.82232901e-003, + -1.06348644e-003, 1.11599388e-002, 6.06541429e-003, + 6.73312917e-002, 4.95019667e-002, 8.97477120e-002, + 8.46346766e-002, 1.61065161e-001, 2.57616818e-001, + 2.61434019e-001, 3.48728955e-001, -2.28945492e-003, + 2.84578446e-002, 1.32455781e-001, 1.06937796e-001, + -8.88093784e-002, -8.35900754e-003, 1.58670262e-001, + 2.71390658e-002, 5.84643632e-002, 1.17686866e-002, + 7.60028288e-002, 5.67667037e-002, 2.11994946e-002, + -8.76122490e-002, 1.22656174e-001, 1.87910870e-001, + -4.92638536e-002, -1.13077439e-001, 1.36658385e-001, + 1.92519382e-001, -1.08850814e-001, -3.02967466e-002, + 1.99721113e-001, 4.22114804e-002, 1.51572807e-003, + -2.40699295e-002, 4.84113907e-003, 4.10504416e-002, + 8.91006552e-004, -1.85930341e-001, 2.56168153e-002, + 3.12425733e-001, -7.66061665e-003, -1.73747793e-001, + 3.05944327e-002, 3.00116390e-001, -2.34762952e-003, + -1.20582655e-002, 1.55597394e-002, 2.50423327e-002, + 4.64053452e-003, 1.31815327e-002, 1.03905369e-002, + 1.98753886e-002, -2.85925902e-003, 1.78936675e-001, + 3.58177237e-002, 2.34596774e-001, -6.85126986e-004, + 1.77347541e-001, 2.82906666e-002, 2.40168005e-001, + 8.79249827e-004, 1.98684540e-002, 4.89538629e-003, + 2.98192706e-002, 1.19437180e-001, 1.23620015e-002, + 1.59890369e-001, 5.71271740e-002, 1.32662177e-001, + 2.01849014e-001, 2.53784329e-001, 3.57390255e-001, + -4.12550848e-003, 2.45275170e-001, 1.27774477e-001, + 3.61175448e-001, -1.35213882e-002, 4.08731066e-002, + 2.83008441e-002, 5.73501475e-002, 1.21517859e-001, + 1.60262305e-002, 1.63952798e-001, 4.54361774e-002, + 1.11065961e-001, -1.91418000e-003, 2.22473413e-001, + 1.57723308e-001, 1.11467959e-002, -1.87419169e-002, + 1.10898845e-001, 1.13510773e-001, -9.16777737e-003, + 2.41897185e-004, 2.16876604e-002, 1.80089585e-002, + 1.19621977e-002, 5.39656263e-004, 1.89288948e-002, + 6.74266228e-003, 1.52879469e-002, -1.80801842e-002, + 3.63262631e-002, 3.63762230e-002, 2.64065480e-003, + -1.52125303e-002, 2.05336530e-002, 3.02215423e-002, + -2.58399901e-004, -1.07357290e-003, 2.97610089e-003, + 3.52839613e-003, 1.67528924e-004, 3.27421911e-002, + 5.43456152e-003, 4.38110642e-002, -2.12557823e-003, + 2.54531264e-001, 2.70993188e-002, 3.31151992e-001, + -1.59709565e-002, 2.28082031e-001, 4.16778363e-002, + 3.07192862e-001, -3.94404400e-003, 1.93778165e-002, + 1.45082371e-002, 2.90858168e-002, 1.79418139e-002, + 2.81029437e-002, 4.20243479e-002, 4.60997596e-002, + 9.45981010e-005, 1.65993407e-001, 1.13546304e-001, + 2.69119233e-001, -1.46283776e-001, 2.24312827e-001, + 2.22039789e-001, 3.28966886e-001, -1.30636141e-001, + 2.89324448e-002, 2.12701291e-001, 6.49622902e-002, + 1.32539282e-002, 2.52275588e-003, 3.66358869e-002, + 1.77772660e-002, -6.22248789e-003, -6.71970053e-003, + 8.78235102e-002, 8.92970040e-002, -8.30244124e-002, + 2.58063991e-003, 1.60625920e-001, 1.10069282e-001, + -1.32420897e-001, 9.57973953e-003, 2.17087999e-001, + 3.57983969e-002, 5.97037666e-004, -9.98505056e-005, + 3.93639319e-003, 2.48794560e-003, -1.29124662e-003, + -2.93553458e-003, 1.42219122e-002, 1.36956833e-002, + -1.09455204e-002, -1.34272594e-003, 2.48647016e-002, + 1.64720640e-002, -1.53922634e-002, 1.93777203e-003, + 2.56655458e-002, 5.58676571e-003, 3.34015279e-003, + 6.54860772e-003, 6.58317655e-003, 1.36035830e-002, + 8.84217862e-003, 1.07475363e-001, 3.02014276e-002, + 1.51424900e-001, 2.09895591e-003, 9.79838595e-002, + 2.80720666e-002, 1.36248216e-001, 9.04590008e-004, + 7.44963996e-003, 5.80043206e-003, 1.39671164e-002, + 5.05666025e-002, -2.99624372e-002, 7.37488791e-002, + 5.77796772e-002, 2.37446830e-001, -1.25191629e-001, + 2.81919241e-001, 3.35360438e-001, -6.91805556e-002, + 7.76329413e-002, 1.50753543e-001, 1.63696691e-001, + -1.73796453e-002, 1.92317739e-002, 4.36294600e-002, + 4.85046506e-002, 3.16376239e-002, 9.39523056e-003, + 5.99465519e-002, 4.78008986e-002, 3.79478782e-001, + 8.83251056e-002, 4.19786721e-001, 3.16705465e-001, + -4.12204415e-002, 1.27333170e-003, 1.28486276e-001, + 9.64839235e-002, -2.79018749e-002, -1.11262994e-002, + 3.96513529e-002, 4.16703969e-002, 4.26674169e-003, + -7.29740656e-004, 8.34741909e-003, 5.18484600e-003, + 4.54053022e-002, -3.54805067e-002, 5.53547665e-002, + 5.14346994e-002, -9.86745581e-004, -1.92293432e-002, + 2.74057314e-002, 3.21857333e-002, -1.86607649e-003, + 4.83852258e-004, 5.40560111e-003, 3.98136815e-003, + -3.92367551e-003, -2.83178082e-003, 8.61285720e-003, + 6.70304801e-003, 4.31893888e-004, -3.12998965e-002, + 2.73820348e-002, 6.01236410e-002, -1.64162228e-003, + -3.52502614e-002, 3.48863751e-002, 6.56682923e-002, + 8.21573939e-003, -5.36556065e-004, 1.53148817e-002, + 6.31580129e-003, -5.69205098e-002, -9.56528541e-003, + 7.24000484e-002, 2.87410952e-002, -4.67739776e-002, + -1.51513398e-001, 1.14133060e-001, 2.06995502e-001, + 1.66307949e-002, -1.55291677e-001, 1.32269338e-001, + 2.09946752e-001, 1.30890340e-001, 1.90299063e-003, + 1.73274070e-001, 2.96688378e-002, -4.89410348e-002, + 3.25130373e-002, 6.51761293e-002, 4.85050902e-002, + -4.94197570e-002, 3.51085663e-001, 1.12871088e-001, + 4.14378762e-001, -6.17187237e-003, 3.28477353e-001, + 1.40179306e-001, 3.76278162e-001, 1.28038615e-001, + 7.89327174e-003, 1.70920596e-001, 3.48118320e-002, + 3.68560955e-004, -4.52603679e-004, 6.51012361e-003, + 8.13806243e-003, -2.94386875e-003, 2.83130339e-005, + 2.93854456e-002, 5.96994646e-002, -1.13331676e-002, + 3.61359701e-003, 3.30235772e-002, 5.72394207e-002, + 4.73040016e-003, -1.23292184e-003, 1.13868788e-002, + 7.24533200e-003, -1.67968939e-003, -4.13166155e-004, + 7.22032553e-003, 5.06170746e-003, 2.27298457e-002, + -3.03943399e-002, 4.43106927e-002, 4.57297452e-002, + 3.41034867e-002, -3.31700109e-002, 4.94486317e-002, + 5.31987362e-002, 2.95169535e-003, -4.17179224e-004, + 6.57134922e-003, 5.73574333e-003, -4.63713855e-002, + -2.94212485e-003, 6.76225871e-002, 3.06728166e-002, + 1.29077241e-001, -9.41477939e-002, 2.59669214e-001, + 1.73286468e-001, 2.10942000e-001, -1.35504737e-001, + 2.90184826e-001, 2.38101676e-001, 5.56428283e-002, + -1.21572753e-002, 6.96907490e-002, 4.00109217e-002, + -4.38148119e-002, 1.52237415e-002, 6.56550899e-002, + 4.71683666e-002, -8.85919854e-003, 9.33935717e-002, + 2.22988218e-001, 3.09971601e-001, 1.90344289e-001, + -3.63429263e-002, 2.73177117e-001, 3.95235986e-001, + 6.54967949e-002, -9.70427133e-003, 7.72961974e-002, + 5.87210916e-002, 2.08443758e-004, 3.13077099e-003, + 6.43938966e-003, 8.09351634e-003, 1.42409594e-003, + 7.00284764e-002, 4.44484241e-002, 9.26235169e-002, + 1.75023638e-002, 7.85790533e-002, 4.36227582e-002, + 1.02633432e-001, 2.06024852e-003, 4.34791343e-003, + 6.75012683e-003, 9.68222041e-003, -4.21689451e-003, + 8.14601517e-005, 9.51836072e-003, 4.77901706e-003, + -2.07972601e-002, -3.18394452e-002, 4.74201068e-002, + 5.08564375e-002, 2.13155355e-002, -3.70146595e-002, + 5.02051637e-002, 6.54489845e-002, 5.74798603e-003, + 2.96185073e-003, 1.68956406e-002, 9.38475598e-003, + -5.23452535e-002, -1.57598557e-003, 7.84670413e-002, + 2.72139572e-002, -2.52419949e-001, -1.12847969e-001, + 3.26467603e-001, 1.91814139e-001, 7.38653317e-002, + -1.64136410e-001, 2.30852738e-001, 2.40789086e-001, + 1.54696643e-001, -9.49823018e-003, 2.18371123e-001, + 4.56861295e-002, -5.53572662e-002, -3.00934468e-003, + 8.30358639e-002, 2.48194262e-002, -2.40097120e-001, + 6.29165322e-002, 3.32527548e-001, 1.57206148e-001, + 7.60490000e-002, 1.41736805e-001, 2.13315055e-001, + 2.11264268e-001, 1.39914721e-001, -1.18910382e-002, + 2.02473328e-001, 4.24516611e-002, -5.85166272e-003, + -9.17680445e-004, 1.08797764e-002, 4.35456540e-003, + -1.07469959e-002, 2.94085070e-002, 4.89977188e-002, + 4.33452241e-002, 7.90528394e-003, 3.04816756e-002, + 4.12009656e-002, 4.73061427e-002, 8.21258966e-003, + 1.31089109e-004, 1.77604053e-002, 6.09890791e-003, + 4.40929987e-004, 8.63185152e-004, 4.32868255e-003, + 3.59673519e-003, 6.47289259e-003, 2.04943214e-002, + 3.45489308e-002, 3.44533585e-002, -5.85731026e-003, + 1.78374946e-002, 4.20204997e-002, 3.29517461e-002, + -1.64285884e-003, -2.97739927e-004, 4.90933657e-003, + 3.42626637e-003, 2.70892847e-002, 6.71734940e-003, + 4.33158837e-002, 2.86409464e-002, 2.87829433e-002, + 9.96745974e-002, 2.68039733e-001, 2.08969474e-001, + -8.02270100e-002, 1.04598656e-001, 3.82447988e-001, + 1.95902407e-001, -2.93220319e-002, 3.94464983e-003, + 4.89282981e-002, 2.49203816e-002, 2.19267346e-002, + -1.87307745e-002, 3.86776589e-002, 3.23566496e-002, + 1.11303162e-002, -2.77801841e-001, 2.32485488e-001, + 3.12873900e-001, 8.96740481e-002, -8.41004401e-002, + 4.72381771e-001, 1.85945883e-001, -3.84881049e-002, + 9.70959489e-004, 5.54731637e-002, 2.42060311e-002, + -1.39552314e-004, -6.85706967e-004, 3.69664817e-003, + 3.38616106e-003, 8.64653569e-003, -8.30835290e-003, + 2.85062939e-002, 2.59687342e-002, 2.05748174e-002, + -2.26104800e-002, 5.69485277e-002, 3.54308486e-002, + -3.26153799e-003, -4.26382059e-004, 6.17297553e-003, + 3.51630221e-003, -2.66103772e-003, -2.73447856e-003, + 8.44519865e-003, 7.77669437e-003, 2.56656781e-002, + -9.58578214e-002, 6.18887581e-002, 1.10472813e-001, + 6.12745248e-002, -8.45582187e-002, 8.01504329e-002, + 1.10613957e-001, -2.00882088e-003, 5.57318097e-004, + 7.99408741e-003, 7.66139477e-003, -4.93056104e-002, + -8.46735667e-003, 7.01025724e-002, 3.37550528e-002, + -9.76232961e-002, -4.64017317e-002, 2.28782073e-001, + 1.89945564e-001, 2.91581929e-001, -3.29016238e-001, + 3.83022696e-001, 4.17531282e-001, 8.15534219e-002, + -6.28207177e-002, 1.11728013e-001, 7.99218714e-002, + -4.75611463e-002, -9.69609059e-003, 6.73274770e-002, + 2.97328029e-002, -7.03858137e-002, -1.59801468e-002, + 1.83945298e-001, 1.29438758e-001, 1.78236980e-002, + -2.26621944e-002, 1.79665372e-001, 1.36847496e-001, + 9.03438181e-002, -3.35118435e-002, 1.10390738e-001, + 5.10399938e-002, -4.10820264e-003, -2.98971543e-004, + 7.84748234e-003, 4.14658571e-003, -9.97419003e-003, + 1.13066817e-002, 2.77292766e-002, 2.50284132e-002, + 8.93906632e-004, 1.14214281e-002, 2.47567203e-002, + 2.47559734e-002, 7.02301040e-003, -4.26557061e-004, + 1.07785240e-002, 4.83565265e-003, 8.07376346e-004, + -1.28706262e-004, 2.72284169e-003, 2.23531737e-003, + -7.39711220e-004, 2.02148710e-003, 1.28067341e-002, + 1.24500906e-002, -1.66548155e-002, 4.29033581e-003, + 2.97614262e-002, 1.70716289e-002, -2.28544101e-002, + -2.10601254e-003, 3.63247767e-002, 5.66788530e-003, + 9.80014540e-003, 5.43274859e-004, 2.41594594e-002, + 1.47911794e-002, 4.22519166e-004, 6.75543910e-003, + 7.71960020e-002, 8.08040649e-002, -1.09644517e-001, + 8.69427901e-003, 1.96708247e-001, 9.86399874e-002, + -1.86484277e-001, -4.89060581e-003, 2.87452281e-001, + 2.74215229e-002, 1.22703072e-002, -3.14368382e-002, + 2.92209908e-002, 4.52133715e-002, -1.54442638e-002, + -2.20148504e-001, 1.02646276e-001, 2.90767848e-001, + -1.34273693e-001, -2.64837623e-001, 2.34487623e-001, + 3.28854084e-001, -1.67840287e-001, -1.21563040e-002, + 2.64842927e-001, 4.59406450e-002, 1.19692704e-004, + -2.59645693e-002, 5.15031395e-003, 3.48444544e-002, + -2.83613522e-003, -1.93632752e-001, 2.58913320e-002, + 2.50933588e-001, -5.93553437e-003, -1.75830483e-001, + 3.71600315e-002, 2.26495385e-001, -6.74186414e-003, + -1.36888912e-002, 1.72063559e-002, 1.97356809e-002, + -1.00606913e-002, 1.47593697e-003, 1.41065298e-002, + 3.79524427e-003, -1.06660295e-002, -5.94102638e-003, + 3.27260941e-002, 1.97261348e-002, 9.54669341e-003, + -5.11965202e-003, 3.25875133e-002, 1.92207415e-002, + 1.95254702e-002, 2.65741558e-003, 2.57893801e-002, + 5.36316214e-003, -8.72490928e-002, 8.97634309e-003, + 1.09697692e-001, 2.70425994e-002, -1.01479873e-001, + 6.32993353e-004, 2.03746185e-001, 1.05412938e-001, + 1.09129392e-001, 1.41416164e-002, 2.26249352e-001, + 1.05069391e-001, 1.73130661e-001, 1.69854984e-002, + 2.20244527e-001, 3.31395678e-002, -7.26372823e-002, + 2.53679249e-002, 9.79285017e-002, 3.85388955e-002, + -1.44449458e-001, 2.59159476e-001, 2.45576486e-001, + 3.08315903e-001, 1.71967775e-001, 2.58980542e-001, + 2.74206191e-001, 3.09301674e-001, 1.40433967e-001, + 1.26541313e-002, 1.89406186e-001, 4.13673259e-002, + -1.73848367e-003, 1.79615000e-003, 9.24829114e-003, + 6.15360821e-003, -1.37112280e-002, 4.91004772e-002, + 4.35283817e-002, 7.45901167e-002, 1.49363996e-002, + 4.40160073e-002, 4.67681848e-002, 7.68262595e-002, + 5.65097947e-003, -1.50164019e-003, 1.46066351e-002, + 7.17638340e-003, -2.58789794e-003, 4.97759902e-005, + 1.03954198e-002, 6.35587890e-003, -3.29220737e-003, + -7.85741359e-002, 6.69632256e-002, 1.01915762e-001, + 9.83012840e-004, -9.02397782e-002, 4.59129997e-002, + 1.20324314e-001, -1.18839927e-003, -7.98943546e-003, + 6.52735308e-003, 1.38541292e-002, -1.21964693e-001, + -1.91310961e-002, 1.50258482e-001, 4.09639217e-002, + -8.62667784e-002, -2.59082735e-001, 4.26688522e-001, + 3.33745748e-001, 3.23320292e-002, -1.73413783e-001, + 1.72175303e-001, 3.15947086e-001, 1.59674957e-002, + -2.90793963e-002, 3.26542631e-002, 5.04920818e-002, + -1.64151981e-001, -2.32534334e-002, 1.83525324e-001, + 3.80881019e-002, -6.05667755e-003, -3.06502115e-002, + 2.95429349e-001, 1.48555651e-001, 4.40459251e-002, + -7.45010227e-002, 1.39359951e-001, 1.62214309e-001, + 1.40695982e-002, -6.44925516e-003, 2.70182248e-002, + 2.60434020e-002, -1.75874904e-002, -2.10459391e-003, + 2.06520874e-002, 5.55473054e-003, -4.60935244e-003, + 1.21763637e-002, 3.12872529e-002, 2.89448537e-002, + 8.74072686e-003, 1.01558324e-002, 2.17585918e-002, + 2.76143309e-002, 1.26826693e-003, 4.03747836e-004, + 3.52936680e-003, 3.98725690e-003, -1.40487647e-003, + -4.70062601e-004, 7.09893228e-003, 4.83637024e-003, + 7.07132090e-003, -2.14580819e-002, 6.44712299e-002, + 3.91413420e-002, -2.01233160e-002, -2.53715962e-002, + 6.22829571e-002, 3.81993018e-002, 1.24279466e-002, + 1.60242047e-003, 1.54813603e-002, 4.75471932e-003, + -3.60027105e-002, -1.27295097e-002, 5.71787022e-002, + 3.04605253e-002, 7.41299093e-002, -1.43613935e-001, + 3.78137767e-001, 2.09294632e-001, -3.05251721e-002, + -4.34724800e-002, 4.12132442e-001, 1.57798439e-001, + 1.13735132e-001, 1.53466212e-002, 1.33593336e-001, + 3.11819185e-002, -3.45930867e-002, 7.80994596e-004, + 5.17473035e-002, 2.51920931e-002, -2.20567938e-002, + 3.65156084e-002, 2.34460250e-001, 1.49632514e-001, + 2.38319546e-001, 8.16858709e-002, 4.15595740e-001, + 1.76217228e-001, 7.09212944e-002, 8.30716360e-003, + 9.95021760e-002, 3.13518122e-002, -2.56474363e-003, + 3.89747409e-004, 6.81069912e-003, 4.49976651e-003, + -6.32025208e-003, 1.86515376e-002, 3.92984636e-002, + 3.25152501e-002, 4.55881245e-002, 2.04939116e-002, + 6.84917271e-002, 3.88184972e-002, 2.85918801e-003, + -2.36043753e-003, 9.37944558e-003, 5.53436810e-003, + -3.55755292e-005, 5.10710012e-003, 5.08267386e-003, + 9.32455808e-003, -5.05786529e-003, 6.15353212e-002, + 3.08603905e-002, 8.28966573e-002, -1.65740482e-003, + 5.11609167e-002, 3.34313139e-002, 7.39110559e-002, + -1.72284420e-003, 3.98638705e-003, 5.29703870e-003, + 7.95115810e-003, 3.21455263e-002, 6.80003921e-003, + 4.87990491e-002, 3.88132371e-002, -2.02715248e-001, + 6.50348887e-002, 3.39801699e-001, 2.56454825e-001, + 1.34349853e-001, 9.63571817e-002, 3.47312629e-001, + 2.60587484e-001, -5.96851371e-002, 1.18733232e-003, + 7.63539225e-002, 4.51321788e-002, 2.23090239e-002, + -1.34472158e-002, 4.25291918e-002, 3.64798121e-002, + 3.42806019e-002, 8.40516575e-003, 2.71845102e-001, + 2.70094395e-001, -4.13391329e-002, 8.06378275e-002, + 3.18724513e-001, 2.91111082e-001, -5.29102162e-002, + -4.55141766e-003, 7.52643570e-002, 3.91082540e-002, + 6.11050520e-004, 7.69450620e-004, 4.78606531e-003, + 5.93720935e-003, 8.00174195e-003, -2.83922851e-002, + 3.88161875e-002, 5.37482239e-002, -8.62447266e-003, + -3.83470058e-002, 4.28222269e-002, 5.76414242e-002, + -2.93091754e-003, 6.99161319e-004, 7.90051185e-003, + 6.44339062e-003, -3.18439677e-003, 8.43126327e-004, + 6.35919813e-003, 5.50763076e-003, -9.02521610e-003, + -1.93983726e-002, 3.05954162e-002, 3.67300026e-002, + 6.10128324e-003, -1.43011063e-002, 2.78378911e-002, + 3.06066573e-002, 2.56129354e-003, -2.04709635e-004, + 5.81366662e-003, 4.50799009e-003, -4.21293937e-002, + 1.85967349e-002, 5.96162379e-002, 4.40169647e-002, + -1.51291117e-001, 7.60666803e-002, 2.46913582e-001, + 2.08652258e-001, 5.02438508e-002, -1.81954112e-002, + 1.60742506e-001, 1.51795745e-001, 4.22467589e-002, + 1.22240428e-002, 5.40582500e-002, 3.60864215e-002, + -4.75319922e-002, 4.91343951e-003, 6.43219501e-002, + 5.25610521e-002, -1.52119994e-001, 6.56209812e-002, + 2.87779927e-001, 4.15883988e-001, 1.98886722e-001, + 2.83940136e-001, 2.69149989e-001, 3.77630889e-001, + 3.65253501e-002, 4.06953953e-002, 5.33575229e-002, + 5.42236045e-002, -5.45071962e-004, 2.14188709e-003, + 6.37035817e-003, 6.48479909e-003, 1.18714571e-003, + 6.53429776e-002, 4.01938632e-002, 7.90698975e-002, + 1.29537014e-002, 4.25115004e-002, 3.76559757e-002, + 6.08736984e-002, -1.19177159e-003, 1.08459397e-004, + 4.81045293e-003, 5.14263660e-003, -1.10354871e-002, + -9.84412269e-004, 1.57803576e-002, 6.45604730e-003, + -1.01217600e-002, -3.51575874e-002, 3.45370546e-002, + 5.00263236e-002, 1.06274849e-002, -2.78948862e-002, + 4.50723805e-002, 4.11879197e-002, 1.70449950e-002, + 2.86078453e-003, 3.05599142e-002, 6.74868328e-003, + -1.28471062e-001, 8.06444511e-003, 1.56233832e-001, + 3.74094769e-002, -1.10230640e-001, -7.49247223e-002, + 2.10462496e-001, 1.50505155e-001, 1.57189399e-001, + -6.42924458e-002, 2.99584806e-001, 1.28127933e-001, + 1.62739262e-001, -4.19129990e-003, 2.59014964e-001, + 3.27983312e-002, -1.37722522e-001, -8.35986109e-004, + 1.59479171e-001, 3.46532054e-002, -1.14119403e-001, + 5.35783209e-002, 2.16460004e-001, 1.71086788e-001, + 1.73671201e-001, 7.52907246e-002, 2.96701431e-001, + 1.75314754e-001, 1.53851792e-001, -7.44988490e-003, + 2.43045896e-001, 4.13947739e-002, -9.45762824e-003, + 2.62156851e-003, 1.43021680e-002, 1.15444371e-002, + 4.11565881e-003, 1.15078159e-001, 3.95081528e-002, + 1.61773831e-001, 3.95926787e-003, 1.05916999e-001, + 5.45068271e-002, 1.57652989e-001, 8.30027368e-003, + -6.58703793e-004, 1.95162445e-002, 1.38711734e-002, + -1.67466947e-004, -2.76064547e-003, 4.97301295e-003, + 6.39693392e-003, -7.37376558e-003, -3.23273726e-002, + 2.99282931e-002, 4.81397398e-002, -3.74012324e-003, + -2.72976737e-002, 2.58423816e-002, 4.07169685e-002, + 2.31679194e-004, -1.89782155e-003, 3.73486406e-003, + 4.50597936e-003, -2.97017191e-002, -6.99469913e-003, + 4.08488698e-002, 4.14547212e-002, -3.52616422e-002, + -1.49125621e-001, 1.30143359e-001, 2.04507619e-001, + 3.61363627e-002, -1.17855482e-001, 1.06558494e-001, + 1.67518213e-001, 1.57507174e-002, -1.12719117e-002, + 2.51267813e-002, 2.68110372e-002, -2.97467206e-002, + 8.03866759e-002, 4.94560562e-002, 8.94883871e-002, + -2.58783340e-001, 4.68461752e-001, 3.03278923e-001, + 5.04119515e-001, -9.01318714e-003, 1.13782525e-001, + 1.42335698e-001, 1.86370999e-001, 1.77042782e-002, + 6.90564513e-003, 2.75041796e-002, 2.70981155e-002, + 2.80046556e-003, -1.18870626e-003, 5.59515785e-003, + 5.28411474e-003, -5.24791330e-002, 2.57633589e-002, + 6.51617646e-002, 5.56475259e-002, -3.58009636e-002, + 5.21230660e-002, 5.16335778e-002, 6.33032992e-002, + 7.93931861e-007, 3.45006655e-003, 4.94950917e-003, + 5.67138661e-003, 1.11275376e-003, 1.10485853e-004, + 8.03402998e-003, 4.29422874e-003, -1.36806667e-002, + 2.78284904e-002, 7.02145398e-002, 4.25841585e-002, + 7.88296387e-003, 2.07339581e-002, 5.33555150e-002, + 3.91722322e-002, -2.93843169e-003, 1.76441704e-003, + 7.57261179e-003, 5.17795188e-003, 3.13079618e-002, + 9.65437200e-003, 6.09871037e-002, 2.77836546e-002, + -6.31582662e-002, 1.02010995e-001, 4.78460073e-001, + 1.88287303e-001, 1.71223566e-001, 2.36993268e-001, + 3.86554241e-001, 2.97252655e-001, -5.94406836e-002, + 8.76009744e-003, 7.55067617e-002, 3.45307626e-002, + 3.82441282e-002, 9.33016371e-003, 5.46697378e-002, + 2.63902768e-002, 5.91133498e-002, -1.73165761e-002, + 2.47937635e-001, 1.68654472e-001, 3.08601791e-003, + -8.97395685e-002, 2.37267867e-001, 2.01918185e-001, + -4.79256958e-002, -6.42168010e-003, 6.41158968e-002, + 3.57386023e-002, 2.63169245e-003, -8.31829326e-004, + 5.91636170e-003, 4.92899725e-003, 2.52606790e-003, + -2.69535985e-002, 3.33897732e-002, 4.20245118e-002, + -4.79709217e-003, -2.18368713e-002, 3.67036462e-002, + 4.47480269e-002, -2.15552538e-003, -3.73141433e-004, + 6.13019988e-003, 5.24189789e-003, 2.35755419e-004, + -1.12131611e-003, 4.90303664e-003, 5.23325009e-003, + -1.99312363e-002, -2.92828158e-002, 3.95784974e-002, + 4.87325452e-002, -2.30289325e-002, -3.90469953e-002, + 4.18192744e-002, 5.29230498e-002, -2.88001349e-004, + -2.90632108e-003, 4.66641551e-003, 5.66992955e-003, + -3.86912636e-002, -3.28221358e-002, 5.13542406e-002, + 5.43496460e-002, -1.41935989e-001, -3.50868165e-001, + 2.23830804e-001, 4.04724538e-001, 1.03419683e-004, + -1.91847876e-001, 1.57640204e-001, 2.51949698e-001, + 1.81328561e-002, -1.42083773e-002, 3.03394850e-002, + 3.21078077e-002, -3.69253270e-002, 3.32710482e-002, + 5.15794381e-002, 5.02343141e-002, -1.99838549e-001, + 2.64261007e-001, 2.65167862e-001, 3.17457765e-001, + 3.54596265e-002, 1.08147509e-001, 1.45420253e-001, + 1.84638947e-001, 1.79306548e-002, 8.52480624e-003, + 2.93126684e-002, 2.88261864e-002, -2.27550438e-004, + -7.22045297e-005, 5.52645419e-003, 5.33826463e-003, + -3.45012024e-002, 2.48074960e-002, 4.96455990e-002, + 4.64658700e-002, -1.12093613e-002, 2.95190699e-002, + 3.43790650e-002, 4.21592928e-002, 2.04200143e-004, + 1.52367877e-003, 4.18015523e-003, 4.57701692e-003, + 4.38495452e-004, -2.86567927e-004, 5.68177085e-003, + 4.44493257e-003, 3.47664356e-002, 1.68550350e-002, + 5.18942773e-002, 3.65178064e-002, -5.56516135e-003, + 2.08427291e-002, 4.46941480e-002, 3.32321823e-002, + -5.19445958e-003, -4.89973288e-004, 8.00019596e-003, + 4.63047018e-003, 3.12016234e-002, 1.15708690e-002, + 5.11614047e-002, 3.51619534e-002, 1.85953259e-001, + 1.61021143e-001, 3.14585119e-001, 2.41949782e-001, + -1.61177278e-001, -2.50306842e-003, 3.19896758e-001, + 1.50576323e-001, -5.01120128e-002, -1.00929653e-002, + 6.63522258e-002, 2.82221697e-002, 2.64293831e-002, + -1.40775526e-002, 5.01673631e-002, 3.21521945e-002, + 1.99655339e-001, -1.43755555e-001, 3.63628924e-001, + 2.12399751e-001, -2.11582318e-001, -4.08238657e-002, + 3.81332308e-001, 1.44136816e-001, -4.26723212e-002, + -1.36248744e-003, 6.20165952e-002, 2.34546270e-002, + 7.71336665e-004, 4.86145873e-004, 6.18654350e-003, + 3.97852529e-003, 3.26697044e-002, -1.97297558e-002, + 5.48824072e-002, 3.55606079e-002, -2.06194818e-002, + -2.10146122e-002, 5.45160770e-002, 3.32980081e-002, + -3.73067567e-003, 4.76565358e-004, 7.35110883e-003, + 3.82991764e-003, 4.12401091e-003, 2.19739657e-002, + 1.06776701e-002, 3.46820503e-002, -1.55384594e-003, + 1.89207584e-001, 3.62258703e-002, 3.00134242e-001, + 2.71800975e-003, 1.85836986e-001, 3.50094773e-002, + 3.00669372e-001, -4.60883556e-003, 1.47602754e-002, + 1.52966306e-002, 3.03351581e-002, 8.38526711e-002, + -1.27242308e-003, 1.35251626e-001, 6.22728765e-002, + 4.60779034e-002, 8.07707459e-002, 2.97255427e-001, + 2.31690690e-001, -4.84810723e-003, 1.07380249e-001, + 2.13377520e-001, 2.31346801e-001, -1.21020459e-001, + 3.73563054e-003, 2.01629236e-001, 5.44286184e-002, + 8.31865966e-002, 2.32443716e-002, 1.27538562e-001, + 5.13542369e-002, 6.26667067e-002, 1.89372469e-002, + 2.36343250e-001, 1.43187866e-001, -1.04482248e-001, + -5.09870313e-002, 2.21680075e-001, 1.44871607e-001, + -1.00097358e-001, -8.74007528e-004, 1.79414645e-001, + 6.06866851e-002, 6.95256516e-003, -1.29868230e-003, + 1.07491054e-002, 8.23279470e-003, 5.71512291e-003, + -1.59751326e-002, 3.04252636e-002, 4.63597476e-002, + -3.53042893e-002, -2.95351297e-002, 5.80053888e-002, + 5.76200895e-002, -3.42385843e-003, 5.31396479e-004, + 1.44946426e-002, 7.92821590e-003, -1.09873514e-003, + 5.97195351e-004, 5.55882603e-003, 4.42652125e-003, + -2.57614255e-002, -1.60067100e-002, 3.87777463e-002, + 3.14219147e-002, 1.47659220e-002, -1.65660251e-002, + 3.36389802e-002, 2.83229966e-002, 4.04711301e-003, + 1.22568384e-003, 7.00493390e-003, 4.38940851e-003, + -2.97235604e-002, -1.29998988e-002, 4.62000072e-002, + 3.23164165e-002, -1.74545318e-001, -1.02250464e-001, + 2.21590012e-001, 1.68145105e-001, 2.04567298e-001, + -1.21544627e-002, 2.43071571e-001, 1.25259459e-001, + 4.61350717e-002, 8.18210840e-003, 5.96726649e-002, + 3.05857155e-002, -3.45850177e-002, 8.08619615e-003, + 4.75152172e-002, 3.58759202e-002, -1.95346847e-002, + 2.50254840e-001, 1.92235604e-001, 2.97345251e-001, + 2.19514325e-001, 3.62594336e-001, 2.59641021e-001, + 3.92644525e-001, 3.87812667e-002, 2.93730721e-002, + 5.42786717e-002, 4.50693108e-002, 5.92695316e-004, + 4.57818341e-003, 6.22288743e-003, 7.73216086e-003, + 3.23909931e-002, 7.50573948e-002, 4.74709012e-002, + 8.57307762e-002, 1.27071822e-002, 6.59062862e-002, + 3.75832506e-002, 7.90285468e-002, -1.44189491e-003, + 3.14844889e-003, 5.19707473e-003, 6.68036612e-003, + -1.57141034e-003, 4.20028623e-003, 8.22775066e-003, + 1.02095604e-002, -1.55187491e-002, -3.13070305e-002, + 4.21758927e-002, 1.23698294e-001, -1.21266358e-002, + -8.84025469e-002, 5.03463075e-002, 1.48028448e-001, + 4.61311638e-003, -6.20809093e-004, 1.22915730e-002, + 9.58980247e-003, -9.39491540e-002, -3.01928781e-002, + 1.15081131e-001, 5.64177223e-002, -1.71791837e-001, + -2.40671918e-001, 2.59548545e-001, 4.14805204e-001, + 1.29000515e-001, -8.98676515e-002, 3.09890151e-001, + 2.26958424e-001, 8.87085125e-002, -4.98942053e-003, + 1.42437577e-001, 2.98285708e-002, -1.02239624e-001, + -8.47627409e-003, 1.19604088e-001, 2.57657338e-002, + -9.98179838e-002, -8.26956797e-003, 1.72935784e-001, + 1.06125116e-001, 1.44359574e-001, -2.26313225e-003, + 3.06711584e-001, 9.69486386e-002, 8.29439759e-002, + -6.23033801e-003, 1.40221044e-001, 2.24852022e-002, + -1.19965319e-002, -1.34888920e-003, 1.46460570e-002, + 3.54949269e-003, -1.26480237e-002, 3.15028336e-003, + 2.72203442e-002, 1.81745142e-002, 2.35456992e-002, + 6.69004442e-003, 4.76993881e-002, 1.97165776e-002, + 7.94531498e-003, -7.66413577e-004, 1.66391693e-002, + 3.53784231e-003, 6.82530878e-003, 1.03434734e-003, + 1.39330309e-002, 5.79186296e-003, -5.54630952e-003, + 4.05632406e-002, 4.07154784e-002, 5.80740944e-002, + -3.02880863e-003, 4.27104831e-002, 2.54242029e-002, + 6.03710897e-002, -1.22413051e-003, 3.42475437e-003, + 4.37929342e-003, 7.12590665e-003, 8.51948187e-002, + -4.31965018e-004, 1.22381017e-001, 2.86346860e-002, + -2.12142784e-002, 3.92712429e-002, 2.56528705e-001, + 1.50100365e-001, -4.58248006e-003, 5.08891754e-002, + 1.32059306e-001, 1.52845010e-001, -2.42711324e-002, + 7.19027128e-003, 3.43283378e-002, 2.79190037e-002, + 7.43860528e-002, -2.57766470e-002, 1.07575856e-001, + 4.52060662e-002, -1.31645752e-002, -3.56982261e-001, + 2.34234229e-001, 3.96898985e-001, -1.50428591e-002, + -3.55777055e-001, 1.37652472e-001, 4.07687962e-001, + -1.78802740e-002, -4.58789654e-002, 3.25259604e-002, + 5.75699173e-002, 1.38864131e-003, -3.80337262e-003, + 6.78821001e-003, 8.18398967e-003, -5.47176134e-003, + -4.44288962e-002, 2.81892642e-002, 7.55864605e-002, + -9.51335067e-004, -3.88935208e-002, 2.04928741e-002, + 7.32018054e-002, 8.99519306e-004, -4.71257837e-003, + 3.71234585e-003, 9.74879600e-003, -1.75506540e-003, + -1.28522282e-003, 4.91556851e-003, 3.52824526e-003, + 7.05349967e-002, 3.29220444e-002, 7.87264705e-002, + 4.38657887e-002, 1.90762896e-002, 2.61330158e-002, + 4.30946350e-002, 3.21095623e-002, -7.00387778e-003, + -1.27705385e-003, 9.53568798e-003, 4.05106088e-003, + 2.73340456e-002, 2.95335352e-002, 4.90822345e-002, + 4.12933007e-002, 4.24751043e-001, 2.86798120e-001, + 4.43411797e-001, 3.02740872e-001, -7.25919604e-002, + 1.78670026e-002, 1.72884822e-001, 9.62215662e-002, + -8.39383155e-002, -2.18592696e-002, 9.67164040e-002, + 3.72344293e-002, 6.52155876e-002, 3.33060957e-002, + 7.25034922e-002, 4.25110124e-002, 1.46655500e-001, + 3.27944607e-002, 1.97993636e-001, 1.15368351e-001, + -2.15420216e-001, -9.73495767e-002, 2.63130128e-001, + 1.40317589e-001, -6.54810965e-002, -1.34103717e-002, + 8.66524279e-002, 3.48677784e-002, 6.00937987e-003, + 1.90679915e-003, 7.66300783e-003, 4.58923494e-003, + 3.60630895e-003, -1.40028466e-002, 2.52983011e-002, + 2.32861321e-002, -4.57913205e-002, -2.64918413e-002, + 5.61321974e-002, 3.44764069e-002, -2.52895360e-003, + 8.90430470e-004, 8.04523565e-003, 3.68688628e-003, + -1.18846598e-003, 7.99353409e-004, 4.83294809e-003, + 4.96930582e-003, 2.00237427e-002, 1.69494040e-002, + 3.86182815e-002, 4.11371104e-002, 2.18218993e-002, + 3.62040810e-002, 5.59835918e-002, 4.95300367e-002, + -4.34442842e-003, 1.10889366e-003, 8.33642483e-003, + 5.14015788e-003, 2.88601462e-002, 3.66192125e-002, + 4.58639599e-002, 5.05718999e-002, 6.42118677e-002, + 3.57253253e-001, 2.54736453e-001, 4.07183141e-001, + 3.98161747e-002, 7.71493465e-002, 3.37335080e-001, + 2.19471738e-001, -6.26375601e-002, 1.09719171e-003, + 7.98693076e-002, 3.29901874e-002, 3.47709209e-002, + -1.28563233e-002, 4.77203578e-002, 3.92255038e-002, + 5.39819971e-002, -1.41661853e-001, 2.20112309e-001, + 2.57159472e-001, -1.03395090e-001, -4.17406037e-002, + 2.67610788e-001, 2.16380492e-001, -5.21981679e-002, + -4.60925017e-004, 7.21877813e-002, 3.33640352e-002, + 4.67540201e-004, -1.11774495e-003, 4.75865556e-003, + 5.30679012e-003, 1.14600165e-002, -2.94248387e-002, + 3.60229164e-002, 4.78747934e-002, -6.82003389e-004, + -3.13998312e-002, 4.07956354e-002, 4.88276929e-002, + -3.30374762e-003, -1.85139099e-004, 7.33554922e-003, + 5.25376434e-003, -5.81218861e-003, 9.75246658e-004, + 1.01421373e-002, 5.11880498e-003, -1.28789591e-002, + -2.83942539e-002, 4.90979254e-002, 4.45175543e-002, + 4.71973792e-002, -2.57508028e-002, 6.32508174e-002, + 4.82745208e-002, -2.11554521e-004, 1.62806269e-003, + 6.84130844e-003, 5.86893409e-003, -7.74707347e-002, + -7.98721705e-003, 9.77109745e-002, 3.38832028e-002, + -1.08144030e-001, -5.41070998e-002, 2.61021048e-001, + 1.81937248e-001, 3.73302042e-001, -8.02939683e-002, + 4.18802351e-001, 2.52882987e-001, 1.35148000e-002, + -2.65567712e-002, 5.14435470e-002, 5.13185970e-002, + -7.06844479e-002, -2.06210068e-003, 9.14429501e-002, + 3.67633402e-002, -8.29557702e-002, 7.89183453e-002, + 2.50843763e-001, 1.95483714e-001, 1.22827910e-001, + -6.95280358e-002, 2.44634405e-001, 2.93703943e-001, + 3.88750881e-002, -2.06481796e-002, 6.04290627e-002, + 5.33067547e-002, -4.61877696e-003, -4.43718862e-004, + 9.71618667e-003, 5.42296842e-003, -9.68726072e-003, + 2.26987451e-002, 4.34261486e-002, 4.26580347e-002, + 7.39494618e-003, 2.83192787e-002, 3.94290797e-002, + 4.79013622e-002, 2.44041975e-003, 3.87525244e-004, + 7.30041414e-003, 6.76704617e-003, 2.59537424e-004, + 2.23179493e-004, 5.96635323e-003, 4.21040319e-003, + 5.21342969e-003, 2.88310498e-002, 4.74737026e-002, + 4.21811007e-002, -2.56644078e-002, 1.57976784e-002, + 4.46873941e-002, 3.93889844e-002, 5.52937796e-004, + -4.00160759e-004, 4.58477251e-003, 4.38915752e-003, + 3.19865756e-002, 1.11644557e-002, 5.43653518e-002, + 3.11369970e-002, 1.15580268e-001, 1.15404345e-001, + 3.21548373e-001, 2.15470865e-001, -1.42044365e-001, + 2.69356728e-001, 2.79873848e-001, 3.42517227e-001, + -3.29614617e-002, 3.12037151e-002, 4.93345596e-002, + 4.54210714e-002, 4.85995859e-002, 4.13225638e-003, + 6.40919134e-002, 2.91910172e-002, -6.48553669e-002, + -9.65381116e-002, 3.42018336e-001, 1.97833225e-001, + 8.97923708e-002, -1.74389765e-001, 2.82666445e-001, + 2.47004583e-001, -4.70224097e-002, -3.44106671e-003, + 5.74761108e-002, 3.66617851e-002, 3.64125497e-003, + -2.70855468e-004, 7.10882619e-003, 4.83868411e-003, + -1.80798303e-002, -2.11880114e-002, 4.98473868e-002, + 3.82026024e-002, 5.09530585e-003, -2.22715586e-002, + 4.01552916e-002, 4.04942259e-002, -1.43909384e-003, + -1.47559913e-003, 5.71476715e-003, 5.10754623e-003, + -1.25507731e-003, 7.45190599e-004, 3.80149996e-003, + 6.20600069e-003, 2.23698583e-003, 9.55703668e-003, + 2.00041011e-002, 4.76151779e-002, 6.87249564e-003, + 1.36524597e-002, 2.50700396e-002, 5.24508134e-002, + 5.96610538e-004, 9.98592819e-004, 3.96254798e-003, + 7.30070472e-003, 1.53599475e-002, 3.26453522e-002, + 4.03602123e-002, 4.97906767e-002, 2.25695241e-002, + 2.63898641e-001, 1.98550463e-001, 4.05049324e-001, + 3.39142792e-002, 2.14805171e-001, 2.12186068e-001, + 3.57633471e-001, -1.92655642e-002, 2.59528924e-002, + 4.06120084e-002, 4.64949124e-002, 2.40897946e-002, + -1.82363123e-003, 4.43658940e-002, 2.95874625e-002, + -1.38830274e-001, -7.77805448e-002, 2.95958340e-001, + 2.00628087e-001, 1.49220183e-001, -7.43938684e-002, + 3.14405799e-001, 2.03001276e-001, -2.30113436e-002, + -4.62680298e-004, 4.62450236e-002, 3.18192691e-002, + 9.87501349e-004, -1.82841846e-003, 5.06597944e-003, + 6.02001185e-003, -1.00515326e-002, -1.95616111e-002, + 3.92911024e-002, 4.90281209e-002, 1.71848312e-002, + -1.46692079e-002, 4.33679707e-002, 4.35384847e-002, + -9.92864370e-004, -9.45454871e-004, 5.05618937e-003, + 4.45330096e-003, -1.89455482e-003, 1.01924664e-003, + 5.47396298e-003, 5.50725264e-003, 2.64821835e-002, + 3.85355279e-002, 4.61248159e-002, 5.40403724e-002, + -1.42985666e-002, 4.80444767e-002, 4.92304750e-002, + 5.84372580e-002, -1.32342754e-003, -5.09445526e-005, + 5.55007067e-003, 4.53268690e-003, 2.24945992e-002, + 5.20680174e-002, 4.49400842e-002, 6.15933724e-002, + 1.83242396e-001, 3.33588064e-001, 2.55692869e-001, + 3.69943500e-001, -3.19953680e-001, 1.76736638e-001, + 3.82789373e-001, 2.46170148e-001, -3.26596536e-002, + 2.07271315e-002, 5.34179248e-002, 3.90191153e-002, + 2.72653159e-002, 1.10321585e-002, 3.85627560e-002, + 3.02170645e-002, 1.54554127e-002, -3.19822542e-002, + 1.32366344e-001, 1.18247107e-001, -1.71698660e-001, + 3.39517854e-002, 2.27179140e-001, 1.50341451e-001, + -4.71530296e-002, 3.01904995e-002, 6.06380068e-002, + 4.44921255e-002, 9.07500449e-004, -4.87761019e-004, + 3.89302662e-003, 3.77065153e-003, 2.17351771e-004, + -1.71029847e-002, 2.44812313e-002, 2.89724488e-002, + -1.11505417e-002, -1.65190008e-002, 2.83724628e-002, + 2.99262200e-002, -3.63530195e-003, 8.17559601e-004, + 6.07362483e-003, 4.72348463e-003, 1.28928141e-003, + 1.68928283e-003, 4.57329350e-003, 4.24538134e-003, + -6.21611904e-003, 2.96066776e-002, 2.98969708e-002, + 3.98681909e-002, -9.09856986e-003, 1.90154910e-002, + 2.81123873e-002, 3.44849564e-002, -1.36532399e-004, + -1.98796552e-005, 3.91056109e-003, 3.77199799e-003, + 2.99714282e-002, 4.61167097e-003, 4.25469130e-002, + 2.19153557e-002, -1.56840719e-002, 4.31664772e-002, + 1.94492772e-001, 1.80637419e-001, -5.18362932e-002, + 2.24506557e-001, 3.65046412e-001, 2.84855336e-001, + -1.77851319e-002, 7.24218925e-003, 4.08620723e-002, + 2.75726318e-002, 2.38238405e-002, -4.43117553e-003, + 3.73514108e-002, 1.57569014e-002, 2.44181827e-002, + -5.06319478e-002, 1.74055710e-001, 1.23973772e-001, + 3.53487730e-002, -4.94569130e-002, 6.35212183e-001, + 1.92047298e-001, -2.49191094e-002, -2.97400169e-003, + 4.92371209e-002, 2.44353879e-002, 1.88710692e-003, + -6.76598749e-004, 4.21818998e-003, 2.53437692e-003, + 4.74869693e-003, -8.27151816e-003, 3.02943029e-002, + 2.29838770e-002, -6.13266893e-004, -1.77254025e-002, + 6.86361045e-002, 3.30270194e-002, -2.48508411e-003, + 1.00771256e-003, 6.28326880e-003, 3.26665910e-003, + 1.22059675e-004, 1.60762365e-003, 4.15758369e-003, + 4.02511004e-003, 3.76585987e-003, 1.82261206e-002, + 2.81589068e-002, 3.88235375e-002, -1.18863616e-004, + 1.88206378e-002, 2.54783910e-002, 3.93809602e-002, + -5.67283307e-004, 1.25314947e-003, 3.84614454e-003, + 4.29040054e-003, 1.94719080e-002, 5.13669383e-003, + 4.70000058e-002, 3.07252258e-002, 5.14155440e-002, + 1.74109742e-001, 2.75019288e-001, 2.82859087e-001, + -7.13021606e-002, 1.15653805e-001, 2.09029436e-001, + 2.50683725e-001, -1.83513481e-002, 1.20600592e-003, + 3.80684286e-002, 2.99978070e-002, 1.20677315e-002, + -3.52918729e-003, 4.85132411e-002, 2.57918667e-002, + 2.22692922e-001, 1.69695914e-002, 4.28202957e-001, + 1.91352293e-001, -2.81486988e-001, 2.08524112e-002, + 3.55084360e-001, 1.84717759e-001, -7.94254895e-003, + -4.57191700e-003, 3.73882316e-002, 2.62823198e-002, + 8.92978103e-004, 1.01834338e-003, 5.99345192e-003, + 3.60697345e-003, 2.75109336e-002, -1.38299521e-002, + 5.55288382e-002, 3.46056223e-002, -3.27798612e-002, + -1.05290618e-002, 4.88850251e-002, 3.23556140e-002, + -6.91882509e-004, 1.13581878e-003, 5.02510834e-003, + 3.96001991e-003, 5.69914794e-003, 3.29310680e-003, + 1.81126185e-002, 9.73004103e-003, -1.12414937e-002, + 9.21124890e-002, 8.40357319e-002, 1.30033344e-001, + -2.94073503e-002, 1.64824203e-001, 6.36400655e-002, + 2.25799844e-001, 4.73630056e-003, 1.56012084e-002, + 1.13203768e-002, 2.15071701e-002, 1.17525138e-001, + 8.08434933e-003, 2.02134818e-001, 4.13118936e-002, + 1.68788165e-001, 9.13315117e-002, 3.75461936e-001, + 1.72906205e-001, -1.00016080e-001, 1.06002994e-001, + 3.24096680e-001, 2.33727187e-001, -1.65826976e-002, + 1.36557287e-002, 5.35124615e-002, 3.22562046e-002, + 1.46939114e-001, 1.71321966e-002, 2.09726676e-001, + 3.74439880e-002, 9.64741558e-002, 1.32861119e-002, + 2.49447271e-001, 1.00834787e-001, -1.43856421e-001, + -6.24281913e-002, 2.76076138e-001, 1.47826791e-001, + -2.64277123e-002, -2.13274565e-002, 5.34056611e-002, + 4.43135574e-002, 1.55768525e-002, 3.06056114e-003, + 2.22637877e-002, 5.95938088e-003, 4.52638138e-003, + -1.10237561e-002, 3.92321348e-002, 1.92736015e-002, + -3.02263685e-002, -1.60094090e-002, 4.79190312e-002, + 3.55118215e-002, -7.05461658e-004, 4.46509710e-003, + 6.27193833e-003, 1.12766903e-002, -4.39052819e-004, + 6.70581998e-004, 5.84284635e-003, 3.22286831e-003, + -4.57185544e-002, -1.77277215e-002, 5.57319634e-002, + 3.38994674e-002, 1.69988889e-002, -2.27995273e-002, + 6.38282821e-002, 3.77635062e-002, 5.06386999e-003, + 8.64604488e-004, 1.08921295e-002, 3.88158625e-003, + -2.52955817e-002, -1.14465309e-002, 5.09220064e-002, + 2.24490277e-002, -2.53754228e-001, -7.95726404e-002, + 3.21508855e-001, 1.70892626e-001, 5.61222211e-002, + -5.31281717e-002, 4.82954919e-001, 1.59555227e-001, + 7.09870830e-002, -7.79745728e-003, 1.04557954e-001, + 2.76902560e-002, -4.01923917e-002, -5.37408330e-003, + 5.71514890e-002, 1.94807537e-002, -1.25349939e-001, + 1.86355822e-002, 2.49871448e-001, 1.14773087e-001, + -5.94334491e-002, 2.77761407e-002, 4.59074318e-001, + 1.17735602e-001, 8.59525874e-002, -7.77719356e-003, + 1.15392476e-001, 2.87632272e-002, -4.49562212e-003, + -5.63683570e-004, 7.15726847e-003, 2.72315345e-003, + -1.52084334e-002, 9.83578432e-003, 3.79725583e-002, + 2.18787976e-002, -7.45067419e-003, 1.24744168e-002, + 5.60605377e-002, 2.39783023e-002, 9.23642423e-003, + -6.98259566e-004, 1.36937797e-002, 3.90645908e-003, + -7.77245779e-003, 2.08907435e-003, 1.12393023e-002, + 4.94476920e-003, -1.66881476e-002, -1.39204003e-002, + 5.08930273e-002, 3.50964181e-002, 1.03630302e-002, + -2.20317133e-002, 5.05632609e-002, 4.50082906e-002, + 1.18324882e-003, 2.55386316e-004, 7.44419359e-003, + 5.25524514e-003, -7.27737173e-002, 1.03610884e-002, + 9.20159370e-002, 3.24739926e-002, -1.72712758e-001, + 5.02074808e-002, 3.02426636e-001, 1.92412049e-001, + 3.48184071e-002, 6.34253100e-002, 3.03254366e-001, + 2.66115338e-001, 2.92054433e-002, 1.10223191e-003, + 5.73338047e-002, 4.05868292e-002, -6.29234388e-002, + 1.12263095e-002, 8.14971477e-002, 3.36680226e-002, + -1.89794540e-001, 1.28527358e-001, 3.18985492e-001, + 2.71201640e-001, 5.08871675e-002, 1.54181153e-001, + 2.43487909e-001, 3.44089210e-001, 2.34066714e-002, + 1.84095930e-002, 5.14427200e-002, 4.99376468e-002, + -4.08498570e-003, 6.98811549e-004, 7.75707606e-003, + 5.11439145e-003, -1.83952437e-003, 5.44626378e-002, + 4.82029803e-002, 7.32534751e-002, 6.65971497e-003, + 6.38282076e-002, 4.16138321e-002, 8.69351253e-002, + -1.61601650e-003, 4.86592622e-003, 6.62171328e-003, + 9.13642161e-003, 4.71095741e-003, -1.15975272e-003, + 9.51271504e-003, 3.57039319e-003, 1.39031131e-002, + 1.39646865e-002, 5.13232648e-002, 2.51749977e-002, + -1.88226774e-002, 1.17449723e-002, 3.27024125e-002, + 2.51939148e-002, -3.18952138e-003, -1.71043284e-005, + 5.79566695e-003, 3.46143241e-003, 4.70647067e-002, + -6.60236971e-003, 7.59898499e-002, 2.23067384e-002, + 1.20817497e-001, 2.72582322e-002, 4.06054109e-001, + 1.25434905e-001, -1.28722757e-001, 2.97370274e-002, + 2.03950241e-001, 1.26980647e-001, -3.29234339e-002, + 4.65246942e-003, 4.53648344e-002, 2.37580910e-002, + 4.59579788e-002, -9.27980430e-003, 7.36637264e-002, + 2.69192010e-002, 8.53293166e-002, -1.93924293e-001, + 5.48409522e-001, 2.50464231e-001, -6.99807927e-002, + -1.67458832e-001, 2.03133956e-001, 2.28832498e-001, + -3.27250175e-002, -1.48264123e-002, 4.61489856e-002, + 2.91306321e-002, 2.50193337e-003, -1.07193983e-003, + 6.50288211e-003, 4.33244929e-003, -1.81976648e-004, + -4.86934856e-002, 5.56824803e-002, 6.84103817e-002, + -2.10909551e-004, -4.81125750e-002, 3.17766592e-002, + 7.19514713e-002, -9.48663976e-004, -3.43287387e-003, + 4.65957914e-003, 6.81364629e-003, -5.00741648e-004, + 1.43248832e-003, 8.48688278e-003, 3.53894662e-003, + -2.46845186e-002, -8.62894405e-004, 5.94778918e-002, + 3.37854549e-002, 1.63937034e-003, -5.24619082e-003, + 4.38687988e-002, 3.12263500e-002, -2.97254231e-003, + -2.43683637e-004, 6.82324357e-003, 3.98315676e-003, + 6.14169613e-003, 3.89714981e-003, 6.60829097e-002, + 2.33679954e-002, -2.64104217e-001, -1.62585033e-003, + 4.43446100e-001, 1.67372420e-001, -3.75959789e-003, + -5.95724694e-002, 2.80353814e-001, 1.64237410e-001, + -1.37227410e-002, -1.16472626e-002, 5.06657884e-002, + 2.52614077e-002, 1.06937892e-003, -1.33038920e-004, + 6.94163293e-002, 2.24372540e-002, -1.42519623e-001, + 9.82849449e-002, 3.57942611e-001, 2.04025477e-001, + -2.20066741e-001, 6.26464263e-002, 3.47821504e-001, + 1.79192364e-001, 2.26421538e-003, -2.37939693e-003, + 4.28808965e-002, 2.44935080e-002, -7.03600002e-004, + -9.22648527e-004, 8.08941387e-003, 3.51794390e-003, + -1.00610405e-002, -5.18130139e-004, 5.18572070e-002, + 3.55166905e-002, -3.54895405e-002, 5.80575969e-003, + 5.38809933e-002, 3.69104072e-002, 2.99434087e-005, + 9.37770645e-004, 5.01755392e-003, 3.86567577e-003, + -1.92401092e-003, 1.61523651e-002, 7.93422759e-003, + 1.99649744e-002, -2.86322869e-002, 1.50822923e-001, + 6.05035722e-002, 1.77199394e-001, -1.61833502e-002, + 1.14031769e-001, 6.79493099e-002, 1.46266684e-001, + -5.52987633e-003, 6.98042044e-004, 1.32759782e-002, + 1.35815740e-002, 5.70966350e-003, 1.64318085e-002, + 2.43609957e-002, 2.99686920e-002, -2.66293772e-002, + 1.44048050e-001, 1.43301725e-001, 2.44441450e-001, + -2.19009116e-001, 3.23435664e-001, 3.62245411e-001, + 3.96162540e-001, -1.59629732e-001, 3.47026512e-002, + 2.08886668e-001, 6.47822618e-002, 5.78400493e-003, + -1.56099221e-003, 1.77475065e-002, 1.40359867e-002, + 9.59723629e-003, -7.65937008e-003, 8.61959681e-002, + 8.40598270e-002, -6.65547773e-002, 9.44685377e-003, + 1.78458825e-001, 1.14265636e-001, -1.80084556e-001, + 3.17367762e-002, 2.25233197e-001, 4.89150323e-002, + 5.29777142e-004, -3.60576669e-004, 2.30879127e-003, + 2.28367466e-003, 1.27915898e-003, -5.08071063e-003, + 1.21255424e-002, 1.44864274e-002, -3.93652078e-003, + -3.91001813e-003, 2.15269737e-002, 1.81648713e-002, + -1.73137970e-002, 3.21909203e-003, 2.35285442e-002, + 5.87911950e-003, -2.79317354e-003, -4.57583141e-004, + 7.07548345e-003, 4.39220248e-003, 4.33313660e-003, + -2.34770551e-002, 3.83270346e-002, 3.70580107e-002, + 3.00595313e-002, -2.80614030e-002, 6.37034923e-002, + 4.22641151e-002, 5.65851899e-003, 2.26184377e-003, + 1.10122589e-002, 5.16930316e-003, -4.45525832e-002, + -4.21713898e-003, 6.63596690e-002, 2.47258022e-002, + 6.98553324e-002, -6.81030527e-002, 2.63832688e-001, + 1.46659955e-001, 1.61318004e-001, -7.21315593e-002, + 4.90701616e-001, 1.64811537e-001, 8.10271725e-002, + -1.33174553e-003, 1.10731266e-001, 2.48649996e-002, + -5.07935844e-002, 7.95128755e-004, 7.05482662e-002, + 2.30821744e-002, 1.32930592e-001, 3.64802554e-002, + 3.07359427e-001, 1.19167276e-001, 6.05384707e-002, + 2.36136336e-002, 4.67237651e-001, 1.32293716e-001, + 9.91441905e-002, -8.36287625e-003, 1.23440214e-001, + 2.78424360e-002, -4.42914618e-003, -2.18291374e-004, + 7.95381516e-003, 3.21509200e-003, 1.10977395e-002, + 1.07077016e-002, 3.95790078e-002, 2.48210691e-002, + 1.22093949e-002, 8.61310307e-003, 5.81321828e-002, + 2.70890538e-002, 1.15663139e-002, -1.57680188e-003, + 1.55390762e-002, 4.44419635e-003, 4.06940271e-005, + 1.99208572e-003, 9.37540829e-003, 5.48625970e-003, + -6.38979152e-002, -3.48853730e-002, 8.18926319e-002, + 5.91929257e-002, -1.37331793e-002, -3.92141826e-002, + 4.99641113e-002, 6.08047731e-002, 1.23422984e-002, + 3.23830289e-003, 2.11483166e-002, 8.72876775e-003, + -6.42955452e-002, -2.93162744e-002, 1.01604551e-001, + 4.57810387e-002, -3.12171280e-001, -2.24990889e-001, + 4.12157357e-001, 2.81330287e-001, 2.10236255e-002, + -3.18571664e-002, 2.03675166e-001, 1.32095084e-001, + 1.66247338e-001, 3.10270861e-003, 2.33760118e-001, + 3.94265540e-002, -1.08540811e-001, -1.54320858e-002, + 1.35823756e-001, 4.14102338e-002, -1.24880902e-001, + -1.07525056e-003, 2.74286926e-001, 1.31105348e-001, + 2.79390384e-002, 7.37826154e-003, 1.79938793e-001, + 1.04068756e-001, 1.63259432e-001, -8.65376927e-003, + 2.25626469e-001, 3.93561721e-002, -1.33689810e-002, + -1.23138272e-003, 1.79085582e-002, 4.52284236e-003, + -1.49320252e-002, 8.90577491e-003, 3.59397791e-002, + 2.65999790e-002, 7.47720851e-003, 1.04378713e-002, + 2.99874581e-002, 2.71008816e-002, 1.43444594e-002, + -1.82526628e-003, 2.29021944e-002, 6.44995179e-003, + -9.67613087e-005, -4.81938041e-004, 4.12259577e-003, + 5.39779942e-003, -7.22128851e-003, -4.82471520e-003, + 2.77866554e-002, 4.20214608e-002, 4.94691031e-003, + -4.85030934e-003, 4.49558012e-002, 3.84352133e-002, + 5.35036597e-005, -1.35544338e-004, 5.08618494e-003, + 3.69189028e-003, -3.32229654e-003, -9.81087214e-004, + 3.50369625e-002, 5.64893000e-002, -3.68312076e-002, + 8.51137447e-004, 1.69200897e-001, 4.71046209e-001, + 3.62989381e-002, -2.33039707e-002, 3.59761149e-001, + 2.86555678e-001, 1.02888206e-002, 1.21491903e-003, + 4.62396890e-002, 2.50889566e-002, -5.49650239e-003, + -2.45926902e-003, 3.34274769e-002, 3.71960439e-002, + -3.04122847e-002, -4.30522859e-002, 1.81689113e-001, + 2.60080278e-001, 2.97002736e-002, -8.91221873e-003, + 4.36748832e-001, 1.85659051e-001, 1.27591826e-002, + -2.55350769e-003, 4.84493598e-002, 2.42675208e-002, + -5.94562385e-004, 3.50929884e-004, 4.69964417e-003, + 4.58015781e-003, -4.35057795e-003, 7.88353104e-003, + 3.01268864e-002, 3.48160416e-002, 3.41847329e-003, + 4.40362515e-003, 5.42431846e-002, 3.10562402e-002, + 1.08156283e-003, -3.92696267e-004, 6.27076579e-003, + 3.26515012e-003, 5.66921481e-005, 1.30066974e-003, + 3.83141614e-003, 4.37377114e-003, 8.25973228e-003, + 2.61230469e-002, 2.66679209e-002, 3.99358310e-002, + -3.62263247e-003, 2.88011245e-002, 2.83258986e-002, + 4.09652516e-002, -1.90219027e-003, 1.22684822e-003, + 4.43796162e-003, 4.32462338e-003, 1.98847484e-002, + 1.12434570e-002, 3.46057788e-002, 3.27889472e-002, + 9.02206972e-002, 1.41839504e-001, 1.75394699e-001, + 2.30788097e-001, -1.01057321e-001, 7.57101700e-002, + 2.03508303e-001, 2.03122497e-001, -3.24133337e-002, + -5.02856914e-003, 4.22674082e-002, 3.13711204e-002, + 2.42219549e-002, -1.71331484e-002, 3.89782339e-002, + 4.62194122e-002, 1.34621397e-001, -1.40186459e-001, + 2.19794527e-001, 4.48013544e-001, -2.69726783e-001, + -1.56227589e-001, 3.20433050e-001, 3.67640913e-001, + -2.12322492e-002, -1.73122101e-002, 3.73820700e-002, + 3.58768553e-002, -6.54478616e-004, -1.60634855e-003, + 4.10144450e-003, 5.49678225e-003, 6.24448853e-003, + -3.08806691e-002, 2.90776957e-002, 5.27223535e-002, + -1.02118943e-002, -2.80743428e-002, 3.17422599e-002, + 4.87374403e-002, -3.83812207e-004, -2.03971460e-004, + 3.79695999e-003, 4.20703599e-003, 9.79241682e-004, + 2.84914230e-003, 4.64756927e-003, 5.52558899e-003, + -1.65319780e-003, 4.18981202e-002, 2.98663806e-002, + 5.41070625e-002, -1.54641028e-002, 2.63760928e-002, + 3.23166028e-002, 4.50081676e-002, 6.54445263e-004, + 4.88321180e-004, 4.04462684e-003, 4.66005504e-003, + 3.80743295e-002, 9.17382725e-003, 4.79715839e-002, + 3.23547684e-002, 8.91879126e-002, 1.85812220e-001, + 2.21095309e-001, 2.69712538e-001, -2.06896797e-001, + 3.07109088e-001, 3.06048363e-001, 3.62228483e-001, + -2.07896587e-002, 3.04713864e-002, 4.23092172e-002, + 4.46449630e-002, 3.40313315e-002, -7.94325955e-003, + 4.76395749e-002, 3.12249865e-002, 2.03840613e-001, + -6.79615587e-002, 2.71566153e-001, 2.11351201e-001, + -6.87851086e-002, 4.92598787e-002, 2.53420085e-001, + 2.38725513e-001, -3.56904566e-002, 2.27505472e-002, + 5.16679212e-002, 4.40366454e-002, 1.45393598e-003, + -4.47923900e-004, 5.21792006e-003, 5.41143725e-003, + 2.24383101e-002, -3.54746208e-002, 3.93679999e-002, + 5.50007001e-002, 4.45130607e-003, -4.46897186e-002, + 3.50439809e-002, 6.22434914e-002, -1.58807798e-003, + -1.66055688e-003, 5.61337452e-003, 6.47463743e-003, + -2.03082263e-002, 3.69805656e-003, 2.81881001e-002, + 8.73330329e-003, -1.49118621e-003, -2.91114897e-002, + 3.94707806e-002, 4.21071947e-002, 2.87185553e-002, + -3.51630822e-002, 4.45147902e-002, 5.06336801e-002, + 6.24638237e-003, 1.00873338e-004, 1.58811100e-002, + 6.85786596e-003, -2.38207400e-001, 2.38855500e-002, + 3.16633135e-001, 4.52342480e-002, -6.78703412e-002, + -4.34211977e-002, 2.27936894e-001, 1.37411356e-001, + 1.31687850e-001, -8.76225755e-002, 2.10173175e-001, + 1.64064437e-001, 1.08756639e-001, -8.87705572e-003, + 1.63078070e-001, 4.04106639e-002, -2.40746066e-001, + 1.48500800e-002, 3.35276514e-001, 4.05234843e-002, + -1.26043648e-001, 8.08395296e-002, 3.00401062e-001, + 1.69202670e-001, 8.59429464e-002, 6.24410659e-002, + 1.85815409e-001, 1.45261794e-001, 1.24018192e-001, + -5.09468419e-003, 1.75127178e-001, 3.69037390e-002, + -2.21530776e-002, -2.13611801e-003, 3.69731784e-002, + 8.58099293e-003, -3.09185758e-002, 2.33597513e-002, + 6.30639568e-002, 4.24166843e-002, 3.99215100e-003, + 1.61403511e-002, 3.52747180e-002, 3.33691277e-002, + 1.15464507e-002, -2.29318067e-003, 1.89898573e-002, + 5.45809092e-003, -1.09349762e-003, 1.92547421e-004, + 5.07747615e-003, 3.77102778e-003, -1.92132164e-002, + -1.30272033e-002, 4.01099436e-002, 3.05344630e-002, + -8.56804941e-003, -2.02910695e-002, 4.41863835e-002, + 3.45082842e-002, 4.77148592e-003, 6.69575064e-004, + 9.42680426e-003, 4.95748548e-003, -1.86131261e-002, + -5.41603053e-003, 3.94998789e-002, 2.72325128e-002, + -1.63843870e-001, -6.97195008e-002, 2.62915581e-001, + 1.85506105e-001, -2.02560741e-002, -1.30273262e-002, + 3.19598079e-001, 1.95862323e-001, 6.06066473e-002, + 2.08582617e-002, 8.68404657e-002, 3.95609327e-002, + -2.74542123e-002, -1.08068716e-002, 4.44816425e-002, + 3.27081047e-002, -1.43045977e-001, -8.68205950e-002, + 2.58705199e-001, 2.41302803e-001, 2.82456994e-001, + 1.77506223e-001, 4.16479260e-001, 2.94485241e-001, + 1.83004774e-002, 1.75511185e-002, 6.31242022e-002, + 3.59751657e-002, -3.11358017e-003, -1.48592939e-004, + 5.99183841e-003, 4.79491288e-003, 5.79231232e-003, + 2.97785625e-002, 4.57531810e-002, 4.75684032e-002, + 4.41647023e-002, 2.67524794e-002, 6.23162463e-002, + 4.64891791e-002, -1.83489313e-003, -1.32761546e-003, + 6.14902657e-003, 4.35579941e-003, -5.94246108e-003, + 2.36318694e-004, 9.32025351e-003, 4.49399697e-003, + 1.33604361e-002, -1.55792795e-002, 4.17626724e-002, + 2.99339164e-002, 1.79507248e-002, -9.47551243e-003, + 4.35472690e-002, 3.17171663e-002, 2.81336950e-003, + 7.87395518e-004, 6.95409020e-003, 4.78534820e-003, + -7.25719780e-002, 1.36409923e-002, 8.70845988e-002, + 3.44046094e-002, 6.68542534e-002, -3.75049710e-002, + 2.77206451e-001, 1.49351478e-001, 1.30032420e-001, + -9.03392062e-002, 2.68762618e-001, 1.87425762e-001, + 4.12325002e-002, 6.03705039e-003, 5.71639985e-002, + 3.34852412e-002, -5.57631850e-002, 2.52005104e-002, + 8.05010796e-002, 4.26077880e-002, -1.30467042e-001, + 1.67951718e-001, 3.46082568e-001, 2.56070614e-001, + 2.65554070e-001, 1.16157897e-001, 4.23641562e-001, + 2.40377709e-001, 3.05502862e-002, 2.46165022e-002, + 5.45057580e-002, 4.21090126e-002, -1.59740797e-003, + -8.07338278e-004, 8.23051762e-003, 5.17612696e-003, + -2.72540413e-002, 3.15245949e-002, 6.03555702e-002, + 5.17397597e-002, 3.59360985e-002, 2.82335915e-002, + 6.55857474e-002, 4.79425527e-002, 1.05818594e-003, + -1.34517776e-003, 6.90795900e-003, 5.05063403e-003, + 3.82433855e-003, -3.13678081e-003, 8.56088009e-003, + 1.11145293e-002, -6.88534528e-002, -6.70302883e-002, + 9.03044492e-002, 1.04181461e-001, -3.24898399e-002, + -6.50608018e-002, 6.08675256e-002, 8.51779729e-002, + 5.03614370e-004, -4.74074390e-003, 6.33614557e-003, + 8.30581877e-003, -1.98481940e-002, -6.82903007e-002, + 4.37250212e-002, 8.72333348e-002, -1.57058999e-001, + -3.43262315e-001, 2.37641439e-001, 4.41347122e-001, + -1.82775431e-003, -7.91592672e-002, 1.31337121e-001, + 1.79477289e-001, 1.66959055e-002, -1.10097472e-002, + 2.94818413e-002, 3.12093347e-002, -8.99937935e-003, + 4.41092765e-003, 2.71005724e-002, 3.73738334e-002, + -1.27989231e-002, 1.56527638e-001, 1.26124114e-001, + 2.61322170e-001, 4.23391350e-002, 2.18817636e-001, + 1.16047420e-001, 2.91860014e-001, 1.52235078e-002, + 3.17245983e-002, 2.99445894e-002, 4.70210686e-002, + 3.86986975e-003, 1.20170759e-002, 7.57357804e-003, + 1.73729416e-002, 2.63641477e-002, 1.37513876e-001, + 5.07775247e-002, 1.76254451e-001, -5.95777808e-003, + 1.26364186e-001, 4.16421555e-002, 1.63240999e-001, + -4.07395745e-003, 9.91008244e-003, 7.08855269e-003, + 1.70877669e-002, -1.11170923e-002, -5.21705442e-005, + 1.78142786e-002, 1.10911662e-002, -2.80756243e-002, + -1.21523730e-001, 7.11505637e-002, 1.61607161e-001, + -2.27243751e-002, -1.15835913e-001, 4.22964953e-002, + 1.51776031e-001, -1.27945724e-003, -1.08911609e-002, + 4.67973994e-003, 1.63722709e-002, -1.71199262e-001, + 5.35608688e-003, 2.04372615e-001, 3.68477106e-002, + -3.28139424e-001, -1.04424931e-001, 4.04559374e-001, + 1.86435297e-001, -2.86052725e-003, -6.11876436e-002, + 8.77493173e-002, 1.34858981e-001, 6.02519745e-003, + -7.88215641e-003, 1.71965845e-002, 2.00764146e-002, + -1.86131686e-001, -2.92322622e-003, 2.19693244e-001, + 2.66374499e-002, -3.08717489e-001, 3.38769965e-002, + 3.86864036e-001, 1.13347843e-001, -1.23525120e-003, + 1.20335817e-002, 8.04919899e-002, 7.51661733e-002, + 3.51150404e-003, 5.93361445e-004, 1.38492770e-002, + 1.25526851e-002, -2.24219467e-002, -1.49519218e-003, + 2.83255577e-002, 5.40213659e-003, -4.53717001e-002, + 1.80986635e-002, 6.24975972e-002, 3.35428864e-002, + -4.86023305e-003, 1.49603924e-002, 1.80897396e-002, + 2.72400808e-002, 2.74706690e-004, 1.30891323e-003, + 2.17083632e-003, 3.34587903e-003, 1.62541051e-003, + -8.51608114e-004, 2.64795101e-003, 3.25452769e-003, + -1.60800735e-003, 1.52363395e-002, 1.43066570e-002, + 2.31050588e-002, -1.09619945e-002, 1.54972775e-002, + 2.70695593e-002, 2.74317004e-002, -1.86361861e-003, + 1.12638227e-004, 4.44639567e-003, 5.18121012e-003, + 2.39312015e-002, -8.56994838e-003, 2.88776569e-002, + 2.54549906e-002, 4.11925912e-002, -1.67479794e-002, + 8.71123374e-002, 7.18192160e-002, -2.26621479e-001, + -1.72230706e-001, 2.45593518e-001, 2.66873866e-001, + -3.71600017e-002, -6.32971600e-002, 5.39278463e-002, + 8.74221921e-002, 2.74242908e-002, -1.24342572e-002, + 3.60504836e-002, 4.14114557e-002, 4.19543907e-002, + -9.53182578e-002, 1.37453571e-001, 1.83150455e-001, + -3.69004577e-001, -1.26253694e-001, 3.96372050e-001, + 4.71263528e-001, -3.50879952e-002, -3.95747600e-003, + 5.15815131e-002, 8.09085295e-002, 1.32712675e-003, + -6.69844775e-003, 4.72644018e-003, 1.13478480e-002, + -1.32245822e-002, -7.97027647e-002, 3.26517336e-002, + 9.73274633e-002, -4.80537787e-002, -6.13638312e-002, + 6.04412369e-002, 9.08696279e-002, 1.56564265e-003, + -3.26663692e-004, 5.16404957e-003, 6.60289638e-003, + 1.24615140e-003, -9.45627969e-003, 7.05524720e-003, + 1.11955618e-002, 1.23606073e-002, -1.14492550e-001, + 4.01435420e-002, 1.23050898e-001, 8.49128049e-003, + -1.05451852e-001, 3.32790837e-002, 1.22101635e-001, + -5.07431745e-004, -7.58410711e-003, 5.21358568e-003, + 1.04261981e-002, -2.84756385e-002, -1.63451321e-002, + 4.50552590e-002, 3.75863127e-002, 1.96022853e-001, + -6.27512112e-002, 3.50889891e-001, 2.49414340e-001, + -8.24798569e-002, -1.59383133e-001, 3.50574374e-001, + 2.56760359e-001, 6.98315278e-002, -1.06088072e-002, + 8.51998255e-002, 3.31440121e-002, -1.29138837e-002, + -1.62390957e-003, 3.62456404e-002, 2.58322097e-002, + 1.01054206e-001, -2.94539891e-002, 2.97698706e-001, + 1.92304835e-001, -6.37620986e-002, -2.94753462e-002, + 3.24267596e-001, 1.76750258e-001, 8.29481035e-002, + -3.53454729e-003, 9.61423665e-002, 3.59676071e-002, + -6.19188766e-004, 2.97186757e-003, 4.19584243e-003, + 8.15980136e-003, 8.21798760e-003, 4.08153273e-002, + 5.00195473e-002, 5.85759915e-002, -1.78319681e-003, + 3.97550724e-002, 4.40193936e-002, 5.31620719e-002, + 4.12888220e-003, -4.10497247e-004, 8.04116856e-003, + 7.35706743e-003, -4.22175450e-004, -1.73599191e-003, + 5.25541697e-003, 5.64784277e-003, -3.59286019e-003, + -5.37836254e-002, 3.72518711e-002, 7.12544546e-002, + 1.13558369e-002, -3.12631540e-002, 3.39801982e-002, + 5.68083040e-002, -8.68362433e-004, -2.49871489e-004, + 4.08930844e-003, 4.75280127e-003, -2.02498846e-002, + 2.88063660e-003, 4.74503264e-002, 4.09862474e-002, + -2.03744158e-001, 1.28458083e-001, 3.06850553e-001, + 3.84440243e-001, 1.25932872e-001, -1.42566785e-001, + 2.60690570e-001, 3.26525182e-001, 1.82061363e-002, + -2.46601701e-002, 4.71681990e-002, 4.65940386e-002, + -2.62444150e-002, -2.60885190e-002, 5.03471680e-002, + 5.09062074e-002, -9.84249786e-002, -2.05924183e-001, + 2.45774657e-001, 3.61178935e-001, -1.07422369e-002, + -1.09214326e-002, 1.82973027e-001, 1.73585668e-001, + 2.37655770e-002, -8.62058811e-003, 4.23916765e-002, + 3.30566727e-002, -2.31377198e-003, -7.94462569e-004, + 6.09066663e-003, 4.88477387e-003, -8.67428165e-003, + 8.43588170e-003, 3.22441757e-002, 3.41388471e-002, + 4.94148722e-003, 7.09931273e-003, 2.79781129e-002, + 2.96253227e-002, 1.12928229e-003, -1.88575323e-005, + 4.75444784e-003, 4.28413786e-003, 6.47929916e-003, + 7.54029863e-003, 1.21878916e-002, 1.05013493e-002, + -8.36565159e-003, 1.18670747e-001, 4.44035009e-002, + 1.37261286e-001, 2.91956356e-003, 1.19618416e-001, + 3.02474611e-002, 1.44324437e-001, 1.06339471e-003, + 1.24209719e-002, 5.16832713e-003, 1.72012951e-002, + 1.07969224e-001, 3.00955074e-003, 1.46908581e-001, + 4.38648686e-002, 1.69745963e-002, 1.76735595e-001, + 2.80311167e-001, 3.42543036e-001, 4.80395555e-003, + 1.43440202e-001, 1.50018573e-001, 3.84488314e-001, + -1.49732223e-002, 2.21629925e-002, 3.61146778e-002, + 6.38522878e-002, 1.03705287e-001, -2.53320765e-003, + 1.55240387e-001, 3.74434218e-002, 1.81413114e-001, + 2.38869097e-002, 2.85690099e-001, 2.08606988e-001, + -3.54666896e-002, 1.47195876e-001, 1.29157260e-001, + 2.35372633e-001, -1.30524533e-002, 1.86451245e-002, + 2.66041458e-002, 3.42372395e-002, 8.94248020e-003, + 2.05510226e-003, 1.84131227e-002, 6.05363399e-003, + 3.09058353e-002, -1.75713394e-002, 4.54613566e-002, + 3.29612270e-002, -1.85871252e-003, -2.39344966e-002, + 1.80598274e-002, 3.73671278e-002, -1.67032529e-003, + -2.87138228e-003, 3.68003338e-003, 6.13166159e-003, + -1.05921330e-003, 6.82556629e-003, 3.48771620e-003, + 1.54898241e-002, -6.53912313e-004, 5.29005155e-002, + 1.75646041e-002, 1.12349056e-001, 1.11676170e-003, + 5.18174581e-002, 2.18419433e-002, 1.09552212e-001, + -3.24350040e-005, 4.50902432e-003, 6.94114855e-003, + 1.21021466e-002, 1.04193585e-002, 5.98824844e-002, + 2.41424628e-002, 6.74528107e-002, 5.93524938e-003, + 4.22262639e-001, 8.12436566e-002, 4.64091033e-001, + -6.59171492e-002, 4.13061559e-001, 1.27198830e-001, + 4.55871582e-001, -7.69714043e-002, 3.88441458e-002, + 1.15428425e-001, 5.94496764e-002, 9.00141988e-003, + 3.24318331e-004, 1.87567435e-002, 1.24475947e-002, + -2.71391030e-003, -9.53208935e-003, 5.68696782e-002, + 6.60915226e-002, -6.54260814e-002, -1.33079169e-002, + 1.12581410e-001, 8.19441229e-002, -8.35759714e-002, + 2.67260056e-003, 1.25058964e-001, 2.59428825e-002, + 4.71337698e-004, -1.02687860e-004, 2.07044743e-003, + 1.80296134e-003, -1.28492553e-004, -3.71207437e-003, + 1.05537353e-002, 1.11673707e-002, -1.06104873e-002, + -4.02181502e-003, 1.87476464e-002, 1.37650417e-002, + -9.02369339e-003, 6.57681143e-004, 1.52333472e-002, + 3.21788318e-003, 8.87723546e-003, 2.60443557e-002, + 1.98430177e-002, 4.92201708e-002, 2.83161504e-003, + 2.49854103e-001, 2.69871261e-002, 4.20721799e-001, + 1.15932082e-003, 2.54799098e-001, 2.56296862e-002, + 4.19143796e-001, -4.80889762e-003, 2.80002132e-002, + 1.80573147e-002, 4.69259284e-002, 1.52728140e-001, + 1.23088236e-003, 2.66114771e-001, 6.21918552e-002, + 5.41570969e-002, 7.97681510e-002, 1.55707762e-001, + 1.66108161e-001, -3.13708149e-002, 6.82326183e-002, + 7.60037899e-002, 1.30955413e-001, -9.22511369e-002, + 8.51668604e-003, 1.91049680e-001, 3.25304940e-002, + 1.36528224e-001, 2.00508963e-002, 2.53582060e-001, + 5.29112443e-002, 4.51427363e-002, 2.62430636e-003, + 1.32641762e-001, 7.43263140e-002, -3.16440277e-002, + -4.13773162e-003, 8.42526853e-002, 4.92422953e-002, + -8.99830312e-002, 2.99831876e-003, 1.81624100e-001, + 2.06604302e-002, 6.68927841e-003, 3.47726978e-003, + 1.47515098e-002, 8.65441840e-003, 1.01656355e-002, + -3.02586891e-002, 2.85781380e-002, 4.18639444e-002, + -9.05011548e-004, -5.95434336e-003, 1.55862123e-002, + 1.30121950e-002, -8.81208479e-003, 2.54586083e-003, + 1.80733465e-002, 4.76971548e-003, -8.27358861e-004, + 2.18377355e-002, 5.13990177e-003, 2.63368096e-002, + -7.13481149e-003, 1.88986167e-001, 3.10087949e-002, + 2.32074484e-001, -1.48925846e-002, 1.86773703e-001, + 4.19135615e-002, 2.30617404e-001, -8.34476855e-003, + 1.21585336e-002, 1.59020405e-002, 1.78011302e-002, + 2.25374326e-002, 7.92513974e-003, 3.71329598e-002, + 3.48735005e-002, -1.99006926e-002, 4.88522090e-002, + 1.57278538e-001, 1.88754544e-001, -1.81692347e-001, + 3.30694877e-002, 3.23339969e-001, 2.27319077e-001, + -1.35318249e-001, -8.28538276e-003, 2.23953128e-001, + 4.42843325e-002, 1.49355158e-002, 4.09893179e-003, + 3.16452049e-002, 2.36522276e-002, 1.05743324e-002, + 7.00057251e-003, 1.49406955e-001, 1.12930261e-001, + -2.52727747e-001, 2.18888815e-003, 3.74347299e-001, + 1.78051189e-001, -1.30598947e-001, -3.43654677e-003, + 2.31296182e-001, 3.60466875e-002, 3.12888093e-004, + 6.11276264e-005, 4.24777763e-003, 3.10039218e-003, + 1.47112412e-003, -5.67848887e-003, 2.80046854e-002, + 2.17481013e-002, -4.79628332e-002, -1.26542328e-002, + 6.24828227e-002, 3.10126096e-002, -1.44989761e-002, + -4.45144455e-004, 2.92590316e-002, 5.60646504e-003, + 7.78113538e-003, -1.05064071e-003, 1.37602808e-002, + 4.42181900e-003, 1.82544086e-002, 8.77446774e-003, + 3.29946019e-002, 2.54361518e-002, 5.04026655e-004, + 8.09468701e-003, 1.46877980e-002, 2.22629029e-002, + -1.47044123e-003, 1.61177959e-004, 2.83315498e-003, + 2.48481310e-003, 7.29041472e-002, -3.05160973e-003, + 1.07438043e-001, 3.25134434e-002, 1.09158874e-001, + -1.01822838e-001, 1.88579097e-001, 2.03643531e-001, + 6.38896367e-003, -9.76260155e-002, 9.91083756e-002, + 1.73943818e-001, -1.25344191e-002, -9.18016396e-003, + 2.25441270e-002, 2.31056269e-002, 6.89186826e-002, + -9.55175702e-003, 9.44803208e-002, 5.71145937e-002, + 5.01949489e-002, -1.67774782e-001, 1.53527662e-001, + 5.22301555e-001, 5.07369125e-003, -2.14458227e-001, + 1.13948815e-001, 4.96716321e-001, -1.01674050e-002, + -3.12536843e-002, 2.14390568e-002, 6.26240298e-002, + 2.72170105e-003, -5.54659590e-003, 5.73343923e-003, + 1.19986236e-002, -5.77721803e-004, -6.33957461e-002, + 2.08757017e-002, 1.20051377e-001, 7.17012808e-005, + -6.48574084e-002, 2.01973394e-002, 1.21036664e-001, + 2.08065627e-004, -8.86558555e-003, 2.75856722e-003, + 1.64034273e-002, 3.07575031e-003, -3.33705335e-003, + 7.24127237e-003, 8.45715683e-003, 1.01433732e-002, + -5.73808551e-002, 4.27322239e-002, 7.95008317e-002, + 1.13873966e-002, -6.20227680e-002, 4.29966971e-002, + 7.93407559e-002, 5.38471155e-003, -8.23999406e-004, + 8.14305991e-003, 6.05960423e-003, -1.51280910e-002, + -3.30471061e-002, 3.99828590e-002, 4.88087498e-002, + 6.35074675e-002, -2.46789932e-001, 2.21069723e-001, + 3.39118958e-001, 1.94414109e-001, -1.56965882e-001, + 3.02428514e-001, 2.85379380e-001, 1.07464254e-001, + -5.99475065e-003, 1.18940353e-001, 3.85097414e-002, + -1.88522656e-002, 1.47113856e-003, 3.66571695e-002, + 2.54150834e-002, 1.34830728e-001, 5.17636202e-002, + 2.34486297e-001, 1.50422618e-001, 2.21448705e-001, + 7.78468475e-002, 3.19044173e-001, 1.80511206e-001, + 1.08744293e-001, 5.79220662e-003, 1.22558206e-001, + 3.44812982e-002, -4.50449035e-004, 6.24160049e-004, + 4.70181415e-003, 3.95265874e-003, 1.85695533e-002, + 1.59964412e-002, 3.52064706e-002, 3.31921317e-002, + 3.66733521e-002, 1.43799605e-002, 5.33194467e-002, + 3.74446623e-002, 9.35266726e-003, -2.06462201e-003, + 1.29954303e-002, 5.93745802e-003, -1.97881181e-003, + 2.08896847e-004, 5.64521784e-003, 3.06073762e-003, + -3.09338886e-003, -2.93017505e-003, 2.21546423e-002, + 1.95176955e-002, 6.70079421e-003, -6.68745069e-003, + 3.64756137e-002, 2.14807354e-002, 2.00931728e-002, + 1.97228161e-003, 2.64688954e-002, 4.57318267e-003, + -1.87848415e-002, -1.10911205e-005, 3.94506827e-002, + 2.13202201e-002, -1.58588067e-002, 2.01393068e-002, + 1.36659175e-001, 1.19895443e-001, 3.63181233e-002, + 2.56677363e-002, 2.49240547e-001, 1.32837325e-001, + 1.71335772e-001, 8.03564209e-003, 2.12338880e-001, + 3.43939327e-002, -1.86923649e-002, 2.18006242e-002, + 4.12342101e-002, 4.17094566e-002, 1.11967605e-002, + 1.73387527e-001, 1.47351503e-001, 3.40681404e-001, + 1.22564368e-001, 2.88264841e-001, 2.94072419e-001, + 4.40229863e-001, 1.29985526e-001, 3.06768492e-002, + 1.79168642e-001, 5.88516966e-002, 2.30424548e-003, + 1.06819542e-002, 7.25968136e-003, 1.38812196e-002, + 1.28335441e-002, 1.02502882e-001, 4.13689613e-002, + 1.23032600e-001, 2.17666011e-002, 8.00532326e-002, + 4.29950431e-002, 1.12208128e-001, -2.53576669e-004, + 3.93571718e-005, 9.53486562e-003, 8.48504435e-003, + 1.38973026e-003, 8.48550757e-004, 3.74633982e-003, + 3.47734918e-003, -3.19009414e-003, 4.75269509e-003, + 2.85249706e-002, 3.68416533e-002, 8.83590616e-003, + 2.07535643e-003, 3.24989073e-002, 4.12286445e-002, + 1.77503063e-003, 1.70148350e-003, 4.83152922e-003, + 5.38766664e-003, 1.23339677e-002, 2.98987632e-003, + 3.71842496e-002, 2.60314737e-002, 3.89226452e-002, + 7.45005906e-002, 2.20299378e-001, 2.23788232e-001, + 1.93452567e-001, 2.75172949e-001, 2.94719338e-001, + 3.48253578e-001, -8.32299795e-003, 1.60259102e-002, + 4.51488495e-002, 4.29881737e-002, 1.36661092e-002, + 3.98822920e-003, 3.83371376e-002, 2.87935659e-002, + 1.18393876e-001, 2.74649486e-002, 2.77803183e-001, + 2.41906002e-001, 2.43289322e-002, -2.30741560e-001, + 2.41815656e-001, 3.63216192e-001, -2.77034310e-003, + -2.54806131e-002, 4.28426266e-002, 4.58834916e-002, + 1.63475843e-003, 9.13897413e-004, 4.44125570e-003, + 4.96150553e-003, 9.26459688e-005, 1.06660940e-003, + 3.28382999e-002, 5.18984683e-002, -3.81281134e-003, + 7.58504868e-003, 3.14878151e-002, 5.11042103e-002, + 1.23384281e-003, 1.00893514e-004, 4.20111511e-003, + 5.10428753e-003, 7.27936393e-004, -2.54426821e-004, + 5.06912917e-003, 4.88908682e-003, 3.41030699e-003, + 1.42268883e-002, 3.07955649e-002, 4.46341969e-002, + -4.18339390e-003, 2.33396254e-002, 2.99146846e-002, + 4.76376936e-002, -2.03169510e-003, 5.29046636e-004, + 4.77279862e-003, 4.98667685e-003, 1.88505724e-002, + -7.35985814e-004, 4.76128571e-002, 3.60179953e-002, + -2.97344327e-002, -1.81745365e-002, 2.38403961e-001, + 2.51475066e-001, -6.75313994e-002, -1.90334827e-001, + 2.14080930e-001, 3.43468219e-001, -1.79009456e-002, + -1.81012731e-002, 4.19736989e-002, 3.96669917e-002, + 1.05794230e-002, -1.78676173e-002, 4.80983667e-002, + 4.05767038e-002, 9.25347358e-002, -2.96544433e-002, + 3.32458407e-001, 3.13212365e-001, -2.08748907e-001, + 1.21935323e-001, 3.01349312e-001, 3.47607315e-001, + -7.32508209e-003, -8.66176211e-004, 3.95084359e-002, + 3.50218825e-002, -4.21574747e-004, 1.40183314e-004, + 5.16130961e-003, 4.37905220e-003, 1.68641694e-002, + -1.73715241e-002, 4.30862010e-002, 4.92869765e-002, + -1.70458443e-002, -2.32463647e-002, 4.15493660e-002, + 5.19373380e-002, -3.72756971e-004, 4.56568596e-005, + 5.08059748e-003, 4.86868853e-003, 4.98040207e-003, + 2.61038840e-002, 7.67301256e-003, 4.84894589e-002, + 4.27468214e-003, 1.93786517e-001, 2.33575739e-002, + 3.29910040e-001, -9.81517974e-003, 2.00091258e-001, + 3.88790183e-002, 3.22174460e-001, -3.51005746e-003, + 2.25339383e-002, 1.21458601e-002, 3.91999446e-002, + 6.83316514e-002, -2.09338963e-002, 8.11480582e-002, + 6.02415428e-002, 1.73144545e-002, 8.73486400e-002, + 9.41953436e-002, 1.58770442e-001, -3.45752947e-002, + 9.89154950e-002, 1.08083457e-001, 1.70344755e-001, + -8.27986896e-002, 2.33830642e-002, 1.33915618e-001, + 4.24411595e-002, 1.04321145e-001, -7.44110867e-002, + 1.22729756e-001, 8.65912735e-002, 1.89454749e-001, + -2.91429669e-001, 2.63647139e-001, 3.39328289e-001, + 1.99410990e-002, -4.72663157e-002, 9.97839645e-002, + 1.10732466e-001, -7.24833459e-002, 8.70351493e-003, + 1.00089148e-001, 2.62471326e-002, -1.70180970e-003, + -5.86100575e-003, 9.04429611e-003, 1.23084467e-002, + 1.12310089e-001, -6.64201751e-002, 1.18204884e-001, + 9.92577896e-002, 2.70863120e-002, -2.77237669e-002, + 3.95603143e-002, 4.72277030e-002, -2.63575418e-003, + 1.19193748e-003, 7.31594348e-003, 4.77392739e-003, + -3.60072590e-003, 8.32299585e-004, 5.80790360e-003, + 2.76488042e-003, -1.45108076e-002, -1.11240689e-002, + 3.48514132e-002, 1.91537384e-002, 4.53401469e-002, + -1.11674899e-002, 5.45026287e-002, 2.09282171e-002, + 2.31315289e-003, 1.21036964e-003, 5.59996860e-003, + 2.72010127e-003, -3.21021602e-002, 8.65071546e-003, + 4.47664410e-002, 1.96721014e-002, -1.70513839e-001, + -2.61928560e-003, 2.47165635e-001, 9.40007791e-002, + 3.62221360e-001, -3.73418406e-002, 4.00760055e-001, + 1.01908818e-001, 2.26104334e-002, 1.45704369e-003, + 4.15865183e-002, 1.53429406e-002, -2.17782576e-002, + 8.92482419e-003, 4.01601270e-002, 1.97058655e-002, + -2.50109434e-001, 8.21587592e-002, 3.06139499e-001, + 1.29181981e-001, 3.47908825e-001, 2.35069059e-002, + 3.89249831e-001, 1.07083097e-001, 2.60619801e-002, + -2.24323291e-003, 4.35935520e-002, 1.62664764e-002, + -8.33854603e-004, -3.14922392e-004, 4.92400397e-003, + 2.63958913e-003, -3.53972986e-002, 1.92765482e-002, + 4.84058410e-002, 2.72613522e-002, 3.71565744e-002, + 1.63288526e-002, 5.04714474e-002, 2.54201051e-002, + 3.17098340e-003, -1.09138619e-003, 5.93690621e-003, + 2.81321653e-003, -3.70496814e-003, 3.92351154e-004, + 7.78979296e-003, 7.17163458e-003, -1.04132816e-002, + -2.76347380e-002, 3.87598351e-002, 5.28140292e-002, + 2.77243275e-003, -2.39244364e-002, 3.27184238e-002, + 4.58800383e-002, 1.26031926e-004, -5.29244600e-004, + 4.73394385e-003, 5.31433802e-003, -6.42648190e-002, + 1.17642125e-002, 7.93384388e-002, 5.58253117e-002, + -9.31233317e-002, 6.11644685e-002, 2.45969415e-001, + 3.26365739e-001, 1.80526040e-002, -3.42201404e-002, + 1.92550734e-001, 2.24543497e-001, 1.92402396e-002, + -7.00740516e-003, 3.62571813e-002, 3.27185355e-002, + -4.87911217e-002, 2.86727287e-002, 7.23520964e-002, + 5.83599210e-002, -2.25996971e-001, 1.97176352e-001, + 3.46723855e-001, 4.41665113e-001, -5.23265451e-002, + 5.11358045e-002, 2.22613841e-001, 2.25399449e-001, + 2.20378116e-002, 5.12250978e-003, 3.90009508e-002, + 3.03756315e-002, 4.96193068e-004, -1.20575925e-004, + 6.85492018e-003, 6.13456964e-003, -4.01056148e-002, + 3.86157781e-002, 6.23139255e-002, 6.56279102e-002, + -2.66264044e-002, 4.65123467e-002, 5.14871739e-002, + 6.41984865e-002, 9.58009041e-004, 2.29028007e-003, + 5.71412267e-003, 5.71809988e-003, 3.86371248e-004, + 4.02186997e-004, 6.43571466e-003, 4.82628914e-003, + 5.01139648e-003, 2.31649578e-002, 3.84076349e-002, + 3.63075323e-002, -1.66108273e-002, 3.51314694e-002, + 5.05697243e-002, 5.05171567e-002, -3.68827558e-003, + 9.26950073e-004, 7.28707388e-003, 5.63388877e-003, + 2.77649108e-002, 3.79563397e-004, 4.95463088e-002, + 2.95147486e-002, 7.34439418e-002, 3.32887284e-002, + 2.12087154e-001, 1.48412734e-001, -3.06454953e-002, + 1.12179533e-001, 3.90021861e-001, 1.94157362e-001, + -5.17759323e-002, 8.64893256e-004, 6.96944371e-002, + 3.13903987e-002, 3.81763354e-002, -8.97901785e-003, + 5.76705076e-002, 3.55934910e-002, 9.86828431e-002, + 5.36657944e-002, 2.95609474e-001, 2.70103872e-001, + -1.88393205e-001, -1.87578529e-001, 4.17067975e-001, + 2.99989998e-001, -3.24126557e-002, -1.55223701e-002, + 6.82310164e-002, 3.46063375e-002, 1.36885198e-003, + -5.36970329e-003, 6.91780867e-003, 9.74717457e-003, + -7.54494127e-003, -9.64072719e-002, 5.08550443e-002, + 1.16051994e-001, -1.54905682e-002, -6.72430173e-002, + 4.92810681e-002, 9.24144015e-002, 1.04615965e-003, + -6.57035387e-004, 5.55823231e-003, 6.52963482e-003, + 1.00130029e-002, -6.49160997e-004, 1.33807864e-002, + 4.26469184e-003, 1.96911916e-002, 1.71461366e-002, + 4.47124653e-002, 2.90661156e-002, -5.34156226e-002, + 2.00556368e-002, 6.77216202e-002, 3.44658308e-002, + -3.90850287e-003, 4.82012329e-005, 9.44601186e-003, + 5.06851869e-003, 8.65020677e-002, -4.79233265e-003, + 1.07230932e-001, 2.86896750e-002, 1.64223135e-001, + 2.09264737e-003, 3.00520539e-001, 1.06736824e-001, + -2.88038611e-001, 7.56558925e-002, 3.52823257e-001, + 1.46544084e-001, -5.56493849e-002, 1.85520388e-002, + 8.78182277e-002, 3.85484025e-002, 6.70790225e-002, + -5.39676799e-003, 9.96635258e-002, 3.75436991e-002, + 2.23307058e-001, -1.00335360e-001, 3.32042217e-001, + 1.92136392e-001, -1.62950128e-001, -2.39624754e-002, + 2.46767208e-001, 1.78781003e-001, -7.11942986e-002, + 8.63853842e-003, 9.43103954e-002, 4.28909436e-002, + 1.55141705e-003, -4.21166699e-003, 9.68140643e-003, + 1.21774878e-002, 1.77509822e-002, -1.17996782e-001, + 4.89403270e-002, 1.67351454e-001, 1.32873130e-004, + -1.19619392e-001, 3.78172174e-002, 1.66055530e-001, + -4.24491940e-003, -6.10710448e-003, 8.74687172e-003, + 1.31739415e-002, 7.12433946e-004, -2.03897907e-005, + 3.58625827e-003, 3.62933846e-003, 1.17288381e-002, + 2.22420543e-002, 2.76645571e-002, 3.82921435e-002, + 1.43213840e-002, 3.50011475e-002, 3.27770822e-002, + 5.05237803e-002, 1.36609515e-003, 3.39938165e-003, + 4.55830386e-003, 6.61629252e-003, 2.75865700e-002, + 1.89931709e-002, 3.79007496e-002, 3.11278421e-002, + 2.13486210e-001, 2.14173287e-001, 2.68442571e-001, + 2.94540882e-001, 1.06456876e-001, 1.65616184e-001, + 2.43395060e-001, 3.60361844e-001, -2.91061308e-002, + 3.46325384e-003, 4.21498604e-002, 4.46490236e-002, + 4.13087569e-002, 5.36750769e-003, 4.83754463e-002, + 3.45737822e-002, 9.20789987e-002, -7.64372870e-002, + 1.98110953e-001, 2.78736949e-001, -6.65126741e-002, + -2.60384887e-001, 2.03856677e-001, 3.33431154e-001, + -2.11337917e-002, -3.37661058e-002, 3.89528573e-002, + 4.89000678e-002, 1.57442922e-003, -2.99224840e-003, + 4.45807679e-003, 5.90406731e-003, -7.63245625e-004, + -4.30774838e-002, 2.67597344e-002, 5.70137650e-002, + -4.14376287e-003, -2.82976925e-002, 2.76060645e-002, + 4.96991165e-002, 4.80773218e-004, -1.44047046e-003, + 4.13747644e-003, 5.31413779e-003, 3.72035604e-004, + 9.27797798e-003, 1.20818354e-002, 1.69682577e-002, + 1.22484518e-002, 1.22288570e-001, 5.78640625e-002, + 1.79550156e-001, 3.12056206e-003, 1.27192825e-001, + 3.56264524e-002, 1.85517371e-001, -4.63341037e-003, + 1.15872910e-002, 1.55726131e-002, 1.90611631e-002, + 2.70312149e-002, 1.05001666e-002, 1.08881541e-001, + 3.04630380e-002, 1.43641233e-001, 3.75434682e-002, + 5.25782585e-001, 1.48664042e-001, 5.65424748e-002, + 4.98670563e-002, 2.20828295e-001, 1.30074084e-001, + -8.17288011e-002, 5.04210265e-003, 1.48974687e-001, + 2.47471314e-002, 3.48516069e-002, 1.64950062e-002, + 8.65122825e-002, 3.28999721e-002, 4.01853547e-002, + 3.04148402e-002, 4.44299966e-001, 1.14683598e-001, + 1.02173291e-001, -4.17306228e-003, 2.30491161e-001, + 8.39815214e-002, -8.44352990e-002, 2.33485643e-003, + 1.40377641e-001, 2.02775691e-002, 3.29969870e-003, + 1.20475772e-003, 8.18566419e-003, 4.31954116e-003, + 2.31548678e-003, -4.66147345e-003, 5.06790355e-002, + 2.28395034e-002, 8.85535497e-003, -3.22331372e-003, + 3.30918878e-002, 1.65133234e-002, -8.04446638e-003, + 1.71376672e-003, 1.29483836e-002, 4.62476211e-003, + 1.76254846e-002, -1.88969926e-003, 2.77795680e-002, + 4.41652630e-003, 1.06351841e-002, 1.14434108e-003, + 1.96020175e-002, 1.29774855e-002, -8.33335434e-005, + 3.87817330e-004, 7.83064589e-003, 7.41105061e-003, + -6.41104882e-004, -8.57562263e-005, 1.46575714e-003, + 1.08489406e-003, 1.48824856e-001, -6.79569133e-003, + 2.18783259e-001, 3.05516310e-002, 7.23954663e-002, + 7.52755627e-003, 1.32944047e-001, 8.92203078e-002, + -4.59107896e-003, -2.45885877e-003, 4.99948859e-002, + 6.19035698e-002, -5.65983634e-003, -2.04868658e-004, + 1.24731613e-002, 9.81150381e-003, 1.43544123e-001, + -2.34643035e-002, 2.04809755e-001, 5.39528206e-002, + 5.26381433e-002, -3.61999094e-001, 1.43025473e-001, + 4.22223926e-001, 3.87005945e-004, -3.63429189e-001, + 7.10218474e-002, 4.16151673e-001, -7.54907355e-003, + -5.24846762e-002, 1.71220843e-002, 5.99827319e-002, + 5.67777548e-003, -9.73423943e-003, 1.07930051e-002, + 1.62578784e-002, -5.16773714e-003, -1.14103779e-001, + 2.61291806e-002, 1.76046938e-001, 1.77420396e-003, + -1.16954520e-001, 1.78385712e-002, 1.81201413e-001, + 6.11299591e-004, -1.56468377e-002, 3.30709131e-003, + 2.52980944e-002, 7.67303980e-004, 4.84730490e-003, + 9.03593097e-003, 9.24420543e-003, -1.12873910e-004, + 5.53825609e-002, 2.64938381e-002, 8.80580246e-002, + 1.83939990e-002, 5.62089346e-002, 3.43471467e-002, + 8.89839679e-002, 6.55163371e-004, 4.71199350e-003, + 4.88332473e-003, 1.00303879e-002, 8.02734271e-002, + 2.91258972e-002, 1.21182963e-001, 4.26616780e-002, + -7.37710968e-002, 3.17319810e-001, 2.57416725e-001, + 3.52485329e-001, 9.89485011e-002, 2.77077794e-001, + 3.11092913e-001, 3.18979979e-001, -4.65123206e-002, + 2.36342642e-002, 6.63805157e-002, 3.95244509e-002, + 8.36885348e-002, 1.56202447e-002, 1.15560718e-001, + 2.63781101e-002, -7.03971609e-002, 1.35996444e-002, + 2.25910857e-001, 9.56450403e-002, 2.83287261e-002, + -4.62947190e-002, 3.43361467e-001, 1.22615792e-001, + -5.08939959e-002, -5.74340718e-003, 6.85586780e-002, + 2.59976368e-002, 6.81825029e-003, 1.72119495e-003, + 1.15671773e-002, 3.14676110e-003, -7.89477676e-003, + -2.68789660e-003, 3.14119495e-002, 1.30906738e-002, + -9.03922319e-003, -3.26895551e-003, 5.32587506e-002, + 1.78939532e-002, -4.46979934e-003, 1.35276990e-003, + 8.41446407e-003, 3.26595362e-003, 1.89789291e-002, + -4.52619791e-003, 2.82740407e-002, 6.73630321e-003, + 9.06412024e-003, 2.81206740e-004, 2.07586754e-002, + 1.13295922e-002, -9.53839393e-004, 1.53555127e-003, + 9.01862793e-003, 6.98903762e-003, -2.32783658e-003, + -1.47013896e-004, 3.93099990e-003, 1.68116856e-003, + 1.76747426e-001, -5.71347727e-003, 2.76768714e-001, + 3.39761227e-002, 6.74046651e-002, -5.03995689e-003, + 1.49266437e-001, 8.27085599e-002, -1.45453615e-002, + -1.28070936e-002, 5.56600764e-002, 6.24992661e-002, + -2.48428620e-002, -5.86171728e-003, 3.82034406e-002, + 1.53810587e-002, 1.84462368e-001, -1.30827073e-002, + 2.75164962e-001, 4.61187772e-002, 6.54363409e-002, + -1.28927276e-001, 1.66673273e-001, 2.27842063e-001, + -1.40152313e-002, -1.14277549e-001, 7.24021345e-002, + 1.90953001e-001, -3.17059457e-002, -1.59761012e-002, + 4.86448444e-002, 3.33326086e-002, 1.08296489e-002, + -2.56141908e-002, 1.92166567e-002, 3.83531414e-002, + -5.29666897e-004, -2.78895885e-001, 3.30350772e-002, + 3.90076041e-001, 5.72269270e-003, -2.83678681e-001, + 2.52124332e-002, 4.02075440e-001, -4.57629329e-004, + -3.62164415e-002, 6.62843836e-003, 5.30124642e-002, + -1.11582205e-002, 9.53415583e-004, 1.55076813e-002, + 4.15192731e-003, -1.09679429e-002, -2.37605460e-002, + 7.39281401e-002, 3.69090959e-002, 1.94377434e-002, + -1.64805483e-002, 4.47896831e-002, 3.43992971e-002, + 3.04943440e-003, 1.03234267e-003, 6.89421594e-003, + 4.36733197e-003, -1.28743678e-001, -4.07976238e-003, + 1.51495397e-001, 2.68022269e-002, -1.19218668e-002, + -5.10698147e-002, 4.70816851e-001, 1.49506986e-001, + 1.79543108e-001, -9.62078944e-003, 2.78156161e-001, + 1.36916697e-001, 3.40797715e-002, 3.91252711e-003, + 5.39000109e-002, 2.50812806e-002, -1.41936973e-001, + -9.35586542e-003, 1.61275014e-001, 2.57711150e-002, + 5.66888303e-002, 2.67902315e-002, 4.41444308e-001, + 1.19776256e-001, 1.92103669e-001, 4.27865423e-002, + 2.98687428e-001, 1.28920481e-001, 2.85674576e-002, + 3.20508098e-003, 5.29180951e-002, 2.32867915e-002, + -1.49935447e-002, -1.97129557e-003, 1.81307085e-002, + 4.85682115e-003, 8.71266425e-003, 2.06860267e-002, + 5.76637387e-002, 3.21643911e-002, 2.83388402e-002, + 1.50613505e-002, 4.60655764e-002, 3.11439689e-002, + 1.63046131e-003, -7.27391336e-004, 6.97528711e-003, + 4.39534476e-003, 1.32056409e-002, -3.08183674e-003, + 2.09101290e-002, 6.58102334e-003, 1.29380189e-002, + -1.82978739e-003, 2.96450406e-002, 2.24079452e-002, + -9.91141656e-004, 4.16766526e-003, 1.82250049e-002, + 2.69281697e-002, -5.23837749e-003, -1.95568384e-004, + 7.70508032e-003, 4.04042099e-003, 1.45597786e-001, + -5.74542256e-003, 2.15709060e-001, 3.66077423e-002, + 1.80239640e-002, -2.00821646e-002, 2.71021068e-001, + 1.47090450e-001, 5.77085875e-002, -2.80024968e-002, + 1.50770009e-001, 1.21794306e-001, -3.11835296e-002, + 4.83946363e-003, 4.65476848e-002, 2.03601643e-002, + 1.69091046e-001, -1.50763765e-002, 2.34937981e-001, + 4.57500294e-002, 3.63125317e-002, -1.00671068e-001, + 2.37603053e-001, 2.65611351e-001, 3.46937515e-002, + -9.32299495e-002, 1.38004556e-001, 2.57404953e-001, + -2.16272995e-002, -1.50187695e-002, 3.84778902e-002, + 3.85537893e-002, 1.10169491e-002, -2.37038657e-002, + 1.71175841e-002, 3.47833149e-002, 1.91903336e-003, + -2.45210767e-001, 3.53416130e-002, 3.34365904e-001, + 2.93298205e-003, -2.41154477e-001, 2.70228069e-002, + 3.39069307e-001, 1.03055546e-003, -3.21843103e-002, + 6.30802754e-003, 4.51718718e-002, 1.41209527e-003, + -1.90737576e-003, 4.98726685e-003, 4.51006927e-003, + 1.01096258e-002, -5.43930521e-003, 3.61862406e-002, + 3.72759067e-002, -3.39565165e-002, -1.88250244e-002, + 5.44485673e-002, 4.37305905e-002, 2.64843996e-003, + -1.40445388e-003, 6.19487790e-003, 4.03352967e-003, + -2.17624046e-002, -1.82713475e-002, 4.38660197e-002, + 3.59877199e-002, 1.84757337e-001, -3.18248332e-001, + 3.21517169e-001, 3.80470514e-001, -1.85171947e-001, + -1.06180757e-001, 3.72155517e-001, 2.35661969e-001, + 3.20810117e-002, -3.23420833e-003, 5.44544458e-002, + 3.23553383e-002, -2.06055008e-002, 8.72138329e-003, + 4.09046449e-002, 3.12976055e-002, 5.90908192e-002, + 7.96176195e-002, 2.29459539e-001, 2.06562266e-001, + 3.27803120e-002, 2.60424241e-002, 2.17292830e-001, + 1.71501860e-001, 1.76037475e-002, 5.79920106e-006, + 4.40918878e-002, 2.77764536e-002, -2.51126883e-004, + -6.92724949e-004, 4.75406926e-003, 3.94283561e-003, + -3.10880714e-003, -3.39074410e-004, 3.13349813e-002, + 3.44428271e-002, 8.16878956e-003, 1.09881524e-003, + 3.41738127e-002, 3.51036638e-002, 5.47025877e-004, + -6.95373747e-004, 4.52382350e-003, 4.13652882e-003, + -3.42876161e-003, -6.98866742e-003, 9.08405893e-003, + 1.40210763e-002, 7.56833842e-003, -1.19282879e-001, + 4.51784171e-002, 1.67128816e-001, 6.43699849e-003, + -1.24637634e-001, 4.95574251e-002, 1.67468041e-001, + 2.40992126e-003, -6.29011588e-003, 9.07869358e-003, + 1.53142465e-002, -9.15075839e-002, 4.64412477e-003, + 1.04631267e-001, 4.35410850e-002, -6.38875142e-002, + -7.48379827e-002, 1.80437595e-001, 2.22124502e-001, + 1.87828511e-001, -5.92624620e-002, 2.48284832e-001, + 2.23612577e-001, 7.58577138e-002, 1.76201575e-002, + 9.58390757e-002, 5.68092614e-002, -7.91533068e-002, + 1.33310119e-002, 1.01283863e-001, 4.12546322e-002, + -1.48838326e-001, 1.20405771e-001, 2.39482120e-001, + 1.92808926e-001, 3.17184180e-001, 1.37051538e-001, + 3.66446614e-001, 2.09678188e-001, 7.01371282e-002, + 2.46880762e-002, 9.95559096e-002, 4.60574441e-002, + -4.82784398e-003, -6.27209432e-004, 1.07727284e-002, + 5.74793294e-003, -2.79337782e-002, 2.18983311e-002, + 5.12542538e-002, 3.98211032e-002, 5.67525476e-002, + 2.08578669e-002, 7.10581914e-002, 4.89839725e-002, + 2.38885800e-003, -3.08640162e-003, 1.03559084e-002, + 7.78588606e-003, 3.67656304e-003, 3.34189972e-003, + 5.14624780e-003, 9.78124142e-003, -1.26801990e-002, + 7.83045143e-002, 4.71753180e-002, 1.51857793e-001, + 2.62265317e-002, 7.81126022e-002, 4.14011292e-002, + 1.59409836e-001, 1.65761303e-005, 1.04185538e-002, + 2.81856325e-003, 2.28843633e-002, 6.58180937e-002, + -1.79790915e-003, 7.26784840e-002, 2.78007016e-002, + -1.25232577e-001, 5.61704226e-002, 4.81152952e-001, + 1.74125269e-001, 2.52749711e-001, 7.81400576e-002, + 3.23183924e-001, 1.34899333e-001, -4.12223907e-003, + 5.97448787e-003, 1.32331513e-002, 1.51473787e-002, + 3.66931446e-002, -1.29877534e-002, 5.06946072e-002, + 2.60525923e-002, 1.98723480e-001, -1.56914979e-001, + 3.53639513e-001, 2.60633737e-001, 7.08161294e-002, + 3.82688479e-003, 1.84264898e-001, 1.02780506e-001, + 1.03533268e-003, -5.97470254e-003, 1.20262103e-002, + 1.22704888e-002, 1.20482058e-003, 2.78151361e-004, + 5.56181837e-003, 3.41198966e-003, 4.47167233e-002, + -2.38288399e-002, 6.02623746e-002, 3.35751846e-002, + 1.80067625e-002, -2.05779821e-002, 3.40854004e-002, + 2.59864181e-002, -4.18487361e-005, -1.40403130e-003, + 1.63604261e-003, 2.52205017e-003, 2.23135925e-003, + 1.30197534e-003, 6.07227255e-003, 5.26877912e-003, + 9.80108604e-003, 4.56156395e-002, 4.24742289e-002, + 7.03627393e-002, -8.46046396e-003, 4.63926308e-002, + 5.40388823e-002, 7.40533769e-002, -8.32801510e-004, + 3.23944143e-003, 5.62913297e-003, 8.91475659e-003, + 2.81320382e-002, -2.34957016e-003, 4.86738458e-002, + 2.30867732e-002, 1.40906602e-001, 4.87614088e-002, + 3.41252387e-001, 1.42254993e-001, -8.24360847e-002, + 7.02397823e-002, 4.98901784e-001, 1.79703310e-001, + -1.56918094e-002, 6.99880160e-003, 4.34652753e-002, + 2.34166998e-002, 1.82497334e-002, -6.16017496e-003, + 4.42847684e-002, 2.47399062e-002, 2.67333269e-001, + -1.27810165e-001, 3.44027668e-001, 2.14701295e-001, + -7.12215751e-002, 3.24788205e-002, 2.91407645e-001, + 1.59609511e-001, -1.95706300e-002, 7.73607893e-003, + 4.12725210e-002, 2.40565110e-002, 1.35130482e-004, + 5.87943883e-004, 4.79987729e-003, 3.36831133e-003, + 3.95139754e-002, -2.10476257e-002, 5.31235412e-002, + 3.89287770e-002, 4.35794238e-003, -2.70064417e-002, + 3.90821211e-002, 3.80326621e-002, -1.70353218e-003, + -6.60260557e-004, 4.98709362e-003, 3.58469621e-003, + 3.35493428e-003, -2.31384081e-004, 6.60338392e-003, + 3.53649841e-003, 1.66865196e-002, 1.36947921e-002, + 3.25152017e-002, 2.49032900e-002, -3.53922043e-003, + 1.50139956e-002, 2.83893812e-002, 2.71606836e-002, + -3.67719424e-003, -3.60897364e-004, 6.70602685e-003, + 4.36361087e-003, 4.09112275e-002, 8.41302332e-004, + 5.53048812e-002, 2.28702687e-002, 1.28675058e-001, + 3.34938504e-002, 2.00673744e-001, 1.06970891e-001, + -1.88834835e-002, 3.71163413e-002, 1.81975141e-001, + 1.16173640e-001, -5.25426753e-002, -7.98252877e-003, + 6.56578913e-002, 3.37604843e-002, 4.47024330e-002, + -6.44838717e-003, 5.79495467e-002, 2.62708254e-002, + 4.62290794e-002, -1.37922868e-001, 2.36441508e-001, + 2.03315943e-001, -1.81510463e-001, -4.66651529e-001, + 2.87694544e-001, 4.90471721e-001, -4.30964902e-002, + -5.76362945e-002, 6.34526983e-002, 6.90355599e-002, + 2.66015250e-003, -4.00859118e-003, 6.88023120e-003, + 6.67537889e-003, -3.07201315e-002, -6.33280352e-002, + 5.66047169e-002, 7.59194121e-002, -2.74921842e-002, + -2.73559876e-002, 4.46654148e-002, 5.36484793e-002, + 1.61531719e-003, -8.30357822e-005, 4.86370362e-003, + 5.70098730e-003, 5.20510133e-003, -2.21302453e-003, + 1.25183286e-002, 6.09893026e-003, 2.42898855e-002, + 7.43166124e-003, 4.08831313e-002, 2.35326365e-002, + -6.66292384e-003, 8.99123214e-003, 2.44419258e-002, + 2.20882110e-002, -1.16733685e-002, -3.16659152e-003, + 1.81619078e-002, 6.38693199e-003, 7.43015856e-002, + -1.19429212e-002, 1.48818731e-001, 4.80405129e-002, + 1.83314160e-001, 1.65841486e-002, 2.54589468e-001, + 1.13374270e-001, -6.09883927e-002, 7.00640865e-003, + 1.39327288e-001, 8.98848325e-002, -1.23338006e-001, + -6.51265029e-003, 1.87236920e-001, 4.00198177e-002, + 9.21804607e-002, -1.65872667e-002, 1.59318492e-001, + 5.25956042e-002, 1.70404360e-001, -2.30027080e-001, + 2.61933595e-001, 3.09825718e-001, -7.92384297e-002, + -2.44809687e-001, 1.85500771e-001, 3.13322812e-001, + -1.16979830e-001, -1.75097957e-002, 1.84891164e-001, + 4.81431559e-002, 4.78243362e-003, -4.31177020e-003, + 1.30245946e-002, 1.46375997e-002, 1.24762941e-003, + -7.56648332e-002, 4.70487662e-002, 1.71883538e-001, + -2.35420396e-003, -8.89780596e-002, 4.07618508e-002, + 1.83640957e-001, -2.00394541e-003, -5.99988503e-003, + 1.37780067e-002, 1.69243831e-002, 3.64120002e-003, + -1.79818328e-002, 7.13798637e-003, 2.36211475e-002, + -8.36881169e-004, -1.74317792e-001, 4.64359485e-002, + 2.05320299e-001, 8.98172846e-004, -1.59219339e-001, + 6.70857877e-002, 1.86270267e-001, 1.04062920e-002, + -4.12687333e-003, 1.65277217e-002, 1.30646462e-002, + -5.87530388e-003, -2.47012060e-002, 2.10013445e-002, + 3.79484482e-002, -1.88243724e-002, -1.67529151e-001, + 1.07763648e-001, 2.44292736e-001, 2.37248406e-001, + -1.30218700e-001, 3.30083191e-001, 2.39669025e-001, + 1.80634007e-001, 3.88050568e-003, 2.09455580e-001, + 3.81536447e-002, -7.90061057e-003, 1.97215169e-003, + 1.82509702e-002, 1.33870859e-002, -8.02660361e-003, + 8.41318443e-003, 8.26665759e-002, 7.99529776e-002, + 2.67483532e-001, 7.71090295e-003, 3.40396166e-001, + 9.76443440e-002, 1.86542749e-001, 2.10730266e-003, + 2.15689510e-001, 2.91083604e-002, -8.31079786e-004, + 6.75234129e-004, 3.22662923e-003, 2.71376758e-003, + -1.76371250e-003, 7.69818202e-003, 1.55002307e-002, + 1.61868688e-002, 3.99414375e-002, 8.02045316e-003, + 5.61552718e-002, 2.01973226e-002, 2.26068478e-002, + -8.59408930e-004, 2.71050930e-002, 5.01371687e-003, + 1.14861724e-003, 1.50513742e-003, 5.50795300e-003, + 4.71740356e-003, -1.86856429e-003, 2.33288463e-002, + 3.86340208e-002, 3.95905413e-002, 2.00784812e-003, + 2.90869698e-002, 3.12437061e-002, 4.19260003e-002, + -3.27296834e-003, 1.58889254e-003, 5.94886206e-003, + 3.61894886e-003, 3.61735933e-002, -2.01671734e-003, + 5.72656095e-002, 3.85267325e-002, -3.11265606e-002, + 1.88015297e-001, 3.69316757e-001, 2.48565137e-001, + -1.64857716e-003, 9.81145948e-002, 1.91375405e-001, + 1.69773683e-001, -5.50316311e-002, 1.00874947e-002, + 6.64951727e-002, 2.45436896e-002, 2.23797094e-002, + -1.38527220e-002, 5.10221794e-002, 2.81748716e-002, + 3.92138511e-002, -4.30637524e-002, 6.49698496e-001, + 1.75239921e-001, -4.05457392e-002, -2.49719433e-002, + 1.84973821e-001, 1.12328053e-001, -4.88360636e-002, + 1.32316170e-004, 6.27473220e-002, 2.15638708e-002, + 5.39895729e-004, 1.22886524e-003, 6.13088813e-003, + 3.43482685e-003, 1.59300845e-002, -1.68861840e-002, + 8.15144256e-002, 3.22992131e-002, -1.13205090e-002, + -1.05855735e-002, 3.30026187e-002, 2.62900740e-002, + -3.78088956e-003, 1.53493806e-004, 6.45236997e-003, + 3.45515180e-003, -8.02707672e-003, -7.40883825e-003, + 1.10471668e-002, 1.32651906e-002, -3.63130891e-003, + -1.55680418e-001, 3.69757935e-002, 1.91082507e-001, + 1.29512008e-002, -1.51351407e-001, 4.08575721e-002, + 1.89852118e-001, 5.36770327e-003, -4.48594429e-003, + 1.30090201e-002, 1.14631671e-002, -1.25502214e-001, + -1.11660687e-003, 1.35139346e-001, 3.00246701e-002, + -9.36462581e-002, 4.54396755e-002, 2.23663732e-001, + 2.34369293e-001, 1.53965920e-001, 2.84844097e-002, + 3.34531516e-001, 2.55160838e-001, 1.24421395e-001, + -8.98631930e-004, 1.68898270e-001, 3.33501361e-002, + -1.29866973e-001, -2.05308013e-003, 1.43026441e-001, + 1.95240621e-002, -1.14211885e-004, 2.77220048e-002, + 2.20706537e-001, 1.29763022e-001, 2.17893459e-002, + 2.71288343e-002, 3.24601620e-001, 1.40689954e-001, + 1.42685577e-001, -3.21800751e-003, 1.92560256e-001, + 2.52667293e-002, -1.57271400e-002, -1.51062827e-003, + 1.90329328e-002, 3.72170494e-003, 2.65013357e-003, + 8.81872140e-003, 3.53813209e-002, 2.39379909e-002, + 4.97067859e-003, 7.94091914e-003, 5.45118712e-002, + 2.49662325e-002, 1.67793836e-002, -5.99640844e-005, + 2.57613100e-002, 4.23984602e-003, 9.11585521e-004, + 1.23175501e-003, 5.51634468e-003, 3.99949821e-003, + -4.44465801e-002, -3.61757427e-002, 6.60553426e-002, + 5.53800389e-002, -9.87967011e-003, -4.98970933e-002, + 4.37918715e-002, 6.27485812e-002, 4.71158302e-004, + -2.10690009e-003, 5.02164336e-003, 5.59445005e-003, + -3.66213843e-002, -2.46193092e-002, 5.99575639e-002, + 3.99093330e-002, -3.15856785e-001, -2.69604474e-001, + 4.51675951e-001, 3.45172763e-001, 4.54344265e-002, + -4.02648859e-002, 1.75692856e-001, 2.02505335e-001, + 2.07604691e-002, -9.98175610e-003, 3.57741714e-002, + 3.04054283e-002, -8.15729126e-002, -2.75970101e-002, + 9.48362425e-002, 4.20563407e-002, 3.64288725e-002, + 3.95796970e-002, 3.55688095e-001, 1.79478407e-001, + -1.54695055e-002, 9.96134281e-002, 1.76530808e-001, + 1.78467497e-001, 1.84328146e-002, 7.80479470e-003, + 3.20577584e-002, 2.53488608e-002, -6.83331536e-003, + -1.31273479e-003, 1.02121141e-002, 5.08186920e-003, + 1.34789683e-002, 1.81757342e-002, 4.47204001e-002, + 3.28160748e-002, -4.18463023e-005, 1.28999650e-002, + 3.20588164e-002, 3.07000652e-002, 4.80672694e-004, + 8.51778605e-004, 4.23426880e-003, 4.02227556e-003, + 1.86226374e-004, -1.31816021e-003, 2.59128795e-003, + 3.27449734e-003, -1.16092488e-002, -1.36232646e-002, + 2.45352481e-002, 2.60935836e-002, -1.54920826e-002, + -1.29484646e-002, 6.89565390e-002, 2.53210329e-002, + 2.30698823e-003, -9.56227814e-005, 4.72718989e-003, + 2.70532747e-003, -1.09986113e-002, -4.49674055e-002, + 2.19032150e-002, 5.42535856e-002, -1.66546665e-002, + -3.14189941e-001, 1.45049676e-001, 3.55420709e-001, + 1.04721477e-002, -1.77834049e-001, 3.56747538e-001, + 2.38752276e-001, 2.45233011e-002, -2.40357965e-002, + 3.75254489e-002, 3.69298123e-002, -1.18358061e-002, + 4.28921022e-002, 2.11354587e-002, 5.41989766e-002, + -3.27079110e-002, 2.90153384e-001, 1.31759584e-001, + 3.47058922e-001, 2.40639262e-002, 1.81866989e-001, + 2.74744272e-001, 2.51230389e-001, 2.16414258e-002, + 1.67539883e-002, 3.42084765e-002, 3.88511345e-002, + 2.38018438e-005, 1.55139586e-003, 2.33600964e-003, + 3.42549360e-003, -1.21949650e-002, 1.39298271e-002, + 2.49184240e-002, 2.66312957e-002, -9.63842310e-003, + 1.30343661e-002, 5.84793612e-002, 2.57744920e-002, + 1.40069937e-003, 5.92209457e-004, 4.40399488e-003, + 3.01517523e-003, -3.46985064e-004, -5.03952142e-005, + 5.31752501e-003, 6.35228213e-003, 2.53152940e-002, + 3.42324302e-002, 4.69049960e-002, 5.95137887e-002, + 2.16109445e-003, 3.86528634e-002, 3.99573036e-002, + 5.54553233e-002, -1.97702274e-003, 5.33642597e-004, + 5.26886526e-003, 4.83393809e-003, 2.54760217e-002, + 1.68767218e-002, 5.05727418e-002, 5.46420999e-002, + 2.13189602e-001, 1.15637712e-001, 3.31940383e-001, + 4.94554579e-001, -1.37116805e-001, 2.71728691e-002, + 2.58520067e-001, 1.81873605e-001, -2.63011623e-002, + -2.54576467e-003, 4.74528745e-002, 3.08478847e-002, + 3.69306542e-002, -1.41723664e-003, 5.85495159e-002, + 3.99739146e-002, 1.23647198e-001, -2.37187631e-002, + 2.38696530e-001, 2.58105665e-001, -1.77942291e-001, + -4.77271676e-002, 2.85946369e-001, 1.56311914e-001, + -2.13065092e-002, -7.48645468e-003, 4.57693934e-002, + 3.08453776e-002, 1.84981676e-003, 2.12969506e-004, + 6.61364151e-003, 5.78347594e-003, 1.69476066e-002, + -2.48001497e-002, 3.87588926e-002, 4.54713553e-002, + -1.71788558e-002, -2.28241533e-002, 4.02273573e-002, + 3.85270342e-002, -1.31283817e-003, 6.63753424e-004, + 5.56732854e-003, 4.32373071e-003, -2.59263651e-003, + -6.65440457e-004, 6.39319373e-003, 4.11480479e-003, + -3.46953352e-003, -2.36233175e-002, 3.10438070e-002, + 3.83906141e-002, 3.24174725e-002, -1.70276947e-002, + 4.72923927e-002, 3.89629677e-002, 6.42905897e-003, + 2.20905524e-003, 1.09989131e-002, 5.60652558e-003, + -2.90253069e-002, 3.31235188e-003, 4.13050540e-002, + 2.76916716e-002, -2.53912117e-002, 2.24262699e-002, + 1.52028248e-001, 1.49900660e-001, 2.14929134e-001, + -3.26696411e-002, 2.86391824e-001, 1.57241821e-001, + 6.74641728e-002, -1.96131021e-002, 8.69787857e-002, + 4.39449362e-002, -2.65153255e-002, 3.10135316e-002, + 5.00398688e-002, 5.10357581e-002, -8.82840082e-002, + 2.01645777e-001, 1.92476094e-001, 2.95728713e-001, + 1.59509063e-001, 1.39415428e-001, 2.85971344e-001, + 2.80103922e-001, 4.78431731e-002, 1.64858438e-002, + 7.82329068e-002, 6.05795681e-002, 2.55108043e-003, + 1.47819733e-002, 8.47461913e-003, 2.41835117e-002, + 5.80782024e-003, 1.79729596e-001, 5.25040440e-002, + 2.48616025e-001, 6.90247398e-004, 2.04886511e-001, + 5.61831258e-002, 2.63205618e-001, -1.71787839e-003, + 1.03712017e-002, 1.29396813e-002, 2.11048536e-002, + 7.52221036e-004, -1.26726954e-004, 5.59074292e-003, + 3.45530384e-003, 1.18463486e-003, 9.13447607e-003, + 5.20339385e-002, 3.44187580e-002, -5.62683446e-003, + 1.04888463e-002, 3.85360345e-002, 3.23285684e-002, + -6.88143016e-004, 1.46538601e-004, 4.84671723e-003, + 4.09424258e-003, 1.26695400e-002, 1.80267857e-003, + 4.32734340e-002, 2.39847396e-002, -1.37384254e-002, + 4.61643748e-002, 4.34518188e-001, 1.90165043e-001, + -9.27215163e-003, 3.25765945e-002, 2.69707650e-001, + 2.08064899e-001, -1.85836218e-002, 1.76061818e-003, + 4.27262969e-002, 2.94757877e-002, 1.56526342e-002, + -3.07228882e-003, 4.52620797e-002, 2.96953302e-002, + 3.31496522e-002, -9.80771706e-002, 3.20279747e-001, + 3.21695238e-001, -4.37824503e-002, -3.09181865e-002, + 3.20898205e-001, 3.85530978e-001, -1.57355126e-002, + -7.30920304e-003, 4.23619039e-002, 3.69138345e-002, + 1.34899688e-004, -5.74111647e-004, 4.79741115e-003, + 3.98567459e-003, -1.11334759e-003, -1.51997106e-002, + 3.93949002e-002, 4.14542519e-002, 3.27371294e-003, + -1.55838095e-002, 3.83089297e-002, 4.41002101e-002, + -5.90957876e-004, -7.91987113e-005, 4.46587754e-003, + 4.32963157e-003, 3.31658777e-003, -1.05587300e-003, + 5.97378612e-003, 1.01491939e-002, -1.72577538e-002, + -7.00797439e-002, 4.14733365e-002, 9.89260525e-002, + -4.05085906e-002, -1.02858774e-001, 6.47240505e-002, + 1.17111683e-001, 7.22425710e-003, -4.17799642e-003, + 1.48019744e-002, 8.62815790e-003, -2.27564983e-002, + -6.63803890e-002, 3.52139398e-002, 7.83590004e-002, + -5.58208935e-002, -3.72597009e-001, 1.65406600e-001, + 4.68772531e-001, -5.36271073e-002, -1.66878074e-001, + 2.75772512e-001, 2.71215588e-001, 1.43652931e-001, + 9.64281266e-004, 1.74762920e-001, 3.26237455e-002, + -1.50290858e-002, 2.34136544e-003, 3.11335307e-002, + 2.48657987e-002, 1.44594302e-002, 3.45998593e-002, + 1.38346717e-001, 1.25195488e-001, 5.94761735e-003, + 1.25080636e-002, 2.59729147e-001, 1.14005826e-001, + 1.38629973e-001, -4.60010814e-003, 1.74479559e-001, + 2.81239152e-002, -1.34839024e-003, 3.37739405e-003, + 4.79178503e-003, 6.28814287e-003, -7.91021250e-003, + 1.88464914e-002, 2.59633772e-002, 3.65990289e-002, + 1.64833281e-003, 1.74697973e-002, 4.25480306e-002, + 3.19722816e-002, 1.38249109e-002, -1.36349862e-003, + 2.01439522e-002, 4.59381379e-003, -1.64641402e-004, + -4.04173479e-004, 3.58811277e-003, 3.51981586e-003, + 1.48628419e-003, 3.48016899e-003, 2.50876751e-002, + 2.44193599e-002, 9.21602082e-003, 8.59159045e-003, + 6.05519265e-002, 2.68160272e-002, 7.13967311e-004, + 7.30255037e-004, 6.54868642e-003, 3.33576859e-003, + 2.21545482e-003, 1.17019322e-002, 2.92588249e-002, + 2.97803860e-002, -7.92404637e-003, 9.33405682e-002, + 1.48929015e-001, 1.89269349e-001, 8.67320001e-002, + 4.09430824e-002, 5.09591103e-001, 1.61255985e-001, + -1.77204155e-003, 5.68440533e-004, 5.17220609e-002, + 1.98756251e-002, 4.88318177e-003, -7.80621031e-003, + 3.33701894e-002, 5.28696515e-002, 5.41221611e-002, + -1.74460728e-002, 1.88377142e-001, 4.30440098e-001, + -2.47789379e-002, 7.71614583e-003, 4.11523610e-001, + 2.40406275e-001, -2.10693525e-003, 3.17033357e-003, + 4.96479496e-002, 2.99403984e-002, -5.59468172e-004, + 1.77953516e-005, 4.02552774e-003, 6.21560868e-003, + 8.25765543e-003, -1.42405857e-003, 3.67207192e-002, + 4.62592654e-002, 1.08522000e-002, -2.32805824e-003, + 5.98602816e-002, 4.32243608e-002, -6.05787616e-004, + 2.42577851e-004, 6.52677892e-003, 4.45520971e-003, + 2.76852166e-003, -8.34983541e-004, 5.25853876e-003, + 4.78431163e-003, 1.51227145e-002, 2.03391425e-002, + 3.41737792e-002, 3.35749276e-002, 4.36852220e-003, + 2.12276485e-002, 3.42700258e-002, 4.05239835e-002, + -2.52573285e-003, -1.11811177e-003, 7.11218221e-003, + 5.08506503e-003, 3.86714861e-002, 1.24720838e-002, + 5.08760847e-002, 3.12606245e-002, 7.61479884e-002, + 1.12062760e-001, 1.96651518e-001, 2.05659911e-001, + 6.51840642e-002, 1.43229410e-001, 2.91841924e-001, + 2.17187658e-001, -5.43823019e-002, 1.91386137e-002, + 7.49107897e-002, 3.96408252e-002, 4.97247502e-002, + -1.45514207e-002, 6.17339611e-002, 5.66507317e-002, + 1.12742662e-001, -5.13944663e-002, 2.38511488e-001, + 3.95964354e-001, 1.31948814e-001, 7.17137009e-004, + 2.59704411e-001, 3.10301483e-001, -5.14029115e-002, + 2.15244200e-002, 7.10075423e-002, 5.27296364e-002, + 1.73363881e-003, -1.04769031e-002, 5.47071686e-003, + 1.68058686e-002, 1.27297062e-002, -1.38758853e-001, + 3.63955274e-002, 1.91837609e-001, 2.91840266e-002, + -1.58084959e-001, 4.39441353e-002, 2.02974558e-001, + 8.37585772e-004, -1.37619274e-002, 6.62360340e-003, + 1.94775686e-002, 3.27803369e-004, -5.33757091e-004, + 6.18692674e-003, 4.05589771e-003, -2.76383682e-004, + -6.25664555e-003, 5.37534207e-002, 4.45099324e-002, + 4.63864207e-003, -1.09774191e-002, 4.52622399e-002, + 4.58335504e-002, -6.29627320e-005, 3.87704968e-005, + 5.06274030e-003, 4.32718452e-003, -2.84210127e-003, + -8.57501570e-003, 5.22448309e-002, 3.03079318e-002, + 3.86017933e-002, -7.93132558e-002, 4.83269244e-001, + 2.86461920e-001, 3.11897527e-002, 2.50743958e-003, + 3.37397307e-001, 2.13424429e-001, 8.01136158e-003, + -4.99300705e-003, 4.60651517e-002, 3.20640355e-002, + -4.27142996e-003, -1.06073003e-002, 4.94018868e-002, + 3.32895257e-002, 5.94639592e-002, -5.89034334e-002, + 3.24358553e-001, 2.39677593e-001, 7.89630786e-003, + -1.32399052e-001, 2.58479208e-001, 2.55604565e-001, + 9.95129719e-003, -1.81891527e-002, 4.62219380e-002, + 3.70838307e-002, 1.52333116e-004, -6.90068773e-005, + 5.42562315e-003, 4.23521735e-003, 1.66372850e-003, + 1.28490687e-003, 3.51890586e-002, 3.92919183e-002, + 3.73867573e-004, 2.11879914e-003, 3.23241800e-002, + 4.05631587e-002, 1.00262032e-003, 9.68229870e-006, + 4.77328617e-003, 5.36736660e-003, 5.59988339e-003, + 1.71302434e-003, 9.29309614e-003, 6.47302484e-003, + -4.59645735e-003, 3.71168144e-002, 3.84372808e-002, + 5.78700900e-002, -5.33113815e-003, 3.04497238e-002, + 3.59558314e-002, 6.14841878e-002, 1.32748648e-003, + 2.76901806e-003, 5.07515715e-003, 8.23519100e-003, + 8.58329460e-002, -6.09076815e-004, 9.94224697e-002, + 3.74424681e-002, 8.84357914e-002, 1.71468392e-001, + 2.04253390e-001, 2.39608839e-001, -3.42158340e-002, + 2.65012383e-001, 1.43150672e-001, 3.07535440e-001, + -1.11470735e-002, 3.08231525e-002, 2.83209756e-002, + 4.37656641e-002, 7.72918537e-002, -2.22982019e-002, + 9.09510180e-002, 4.84188721e-002, 1.91579327e-001, + -2.72829920e-001, 2.44132787e-001, 3.46910506e-001, + -2.33611465e-003, -2.10956976e-001, 1.12750165e-001, + 2.95897692e-001, -1.68745276e-002, -2.35843658e-002, + 2.94871461e-002, 4.29613255e-002, 1.46999431e-003, + -2.40769540e-003, 6.25330396e-003, 9.44812875e-003, + 7.73691572e-003, -7.90743157e-002, 3.28901038e-002, + 1.18888989e-001, 7.73730502e-003, -1.02619477e-001, + 2.89676040e-002, 1.41587704e-001, 1.35345687e-003, + -1.14994198e-002, 4.71179234e-003, 1.76804587e-002, + -8.73311516e-003, -2.96265032e-004, 1.31530138e-002, + 5.27545484e-003, 1.41940592e-002, -8.57935026e-002, + 6.83441758e-002, 9.64536294e-002, 1.07343040e-001, + -1.39529034e-001, 1.56038627e-001, 1.71288803e-001, + -1.30320806e-002, -3.96915246e-003, 1.64081622e-002, + 1.33022992e-002, -1.25990793e-001, 5.44561120e-003, + 1.54320180e-001, 3.61218974e-002, -5.55622987e-002, + -7.65958354e-002, 1.95310727e-001, 1.38151035e-001, + 2.33739898e-001, -2.59036362e-001, 3.00421804e-001, + 3.34109515e-001, 2.88515873e-002, -5.60630932e-002, + 5.90530410e-002, 7.18742236e-002, -1.59539893e-001, + 1.51301799e-002, 1.84768245e-001, 4.64650504e-002, + -2.43076030e-002, 7.57834464e-002, 1.82631075e-001, + 2.01535776e-001, 1.15698718e-001, 6.39441833e-002, + 1.74167827e-001, 1.68023631e-001, 3.01340576e-002, + 6.57773402e-004, 4.46980670e-002, 2.84471400e-002, + -1.31297661e-002, 3.88145796e-003, 2.00503655e-002, + 1.21191368e-002, 5.94441220e-003, 1.06587470e-001, + 5.12968004e-002, 1.39909685e-001, -2.50547957e-002, + 9.30951163e-002, 5.10406606e-002, 1.32480562e-001, + 1.30955724e-003, 4.51177033e-003, 5.95032703e-003, + 1.21263992e-002, -9.01567633e-004, -6.71040209e-004, + 3.17750755e-003, 2.90092872e-003, 2.93604890e-003, + -1.61952469e-002, 2.17293389e-002, 2.41308901e-002, + 7.78268501e-002, -2.46687774e-002, 8.85305628e-002, + 3.81748118e-002, 3.88341793e-003, 3.45479394e-003, + 1.10849636e-002, 5.39862877e-003, -1.23523623e-002, + 1.37991563e-003, 2.26786137e-002, 1.53907649e-002, + -2.22730767e-002, 1.29416874e-002, 9.79454145e-002, + 9.13293734e-002, 4.68888909e-001, -7.45782182e-002, + 5.53779304e-001, 1.63228437e-001, 7.25829154e-002, + -1.12544922e-002, 1.04465850e-001, 2.86082737e-002, + -1.23833250e-002, 4.83490806e-003, 2.30499953e-002, + 1.57644656e-002, -1.40017001e-002, 3.47276106e-002, + 9.72236991e-002, 8.22671726e-002, 2.72090346e-001, + -1.23575274e-002, 3.76874745e-001, 1.20924078e-001, + 1.15669660e-001, -2.19954364e-002, 1.37529418e-001, + 3.54014896e-002, -9.06514702e-004, 1.11622759e-003, + 3.44248302e-003, 3.20737483e-003, -2.31525931e-003, + 1.34160165e-002, 1.92502569e-002, 2.14159545e-002, + 2.71839499e-002, 1.26957502e-002, 4.68544587e-002, + 2.35981233e-002, 1.42000625e-002, -3.48547054e-003, + 1.77302659e-002, 5.92808332e-003, 2.32379641e-002, + -5.25489915e-003, 2.89710294e-002, 9.38143115e-003, + 6.06249794e-002, 1.82796493e-002, 8.27816278e-002, + 3.36056054e-002, 1.06068968e-003, 1.37684196e-002, + 2.32883655e-002, 2.14003101e-002, -8.55620237e-005, + 2.71067285e-004, 2.56011984e-003, 1.87297945e-003, + 2.38402665e-001, 6.86540361e-003, 2.64383495e-001, + 3.54370214e-002, 3.69333506e-001, 4.68392782e-002, + 4.44394797e-001, 9.54948515e-002, -1.39188971e-002, + 1.93603393e-002, 7.08659962e-002, 5.41271567e-002, + -8.42405390e-003, 2.71851337e-003, 1.57117266e-002, + 8.81020911e-003, 2.65057325e-001, 1.33905662e-002, + 2.84654349e-001, 3.25007215e-002, 2.92220950e-001, + -2.00551227e-002, 3.65475953e-001, 9.52477306e-002, + -1.41089028e-002, -1.50714805e-002, 6.37156218e-002, + 5.10072708e-002, -9.46419407e-003, -4.10920614e-003, + 1.62612703e-002, 1.13658784e-002, 3.11257821e-002, + 4.53709951e-003, 3.36387604e-002, 8.17076582e-003, + 4.19874638e-002, -2.52019130e-002, 6.54499754e-002, + 4.11823615e-002, 5.47064294e-004, -2.30084565e-002, + 2.10976079e-002, 3.08011528e-002, -1.11414003e-003, + -1.14384014e-003, 3.17322928e-003, 3.83398170e-003, + -1.57899526e-003, -4.13291808e-003, 8.43590870e-003, + 7.99330603e-003, 3.43958922e-002, -6.59522042e-002, + 5.72937131e-002, 8.26737806e-002, 2.85807513e-002, + -5.32896705e-002, 6.78831637e-002, 8.16897750e-002, + 3.95463360e-003, 4.75657405e-004, 1.36386286e-002, + 7.80364545e-003, -3.94968353e-002, -3.81128583e-003, + 5.63770384e-002, 3.24881189e-002, 2.52660345e-002, + -1.19644493e-001, 1.73955977e-001, 2.01824069e-001, + 1.79489613e-001, -3.16967994e-001, 3.43316615e-001, + 3.66257936e-001, 1.37954012e-001, -1.43703213e-002, + 1.83049187e-001, 4.56292853e-002, -3.18362266e-002, + 1.89066343e-002, 5.55861630e-002, 3.49441804e-002, + -9.65992138e-002, 1.08612977e-001, 1.79961830e-001, + 1.68873459e-001, 1.23454414e-001, 8.00265223e-002, + 2.59060264e-001, 1.66611254e-001, 1.60219550e-001, + -6.42421283e-003, 2.01646894e-001, 3.89300436e-002, + -1.82872138e-003, -1.21824043e-004, 6.93430379e-003, + 5.44634927e-003, -1.50113320e-002, 1.44005567e-002, + 3.60265337e-002, 3.80336009e-002, 1.32540548e-002, + 1.38102686e-002, 4.35172170e-002, 3.99822257e-002, + 1.48715684e-002, -1.96879287e-003, 2.18772572e-002, + 6.04122691e-003, -1.80603880e-002, 3.42165725e-003, + 2.26863362e-002, 6.69563981e-003, -2.57283300e-002, + -1.43095218e-002, 4.62224819e-002, 2.96645574e-002, + 6.83449721e-003, -9.96981002e-003, 2.47344449e-002, + 2.30757222e-002, 1.74231792e-003, 5.07917372e-004, + 4.91782697e-003, 3.38517339e-003, -2.00532272e-001, + 1.93203073e-002, 2.27027074e-001, 4.34132069e-002, + -1.59467310e-001, 1.11828884e-002, 3.03548187e-001, + 1.34803355e-001, 7.09123015e-002, 3.71835008e-002, + 1.58790559e-001, 1.25229269e-001, 2.17518285e-002, + 3.82123189e-003, 3.96100469e-002, 2.14699842e-002, + -2.08548278e-001, 1.92565769e-002, 2.40116328e-001, + 4.45325300e-002, -1.48952186e-001, 2.67847538e-001, + 3.74230087e-001, 3.08942169e-001, 9.28772497e-004, + 1.41403109e-001, 1.84651092e-001, 2.03379169e-001, + 2.20369007e-002, 1.05770696e-002, 4.27785367e-002, + 2.95586810e-002, -1.23484246e-002, 6.48107962e-004, + 2.20085792e-002, 7.42822560e-003, -3.10762059e-002, + 6.87905326e-002, 8.20134953e-002, 8.78421441e-002, + -2.62798201e-002, 5.56517839e-002, 5.10867722e-002, + 6.81435391e-002, 7.78003523e-005, 3.31580010e-003, + 7.40378723e-003, 6.82929484e-003, -1.16520014e-003, + -3.50329326e-003, 3.93039733e-003, 6.05288474e-003, + -1.44932640e-003, -2.79454980e-002, 2.35758089e-002, + 3.75214852e-002, 3.57960910e-002, -3.84781882e-002, + 6.90986067e-002, 4.96469587e-002, 2.95826830e-002, + 4.37073596e-003, 4.65552174e-002, 8.95102974e-003, + -1.26990974e-002, -5.25877485e-003, 2.28465628e-002, + 1.94722824e-002, -2.27956437e-002, -3.04060280e-002, + 1.05464503e-001, 1.05113313e-001, 1.69866025e-001, + -6.35107756e-002, 3.12670082e-001, 1.37495831e-001, + 3.13361079e-001, -6.58902340e-003, 3.99461776e-001, + 4.11871746e-002, -1.28430696e-002, 1.01598967e-002, + 2.56596878e-002, 1.91458985e-002, -2.38159969e-002, + 7.32836202e-002, 1.12053163e-001, 1.07124127e-001, + 1.02870204e-001, 6.21872358e-002, 2.80696094e-001, + 1.13716990e-001, 3.23663473e-001, -9.12736077e-003, + 4.04724121e-001, 3.94104794e-002, -1.62818073e-003, + 4.72497661e-003, 4.65753255e-003, 7.87023548e-003, + -1.42819306e-003, 4.28009033e-002, 2.80283615e-002, + 6.68943450e-002, 4.94110584e-003, 2.53343172e-002, + 5.31894639e-002, 4.55614068e-002, 3.70860323e-002, + -3.22115631e-003, 4.78403121e-002, 7.63620576e-003, + -1.31725578e-003, 2.85196258e-003, 4.01563803e-003, + 7.37627968e-003, -6.29378334e-002, 6.51164055e-002, + 7.56453425e-002, 9.12300199e-002, -1.05439480e-002, + 7.95619562e-002, 6.20942116e-002, 1.13587290e-001, + -3.81259946e-003, 2.21663318e-003, 1.40280044e-002, + 8.59492086e-003, 5.18649491e-003, 6.12037256e-003, + 2.23718733e-002, 2.27380041e-002, -7.00574666e-002, + 1.31534964e-001, 1.82413295e-001, 1.97621107e-001, + -6.87815920e-002, 2.63437390e-001, 2.44498685e-001, + 3.70128244e-001, -1.26506284e-001, 1.42223164e-002, + 1.59295842e-001, 5.89584485e-002, 1.19446917e-002, + -1.59429628e-002, 2.72178967e-002, 3.17737162e-002, + -2.71188598e-002, -8.68504122e-002, 1.38739750e-001, + 1.86675951e-001, -1.40978560e-001, -1.84341788e-001, + 2.58360595e-001, 2.66163856e-001, -1.07511915e-001, + -9.61795170e-003, 1.50227547e-001, 5.96396588e-002, + -1.28242915e-004, -1.45297162e-002, 6.71864441e-003, + 1.90117452e-002, -2.77217384e-002, -1.40178517e-001, + 5.34226187e-002, 1.68228701e-001, -5.46801044e-003, + -1.33699685e-001, 5.43692261e-002, 1.61031500e-001, + -4.08629281e-003, -6.31647371e-003, 1.43179009e-002, + 1.44188693e-002, 7.20773404e-003, -1.08039344e-003, + 1.58877410e-002, 5.61290188e-003, 3.21011357e-002, + 4.40617912e-002, 5.53035028e-002, 5.41140251e-002, + -1.17129758e-002, 4.26699333e-002, 4.80313674e-002, + 5.58231771e-002, -1.79779623e-002, -5.79153420e-004, + 2.55838279e-002, 8.92208517e-003, 9.22345370e-002, + 1.20251281e-002, 1.16040133e-001, 3.58671956e-002, + 2.34262869e-001, 2.39307936e-002, 3.12692881e-001, + 1.56017065e-001, -2.24983152e-002, 5.65324090e-002, + 2.67311245e-001, 1.74979240e-001, -1.92895502e-001, + 3.52373836e-003, 2.27009490e-001, 5.61031774e-002, + 1.16468407e-001, 8.01826920e-003, 1.40487924e-001, + 2.86860559e-002, 8.11902657e-002, -2.50531882e-002, + 2.68358916e-001, 1.36613727e-001, 2.41586044e-002, + -1.12819128e-001, 3.56344789e-001, 1.89534321e-001, + -1.75679281e-001, -4.35267854e-003, 2.21132040e-001, + 4.08056043e-002, 1.26955481e-002, 2.36365618e-003, + 1.79749727e-002, 4.61699395e-003, -1.84053928e-002, + -3.04329153e-002, 6.73262402e-002, 4.25412357e-002, + -8.53231363e-003, -7.05022290e-002, 7.81466588e-002, + 7.54325464e-002, -1.02863191e-002, -2.93857534e-003, + 2.17440259e-002, 7.41611188e-003, -2.47597359e-002, + 2.49445951e-003, 3.15877758e-002, 6.06227480e-003, + -5.05666025e-002, -1.54739702e-002, 6.44001737e-002, + 2.73920204e-002, -5.09730948e-004, -1.16559416e-002, + 1.93075817e-002, 2.19773650e-002, 1.16108602e-003, + -9.03045293e-004, 3.31779383e-003, 3.01444391e-003, + -2.30419204e-001, 2.50473176e-003, 2.76444644e-001, + 3.01350206e-002, -3.13921630e-001, -2.40830574e-002, + 3.88626546e-001, 1.07829839e-001, -6.76530832e-003, + -1.81471668e-002, 1.02409691e-001, 8.51773843e-002, + 1.24582835e-002, -2.62532826e-003, 2.38880571e-002, + 1.50719108e-002, -2.37691954e-001, -8.61239713e-003, + 2.84230262e-001, 3.33867297e-002, -2.96004921e-001, + 5.26871718e-002, 3.71568859e-001, 1.48500398e-001, + 2.49161082e-003, 6.17422312e-002, 1.10814176e-001, + 1.29722670e-001, 1.00924615e-002, 6.64435187e-003, + 2.34634578e-002, 1.92077290e-002, -2.36092918e-002, + -2.91618379e-003, 3.02643515e-002, 9.16731078e-003, + -2.50446573e-002, 6.03477843e-002, 6.89561069e-002, + 8.83836970e-002, -8.71155690e-003, 6.39709830e-002, + 3.66609693e-002, 9.21602696e-002, -1.05720793e-003, + 5.24457730e-003, 4.43346845e-003, 9.79377329e-003, + 5.57302148e-004, 1.15439796e-003, 3.92750697e-003, + 3.12922057e-003, -5.71732642e-003, 2.45009065e-002, + 3.78852561e-002, 3.75423953e-002, -5.27135842e-002, + 2.74700262e-002, 8.66812468e-002, 4.46223319e-002, + 1.33825724e-005, -3.03541805e-004, 5.84903313e-003, + 4.52302070e-003, 1.42743886e-002, 3.82958306e-003, + 2.78293286e-002, 1.41082928e-002, 2.04094909e-002, + 5.16655333e-002, 1.31353334e-001, 1.12603672e-001, + -3.43036473e-001, 1.83837950e-001, 5.73568463e-001, + 2.40373090e-001, -2.08034143e-002, 2.31251065e-002, + 5.65174669e-002, 4.27107438e-002, 1.39991362e-002, + -8.50635115e-003, 2.88135521e-002, 2.01325882e-002, + -8.39824323e-003, -1.35288224e-001, 1.22661144e-001, + 1.86894998e-001, -1.11594044e-001, -1.55173317e-001, + 2.48389468e-001, 2.93729544e-001, -5.13114929e-002, + 1.03787249e-002, 6.95244893e-002, 5.44045679e-002, + -8.39073560e-004, -1.90486154e-003, 5.13474457e-003, + 5.79105830e-003, -2.24558860e-002, -3.40926386e-002, + 3.80256325e-002, 5.22457696e-002, -7.13752955e-003, + -3.08772940e-002, 3.52728553e-002, 5.23030013e-002, + -1.51626649e-003, -1.35737238e-003, 6.16440596e-003, + 5.93446521e-003, 5.42144710e-003, 4.60648298e-004, + 8.53316020e-003, 6.23580627e-003, -1.39827151e-002, + 2.53829435e-002, 3.40735801e-002, 3.99512202e-002, + -5.46334404e-003, 2.36028228e-002, 2.99196169e-002, + 3.97813916e-002, -1.22632447e-003, 1.81829964e-003, + 6.05830876e-003, 5.66651998e-003, 9.61474851e-002, + -2.74193827e-002, 1.03648238e-001, 4.61002886e-002, + -1.05032220e-001, 9.30551738e-002, 2.88791597e-001, + 1.98862642e-001, 5.77209182e-002, 1.57411933e-001, + 2.06085637e-001, 2.15129048e-001, -3.30203883e-002, + 1.70280281e-002, 5.62255308e-002, 3.39509882e-002, + 5.53619377e-002, -3.24091800e-002, 7.93005601e-002, + 5.14482260e-002, 2.74235308e-001, -1.00711212e-001, + 4.60091561e-001, 3.27564448e-001, -7.25335851e-002, + 1.48206782e-002, 2.18435988e-001, 2.07124755e-001, + -3.08191422e-002, -5.43476548e-003, 5.24915233e-002, + 3.05754896e-002, -1.92884915e-003, 3.39482911e-003, + 7.65309576e-003, 6.08912297e-003, 6.41766340e-002, + -4.66941595e-002, 7.98886195e-002, 6.87892660e-002, + -8.57512467e-003, -3.29010561e-002, 4.25806977e-002, + 4.77607995e-002, -8.59156076e-004, -6.59302459e-004, + 5.56133129e-003, 4.32816148e-003, -2.02884548e-004, + -5.10847749e-005, 4.69313189e-003, 2.95974570e-003, + 3.41564119e-002, 2.54477747e-002, 4.76921722e-002, + 3.53121683e-002, -5.60492417e-003, 2.71143038e-002, + 3.57408486e-002, 3.70954163e-002, -2.77766748e-003, + 3.85665859e-004, 5.00153610e-003, 3.65482876e-003, + 2.38988791e-002, 1.38407936e-002, 4.45925593e-002, + 2.60501988e-002, 2.21807510e-001, 2.05907419e-001, + 3.86589020e-001, 2.55959392e-001, -1.44060716e-001, + 2.06038728e-002, 2.44246513e-001, 1.60548672e-001, + -3.61935310e-002, -1.47429470e-003, 4.44673486e-002, + 2.36029811e-002, 4.64454293e-002, 9.86780040e-003, + 6.14871904e-002, 2.64012665e-002, -3.54809649e-002, + -5.97414002e-002, 4.60920662e-001, 1.85958534e-001, + -1.39554590e-001, -1.74606547e-001, 2.49421403e-001, + 2.19785839e-001, -2.87548136e-002, -1.24701792e-002, + 3.98490429e-002, 2.53598634e-002, 4.34497232e-003, + -1.64722034e-004, 7.38438126e-003, 3.87908635e-003, + -1.56984832e-002, -2.88501102e-002, 5.34661859e-002, + 3.77516076e-002, -1.88391060e-002, -1.57075673e-002, + 3.54725718e-002, 2.92595699e-002, -1.09411892e-003, + -1.91089828e-004, 4.22210386e-003, 3.22442688e-003, + -1.36062615e-002, 1.05247914e-003, 1.79585386e-002, + 3.86288483e-003, -6.17308170e-003, -9.73103568e-003, + 4.69529331e-002, 2.17833929e-002, 1.05656823e-002, + -1.06734205e-002, 2.79902183e-002, 2.60093212e-002, + 3.04558454e-003, 2.10975966e-004, 6.54858071e-003, + 4.03114501e-003, -1.30951539e-001, 5.71429776e-003, + 1.53291121e-001, 2.22143419e-002, -3.21260914e-002, + -1.84248500e-002, 3.26950610e-001, 1.05043143e-001, + 6.43414706e-002, -2.42694002e-003, 1.70530185e-001, + 1.25270396e-001, 4.25674617e-002, 1.24265160e-002, + 5.86441830e-002, 3.30683328e-002, -1.32363021e-001, + -1.44638529e-003, 1.49159253e-001, 3.01326197e-002, + 3.31634209e-002, 1.10656016e-001, 3.54020745e-001, + 1.76053196e-001, 2.15963557e-001, 3.58960688e-001, + 2.70412385e-001, 3.91135663e-001, 3.47723812e-002, + 5.21673486e-002, 6.21174723e-002, 6.15952797e-002, + -1.20083997e-002, -5.25435200e-004, 1.52393831e-002, + 5.88657660e-003, 3.68944481e-002, 4.92485091e-002, + 7.44043142e-002, 5.85696064e-002, 4.26059440e-002, + 3.97698432e-002, 6.20104410e-002, 6.21217713e-002, + -2.99512106e-003, -1.51346321e-003, 7.67024234e-003, + 7.29140267e-003, -2.19081100e-002, 1.62938784e-003, + 3.02054062e-002, 5.55407722e-003, -9.43394378e-003, + -1.43591547e-002, 4.09824364e-002, 2.63625402e-002, + 2.39185784e-002, -1.00178551e-002, 4.61641885e-002, + 2.61390153e-002, 1.13441171e-002, 2.41404329e-003, + 1.88232455e-002, 5.64646441e-003, -2.08024487e-001, + 3.43158143e-003, 2.64386088e-001, 2.56371889e-002, + -4.95990366e-002, -3.70232016e-002, 2.08310276e-001, + 9.33615491e-002, 2.46271312e-001, -2.53092051e-002, + 3.50821316e-001, 9.94852036e-002, 9.28793773e-002, + 1.29044745e-002, 1.52942255e-001, 3.02331895e-002, + -2.12025717e-001, -3.69173568e-003, 2.69855589e-001, + 2.76996456e-002, -6.49028048e-002, 7.64461467e-003, + 1.92067370e-001, 9.61353406e-002, 3.17508519e-001, + 2.83307713e-002, 3.87722969e-001, 1.09714970e-001, + 7.65533149e-002, -9.83712729e-004, 1.42217726e-001, + 3.30454856e-002, -2.29455680e-002, -2.71740695e-003, + 2.94756480e-002, 5.55390632e-003, -7.71900453e-003, + 1.11731114e-002, 3.50102931e-002, 2.33130679e-002, + 4.22947407e-002, 1.16984798e-002, 5.90405278e-002, + 2.79223211e-002, 7.87995383e-003, -2.59227748e-003, + 1.72567181e-002, 6.71987329e-003, -1.20394416e-002, + 1.48220779e-003, 1.54185202e-002, 4.02399153e-003, + -3.16616073e-002, -1.11894216e-002, 4.71948758e-002, + 2.24794503e-002, 8.71130172e-003, -8.97126738e-003, + 2.39553917e-002, 2.07301322e-002, 3.49693699e-003, + 3.82516955e-005, 8.44262820e-003, 4.49021626e-003, + -1.07319616e-001, 4.09964100e-003, 1.27259463e-001, + 2.49791071e-002, -2.05961257e-001, -1.45705428e-003, + 2.82777041e-001, 9.76810083e-002, 1.04983971e-001, + 6.27673343e-002, 1.95430219e-001, 1.35582119e-001, + 3.18247303e-002, 3.23163345e-002, 7.23246485e-002, + 4.82086129e-002, -1.06010363e-001, -3.42765055e-003, + 1.24640450e-001, 2.33189259e-002, -2.02040046e-001, + 3.41712981e-002, 2.79922366e-001, 1.09340549e-001, + 3.87853682e-001, 1.60595685e-001, 4.67429608e-001, + 2.18994945e-001, -1.81544274e-002, 3.53516899e-002, + 9.01426375e-002, 5.64363487e-002, -1.08309556e-002, + -1.47121947e-003, 1.38413021e-002, 3.97847919e-003, + -2.33413633e-002, 1.77652333e-002, 4.94348630e-002, + 3.01202126e-002, 6.82704821e-002, 2.31151897e-002, + 8.54375437e-002, 4.42842767e-002, -6.28036587e-003, + -2.79220403e-003, 1.20545514e-002, 6.98712841e-003, + 1.90917854e-004, -4.43690456e-004, 5.16694738e-003, + 5.04565705e-003, -2.04068888e-002, -1.84633527e-002, + 4.11882885e-002, 4.40061092e-002, 9.11508501e-003, + -2.38819681e-002, 4.11570966e-002, 4.43160497e-002, + 1.77409023e-003, -2.49434117e-004, 6.47644885e-003, + 5.20561589e-003, -2.92123184e-002, -2.49857530e-002, + 4.60102819e-002, 4.47427407e-002, -1.35693878e-001, + -2.03182861e-001, 2.12718219e-001, 2.92544812e-001, + 1.14241533e-001, -1.67951614e-001, 2.54352748e-001, + 2.49058425e-001, 4.72151414e-002, -5.37572196e-003, + 6.59130439e-002, 4.01720591e-002, -3.41837704e-002, + 3.01572704e-003, 4.75505292e-002, 3.28899547e-002, + -1.36454478e-002, 1.20497242e-001, 1.89006343e-001, + 1.88455716e-001, 1.41477108e-001, 2.47198462e-001, + 4.41509724e-001, 3.02717835e-001, 4.06770036e-002, + 2.45115012e-002, 7.10767284e-002, 4.44169603e-002, + -1.71653950e-003, 9.73282207e-004, 5.35577536e-003, + 4.58281301e-003, 5.04510291e-003, 2.05228347e-002, + 3.87891904e-002, 3.46267521e-002, 2.91174557e-002, + 1.74555071e-002, 6.93410411e-002, 3.95450965e-002, + -5.26728363e-005, -1.09300902e-003, 7.95292761e-003, + 5.56783006e-003, 9.08821763e-004, -2.24834145e-003, + 4.68082214e-003, 5.91779687e-003, 1.83910376e-003, + -2.94795800e-002, 3.49223502e-002, 4.86294664e-002, + -1.03316391e-002, -3.16753127e-002, 3.19195725e-002, + 4.74771969e-002, 3.04021756e-004, -2.95576360e-003, + 4.55233548e-003, 5.67006413e-003, -2.17900854e-002, + -2.08423510e-002, 3.41358930e-002, 4.04675342e-002, + 5.79713881e-002, -1.85442120e-001, 1.86351612e-001, + 2.75540262e-001, -4.15417030e-002, -1.30092099e-001, + 1.42073527e-001, 2.15910167e-001, 2.25388911e-002, + -9.21247434e-003, 3.27286124e-002, 3.18597667e-002, + -1.55554479e-002, 3.98783349e-002, 2.99257468e-002, + 4.91307750e-002, 2.86417250e-002, 3.59979063e-001, + 1.40617162e-001, 3.99027705e-001, 2.85316110e-002, + 3.59043926e-001, 1.26061156e-001, 4.03767914e-001, + 1.83028840e-002, 4.51066680e-002, 3.15215997e-002, + 5.35620041e-002, 1.45748863e-003, 3.46826646e-003, + 4.07011900e-003, 5.77551872e-003, 7.65740499e-003, + 2.79508885e-002, 2.36673411e-002, 4.47407551e-002, + -3.33503383e-004, 2.37928610e-002, 1.93922985e-002, + 4.15808633e-002, -1.30219467e-003, 2.02090666e-003, + 3.90930055e-003, 4.89130989e-003, -6.05806068e-004, + -2.92351027e-003, 7.88010098e-003, 7.08801532e-003, + 9.89010558e-003, -3.98767404e-002, 3.72068100e-002, + 5.99054396e-002, -2.17520948e-002, -2.97880098e-002, + 4.88797240e-002, 5.17962873e-002, 3.53855212e-005, + -3.33034608e-004, 7.41690025e-003, 5.01275714e-003, + -5.51024526e-002, -2.67200195e-003, 6.93046227e-002, + 3.24157812e-002, 3.09197046e-002, -1.49361372e-001, + 1.95004344e-001, 2.24164456e-001, -1.27384216e-001, + -2.23411918e-001, 2.58619905e-001, 2.77117729e-001, + 5.07877544e-002, -1.27773639e-002, 6.42648041e-002, + 3.48535739e-002, -5.46033010e-002, 3.93911786e-002, + 7.17816129e-002, 5.05776368e-002, -8.39272514e-002, + 3.02607536e-001, 2.14085236e-001, 3.62470061e-001, + -1.67579457e-001, 1.59429029e-001, 2.89740264e-001, + 2.30624706e-001, 5.86073473e-002, 9.54948366e-003, + 7.72162080e-002, 3.04335654e-002, 6.49370253e-004, + -1.87737169e-004, 7.54403742e-003, 7.10637402e-003, + -1.28461560e-002, 4.53343801e-002, 4.66500409e-002, + 7.08684921e-002, -5.34336083e-002, 4.19693179e-002, + 7.20108747e-002, 6.20908476e-002, 2.18614750e-003, + 1.07705803e-003, 8.83576367e-003, 4.50497214e-003, + -9.50324698e-004, 3.47396568e-003, 6.58482732e-003, + 9.47102811e-003, 1.81556232e-002, 7.84319714e-002, + 4.78195958e-002, 1.05147243e-001, -7.89934956e-003, + 8.52155089e-002, 4.42460850e-002, 1.12552427e-001, + -2.19299644e-003, 4.61396761e-003, 8.35671369e-003, + 9.85286571e-003, 1.84137858e-002, 5.82196303e-002, + 5.98505400e-002, 7.60253593e-002, 2.69996971e-001, + 2.74832577e-001, 3.47938180e-001, 4.02189672e-001, + -1.62171215e-001, 2.29011938e-001, 2.56482810e-001, + 3.33429575e-001, -7.62702227e-002, 2.83829905e-002, + 1.13329701e-001, 5.18410094e-002, 2.53723878e-002, + 2.85243113e-002, 4.37922440e-002, 4.29126285e-002, + 2.55283918e-002, 5.23957796e-002, 1.32534027e-001, + 1.32073879e-001, -5.68600856e-002, 1.12185292e-002, + 1.46881893e-001, 1.03744917e-001, -8.23501199e-002, + 1.91164147e-002, 1.11492746e-001, 3.73669825e-002, + 1.29195920e-003, 9.62972263e-005, 3.51895741e-003, + 3.24542797e-003, 5.53198915e-004, -7.78890820e-003, + 1.70703549e-002, 1.80437490e-002, -8.09771009e-003, + -7.41679268e-003, 2.04795580e-002, 1.97210610e-002, + -7.19455350e-003, 8.75104975e-004, 1.11770155e-002, + 3.96838132e-003, -5.63427247e-003, 1.11700571e-003, + 1.05389189e-002, 3.67103121e-003, -4.39266488e-002, + -1.29531985e-002, 5.61705716e-002, 2.30689961e-002, + 2.36553513e-002, -8.02992936e-003, 4.12214249e-002, + 2.24872194e-002, 6.58289576e-003, 3.15606827e-003, + 1.10693313e-002, 5.73476916e-003, -6.78739697e-002, + 2.58149044e-003, 9.46369022e-002, 2.38442887e-002, + -3.07767421e-001, -3.99018899e-002, 3.55418146e-001, + 1.05499983e-001, 2.46170253e-001, 9.72394599e-004, + 3.11702579e-001, 1.22805834e-001, 6.14283048e-002, + 5.49100898e-003, 9.00931060e-002, 4.14946601e-002, + -9.00401548e-002, -8.78764503e-003, 1.10800855e-001, + 2.45537031e-002, -2.15711907e-001, 1.72357168e-002, + 2.92681694e-001, 1.09947354e-001, 2.97381401e-001, + 1.44300267e-001, 3.45713973e-001, 1.87802926e-001, + 4.47225459e-002, 7.95229524e-003, 7.51055479e-002, + 3.60214524e-002, -1.11893108e-002, -1.93728833e-003, + 1.40377367e-002, 4.14076168e-003, -8.45494308e-003, + 1.87067688e-002, 4.45654355e-002, 2.84636300e-002, + 4.83300649e-002, 2.63806563e-002, 6.34109676e-002, + 3.93242091e-002, 1.14565599e-003, -3.13568220e-004, + 7.85825402e-003, 5.25389053e-003, 2.44294060e-003, + 2.42750184e-003, 4.78296634e-003, 5.26289502e-003, + 1.14642894e-002, 4.30778749e-002, 3.58578935e-002, + 5.83167672e-002, -2.54779644e-002, 2.60548703e-002, + 4.00348082e-002, 4.51852977e-002, 2.72473117e-004, + 1.01199863e-003, 4.48874431e-003, 4.69636405e-003, + 2.82162335e-002, -3.98120191e-003, 4.15835157e-002, + 3.45985219e-002, 1.76307589e-001, -3.77342924e-002, + 2.83326983e-001, 2.93128550e-001, -2.01874346e-001, + 1.28209829e-001, 2.65954554e-001, 2.59223312e-001, + -1.53193166e-002, 2.28801332e-002, 3.57125364e-002, + 4.00145389e-002, 3.58659215e-002, 2.11239811e-002, + 4.72436063e-002, 4.98791449e-002, 1.55122384e-001, + 1.32576779e-001, 2.15446576e-001, 4.05249864e-001, + -6.00764453e-002, 1.08669348e-001, 1.60631984e-001, + 3.16573739e-001, -2.39903964e-002, 2.32544169e-002, + 4.16386761e-002, 4.67085503e-002, 7.38923787e-004, + -4.11611376e-003, 3.86038423e-003, 1.05979079e-002, + 8.22571758e-003, -7.49883801e-002, 2.72722989e-002, + 1.18851371e-001, 3.34989047e-003, -7.67947137e-002, + 2.43261214e-002, 1.26759887e-001, 2.31939812e-005, + -6.89504948e-003, 4.86843893e-003, 1.34549541e-002, + 2.65835179e-003, -5.65463037e-004, 5.64496685e-003, + 3.90065624e-003, 2.91622207e-002, 2.32059136e-002, + 4.20165956e-002, 3.74335647e-002, 9.71937552e-003, + 2.71006674e-002, 3.54648158e-002, 3.89718972e-002, + -1.35485758e-003, 9.09453142e-004, 5.36696380e-003, + 4.35321592e-003, 3.99548337e-002, 2.01310962e-003, + 5.14443405e-002, 2.45061573e-002, 2.72968382e-001, + 9.49313790e-002, 3.32186699e-001, 2.00856119e-001, + 3.70291783e-003, 8.99963528e-002, 2.08381787e-001, + 1.65421546e-001, -3.46575342e-002, -2.17440049e-003, + 4.96577024e-002, 2.92146336e-002, 3.73614132e-002, + -1.06232213e-002, 4.80567254e-002, 2.60160547e-002, + 2.44251937e-001, -2.38601699e-001, 3.36373001e-001, + 2.88420022e-001, 7.25727007e-002, -1.59560084e-001, + 3.35377723e-001, 2.24177107e-001, -4.14708853e-002, + -1.46759031e-002, 6.09082989e-002, 3.41559350e-002, + 1.51184702e-003, -2.90232274e-004, 4.55083698e-003, + 3.64449969e-003, 2.29397714e-002, -2.53504254e-002, + 4.06986549e-002, 4.02112268e-002, 1.73116364e-002, + -4.11341190e-002, 5.39263301e-002, 5.31164370e-002, + -1.01077603e-003, -1.42367091e-003, 6.80600898e-003, + 5.65620651e-003, -1.76228117e-004, -5.34199527e-004, + 5.67487488e-003, 2.23183190e-003, 1.00441445e-002, + 7.46616337e-004, 7.61599541e-002, 2.19836459e-002, + -2.33763756e-004, 4.26920597e-003, 2.85301916e-002, + 1.94503982e-002, -7.69298174e-004, 2.36380074e-004, + 5.38321771e-003, 2.52745836e-003, -4.30645328e-003, + -2.92758141e-005, 3.92679237e-002, 1.11128734e-002, + 9.78806987e-002, 1.06478063e-002, 6.43846095e-001, + 9.31661576e-002, -1.21229384e-002, 5.43623371e-003, + 1.53589845e-001, 8.94345790e-002, 6.71541085e-004, + 1.33169279e-003, 4.55232151e-002, 1.72809772e-002, + -8.95455573e-003, -5.90395299e-004, 4.25957069e-002, + 1.18017578e-002, 1.24113195e-001, 3.96754313e-003, + 5.90151131e-001, 9.92434621e-002, -3.63675840e-002, + 2.11613905e-003, 1.64076895e-001, 8.79030004e-002, + 4.84205550e-003, -1.11923995e-003, 4.67619449e-002, + 1.71091389e-002, -2.68041942e-004, 7.30468659e-004, + 5.96465589e-003, 2.45779031e-003, 1.50468834e-002, + -6.35766541e-004, 6.48049563e-002, 2.05660351e-002, + -4.61802725e-003, -8.25893949e-004, 2.85643954e-002, + 1.90742183e-002, 2.14510248e-004, 3.58698853e-005, + 5.31338062e-003, 3.06957681e-003, -2.19711731e-003, + 3.75989545e-003, 5.80938021e-003, 7.42135942e-003, + -9.40195657e-003, 3.56943309e-002, 3.21472399e-002, + 5.63004613e-002, 8.58347397e-003, 3.19095366e-002, + 3.51317450e-002, 5.18210232e-002, -1.70136441e-003, + 1.37849222e-003, 4.93236491e-003, 4.72068554e-003, + 2.35266145e-002, 3.17094140e-002, 4.70931530e-002, + 4.34285253e-002, -1.49594143e-001, 3.21884453e-001, + 3.03081244e-001, 3.71884495e-001, -4.83593196e-002, + 2.15402558e-001, 2.69723415e-001, 2.87446797e-001, + -4.87914644e-002, 9.16649494e-003, 6.32152185e-002, + 3.05984486e-002, 3.00699007e-002, -9.80056543e-003, + 4.73630391e-002, 2.98659895e-002, -1.28402382e-001, + -1.13855503e-001, 2.78228402e-001, 1.81477636e-001, + -1.15977041e-001, -6.86891750e-002, 2.60790676e-001, + 1.68829679e-001, -4.92806546e-002, -3.75257782e-003, + 6.63003176e-002, 2.87662987e-002, 4.72040119e-004, + -2.25436292e-003, 5.13981981e-003, 5.31879393e-003, + -1.36627564e-002, -3.26122828e-002, 4.23725657e-002, + 4.75674570e-002, -1.11756455e-002, -3.11497133e-002, + 3.84742841e-002, 4.72233221e-002, -3.76263307e-003, + -6.80940459e-004, 6.61981571e-003, 4.39543417e-003, + 1.71720167e-003, -8.93132761e-003, 6.45093853e-003, + 1.30165806e-002, -8.00827332e-003, -1.05911352e-001, + 4.30164151e-002, 1.23715602e-001, -2.77498970e-003, + -9.34844688e-002, 5.47177382e-002, 1.09229900e-001, + 1.67970490e-002, -1.49340834e-003, 2.46030111e-002, + 9.84680559e-003, -2.68313084e-002, -2.39563501e-003, + 5.02900258e-002, 3.45724262e-002, -4.43177558e-002, + -1.25150278e-001, 2.02189520e-001, 2.34211206e-001, + 3.57102565e-002, -1.00962497e-001, 2.73136109e-001, + 1.87526479e-001, 2.32135013e-001, 7.18920678e-003, + 2.87316889e-001, 3.54088843e-002, -3.48386765e-002, + 1.92256700e-002, 5.87226525e-002, 3.49941440e-002, + -1.15558021e-001, 9.01991948e-002, 2.35425428e-001, + 1.86392307e-001, 4.61034589e-002, 5.44133782e-003, + 3.05017442e-001, 1.43867388e-001, 2.43313387e-001, + -4.91690589e-003, 3.06260169e-001, 3.67767029e-002, + -3.33225960e-003, 2.58146174e-004, 8.49048421e-003, + 5.97780198e-003, -2.19489560e-002, 1.84392650e-002, + 4.72883843e-002, 4.19946574e-002, -2.15081847e-003, + 1.52263707e-002, 5.23376577e-002, 2.96893362e-002, + 2.73985155e-002, -2.24781269e-003, 3.51949856e-002, + 5.32059791e-003, -4.98826965e-004, -7.86616467e-004, + 5.61828911e-003, 3.92779103e-003, 2.08379934e-003, + -1.51677011e-002, 3.29723507e-002, 3.30230743e-002, + 2.20715571e-002, -1.84691418e-002, 6.26353621e-002, + 3.37988846e-002, 4.13050177e-003, 1.22256705e-003, + 1.01178661e-002, 3.57012916e-003, -1.90855991e-002, + -1.09308679e-002, 3.76139171e-002, 2.53926367e-002, + 1.47567810e-002, -1.33801445e-001, 1.60411566e-001, + 1.82990491e-001, 2.73802191e-001, -3.44406441e-002, + 4.56929833e-001, 1.33629382e-001, 3.12037449e-002, + 3.27451318e-003, 7.54952207e-002, 1.93592999e-002, + -2.17034556e-002, 2.11804714e-002, 3.84898819e-002, + 3.37422490e-002, 5.62095223e-003, 1.79407462e-001, + 1.46931037e-001, 2.38333121e-001, 3.15349489e-001, + 1.25552535e-001, 4.25946593e-001, 2.01110229e-001, + 2.50952411e-002, -1.48531585e-003, 6.91053867e-002, + 2.34109145e-002, 6.31303468e-004, 2.79925787e-003, + 5.48894471e-003, 6.71290560e-003, 7.32302084e-004, + 4.11350690e-002, 3.49964574e-002, 5.92407137e-002, + 2.18003839e-002, 3.85633595e-002, 4.91592735e-002, + 5.43430112e-002, 5.02467796e-004, -8.96583661e-004, + 7.22839311e-003, 4.10622451e-003, -2.36469693e-003, + 2.71263561e-004, 4.97689843e-003, 3.04938667e-003, + -9.83248278e-003, -5.59934229e-003, 3.15804891e-002, + 2.42151152e-002, -1.10283270e-002, -8.19462910e-003, + 6.34602383e-002, 2.45484617e-002, 1.01309158e-002, + 5.39142871e-004, 1.27740791e-002, 3.16218100e-003, + -2.48553865e-002, 2.47672549e-004, 3.89128886e-002, + 2.04578023e-002, -5.01269698e-002, -1.79246217e-002, + 1.74967915e-001, 1.20787494e-001, -8.15110952e-002, + -3.50112165e-003, 5.26133418e-001, 1.11585997e-001, + 8.42057317e-002, 7.11752940e-003, 9.90618318e-002, + 1.98723711e-002, -2.05349773e-002, 1.48062026e-002, + 3.58609930e-002, 2.93250419e-002, -6.66814819e-002, + 1.24696851e-001, 1.90271363e-001, 1.94310576e-001, + -4.31094393e-002, 1.07073799e-001, 5.53210735e-001, + 1.76720738e-001, 6.80803806e-002, 7.76414759e-003, + 8.86258036e-002, 2.51701549e-002, -9.97185474e-004, + 1.86643552e-003, 4.12429031e-003, 5.09901671e-003, + -1.14785125e-002, 3.02784890e-002, 3.67218703e-002, + 4.80510853e-002, -8.64030886e-003, 3.48282754e-002, + 7.25332201e-002, 5.03628068e-002, 4.53823153e-003, + -2.16682292e-005, 9.85342171e-003, 3.73164890e-003, + -1.94692941e-004, 1.71271991e-003, 3.81085323e-003, + 1.17606670e-002, 2.12176330e-003, 1.07581364e-002, + 2.12716572e-002, 9.01039541e-002, 1.99449761e-003, + 5.49176941e-003, 2.23083571e-002, 9.19591039e-002, + 5.37800894e-004, -9.54411880e-005, 4.15082136e-003, + 1.18904673e-002, 3.01529299e-002, 4.13118601e-002, + 4.22038250e-002, 5.79419136e-002, 5.27448878e-002, + 3.77283901e-001, 1.23703599e-001, 4.33074206e-001, + -2.83136871e-002, 3.73059660e-001, 1.09496817e-001, + 4.29316461e-001, -2.27331743e-002, 4.62900698e-002, + 3.62023115e-002, 6.08008727e-002, 3.39721180e-002, + -1.38534941e-002, 4.56226394e-002, 3.66528183e-002, + 6.56210333e-002, -9.41200480e-002, 1.24774344e-001, + 1.70637861e-001, -3.35848071e-002, -7.47112632e-002, + 9.39033329e-002, 1.57536492e-001, -2.45438609e-002, + -1.09931203e-002, 3.61485034e-002, 2.91584730e-002, + 5.10202895e-004, -6.71185786e-003, 4.67723422e-003, + 1.45036038e-002, 4.27734805e-003, -9.38326120e-002, + 2.82978676e-002, 1.46824166e-001, 1.11081827e-004, + -9.86573100e-002, 2.68268771e-002, 1.52261481e-001, + -3.17375758e-004, -9.29237530e-003, 4.71507153e-003, + 1.67271588e-002, 1.07489747e-003, -1.18991057e-003, + 6.00941805e-003, 9.55977477e-003, -2.57819407e-002, + -6.94254488e-002, 4.95845899e-002, 1.07062519e-001, + -2.04380769e-002, -7.40858763e-002, 4.44759540e-002, + 9.78846699e-002, -4.33005480e-004, -4.06903401e-003, + 5.85848466e-003, 8.29321519e-003, -3.31305116e-002, + -2.69517358e-002, 5.40309027e-002, 6.49120063e-002, + -1.23842880e-001, -3.10098212e-002, 3.07431936e-001, + 4.69439119e-001, 4.42483369e-003, 1.87655576e-002, + 1.86200306e-001, 2.93116808e-001, 1.90981738e-002, + -3.99299804e-003, 3.81703265e-002, 3.83973718e-002, + -3.66593599e-002, 1.24313589e-003, 5.99002540e-002, + 4.75870967e-002, -7.70235360e-002, -9.95777473e-002, + 2.46509165e-001, 3.29576254e-001, -2.98869843e-003, + -5.05827479e-002, 1.68728873e-001, 3.08404684e-001, + 2.08542645e-002, -4.97112691e-004, 3.80443744e-002, + 4.25783657e-002, -2.72934278e-003, 2.35216878e-003, + 7.98216090e-003, 7.24953227e-003, -8.41944944e-003, + 5.20406775e-002, 4.15498167e-002, 7.54703060e-002, + 2.09320709e-003, 4.82900105e-002, 2.98782587e-002, + 7.59602860e-002, -3.79317557e-004, 3.18133226e-003, + 5.33585902e-003, 8.91746208e-003, -5.50332852e-003, + -3.13695782e-004, 9.50451847e-003, 4.60966816e-003, + 2.61870660e-002, -2.87075751e-002, 6.48848787e-002, + 4.65245917e-002, -1.32335545e-002, -3.22434679e-002, + 4.63708863e-002, 4.87490520e-002, 2.64079613e-003, + -3.19659594e-005, 6.92713074e-003, 4.87097772e-003, + -8.67482945e-002, -5.72921243e-003, 1.05465174e-001, + 3.01229078e-002, 1.85530752e-001, -1.34304926e-001, + 4.42220986e-001, 2.36426502e-001, -1.47165507e-001, + -1.71595007e-001, 4.05910671e-001, 2.53136992e-001, + 6.41245618e-002, -5.82069391e-003, 7.76707307e-002, + 3.28559391e-002, -8.10010284e-002, -3.03129083e-003, + 1.00331925e-001, 2.66331974e-002, -2.57333163e-002, + 6.04735408e-003, 2.60613412e-001, 1.71866491e-001, + 6.49271086e-002, 7.12581153e-004, 2.52900690e-001, + 1.75866202e-001, 5.03133722e-002, -6.98494306e-003, + 6.55571073e-002, 3.62087376e-002, -5.91531536e-003, + -1.52604806e-003, 1.00624245e-002, 3.90631845e-003, + -3.94150894e-003, 1.84762366e-002, 3.82918678e-002, + 3.58017348e-002, 2.76802829e-003, 1.56035861e-002, + 3.49525735e-002, 3.27214971e-002, 2.71142321e-003, + -1.50907249e-003, 6.63377158e-003, 5.65727241e-003, + 1.62432482e-003, 1.51139572e-002, 5.10483468e-003, + 2.93546505e-002, -6.80830190e-003, 1.22371681e-001, + 2.70263217e-002, 2.43943110e-001, -1.08346418e-002, + 1.23633638e-001, 3.69075872e-002, 2.58595824e-001, + 1.35764503e-003, 1.14808204e-002, 8.93679913e-003, + 2.93713678e-002, 1.93250347e-002, 1.10404612e-003, + 3.76472361e-002, 3.26946750e-002, 2.68288609e-002, + 4.47165929e-002, 1.21133536e-001, 1.48674950e-001, + -5.36087714e-002, 8.12152848e-002, 1.42229661e-001, + 1.68108374e-001, -2.62820795e-002, 1.49120465e-002, + 6.11291900e-002, 3.81312966e-002, 3.03923637e-002, + -4.70609963e-002, 5.39006032e-002, 6.72720820e-002, + 7.45122060e-002, -2.47739926e-001, 1.71537191e-001, + 3.40257943e-001, -2.40236260e-002, -1.87481359e-001, + 1.16379187e-001, 3.00258100e-001, -3.60659361e-002, + -2.32096966e-002, 6.63679615e-002, 3.91180031e-002, + -1.65261546e-004, -2.86889030e-003, 5.36406226e-003, + 3.43324691e-002, 6.08660420e-003, -6.84589967e-002, + 2.89289989e-002, 2.96898514e-001, 5.18821273e-003, + -8.85908157e-002, 2.95521375e-002, 3.11457753e-001, + 4.32452798e-004, -1.02034705e-002, 8.39250442e-003, + 3.45046110e-002, -3.30023060e-004, 3.17715248e-003, + 3.90961440e-003, 7.81657267e-003, -4.25945688e-003, + 5.54775409e-002, 2.98374612e-002, 8.37200955e-002, + 1.04939081e-002, 7.78801069e-002, 3.21689472e-002, + 1.00135699e-001, 1.49617472e-003, 7.07556307e-003, + 5.36045991e-003, 1.14625357e-002, 2.16668714e-002, + 3.12171318e-002, 3.89262103e-002, 4.99484353e-002, + 1.24280844e-002, 2.80992955e-001, 2.04940200e-001, + 3.84459466e-001, 3.79510187e-002, 8.29645023e-002, + 2.71342307e-001, 4.24742907e-001, -2.89629418e-002, + 2.59109633e-003, 5.30277751e-002, 5.30903228e-002, + 2.95954347e-002, -1.47759216e-002, 4.26768772e-002, + 3.95781994e-002, 9.72620547e-002, -4.15433049e-002, + 1.77941635e-001, 1.86567605e-001, -1.10366285e-001, + 1.12868018e-001, 2.45807901e-001, 2.77942806e-001, + -2.40960922e-002, 7.10086804e-003, 4.93664965e-002, + 4.44020294e-002, 1.43286411e-003, -3.16695170e-003, + 4.64364095e-003, 1.10888304e-002, 1.19861467e-002, + -6.07318282e-002, 3.06084994e-002, 9.13160816e-002, + -3.47453915e-003, -7.37789050e-002, 3.10838483e-002, + 1.02456376e-001, -6.91589317e-004, -4.94363392e-003, + 5.42175956e-003, 9.50117595e-003, -8.57459102e-003, + 2.97975377e-003, 1.14271203e-002, 4.72496264e-003, + -2.90696602e-002, -6.36231015e-003, 4.15226035e-002, + 2.59576160e-002, 4.10870137e-003, -9.68039781e-003, + 2.58795638e-002, 2.38951892e-002, 8.85120127e-003, + 2.62349402e-003, 1.26148295e-002, 4.59877495e-003, + -6.92161918e-002, 1.25312656e-002, 8.19750503e-002, + 2.83107944e-002, -2.35732719e-001, 9.22704041e-002, + 3.02019149e-001, 1.64944336e-001, -9.94042493e-003, + 1.20740589e-002, 2.13061020e-001, 1.15125932e-001, + 1.01787709e-001, 9.64067876e-003, 1.22909263e-001, + 2.96113156e-002, -4.75387610e-002, 1.16195697e-002, + 6.30609840e-002, 2.62219533e-002, -2.19712719e-001, + 2.54752904e-001, 3.41269583e-001, 2.74984628e-001, + -1.78804323e-001, 1.44309953e-001, 3.60315591e-001, + 1.82486162e-001, 1.07831284e-001, 5.36960491e-004, + 1.28269121e-001, 2.89877243e-002, -1.15892920e-003, + 8.86278169e-004, 4.99420566e-003, 4.31421073e-003, + -2.81735342e-002, 3.83082591e-002, 5.08154146e-002, + 5.05706295e-002, -3.88417281e-002, 4.11613360e-002, + 6.02349937e-002, 5.05011939e-002, 8.50107521e-003, + 1.57887454e-003, 1.21016474e-002, 4.79667401e-003, + -4.61413106e-003, 1.58571568e-003, 1.62567664e-002, + 6.40946953e-003, -6.37550652e-002, -3.73516455e-002, + 8.92712772e-002, 4.82163467e-002, -9.38306912e-004, + -1.26114683e-002, 3.17917317e-002, 2.59730443e-002, + 6.30235812e-003, 9.79930395e-004, 8.93434975e-003, + 4.55480255e-003, -1.22770630e-001, -1.82586201e-002, + 1.63378537e-001, 4.53053974e-002, -2.49445423e-001, + -9.78159830e-002, 4.06328231e-001, 1.81529045e-001, + 5.69055341e-002, 4.17296495e-003, 1.91178754e-001, + 1.24619648e-001, 7.25165755e-002, 2.77265068e-002, + 8.45057741e-002, 4.24199961e-002, -1.56968296e-001, + -4.51552048e-002, 1.78847060e-001, 5.68467490e-002, + -5.55407405e-002, 5.34253474e-003, 2.13429630e-001, + 1.28754288e-001, 2.77069986e-001, 1.92105964e-001, + 3.48773062e-001, 2.45155275e-001, 5.22683784e-002, + 4.13026325e-002, 7.83010274e-002, 5.25132865e-002, + -1.23536279e-002, -2.85793119e-003, 1.55950543e-002, + 6.78951154e-003, 9.51058324e-003, 2.06938069e-002, + 3.47044207e-002, 3.52543294e-002, 6.82940409e-002, + 3.82144079e-002, 7.90959373e-002, 5.63451909e-002, + -1.14804856e-003, -1.74868642e-003, 8.29619635e-003, + 6.90209121e-003, 4.90573235e-003, 7.01154349e-003, + 1.04373451e-002, 1.14463856e-002, -7.27631375e-002, + -1.00009851e-001, 1.08693145e-001, 1.33295834e-001, + -3.79429478e-003, -7.52723068e-002, 6.61587194e-002, + 9.39128622e-002, 4.15488752e-003, -2.05434440e-003, + 9.47639346e-003, 7.07148015e-003, -8.66178796e-002, + -1.11137047e-001, 1.15494154e-001, 1.29684597e-001, + -2.01659784e-001, -2.81885743e-001, 4.29140329e-001, + 4.00116712e-001, 1.61063984e-001, -8.19818452e-002, + 2.60927618e-001, 1.89129755e-001, 5.61236069e-002, + -8.51336867e-003, 8.05868953e-002, 4.24915068e-002, + -4.22554202e-002, -2.53797993e-002, 5.62871285e-002, + 4.70983610e-002, 3.87868173e-002, 2.02770121e-002, + 1.43757090e-001, 1.18835725e-001, 1.27099276e-001, + -6.51791692e-003, 2.09670737e-001, 1.15584679e-001, + 6.31195456e-002, -2.55762204e-003, 8.65577236e-002, + 3.88255157e-002, -1.28198927e-003, 7.71958032e-004, + 4.37876116e-003, 3.35119641e-003, 3.08339926e-003, + 1.05303507e-002, 2.30713673e-002, 2.04586312e-002, + 2.07124427e-002, 1.13012847e-002, 3.70752551e-002, + 2.14702673e-002, 4.98828478e-003, 8.64515532e-005, + 1.02276932e-002, 4.47560521e-003, -3.81779601e-003, + 1.36464753e-003, 5.58763556e-003, 3.65285156e-003, + -4.13655071e-003, -5.56299556e-003, 1.75176114e-002, + 1.67321023e-002, 9.22260713e-003, -5.00429096e-003, + 2.14064661e-002, 1.67557038e-002, 4.17866139e-003, + 1.42195355e-003, 6.52679848e-003, 3.76927550e-003, + -6.03038371e-002, 4.27438617e-002, 6.91918805e-002, + 5.11959530e-002, -8.43329057e-002, 4.98080403e-002, + 1.49911895e-001, 1.18057325e-001, 1.04593985e-001, + 2.44206432e-002, 1.62239209e-001, 9.61746275e-002, + 4.34135161e-002, 1.62015241e-002, 5.98978065e-002, + 2.97506563e-002, -3.72296572e-002, 4.72790524e-002, + 5.81042133e-002, 5.60080595e-002, -3.67406726e-001, + 3.74141395e-001, 4.02259678e-001, 4.01143730e-001, + 1.35038972e-001, 1.40202254e-001, 2.42719695e-001, + 1.98769599e-001, 4.19962630e-002, 1.91215836e-002, + 6.50438666e-002, 3.53781097e-002, 1.36398175e-003, + -1.09967077e-003, 4.70998371e-003, 3.86128225e-003, + -4.15291637e-002, 4.25053686e-002, 5.39959408e-002, + 5.66324145e-002, -7.43458467e-003, 6.61409795e-002, + 5.26940823e-002, 7.44498447e-002, 1.14739442e-003, + 1.81748043e-003, 7.46846106e-003, 5.53872529e-003, + 6.27481728e-004, 1.52442732e-003, 4.45928006e-003, + 4.75080032e-003, 7.07501778e-004, 2.47310828e-002, + 2.87153572e-002, 3.89706306e-002, -2.13905312e-002, + 2.43685376e-002, 3.46790068e-002, 4.49020863e-002, + -2.21734299e-004, 8.14921339e-004, 3.54345469e-003, + 3.53529374e-003, 6.09852653e-003, 1.03145456e-002, + 3.44479829e-002, 3.09231319e-002, 4.62041944e-002, + 4.32460047e-002, 1.60633460e-001, 1.69408277e-001, + -6.87505007e-002, 1.61549971e-001, 2.42016345e-001, + 2.36310095e-001, -2.49767676e-002, 2.56587043e-002, + 4.44714427e-002, 4.07596119e-002, 1.95577908e-002, + 1.01010166e-002, 3.99741977e-002, 4.51948084e-002, + -1.00405268e-001, 2.92661265e-002, 2.81227231e-001, + 5.13678908e-001, -5.30544482e-002, -2.27696195e-001, + 2.04092368e-001, 4.09497559e-001, -3.05421073e-002, + -1.87538732e-002, 4.71128188e-002, 5.32201193e-002, + -1.13892462e-003, -7.22491043e-003, 4.28033154e-003, + 8.88159592e-003, -2.12664083e-002, -4.09835875e-002, + 3.67105380e-002, 6.61041364e-002, -1.34289660e-003, + -1.23327477e-002, 2.34996788e-002, 5.33899590e-002, + 8.63789639e-004, -8.73284182e-004, 5.06539317e-003, + 5.96527616e-003, -1.24043529e-003, 1.69587471e-002, + 4.23492491e-003, 2.35944670e-002, -5.27649047e-003, + 1.24127597e-001, 2.44911760e-002, 1.72694236e-001, + 1.07771892e-003, 1.20087355e-001, 2.75717136e-002, + 1.65300459e-001, -6.10584219e-004, 1.12859104e-002, + 8.22739769e-003, 1.72632206e-002, 7.42112519e-003, + 4.10377905e-002, 2.15362459e-002, 5.36268912e-002, + -3.01968195e-002, 3.05822313e-001, 1.20120794e-001, + 3.80827576e-001, -6.93408921e-002, 2.67409116e-001, + 1.83031201e-001, 4.11002576e-001, -9.02508497e-002, + 7.57188257e-003, 1.25208661e-001, 6.61415607e-002, + 6.03615632e-003, 6.59306243e-004, 1.70226004e-002, + 1.68809928e-002, -2.18584742e-002, -1.00567639e-002, + 1.06227852e-001, 1.16301544e-001, -1.85717717e-001, + -4.64929081e-002, 2.54150271e-001, 2.15452880e-001, + -9.15614218e-002, -1.52458167e-002, 1.43167078e-001, + 5.70368543e-002, 4.25272992e-005, -2.64925853e-004, + 2.54304917e-003, 2.60409177e-003, -7.49179302e-003, + -1.01252468e-002, 2.40737498e-002, 2.64798440e-002, + -4.21637930e-002, -2.33797971e-002, 5.65421507e-002, + 4.79805171e-002, -4.87917429e-003, 1.91434287e-003, + 1.66190788e-002, 7.67231965e-003, 1.33072352e-003, + -9.78686076e-005, 6.78903656e-003, 5.45646437e-003, + 7.46300817e-002, 4.15001214e-002, 8.67150202e-002, + 6.17935732e-002, 2.94497143e-002, 3.05122025e-002, + 4.32188883e-002, 3.93493064e-002, -2.84205220e-004, + 1.19737082e-003, 2.87835882e-003, 2.84028705e-003, + 7.80180693e-002, 2.40470823e-002, 9.25106257e-002, + 4.90432046e-002, 3.28646153e-001, 2.82004774e-001, + 3.88466448e-001, 3.35129350e-001, 4.39490518e-003, + 2.74974257e-002, 1.02260388e-001, 8.82497206e-002, + -8.18342436e-003, 7.36656148e-005, 1.67623125e-002, + 1.22095998e-002, 7.77934119e-002, -1.76567510e-002, + 9.48676094e-002, 4.40776534e-002, 3.03172678e-001, + -1.65985718e-001, 3.78487647e-001, 2.34448060e-001, + -2.09479611e-002, -3.93367112e-002, 1.00874558e-001, + 9.62910578e-002, -8.45210906e-003, -3.97811178e-003, + 1.85004156e-002, 1.45347575e-002, 3.42289405e-003, + 3.10582225e-004, 8.34951270e-003, 6.17939001e-003, + 5.71831353e-002, -4.34696265e-002, 7.29855224e-002, + 6.59330711e-002, 1.12361042e-002, -3.51147316e-002, + 3.37003097e-002, 4.98397127e-002, 2.37776461e-004, + -2.09215353e-003, 3.20749125e-003, 4.67557507e-003, + 1.08460465e-003, -1.58078002e-003, 6.26542559e-003, + 6.23548077e-003, -2.28077471e-002, -4.37737815e-002, + 5.18673621e-002, 6.31949753e-002, 1.66369472e-002, + -4.78324890e-002, 6.45286143e-002, 6.34730458e-002, + 1.50655920e-003, -2.60766737e-005, 8.24974477e-003, + 5.57620451e-003, -3.00320406e-002, -3.99100892e-002, + 5.33652529e-002, 5.46750389e-002, -1.47179499e-001, + -3.00637394e-001, 2.83807874e-001, 3.55758488e-001, + 1.91871271e-001, -2.21259698e-001, 3.75735968e-001, + 2.86309928e-001, 4.76833917e-002, -3.76007147e-002, + 7.80327916e-002, 5.48400320e-002, -3.01048476e-002, + 3.23646958e-003, 4.76263426e-002, 3.86994369e-002, + -8.79256949e-002, 9.28635299e-002, 1.89324200e-001, + 1.88549146e-001, 1.00816645e-001, 4.14951667e-002, + 2.07787663e-001, 1.70501798e-001, 4.76320609e-002, + -1.75777022e-002, 6.56624660e-002, 4.30362560e-002, + -8.78426246e-004, 5.29132842e-004, 5.55528468e-003, + 5.45634096e-003, -1.32802734e-002, 1.97098907e-002, + 3.53509970e-002, 3.88027318e-002, 5.43550914e-003, + 1.95314735e-002, 3.36822830e-002, 3.63000594e-002, + 2.96453969e-003, 3.45997338e-004, 6.66336855e-003, + 5.29111736e-003, -4.24324255e-003, -1.72550317e-005, + 8.91301874e-003, 7.58611364e-003, -1.47588598e-002, + -8.53176042e-002, 4.68110517e-002, 1.22012451e-001, + -2.70807813e-003, -9.16026831e-002, 3.34098712e-002, + 1.31695464e-001, -2.50290235e-004, -6.12248341e-003, + 5.63205639e-003, 1.30844777e-002, -5.05484082e-002, + 1.11912768e-002, 8.04531351e-002, 2.66444273e-002, + -3.40809524e-001, -7.44860852e-003, 3.89816910e-001, + 1.78419098e-001, 5.67384027e-002, -6.00901991e-002, + 1.36478916e-001, 1.75254881e-001, 2.98385266e-002, + -7.55122490e-003, 4.65409905e-002, 3.08469962e-002, + -3.72882560e-002, 1.59910286e-003, 7.31606185e-002, + 1.83523968e-002, -4.18866664e-001, 1.87555254e-002, + 4.60109442e-001, 1.25374317e-001, 5.54817505e-002, + 5.60201751e-003, 1.36322334e-001, 1.19310990e-001, + 3.05398945e-002, 4.16364666e-004, 4.75649908e-002, + 2.40068492e-002, -3.85612086e-003, -1.03118038e-003, + 1.00460229e-002, 3.32013937e-003, -5.59931435e-002, + 1.76706724e-002, 6.81127012e-002, 3.11804209e-002, + 5.25416760e-003, 1.70073118e-002, 2.52347738e-002, + 3.01045384e-002, 2.65405443e-003, 5.34436549e-004, + 6.05701888e-003, 4.12437506e-003, 7.66065205e-004, + 5.30321384e-003, 8.67406931e-003, 1.02001289e-002, + 1.59658138e-002, 1.07309990e-001, 4.03410159e-002, + 1.32884935e-001, -1.72508936e-002, 9.45583358e-002, + 3.88353541e-002, 1.25197768e-001, -1.78346282e-003, + 4.89227101e-003, 7.68853165e-003, 1.05564548e-002, + 3.69745493e-002, -2.88413925e-004, 1.05328083e-001, + 4.49599028e-002, 2.87217796e-001, 1.14178071e-002, + 3.53052557e-001, 3.00575525e-001, -1.33457348e-001, + 1.74220204e-001, 2.16695338e-001, 2.54705846e-001, + -7.01925606e-002, 2.20581442e-002, 1.05166577e-001, + 4.44618426e-002, 5.86991496e-002, 3.40926461e-002, + 1.09637685e-001, 5.26126847e-002, 1.96565643e-001, + 1.58195183e-001, 2.68987775e-001, 2.49975741e-001, + -1.09739415e-001, -1.06912572e-002, 2.00793684e-001, + 1.40791908e-001, -7.35393167e-002, -1.65361294e-003, + 1.07865565e-001, 3.31357419e-002, 8.88100453e-003, + 9.85716237e-004, 1.27087692e-002, 5.39219286e-003, + 9.91348363e-003, -1.07484180e-002, 2.90263444e-002, + 2.51683239e-002, -2.16029286e-002, -1.00446679e-002, + 3.56367938e-002, 2.37711612e-002, -6.34079706e-003, + 1.51869899e-004, 1.31145632e-002, 4.09506168e-003, + 6.38593966e-003, 4.71096544e-004, 2.03711074e-002, + 8.41846317e-003, 3.48604172e-002, 5.17429113e-002, + 8.17406625e-002, 7.47280493e-002, -5.16920537e-003, + 3.78000624e-002, 5.09400964e-002, 5.53336181e-002, + -1.32919326e-002, -3.22934403e-003, 2.13203765e-002, + 7.96795171e-003, 1.42224967e-001, 2.76892651e-002, + 2.02975690e-001, 5.78789562e-002, 1.21760421e-001, + 1.44251794e-001, 2.75746256e-001, 2.17271656e-001, + -1.88143492e-001, 5.02246171e-002, 3.07975233e-001, + 1.68761656e-001, -1.33560091e-001, -1.00740539e-002, + 1.99939236e-001, 4.24872711e-002, 1.41997561e-001, + 2.55586021e-002, 1.81826606e-001, 4.75769751e-002, + 1.72120780e-002, -3.24046016e-002, 1.71318278e-001, + 1.10139832e-001, -2.49061450e-001, -4.86445092e-002, + 3.64622325e-001, 1.38596743e-001, -1.17098615e-001, + -5.54556632e-003, 1.98052034e-001, 3.79107259e-002, + 1.01807741e-002, 1.03542686e-003, 1.61165111e-002, + 4.86413948e-003, 4.28371644e-003, -1.15187988e-002, + 3.40575650e-002, 2.42045857e-002, -4.84566949e-002, + -1.84776504e-002, 6.59929141e-002, 3.23043913e-002, + -8.26447364e-003, 4.93927801e-004, 2.13816408e-002, + 6.07682345e-003, 2.56850407e-003, -1.28260267e-003, + 5.59888640e-003, 6.14566822e-003, -6.38986239e-003, + -3.07733566e-002, 3.60840261e-002, 5.25087453e-002, + 6.62272237e-003, -4.63882089e-002, 4.80177589e-002, + 6.12564832e-002, 1.01628341e-003, -3.74758616e-004, + 4.97409655e-003, 4.01774514e-003, -7.51104532e-003, + -3.90391611e-002, 3.92462909e-002, 5.13733700e-002, + -4.44275774e-002, -2.56930411e-001, 2.22605705e-001, + 3.46573979e-001, 1.74536079e-001, -1.35904178e-001, + 4.05359715e-001, 2.68215001e-001, 3.12223732e-002, + -1.44030498e-002, 5.22563234e-002, 3.58880423e-002, + -1.39208483e-002, -4.40870784e-003, 2.99210493e-002, + 2.89249737e-002, 4.76978496e-002, -7.16011878e-003, + 1.62448987e-001, 1.53468177e-001, 1.57207772e-001, + 3.54196131e-002, 3.65552098e-001, 2.92077929e-001, + 3.86876650e-002, -2.06909113e-004, 5.67679070e-002, + 4.61119190e-002, -6.87375665e-004, 8.69148993e-004, + 3.83950188e-003, 4.03268496e-003, 1.55322738e-002, + 1.89655852e-002, 3.50074060e-002, 3.60263996e-002, + 3.49808186e-002, 2.57034209e-002, 5.60228489e-002, + 5.55419587e-002, 1.02251640e-003, -6.30586699e-004, + 5.91233000e-003, 6.59376150e-003, 4.94902069e-003, + -1.86873472e-003, 7.60530448e-003, 3.81611567e-003, + 3.83621752e-002, 1.22824227e-002, 5.14861643e-002, + 2.63252426e-002, -3.31066474e-002, 1.96326599e-002, + 4.68022078e-002, 3.06402706e-002, -4.03741980e-003, + -1.27014332e-003, 9.04868916e-003, 4.32978850e-003, + 3.50493602e-002, -5.26706688e-003, 5.16249985e-002, + 2.03453768e-002, 3.69972736e-001, -4.48030159e-002, + 4.03539360e-001, 1.40177444e-001, -1.77495927e-001, + 5.87065816e-002, 2.60529518e-001, 1.31213188e-001, + -6.54592291e-002, 9.00592562e-003, 8.73926803e-002, + 2.92119682e-002, 3.20146047e-002, -1.84462755e-004, + 4.83794734e-002, 1.88726839e-002, 3.45559090e-001, + -1.09153405e-001, 3.83754492e-001, 1.66600257e-001, + -2.52013002e-002, -6.20860048e-002, 2.35830322e-001, + 1.35787621e-001, -7.76976645e-002, 8.66357703e-003, + 9.31155309e-002, 2.95015704e-002, 2.51894491e-003, + 3.43301217e-004, 5.85913472e-003, 3.22685018e-003, + 3.42968926e-002, -2.38228980e-002, 4.81311865e-002, + 3.42290960e-002, 1.06891291e-002, -2.99723987e-002, + 4.33674715e-002, 3.78877223e-002, -6.81435782e-003, + -1.37472627e-004, 9.90772806e-003, 4.59276605e-003, + 5.71267174e-006, 2.25598109e-003, 7.89625011e-003, + 6.93986239e-003, -6.29912876e-003, 5.53602353e-002, + 4.40634266e-002, 7.72960782e-002, -1.83164403e-002, + 4.93812785e-002, 5.97080141e-002, 6.80798590e-002, + -6.75417599e-004, 5.17717504e-004, 6.02840818e-003, + 4.81458055e-003, 2.07935758e-002, 7.09656207e-003, + 5.07221036e-002, 3.19024101e-002, 6.60482189e-003, + 3.48839723e-002, 2.54149646e-001, 2.26584241e-001, + -2.39599496e-001, 6.61971495e-002, 4.98392135e-001, + 1.71931505e-001, -1.10178320e-002, 3.47741088e-003, + 5.15836999e-002, 2.71472447e-002, 1.53584173e-002, + -2.83181202e-003, 4.02497798e-002, 2.57743280e-002, + 5.73414005e-002, -1.21677248e-002, 1.82024553e-001, + 1.56189561e-001, -2.61440963e-001, -2.22775899e-002, + 4.40052480e-001, 1.50541261e-001, -1.28261326e-002, + 1.69024023e-003, 5.60021028e-002, 2.50953250e-002, + -2.66160467e-004, -2.96943914e-003, 4.78079356e-003, + 6.53145136e-003, -3.84344929e-003, -5.76544441e-002, + 3.48366499e-002, 7.71493688e-002, -1.86418965e-002, + -5.58816157e-002, 5.25868386e-002, 7.48110935e-002, + -5.62298228e-004, 1.44153208e-004, 6.69383118e-003, + 5.38853509e-003, 8.32493324e-003, 6.40204176e-003, + 1.19810151e-002, 1.88249405e-002, 3.11126057e-002, + 1.62196413e-001, 5.59694059e-002, 2.91855901e-001, + -1.99626070e-002, 1.72993764e-001, 3.90656926e-002, + 3.00635219e-001, -3.21668386e-003, 1.36117740e-002, + 1.75082423e-002, 2.29751673e-002, 1.38153225e-001, + 2.68129297e-002, 1.56741038e-001, 7.70549402e-002, + 1.73838720e-001, 1.00775205e-001, 2.75515139e-001, + 2.05310538e-001, -1.33084998e-001, 5.05970381e-002, + 2.04148635e-001, 1.77028626e-001, -1.03618704e-001, + 1.45573216e-002, 1.81394681e-001, 4.61075641e-002, + 1.83382481e-001, -1.87237766e-002, 1.97760582e-001, + 8.73149335e-002, 1.35204062e-001, -2.39239782e-002, + 2.54438788e-001, 1.40628681e-001, -6.43654689e-002, + 1.84144601e-002, 1.50653601e-001, 1.07955910e-001, + -1.11444473e-001, 2.34487262e-002, 1.63343892e-001, + 5.18857129e-002, 1.30196279e-002, 5.62183326e-003, + 1.74581613e-002, 1.48049239e-002, 2.67971400e-002, + -1.60583202e-002, 4.26650457e-002, 3.80941145e-002, + 9.27713700e-004, -3.36274249e-003, 1.59086287e-002, + 1.44939227e-002, -6.58174977e-003, 4.69991053e-003, + 9.44213476e-003, 5.83350006e-003, -2.01070751e-003, + 7.02627050e-003, 8.59917887e-003, 1.52900806e-002, + 1.16412640e-002, 9.72349346e-002, 4.13307138e-002, + 1.38350740e-001, -7.50632258e-003, 1.00314751e-001, + 4.16858792e-002, 1.36290237e-001, -3.98817938e-003, + 5.46907447e-003, 9.24866740e-003, 1.23526109e-002, + 1.61043741e-002, 2.64466926e-002, 5.53895347e-002, + 4.57012281e-002, 8.86022598e-002, 1.05171211e-001, + 1.87518120e-001, 2.07543731e-001, -1.65264010e-001, + 4.09861542e-002, 2.46122658e-001, 2.04669520e-001, + -6.89859763e-002, -3.23389564e-003, 1.06713772e-001, + 4.75442968e-002, 1.83009114e-002, -1.17725953e-002, + 4.16268110e-002, 3.82095501e-002, 4.57344111e-003, + -1.26618043e-001, 1.63819835e-001, 2.25353420e-001, + -2.50031710e-001, -1.85364619e-001, 3.40604752e-001, + 2.81969577e-001, -4.16241288e-002, -2.39963327e-002, + 1.04248293e-001, 5.05095385e-002, -4.44970734e-004, + -1.63897332e-002, 6.22170791e-003, 2.57861931e-002, + -4.54655150e-003, -1.42566949e-001, 3.40666100e-002, + 2.02057734e-001, -1.65482014e-002, -1.20208174e-001, + 4.67606299e-002, 1.78047493e-001, 3.45984241e-004, + -5.14302775e-003, 8.58887658e-003, 1.37583334e-002, + -3.57981975e-004, 7.96325738e-004, 6.17344957e-003, + 4.47339704e-003, 1.30980182e-002, 2.12750002e-003, + 4.11835462e-002, 5.27174063e-002, -2.64226622e-003, + 1.30782528e-002, 3.82300727e-002, 5.52873574e-002, + -8.83860223e-004, 8.81143089e-004, 4.72350232e-003, + 6.03228621e-003, 4.28642752e-003, -1.92495086e-003, + 4.97817360e-002, 2.46507172e-002, 2.41220966e-002, + -1.38729648e-003, 3.12360048e-001, 2.18596384e-001, + 6.27988428e-002, -4.39027697e-002, 3.74912858e-001, + 4.90667731e-001, -9.96470451e-003, 5.93375461e-003, + 5.41904718e-002, 5.22951335e-002, 5.41513367e-003, + -1.56058857e-004, 4.32091691e-002, 1.97433569e-002, + -8.47502053e-003, -2.13523023e-002, 3.04045320e-001, + 1.71369657e-001, 5.28724678e-002, -3.25847268e-002, + 2.98050642e-001, 2.18972594e-001, 1.93685223e-003, + -5.12523577e-003, 5.39415814e-002, 3.82831469e-002, + -2.18496461e-005, -7.05721613e-005, 5.20970160e-003, + 3.57400207e-003, -4.56330672e-005, -7.63911661e-003, + 3.47761437e-002, 3.85068953e-002, 6.03024056e-003, + -7.38385832e-003, 3.61952037e-002, 4.21778187e-002, + 2.22564660e-004, -9.21148981e-004, 5.83203882e-003, + 5.15531190e-003, -6.86012488e-003, 7.41264841e-004, + 1.02452142e-002, 3.10278661e-003, -1.48160486e-002, + -7.54278013e-003, 3.48589830e-002, 2.33035590e-002, + 5.06343357e-002, -1.42429229e-002, 9.00403932e-002, + 3.20422053e-002, -1.40751316e-003, 1.86681410e-003, + 9.65119433e-003, 5.07272454e-003, -5.84177077e-002, + -3.48771602e-004, 7.75648430e-002, 1.94960330e-002, + -1.15567319e-001, 2.87522282e-003, 2.02719256e-001, + 1.00827120e-001, 2.82412261e-001, -7.98782781e-002, + 6.32183492e-001, 2.02341557e-001, 1.08435722e-002, + -2.00779047e-002, 7.62282163e-002, 4.46583256e-002, + -5.48206270e-002, -4.20943554e-003, 7.42413476e-002, + 2.19402295e-002, -1.01499051e-001, 2.31318250e-002, + 1.92801252e-001, 1.17116973e-001, 1.45916805e-001, + 7.71507248e-002, 3.03799301e-001, 1.85407162e-001, + 4.89964485e-002, -7.52447522e-004, 8.56002048e-002, + 4.80317138e-002, -5.63204614e-003, 8.77296494e-004, + 9.45582986e-003, 3.99675639e-003, -7.15318229e-003, + 1.69315543e-002, 3.37829441e-002, 3.18339430e-002, + 2.40230821e-002, 1.94318462e-002, 4.38940860e-002, + 4.25206535e-002, 2.11683754e-003, -3.19715519e-003, + 1.05595132e-002, 6.59760321e-003, -3.71438742e-004, + 1.45214153e-002, 4.75508720e-003, 1.91784073e-002, + -1.97951943e-002, 1.40173718e-001, 4.37818654e-002, + 1.81588069e-001, -3.81804295e-002, 1.12698525e-001, + 6.57305494e-002, 1.70204014e-001, 4.51282738e-003, + 7.50573399e-003, 1.28309317e-002, 1.70807410e-002, + 4.85504838e-003, 2.95912684e-003, 1.69704184e-002, + 2.10371353e-002, -1.20035233e-002, 7.61459321e-002, + 1.28528133e-001, 1.43589646e-001, -1.84797421e-001, + 2.35029057e-001, 2.42713764e-001, 3.04082930e-001, + -1.42969666e-002, 4.10731286e-002, 6.38739914e-002, + 6.00985996e-002, 1.06659671e-002, -1.70213021e-002, + 2.21641269e-002, 3.30471098e-002, 2.51056463e-003, + -1.08873211e-001, 9.30830911e-002, 1.93824068e-001, + -5.20968959e-002, -1.00527920e-001, 1.07092410e-001, + 2.04365358e-001, -2.68926974e-002, -3.86623596e-003, + 5.21116965e-002, 4.58438396e-002, 2.56258808e-003, + -2.50821244e-002, 6.00915961e-003, 4.48984094e-002, + -9.15090367e-003, -2.13016316e-001, 3.28570977e-002, + 3.35866421e-001, -8.99429619e-003, -2.23973170e-001, + 2.49315556e-002, 3.41769338e-001, 3.95945227e-003, + -2.62113232e-002, 9.79656167e-003, 4.24683467e-002, + 1.87349948e-003, 9.84645355e-003, 1.00777950e-002, + 1.94617566e-002, 2.18052622e-002, 1.51721671e-001, + 5.76297008e-002, 2.09277600e-001, 7.69732287e-004, + 1.70632228e-001, 4.49829176e-002, 2.37463459e-001, + 9.43725638e-004, 1.78789496e-002, 6.67491090e-003, + 2.71125417e-002, 6.67879879e-002, 9.81974602e-003, + 9.53209326e-002, 6.07425235e-002, 2.58381993e-001, + 1.15543835e-001, 3.36941540e-001, 2.28405222e-001, + -9.18492302e-003, 6.14163876e-002, 9.24348086e-002, + 1.50450915e-001, -1.05824843e-002, 1.04980944e-002, + 2.81263776e-002, 2.06585564e-002, 7.70776719e-002, + 7.76046468e-003, 1.00062415e-001, 5.79406917e-002, + 1.39666855e-001, -5.98824024e-002, 2.26813495e-001, + 1.95354626e-001, 1.16358949e-002, -6.36395961e-002, + 8.76043141e-002, 1.29100800e-001, -1.17384307e-002, + -1.27121080e-002, 2.94430666e-002, 2.29152516e-002, + 2.84692808e-003, -1.31431911e-002, 7.43156765e-003, + 2.69128866e-002, 7.30246305e-003, -1.81277424e-001, + 3.70565131e-002, 2.82689184e-001, 7.19675515e-003, + -1.86331734e-001, 2.78705042e-002, 2.76835948e-001, + -5.84863119e-005, -2.09473278e-002, 5.23371948e-003, + 3.24158072e-002, 6.20560779e-004, 5.59846312e-003, + 4.98010498e-003, 1.72092989e-002, 1.49564845e-002, + 9.59008262e-002, 4.89377603e-002, 1.55125827e-001, + -1.03257885e-002, 1.29862607e-001, 7.13427961e-002, + 2.35838294e-001, 1.44414580e-003, 6.10541180e-003, + 1.11658899e-002, 2.81679817e-002, 2.08213702e-002, + 4.87733148e-002, 3.88153046e-002, 7.32768178e-002, + 1.58719465e-001, 1.10154644e-001, 2.36384675e-001, + 3.20800602e-001, -3.42339240e-002, 1.04679935e-001, + 2.59444386e-001, 2.48260185e-001, -3.99012938e-002, + 5.89206908e-003, 7.17140660e-002, 7.49280304e-002, + 5.49725071e-003, 1.21550178e-002, 2.28959601e-002, + 3.87788042e-002, -6.63904250e-002, -2.09386903e-003, + 1.84957236e-001, 2.15710193e-001, 7.86916241e-002, + -1.14168219e-001, 2.90177226e-001, 2.12368712e-001, + -7.52578676e-002, -6.32758625e-003, 1.16911143e-001, + 5.19949570e-002, -3.88519693e-004, -1.73486583e-002, + 3.22982669e-003, 2.32010297e-002, -2.35942975e-002, + -1.48313284e-001, 3.51036638e-002, 1.95252329e-001, + -9.25061002e-004, -1.56310678e-001, 5.63877188e-002, + 2.02185079e-001, -5.11548063e-003, -1.54674686e-002, + 1.16099445e-002, 2.34665088e-002, 2.80642766e-003, + -3.65511427e-004, 5.59710804e-003, 2.08656583e-003, + -3.18262639e-004, 5.99283725e-003, 2.45897565e-002, + 1.53120048e-002, -2.90753711e-002, 8.94530211e-003, + 5.17762601e-002, 2.43959446e-002, -1.72347203e-003, + -1.52765401e-003, 9.02712904e-003, 4.07398492e-003, + 2.89523732e-002, 4.35102003e-004, 4.28095870e-002, + 1.40722878e-002, 9.85869113e-003, 1.70462504e-002, + 1.69073060e-001, 9.97062773e-002, -1.65962309e-001, + 3.20333727e-002, 3.95550072e-001, 1.47643238e-001, + -2.62758303e-002, 6.71335822e-003, 7.25318715e-002, + 2.41552554e-002, 3.60712186e-002, -2.62402976e-003, + 5.03392145e-002, 1.49321994e-002, -1.73340410e-001, + -8.88076648e-002, 3.29057306e-001, 1.51613802e-001, + -3.39162275e-002, -2.08006993e-001, 5.56526124e-001, + 2.52405167e-001, -2.06759982e-002, -8.19038879e-003, + 6.53652623e-002, 2.46379916e-002, 4.03581094e-003, + -1.73935003e-003, 7.00797234e-003, 3.76252108e-003, + -5.30277342e-002, -3.33810374e-002, 7.14490861e-002, + 4.14084271e-002, 4.48293606e-004, -3.92354019e-002, + 5.76164909e-002, 4.99886125e-002, -5.61877503e-004, + -1.99506595e-003, 5.86631009e-003, 3.74720921e-003, + 2.48122000e-004, 6.06004428e-003, 4.84270556e-003, + 9.14941169e-003, -1.34772360e-002, 7.44289458e-002, + 3.71439718e-002, 9.23962817e-002, -1.95853058e-002, + 3.24210338e-002, 4.11063097e-002, 7.32243359e-002, + 1.66876160e-003, -1.00549718e-003, 5.20461332e-003, + 8.26402940e-003, 2.98503656e-002, 2.94992188e-003, + 4.37130667e-002, 3.69641855e-002, 7.98763037e-002, + 8.35075676e-002, 1.97564900e-001, 2.41541028e-001, + -1.19720206e-001, 3.89236063e-001, 2.62408555e-001, + 4.48110014e-001, -4.91748713e-002, 4.90706563e-002, + 6.62173629e-002, 6.84985295e-002, 3.02371811e-002, + -2.11000489e-003, 4.34068069e-002, 3.92870530e-002, + 1.43192634e-001, -7.30105070e-003, 2.10100383e-001, + 2.60372698e-001, -4.89001386e-002, -1.26311466e-001, + 1.97911799e-001, 2.36602679e-001, -5.43179810e-002, + -1.10569820e-002, 7.08812699e-002, 4.24184501e-002, + 1.54498382e-003, -4.76601388e-004, 5.31441113e-003, + 6.16529211e-003, 6.29850477e-003, -3.37387472e-002, + 3.34497355e-002, 5.77023029e-002, -8.03876389e-003, + -3.41042578e-002, 3.58259641e-002, 5.72688803e-002, + -1.73254032e-003, -8.31985031e-004, 6.90766424e-003, + 6.55100727e-003, 1.73307173e-002, -2.74645817e-003, + 2.17273198e-002, 5.81444008e-003, 7.90261012e-003, + 1.29678911e-002, 3.28157656e-002, 2.28558294e-002, + -4.12083268e-002, 1.20090405e-002, 5.38161062e-002, + 2.38342080e-002, -6.20030006e-003, -1.41642941e-003, + 1.11146485e-002, 5.49253821e-003, 1.75296739e-001, + -2.04450041e-002, 2.08604902e-001, 3.62349078e-002, + 7.34942928e-002, 1.05393389e-002, 1.95594907e-001, + 7.23996162e-002, -3.32623899e-001, 2.09648069e-002, + 3.81029397e-001, 1.01538658e-001, -4.37683985e-002, + -2.58181058e-003, 7.99947158e-002, 3.27840745e-002, + 1.53835043e-001, -1.44761847e-002, 2.05939472e-001, + 3.91880348e-002, 1.76826879e-001, -6.22164384e-002, + 2.87056744e-001, 1.18792541e-001, -3.17783117e-001, + -5.15993359e-003, 3.66875321e-001, 1.05949394e-001, + -4.67395745e-002, 7.97165930e-003, 7.85661563e-002, + 3.15783434e-002, 1.08121401e-002, 2.30087060e-003, + 2.40100399e-002, 6.21330226e-003, 4.53678183e-002, + -2.21918393e-002, 6.66830987e-002, 3.52239385e-002, + -3.78592536e-002, -1.39360577e-002, 5.33417352e-002, + 2.94285752e-002, -5.22885891e-003, 1.69244164e-003, + 9.70636401e-003, 5.62303979e-003, -4.38220450e-004, + 5.92093042e-004, 4.64186911e-003, 4.56910767e-003, + 9.65746678e-003, 2.87390705e-002, 3.48499827e-002, + 4.35322486e-002, -1.27660874e-002, 2.83681601e-002, + 3.49571519e-002, 4.09556627e-002, -1.68165145e-003, + 1.04252955e-004, 4.64826077e-003, 4.02006740e-003, + 3.03824674e-002, 2.01038197e-002, 4.55924384e-002, + 3.75426523e-002, 4.51361202e-002, 1.88560903e-001, + 2.60742933e-001, 2.71252215e-001, -1.97166324e-001, + 6.35329485e-002, 2.76494175e-001, 2.17231840e-001, + -3.08353510e-002, 7.07984949e-003, 4.28827517e-002, + 2.89144851e-002, 3.18031572e-002, -2.17463505e-002, + 4.59147431e-002, 4.12405841e-002, -8.14863071e-002, + -3.25881004e-001, 2.79273719e-001, 3.64172131e-001, + -6.82911351e-002, -1.89375073e-001, 2.30375707e-001, + 2.63114899e-001, -3.34911905e-002, -8.07714649e-003, + 4.33289036e-002, 2.97675990e-002, -6.98961143e-004, + -2.42234650e-003, 4.14250931e-003, 5.52703207e-003, + -2.33380566e-003, -2.38639265e-002, 2.71185674e-002, + 4.04958390e-002, 1.73171342e-003, -2.64544785e-002, + 2.65978854e-002, 3.87204960e-002, -8.86554597e-004, + -1.36479805e-003, 3.74020892e-003, 4.07703314e-003, + 1.42452645e-003, 3.96508753e-004, 3.78689822e-003, + 3.77549161e-003, 1.40049635e-002, 3.60943452e-002, + 3.77207398e-002, 5.24687879e-002, -5.00186253e-003, + 3.83898281e-002, 2.90348809e-002, 5.97543567e-002, + 2.26077856e-004, 2.42098072e-003, 4.30449983e-003, + 6.61954097e-003, 2.19684541e-002, -1.31935312e-003, + 3.63971740e-002, 2.35745851e-002, 2.26374477e-001, + 3.43985297e-002, 3.34942251e-001, 2.55791038e-001, + -5.46679422e-002, 7.89841288e-004, 1.76281542e-001, + 4.28227752e-001, -1.90640092e-002, 4.07471647e-003, + 3.47835533e-002, 4.75241914e-002, 2.27731280e-002, + 1.25472632e-003, 3.72697040e-002, 2.12778263e-002, + 2.66798973e-001, 1.43162664e-002, 3.36752176e-001, + 2.19823301e-001, -6.94490224e-002, 8.16009045e-002, + 1.65427193e-001, 3.29582900e-001, -2.08972972e-002, + 5.50982868e-003, 3.66881266e-002, 3.91745605e-002, + 1.74252375e-003, 3.21815256e-004, 4.48521739e-003, + 3.46260495e-003, 2.54907552e-002, -3.08065917e-002, + 4.08474095e-002, 4.71400544e-002, -4.70628589e-003, + -3.81404459e-002, 2.82813851e-002, 5.65899797e-002, + -4.24364087e-004, -1.81930780e-003, 4.48606908e-003, + 6.28054840e-003, -4.23456513e-005, 1.66161638e-003, + 2.44106795e-003, 4.22534812e-003, 1.76459982e-003, + 1.81697328e-002, 1.43938391e-002, 3.53702232e-002, + -1.69203046e-003, 1.70971155e-002, 1.49491383e-002, + 3.41582671e-002, -9.07229478e-005, 1.26479950e-003, + 2.27134861e-003, 3.98747344e-003, 1.10390168e-002, + 2.33517364e-002, 2.14653052e-002, 3.80233377e-002, + 2.83285975e-002, 1.77806556e-001, 9.88892540e-002, + 2.79604644e-001, -3.53805013e-002, 1.78063720e-001, + 1.03151873e-001, 2.74594903e-001, -1.19653540e-002, + 2.40656249e-002, 2.17684489e-002, 3.72022241e-002, + 1.37827508e-002, -1.29073123e-002, 2.34477594e-002, + 6.28627837e-002, 3.61914188e-002, -9.16479602e-002, + 1.03909343e-001, 5.46336055e-001, -3.03950962e-002, + -8.04238319e-002, 1.02356702e-001, 5.38302660e-001, + -1.40282968e-002, -9.31930542e-003, 2.35590935e-002, + 6.23215139e-002, -2.85562681e-004, -1.92007667e-003, + 2.77348305e-003, 5.61149698e-003, 1.30424870e-003, + -2.23890189e-002, 1.68343186e-002, 4.59387526e-002, + 4.11018700e-004, -2.21157148e-002, 1.53852906e-002, + 4.62391265e-002, 1.72702770e-004, -2.03558803e-003, + 2.54593277e-003, 5.79388533e-003, 1.15702662e-003, + 4.16022143e-004, 3.67589388e-003, 2.70864693e-003, + 4.56775026e-003, 9.00508929e-003, 1.62339620e-002, + 1.72136277e-002, -3.89261311e-003, 7.01204780e-003, + 1.50520317e-002, 1.62174795e-002, -2.37151771e-003, + -8.36538893e-005, 4.34339093e-003, 3.24996957e-003, + 2.89841946e-002, -1.95805859e-002, 4.11992148e-002, + 3.53463776e-002, 2.55951658e-002, -4.96490719e-003, + 1.06167853e-001, 1.01377510e-001, -5.77141158e-002, + -2.54620314e-002, 1.17147475e-001, 1.05475821e-001, + -3.73391248e-002, -3.17469761e-002, 4.97923531e-002, + 4.54294682e-002, 4.34651822e-002, -7.16463327e-002, + 6.71436191e-002, 8.79766867e-002, 2.41985604e-001, + -2.96507508e-001, 3.00974190e-001, 3.53799969e-001, + -3.04317117e-001, -2.38321379e-001, 3.62273306e-001, + 3.05348158e-001, -4.75293621e-002, -7.14569762e-002, + 7.85766840e-002, 8.75604153e-002, -1.28676672e-003, + -2.52495520e-003, 6.61523920e-003, 8.37263372e-003, + 3.26525532e-002, -9.42325145e-002, 5.87534681e-002, + 1.11764111e-001, -2.44678557e-002, -9.48260799e-002, + 6.43202960e-002, 1.13797903e-001, -1.14947732e-003, + -3.83573701e-004, 7.41728023e-003, 7.63741182e-003, + 1.07863289e-003, -1.97885279e-003, 5.99826733e-003, + 6.70104753e-003, -1.65678449e-002, -3.36551070e-002, + 4.91795540e-002, 5.87871037e-002, -3.80842690e-003, + -4.05573659e-002, 4.73157465e-002, 5.83044663e-002, + 2.69333087e-003, -1.64417631e-003, 6.64612930e-003, + 6.18805736e-003, -4.05251086e-002, -1.68106426e-002, + 5.76436184e-002, 5.31540774e-002, 4.20534430e-004, + -2.54363567e-001, 2.68174708e-001, 3.47518712e-001, + 9.50038731e-002, -2.96481382e-002, 2.58324206e-001, + 2.48891294e-001, 4.41128723e-002, 1.92121521e-003, + 5.88836819e-002, 4.22982611e-002, -3.86111885e-002, + 3.92325670e-002, 5.81594929e-002, 5.64622916e-002, + -1.65954515e-001, 2.05544800e-001, 2.95285910e-001, + 3.03745627e-001, 1.69497699e-001, -6.87054396e-002, + 2.63151377e-001, 2.27899283e-001, 4.27119099e-002, + -1.08077880e-002, 5.83135709e-002, 4.23451960e-002, + -7.33535899e-006, -1.33037532e-003, 6.36608107e-003, + 5.91794541e-003, -3.82060967e-002, 2.64509805e-002, + 5.56011871e-002, 5.13820387e-002, 7.60364463e-004, + 3.42363715e-002, 4.24196124e-002, 4.92314212e-002, + 2.67057703e-003, -4.11717745e-004, 6.61276001e-003, + 6.08804869e-003, 2.19713827e-003, 1.29396922e-003, + 4.75354772e-003, 4.60508652e-003, -1.98240305e-004, + 4.22377586e-002, 3.51304375e-002, 5.14660329e-002, + -2.73072403e-002, 2.58358009e-002, 4.04664576e-002, + 4.30108197e-002, 6.34649536e-004, -3.84897081e-004, + 3.90471611e-003, 4.11391957e-003, 2.75315735e-002, + -5.35860425e-003, 3.65735441e-002, 2.67491452e-002, + 1.83188304e-001, -8.58959556e-002, 2.57568330e-001, + 2.69653380e-001, -1.99571237e-001, 2.30363667e-001, + 3.22497040e-001, 3.31420481e-001, -2.83673462e-002, + 2.52011232e-002, 4.44216244e-002, 4.02410664e-002, + 2.06619222e-002, -8.20607692e-003, 3.01746484e-002, + 2.42782328e-002, 1.24723487e-001, -1.28083631e-001, + 2.07011014e-001, 2.11988360e-001, 7.76381940e-002, + -2.28807479e-001, 2.93384522e-001, 3.04326922e-001, + -4.37437519e-002, -3.82132013e-003, 5.38253933e-002, + 3.89983393e-002, 8.40971188e-004, -1.08972145e-003, + 3.43402615e-003, 3.73311783e-003, 4.95361304e-003, + -2.34485958e-002, 2.55162511e-002, 3.50086503e-002, + 1.72425678e-003, -2.88469102e-002, 2.96949428e-002, + 4.17819917e-002, -4.42938268e-004, -1.92393432e-003, + 4.46829852e-003, 5.18261641e-003, 3.69543181e-004, + -1.59951963e-003, 3.93762346e-003, 5.78814652e-003, + -1.12184137e-003, -2.48987023e-002, 2.15706974e-002, + 4.77993600e-002, -6.00643270e-003, -2.80696880e-002, + 2.35450082e-002, 4.74224277e-002, -1.40940119e-003, + -3.27531295e-003, 3.74166924e-003, 6.44595083e-003, + -1.40981087e-002, -2.43048696e-003, 2.98326164e-002, + 5.60167469e-002, -8.59203711e-002, -6.02166057e-002, + 1.61611304e-001, 4.02052969e-001, -3.18184793e-002, + -1.34040952e-001, 1.56238690e-001, 3.95601898e-001, + 1.18285576e-002, -1.12403166e-002, 2.85633299e-002, + 4.88060117e-002, -2.27975100e-002, -2.41165385e-002, + 3.56014520e-002, 6.28538579e-002, -6.99950084e-002, + -1.58647522e-001, 1.62244901e-001, 4.36351627e-001, + 8.30271989e-002, 3.95276397e-002, 1.82579458e-001, + 3.45244437e-001, 1.49705810e-002, 1.86171532e-002, + 2.98302919e-002, 4.81688902e-002, 1.94524284e-004, + 4.39067371e-003, 4.53423103e-003, 8.80029239e-003, + 3.16244387e-003, 5.66499270e-002, 2.74247006e-002, + 7.45502785e-002, 1.04588317e-002, 4.04985622e-002, + 2.84064449e-002, 6.24506809e-002, -1.03793929e-004, + 2.10452615e-003, 4.14585602e-003, 6.66545192e-003, + -2.18234886e-003, -1.31676365e-002, 7.48362532e-003, + 2.21068934e-002, -9.37326904e-003, -7.92185068e-002, + 3.94669548e-002, 9.96319950e-002, 9.13007092e-003, + -6.35812134e-002, 5.01077883e-002, 7.90558383e-002, + 9.53181554e-003, 1.37107295e-003, 1.67170800e-002, + 7.53458962e-003, -3.02319750e-002, 1.25650978e-002, + 5.30114062e-002, 4.34347726e-002, -4.19244096e-002, + 5.70846535e-002, 1.73060685e-001, 3.43476564e-001, + 1.31401047e-001, 7.55042350e-003, 2.65651971e-001, + 3.50536466e-001, 1.60775200e-001, -1.47862034e-003, + 1.99804530e-001, 4.57878634e-002, -3.87166850e-002, + 2.33999752e-002, 6.96328804e-002, 5.26673943e-002, + -1.04012452e-001, 1.71452146e-002, 2.17494547e-001, + 3.54905188e-001, 4.98272851e-002, -6.94948360e-002, + 2.23041341e-001, 2.33348027e-001, 1.65717468e-001, + -1.55858723e-002, 1.98014840e-001, 4.08611670e-002, + -1.02810294e-003, -3.94828571e-003, 7.53542408e-003, + 1.25457263e-002, -3.28204148e-002, 1.84723418e-002, + 4.40765284e-002, 5.76498322e-002, 1.57398707e-003, + 3.28500308e-002, 3.46641466e-002, 5.10399193e-002, + 1.90921146e-002, 1.33939413e-003, 2.45246366e-002, + 5.91939455e-003, -6.65524130e-005, -1.06110156e-003, + 3.84681649e-003, 3.56194493e-003, 1.88292395e-002, + -2.27825046e-002, 3.52051929e-002, 3.43467556e-002, + 5.35981059e-002, -2.54571233e-002, 7.18974620e-002, + 4.43622321e-002, 1.15995167e-003, 1.30922592e-003, + 4.91026184e-003, 3.26128164e-003, -1.08446879e-002, + -2.92651844e-003, 2.71990821e-002, 1.64176617e-002, + 5.39902337e-002, -3.84052359e-002, 1.45949215e-001, + 1.06688388e-001, 3.34792852e-001, -1.53650463e-001, + 5.09475350e-001, 2.12439999e-001, 2.69271452e-002, + -4.97345021e-003, 4.67213355e-002, 1.72465798e-002, + -1.02411713e-002, 2.20132852e-003, 2.62058396e-002, + 1.40369432e-002, 4.17838842e-002, 2.40029413e-002, + 1.39159217e-001, 8.82183835e-002, 2.94579774e-001, + 5.07280976e-002, 4.85946983e-001, 1.34981841e-001, + 3.48585509e-002, 4.11695248e-004, 5.46953157e-002, + 1.72158014e-002, -4.07174026e-004, 4.58582799e-004, + 3.68206785e-003, 2.39736633e-003, 7.97929242e-003, + 1.12368185e-002, 2.53656916e-002, 2.16882806e-002, + 4.49780151e-002, 1.60622932e-002, 6.53081611e-002, + 3.30015942e-002, 3.43775749e-003, -1.76580274e-003, + 7.05644768e-003, 3.60756530e-003, -1.82968881e-002, + 2.28092237e-003, 2.19480358e-002, 5.26339235e-003, + -2.53076293e-002, -1.31526506e-002, 4.31229733e-002, + 2.61019785e-002, 5.93696628e-003, -1.10500082e-002, + 1.99888218e-002, 2.40944158e-002, 1.36934663e-003, + -4.77164343e-004, 4.24561417e-003, 3.13628605e-003, + -1.65200204e-001, 1.13170119e-002, 1.84047341e-001, + 2.95111444e-002, -1.93463624e-001, -1.07397803e-003, + 2.68933237e-001, 1.06378488e-001, 5.62227331e-002, + 1.01090875e-003, 1.17141485e-001, 9.88355353e-002, + 1.90064758e-002, 4.32223780e-003, 3.16794887e-002, + 1.95609443e-002, -1.60333276e-001, 7.96520617e-003, + 1.75969034e-001, 3.40282321e-002, -1.68447360e-001, + 1.96170956e-001, 2.87853867e-001, 2.48394758e-001, + 8.48664641e-002, 3.02411705e-001, 1.59927517e-001, + 3.52337629e-001, 2.13708710e-002, 4.59003896e-002, + 4.06478085e-002, 5.66133261e-002, -8.38494115e-003, + 4.38263919e-003, 1.37876272e-002, 1.06997080e-002, + 1.39651829e-002, 1.46962553e-001, 5.98059632e-002, + 1.80999950e-001, 8.57435353e-003, 1.38435915e-001, + 4.98143956e-002, 1.93211362e-001, -2.36879499e-003, + 1.10734152e-002, 8.01132154e-003, 2.10893229e-002, + 1.24821032e-004, 6.48642005e-003, 6.48116041e-003, + 1.23806810e-002, -4.11966443e-003, 8.75025764e-002, + 4.01131548e-002, 1.26188949e-001, 1.45872533e-002, + 1.10040061e-001, 4.16060425e-002, 1.48449674e-001, + -6.11961959e-003, 8.66094045e-003, 1.53312441e-002, + 1.32317897e-002, 2.85408795e-002, 4.89524826e-002, + 6.66152909e-002, 5.59064336e-002, -9.55517441e-002, + 2.59016544e-001, 2.57449269e-001, 3.11179996e-001, + 1.08343579e-001, 1.72636822e-001, 3.80554169e-001, + 2.50716329e-001, -1.22324482e-001, 6.22495357e-003, + 2.11616069e-001, 2.89736446e-002, 1.56539772e-002, + 5.60364593e-003, 3.55095677e-002, 1.85840204e-002, + -1.13650128e-001, 1.49750598e-002, 2.02576712e-001, + 9.39987078e-002, 5.51842563e-002, 1.66663416e-002, + 2.95798659e-001, 1.16885163e-001, -1.32956252e-001, + 2.98539642e-003, 2.12818980e-001, 2.00466271e-002, + 4.34994960e-004, 5.21557922e-005, 3.42982495e-003, + 1.66597567e-003, -5.03522344e-003, -2.98739760e-003, + 2.12993510e-002, 1.01075042e-002, -2.48304056e-003, + -2.10201673e-004, 3.04214824e-002, 1.17884809e-002, + -1.67161115e-002, 4.11193323e-004, 2.67517120e-002, + 3.29559413e-003, -8.67887284e-005, 6.83491118e-004, + 3.23015056e-003, 5.61385788e-003, 7.93764601e-004, + 6.47771265e-003, 1.65681448e-002, 4.50002924e-002, + 1.49063219e-003, 5.08792372e-003, 1.64718460e-002, + 4.46539596e-002, 7.59229692e-008, 1.80004950e-004, + 2.60030222e-003, 5.49038965e-003, 9.40784439e-003, + 9.79674794e-003, 2.69971862e-002, 5.69208786e-002, + 2.23405920e-002, 8.78425464e-002, 1.10762596e-001, + 4.90677834e-001, -1.08080655e-002, 9.60031971e-002, + 1.18249096e-001, 4.71778929e-001, -1.26613602e-002, + 1.30781969e-002, 2.70224866e-002, 5.50071746e-002, + 1.29334284e-002, 8.91406927e-003, 2.86143944e-002, + 4.74378988e-002, 1.62735116e-002, 7.78941512e-002, + 1.19027629e-001, 3.72666895e-001, -2.83086300e-002, + 4.19319123e-002, 1.25490859e-001, 3.99730027e-001, + -1.59253720e-002, -6.75024465e-004, 2.97833681e-002, + 5.00456430e-002, 4.56545473e-004, -2.32382189e-003, + 3.81741277e-003, 6.34500897e-003, 1.46218541e-003, + -2.75618993e-002, 2.08140183e-002, 5.62902987e-002, + -2.69174739e-003, -2.06507575e-002, 1.98137555e-002, + 5.39795980e-002, -7.48837367e-004, -3.99786542e-004, + 3.25969420e-003, 6.46836078e-003, 6.27137115e-003, + -3.32042435e-003, 8.39549862e-003, 6.41762931e-003, + 1.59239806e-002, 8.80506355e-003, 2.58925520e-002, + 2.37315111e-002, -2.22683791e-003, 8.19365773e-003, + 1.53973168e-002, 1.67266242e-002, -1.12891488e-003, + 4.30405416e-005, 2.78563937e-003, 2.40906421e-003, + 6.37746602e-002, -3.13538238e-002, 7.43469819e-002, + 4.84850146e-002, 1.98825225e-001, -9.91070792e-002, + 2.50993550e-001, 1.88637033e-001, -4.37479578e-002, + -3.77146825e-002, 1.08437136e-001, 1.12378381e-001, + -2.15687454e-002, -1.68507677e-002, 3.25180553e-002, + 2.96073649e-002, 2.87146755e-002, -1.70945600e-002, + 4.63621803e-002, 3.16513814e-002, 4.25698370e-001, + -1.53129712e-001, 4.60694134e-001, 2.47009754e-001, + -1.75435215e-001, -1.45802289e-001, 2.45831966e-001, + 2.48770267e-001, -2.52736900e-002, -3.99410799e-002, + 4.96812090e-002, 5.58678173e-002, 1.44576887e-003, + 2.73878795e-005, 4.79019433e-003, 4.24682116e-003, + 4.75220755e-002, -4.70626652e-002, 6.30484223e-002, + 6.23796284e-002, -3.15854177e-002, -5.54462187e-002, + 5.80265932e-002, 7.13087991e-002, 7.38039031e-004, + -2.02778121e-003, 6.61313348e-003, 7.05678575e-003, + -2.08143424e-003, -8.27605370e-004, 5.99915581e-003, + 6.86885137e-003, -3.92675102e-002, -1.89665798e-002, + 5.61572462e-002, 4.40132320e-002, 4.89961775e-003, + -2.19647232e-002, 3.04939523e-002, 3.58640961e-002, + 5.63327968e-003, 1.87023325e-004, 1.07844509e-002, + 4.02334379e-003, -2.46436503e-002, 3.99428513e-003, + 4.60460149e-002, 3.54363620e-002, -2.84928262e-001, + 4.54134904e-002, 3.54940802e-001, 3.03789198e-001, + 2.33690031e-002, 3.10072280e-003, 1.87491491e-001, + 1.58535764e-001, 7.26837590e-002, 5.88101940e-003, + 1.01046689e-001, 3.06301303e-002, -3.29809263e-002, + 3.59937269e-003, 5.83046712e-002, 4.24659364e-002, + -2.47799799e-001, -1.19102784e-002, 3.49719405e-001, + 4.16214496e-001, 4.34158221e-002, 3.12209036e-002, + 1.93990663e-001, 1.77567735e-001, 6.42955601e-002, + -2.15344061e-003, 9.82713178e-002, 2.99583152e-002, + -1.68484310e-003, -2.56158854e-003, 6.58672536e-003, + 6.57970738e-003, -3.29718441e-002, 1.36453090e-002, + 5.39514646e-002, 5.42430095e-002, -4.30670567e-003, + 2.68396772e-002, 3.86757404e-002, 4.63876426e-002, + 4.37040534e-003, -3.10397700e-005, 1.01857232e-002, + 4.85892314e-003, -2.28214599e-002, 1.93887600e-003, + 2.97464654e-002, 6.71910821e-003, -1.32578108e-002, + -1.27486726e-002, 3.91910449e-002, 3.07627674e-002, + 1.89906522e-003, -1.21468455e-002, 4.17032391e-002, + 3.02004647e-002, 2.22005975e-002, 1.10714429e-003, + 4.16604877e-002, 5.96430292e-003, -2.15327710e-001, + -2.81288754e-003, 2.72572517e-001, 3.23386379e-002, + -3.58449481e-002, -4.17982489e-002, 2.46193796e-001, + 1.02470778e-001, 2.52390113e-002, -2.01622788e-002, + 2.43984088e-001, 9.45421457e-002, 1.82084307e-001, + 8.87028035e-003, 3.37933779e-001, 3.69837955e-002, + -2.17555344e-001, -9.05580167e-003, 2.70862460e-001, + 3.34528163e-002, -2.07999516e-002, 4.50216327e-003, + 2.29700074e-001, 1.08453736e-001, 7.95385614e-002, + 4.14223075e-002, 2.69605875e-001, 1.11240864e-001, + 1.68293089e-001, 2.17323890e-003, 3.32303047e-001, + 4.23391685e-002, -2.16700882e-002, -3.76634463e-003, + 2.93307081e-002, 7.81653449e-003, -1.01036849e-002, + 8.79059918e-003, 3.64241526e-002, 3.23366076e-002, + 3.14473286e-002, 9.19404998e-003, 5.23079596e-002, + 3.36387306e-002, 1.11030694e-002, -3.13510001e-003, + 3.90099958e-002, 7.34901801e-003, 3.35005205e-003, + -1.44242086e-002, 9.08225589e-003, 2.16540284e-002, + 7.52594089e-004, -1.59733817e-001, 4.38964479e-002, + 2.00025484e-001, -1.94473900e-002, -1.51978597e-001, + 5.68009987e-002, 1.84772432e-001, 2.40888423e-003, + -7.95705151e-003, 9.84948501e-003, 1.64568815e-002, + -1.66888218e-002, -3.51421423e-002, 4.01505791e-002, + 5.23397848e-002, -6.68081827e-003, -2.42433220e-001, + 1.57869652e-001, 3.33118439e-001, 1.51536360e-001, + -1.37717575e-001, 2.26744905e-001, 2.54637778e-001, + 6.65263608e-002, -9.61021241e-003, 8.70029181e-002, + 4.52347174e-002, -1.55396648e-002, 1.88018233e-002, + 3.41394916e-002, 3.86698917e-002, 4.92296144e-002, + 2.29868323e-001, 1.81432351e-001, 2.79409975e-001, + 1.32137492e-001, 1.57684743e-001, 2.40641445e-001, + 2.16503978e-001, 6.64402321e-002, 1.34315398e-002, + 8.48373026e-002, 4.07522693e-002, 1.97490514e-003, + 1.96140003e-003, 5.42812143e-003, 6.52181404e-003, + 7.99873844e-003, 2.99588889e-002, 3.82190123e-002, + 5.81677854e-002, 4.54371981e-003, 3.29344459e-002, + 4.57573645e-002, 5.48286587e-002, 5.69850858e-003, + 1.65850658e-003, 1.02333855e-002, 7.42370309e-003, + 9.66663472e-003, 3.98465339e-003, 1.59423258e-002, + 1.06651718e-002, -2.60092337e-002, 7.80294836e-002, + 7.43217096e-002, 1.05455354e-001, -4.03619818e-002, + 6.73521161e-002, 6.83145598e-002, 1.10458821e-001, + 4.50173020e-003, 1.68426242e-003, 1.03925020e-002, + 1.20077627e-002, 9.75166112e-002, 2.22937632e-002, + 1.45129949e-001, 5.31426705e-002, 3.51136886e-002, + 1.12471767e-001, 2.23020002e-001, 2.08721250e-001, + -1.66315660e-001, 3.29337656e-001, 2.68460482e-001, + 4.03116435e-001, -1.94589570e-002, 5.75234108e-002, + 4.90084216e-002, 7.65251368e-002, 9.08851996e-002, + -7.49821682e-003, 1.31940186e-001, 4.09017615e-002, + 5.29311411e-002, -7.61322826e-002, 1.70482323e-001, + 1.75399408e-001, -3.51554379e-002, -3.91571149e-002, + 1.39186606e-001, 1.61112547e-001, -2.27410011e-002, + 2.81348312e-003, 3.41602005e-002, 3.21452431e-002, + 4.20119707e-003, -8.72459542e-003, 1.20065408e-002, + 1.79318171e-002, 6.78880000e-003, -1.45347312e-001, + 4.10046168e-002, 2.01325864e-001, 3.20593710e-003, + -1.48504421e-001, 3.20748612e-002, 2.01267287e-001, + 5.84245950e-004, -1.64301917e-002, 5.31215686e-003, + 2.33682860e-002, -1.03477295e-003, -8.08060449e-003, + 1.14416070e-002, 1.44516118e-002, -1.16265109e-002, + -1.48728505e-001, 3.80698219e-002, 1.78742751e-001, + -4.17823344e-002, -1.26893565e-001, 7.43493959e-002, + 1.46232352e-001, 1.04536144e-002, -5.47732227e-003, + 1.85780749e-002, 1.26594147e-002, -1.34469241e-001, + -9.63224750e-003, 1.63188517e-001, 5.27468212e-002, + 3.69179919e-002, -1.65717021e-001, 2.46863514e-001, + 3.71550441e-001, -3.85109931e-002, -7.76038840e-002, + 2.38932699e-001, 2.48217881e-001, 1.74084142e-001, + 2.86748335e-002, 2.13713616e-001, 5.74842617e-002, + -1.32424518e-001, -8.97204690e-003, 1.76383257e-001, + 3.52796987e-002, 1.26293469e-002, -1.14066005e-002, + 2.02849284e-001, 1.45012811e-001, 3.67810763e-002, + 6.43545063e-003, 1.75823346e-001, 1.04455955e-001, + 1.84136257e-001, -1.46732517e-002, 2.35375345e-001, + 3.75069976e-002, -1.69954412e-002, -2.59373547e-003, + 2.48981174e-002, 4.72699897e-003, 1.55925297e-003, + -5.48796309e-003, 2.51795445e-002, 2.31935065e-002, + 2.14869380e-002, 1.27053412e-003, 3.61189842e-002, + 2.17252318e-002, 1.70578007e-002, -1.58339075e-003, + 2.50720046e-002, 7.41704134e-003, 7.20828865e-003, + -8.78648309e-004, 1.14194052e-002, 6.30124100e-003, + 4.90153208e-002, 1.53575623e-002, 5.75937741e-002, + 2.90749557e-002, -4.92087472e-003, 5.07648103e-003, + 2.09432784e-002, 1.58325322e-002, -5.91392396e-003, + -1.10903359e-003, 9.05016437e-003, 3.85071500e-003, + 7.02350512e-002, -4.95020626e-003, 8.99137855e-002, + 4.03524823e-002, 3.06842744e-001, 4.45743417e-003, + 3.69855583e-001, 1.25736818e-001, -5.94219640e-002, + -2.35547824e-003, 1.43987000e-001, 8.86593312e-002, + -8.41847286e-002, -2.23859698e-002, 1.29604280e-001, + 4.21727002e-002, 7.96579346e-002, 1.70817617e-002, + 9.87790078e-002, 5.06731197e-002, 2.42436215e-001, + -3.70802656e-002, 3.23549092e-001, 1.95689440e-001, + -9.86783803e-002, -9.17345807e-002, 1.90716654e-001, + 1.69988051e-001, -9.61741805e-002, -2.06407849e-002, + 1.76590607e-001, 3.92339565e-002, 4.73369192e-003, + -9.59016196e-003, 8.49189330e-003, 2.21809801e-002, + 8.25073943e-003, -1.61512226e-001, 3.92331332e-002, + 2.57056922e-001, -4.74566733e-003, -1.61992475e-001, + 3.73556502e-002, 2.46977895e-001, -3.78594780e-003, + -1.13120973e-002, 1.47678824e-002, 1.96886826e-002, + -1.24254962e-003, -5.72413031e-004, 4.81134839e-003, + 4.28083260e-003, 1.65580865e-002, -1.74620412e-002, + 3.71975042e-002, 3.30952704e-002, 1.23861404e-002, + -9.00926813e-003, 4.10833806e-002, 3.73846516e-002, + 1.93217280e-003, 9.23215412e-004, 6.56950381e-003, + 5.52603230e-003, -3.64701338e-002, 2.41369046e-002, + 5.06005846e-002, 4.49962355e-002, 1.06183186e-001, + 5.56003489e-002, 2.46184230e-001, 2.08884075e-001, + 1.55601301e-003, -1.05952494e-001, 2.22581178e-001, + 2.18729034e-001, 4.55288403e-002, -1.75271404e-003, + 5.63349463e-002, 3.74986567e-002, -1.97846200e-002, + 4.57579978e-002, 4.86673117e-002, 5.98435849e-002, + -1.85129732e-001, 2.30785325e-001, 3.14039111e-001, + 3.55149150e-001, 1.38114601e-001, 2.56498903e-001, + 2.76118755e-001, 3.54222000e-001, 3.14700045e-002, + 3.45920995e-002, 4.72597033e-002, 4.70246039e-002, + 1.03462278e-003, 4.69364517e-004, 5.07896161e-003, + 4.66642622e-003, -1.62968766e-002, 4.23371419e-002, + 3.91983129e-002, 5.52831963e-002, 1.86461452e-002, + 4.03288081e-002, 3.59147303e-002, 5.20155467e-002, + -7.76813715e-004, 1.30126276e-003, 3.75249772e-003, + 3.96848423e-003, -8.95436038e-004, 8.57915916e-003, + 9.81993135e-003, 1.68246180e-002, -1.26015088e-002, + 1.78807452e-001, 1.12598501e-001, 2.16117978e-001, + 1.46292849e-002, 1.29700512e-001, 9.54886824e-002, + 1.57382533e-001, 5.66842500e-003, 4.11624648e-003, + 8.51849187e-003, 9.43869632e-003, 2.95033376e-003, + 4.06296849e-002, 2.62950510e-002, 4.68285754e-002, + 4.75936010e-002, 1.12457059e-001, 1.03654526e-001, + 1.84783250e-001, -6.84231669e-002, 1.54155120e-001, + 1.38706714e-001, 2.24251196e-001, -1.06166834e-002, + 2.81758569e-002, 2.67874096e-002, 4.07331102e-002, + -3.73946340e-003, -5.58146322e-003, 1.23636294e-002, + 1.38119888e-002, -5.27931526e-002, -1.42651677e-001, + 1.10127434e-001, 2.16249734e-001, -6.48872033e-002, + -3.88970286e-001, 1.40779465e-001, 4.33127970e-001, + -5.36733214e-003, -4.19739597e-002, 2.83957087e-002, + 5.89544363e-002, -8.86638276e-003, -1.15589015e-002, + 1.03126690e-002, 1.45138409e-002, -5.56251407e-002, + -1.72949955e-001, 8.17847699e-002, 1.92729041e-001, + -1.14088855e-003, -9.08540264e-002, 5.05947918e-002, + 1.26989737e-001, 1.09854685e-002, -5.47971902e-003, + 1.33353854e-002, 1.12777613e-002, 6.59291167e-004, + 1.59349910e-003, 6.28427882e-003, 6.73511717e-003, + 2.32498776e-002, 3.74304876e-002, 4.61532772e-002, + 5.82000911e-002, 7.53040239e-003, 2.92146243e-002, + 3.67151983e-002, 4.31878529e-002, -5.80099504e-003, + -1.04270887e-003, 8.64268281e-003, 6.33917563e-003, + 3.11492402e-002, 1.84581764e-002, 5.01483306e-002, + 5.81489429e-002, 1.07676737e-001, 2.77912132e-002, + 2.43804082e-001, 3.13723564e-001, -1.70640685e-002, + -9.78934020e-003, 2.47890443e-001, 2.47254074e-001, + -1.08357064e-001, -3.07382811e-002, 1.20284811e-001, + 4.86185923e-002, 4.03407142e-002, 8.64624325e-003, + 5.38653694e-002, 4.67623845e-002, -4.96211387e-002, + 9.67717618e-002, 2.51400739e-001, 2.27691695e-001, + -1.18616834e-001, -1.15484998e-001, 4.43067729e-001, + 2.85725802e-001, -9.82302576e-002, -2.63372045e-002, + 1.37942791e-001, 5.43118715e-002, 4.67133056e-003, + -5.37409913e-004, 6.67474000e-003, 5.90794021e-003, + -1.86919607e-002, -2.73863748e-002, 4.56019267e-002, + 5.03652655e-002, -5.91723546e-002, -5.95827885e-002, + 8.98123309e-002, 7.18297362e-002, 1.26509822e-003, + 7.08687119e-004, 1.43976957e-002, 8.87328852e-003, + -1.99844060e-003, -3.06076766e-003, 1.73305385e-002, + 6.70076208e-003, 7.64205381e-002, 3.27122770e-002, + 1.06375873e-001, 5.24907373e-002, -1.81955285e-002, + 1.60929300e-002, 4.19857651e-002, 2.99543850e-002, + -8.68473202e-003, -1.18865550e-003, 1.31611498e-002, + 6.01145765e-003, 6.19457737e-002, 1.36973374e-002, + 1.52371705e-001, 5.31633757e-002, 3.49369764e-001, + 1.44813612e-001, 4.51011240e-001, 2.14785710e-001, + -1.61425680e-001, 1.35681024e-002, 2.37555534e-001, + 1.13709919e-001, -9.60813463e-002, -5.01833390e-003, + 1.19325288e-001, 4.22143526e-002, 1.43970236e-001, + 3.00619230e-002, 1.87482998e-001, 5.51302247e-002, + 8.86099413e-002, -2.33556759e-002, 2.29525626e-001, + 1.41158998e-001, -1.43909335e-001, -5.50887398e-002, + 2.24921376e-001, 1.52187899e-001, -9.38251466e-002, + 3.34124290e-003, 1.20082758e-001, 4.32570130e-002, + 1.22700054e-002, 4.94150852e-004, 1.87496617e-002, + 8.58842116e-003, -5.47111034e-003, -4.90706638e-002, + 4.50686552e-002, 7.04606473e-002, -1.18034491e-002, + -4.71538082e-002, 4.52539101e-002, 7.09344670e-002, + -5.95206954e-003, -8.83581175e-004, 1.24197444e-002, + 8.35446268e-003, -1.62472425e-003, -2.61424086e-003, + 9.25463159e-003, 6.41806237e-003, 6.08516373e-002, + 3.54989022e-002, 7.60517567e-002, 5.51611520e-002, + 7.81275425e-003, 2.53387690e-002, 3.10769659e-002, + 3.72789800e-002, -1.89315388e-003, 8.08635843e-004, + 4.61317133e-003, 4.12559183e-003, 4.81330715e-002, + 4.04382274e-002, 8.38159099e-002, 6.13711029e-002, + 2.79197454e-001, 1.77102044e-001, 3.24458778e-001, + 2.24291489e-001, -2.43166890e-002, 1.76882967e-002, + 1.15483351e-001, 1.08782806e-001, -3.62240486e-002, + -1.07295513e-002, 4.82967086e-002, 3.36252972e-002, + 5.92457354e-002, 2.36764494e-002, 7.06092864e-002, + 5.16814105e-002, 2.72954199e-002, -1.06313303e-001, + 1.59472838e-001, 2.10547701e-001, -1.70536861e-001, + -3.50952774e-001, 2.36370996e-001, 3.96579385e-001, + -4.22462672e-002, -6.03122972e-002, 6.91486597e-002, + 7.89439008e-002, 8.22363363e-004, -1.13858217e-002, + 6.52248133e-003, 1.66172236e-002, -2.77964976e-002, + -1.20045714e-001, 4.74569425e-002, 1.57119021e-001, + -1.56206712e-002, -6.22651055e-002, 4.47975248e-002, + 1.22498393e-001, 1.45513262e-003, -1.09787553e-003, + 6.00438518e-003, 1.22955758e-002, -1.74213815e-002, + 2.25609052e-003, 2.38086469e-002, 5.66131482e-003, + -3.35167907e-002, -1.17008956e-002, 5.79560474e-002, + 2.71552615e-002, 7.86995701e-003, -1.48343137e-002, + 3.63463573e-002, 3.57013233e-002, -5.73390889e-006, + 7.22031400e-004, 4.78915544e-003, 4.18055942e-003, + -1.76527604e-001, -5.17044729e-003, 2.01901168e-001, + 2.77936533e-002, -2.34132662e-001, -3.47851366e-002, + 3.22582364e-001, 1.40710205e-001, 1.39503283e-002, + -9.08391476e-002, 1.48920983e-001, 1.57009497e-001, + 1.86376702e-002, -1.40116224e-002, 3.06301806e-002, + 2.80938596e-002, -1.74103722e-001, -1.41507946e-002, + 1.92344025e-001, 3.07144802e-002, -5.65386228e-002, + 1.33384034e-001, 3.32575977e-001, 2.21464202e-001, + -1.16468586e-001, 2.59879470e-001, 2.62859493e-001, + 3.12559128e-001, 1.79832503e-002, 1.52228493e-002, + 3.66701074e-002, 3.00899595e-002, -1.93158854e-002, + -6.02561922e-005, 2.16832962e-002, 5.52778412e-003, + 4.34536189e-002, 4.70335931e-002, 9.09525529e-002, + 6.34539574e-002, -4.04050425e-002, 5.27097769e-002, + 8.31450447e-002, 7.68677518e-002, -4.88594873e-004, + 2.23085005e-003, 7.30625354e-003, 6.69738092e-003, + -3.25112487e-003, 1.33269688e-003, 7.77188689e-003, + 2.85564642e-003, -5.50278053e-002, -1.03343679e-002, + 6.68534115e-002, 2.25628726e-002, 3.28114908e-003, + -1.04902526e-002, 2.26064641e-002, 2.21030898e-002, + 8.33858387e-004, -3.45329609e-004, 3.82246659e-003, + 2.97581917e-003, -3.05625927e-002, -7.23082514e-004, + 5.59096634e-002, 1.59852579e-002, -4.18322325e-001, + -3.23474593e-002, 4.63808089e-001, 1.10267542e-001, + 3.43031511e-002, -2.34650914e-002, 1.14641368e-001, + 1.04293682e-001, 1.55378375e-002, 1.02294190e-003, + 2.83121709e-002, 2.01449972e-002, -4.27287854e-002, + -6.29606331e-003, 6.20699711e-002, 1.88187659e-002, + -3.18509698e-001, 7.98978806e-002, 3.87731433e-001, + 1.67371765e-001, 6.87665418e-002, 2.19300851e-001, + 1.54360175e-001, 2.53252536e-001, 1.33688273e-002, + 2.89176069e-002, 3.26796249e-002, 3.93739417e-002, + -4.88459226e-003, -5.10366051e-004, 7.86504056e-003, + 3.61655606e-003, -1.36990007e-002, 3.54004279e-002, + 4.98689339e-002, 4.99379374e-002, 1.49004152e-002, + 3.57778035e-002, 4.06149887e-002, 5.94827794e-002, + -2.08988483e-003, 2.08756304e-003, 5.47591178e-003, + 7.06083700e-003, 2.64994334e-003, 2.42869183e-002, + 1.16043119e-002, 3.78509201e-002, -2.77332217e-002, + 1.94373220e-001, 4.49737422e-002, 2.99294949e-001, + 1.26034059e-002, 2.05309466e-001, 2.62415186e-002, + 3.19219381e-001, -4.20307880e-003, 2.76183598e-002, + 1.08086662e-002, 4.47507165e-002, 3.41629833e-002, + -1.36152878e-002, 1.56913444e-001, 5.70916459e-002, + -8.38238299e-002, 6.52475357e-002, 3.82773459e-001, + 1.91979349e-001, 1.92601204e-001, 4.78615612e-002, + 2.34196752e-001, 1.29965529e-001, -6.53986558e-002, + 9.64397192e-003, 1.01678580e-001, 2.80649029e-002, + 8.90700221e-002, 2.65293848e-003, 1.60302550e-001, + 4.60950956e-002, -1.30675256e-001, 1.25082638e-002, + 3.25767517e-001, 1.32798955e-001, 1.44974321e-001, + 8.75109434e-003, 1.92446202e-001, 7.93249905e-002, + -4.28371280e-002, 1.06659327e-002, 5.86416647e-002, + 2.64632851e-002, 4.49337577e-003, -2.77790800e-003, + 6.78816298e-003, 1.40824569e-002, -5.36177214e-003, + -7.63363466e-002, 3.06228288e-002, 1.40581027e-001, + 2.55671572e-002, -6.53660521e-002, 2.98401155e-002, + 1.29212320e-001, 9.73588787e-004, 7.35071488e-004, + 7.28581287e-003, 4.51543368e-003, 1.05983648e-003, + -8.82957771e-004, 4.42293612e-003, 3.19142966e-003, + 3.89666595e-002, 2.17392109e-002, 4.95926440e-002, + 3.42099704e-002, -2.07984932e-002, 2.51339823e-002, + 3.97413336e-002, 3.73882465e-002, -2.45343777e-003, + -7.06466730e-004, 4.90371417e-003, 3.79261072e-003, + 1.96522307e-002, 2.40573473e-003, 3.59884463e-002, + 2.18528472e-002, 3.25126380e-001, -5.03037870e-003, + 3.77621442e-001, 2.04742670e-001, -2.75386482e-001, + -1.35408118e-001, 3.18976343e-001, 2.54470646e-001, + -2.41863169e-002, -9.49549489e-003, 3.65392379e-002, + 2.75376830e-002, 2.67403666e-002, 2.63165202e-005, + 3.77420932e-002, 2.07274575e-002, 1.76023722e-001, + -6.41531423e-002, 2.78439760e-001, 1.77207947e-001, + -2.16138422e-001, -3.40133198e-002, 2.70559162e-001, + 1.79101214e-001, -2.02413481e-002, -1.24008255e-003, + 3.17563117e-002, 2.25694608e-002, 1.93503231e-003, + -5.56566520e-004, 4.27528843e-003, 3.01670516e-003, + 1.46617005e-002, -2.89002471e-002, 3.26571502e-002, + 3.66509706e-002, -1.65911634e-002, -2.73714103e-002, + 3.23431082e-002, 3.59291360e-002, -1.29684119e-003, + -3.45894834e-004, 3.70232086e-003, 3.34104011e-003, + 5.98311750e-003, 1.05492342e-002, 8.94202478e-003, + 2.15263944e-002, -2.24543549e-003, 1.33578286e-001, + 2.72637066e-002, 2.10825384e-001, -2.80982489e-003, + 1.25109613e-001, 3.42728235e-002, 2.15699464e-001, + -1.06604840e-003, 1.05930772e-002, 4.23323456e-003, + 2.65961103e-002, 1.04978681e-001, -2.91036665e-002, + 1.17106736e-001, 4.91518006e-002, 5.44691160e-002, + -2.90812179e-002, 2.71324694e-001, 1.90588176e-001, + 5.97921759e-002, 6.45737797e-002, 2.46676832e-001, + 1.76535428e-001, -1.62088666e-002, 1.90236829e-002, + 3.84315178e-002, 2.83595175e-002, 6.08282946e-002, + -1.51563054e-002, 8.50100815e-002, 3.44708040e-002, + 2.63631016e-001, -9.64099020e-002, 5.37047148e-001, + 1.75775170e-001, 8.00439119e-002, 2.33679842e-002, + 2.19382852e-001, 9.68189538e-002, -1.18050762e-002, + 5.91749791e-003, 3.45138609e-002, 1.39079764e-002, + 2.84454273e-003, 1.59241096e-003, 8.26416072e-003, + 5.78078907e-003, 5.28927818e-002, -2.95505580e-002, + 7.24359155e-002, 6.06346689e-002, 1.24500198e-002, + -3.65224704e-002, 3.15008536e-002, 6.09368794e-002, + -5.69956552e-004, -2.75520468e-003, 3.08373757e-003, + 7.85585307e-003, 1.26846815e-002, -6.91740017e-004, + 1.87041443e-002, 3.55033507e-003, 9.03022662e-003, + 8.90522823e-003, 3.49560007e-002, 1.99282728e-002, + -1.28647862e-002, 3.40154464e-003, 3.87335233e-002, + 2.03660522e-002, -1.32454382e-002, -1.09547889e-003, + 1.56957991e-002, 3.92811000e-003, 1.25010908e-001, + 1.04702578e-003, 1.74962640e-001, 2.46070195e-002, + -3.99378547e-003, 2.09764466e-002, 2.41176739e-001, + 1.07775360e-001, -7.58463368e-002, 1.00631258e-002, + 3.08007687e-001, 1.21695712e-001, -1.17995515e-001, + -7.34300911e-003, 1.41341016e-001, 3.29686962e-002, + 1.53735548e-001, -1.04859825e-002, 2.02723324e-001, + 3.15070674e-002, -1.18820615e-001, -3.41519751e-002, + 3.71897846e-001, 1.52923867e-001, -6.61689341e-002, + -2.20375478e-001, 3.45083982e-001, 2.80703038e-001, + -1.22433752e-001, -1.02961352e-002, 1.64475620e-001, + 3.42212878e-002, 1.66145544e-002, -1.51824940e-003, + 2.63023190e-002, 5.88553958e-003, -4.39064503e-002, + -5.60438856e-002, 8.76970515e-002, 8.75728056e-002, + -2.40339804e-002, -5.69314361e-002, 7.61434361e-002, + 1.10439233e-001, -2.54171551e-003, -1.54053618e-003, + 1.20543297e-002, 8.59299395e-003, -1.41131342e-003, + -9.13567189e-003, 1.35897109e-002, 1.89275723e-002, + -3.89265176e-003, -2.18484595e-001, 4.85950448e-002, + 2.66246140e-001, -2.80276388e-002, -2.40196109e-001, + 5.33464402e-002, 2.89449722e-001, -8.05054884e-003, + -2.33632326e-002, 1.21557582e-002, 2.98089013e-002, + -1.35208592e-001, -4.39819135e-002, 1.61036953e-001, + 6.07778318e-002, -1.90229401e-001, -2.90586680e-001, + 2.44155020e-001, 3.62976432e-001, -2.75845397e-002, + -1.94769472e-001, 1.21536814e-001, 2.81165689e-001, + 6.94625685e-003, -2.52989680e-002, 2.52536628e-002, + 3.79954502e-002, -1.24589831e-001, -2.30955537e-002, + 1.42129973e-001, 3.90058458e-002, -8.74977112e-002, + -1.67187117e-002, 1.59336612e-001, 1.17778756e-001, + -4.26835474e-003, 2.16860026e-002, 7.88923800e-002, + 9.64503735e-002, 4.88287117e-003, 2.46278942e-003, + 1.51494732e-002, 1.59776900e-002, -1.27295591e-002, + -1.53874164e-003, 1.61789618e-002, 5.44271944e-003, + -7.39214383e-003, 1.41087631e-002, 2.46753264e-002, + 2.57309563e-002, 2.65528518e-003, 1.28444936e-002, + 1.73884165e-002, 2.42166556e-002, -1.21407669e-004, + 1.69111066e-003, 2.82203313e-003, 3.71065550e-003, + 1.88758038e-003, 8.45111813e-003, 6.39547175e-003, + 1.72391851e-002, 1.44747943e-002, 1.41498759e-001, + 3.63598540e-002, 2.25383416e-001, 1.19609572e-003, + 1.47837818e-001, 2.36476883e-002, 2.42902711e-001, + 3.55396536e-004, 1.62318666e-002, 4.57418524e-003, + 2.99176294e-002, 5.08022681e-002, 5.44940704e-004, + 7.54169896e-002, 4.26972210e-002, 2.67546207e-001, + 6.34463653e-002, 3.51942629e-001, 2.03692630e-001, + -1.87716726e-002, 6.66949227e-002, 1.03664704e-001, + 1.66914955e-001, -1.31935868e-002, 1.29902940e-002, + 2.86322925e-002, 2.89405733e-002, 5.11522368e-002, + -6.43924903e-003, 7.68340677e-002, 3.97391878e-002, + 2.37451404e-001, -1.73909754e-001, 3.83761883e-001, + 2.68665165e-001, 4.03497666e-002, -9.58756655e-002, + 1.56452358e-001, 1.66524500e-001, -9.81937815e-003, + -3.13206622e-003, 2.80732326e-002, 1.88269410e-002, + 4.08705045e-003, -5.93176926e-004, 8.71066377e-003, + 6.97281165e-003, 2.57596765e-002, -3.39146182e-002, + 6.78618625e-002, 6.51184171e-002, 2.44160239e-002, + -3.76202576e-002, 4.93437387e-002, 6.26700148e-002, + 4.82371659e-004, -3.27464822e-003, 3.93599365e-003, + 6.58074580e-003, 1.10128662e-002, -3.08342604e-003, + 1.66147109e-002, 6.05509616e-003, 1.05698276e-002, + 1.62674598e-002, 5.44309802e-002, 2.81373169e-002, + -1.49958869e-002, 1.75805520e-002, 4.24731560e-002, + 3.46491858e-002, -9.46246833e-003, -9.71004891e-004, + 1.25037292e-002, 5.00692846e-003, 1.13130040e-001, + -1.07134320e-002, 1.48930982e-001, 3.34431864e-002, + 8.93445164e-002, -4.96498570e-002, 4.15395588e-001, + 1.58998951e-001, -6.60490468e-002, -1.29164075e-002, + 2.80113250e-001, 1.43223062e-001, -1.12517990e-001, + -1.27327237e-002, 1.33305445e-001, 3.42390724e-002, + 9.58336890e-002, -8.90097115e-003, 1.30984202e-001, + 4.26444523e-002, 1.80302694e-001, -1.62449554e-001, + 3.47904086e-001, 2.51560181e-001, -6.60199448e-002, + -4.04988602e-002, 3.06649953e-001, 1.76101953e-001, + -1.20991230e-001, -4.29056212e-003, 1.51547372e-001, + 2.97486652e-002, 5.35155041e-003, 2.84516631e-004, + 1.35986870e-002, 7.22637633e-003, 3.15988883e-002, + -4.20694649e-002, 5.96374199e-002, 5.77878058e-002, + 2.98642000e-004, -4.52206470e-002, 6.08334318e-002, + 5.64006977e-002, -9.15018842e-003, -8.41179339e-004, + 1.58458371e-002, 5.63843409e-003, -3.70763894e-003, + 3.21061118e-003, 7.95662031e-003, 6.23942865e-003, + 8.48632772e-003, 5.31310588e-002, 2.49078665e-002, + 7.62265697e-002, 2.31094211e-002, 5.78247197e-002, + 3.72273624e-002, 8.47638100e-002, 3.49799008e-003, + 5.13303466e-003, 6.86264131e-003, 9.25934315e-003, + 2.32218131e-002, 9.83480550e-003, 5.38297147e-002, + 5.60335927e-002, 1.95671156e-001, 1.08206041e-001, + 2.77432650e-001, 5.51889539e-001, 5.61283305e-002, + 2.14217156e-001, 1.58072203e-001, 3.49859685e-001, + -8.09477363e-003, 2.06422880e-002, 2.23646034e-002, + 2.94207223e-002, 3.66437286e-002, 1.28806541e-002, + 5.75631186e-002, 6.58236966e-002, 1.76569074e-001, + 1.71115711e-001, 2.24078968e-001, 2.83594906e-001, + 1.88144930e-002, 2.11703330e-002, 8.66428167e-002, + 1.04101621e-001, -7.67380279e-003, -1.72545156e-003, + 1.54361306e-002, 1.04095004e-002, 4.79483139e-003, + 2.64027878e-003, 8.35080817e-003, 7.36422883e-003, + 1.56317912e-002, -9.00123734e-003, 2.53972020e-002, + 2.73718182e-002, 1.64362218e-003, -1.18365213e-002, + 1.34894894e-002, 2.16449630e-002, -5.95791440e-004, + -6.42523577e-004, 2.48112855e-003, 2.09046155e-003, + 5.13723877e-004, 2.93643272e-004, 1.94743683e-003, + 1.42010523e-003, -1.42255682e-003, 4.51209443e-003, + 1.23385377e-002, 1.12579232e-002, -5.03232069e-002, + 7.39971455e-003, 5.72440811e-002, 2.08255760e-002, + -7.40556652e-003, -1.99095509e-003, 1.85458791e-002, + 5.72558260e-003, 5.48350811e-003, -9.70116176e-004, + 1.35167930e-002, 9.99524910e-003, -5.79456508e-004, + 2.12536915e-003, 6.83251545e-002, 5.89919984e-002, + -3.35776508e-001, 1.14239482e-002, 3.82017851e-001, + 1.00731753e-001, -7.86184222e-002, 9.75667033e-004, + 1.45826727e-001, 3.51343676e-002, 1.01812081e-002, + -2.68782210e-002, 2.03344058e-002, 3.77266333e-002, + 5.32368943e-003, -1.45732820e-001, 8.74532536e-002, + 2.09643826e-001, -3.06798637e-001, -1.32122964e-001, + 3.64205211e-001, 2.29624271e-001, -7.10763559e-002, + 3.82087845e-003, 1.36817515e-001, 4.43529524e-002, + -2.88051990e-004, -2.22879183e-002, 4.27468587e-003, + 3.12904827e-002, 1.25310454e-003, -1.80142775e-001, + 2.61247605e-002, 2.42000416e-001, -1.60471257e-002, + -1.69776127e-001, 4.04993072e-002, 2.23564044e-001, + -2.02506245e-003, -1.05635338e-002, 1.00153657e-002, + 1.57333370e-002, 3.58883408e-004, -1.67186852e-004, + 4.37369850e-003, 4.28260397e-003, -2.73137609e-003, + -1.71613730e-002, 3.16858478e-002, 3.68122831e-002, + 4.90725506e-003, -2.10989751e-002, 3.36624943e-002, + 3.80461030e-002, 5.23035554e-003, 8.84734967e-004, + 7.31526874e-003, 5.39280986e-003, -1.94773450e-002, + -1.17196711e-002, 3.48596573e-002, 3.04324273e-002, + -5.81919355e-003, -1.08188942e-001, 1.65408209e-001, + 1.92925915e-001, 1.71427682e-001, 7.11412057e-002, + 2.35706136e-001, 2.18820125e-001, 6.97030723e-002, + 3.45403440e-002, 7.65585005e-002, 5.04302457e-002, + -2.05171723e-002, 2.48517338e-002, 3.94436531e-002, + 4.04048450e-002, 6.69953451e-002, 2.64179677e-001, + 2.06430376e-001, 3.11080307e-001, 3.10308158e-001, + 2.54111052e-001, 3.56920749e-001, 3.10335547e-001, + 5.31823896e-002, 2.62643155e-002, 6.39579520e-002, + 3.97957936e-002, 2.52756500e-003, 4.68656654e-003, + 6.33759703e-003, 7.32412096e-003, 1.73103362e-002, + 6.17721975e-002, 4.35455292e-002, 7.37462267e-002, + 2.29243916e-002, 5.72882369e-002, 4.19478975e-002, + 6.79040179e-002, 9.29715519e-004, 4.10428300e-004, + 4.61936183e-003, 4.06084443e-003, 6.95818308e-005, + -1.18192786e-003, 5.97311556e-003, 2.90824659e-003, + -1.10366950e-002, 9.55316611e-003, 3.31960581e-002, + 2.55409069e-002, -5.55871008e-003, 1.45146549e-002, + 5.12323454e-002, 2.93190703e-002, -1.95253529e-002, + -6.19365019e-004, 2.86678392e-002, 4.99462290e-003, + 1.67356730e-002, 3.62715684e-003, 4.19208817e-002, + 2.08192896e-002, -7.63984770e-002, 2.82643326e-002, + 1.84789151e-001, 1.21493272e-001, -3.03851403e-002, + 1.73099581e-002, 3.62230748e-001, 1.10172018e-001, + -1.41491011e-001, 2.15373002e-003, 2.09176794e-001, + 3.02386768e-002, 1.68433189e-002, -1.52206849e-002, + 3.87028381e-002, 3.34514529e-002, -4.43859994e-002, + -1.07878566e-001, 1.59776181e-001, 2.06782609e-001, + -6.71390891e-002, -1.11549139e-001, 3.14831167e-001, + 2.44776085e-001, -1.36883616e-001, -2.55417824e-003, + 2.01917797e-001, 3.79958674e-002, -2.05533882e-003, + -2.49289013e-002, 6.65189512e-003, 3.40777822e-002, + -8.32035299e-003, -2.25880802e-001, 3.35402340e-002, + 2.78852016e-001, -2.38425541e-003, -2.12515056e-001, + 4.04483490e-002, 2.72824049e-001, -5.41373389e-003, + -1.51050910e-002, 1.46798296e-002, 2.51965523e-002, + 3.28544353e-004, -1.01296767e-003, 4.73848311e-003, + 4.29364154e-003, 4.27467609e-003, -3.12066488e-002, + 3.43826748e-002, 4.33048382e-002, 3.66432481e-002, + -3.13708968e-002, 5.00328764e-002, 4.84031029e-002, + 2.49213283e-003, 8.69672513e-004, 5.60807902e-003, + 4.73081553e-003, -1.25363786e-002, -6.62288954e-003, + 3.25829722e-002, 2.58605834e-002, -6.81583881e-002, + -7.25039244e-002, 1.63401246e-001, 1.54411554e-001, + 2.74495572e-001, -1.32860854e-001, 3.17939103e-001, + 2.12959677e-001, 5.31102344e-002, -7.74333766e-003, + 6.31474033e-002, 3.38516980e-002, -1.63366441e-002, + 6.06924223e-005, 3.33300382e-002, 2.51825098e-002, + 9.42465942e-003, 7.72646889e-002, 1.71498895e-001, + 1.61176518e-001, 3.39013845e-001, 3.18586260e-001, + 3.70980978e-001, 3.52898479e-001, 4.20461819e-002, + 2.68870667e-002, 5.38445674e-002, 3.77738811e-002, + -1.65939400e-006, 1.63618708e-003, 4.82202135e-003, + 4.67878673e-003, 3.16721238e-002, 4.20777798e-002, + 4.69677597e-002, 5.04483469e-002, 4.93438691e-002, + 2.97953635e-002, 5.69230951e-002, 4.65946533e-002, + -2.32982697e-004, -5.36465028e-004, 3.74315400e-003, + 3.50161269e-003, 1.88231375e-003, -1.11577509e-003, + 5.49448561e-003, 4.10272554e-003, 5.57923643e-003, + 9.99026746e-003, 1.76667701e-002, 2.83040758e-002, + -2.48951581e-003, 9.66558792e-003, 1.76278856e-002, + 2.87030041e-002, -3.89932352e-003, 8.82583990e-005, + 6.80968584e-003, 4.79276851e-003, 4.14978974e-002, + -1.41752148e-002, 6.53098524e-002, 2.98719257e-002, + 3.57008539e-002, -1.92438196e-002, 1.65761128e-001, + 1.04054295e-001, 1.88212248e-003, -6.75615389e-003, + 1.11162327e-001, 9.21090245e-002, -3.45320217e-002, + 3.50292794e-005, 5.61929345e-002, 1.78152397e-002, + 3.21657881e-002, -1.91562548e-002, 6.19173199e-002, + 3.49889174e-002, -1.16199665e-001, -2.79949278e-001, + 3.86816353e-001, 3.36381167e-001, 1.50553003e-001, + -3.60438198e-001, 2.95482695e-001, 3.99347633e-001, + -3.44697051e-002, -3.23702917e-002, 6.07984550e-002, + 4.27243896e-002, 3.80643673e-004, -5.81025984e-003, + 4.62861033e-003, 9.30092111e-003, -1.18243266e-002, + -5.05149588e-002, 3.22521105e-002, 7.36146718e-002, + 6.36878284e-003, -3.58109735e-002, 2.91315615e-002, + 6.17260896e-002, 1.06456115e-004, -5.80688938e-003, + 4.66731144e-003, 9.51723754e-003, 1.97191694e-004, + 9.67261090e-004, 5.60472906e-003, 6.39913417e-003, + 1.77485067e-002, 2.92439163e-002, 3.96610089e-002, + 6.05651252e-002, 1.36183975e-002, 4.75671478e-002, + 3.68796028e-002, 6.98997080e-002, 5.58855209e-006, + 3.87767586e-003, 5.20102400e-003, 7.54049979e-003, + 5.58151901e-002, 2.67330352e-002, 6.96822554e-002, + 4.98208851e-002, 5.65642193e-002, 2.77478635e-001, + 2.94552565e-001, 3.53384405e-001, 4.65109386e-002, + 1.10925227e-001, 2.04188988e-001, 2.13570043e-001, + -1.75752193e-002, 1.41695384e-002, 4.21235338e-002, + 3.26525010e-002, 5.20209931e-002, -2.45910026e-002, + 6.94213659e-002, 5.46869487e-002, 1.43021598e-001, + -2.36789614e-001, 2.81019628e-001, 3.87359440e-001, + 1.02502415e-002, -1.43431658e-002, 1.75873995e-001, + 2.45484591e-001, -2.15339791e-002, -2.67324038e-003, + 4.22308072e-002, 3.15342471e-002, -8.46233510e-004, + 1.53629947e-003, 5.82786975e-003, 8.63396749e-003, + 1.42120160e-002, -2.89945267e-002, 4.01692167e-002, + 8.79405662e-002, 1.69208571e-002, -7.46910945e-002, + 3.84317674e-002, 1.16007477e-001, -1.10925554e-004, + -6.80860784e-003, 5.76472515e-003, 1.22775780e-002, + -2.21425275e-004, 7.44451943e-004, 5.12384297e-003, + 4.85592242e-003, 2.62726448e-003, 3.17397639e-002, + 2.95482110e-002, 4.68709655e-002, -5.57423860e-004, + 3.50576937e-002, 2.53477339e-002, 5.31601198e-002, + 2.97162973e-004, 2.23001605e-003, 3.22378008e-003, + 6.15735026e-003, 3.05648893e-002, 5.87524613e-003, + 4.90624867e-002, 3.39574814e-002, 1.13968350e-001, + 1.72992334e-001, 2.45145142e-001, 2.91240841e-001, + -2.79367696e-002, 1.00443512e-001, 1.83127314e-001, + 3.26978713e-001, -2.51318179e-002, 1.40352407e-002, + 3.50051858e-002, 4.14774977e-002, 4.85881716e-002, + 1.48267136e-003, 6.51879907e-002, 3.43687125e-002, + -7.43400902e-002, 2.53281612e-002, 4.94765818e-001, + 2.97551304e-001, -2.92268060e-002, -1.22492209e-001, + 2.21942127e-001, 2.59482503e-001, -2.02000868e-002, + -1.36411367e-002, 3.43958810e-002, 3.50589007e-002, + 1.59909343e-003, -5.51175675e-004, 6.62288722e-003, + 5.80993388e-003, -8.38255696e-003, -5.17987385e-002, + 5.16177081e-002, 6.76556453e-002, -7.68287294e-003, + -3.27656493e-002, 3.02220322e-002, 5.30003011e-002, + -5.91722201e-005, -1.95023813e-003, 3.89568764e-003, + 5.56715345e-003, 4.66486299e-003, 1.43891270e-003, + 8.34287517e-003, 4.94920975e-003, -1.69729888e-002, + 3.64180133e-002, 3.96390110e-002, 4.55564409e-002, + -5.33069037e-002, 2.83498242e-002, 6.37847334e-002, + 4.47733775e-002, -2.78380699e-004, -1.00494362e-003, + 5.03736082e-003, 4.85244580e-003, 7.13837072e-002, + 1.74643693e-003, 8.37836266e-002, 2.60839239e-002, + -5.63283600e-002, 8.88512358e-002, 2.00957805e-001, + 1.56170994e-001, -4.19699013e-001, 2.04038396e-001, + 4.54217374e-001, 2.64305025e-001, -2.25776285e-002, + 2.25124881e-002, 4.57991585e-002, 3.97994630e-002, + 6.45081848e-002, -6.79824781e-003, 8.09997246e-002, + 2.80361790e-002, -1.84712969e-002, -5.86147942e-002, + 2.33145192e-001, 1.57272384e-001, -1.64518788e-001, + 6.09235652e-002, 2.34422982e-001, 2.38212943e-001, + -5.03773876e-002, 3.49799208e-002, 6.12876080e-002, + 5.64637817e-002, 2.73879711e-003, -1.95857487e-003, + 8.34751129e-003, 6.90189190e-003, -4.59205871e-003, + -5.60285002e-002, 4.49822843e-002, 7.30758980e-002, + -9.96068213e-003, -5.73877655e-002, 3.07754595e-002, + 7.87687823e-002, -3.66957206e-003, -3.36516555e-003, + 6.40444737e-003, 8.50577187e-003, -2.08723103e-003, + -7.64476019e-004, 6.44099619e-003, 3.95299261e-003, + -3.47771123e-002, -2.85140947e-002, 5.70369773e-002, + 4.27256115e-002, -3.64222424e-003, -2.90612485e-002, + 3.12815011e-002, 4.81411070e-002, 1.03924435e-003, + -1.51970505e-003, 4.15520184e-003, 5.48098143e-003, + -5.37472256e-002, -1.72775276e-002, 7.08328784e-002, + 3.73780727e-002, -8.08379501e-002, -1.39284119e-001, + 2.85501629e-001, 2.75230229e-001, 1.17987823e-002, + 4.36873585e-002, 1.71803758e-001, 2.40589380e-001, + 1.40819103e-002, -2.57596665e-004, 3.23393643e-002, + 3.07598412e-002, -6.27659783e-002, 1.25958482e-004, + 7.51355737e-002, 4.25715260e-002, -9.70252901e-002, + -1.75918583e-002, 2.88605899e-001, 3.75122041e-001, + -6.04836969e-003, -2.18808904e-001, 1.72980443e-001, + 4.45677221e-001, 2.14748718e-002, -2.17600092e-002, + 3.98902036e-002, 5.14828041e-002, -2.85050040e-003, + 2.35331594e-003, 5.44968434e-003, 6.62699202e-003, + -2.19829436e-002, 5.81128336e-002, 4.07170653e-002, + 8.93514305e-002, -1.48128020e-002, 6.58066049e-002, + 3.39474827e-002, 8.65821689e-002, 6.15101831e-004, + 4.03344864e-003, 5.73894521e-003, 9.02773254e-003, + -2.96423794e-003, -3.74801806e-004, 4.80135204e-003, + 1.82749215e-003, -4.93010040e-003, -2.56425375e-003, + 1.57650728e-002, 1.19777583e-002, 1.71591230e-002, + -4.22705570e-003, 3.33453268e-002, 1.33876558e-002, + 2.89804265e-002, 2.10388494e-003, 3.22497152e-002, + 4.90438845e-003, -2.41479725e-002, 4.09375690e-003, + 3.71269658e-002, 1.74719170e-002, -3.80633622e-002, + -3.75433057e-003, 1.10820778e-001, 7.66928196e-002, + 1.02951594e-001, 3.93996341e-003, 2.28210643e-001, + 9.14131105e-002, 2.48852029e-001, 1.31586948e-002, + 2.82466859e-001, 3.53262872e-002, -3.22775431e-002, + 1.93732996e-002, 5.21613099e-002, 3.58043313e-002, + -3.16391066e-002, 9.63910893e-002, 1.50816396e-001, + 1.79051965e-001, 1.16279073e-001, 1.15481794e-001, + 2.92898864e-001, 2.06440315e-001, 2.44840413e-001, + -2.96096341e-003, 2.96607435e-001, 4.02708054e-002, + -6.77103002e-004, 1.72345731e-002, 6.85100816e-003, + 2.66855117e-002, 5.75993769e-003, 1.97700217e-001, + 3.76241915e-002, 2.91799873e-001, 1.79196743e-003, + 1.87076792e-001, 5.58962524e-002, 3.06606263e-001, + 1.62473936e-002, 7.11637177e-003, 2.28770077e-002, + 2.43901536e-002, -8.02659197e-004, -5.82251523e-004, + 4.71593346e-003, 4.23265621e-003, -1.27662416e-003, + -2.90690809e-002, 3.28107476e-002, 4.97474559e-002, + 4.25184378e-003, -3.46114747e-002, 3.06960400e-002, + 6.13563731e-002, -6.31362665e-004, -1.80305878e-003, + 6.52923388e-003, 7.76922423e-003, -3.30388546e-002, + -9.07722511e-004, 5.20674512e-002, 2.67417151e-002, + -1.34928882e-001, -9.94756296e-002, 2.97784716e-001, + 3.29619378e-001, 3.67239304e-002, 7.91565608e-003, + 1.53477862e-001, 4.88602251e-001, 3.15186046e-002, + -1.00291241e-003, 4.55329418e-002, 6.38340041e-002, + -3.92641872e-002, 1.87628320e-003, 5.67576960e-002, + 2.14469731e-002, 2.97757555e-002, 1.00835271e-001, + 4.11128700e-001, 2.00953439e-001, 4.24192995e-002, + 1.14984065e-001, 2.00282350e-001, 2.27953270e-001, + 1.83834005e-002, 1.43973473e-002, 4.16165181e-002, + 4.08860557e-002, -3.48834554e-003, 5.47931821e-004, + 6.19303761e-003, 3.40461917e-003, 4.94752661e-004, + 2.49030571e-002, 3.95718291e-002, 3.70527990e-002, + 4.85173427e-003, 1.49124805e-002, 3.27660777e-002, + 3.61025147e-002, -1.41835786e-004, 5.95143763e-004, + 5.18111419e-003, 5.13957907e-003, -1.47947168e-004, + -3.85181955e-003, 5.86132985e-003, 7.96777382e-003, + -9.92553215e-003, -7.77272806e-002, 2.98860390e-002, + 9.19389576e-002, -3.11118062e-003, -7.38328174e-002, + 3.21875252e-002, 9.33854729e-002, -1.64491474e-003, + -5.38385846e-003, 5.24049951e-003, 9.12229065e-003, + -6.86973557e-002, 2.33002403e-003, 7.92483687e-002, + 4.43610176e-002, -1.36922421e-002, -1.01912562e-002, + 2.54621118e-001, 2.51841813e-001, -8.57497826e-002, + -6.79493025e-002, 2.01974154e-001, 2.26923138e-001, + 2.11396571e-002, -1.46172727e-002, 3.21907252e-002, + 3.60895842e-002, -6.38606250e-002, 1.77231953e-002, + 7.86225945e-002, 4.62427512e-002, 3.58692221e-002, + 2.45607704e-001, 2.64881641e-001, 3.32261086e-001, + -2.54311949e-001, 2.01649830e-001, 3.49975526e-001, + 2.80974120e-001, 2.26280093e-002, 1.72002912e-002, + 3.95475626e-002, 3.79420854e-002, 5.11280145e-004, + 4.33513150e-003, 7.28435861e-003, 8.12688842e-003, + -1.95956766e-003, 5.77406399e-002, 3.82833444e-002, + 6.93659633e-002, -3.26914750e-002, 4.67399172e-002, + 5.38718924e-002, 6.58656210e-002, -2.08039326e-003, + 2.40251073e-003, 5.42022614e-003, 6.65185694e-003, + 9.14087333e-003, 1.53226743e-003, 1.35176545e-002, + 8.19332711e-003, -3.89672145e-002, 8.33824873e-002, + 6.28880784e-002, 1.04758836e-001, -3.46402600e-002, + 7.63722658e-002, 7.95815587e-002, 1.35905847e-001, + 2.60733720e-003, -2.38925428e-003, 1.00908801e-002, + 1.30867567e-002, 1.18854754e-001, -3.28307413e-002, + 1.65073037e-001, 5.83434068e-002, 5.26432879e-002, + 3.19198035e-002, 1.67323560e-001, 1.41029194e-001, + -2.36076847e-001, 2.46608078e-001, 3.05232137e-001, + 3.07126492e-001, -5.03024608e-002, 4.83891964e-002, + 1.07771143e-001, 8.32045600e-002, 7.39616752e-002, + -2.55668703e-002, 1.83337554e-001, 5.50030284e-002, + 2.51794875e-001, -1.66076094e-001, 3.44955087e-001, + 2.23814979e-001, -1.19727915e-002, -1.52720623e-002, + 1.26117855e-001, 1.19070522e-001, -6.25133812e-002, + 2.57450864e-002, 8.36250558e-002, 4.53135371e-002, + -2.77447933e-003, 2.24903645e-003, 2.05979813e-002, + 7.38678407e-003, 6.18702359e-002, -3.71369049e-002, + 8.45960304e-002, 5.76383248e-002, 8.42082687e-003, + -2.74863765e-002, 3.29888985e-002, 3.98232453e-002, + -3.62534099e-003, -1.09046046e-003, 7.44684786e-003, + 4.99122543e-003, 3.30174167e-004, 1.75632432e-003, + 3.07390443e-003, 4.76462999e-003, 2.04821141e-003, + 2.33261529e-002, 1.96362827e-002, 4.30928767e-002, + 2.37061860e-004, 1.99527945e-002, 1.83976144e-002, + 4.26252149e-002, 7.65452685e-004, 1.70565175e-003, + 2.89900019e-003, 5.43131866e-003, 2.97831204e-002, + 1.59908868e-002, 3.77649479e-002, 4.14538309e-002, + 1.07545100e-001, 2.42882803e-001, 1.77385554e-001, + 4.01604801e-001, -4.49024998e-002, 2.84000963e-001, + 1.20847501e-001, 4.26839173e-001, -1.48563078e-002, + 3.44624147e-002, 2.56727282e-002, 5.26169725e-002, + 2.80823614e-002, -1.97957829e-002, 3.76503095e-002, + 3.35798599e-002, 1.44872144e-001, -2.25964293e-001, + 2.08335876e-001, 2.81076372e-001, -2.78643239e-003, + -1.86168492e-001, 1.22566983e-001, 2.51025856e-001, + -1.40528465e-002, -1.60724763e-002, 2.47277413e-002, + 3.25649641e-002, 6.29489834e-004, -4.17065225e-004, + 3.54974368e-003, 3.73348990e-003, 1.09654665e-002, + -2.00430918e-002, 2.61087976e-002, 3.66511531e-002, + 8.02257191e-003, -2.50714459e-002, 2.35067606e-002, + 4.00906876e-002, 5.57786785e-004, -2.28350470e-003, + 3.20954178e-003, 4.95643867e-003, 2.12119985e-003, + 7.15561237e-006, 5.86288888e-003, 4.91014635e-003, + -1.10025778e-002, 7.36276060e-003, 3.48969996e-002, + 4.37127575e-002, -2.90894751e-002, -4.68284823e-003, + 4.29497547e-002, 4.54899259e-002, -1.33357279e-003, + -1.93550705e-003, 4.83035669e-003, 4.53680428e-003, + 8.98269657e-003, -1.75060797e-002, 5.53474650e-002, + 4.27659787e-002, -5.40366657e-002, -1.95379883e-001, + 2.51240820e-001, 3.47566217e-001, -2.05801085e-001, + -6.83485940e-002, 2.96994954e-001, 2.35444888e-001, + -6.32117409e-003, -1.77536334e-003, 3.75755504e-002, + 2.71590613e-002, -4.56818612e-004, 6.32111914e-004, + 5.40362820e-002, 4.94065322e-002, -6.55270414e-003, + 4.89841849e-002, 2.18497545e-001, 4.26713616e-001, + -1.40088931e-001, 1.95105597e-002, 2.50015974e-001, + 2.73149133e-001, -9.31747630e-003, 3.08796461e-003, + 3.57319154e-002, 2.91202217e-002, 3.42218671e-004, + -2.53720034e-004, 5.11252647e-003, 6.70111738e-003, + -8.38120840e-003, -2.24237028e-003, 3.31882425e-002, + 6.10440895e-002, -1.69946607e-002, -2.03478872e-003, + 3.30808721e-002, 5.23775741e-002, -8.51096585e-004, + -7.73909851e-005, 4.30699857e-003, 4.47563827e-003, + 4.55483235e-003, -3.89329018e-003, 8.05460569e-003, + 6.76912488e-003, -5.41445101e-003, -3.86715159e-002, + 5.70466258e-002, 6.51440397e-002, -3.62111256e-002, + -3.30192931e-002, 7.50630274e-002, 5.98762669e-002, + 2.89329421e-003, -8.87587608e-004, 1.00208884e-002, + 6.90011540e-003, -4.47321776e-003, -3.84330750e-002, + 3.66221406e-002, 4.91597764e-002, 1.16785094e-002, + -3.65496427e-001, 1.80147856e-001, 4.02411550e-001, + -8.71297345e-003, -1.90325558e-001, 2.53278166e-001, + 2.60298878e-001, 3.76425236e-002, -2.61387154e-002, + 5.40537164e-002, 4.47049141e-002, -1.42049901e-002, + 2.43558325e-002, 3.45904119e-002, 4.47728336e-002, + -7.91274570e-003, 1.26053885e-001, 1.29286438e-001, + 2.89625943e-001, 1.97478030e-002, 4.38251086e-002, + 1.32739946e-001, 2.63029456e-001, 3.25412974e-002, + -5.70038892e-003, 4.18094918e-002, 4.53527942e-002, + 2.99141742e-003, 1.39229856e-002, 6.89103967e-003, + 1.85722243e-002, 2.25810520e-003, 1.55748442e-001, + 3.81871909e-002, 1.78829029e-001, -3.09727415e-002, + 1.51333123e-001, 4.49357480e-002, 1.72039419e-001, + -1.19250349e-003, 1.20285572e-002, 6.55570440e-003, + 1.55077688e-002, 5.43350237e-004, 4.57366789e-003, + 3.89117375e-003, 8.22381023e-003, -5.42272162e-003, + 5.16736619e-002, 2.56724022e-002, 7.00947046e-002, + -8.97827093e-003, 4.10633981e-002, 2.71934643e-002, + 6.40471280e-002, -3.83849372e-004, 2.12616147e-003, + 4.03889967e-003, 6.88570738e-003, 1.84078868e-002, + -8.92488472e-003, 3.20464894e-002, 5.02474084e-002, + 2.94699986e-002, -9.73020270e-002, 1.48453653e-001, + 4.32251394e-001, -5.63038029e-002, 4.41433154e-002, + 1.85732841e-001, 3.92939150e-001, -3.00827678e-002, + 6.76399283e-003, 4.44026329e-002, 5.01308143e-002, + 1.46046178e-002, -1.71333663e-002, 3.08295209e-002, + 4.01750654e-002, 3.11496425e-002, -1.13229819e-001, + 1.61999971e-001, 2.95637935e-001, -8.05965587e-002, + -2.66377360e-001, 2.27708817e-001, 3.72137249e-001, + -2.35633068e-002, -3.73542793e-002, 4.15070541e-002, + 5.09118587e-002, 1.20522709e-004, -1.84217782e-003, + 3.57989501e-003, 5.80979697e-003, -5.60796075e-003, + -2.66489927e-002, 2.42793635e-002, 4.96328585e-002, + -1.29103446e-002, -1.62364803e-002, 2.87972111e-002, + 4.37877141e-002, 4.62657888e-004, -1.39673633e-004, + 3.73359025e-003, 5.03206812e-003, -1.97072374e-003, + 1.38638978e-004, 4.81132884e-003, 5.75274089e-003, + 2.60256784e-004, -2.27960628e-002, 3.12421974e-002, + 4.08319756e-002, 5.59533983e-002, -1.41263269e-002, + 6.59846291e-002, 3.96792293e-002, 9.54545918e-004, + 3.73169174e-003, 6.62680436e-003, 6.33880170e-003, + -2.69088689e-002, 2.26040520e-002, 4.09678295e-002, + 3.81396227e-002, -4.27943654e-002, 1.98146537e-001, + 1.85570210e-001, 3.01988959e-001, 3.22893232e-001, + -1.56873763e-002, 3.91788781e-001, 2.39118457e-001, + 3.34662721e-002, -1.49043109e-002, 6.37920424e-002, + 3.83266583e-002, -1.89706981e-002, 1.14094904e-002, + 3.74381989e-002, 3.24338600e-002, -1.49641186e-001, + 2.03410294e-002, 2.10529059e-001, 2.08128244e-001, + 1.35924503e-001, -3.02735418e-002, 3.29068601e-001, + 2.90853620e-001, 6.38792664e-002, 2.13075848e-003, + 8.37696120e-002, 3.73819321e-002, -1.02580199e-003, + 4.60926531e-004, 5.97379403e-003, 4.88086278e-003, + -1.45497657e-002, 2.74407770e-002, 3.64612006e-002, + 4.65492979e-002, 2.35654600e-002, 4.12867852e-002, + 4.53993455e-002, 5.32473847e-002, 4.73097060e-003, + 2.53317830e-006, 8.06004554e-003, 3.96798365e-003, + 1.35607785e-003, -6.12339703e-003, 5.66907600e-003, + 9.63900797e-003, 2.00614370e-002, -7.53771886e-002, + 4.82102372e-002, 9.08600092e-002, 3.28707099e-002, + -3.86093371e-002, 5.19364141e-002, 6.97669536e-002, + -2.26015248e-003, -3.37343314e-004, 5.69884153e-003, + 6.52516540e-003, -1.30105913e-002, -2.63928026e-002, + 3.07559129e-002, 4.02638614e-002, -3.13743316e-002, + -2.00148463e-001, 1.64439827e-001, 2.67777234e-001, + 2.12639943e-001, -4.37118471e-001, 2.52407759e-001, + 4.79260266e-001, 1.87500622e-002, -8.10827389e-002, + 4.11963165e-002, 8.87224823e-002, -1.81997102e-002, + 1.28496001e-002, 3.00125368e-002, 3.83042023e-002, + -4.04954292e-002, 8.08756351e-002, 1.09016374e-001, + 2.02919886e-001, 2.81703807e-002, 6.93894252e-002, + 9.62149203e-002, 1.86371297e-001, 1.50213754e-002, + -1.58442592e-003, 2.47605741e-002, 3.68225910e-002, + 5.00717375e-004, 6.52053952e-003, 4.71751858e-003, + 9.98587906e-003, 1.97680015e-003, 8.39863643e-002, + 2.96587776e-002, 1.00039355e-001, -3.52372439e-003, + 9.50648934e-002, 3.37301195e-002, 1.11481041e-001, + -2.17978680e-003, 8.79410375e-003, 5.08794421e-003, + 1.17453802e-002, 1.61545060e-003, 4.78364236e-005, + 5.00028953e-003, 3.11536645e-003, 7.71656586e-003, + 1.35009354e-002, 3.53333876e-002, 2.76290923e-002, + -8.21095658e-004, 2.12103017e-002, 5.23241013e-002, + 3.58537212e-002, -2.40820134e-003, -4.64563229e-004, + 6.11215550e-003, 3.98330577e-003, 2.56521124e-002, + 4.69451630e-003, 4.17481847e-002, 2.15203669e-002, + 7.73107186e-002, 6.55902624e-002, 2.57272989e-001, + 1.64885879e-001, -9.30566993e-003, 6.11668751e-002, + 5.25375068e-001, 2.14177057e-001, -2.92603094e-002, + -1.93271041e-003, 4.97442782e-002, 2.75376067e-002, + 2.79242881e-002, -4.60363040e-003, 4.20134440e-002, + 2.38966793e-002, 5.75222671e-002, -7.37482682e-002, + 2.34605283e-001, 2.10531771e-001, -9.87575278e-002, + -2.08648592e-001, 3.86702895e-001, 2.87373304e-001, + -1.99444834e-002, -7.67423352e-003, 3.98892090e-002, + 2.76112407e-002, 1.06045546e-003, -1.04756642e-003, + 4.51228209e-003, 3.70519795e-003, -5.60555025e-004, + -2.56067924e-002, 2.85933260e-002, 3.73951718e-002, + -1.26620540e-002, -1.99783444e-002, 3.21357325e-002, + 3.52144577e-002, 9.11065072e-005, -2.02013878e-004, + 3.76578560e-003, 3.55157023e-003, -3.33454320e-003, + 4.10201639e-004, 9.78872180e-003, 7.78554007e-003, + -2.77551040e-002, -3.20915617e-002, 5.11835888e-002, + 5.77469990e-002, -6.63046166e-003, -3.22476663e-002, + 3.38956639e-002, 4.69299741e-002, 2.03429791e-003, + -1.55915169e-003, 5.58066973e-003, 5.38526569e-003, + -8.62716883e-002, 7.99179450e-003, 1.07687630e-001, + 5.86653240e-002, -1.54251218e-001, -1.15553945e-001, + 2.49367073e-001, 2.86276340e-001, 4.88600768e-002, + 2.34745890e-002, 1.61236614e-001, 2.07980648e-001, + 3.17801498e-002, 1.38038406e-002, 4.50507887e-002, + 3.89117710e-002, -1.04344681e-001, 2.22968459e-002, + 1.25854462e-001, 5.60314842e-002, -1.79265767e-001, + 2.49685779e-001, 2.73829252e-001, 3.79831940e-001, + 1.80363029e-001, 1.71742395e-001, 2.49753565e-001, + 2.75118142e-001, 2.73196995e-002, 3.34055908e-002, + 5.10744676e-002, 5.05552106e-002, -3.26072797e-003, + -6.70396141e-004, 9.77349840e-003, 6.88678585e-003, + -3.20020169e-002, 2.85952594e-002, 5.41312993e-002, + 5.96797690e-002, 1.16633885e-002, 3.18943746e-002, + 4.48976234e-002, 5.66300303e-002, 8.47240386e-004, + 1.21494224e-004, 6.58221822e-003, 6.58132182e-003, + -1.65892616e-002, 4.03536391e-003, 1.94510035e-002, + 8.57209601e-003, -2.38093901e-002, -1.04000624e-002, + 4.46915887e-002, 2.58333664e-002, 8.21203552e-003, + -7.32394541e-003, 2.60365643e-002, 2.20809970e-002, + 5.33624133e-003, 1.90914888e-003, 7.61658605e-003, + 3.80945834e-003, -1.69497058e-001, -1.56501140e-002, + 1.86612859e-001, 5.21386154e-002, -1.24710269e-001, + -1.53161706e-002, 2.82756746e-001, 1.36313528e-001, + 1.36523306e-001, 4.93918844e-002, 1.89053401e-001, + 1.41525015e-001, 9.68733504e-002, 5.20693623e-002, + 1.17283888e-001, 5.86220846e-002, -1.48752511e-001, + 3.35638002e-002, 1.88525572e-001, 7.23898932e-002, + -1.24431290e-001, 2.50432253e-001, 3.40552241e-001, + 3.32232863e-001, 1.62018731e-001, 3.81762162e-002, + 2.54065603e-001, 1.41431436e-001, 1.39672101e-001, + 1.22789694e-002, 1.70240015e-001, 4.75406013e-002, + -2.72067403e-003, 3.92899988e-003, 1.70398038e-002, + 8.49058293e-003, -9.96070877e-002, 6.42258599e-002, + 1.29133686e-001, 9.05876309e-002, 1.63411833e-002, + 2.17016861e-002, 6.03858754e-002, 3.99267077e-002, + 1.29428450e-002, -7.52837950e-005, 1.95167344e-002, + 7.75230443e-003, 2.55775172e-003, 2.51491694e-003, + 6.82042073e-003, 1.00866416e-002, 5.45678008e-003, + 5.15178703e-002, 2.45315060e-002, 7.86454380e-002, + 6.11653784e-003, 4.64550257e-002, 1.63711477e-002, + 7.34289661e-002, -7.81794137e-004, 4.69851028e-003, + 2.82226969e-003, 8.99036229e-003, 7.01598153e-002, + -3.42703611e-002, 8.92712623e-002, 5.36060743e-002, + 7.94733241e-002, 1.33386962e-002, 1.27370372e-001, + 1.12854734e-001, -7.74584478e-003, 1.82406437e-002, + 4.71638776e-002, 6.36180267e-002, -4.58368612e-003, + 3.84159130e-003, 1.24643343e-002, 1.07321478e-002, + 3.22266445e-002, -5.70458248e-002, 8.29402730e-002, + 7.96613097e-002, 3.99361193e-001, -4.10801232e-001, + 4.36187387e-001, 4.39678103e-001, 1.51392976e-002, + -7.46120065e-002, 7.83542246e-002, 1.19253419e-001, + -3.67898704e-003, -4.42544371e-003, 1.14085171e-002, + 1.17721707e-002, -1.81350647e-003, -1.51101639e-003, + 5.82912005e-003, 5.79280965e-003, 4.17498499e-002, + -8.06101486e-002, 5.93314245e-002, 1.05016321e-001, + 5.16103581e-002, -1.30070120e-001, 6.38544187e-002, + 1.50803730e-001, 2.13455711e-003, -8.15332029e-003, + 3.92981013e-003, 1.20285191e-002, -8.67477991e-003, + -9.00379382e-004, 1.37896156e-002, 6.61088200e-003, + 6.23583188e-003, -4.27704342e-002, 5.17358631e-002, + 6.51276261e-002, 1.20016485e-002, -2.88157966e-002, + 4.40721624e-002, 6.37135580e-002, 1.52084453e-004, + -7.29720283e-004, 6.92598196e-003, 8.24486464e-003, + -1.25313029e-001, -2.44369195e-003, 1.55721679e-001, + 3.61184478e-002, -5.11795841e-002, -1.37664989e-001, + 2.63244539e-001, 2.51671702e-001, 1.10412516e-001, + -1.91670403e-001, 2.10115716e-001, 3.57090503e-001, + 3.57334279e-002, -1.62907317e-002, 5.73476963e-002, + 5.55963442e-002, -1.41709924e-001, -9.25085228e-003, + 1.71430677e-001, 3.51634920e-002, -1.10952975e-002, + 3.23220678e-002, 2.70042866e-001, 1.79707661e-001, + 1.86251834e-001, 1.36584729e-001, 2.94079274e-001, + 2.67049193e-001, 3.49304527e-002, 2.69636884e-002, + 7.37457499e-002, 5.24348021e-002, -1.40627921e-002, + -1.18172809e-003, 1.86375659e-002, 5.68898162e-003, + 5.56398323e-003, 2.15645116e-002, 5.00674434e-002, + 3.81175652e-002, 2.88468078e-002, 1.52209383e-002, + 5.17584123e-002, 4.40176949e-002, 1.77867757e-003, + -1.88513484e-003, 9.62228607e-003, 6.75863773e-003, + -7.30971806e-004, 1.96680874e-002, 5.81944222e-003, + 3.41417827e-002, -9.98075848e-005, 1.72535285e-001, + 2.38857120e-002, 2.96292633e-001, -5.39748883e-003, + 1.60892621e-001, 2.35883128e-002, 2.96147078e-001, + -3.27035552e-004, 1.88485142e-002, 4.83066309e-003, + 3.81570831e-002, 5.10751419e-002, 5.47478953e-003, + 7.61002824e-002, 5.18250726e-002, 4.96721417e-002, + 1.79872349e-001, 1.03732884e-001, 2.56640226e-001, + -4.62925844e-002, 2.17724189e-001, 1.02524079e-001, + 2.82083184e-001, -3.29142660e-002, 3.48918587e-002, + 4.34469096e-002, 4.76160422e-002, 6.89600855e-002, + -5.34864441e-002, 1.11038782e-001, 6.90601245e-002, + 1.31470963e-001, -1.50439814e-001, 1.88463077e-001, + 2.19413668e-001, -6.62948890e-003, -6.72333986e-002, + 7.82764629e-002, 1.45098791e-001, -2.24420037e-002, + -3.30112613e-004, 3.05936188e-002, 2.63521466e-002, + 8.83279543e-004, -7.34073669e-003, 1.04943877e-002, + 1.85603388e-002, 3.34959291e-002, -1.71613216e-001, + 5.02593294e-002, 2.36062959e-001, 2.21349727e-002, + -1.65700346e-001, 4.02434207e-002, 2.23978952e-001, + 7.17928400e-004, -1.47089465e-002, 3.97443725e-003, + 2.33997330e-002, -2.21629743e-003, -2.30151275e-003, + 9.76651348e-003, 8.33857805e-003, -1.53388092e-002, + -7.38399029e-002, 5.15144244e-002, 9.69782472e-002, + 1.07455207e-002, -7.34038725e-002, 4.59394418e-002, + 9.54778194e-002, -2.31426908e-004, -2.78426916e-003, + 5.95851848e-003, 9.15692281e-003, -1.18406191e-001, + -1.41399605e-002, 1.45151392e-001, 4.94290255e-002, + -1.28488094e-001, -2.94580221e-001, 2.52426773e-001, + 3.47584546e-001, 2.40091383e-001, -2.20405936e-001, + 2.91038990e-001, 2.73339897e-001, 3.05306632e-002, + -3.20104174e-002, 5.80754206e-002, 4.90452871e-002, + -1.48925588e-001, -1.38374313e-003, 1.80973336e-001, + 4.08986099e-002, -8.82560238e-002, 6.36450797e-002, + 2.14674279e-001, 1.48463383e-001, 1.44541755e-001, + -3.55506688e-002, 2.08877027e-001, 1.38395742e-001, + 3.79211418e-002, -1.69529598e-002, 5.56270555e-002, + 3.50310169e-002, -1.19623514e-002, -1.12859963e-003, + 1.96548365e-002, 6.11991761e-003, -2.54540183e-002, + 1.52359297e-002, 4.67033200e-002, 3.47368829e-002, + 8.70873872e-003, 9.97837633e-003, 3.07421628e-002, + 2.86673233e-002, 4.10103751e-003, -6.10973220e-004, + 7.01292325e-003, 4.71144682e-003, -7.81707652e-003, + 2.58172606e-003, 1.28300535e-002, 7.23296916e-003, + -1.82083882e-002, -1.11090317e-002, 3.42993923e-002, + 2.34477110e-002, 4.02863231e-003, -1.17148748e-002, + 2.04295143e-002, 2.07123477e-002, 9.66751203e-003, + 2.72245216e-003, 1.46165276e-002, 5.22843981e-003, + -8.42837244e-002, -7.02780811e-003, 1.11834005e-001, + 4.75348867e-002, -1.27868310e-001, -2.46014725e-002, + 1.98246226e-001, 1.10542476e-001, 9.29168314e-002, + -1.03035232e-003, 1.56614155e-001, 1.14102431e-001, + 1.53111964e-001, 4.34607714e-002, 1.86193451e-001, + 6.30954802e-002, -8.94326642e-002, -6.44102087e-003, + 1.13285281e-001, 4.18955684e-002, -5.67858629e-002, + 9.71562415e-002, 1.77119270e-001, 1.49813160e-001, + 2.53508925e-001, 3.49664152e-001, 3.19897622e-001, + 3.82466018e-001, 1.54838905e-001, 5.14986552e-002, + 1.95776135e-001, 7.90366158e-002, -5.85956965e-003, + 5.54569473e-004, 9.49125551e-003, 6.28033420e-003, + 3.64574566e-002, 5.88962249e-002, 5.59521765e-002, + 6.81414828e-002, 8.62266049e-002, 9.51982364e-002, + 1.10268161e-001, 1.20778941e-001, -4.24751826e-003, + -5.82489138e-003, 1.34689957e-002, 1.21337809e-002, + -8.34936509e-005, 4.23420314e-003, 4.01255535e-003, + 6.27668109e-003, -3.68115380e-002, 5.74663579e-002, + 5.01602069e-002, 7.26081580e-002, -3.25533785e-002, + 5.67078143e-002, 5.86624071e-002, 8.23160410e-002, + 2.99515622e-003, 3.84343439e-003, 6.89842366e-003, + 9.48753487e-003, 1.04607362e-002, 5.39250858e-003, + 2.02122666e-002, 2.15681624e-002, -2.80284956e-002, + 9.71683487e-002, 1.07155591e-001, 1.57161325e-001, + -1.04721747e-001, 2.93412477e-001, 1.89170986e-001, + 3.42645377e-001, -3.47822793e-002, 3.24315391e-002, + 4.92360927e-002, 6.26657158e-002, 1.05063189e-002, + -6.92323502e-003, 1.98652092e-002, 2.07365062e-002, + -1.45460935e-002, -7.87787959e-002, 1.04093961e-001, + 1.43590584e-001, -2.37645850e-001, -3.82837325e-001, + 2.78824627e-001, 4.28192735e-001, -3.71116214e-002, + -7.17717707e-002, 5.54870069e-002, 8.83301795e-002, + -2.82948109e-004, -4.11467999e-003, 4.16791253e-003, + 6.84443675e-003, -3.92960645e-002, -6.22455105e-002, + 5.36780581e-002, 7.28962943e-002, -4.95195650e-002, + -4.39485237e-002, 6.71724081e-002, 7.60098025e-002, + 1.83184235e-003, 1.00338459e-003, 5.31941000e-003, + 7.02515524e-003, -9.65593383e-004, -2.95139253e-005, + 5.91636356e-003, 3.48725007e-003, -4.78290319e-002, + -4.47953828e-002, 6.49282038e-002, 5.41700572e-002, + 3.54897901e-002, -3.84164825e-002, 5.70075437e-002, + 5.17693609e-002, 1.33770774e-003, 7.86266290e-004, + 6.74651237e-003, 4.80730506e-003, -3.50259505e-002, + -1.45394905e-002, 6.06278814e-002, 2.93314327e-002, + -3.53443295e-001, -1.58047512e-001, 4.15484786e-001, + 2.15315923e-001, 2.59250849e-001, -1.59209922e-001, + 3.16507995e-001, 2.15177760e-001, 3.95505093e-002, + -4.13186401e-002, 6.44060150e-002, 5.26583679e-002, + -5.56888059e-002, -2.22918186e-002, 7.51728714e-002, + 3.56990658e-002, -2.26749241e-001, -5.31787351e-002, + 3.01416129e-001, 1.38055757e-001, 6.55907169e-002, + -6.89667463e-002, 1.45244136e-001, 1.39461905e-001, + 4.53977920e-002, -3.30237634e-002, 5.80175407e-002, + 4.30821180e-002, -7.03862496e-003, -2.23918445e-003, + 9.80588980e-003, 4.71280748e-003, -2.27945819e-002, + 5.09563228e-003, 3.61236110e-002, 2.09535118e-002, + 2.86792312e-003, 5.50441863e-003, 1.97760109e-002, + 1.94085166e-002, 3.28989164e-003, -7.22377212e-004, + 5.28881280e-003, 3.77289765e-003, -1.58255566e-002, + 3.56937479e-003, 1.84999555e-002, 5.33697102e-003, + -4.65641823e-003, -1.13093220e-002, 2.98564192e-002, + 2.74102017e-002, -1.64790812e-003, -1.77564174e-002, + 2.00928822e-002, 3.51977944e-002, -6.24772656e-005, + -3.06288101e-004, 3.11386376e-003, 2.92482739e-003, + -1.57734931e-001, 3.51910777e-002, 1.77037299e-001, + 4.59024943e-002, -1.38368398e-001, 1.50970593e-002, + 2.08250076e-001, 1.13266699e-001, 1.48639074e-002, + -2.03976948e-002, 8.03243220e-002, 9.20794755e-002, + 9.19605326e-003, -3.80107813e-004, 1.76734384e-002, + 1.64489690e-002, -1.09087318e-001, 3.26658003e-002, + 1.37021884e-001, 5.02364151e-002, -3.65577430e-001, + 3.07806462e-001, 4.21183378e-001, 3.55395377e-001, + 3.91955813e-003, 1.43490270e-001, 1.04641259e-001, + 2.14415491e-001, 1.15129557e-002, 1.82705633e-002, + 2.23889053e-002, 3.12754288e-002, -1.15024496e-003, + -1.18980417e-003, 9.17264167e-003, 7.01621175e-003, + -3.81472521e-002, 9.69716012e-002, 6.41557202e-002, + 1.25111774e-001, -1.66879278e-002, 1.30744189e-001, + 4.20526564e-002, 1.55315533e-001, -1.85977947e-003, + 1.33659616e-002, 5.20033669e-003, 1.73628666e-002, + -2.28310542e-004, 2.13460153e-004, 3.57350148e-003, + 3.78237804e-003, 2.48431675e-002, 2.24747397e-002, + 3.65355425e-002, 3.55460234e-002, -3.80017608e-003, + 2.92415470e-002, 3.84101607e-002, 3.69393937e-002, + -2.32585007e-003, 1.14794137e-004, 4.70346585e-003, + 3.41753243e-003, 2.60092430e-002, 2.89402306e-002, + 3.66553925e-002, 3.94680575e-002, 1.92758799e-001, + 2.68922657e-001, 2.40484044e-001, 2.99331337e-001, + -2.36317039e-001, 7.81045780e-002, 3.07749718e-001, + 1.69822037e-001, -2.75430009e-002, -1.66598812e-003, + 3.98922972e-002, 2.31601708e-002, 2.79587545e-002, + -2.14798786e-002, 3.72069664e-002, 3.70181799e-002, + 1.28586143e-001, -2.70108014e-001, 1.99709028e-001, + 3.00852865e-001, -2.22715721e-001, -1.31727085e-001, + 3.00425589e-001, 2.01196730e-001, -2.64981408e-002, + -1.31097739e-003, 3.87561396e-002, 2.40289643e-002, + 5.95855545e-006, -1.06531905e-003, 3.56732286e-003, + 4.06508800e-003, 1.43362302e-002, -2.32495815e-002, + 2.99086366e-002, 3.62043381e-002, -4.35675634e-003, + -2.67176144e-002, 3.51736993e-002, 3.64090241e-002, + -1.71036168e-003, -2.67110765e-004, 4.30406863e-003, + 3.42701236e-003, -1.14987424e-005, -2.12864857e-003, + 5.41772274e-003, 6.00436376e-003, 3.09422985e-003, + -4.40808795e-002, 3.51433307e-002, 6.19166382e-002, + 2.02555694e-002, -3.74743231e-002, 3.53691839e-002, + 5.53699769e-002, 3.63059138e-004, -4.39924916e-004, + 4.07773815e-003, 4.48367884e-003, -1.57914646e-002, + -8.42627510e-003, 4.12846431e-002, 4.14634906e-002, + -9.34060961e-002, 1.88800246e-002, 2.10078523e-001, + 3.35175276e-001, 2.54463196e-001, -4.74326313e-002, + 3.27940822e-001, 3.65533620e-001, 1.85500681e-002, + -1.12754172e-002, 3.89013514e-002, 4.14239541e-002, + -1.60572845e-002, -1.11280354e-002, 3.98239978e-002, + 3.83491032e-002, -8.29314440e-002, -1.35914475e-001, + 1.75489947e-001, 2.74523586e-001, 1.84098557e-001, + -1.44276738e-001, 2.64535964e-001, 2.89355814e-001, + 2.84252428e-002, -1.37501722e-002, 4.74175550e-002, + 4.25344035e-002, -1.27451855e-003, -4.28255997e-004, + 4.83500073e-003, 4.52282559e-003, -1.00242654e-002, + 1.39201134e-002, 2.95566823e-002, 3.17612104e-002, + 2.06563063e-002, 1.22941313e-002, 3.51597145e-002, + 3.42351608e-002, 2.85295956e-003, -1.40194932e-003, + 6.32999698e-003, 5.45328436e-003, 6.21810229e-003, + -3.24859493e-003, 1.22227930e-002, 8.32603406e-003, + -3.57502773e-002, -1.15245365e-001, 7.84774870e-002, + 1.36435598e-001, 2.93669309e-002, -1.13847367e-001, + 6.51264414e-002, 1.34170651e-001, -3.13886628e-003, + -6.57658186e-003, 1.27593400e-002, 1.13828247e-002, + -3.74913588e-002, -2.81267054e-002, 1.06384240e-001, + 4.35996130e-002, -2.09264502e-001, -2.29155675e-001, + 3.16753626e-001, 3.06186259e-001, 1.13774367e-001, + -2.22287357e-001, 2.04746306e-001, 2.93637216e-001, + 1.05529852e-001, 4.68778936e-003, 1.53705195e-001, + 5.85209429e-002, -7.82986507e-002, 1.14345783e-002, + 1.22977085e-001, 4.63806316e-002, -1.45113796e-001, + 2.52825320e-002, 2.06496134e-001, 1.39409050e-001, + 9.86898839e-002, 7.80096650e-003, 1.79870009e-001, + 9.65633690e-002, 1.73165902e-001, 9.87163559e-003, + 2.10688308e-001, 3.22640836e-002, -5.65829268e-003, + -1.60328019e-003, 1.48856463e-002, 7.00380001e-003, + -3.77885513e-002, 2.01688241e-002, 5.52481748e-002, + 3.97455767e-002, 1.26071563e-002, 7.38629978e-003, + 3.33055854e-002, 2.16322392e-002, 1.75981354e-002, + -3.69633688e-003, 2.41020154e-002, 6.85144588e-003, + 9.06318601e-004, 7.81024992e-003, 1.47611378e-002, + 1.44329611e-002, -5.98598383e-002, -5.01252711e-002, + 8.68707523e-002, 7.17533901e-002, 6.45369291e-003, + -2.00197343e-002, 3.46050449e-002, 4.21628207e-002, + 6.93635596e-003, -1.33459107e-003, 1.15727549e-002, + 9.60416347e-003, -8.38796645e-002, -7.05609918e-002, + 1.13557786e-001, 1.04425713e-001, -1.71845496e-001, + -1.61344230e-001, 2.71050185e-001, 2.11795300e-001, + 1.07270107e-001, -7.25258440e-002, 1.92323953e-001, + 1.65091529e-001, 1.00651637e-001, 4.34536785e-002, + 1.26211017e-001, 8.23069289e-002, -4.51985523e-002, + -2.43255794e-002, 6.39352798e-002, 4.02798951e-002, + -5.20008989e-002, -1.28944144e-002, 1.34407744e-001, + 1.14397332e-001, 3.85636866e-001, 1.49000481e-001, + 4.38872963e-001, 2.01866820e-001, 9.58601832e-002, + 5.35207503e-002, 1.67259216e-001, 9.29074660e-002, + -2.78536556e-003, 5.51769277e-004, 6.80372352e-003, + 4.61367751e-003, -2.72678537e-003, 1.27270781e-002, + 2.50405837e-002, 2.37836391e-002, 8.86232853e-002, + 2.23160721e-002, 9.50567275e-002, 4.36796509e-002, + -6.45555207e-004, -5.74268959e-003, 1.71296746e-002, + 1.03530586e-002, 2.20547454e-003, -5.32490574e-003, + 5.94822876e-003, 9.75549407e-003, 1.90389976e-002, + -1.05187714e-001, 5.24189919e-002, 1.71760425e-001, + -2.25121737e-003, -8.49239826e-002, 5.59320487e-002, + 1.46590009e-001, 3.67752649e-003, -1.25810178e-002, + 9.86880809e-003, 3.55103314e-002, -1.01647943e-001, + 1.20674275e-001, 1.32978812e-001, 1.39334306e-001, + -1.46340400e-001, -2.94070728e-002, 2.44774386e-001, + 2.52030045e-001, 7.88169876e-002, -9.27875042e-002, + 1.39433175e-001, 2.27798298e-001, 5.49784414e-002, + 4.39540148e-002, 7.03410059e-002, 9.18798149e-002, + -1.73881665e-001, -5.06140441e-002, 2.09472924e-001, + 8.60636234e-002, -2.44910970e-001, 4.08623144e-002, + 3.10250252e-001, 1.52825475e-001, 2.03699380e-001, + 1.48925573e-001, 2.53663808e-001, 1.95629895e-001, + 1.21416435e-001, 4.21434119e-002, 1.49103120e-001, + 7.30224550e-002, -9.54130944e-003, -4.45372472e-003, + 1.62897781e-002, 8.87369551e-003, -2.53450293e-002, + 1.45159671e-002, 3.72615084e-002, 3.10172569e-002, + 8.13030824e-002, 1.88597627e-002, 8.79620016e-002, + 5.37458919e-002, 5.50467428e-003, -2.83223833e-003, + 1.57510266e-002, 2.08275095e-002, 1.83676530e-004, + 9.03229986e-004, 4.10112692e-003, 4.51469561e-003, + 2.87920479e-002, 2.13119388e-002, 3.95604074e-002, + 3.85019332e-002, 2.15402897e-002, 2.81980261e-002, + 3.57639603e-002, 3.80568840e-002, -5.83644258e-004, + 1.76083855e-003, 3.67404008e-003, 4.03144583e-003, + 3.01363114e-002, 1.32720880e-002, 4.21545096e-002, + 3.74899656e-002, 1.97863325e-001, 2.42865384e-001, + 2.40347743e-001, 2.87764132e-001, -9.91866086e-003, + 9.11137313e-002, 1.27681360e-001, 1.54341951e-001, + -2.31506433e-002, -8.44845083e-003, 3.14572155e-002, + 2.86164619e-002, 2.92256624e-002, -2.32633613e-002, + 4.33342010e-002, 3.70949171e-002, 2.38661826e-001, + -1.51055112e-001, 3.18262219e-001, 2.07999140e-001, + -2.39437595e-001, -3.03338647e-001, 2.72440940e-001, + 3.38459522e-001, -1.73134506e-002, -4.95616719e-002, + 3.79595384e-002, 5.77284768e-002, 1.87190296e-003, + -1.51089043e-004, 4.82055312e-003, 3.95567389e-003, + 1.08667575e-002, -4.15320583e-002, 4.75283638e-002, + 5.16317487e-002, -3.60470451e-002, -2.95012612e-002, + 4.99121509e-002, 4.80109006e-002, 1.75862154e-003, + -8.97697682e-005, 4.61722352e-003, 4.27371589e-003, + -5.28975157e-004, 1.50564173e-002, 4.53517772e-003, + 2.03918628e-002, -5.29018743e-003, 1.36526883e-001, + 2.53539234e-002, 1.69783190e-001, -6.33132702e-004, + 1.34878084e-001, 3.09306104e-002, 1.68604583e-001, + -1.76901126e-003, 1.09000430e-002, 6.75821025e-003, + 1.61595270e-002, 1.50614846e-002, 2.34295949e-002, + 2.82192994e-002, 3.63745466e-002, 9.40661877e-003, + 1.48815423e-001, 9.21299607e-002, 2.18654618e-001, + -1.12741567e-001, 1.24332637e-001, 1.82420403e-001, + 2.39759162e-001, -9.31991190e-002, -1.23043936e-002, + 1.10761069e-001, 5.68285659e-002, 1.15235923e-002, + -2.08995468e-003, 2.25355495e-002, 1.90246832e-002, + -2.26539355e-002, -5.98320253e-002, 1.03463151e-001, + 1.31637946e-001, -3.41406047e-001, -2.93333858e-001, + 3.87073785e-001, 3.43156159e-001, -5.63143864e-002, + -3.65525186e-002, 1.01616234e-001, 6.58347309e-002, + -4.61678719e-004, -3.54605401e-003, 3.81427677e-003, + 6.27603382e-003, -2.36361828e-002, -4.47143503e-002, + 3.86454538e-002, 6.13419712e-002, -6.16142601e-002, + -3.72558162e-002, 8.21236297e-002, 7.49506950e-002, + 6.69433735e-004, 2.17396556e-003, 9.48141329e-003, + 7.30402814e-003, -2.41998537e-003, 6.72886556e-004, + 6.98183151e-003, 3.36222537e-003, -3.65058444e-002, + -1.70214344e-002, 5.22754416e-002, 3.02827992e-002, + 2.38700975e-002, -2.10816227e-002, 4.34360355e-002, + 3.57817747e-002, 4.00589639e-003, 7.96473760e-005, + 8.11100472e-003, 5.40830195e-003, -3.52989882e-002, + -1.35501325e-002, 5.80313876e-002, 2.93182638e-002, + -2.29868516e-001, -6.36366680e-002, 3.04730892e-001, + 1.57731220e-001, 2.59741753e-001, 1.09072655e-001, + 3.08339775e-001, 2.27508888e-001, 3.96154784e-002, + 1.71705838e-002, 5.85515276e-002, 4.30494547e-002, + -3.84891443e-002, -1.89088639e-002, 5.40634058e-002, + 3.86518501e-002, -1.10235013e-001, 9.31981206e-003, + 2.12148711e-001, 1.73672244e-001, 2.78932065e-001, + -4.04671058e-002, 3.28501701e-001, 3.61906588e-001, + 2.02057753e-002, -1.95378345e-002, 4.63716649e-002, + 7.08448142e-002, -3.15711810e-003, 1.60643796e-003, + 6.91681402e-003, 5.64122386e-003, 3.23591242e-003, + 3.84119079e-002, 3.78990732e-002, 5.46258725e-002, + 3.01924758e-002, 5.31493761e-002, 5.03080226e-002, + 7.39711002e-002, -1.13380363e-003, 2.36034673e-003, + 5.69111807e-003, 8.39841645e-003, 4.84363036e-003, + -1.05758011e-003, 8.07187334e-003, 4.37400863e-003, + 1.16271768e-002, 1.02450196e-002, 2.35503614e-002, + 2.55878493e-002, -1.60521967e-003, 1.21377390e-002, + 1.92345642e-002, 2.19516940e-002, -2.95806443e-003, + 5.30926627e-004, 3.82313924e-003, 2.96925381e-003, + 4.07354906e-002, -1.06836809e-002, 6.36227727e-002, + 2.34888606e-002, 1.35646522e-001, -3.33557557e-003, + 2.38392696e-001, 1.30309522e-001, -9.57113877e-003, + 4.07871697e-003, 1.38606071e-001, 9.48471725e-002, + -3.99062224e-002, -8.78191926e-003, 4.51554731e-002, + 1.84774231e-002, 3.35965380e-002, -6.20611757e-003, + 5.93316369e-002, 2.58754194e-002, 2.03014374e-001, + 1.83250979e-002, 5.31269133e-001, 3.55426252e-001, + -2.01026946e-001, -1.88330680e-001, 2.96766669e-001, + 3.08104604e-001, -3.01885195e-002, -2.83924937e-002, + 4.78415117e-002, 3.87350470e-002, 2.76434282e-003, + 6.47513720e-004, 6.58219121e-003, 3.11721629e-003, + -1.69452303e-003, -4.37020212e-002, 6.01945892e-002, + 5.91781288e-002, -1.83670670e-002, -2.74641030e-002, + 4.34098616e-002, 4.95339856e-002, 3.13883007e-004, + 3.62393999e-004, 5.11013623e-003, 3.99845745e-003, + -5.62978955e-003, -7.03558093e-004, 1.12049635e-002, + 4.63882787e-003, 3.71981934e-002, -3.25125344e-002, + 6.06115609e-002, 4.36437763e-002, 2.72057056e-002, + -2.51210649e-002, 4.16152291e-002, 3.93030196e-002, + 2.87217001e-004, -4.77778347e-004, 4.28234739e-003, + 3.43768275e-003, -7.56150633e-002, -3.50143877e-003, + 9.87986773e-002, 2.78912783e-002, 1.92199171e-001, + -9.33976173e-002, 3.97039562e-001, 1.84402570e-001, + 1.19616523e-001, -2.41970986e-001, 2.95733869e-001, + 2.94926286e-001, 4.65764627e-002, -2.21215989e-002, + 6.13531582e-002, 3.28923203e-002, -7.06946403e-002, + -4.87567764e-003, 9.30460319e-002, 2.75175739e-002, + 1.55018866e-001, 4.83342968e-002, 3.67158651e-001, + 1.48348704e-001, 2.55682901e-003, 3.42204841e-003, + 2.91420013e-001, 1.60977200e-001, 6.44893795e-002, + -1.03151174e-002, 7.87693709e-002, 3.07294298e-002, + -4.28526476e-003, -9.87592619e-004, 8.92510917e-003, + 4.59110131e-003, 1.57562904e-002, 1.48301516e-002, + 5.02570048e-002, 3.44702527e-002, 1.17067504e-003, + 1.43528534e-002, 4.08337340e-002, 3.65633443e-002, + 5.17992722e-003, -1.41209702e-003, 8.25782586e-003, + 5.09208255e-003, -8.32149386e-003, 1.02457602e-003, + 1.19968979e-002, 4.50426154e-003, 4.61680721e-003, + -1.85163449e-002, 6.12457506e-002, 3.29499505e-002, + 8.89861316e-004, -2.05016378e-002, 7.18710124e-002, + 3.74812856e-002, 3.52339121e-003, 1.01223693e-003, + 9.97480005e-003, 4.48434241e-003, -7.88560808e-002, + 1.13098463e-002, 1.00852810e-001, 2.69217882e-002, + -7.57560059e-002, -7.30525032e-002, 3.71071130e-001, + 1.68702528e-001, 4.84727286e-002, -1.09198563e-001, + 4.29800719e-001, 1.81332558e-001, 5.22998832e-002, + -3.75273917e-003, 8.53522569e-002, 3.01133916e-002, + -6.13130815e-002, 2.92353216e-003, 8.77674818e-002, + 2.27669701e-002, -2.49688044e-001, 5.27797863e-002, + 3.81646007e-001, 1.41624779e-001, 1.51934460e-001, + 5.51085584e-002, 2.97241509e-001, 1.54401213e-001, + 4.96586375e-002, -2.93173105e-003, 7.83035681e-002, + 3.09378263e-002, -5.17716119e-003, -1.22459466e-003, + 9.95039754e-003, 3.46741639e-003, -3.35953869e-002, + 1.88843906e-002, 5.89477681e-002, 3.13318372e-002, + 1.80176143e-002, 1.57015659e-002, 4.54421043e-002, + 3.19822170e-002, 3.99032375e-003, -9.83043341e-004, + 8.96487013e-003, 4.91761975e-003, 2.15991773e-003, + 4.22784186e-004, 8.08266085e-003, 5.13284467e-003, + 2.24389918e-002, 4.91165631e-002, 4.38130051e-002, + 6.12910502e-002, -1.05454810e-002, 4.34743352e-002, + 3.77665162e-002, 5.34516573e-002, -1.89818558e-003, + 1.47118361e-003, 5.15285181e-003, 5.05927671e-003, + 8.23311731e-002, 1.44106606e-002, 1.03894129e-001, + 3.50735299e-002, 1.17517665e-001, 2.31888443e-001, + 3.31259072e-001, 2.74613529e-001, -2.43794814e-001, + 8.06550235e-002, 2.96272099e-001, 1.71080649e-001, + -2.89492309e-002, 2.13343929e-003, 4.56141829e-002, + 2.54166927e-002, 9.27531272e-002, 9.82943820e-005, + 1.13380343e-001, 3.15459259e-002, 6.25228956e-002, + -1.07970215e-001, 3.46735954e-001, 1.81613386e-001, + -2.65372157e-001, -5.37307374e-002, 3.13411295e-001, + 1.40018612e-001, -2.68470608e-002, -7.83822179e-005, + 4.52930965e-002, 2.30832528e-002, 7.00818188e-003, + 6.29157585e-004, 1.10854460e-002, 4.54794243e-003, + 9.80879460e-003, -2.81101111e-002, 4.73144166e-002, + 4.07397337e-002, -2.38365792e-002, -2.11877655e-002, + 4.07109782e-002, 3.34610268e-002, -2.30932981e-003, + 1.67768376e-004, 5.72293811e-003, 3.73526546e-003, + -1.54131267e-003, -7.22254743e-004, 7.32038403e-003, + 5.09858970e-003, 3.09108254e-002, 2.30049808e-002, + 4.94346395e-002, 4.61623780e-002, 1.60545930e-002, + 4.40101922e-002, 4.16422039e-002, 5.48333414e-002, + -3.86339519e-003, 1.91842113e-003, 7.36322394e-003, + 5.72490646e-003, 3.66873965e-002, 2.37029810e-002, + 6.50935769e-002, 4.20257375e-002, 1.71491593e-001, + 2.75564492e-001, 3.67537558e-001, 3.36738229e-001, + 8.82315710e-002, 8.23247582e-002, 2.55665898e-001, + 1.99136421e-001, -7.18799904e-002, -6.44575630e-004, + 7.86595121e-002, 3.35934795e-002, 7.75107220e-002, + 2.81589832e-002, 9.20865834e-002, 4.90237549e-002, + -1.40321692e-002, 3.87688875e-002, 2.95666128e-001, + 2.87636369e-001, -7.70059451e-002, -8.48799348e-002, + 2.42755622e-001, 2.48881787e-001, -6.42615184e-002, + -1.66146383e-002, 7.58634955e-002, 3.90949249e-002, + 4.70924005e-003, -8.48724390e-004, 8.89133010e-003, + 6.65535033e-003, -6.85316185e-003, -3.76422592e-002, + 3.87330987e-002, 5.93405478e-002, -1.86313484e-002, + -3.31572145e-002, 4.16278802e-002, 5.65866344e-002, + -2.19480926e-003, -2.09323916e-004, 7.20872870e-003, + 5.91328973e-003, -3.25989537e-002, 1.52222859e-003, + 4.02766317e-002, 8.12417828e-003, -4.61099064e-003, + -3.59404087e-002, 5.82243130e-002, 5.08422814e-002, + 1.12706807e-003, -3.73952240e-002, 3.04052159e-002, + 4.94256876e-002, -1.39960990e-004, -3.17896134e-003, + 4.84147109e-003, 5.66236814e-003, -3.07693660e-001, + 9.26868815e-004, 3.63224953e-001, 3.75396758e-002, + -4.42899903e-003, -4.20799702e-002, 3.55723411e-001, + 1.47191554e-001, -1.86457355e-002, -5.93729727e-002, + 1.52452901e-001, 1.56049162e-001, 1.34515129e-002, + -6.39348384e-003, 3.27428877e-002, 2.47365627e-002, + -3.07217717e-001, 4.01203008e-003, 3.51678491e-001, + 3.47446911e-002, -4.66584936e-002, 5.07887006e-002, + 3.20690781e-001, 1.47166163e-001, -3.41927726e-003, + 2.48110685e-002, 1.37284622e-001, 1.29523143e-001, + 1.35859745e-002, 3.63061763e-003, 2.93487106e-002, + 2.10516453e-002, -3.05660646e-002, 3.54303542e-004, + 3.73068936e-002, 7.77133135e-003, -2.09497064e-002, + 4.76303734e-002, 5.87778240e-002, 6.66702017e-002, + -3.83587461e-003, 3.96722667e-002, 2.59761829e-002, + 6.09298646e-002, 7.14655733e-004, 3.28405295e-003, + 4.55714110e-003, 7.65579427e-003, -1.31406193e-003, + -7.27548904e-004, 6.44619297e-003, 4.53365920e-003, + -6.98551582e-003, -2.77062003e-002, 4.29056846e-002, + 4.84577604e-002, -1.32744131e-003, -3.07953916e-002, + 3.70878503e-002, 4.77877185e-002, 2.89395597e-004, + -1.61353254e-003, 5.69275999e-003, 5.37303416e-003, + -5.06274961e-002, -4.63641342e-003, 7.10608810e-002, + 3.32405418e-002, -5.11159487e-002, -2.29415387e-001, + 3.60794216e-001, 3.12274426e-001, 3.66751999e-002, + -1.49465114e-001, 2.22807854e-001, 2.40830928e-001, + 3.08251102e-002, -1.50602162e-002, 4.93398681e-002, + 3.58205140e-002, -4.67853025e-002, 3.75623931e-003, + 7.34357312e-002, 3.00360452e-002, -8.99611712e-002, + 6.42353371e-002, 4.92218763e-001, 2.01206744e-001, + 5.58249578e-002, 2.53910068e-002, 2.42328137e-001, + 1.72378227e-001, 3.29393856e-002, 7.60844967e-004, + 5.28907850e-002, 3.05317733e-002, -3.00034578e-003, + -1.30974210e-003, 8.57172254e-003, 4.81364783e-003, + -1.82340536e-002, 1.67770591e-002, 6.18554056e-002, + 3.90736051e-002, 8.51552747e-003, 1.18038999e-002, + 3.86049077e-002, 3.53164412e-002, 2.18143151e-003, + -2.30550329e-004, 6.35900674e-003, 5.18346531e-003, + 3.46404588e-004, -4.33046371e-003, 4.60857013e-003, + 9.15692281e-003, 4.59169224e-003, -4.99174073e-002, + 2.79453322e-002, 8.55296925e-002, -1.58599857e-002, + -3.75558734e-002, 4.02214676e-002, 7.52290115e-002, + 3.83314298e-004, -3.58277187e-003, 7.62842735e-003, + 8.27426650e-003, -3.17617469e-002, -1.81581061e-002, + 4.44437638e-002, 5.33860140e-002, 1.42594837e-002, + -1.67271391e-001, 1.71081871e-001, 4.13983524e-001, + -4.92057092e-002, -2.81786740e-001, 2.43432567e-001, + 4.04018641e-001, 2.68707145e-002, -3.63139920e-002, + 5.18088154e-002, 4.94607501e-002, -3.28091718e-002, + 6.99435920e-003, 5.12428321e-002, 2.92499345e-002, + -1.18237613e-002, 6.10682368e-002, 1.71376482e-001, + 1.93892956e-001, -2.10398898e-001, -1.87141134e-003, + 3.23407829e-001, 1.88059852e-001, 3.38000692e-002, + -1.05887512e-002, 5.11242710e-002, 3.31155844e-002, + -2.29785428e-003, 3.78044264e-004, 7.13466434e-003, + 5.24482969e-003, -2.18707416e-003, 8.93210713e-003, + 3.82017307e-002, 3.78416181e-002, -3.30203474e-002, + 1.88009869e-002, 5.34507893e-002, 3.78219485e-002, + 2.91874679e-003, 4.15529619e-004, 6.80686813e-003, + 4.83216718e-003, -3.61686433e-003, 7.40143645e-004, + 8.06656852e-003, 2.93873204e-003, -4.10023630e-002, + -1.93818267e-002, 6.45799860e-002, 3.12858894e-002, + -2.14252453e-002, -2.42229104e-002, 4.31840010e-002, + 3.49110849e-002, 2.44862773e-003, -5.30309801e-004, + 5.65203093e-003, 4.19266243e-003, -4.67761420e-002, + -3.04626650e-003, 6.71595186e-002, 1.98466331e-002, + -2.93861121e-001, -1.06121644e-001, 4.14635539e-001, + 1.69083714e-001, -6.68187961e-002, 3.08317970e-002, + 2.44071007e-001, 1.76632509e-001, 3.20093669e-002, + 1.76722798e-002, 4.71422784e-002, 3.60917822e-002, + -5.88266887e-002, -8.44880845e-003, 7.67854825e-002, + 2.23729555e-002, -3.13645035e-001, -4.18056883e-002, + 3.82764518e-001, 1.58449039e-001, 1.85297191e-001, + 3.05158459e-002, 2.86063731e-001, 1.88102320e-001, + 1.57465637e-002, 1.89125631e-002, 4.64565344e-002, + 3.86512317e-002, -7.84882065e-003, -1.98254106e-003, + 1.04301330e-002, 3.70511459e-003, -3.31616737e-002, + 1.33872489e-002, 5.14948815e-002, 2.96012871e-002, + 2.85110343e-002, 1.67666450e-002, 4.50386368e-002, + 3.37841399e-002, 4.75532579e-005, -1.21653068e-003, + 5.78371622e-003, 4.61213151e-003, -2.29212208e-004, + -1.26664608e-003, 4.40054899e-003, 6.25038520e-003, + -1.82187241e-002, -3.31833735e-002, 3.53433043e-002, + 5.41896112e-002, -4.25815815e-003, -3.38595398e-002, + 3.20827328e-002, 5.13938554e-002, -1.71281747e-004, + -1.82594464e-003, 3.93732451e-003, 5.82820829e-003, + -2.62190830e-002, -1.86573211e-002, 3.80350612e-002, + 5.98706938e-002, -1.37944654e-001, -1.01511464e-001, + 2.03793377e-001, 4.15439427e-001, 6.96743950e-002, + -9.67548341e-002, 1.58026099e-001, 2.72438020e-001, + 1.54150594e-002, -1.49314338e-002, 2.69830860e-002, + 4.06774431e-002, -1.97498370e-002, 2.77509019e-002, + 3.09833623e-002, 4.78284024e-002, -9.00867283e-002, + 2.66545385e-001, 1.60112426e-001, 3.55691254e-001, + 1.53649012e-002, 2.91331083e-001, 1.34724617e-001, + 3.64948988e-001, 1.10214856e-002, 3.11973412e-002, + 2.52757706e-002, 4.77040820e-002, 3.02384928e-004, + 2.14467105e-003, 3.50753614e-003, 5.49935829e-003, + -3.33877606e-003, 2.84164697e-002, 2.31992081e-002, + 4.60871533e-002, -2.90524401e-003, 2.79576853e-002, + 2.42474023e-002, 4.66770455e-002, -1.50892907e-003, + 2.70783575e-003, 3.94184375e-003, 6.05526939e-003, + -1.71739177e-003, 9.10960371e-004, 4.19625640e-003, + 1.94047589e-003, 5.00428118e-003, -1.69913145e-003, + 1.94388907e-002, 1.49271134e-002, -6.63863635e-003, + -2.21591047e-003, 5.10425679e-002, 1.52156530e-002, + 3.99949513e-002, 1.01634802e-003, 4.86041084e-002, + 4.02971404e-003, -1.66825168e-002, 5.34384511e-003, + 3.18923481e-002, 1.36441644e-002, 4.64664511e-002, + 6.45104935e-003, 1.41907319e-001, 6.87559769e-002, + -5.07442206e-002, 2.48434022e-002, 3.56890589e-001, + 8.55500922e-002, 2.80872047e-001, 2.26843683e-003, + 3.27858418e-001, 2.40171775e-002, -1.98393501e-002, + 6.83295261e-003, 3.85356545e-002, 1.75124221e-002, + 3.98903117e-002, 4.36933823e-002, 1.74095020e-001, + 1.18959270e-001, 2.38126460e-002, 1.76420540e-001, + 4.19639707e-001, 2.51190692e-001, 2.56992429e-001, + 7.31619028e-003, 3.01294059e-001, 3.17225903e-002, + 3.55697353e-004, 1.06818345e-003, 5.23681240e-003, + 5.39730676e-003, 3.02889422e-002, 2.99790222e-002, + 5.69364317e-002, 5.04035540e-002, 3.04385703e-002, + 8.27111974e-002, 1.46308720e-001, 9.73300040e-002, + 2.16101278e-002, -5.95875608e-004, 3.05383205e-002, + 7.36426329e-003, 1.94882916e-004, 3.55297280e-003, + 4.02533589e-003, 6.18556049e-003, -1.07792243e-002, + 5.25169335e-002, 3.02367546e-002, 6.29578307e-002, + -2.86403187e-002, 4.62795347e-002, 4.68209349e-002, + 6.14315234e-002, -1.87792140e-003, 1.78894016e-003, + 5.53230057e-003, 5.61506860e-003, 1.66053958e-002, + 1.20111052e-002, 2.99917106e-002, 3.15665156e-002, + 6.25048205e-003, 8.19678903e-002, 1.47044674e-001, + 2.19856873e-001, -2.29311481e-001, 1.35692954e-001, + 3.33114415e-001, 2.70861626e-001, -5.91594912e-002, + 1.46653047e-002, 6.94082156e-002, 3.89854126e-002, + 2.13108528e-002, -3.72759928e-003, 3.51684280e-002, + 4.79875877e-002, 3.19603831e-002, 1.66347120e-002, + 1.35271177e-001, 3.97316843e-001, -1.42750934e-001, + 6.01988137e-002, 2.22181201e-001, 4.55333024e-001, + -7.73204416e-002, 2.59201694e-002, 8.40919018e-002, + 6.14897348e-002, -2.98114930e-004, -2.89880112e-003, + 4.89723356e-003, 8.19013081e-003, -2.27209367e-003, + -3.78590301e-002, 2.74952520e-002, 8.16965476e-002, + -6.45009847e-003, -3.69347185e-002, 2.83332355e-002, + 8.10514688e-002, -3.55081842e-003, -2.08312995e-003, + 6.40326226e-003, 8.39988794e-003, 1.55635516e-003, + 3.22418404e-004, 4.95856255e-003, 2.45227991e-003, + 3.40192649e-003, 1.11984350e-002, 2.52747294e-002, + 1.96957383e-002, -2.75562946e-002, 1.13746133e-002, + 5.85814603e-002, 2.46515106e-002, -7.64752366e-003, + -1.84121029e-003, 1.08597772e-002, 4.15686518e-003, + 2.09204927e-002, 1.54479954e-003, 3.66895087e-002, + 1.37324687e-002, 2.58134343e-002, 2.20695455e-002, + 1.48267761e-001, 7.39045590e-002, -2.45220765e-001, + 1.36512788e-002, 4.95540708e-001, 1.03378288e-001, + -5.36383912e-002, -7.55352015e-003, 7.30138943e-002, + 2.07842439e-002, 2.07700096e-002, -5.60142286e-003, + 3.64100561e-002, 1.64932217e-002, 4.05506045e-002, + -4.58947942e-002, 1.75748289e-001, 1.02835618e-001, + -3.06635737e-001, -6.39601052e-002, 5.78143418e-001, + 1.26157030e-001, -3.71527486e-002, -1.29354734e-003, + 6.13058694e-002, 1.99467689e-002, 1.14140031e-003, + -1.08074117e-003, 5.19737415e-003, 3.61978821e-003, + 4.50550672e-003, -2.45287027e-002, 3.59902233e-002, + 3.64113376e-002, -4.24602069e-002, -2.86726020e-002, + 7.84873515e-002, 4.06797677e-002, -2.41185585e-003, + 9.83131933e-004, 6.98380545e-003, 3.85345030e-003, + 4.71611461e-003, -4.83978976e-004, 6.91370619e-003, + 5.56505518e-003, 9.30752663e-004, 1.79366991e-002, + 2.49398015e-002, 3.07160784e-002, -1.11418804e-002, + 1.35458345e-002, 2.43133679e-002, 3.09762303e-002, + -2.35003652e-003, -8.19308043e-004, 6.80588046e-003, + 5.50254248e-003, 7.40206763e-002, -5.13923727e-002, + 9.27531198e-002, 6.55217990e-002, 5.82322739e-002, + -1.19233228e-001, 1.78966507e-001, 1.91455469e-001, + -2.00747978e-002, -3.27459211e-003, 1.55864909e-001, + 1.42017961e-001, -5.32920361e-002, -1.12874769e-002, + 7.09209740e-002, 4.25595418e-002, 5.89560308e-002, + -2.26159915e-002, 1.04467466e-001, 5.04477806e-002, + 2.14278281e-001, -1.08398274e-001, 3.64775121e-001, + 2.57217377e-001, -1.30475536e-001, -3.46996844e-001, + 2.62242168e-001, 4.08912241e-001, -5.58257662e-002, + -5.32311127e-002, 8.09195563e-002, 7.18642324e-002, + 1.96223008e-003, -2.35084235e-003, 1.17784468e-002, + 8.58369656e-003, -2.86529568e-004, -9.28469524e-002, + 6.47330955e-002, 1.12127967e-001, -3.13763544e-002, + -6.57994673e-002, 5.65804392e-002, 9.36488286e-002, + 1.14990794e-003, -1.51371059e-003, 6.45485520e-003, + 8.10413063e-003, -1.56469438e-002, 2.30434677e-003, + 1.82590876e-002, 8.27633869e-003, 1.85845792e-002, + -4.40408625e-002, 4.91485223e-002, 5.90974502e-002, + 2.61749551e-002, -3.02803181e-002, 4.72509451e-002, + 7.94327781e-002, 1.43134280e-003, 4.40916652e-003, + 1.28263365e-002, 9.02407989e-003, -1.56811565e-001, + 7.23659154e-003, 1.90863982e-001, 2.42276508e-002, + 1.73114296e-002, -9.50165465e-003, 2.36683771e-001, + 1.75873846e-001, 2.12027598e-002, -8.43186602e-002, + 3.02137405e-001, 3.21587205e-001, 1.18167214e-001, + -1.69496089e-002, 1.98556751e-001, 4.37344499e-002, + -1.24861032e-001, 5.11789136e-003, 1.84632301e-001, + 2.66463719e-002, 3.07817832e-002, 3.61661166e-002, + 3.76492083e-001, 1.51459485e-001, -1.27898723e-001, + -2.28915010e-002, 2.91694373e-001, 1.25014782e-001, + 1.57256156e-001, -1.00498237e-002, 2.27622777e-001, + 2.88922433e-002, -1.10817188e-002, 6.88462169e-004, + 2.14108322e-002, 4.64624679e-003, -2.17063129e-002, + 2.39228308e-002, 5.58744557e-002, 3.75918336e-002, + -1.39374090e-002, 1.49316890e-002, 3.33753638e-002, + 2.73402501e-002, 2.04027370e-002, 3.92397429e-004, + 2.97033787e-002, 3.22228251e-003, 1.24689366e-003, + 4.83799027e-003, 6.07795920e-003, 6.18716655e-003, + -1.31932925e-002, 4.51060310e-002, 3.27501781e-002, + 5.02277650e-002, -2.97103841e-002, 5.53484447e-002, + 5.20044044e-002, 6.36056066e-002, -4.34716837e-003, + -7.54823777e-005, 7.81835802e-003, 6.32238155e-003, + 1.77749339e-002, 4.85101389e-003, 3.20248529e-002, + 1.46123879e-002, -4.47391234e-002, 5.01364879e-002, + 1.59231380e-001, 1.05769232e-001, -7.36944154e-002, + 1.70142934e-001, 5.10575831e-001, 2.13050663e-001, + -1.06191404e-001, 5.84275136e-003, 1.24908544e-001, + 2.83710826e-002, 1.47405583e-002, -1.18224103e-004, + 2.69890521e-002, 8.98585282e-003, -4.11141180e-002, + -1.10586463e-002, 1.62450686e-001, 6.79127127e-002, + 2.69526131e-002, -1.33046331e-002, 5.86734176e-001, + 1.05020367e-001, -1.35794416e-001, 4.71076835e-003, + 1.57826811e-001, 2.39446294e-002, 1.43291755e-003, + -2.19860885e-006, 3.47075798e-003, 1.71652157e-003, + -8.55224673e-003, -9.85298771e-003, 2.72536110e-002, + 1.69787221e-002, 6.07191538e-003, -1.17333755e-002, + 8.08662102e-002, 2.26165131e-002, -1.79608818e-002, + 1.65247626e-003, 2.14046706e-002, 3.88355274e-003, + 2.19066557e-003, 6.68815104e-004, 8.88740923e-003, + 4.27618949e-003, 2.05420200e-002, 2.86849663e-002, + 4.26763035e-002, 3.92883308e-002, -4.69542816e-002, + 3.30395140e-002, 6.76424429e-002, 4.25013639e-002, + -2.09953524e-002, -2.74086068e-003, 2.66528372e-002, + 7.30434665e-003, 3.73170413e-002, 3.69184767e-003, + 6.75168559e-002, 2.39875689e-002, 1.46921709e-001, + 4.29609902e-002, 2.18470186e-001, 1.00307234e-001, + -2.79013544e-001, 5.46418242e-002, 3.84975791e-001, + 1.11078098e-001, -2.19717160e-001, 4.60073398e-003, + 2.55154490e-001, 3.54533345e-002, 3.69044207e-002, + 1.39276986e-003, 6.22727387e-002, 2.17052028e-002, + 1.32734492e-001, -2.48421691e-002, 2.01251373e-001, + 8.91648084e-002, -2.30999246e-001, -2.80022360e-002, + 3.40363443e-001, 1.03819355e-001, -2.30976418e-001, + 9.69690923e-003, 2.60723352e-001, 3.53434868e-002, + 3.17442603e-003, -1.34911708e-004, 7.13710068e-003, + 3.04258079e-003, 1.96486097e-002, -1.56308357e-002, + 3.71166281e-002, 2.42023319e-002, -3.62726152e-002, + -1.72974337e-002, 5.80446832e-002, 2.87320111e-002, + -2.51475256e-002, 3.29923443e-003, 3.03794127e-002, + 7.22943339e-003, 6.92454923e-004, 1.06170285e-003, + 3.89877986e-003, 4.64659510e-003, 6.13440946e-003, + 3.12994048e-002, 2.85161342e-002, 4.75677177e-002, + -2.69282833e-002, 2.35801730e-002, 4.01450656e-002, + 4.19453084e-002, -1.28012427e-004, -1.58849187e-004, + 3.23708449e-003, 3.37902200e-003, 1.70977768e-002, + -6.26720022e-003, 3.29164825e-002, 3.53398249e-002, + 1.14335775e-001, -1.23710074e-001, 1.93413213e-001, + 3.44226360e-001, -2.87343800e-001, -4.26162407e-002, + 3.34271550e-001, 3.03608626e-001, -8.56557209e-003, + 7.51062343e-003, 2.87973657e-002, 2.72815097e-002, + 1.03967376e-002, -1.83080311e-003, 2.91441958e-002, + 3.08306273e-002, 1.25309572e-001, 2.65241582e-002, + 1.94637969e-001, 2.82497764e-001, -1.13399878e-001, + 8.43790695e-002, 2.11987302e-001, 4.03188527e-001, + -2.29815468e-002, 9.79533326e-003, 3.66402939e-002, + 4.13119458e-002, 3.57528974e-004, -8.50969285e-004, + 3.78345908e-003, 4.14568465e-003, 5.17414557e-003, + -2.30316985e-002, 2.86948290e-002, 4.29576598e-002, + -9.54912696e-003, -2.64788456e-002, 3.01133804e-002, + 4.68082093e-002, -8.01219314e-004, -7.87400466e-004, + 4.04055603e-003, 4.47188877e-003, 6.40040438e-004, + -1.33682985e-003, 4.96554654e-003, 5.41159464e-003, + 4.14180756e-003, -2.04081293e-002, 3.26852761e-002, + 5.05959913e-002, 1.05961757e-002, -9.48182773e-003, + 3.14307548e-002, 4.32595052e-002, -1.62019324e-003, + -6.53710798e-004, 4.91388189e-003, 3.76264588e-003, + -4.32598917e-003, -1.58449467e-002, 5.80548793e-002, + 4.18656841e-002, 1.64360215e-004, -1.22783624e-001, + 3.38172466e-001, 2.82517850e-001, 1.12735689e-001, + -2.19620004e-001, 2.70351946e-001, 3.19340467e-001, + -8.36875197e-003, -2.05825828e-002, 5.72749563e-002, + 3.91617268e-002, -8.94700643e-003, -2.07729675e-002, + 5.27976230e-002, 3.89223881e-002, -5.86418211e-002, + -1.56017140e-001, 2.83294708e-001, 2.72187203e-001, + 1.40099406e-001, -1.02259271e-001, 2.88652688e-001, + 2.61355937e-001, -1.54582187e-004, -1.26115270e-002, + 5.96887693e-002, 3.97265479e-002, -1.23587658e-003, + -1.78395119e-003, 5.42678172e-003, 5.44302259e-003, + -8.02349532e-004, -5.26296953e-003, 3.16153616e-002, + 3.92549187e-002, 1.31373666e-002, -1.50939208e-002, + 3.59441899e-002, 4.50666919e-002, 1.48179103e-003, + -3.00703011e-003, 5.88011416e-003, 6.23734435e-003, + -1.52564673e-002, -7.51489133e-004, 2.38852669e-002, + 1.16055673e-002, -1.76824257e-002, -8.10102001e-002, + 4.66611907e-002, 1.47878677e-001, -2.13244394e-003, + -9.44563523e-002, 3.22866887e-002, 1.60883218e-001, + -1.03913080e-004, -1.01339538e-002, 5.49491448e-003, + 1.95136853e-002, -2.15928167e-001, -2.92103295e-003, + 2.70941436e-001, 4.15475257e-002, -1.27651811e-001, + -1.29334480e-001, 2.42392614e-001, 2.93311685e-001, + 5.39826462e-004, -9.40144360e-002, 1.23859592e-001, + 2.39644840e-001, 1.98750775e-002, -1.46922404e-002, + 3.69985513e-002, 3.59789804e-002, -2.32906386e-001, + 3.28777730e-003, 2.90346414e-001, 3.36431377e-002, + -7.66290277e-002, 1.40115008e-001, 2.48724341e-001, + 2.15012312e-001, 2.32417341e-002, 1.76633418e-001, + 1.48618102e-001, 2.26693302e-001, 1.05154663e-002, + 2.31141988e-002, 3.34584713e-002, 3.46070118e-002, + -2.35917997e-002, -9.01623222e-004, 3.16990279e-002, + 6.98272139e-003, -8.14964157e-003, 3.31896879e-002, + 5.35090826e-002, 5.04345819e-002, 1.75983831e-003, + 2.40155552e-002, 3.19822542e-002, 4.82540540e-002, + 1.01306278e-003, 3.12518422e-003, 5.95681276e-003, + 7.10177189e-003, -8.75588134e-003, -1.13281363e-003, + 1.30461287e-002, 6.14008261e-003, 2.42160801e-002, + -6.41828775e-002, 6.65777922e-002, 8.45852941e-002, + 1.16577409e-002, -5.07468767e-002, 5.49072735e-002, + 8.33673403e-002, -3.85455159e-003, -3.06390622e-003, + 7.77196558e-003, 9.02619120e-003, -9.66656506e-002, + 1.57034099e-002, 1.25196144e-001, 3.16129923e-002, + -1.37549594e-001, -1.02670029e-001, 3.43434662e-001, + 1.97145984e-001, 5.08663878e-002, -3.04473490e-001, + 1.62482977e-001, 3.45012993e-001, 1.66499745e-002, + -3.59971002e-002, 3.69183570e-002, 4.85986955e-002, + -7.99521133e-002, 8.53854325e-003, 1.18213303e-001, + 2.47120280e-002, -2.93016911e-001, 5.90252057e-002, + 4.61616814e-001, 1.34185448e-001, 1.17528765e-003, + 1.13714607e-002, 1.24866709e-001, 1.03871800e-001, + 2.19782330e-002, -3.20411706e-003, 3.49047296e-002, + 2.12210882e-002, -7.61823263e-003, -1.08751131e-003, + 1.42345596e-002, 3.77741153e-003, -4.74640578e-002, + 1.32188406e-002, 7.86157846e-002, 2.68746745e-002, + -3.37184593e-003, 9.42952093e-003, 2.45362911e-002, + 2.18839329e-002, 1.85805233e-003, 2.07765443e-005, + 4.46985243e-003, 3.18174856e-003, 3.96452984e-003, + 1.24290492e-002, 7.41807884e-003, 2.36084498e-002, + -6.54568663e-004, 1.45649254e-001, 2.92988420e-002, + 2.30450705e-001, -1.76023832e-003, 1.42762288e-001, + 2.62466278e-002, 2.34722540e-001, 9.42551182e-004, + 1.59927458e-002, 4.85798251e-003, 2.82373596e-002, + 1.01190962e-001, -4.90590036e-002, 1.15656182e-001, + 7.43094310e-002, 1.47054464e-001, 4.24219575e-003, + 2.16759473e-001, 1.93812504e-001, -9.43294447e-003, + 8.83460417e-002, 6.77234679e-002, 1.44792736e-001, + -1.26302745e-002, 1.67930257e-002, 2.59718765e-002, + 2.67845131e-002, 5.17386757e-002, -2.62266546e-002, + 8.37103501e-002, 4.61855754e-002, 4.55904245e-001, + -1.68314770e-001, 4.91800874e-001, 2.26460800e-001, + 1.59095647e-003, -8.13593343e-003, 6.28370643e-002, + 5.88767305e-002, -9.49641224e-003, -2.30405072e-004, + 1.71244778e-002, 1.00556184e-002, 2.39651930e-003, + 7.31562788e-004, 8.30175541e-003, 4.56552161e-003, + 8.37943628e-002, -3.51427458e-002, 9.05814916e-002, + 5.21511585e-002, 1.29860137e-002, -1.90313309e-002, + 2.27437746e-002, 2.84858979e-002, -3.75628966e-004, + -7.90796417e-004, 1.96324917e-003, 2.45304732e-003, + -1.77521762e-002, 2.09974661e-003, 2.24949811e-002, + 6.75659720e-003, 4.66813184e-002, -1.33072704e-001, + 7.74649531e-002, 1.81468382e-001, -4.71969433e-002, + -1.42653599e-001, 6.32495582e-002, 2.06932589e-001, + -3.31821991e-003, -5.32206753e-003, 5.41589549e-003, + 1.08908163e-002, -2.00564981e-001, 2.82297600e-002, + 2.19814137e-001, 3.98928598e-002, -9.57921892e-002, + -2.73772497e-002, 2.14422002e-001, 2.44247675e-001, + -6.40288927e-003, -4.88287248e-002, 1.00571096e-001, + 2.08862752e-001, 4.25036717e-003, 9.73148854e-004, + 1.27698071e-002, 1.86571088e-002, -1.83594853e-001, + 2.53168829e-002, 1.96652398e-001, 4.07920256e-002, + -2.24218935e-001, 1.69132262e-001, 2.78916836e-001, + 2.45280772e-001, 8.88510514e-003, 1.08495653e-001, + 9.29454491e-002, 2.10110337e-001, 9.52841062e-003, + 2.16062590e-002, 1.63731705e-002, 3.17132287e-002, + -7.74490321e-003, 5.83941862e-003, 1.06999325e-002, + 8.25528894e-003, -3.54793854e-002, 1.71069458e-001, + 4.65564616e-002, 1.80178940e-001, 5.57668740e-004, + 1.90297365e-001, 2.92694885e-002, 2.00037792e-001, + -1.65108463e-003, 2.25899108e-002, 4.79070656e-003, + 2.44598668e-002, 1.80059957e-004, -4.32784529e-003, + 3.50250816e-003, 6.08948292e-003, 1.89119931e-002, + -5.78489751e-002, 2.87469197e-002, 6.39186427e-002, + 4.16415110e-002, -6.92130476e-002, 5.26470654e-002, + 7.92342946e-002, -1.66944228e-003, -5.33506274e-004, + 1.09952474e-002, 6.74429908e-003, -6.73099747e-003, + 7.64961587e-004, 1.64508224e-002, 2.32506990e-002, + 7.14968657e-003, -2.72602811e-002, 8.91361684e-002, + 1.20297737e-001, 1.58493370e-001, -9.61348489e-002, + 1.92882195e-001, 1.94306463e-001, 3.73240672e-002, + -3.99250537e-002, 5.80271780e-002, 5.19052595e-002, + -1.70792434e-002, 9.52241570e-002, 3.89218405e-002, + 1.01110429e-001, -1.69361070e-001, 4.06691521e-001, + 2.23217532e-001, 5.05890846e-001, 4.79469523e-002, + 3.82565334e-002, 1.61373407e-001, 2.01952145e-001, + 3.81840169e-002, 9.54689109e-004, 5.06112911e-002, + 2.95590218e-002, 5.50897792e-003, 3.90926702e-003, + 8.53205100e-003, 1.31700523e-002, -4.76848930e-002, + 1.14776649e-001, 6.66833892e-002, 1.52252570e-001, + -6.29956126e-002, 1.59893453e-001, 8.16197693e-002, + 1.77724108e-001, -3.89179651e-004, 4.87279426e-003, + 8.14234186e-003, 1.13073979e-002, 5.92001561e-005, + 1.52814391e-004, 4.76050703e-003, 4.09348914e-003, + 3.23731601e-002, 4.24687862e-002, 5.59562705e-002, + 5.38084991e-002, -1.38153834e-002, 4.76859808e-002, + 4.32378612e-002, 5.98375164e-002, -4.71370033e-004, + 9.43023770e-004, 5.23750484e-003, 5.49931824e-003, + 2.29331050e-002, 2.61536520e-002, 4.66741547e-002, + 3.92675772e-002, 3.14139485e-001, 2.00985402e-001, + 4.30057973e-001, 2.87919104e-001, -1.92880705e-001, + 8.04885700e-002, 2.96711355e-001, 2.63694048e-001, + -2.92443056e-002, 1.57794729e-002, 5.30563034e-002, + 4.13397551e-002, 4.71234508e-002, 3.50536034e-002, + 6.08605593e-002, 4.98932563e-002, 1.06439441e-001, + 8.09308439e-002, 2.16102839e-001, 1.92791969e-001, + -1.16552509e-001, 1.07613824e-001, 1.89628020e-001, + 2.05502361e-001, -3.03186271e-002, 2.52305660e-002, + 4.83948626e-002, 4.21441570e-002, 3.10105667e-003, + 7.80529750e-004, 5.74282743e-003, 4.70207259e-003, + 8.12051911e-003, -1.39821544e-002, 2.55892221e-002, + 2.82187015e-002, -6.36877771e-003, -1.24370875e-002, + 2.20994949e-002, 2.66908575e-002, -1.90869137e-003, + 1.11202127e-003, 4.56804829e-003, 4.26159007e-003, + -1.00897411e-002, 2.30413466e-003, 2.55171880e-002, + 7.55373854e-003, -5.44544756e-002, -5.18252365e-002, + 8.28978270e-002, 7.72583783e-002, -8.87585711e-003, + -4.85961922e-002, 3.96469422e-002, 6.81347698e-002, + 1.63247518e-004, -4.45987098e-003, 5.28175803e-003, + 8.12995248e-003, -1.97904542e-001, -2.34643966e-002, + 2.84148008e-001, 4.89599966e-002, -2.98363805e-001, + -2.20036402e-001, 3.86182487e-001, 2.66301155e-001, + 4.14095968e-002, -1.00957222e-001, 1.38989523e-001, + 1.67045802e-001, 2.02221293e-002, -9.41098481e-003, + 3.33556682e-002, 2.73382347e-002, -2.45431542e-001, + -3.37865278e-002, 3.15566421e-001, 5.14333621e-002, + -1.04246542e-001, 2.75196470e-002, 2.17154324e-001, + 1.33675814e-001, 5.08723147e-002, 5.62837645e-002, + 1.22063011e-001, 1.18573613e-001, 1.97577477e-002, + 6.19824277e-003, 3.31990346e-002, 2.44811531e-002, + -2.25959700e-002, -3.62529024e-003, 3.08176856e-002, + 7.42721930e-003, -9.73141007e-003, 1.66534744e-002, + 3.30288522e-002, 3.26809138e-002, 7.38299172e-003, + 1.70016512e-002, 2.24371422e-002, 3.23258601e-002, + 1.01254380e-003, 9.61776765e-004, 4.35983902e-003, + 4.68499027e-003, -1.68471911e-003, 3.27906990e-003, + 6.49005687e-003, 1.23669356e-002, 1.96814593e-002, + 8.67909566e-002, 4.00127061e-002, 1.33498728e-001, + 1.70452725e-002, 9.34439674e-002, 3.63927782e-002, + 1.09683208e-001, 2.83468398e-003, 6.97329221e-003, + 4.64478135e-003, 8.82301014e-003, 3.81514989e-002, + -1.18453251e-002, 4.53443937e-002, 8.93317387e-002, + 5.56037910e-002, 6.86805993e-002, 1.46500096e-001, + 2.71810859e-001, -7.72528583e-003, -4.35554236e-003, + 9.37689841e-002, 1.90121591e-001, -1.37347057e-002, + 3.60932946e-003, 2.29736436e-002, 3.85741256e-002, + 8.47029909e-002, -1.31934181e-001, 1.07066773e-001, + 1.49540499e-001, 4.61336225e-001, -1.54443443e-001, + 5.02783895e-001, 2.98660666e-001, -1.29426215e-002, + 5.67510910e-002, 1.20045759e-001, 1.27766624e-001, + -1.53508438e-002, -2.57523934e-004, 2.49130540e-002, + 3.09553798e-002, 5.49294939e-003, 3.47756967e-003, + 1.44799724e-002, 7.98248127e-003, 1.03850953e-001, + -3.92488092e-002, 1.09534048e-001, 5.29849418e-002, + 5.92857599e-004, -1.89922713e-002, 1.89149361e-002, + 2.77445652e-002, 2.56561994e-004, -2.99550797e-004, + 3.63254361e-003, 4.29712236e-003, 3.37589672e-003, + -9.60683729e-003, 6.77052466e-003, 1.37001080e-002, + 2.08351258e-002, -1.07175276e-001, 4.16811146e-002, + 1.30612478e-001, 4.60258685e-003, -9.34066474e-002, + 3.10975295e-002, 1.17136911e-001, -3.41809541e-003, + -8.74252338e-003, 5.92444697e-003, 1.30509175e-002, + -2.52539385e-002, -2.23839488e-002, 4.14384566e-002, + 4.89966236e-002, -1.50320046e-002, -2.44212583e-001, + 1.70816258e-001, 4.41245139e-001, 4.65789661e-002, + -3.25874209e-001, 1.47136703e-001, 5.50833702e-001, + 1.76616460e-002, -4.80836518e-002, 3.39088924e-002, + 7.61392340e-002, -2.73733847e-002, 2.21322756e-003, + 4.04435471e-002, 2.39152666e-002, -3.90051231e-002, + 2.54411772e-002, 1.37929350e-001, 1.29252180e-001, + 3.27230953e-002, 2.46082451e-002, 1.07974939e-001, + 1.30163252e-001, 1.47969285e-002, 4.21899930e-003, + 2.65202690e-002, 2.59270128e-002, -2.06703157e-003, + 5.98859566e-004, 5.21669863e-003, 3.50626884e-003, + -5.40547352e-003, 1.59090273e-002, 2.24859957e-002, + 2.74776798e-002, 3.76517465e-003, 1.51116289e-002, + 2.00846903e-002, 2.61050388e-002, 8.83611909e-004, + 1.08302757e-003, 3.66585399e-003, 3.84748145e-003, + -4.53232927e-003, 2.13210049e-004, 7.66834849e-003, + 2.62418413e-003, -6.52712770e-003, -1.43959932e-002, + 1.75094139e-002, 2.03190092e-002, 6.68413378e-003, + -1.30573260e-002, 1.57881510e-002, 2.22535171e-002, + 3.26823769e-003, 1.53304345e-003, 6.32089330e-003, + 4.57400829e-003, -4.84338962e-002, 5.67208882e-003, + 6.32411987e-002, 1.57376286e-002, -5.90663664e-002, + -3.08754910e-002, 1.24362268e-001, 9.17106420e-002, + 7.27721304e-002, -9.09589902e-002, 2.01324984e-001, + 2.20824167e-001, 5.78638390e-002, 3.13202408e-003, + 6.86503276e-002, 5.12866527e-002, -4.69773859e-002, + 2.19918471e-002, 6.05197176e-002, 2.97580883e-002, + -1.42391056e-001, 1.98401749e-001, 2.45766699e-001, + 2.54409283e-001, 8.69051274e-003, 4.10059886e-003, + 6.02072239e-001, 3.77868950e-001, 3.38777415e-002, + -7.35832192e-003, 5.88214286e-002, 5.91683611e-002, + -5.28327073e-004, 9.93547030e-004, 3.51478998e-003, + 6.11588592e-003, -2.18984839e-002, 3.97582054e-002, + 4.09078896e-002, 6.88193068e-002, -2.47332975e-002, + 4.86144349e-002, 7.29966909e-002, 8.79400447e-002, + 1.77149102e-003, 2.01001950e-003, 8.76454730e-003, + 1.19140949e-002, -3.29753011e-003, -2.06337380e-003, + 5.45515679e-003, 7.34313205e-003, -9.54866689e-003, + -3.16783153e-002, 2.56122705e-002, 4.93084565e-002, + 1.40361404e-002, -2.30222698e-002, 3.11789643e-002, + 4.00814563e-002, 2.44095153e-003, 3.00714491e-005, + 6.30533043e-003, 5.85682224e-003, -3.22275274e-002, + 4.73407917e-002, 5.19629009e-002, 6.33029863e-002, + -1.40353531e-001, 2.13359356e-001, 2.15321526e-001, + 3.13431203e-001, 1.19664505e-001, 5.68541288e-002, + 1.84516340e-001, 1.82624698e-001, 3.85853350e-002, + 1.26558067e-002, 5.41655682e-002, 3.80176827e-002, + -6.24717912e-003, 1.87376402e-002, 5.33515923e-002, + 3.44716422e-002, -3.77855837e-001, 7.34382728e-003, + 4.71207529e-001, 2.32344553e-001, 1.51478574e-001, + 8.24241266e-002, 2.32626200e-001, 1.93647504e-001, + 4.71086614e-002, 8.38151388e-003, 6.53928444e-002, + 3.06898206e-002, 4.00181249e-004, -9.98583855e-004, + 6.61894819e-003, 4.62633418e-003, -3.31680514e-002, + 4.35605980e-002, 6.78036809e-002, 5.62645793e-002, + 1.57556348e-002, 4.51259278e-002, 4.96869981e-002, + 5.65708540e-002, 2.16461392e-003, 1.20938162e-003, + 6.80013234e-003, 5.09044295e-003, -2.25039646e-002, + 2.50254245e-003, 3.20146345e-002, 4.51842416e-003, + -4.58461884e-003, -2.02304320e-004, 4.25392389e-002, + 1.83877833e-002, -5.52035216e-003, -2.88544619e-003, + 3.08764558e-002, 1.93782970e-002, 2.26653013e-002, + 1.15680613e-003, 3.51136588e-002, 3.52979009e-003, + -2.13837966e-001, 9.49613750e-003, 2.51317233e-001, + 3.24760154e-002, 2.07583643e-002, 1.46231177e-004, + 2.36650988e-001, 1.10436797e-001, -5.36509603e-002, + 2.60277893e-002, 1.92949638e-001, 9.68060121e-002, + 1.75000772e-001, 7.39143929e-003, 2.61558861e-001, + 2.63006296e-002, -1.94168434e-001, 1.47105253e-003, + 2.20765904e-001, 3.30405347e-002, 1.57990009e-002, + 2.10336655e-001, 1.94111347e-001, 2.55377263e-001, + -1.08776921e-002, 2.23440111e-001, 2.28952244e-001, + 2.52769053e-001, 1.40596986e-001, 2.03038789e-002, + 2.36850500e-001, 3.99096683e-002, -1.46476915e-002, + 4.54191258e-003, 1.87139306e-002, 8.72020982e-003, + 1.73757300e-002, 1.05825491e-001, 5.94443977e-002, + 1.20233126e-001, -4.49058833e-003, 9.61780399e-002, + 5.64192906e-002, 1.22615673e-001, -7.62603129e-004, + -2.42801290e-003, 1.88168380e-002, 1.06761986e-002, + 5.74130099e-003, 1.36673346e-003, 1.37334224e-002, + 5.42041240e-003, -1.01182740e-002, 6.58582151e-002, + 6.46215528e-002, 7.21444339e-002, -1.89087559e-002, + 4.76420447e-002, 4.16890867e-002, 6.42536506e-002, + -3.25259357e-003, 8.50516779e-004, 6.48437627e-003, + 5.91553748e-003, 1.06076144e-001, -3.99829634e-003, + 1.42084569e-001, 2.56643686e-002, -1.34803861e-001, + -1.04076220e-002, 4.47984099e-001, 1.64244458e-001, + -1.52597800e-001, 4.65116324e-003, 2.51990378e-001, + 1.71532691e-001, -3.79061513e-002, 1.86602166e-003, + 5.34768105e-002, 2.64082924e-002, 1.27649859e-001, + 9.48011177e-004, 1.63946435e-001, 2.26171110e-002, + -2.17801377e-001, -8.88232216e-002, 4.51748788e-001, + 1.71019852e-001, -8.02108571e-002, -8.31919238e-002, + 2.17769697e-001, 1.55570239e-001, -3.71817760e-002, + -7.19217537e-003, 4.89033349e-002, 2.68655755e-002, + 1.28538441e-002, -1.61057385e-003, 1.84912942e-002, + 5.74892946e-003, -3.67784649e-002, -5.05644158e-002, + 5.62765934e-002, 6.71126172e-002, -6.37809001e-003, + -4.13277037e-002, 2.70979162e-002, 6.08220957e-002, + -2.62409984e-003, -2.53780535e-003, 4.76884004e-003, + 5.86870220e-003, 9.31169838e-004, -4.29841893e-004, + 5.49719343e-003, 3.16402456e-003, 1.39500545e-002, + 9.53196455e-003, 4.23918068e-002, 2.82701720e-002, + -1.04921116e-002, 1.16368104e-002, 3.27304378e-002, + 2.76197642e-002, -7.73510837e-004, 2.60999106e-004, + 4.74677468e-003, 3.16379801e-003, 1.56348273e-002, + 4.18037293e-004, 4.79726456e-002, 1.98994912e-002, + 1.24622226e-001, 9.46563762e-003, 3.34592521e-001, + 1.65492445e-001, -3.66607830e-002, 6.23145550e-002, + 2.71118402e-001, 1.81674495e-001, -2.15408187e-002, + 4.64539556e-003, 4.41956148e-002, 2.27121767e-002, + 2.10137535e-002, -1.47938903e-003, 4.47542518e-002, + 1.76033340e-002, -4.54423875e-002, -5.25308251e-002, + 4.90941554e-001, 1.61674306e-001, 1.53047070e-001, + -8.80972520e-002, 4.81700212e-001, 1.80729851e-001, + -2.80383173e-002, -2.99371290e-003, 5.04407994e-002, + 2.13340614e-002, 2.04935973e-003, 3.49082373e-004, + 5.78847853e-003, 2.71230820e-003, -1.06977820e-002, + -1.01394178e-002, 6.27121106e-002, 2.85978261e-002, + 1.77132189e-002, -1.43219111e-002, 6.30712286e-002, + 3.15307006e-002, -1.95124291e-003, -3.11003241e-004, + 5.99165354e-003, 3.08896811e-003, 2.42121122e-003, + 1.06420796e-002, 8.17823038e-003, 1.78888720e-002, + -2.01245028e-004, 1.45069286e-001, 3.82633507e-002, + 1.96204633e-001, -1.63492560e-002, 1.37881026e-001, + 4.17634323e-002, 1.98992550e-001, -1.52708904e-003, + 8.67773592e-003, 9.45415907e-003, 1.87234003e-002, + 4.43958864e-002, -1.25978906e-002, 8.55146274e-002, + 4.71734777e-002, 1.68548316e-001, -7.39118923e-003, + 2.75422961e-001, 1.98889181e-001, -1.65110350e-001, + 5.55756241e-002, 2.49433011e-001, 2.31552616e-001, + -6.37830198e-002, 1.10180397e-002, 1.00861840e-001, + 4.85367924e-002, 3.38043049e-002, -1.43442964e-002, + 8.91780257e-002, 4.37856540e-002, 2.59326071e-001, + -3.50530520e-002, 3.58681142e-001, 1.75620034e-001, + -1.61552086e-001, -1.20382085e-002, 2.56343722e-001, + 1.74750209e-001, -5.76816164e-002, -3.54665564e-003, + 9.43849906e-002, 4.43255194e-002, 1.86320650e-003, + -1.24557980e-003, 9.89352819e-003, 8.42454750e-003, + 4.10072319e-002, -4.88180593e-002, 6.44139275e-002, + 7.26546496e-002, -2.04384066e-002, -3.88097316e-002, + 5.01644760e-002, 6.58384487e-002, -2.53244070e-003, + -2.64367089e-004, 9.26064979e-003, 7.61232525e-003, + 2.44193990e-003, -1.92455409e-004, 5.79185737e-003, + 3.01145087e-003, -2.09538881e-002, 1.79365892e-002, + 6.93018809e-002, 3.01097184e-002, -1.21124340e-002, + 8.56109057e-003, 3.01664378e-002, 2.73285154e-002, + 1.84875520e-004, 4.39875148e-004, 3.29409167e-003, + 3.42154386e-003, 2.97670402e-002, -8.98429542e-004, + 5.02393432e-002, 2.00085435e-002, -4.79674861e-002, + 8.59869942e-002, 5.10316610e-001, 1.65427729e-001, + -2.50242427e-002, 2.84421712e-001, 1.82070196e-001, + 3.14003468e-001, -1.88814122e-002, 2.92366557e-002, + 3.17081995e-002, 3.80588844e-002, 2.91955341e-002, + -3.62924970e-004, 4.81902026e-002, 2.18803324e-002, + 7.95612857e-002, -1.56995326e-001, 3.56884331e-001, + 2.22633451e-001, -2.21029893e-002, -1.60291702e-001, + 1.63175881e-001, 2.50164002e-001, -2.63939146e-002, + -1.85395740e-002, 3.46446671e-002, 3.34456973e-002, + 1.35740556e-003, -3.17673723e-004, 5.01369685e-003, + 3.44949146e-003, 4.44236328e-004, -1.80099141e-002, + 3.94029133e-002, 3.52337174e-002, -3.03288642e-003, + -1.70861781e-002, 2.39271540e-002, 3.62734348e-002, + -3.50351358e-004, -5.14473533e-004, 3.22293607e-003, + 4.06442396e-003, 1.74086087e-003, 2.10487843e-003, + 6.43465342e-003, 4.60413517e-003, 3.33201811e-002, + 3.83582786e-002, 4.45931628e-002, 4.84145135e-002, + -1.26975579e-002, 3.03558912e-002, 9.10795331e-002, + 4.26852815e-002, -2.12124754e-002, -2.25826123e-004, + 2.81452686e-002, 4.79766307e-003, 3.96316685e-002, + 1.93895970e-003, 5.79160117e-002, 3.81590575e-002, + 2.83649981e-001, 1.78542733e-001, 3.04909468e-001, + 2.33015269e-001, -2.20180109e-001, 5.81068248e-002, + 3.94886792e-001, 1.39802098e-001, -1.77894801e-001, + 2.67717596e-002, 2.13060617e-001, 3.84483188e-002, + 5.09302169e-002, 2.82108616e-002, 6.64171875e-002, + 5.66018447e-002, 1.43868938e-001, -8.58105905e-003, + 2.16344699e-001, 2.02602074e-001, -1.19682617e-001, + -6.81871921e-003, 2.31623545e-001, 1.49554595e-001, + -1.32345274e-001, 7.59607032e-002, 1.69976875e-001, + 8.35645199e-002, 2.81291734e-003, -5.60370181e-003, + 9.85210575e-003, 1.32469442e-002, 2.24379860e-002, + -7.62686655e-002, 5.77503964e-002, 1.16357170e-001, + 2.44655646e-002, -4.30439599e-002, 4.92986329e-002, + 6.66027218e-002, -4.45180293e-003, 2.68664188e-003, + 9.46549885e-003, 6.78850431e-003, 4.76267375e-003, + -2.43157591e-003, 6.76602917e-003, 5.50673064e-003, + 3.49725522e-002, -9.45124105e-002, 7.78127462e-002, + 1.07648097e-001, -5.24548143e-002, -1.04286827e-001, + 7.74367452e-002, 1.18334576e-001, -2.52487021e-003, + -8.84128548e-003, 5.73958363e-003, 1.21014826e-002, + -2.47942191e-003, -1.72658991e-002, 2.17104536e-002, + 3.45880650e-002, -8.22033361e-003, -1.79885760e-001, + 1.46344155e-001, 3.11188877e-001, 6.47725537e-003, + -2.82933321e-002, 1.58741400e-001, 2.75050312e-001, + 7.33831711e-003, 7.86926784e-003, 2.37514377e-002, + 3.83198410e-002, -2.01576273e-003, 4.14689118e-003, + 1.82863064e-002, 2.75298115e-002, 1.06794544e-001, + 1.45601645e-001, 1.89364403e-001, 2.63394624e-001, + 1.04108363e-001, 2.63331681e-001, 3.32486629e-001, + 3.91566873e-001, 1.90675557e-002, 7.22771883e-002, + 5.42027168e-002, 9.22736749e-002, 8.40551686e-004, + 2.76328437e-003, 3.81199853e-003, 4.36198106e-003, + 7.62141943e-002, 5.11805303e-002, 8.77551138e-002, + 6.57824948e-002, -3.40026175e-003, 6.28068671e-002, + 1.05400667e-001, 8.19263682e-002, -3.28511451e-005, + 2.36160029e-003, 1.22520011e-002, 9.37700924e-003, + -1.34862692e-003, 3.45295790e-004, 8.10280535e-003, + 5.27992612e-003, -2.93277260e-002, -3.21672000e-002, + 6.55033290e-002, 4.81707044e-002, 2.65089814e-002, + -2.95173340e-002, 4.83318344e-002, 4.75644059e-002, + 8.11143313e-003, 1.14454294e-003, 1.26632284e-002, + 5.71653061e-003, -3.30766365e-002, -1.62088219e-002, + 6.74201027e-002, 3.60259116e-002, -1.46192908e-001, + -6.54312298e-002, 4.28320944e-001, 1.86237127e-001, + 1.85812816e-001, -1.22226169e-002, 2.99338967e-001, + 1.63204491e-001, 9.84954163e-002, 9.05199628e-003, + 1.28436074e-001, 3.38679962e-002, -4.35395613e-002, + -9.85285453e-003, 6.76977858e-002, 3.55215445e-002, + -9.98639911e-002, 7.30782747e-003, 2.94003218e-001, + 1.90815881e-001, 2.33433932e-001, -3.03077493e-002, + 3.60501230e-001, 1.90961033e-001, 9.64143202e-002, + 3.50253657e-003, 1.28442749e-001, 3.86247225e-002, + -3.51797394e-003, -4.28458559e-004, 8.88364110e-003, + 4.88780299e-003, -1.10449903e-002, 1.97714083e-002, + 4.29308526e-002, 3.76972370e-002, 3.14412825e-002, + 2.28237044e-002, 5.99124022e-002, 3.99299078e-002, + 7.69410562e-003, -2.00457592e-003, 1.39758866e-002, + 5.69211785e-003, 4.75884927e-003, -1.13463355e-003, + 7.35423993e-003, 4.24194010e-003, 1.26330303e-002, + 3.56916455e-003, 2.57436559e-002, 1.71126109e-002, + -1.90759788e-003, 4.86451387e-003, 2.76504811e-002, + 1.56348851e-002, -1.94615722e-002, -2.56011263e-003, + 2.27923952e-002, 5.37089584e-003, 5.10844402e-002, + -1.09267943e-002, 6.62183687e-002, 2.34373566e-002, + 1.25229880e-001, -1.67210605e-002, 2.02890143e-001, + 9.93153080e-002, -1.71233173e-002, 2.74183112e-003, + 2.13544518e-001, 9.87389982e-002, -1.96619824e-001, + -2.22825129e-002, 2.42035478e-001, 3.98514718e-002, + 5.12014776e-002, -1.74384415e-002, 6.78889081e-002, + 3.84422801e-002, 9.88085046e-002, -2.42248490e-001, + 2.87722319e-001, 3.08648705e-001, 3.03351339e-002, + -1.55386880e-001, 3.93110901e-001, 2.19698980e-001, + -1.93621665e-001, -9.56698880e-003, 2.48706535e-001, + 3.36209089e-002, 9.86593950e-005, -4.61276062e-003, + 6.55496959e-003, 9.03705042e-003, -4.58396738e-003, + -7.92407319e-002, 6.13561608e-002, 1.02737777e-001, + 4.39756885e-002, -8.24455246e-002, 9.71775949e-002, + 9.80468839e-002, -1.55990878e-002, -1.59507629e-003, + 2.31970344e-002, 8.26739427e-003, -4.32869792e-003, + 3.83659522e-003, 9.87992715e-003, 7.52601307e-003, + -3.14193331e-002, -1.46670034e-002, 4.53598574e-002, + 3.31311151e-002, 3.38886376e-003, -1.71365738e-002, + 2.08889935e-002, 2.78895255e-002, 1.47538679e-003, + -1.08235283e-003, 4.49589221e-003, 3.82469525e-003, + -6.80902824e-002, -2.52992939e-002, 8.64792019e-002, + 5.44143915e-002, -1.71241164e-001, -7.33570084e-002, + 2.30297163e-001, 1.50433317e-001, 3.54716964e-002, + -1.94128081e-002, 9.53393281e-002, 9.65049565e-002, + 1.39784086e-002, -5.47042582e-003, 2.61925329e-002, + 2.02020034e-002, -5.53396232e-002, 4.88188267e-002, + 7.74982646e-002, 7.55191222e-002, -1.96054652e-001, + 4.30493861e-001, 2.66480088e-001, 4.93275493e-001, + -2.82646529e-002, 1.62614211e-001, 1.24890365e-001, + 2.31150240e-001, 1.13564031e-002, 1.06157325e-002, + 2.36350596e-002, 2.82927826e-002, 2.43831519e-003, + 2.96040718e-003, 7.13093253e-003, 1.12135168e-002, + -2.14938223e-002, 8.44228342e-002, 5.20127565e-002, + 1.27543271e-001, -4.00785878e-002, 1.48950934e-001, + 5.65044247e-002, 1.75807118e-001, -4.40494157e-003, + 1.26206456e-002, 7.67016085e-003, 1.54020935e-002, + -1.01818633e-003, 5.10009821e-004, 4.69575590e-003, + 2.06609420e-003, -3.64657827e-002, -1.54589200e-002, + 6.23908937e-002, 2.58709267e-002, 2.76372712e-002, + -9.38500743e-003, 4.78669070e-002, 2.67200563e-002, + 1.57873589e-003, 9.90386354e-004, 5.58040617e-003, + 3.56196403e-003, -1.70223713e-002, -1.73824886e-003, + 3.91931385e-002, 1.47038959e-002, -2.28044003e-001, + -5.95516302e-002, 4.71014172e-001, 1.48030326e-001, + 2.13917196e-001, -1.78244745e-003, 3.02497178e-001, + 1.38412267e-001, 2.09475532e-002, -1.35384779e-003, + 4.44230139e-002, 2.23051310e-002, -3.03374510e-002, + -3.41265905e-003, 4.79463823e-002, 1.66503824e-002, + -7.59960413e-002, 4.71530184e-002, 5.04686654e-001, + 1.51131496e-001, 1.17853910e-001, 5.99650256e-002, + 2.50344962e-001, 1.45309478e-001, 2.35589258e-002, + -1.70191473e-004, 4.39609736e-002, 2.22499929e-002, + -4.81144199e-003, -1.24858099e-003, 7.49635883e-003, + 2.89938110e-003, 8.98780941e-004, 1.59622319e-002, + 6.23695552e-002, 2.88896393e-002, 1.13922525e-002, + 1.30928447e-002, 3.96658964e-002, 2.68502552e-002, + 1.42455194e-003, 7.48928505e-005, 5.54292835e-003, + 3.30723356e-003, -1.99135183e-003, -2.91516930e-002, + 9.35478322e-003, 3.56892161e-002, 2.78464295e-002, + -2.95861542e-001, 4.84714955e-002, 3.35765690e-001, + -2.15529688e-002, -2.71628708e-001, 6.16846569e-002, + 3.34282637e-001, -3.42834229e-003, -1.94667447e-002, + 9.72766336e-003, 3.60523872e-002, -6.40760362e-002, + 1.20691294e-002, 9.50896665e-002, 5.10741286e-002, + -6.16372637e-002, 5.40885469e-003, 1.51007459e-001, + 2.83815771e-001, 2.51552649e-002, -5.87099604e-002, + 1.34575725e-001, 2.59947151e-001, 1.73454117e-002, + -2.94607468e-002, 2.92706247e-002, 6.58893958e-002, + -1.17937267e-001, 4.55250591e-002, 1.32896215e-001, + 9.51755568e-002, -1.15133107e-001, 1.63633153e-001, + 2.01125726e-001, 2.83465773e-001, 2.12552561e-003, + 8.90538022e-002, 1.11582927e-001, 1.60126507e-001, + -3.77685321e-003, 8.85276869e-003, 2.57821325e-002, + 2.53912248e-002, -1.00254072e-002, 4.11357352e-004, + 1.26575455e-002, 1.13239381e-002, -3.16801630e-002, + 2.31894571e-002, 4.06656936e-002, 4.55900133e-002, + -1.06343552e-002, 9.26025864e-003, 1.98788829e-002, + 2.49065291e-002, -2.62894406e-004, 3.44482047e-004, + 2.89183669e-003, 2.45490135e-003, -4.09084460e-004, + -4.07697586e-003, 9.24574491e-003, 1.31581882e-002, + -3.83171141e-002, -1.00541897e-001, 6.41818494e-002, + 1.32579058e-001, -4.53954376e-003, -5.73748574e-002, + 4.48365360e-002, 8.41871798e-002, 1.20778964e-003, + -1.41595933e-003, 5.55447768e-003, 7.71318329e-003, + -7.18145072e-002, 1.21264504e-002, 9.25416797e-002, + 6.54275715e-002, -2.21284628e-001, 6.75177723e-002, + 3.00246030e-001, 3.61931086e-001, 1.09772407e-001, + -1.25457803e-002, 2.07248241e-001, 2.04877034e-001, + 2.60304380e-002, -1.43883880e-002, 4.10668738e-002, + 4.22195494e-002, -6.95980489e-002, 1.05342874e-002, + 8.68378282e-002, 5.14513105e-002, -1.50644317e-001, + 1.61415681e-001, 3.16269010e-001, 3.00638258e-001, + -6.93799853e-002, 1.70005500e-001, 2.08569229e-001, + 2.52459168e-001, 2.26058066e-002, 8.74301791e-003, + 3.67155150e-002, 3.72057855e-002, -3.83469113e-003, + 3.20990017e-004, 8.99770018e-003, 6.58165477e-003, + -1.48384552e-002, 4.22370583e-002, 4.98291738e-002, + 6.09592833e-002, -1.89638864e-002, 3.80522013e-002, + 4.84936275e-002, 5.62159494e-002, 4.99896632e-005, + 2.33597704e-003, 5.49103506e-003, 6.12294907e-003, + -7.71824329e-004, 5.82240405e-004, 6.13551307e-003, + 2.93014618e-003, -1.61223263e-002, -1.37084275e-002, + 7.41625279e-002, 3.64944525e-002, 3.90502089e-003, + -1.14151565e-002, 5.65126166e-002, 4.07396220e-002, + -1.50810624e-003, -5.38130000e-004, 6.20542048e-003, + 4.78202756e-003, -1.43761290e-002, -3.86561849e-003, + 4.99169640e-002, 1.84314623e-002, -1.44817621e-001, + -1.69265717e-002, 5.18385947e-001, 1.75098211e-001, + -7.84544200e-002, -1.30449951e-001, 3.48768413e-001, + 2.32900068e-001, 1.42285246e-002, -1.34077584e-002, + 4.36089262e-002, 3.07046901e-002, -3.13071497e-002, + -1.29738208e-002, 6.19351901e-002, 2.52215546e-002, + -1.20995902e-001, -6.27626181e-002, 3.56413096e-001, + 1.95494592e-001, -6.34026751e-002, 3.64647470e-002, + 2.46092275e-001, 1.84784800e-001, 1.56363416e-002, + 4.71968250e-003, 4.04297672e-002, 2.82372013e-002, + -4.81332559e-003, -1.09081960e-003, 8.63374490e-003, + 4.19476442e-003, -7.21734250e-003, 1.26541238e-002, + 4.22949679e-002, 3.78860906e-002, -9.10237606e-004, + 1.19231520e-002, 3.53859253e-002, 4.09455784e-002, + -1.11077337e-004, -3.27217422e-004, 4.84320149e-003, + 4.75737592e-003, 9.63984523e-004, -5.79284504e-003, + 4.88267792e-003, 8.50282330e-003, 1.55060273e-002, + -7.06099197e-002, 3.73208970e-002, 8.26703757e-002, + 1.63667426e-002, -4.83516902e-002, 3.95947620e-002, + 6.96052611e-002, 2.13222243e-004, -2.35975647e-004, + 5.78866107e-003, 6.10255450e-003, -2.69379821e-002, + 3.11622396e-003, 3.74095067e-002, 4.39261347e-002, + -2.70618871e-003, -4.74660620e-002, 1.52776837e-001, + 2.85112023e-001, 1.60932884e-001, -2.31426045e-001, + 2.59831578e-001, 3.51418406e-001, 5.08670695e-002, + -3.81588228e-002, 6.51163459e-002, 5.63422404e-002, + -1.82956457e-002, 3.82069908e-002, 3.55954915e-002, + 4.86532152e-002, -7.98544586e-002, 3.19400400e-001, + 1.83370441e-001, 3.52430850e-001, -9.67199057e-002, + 1.64156988e-001, 2.48546436e-001, 2.35393465e-001, + 5.11071905e-002, -6.46500941e-003, 6.18662089e-002, + 3.68976481e-002, 1.00248680e-003, 1.97886460e-004, + 5.05011017e-003, 5.36689814e-003, -1.08008357e-002, + 1.67091358e-002, 3.32958773e-002, 4.16252166e-002, + -2.43683532e-002, 3.59370373e-002, 4.37936001e-002, + 4.88570109e-002, 1.72213872e-003, 2.76342337e-003, + 6.76896656e-003, 5.92192821e-003, 9.91710927e-004, + 1.10953534e-003, 4.47873166e-003, 5.38565591e-003, + 5.29420003e-003, 2.62925420e-002, 3.11920512e-002, + 4.11145948e-002, -4.65577748e-003, 2.50468627e-002, + 2.79572122e-002, 3.91852669e-002, -1.62782974e-003, + 4.28021245e-004, 4.65683034e-003, 4.75305784e-003, + 4.11563702e-002, -4.75057820e-003, 5.09294048e-002, + 3.81671079e-002, -7.92466197e-003, 1.16040997e-001, + 2.34972462e-001, 2.32842669e-001, -1.07488990e-001, + -3.70125636e-003, 2.09116906e-001, 2.04548001e-001, + -2.32850872e-002, 5.15305728e-004, 3.73538174e-002, + 3.12812813e-002, 2.44310871e-002, -3.90146002e-002, + 4.19321582e-002, 5.24927340e-002, 2.86414772e-001, + -2.78357565e-001, 3.69032323e-001, 3.75509679e-001, + -1.32747337e-001, 1.02613889e-001, 2.30477691e-001, + 2.92335033e-001, -2.79293805e-002, 6.80394284e-003, + 4.15258557e-002, 3.39747034e-002, -1.23533315e-003, + 1.41144695e-003, 4.25563473e-003, 4.28238558e-003, + 3.82743739e-002, -2.25123987e-002, 5.18439487e-002, + 4.34742048e-002, 8.42247251e-003, -4.71044704e-002, + 4.27491404e-002, 5.74363060e-002, -1.76996342e-003, + -1.70387060e-003, 5.41298650e-003, 4.84407833e-003, + 1.18921197e-003, 8.03085219e-004, 4.92508709e-003, + 4.23768815e-003, -4.44024988e-002, -3.22775468e-002, + 5.71374632e-002, 4.61636372e-002, 3.57143767e-003, + -3.58511247e-002, 4.88371402e-002, 4.83069867e-002, + 3.63853038e-003, 1.60450768e-003, 6.42674137e-003, + 5.11125894e-003, -2.97877192e-002, -3.45042162e-002, + 4.75512855e-002, 4.82439660e-002, -2.62141317e-001, + -1.93007514e-001, 3.35654289e-001, 3.12967867e-001, + 2.75472969e-001, 1.00610740e-001, 3.26298714e-001, + 2.44420946e-001, 3.00210435e-002, 9.73101123e-004, + 4.47108001e-002, 3.59692164e-002, -4.36109379e-002, + -5.82592189e-003, 5.32487966e-002, 4.23397683e-002, + 5.17870896e-002, 1.46337375e-001, 2.18458831e-001, + 2.29019761e-001, 1.70835674e-001, 1.00330405e-001, + 2.31804430e-001, 2.06157833e-001, 2.47918610e-002, + 2.36964202e-003, 3.87800075e-002, 3.15889865e-002, + -1.18779764e-003, 1.48646859e-003, 5.12089254e-003, + 4.98089381e-003, 9.94762592e-003, 3.06941476e-002, + 3.37069109e-002, 4.13827933e-002, 1.07594375e-002, + 2.30879392e-002, 3.14994156e-002, 3.57699879e-002, + 8.12507351e-004, 2.15222128e-004, 4.58039949e-003, + 4.31003701e-003, 5.72152948e-003, -3.29974946e-003, + 1.53530119e-002, 8.63438658e-003, 3.99812534e-002, + 2.41139289e-002, 5.51103912e-002, 4.62612249e-002, + 7.92269688e-003, 1.46881370e-002, 2.35587172e-002, + 2.78917234e-002, -2.71555898e-003, 5.61527733e-004, + 4.85743303e-003, 4.54851007e-003, 1.10344090e-001, + 3.23484875e-002, 1.41834319e-001, 5.94594702e-002, + 1.47700384e-001, 1.15724422e-001, 2.24014074e-001, + 1.79204732e-001, -2.57454440e-002, 7.51721859e-003, + 1.15406327e-001, 1.08644918e-001, -3.91388647e-002, + -2.24339329e-002, 5.18556722e-002, 3.74825373e-002, + 8.57920721e-002, -1.20337829e-002, 1.12677738e-001, + 6.32452369e-002, 1.23117588e-001, -1.99011356e-001, + 2.19603628e-001, 2.61282206e-001, -2.96416163e-001, + -2.80424953e-001, 3.74209166e-001, 3.37881148e-001, + -2.19310056e-002, -7.00626820e-002, 7.00021833e-002, + 8.72031301e-002, 2.83091771e-003, -1.01395918e-003, + 1.11695016e-002, 7.81765208e-003, 2.50462927e-002, + -5.58367595e-002, 7.12842047e-002, 8.67249668e-002, + -5.45785800e-002, -5.88398352e-002, 8.04548115e-002, + 8.50546360e-002, 2.39484711e-003, 4.82954812e-004, + 8.81364290e-003, 9.62932687e-003, -9.11710318e-004, + -1.21381355e-003, 5.08051366e-003, 5.73022803e-003, + 1.79700088e-002, -3.62003446e-002, 3.98952924e-002, + 5.12947887e-002, 3.97735983e-002, -2.05916557e-002, + 5.88893183e-002, 4.93196473e-002, 1.25685323e-003, + 2.55843694e-003, 5.78517281e-003, 6.44517830e-003, + -1.64405368e-002, 6.95594959e-003, 3.45546044e-002, + 3.23686376e-002, 2.03613024e-002, 1.04416303e-001, + 1.86022863e-001, 2.42648438e-001, 1.93231434e-001, + -1.56614482e-001, 3.50618213e-001, 2.98841089e-001, + 4.31124121e-002, -3.34894396e-002, 5.95759004e-002, + 5.51513322e-002, -1.20637584e-002, 2.67147762e-003, + 3.34946252e-002, 4.81774397e-002, -6.49641035e-003, + -4.13092348e-004, 1.62827820e-001, 3.66396755e-001, + 1.22596279e-001, 1.70844302e-001, 2.61772364e-001, + 3.84056419e-001, 4.63911816e-002, 2.26969663e-002, + 5.93108572e-002, 6.07941225e-002, 1.32592744e-003, + 3.69202951e-003, 5.33902505e-003, 7.53941154e-003, + 1.31486226e-002, 4.99192551e-002, 3.71339731e-002, + 6.85912967e-002, 2.37686355e-002, 3.91728878e-002, + 4.02738601e-002, 6.20657429e-002, 9.85423336e-004, + 1.14950945e-003, 4.44103964e-003, 5.54118492e-003, + 1.27186693e-004, -8.72454711e-006, 2.28019501e-003, + 1.77230663e-003, -5.16927335e-004, 3.23122717e-003, + 1.38080874e-002, 1.22169862e-002, -1.21239042e-002, + 5.62007725e-003, 2.46085823e-002, 1.72696058e-002, + -1.25031630e-002, -2.76528462e-003, 1.62749011e-002, + 5.38343471e-003, 5.67435240e-003, 4.09376080e-004, + 1.63128171e-002, 1.43620232e-002, 9.92179033e-004, + 1.31636802e-002, 7.81255886e-002, 7.80217871e-002, + -1.24732934e-001, -2.77080983e-002, 1.88626230e-001, + 1.14496633e-001, -1.34904489e-001, -4.56465781e-002, + 1.60025746e-001, 5.95668778e-002, 6.17742771e-003, + -2.13569086e-002, 2.02966575e-002, 3.22119780e-002, + 2.18098168e-003, -1.56634286e-001, 1.11254148e-001, + 2.15527371e-001, -3.65352184e-001, -2.88371146e-001, + 4.25460249e-001, 3.46150100e-001, -1.17214248e-001, + -4.06603515e-002, 1.54158682e-001, 6.69434667e-002, + -2.77499482e-003, -1.64732635e-002, 5.72401052e-003, + 2.23144740e-002, -1.71263255e-002, -1.62101641e-001, + 4.33162488e-002, 1.93076953e-001, -3.38115282e-002, + -1.40637308e-001, 6.02002516e-002, 1.69924513e-001, + -2.45325849e-003, -3.41204088e-003, 9.77481436e-003, + 1.03651704e-002, -7.26740528e-003, -3.58593045e-003, + 1.18726557e-002, 7.23145530e-003, 2.41286624e-002, + -7.48852417e-002, 5.56551144e-002, 9.42301899e-002, + 1.08347111e-003, -9.51273963e-002, 5.91545030e-002, + 1.15508899e-001, 6.77875651e-004, -4.28714138e-003, + 9.48405638e-003, 8.73037428e-003, -9.63879228e-002, + -6.59124786e-003, 1.17428191e-001, 3.37394774e-002, + 1.29955605e-001, -2.12800931e-002, 3.17641914e-001, + 2.91659325e-001, 2.24857833e-002, 2.97256336e-002, + 3.44558090e-001, 2.99134761e-001, 4.08593863e-002, + -1.22044999e-002, 6.53255656e-002, 4.93306071e-002, + -9.68516842e-002, -8.34284257e-003, 1.19033717e-001, + 2.76494548e-002, 1.38038889e-001, -5.97001947e-002, + 3.02343339e-001, 2.40932107e-001, 1.10745236e-001, + 2.59553902e-002, 2.45675191e-001, 2.31060520e-001, + 2.32428815e-002, 4.86940262e-004, 4.61277775e-002, + 4.46506180e-002, -8.24036635e-003, 5.70588745e-004, + 1.36376088e-002, 4.15120693e-003, 2.01220885e-002, + 2.61301808e-002, 4.87105362e-002, 4.35289256e-002, + 2.52523422e-002, 2.91649234e-002, 4.80079353e-002, + 5.43023497e-002, -4.31194319e-004, 3.09137511e-003, + 6.26415526e-003, 8.02386459e-003, 4.91960626e-003, + -2.12092209e-003, 1.13886958e-002, 7.44185410e-003, + 6.41784966e-002, 2.26504356e-002, 7.69353658e-002, + 4.27838862e-002, 5.54048223e-004, 1.22083137e-002, + 2.36831307e-002, 2.22725999e-002, -1.04391074e-003, + 5.90021722e-004, 3.37421009e-003, 2.88324454e-003, + 8.88686851e-002, 1.72510482e-002, 1.11976147e-001, + 5.10826856e-002, 3.12906176e-001, 1.11723758e-001, + 4.03347999e-001, 1.83425307e-001, -1.61819290e-002, + -8.00883677e-003, 1.02687269e-001, 8.15642476e-002, + -1.28538059e-002, 3.19579709e-003, 2.23942213e-002, + 1.42960204e-002, 1.05109259e-001, -9.98404063e-003, + 1.19465239e-001, 6.21911921e-002, 2.16711104e-001, + -3.29144150e-001, 3.19124788e-001, 3.95830512e-001, + 4.66456152e-002, -5.35510555e-002, 1.37946129e-001, + 1.21883325e-001, -9.01449006e-003, -1.56820740e-003, + 1.93936899e-002, 1.49162253e-002, 5.49409364e-004, + -1.93613500e-003, 7.78739294e-003, 7.49731064e-003, + 5.93920201e-002, -5.89559823e-002, 7.82636553e-002, + 8.07761699e-002, 4.94143702e-002, -5.17975800e-002, + 6.13793395e-002, 6.39493912e-002, 3.06129659e-004, + -1.90572673e-003, 3.34855379e-003, 4.25321748e-003, + 4.14586905e-003, -2.15830325e-004, 5.96309919e-003, + 5.15014306e-003, -1.62897687e-002, 2.69058123e-002, + 3.48768160e-002, 3.97610962e-002, -2.51480862e-002, + 1.80179998e-002, 4.32830229e-002, 5.05530201e-002, + -6.11143885e-004, -1.74157831e-005, 4.53185290e-003, + 5.25088143e-003, 4.76863012e-002, -6.06824970e-003, + 6.77232891e-002, 3.34341750e-002, -1.94513369e-002, + 1.76196955e-002, 1.97374344e-001, 1.64042071e-001, + -1.96629077e-001, 4.05161716e-002, 3.01894277e-001, + 4.58897144e-001, -2.54150778e-002, 9.71975457e-003, + 4.37671654e-002, 4.78334539e-002, 3.04383244e-002, + -1.76682454e-002, 6.14769682e-002, 3.81665044e-002, + 7.81330094e-002, -2.11151928e-001, 2.35876933e-001, + 3.18331689e-001, -3.26546207e-002, 5.74125126e-002, + 2.32143015e-001, 3.58242154e-001, -4.60571274e-002, + 1.45525392e-002, 5.74037433e-002, 4.69065234e-002, + -1.39381923e-003, 1.17463336e-004, 5.72303543e-003, + 5.11422288e-003, 1.27401538e-002, -2.18839720e-002, + 3.52866128e-002, 4.85431403e-002, 1.18084615e-002, + -3.40429880e-002, 3.70427258e-002, 5.51990718e-002, + -1.52682688e-003, -1.53877761e-003, 4.64258576e-003, + 6.59513194e-003, 3.14834039e-003, 8.14557262e-003, + 7.27135269e-003, 1.20233791e-002, 9.00821574e-003, + 1.17878959e-001, 3.01428605e-002, 1.61247239e-001, + 1.32296036e-003, 1.12153023e-001, 2.64062211e-002, + 1.65703416e-001, 1.62248034e-004, 9.08811297e-003, + 5.02414349e-003, 1.90774836e-002, 5.72738908e-002, + -7.39885028e-003, 7.62105659e-002, 4.52032499e-002, + 1.46631941e-001, -1.30366340e-001, 2.40663394e-001, + 3.87438327e-001, 2.21429206e-002, 4.51709284e-003, + 1.35835201e-001, 2.48528406e-001, -1.73460487e-002, + 1.67886056e-002, 2.67657097e-002, 3.77208032e-002, + 4.91403565e-002, -7.00293668e-003, 6.56439960e-002, + 3.43977846e-002, 1.97104141e-001, 3.58753689e-002, + 2.85298645e-001, 3.36663157e-001, 1.82820801e-002, + -1.19011097e-001, 1.45363629e-001, 3.30358952e-001, + -7.31761707e-003, -1.81157161e-002, 2.53885835e-002, + 3.77679989e-002, 2.83774734e-003, -5.51424455e-004, + 8.25546589e-003, 5.98403625e-003, -6.24255091e-003, + -5.10095730e-002, 5.78164086e-002, 7.37923160e-002, + 1.47843175e-003, -6.00679964e-002, 4.16112095e-002, + 8.83620754e-002, 4.44008317e-003, -2.87137320e-003, + 6.61125267e-003, 8.64280108e-003, -1.17297715e-003, + -1.45118660e-003, 6.20078109e-003, 3.91866267e-003, + 9.40639675e-002, 4.20831554e-002, 1.02949075e-001, + 5.49624301e-002, 7.69771775e-003, 2.48063505e-002, + 3.20868939e-002, 3.44174504e-002, -8.42369569e-004, + 3.13420052e-004, 3.66113055e-003, 3.24203772e-003, + 3.79581153e-002, 2.00885199e-002, 6.77982569e-002, + 3.84937637e-002, 5.21571279e-001, 2.38172203e-001, + 5.48439860e-001, 2.66868472e-001, -4.57748659e-002, + 2.86270883e-002, 9.52256396e-002, 7.34859407e-002, + -1.62113868e-002, 5.54383406e-003, 2.67833397e-002, + 1.58567242e-002, 1.13128088e-001, 4.71736267e-002, + 1.23338588e-001, 6.03235066e-002, 1.72369912e-001, + 1.07287709e-002, 2.26895466e-001, 1.51522651e-001, + -2.88985521e-002, -3.10444590e-002, 7.90714100e-002, + 6.92945793e-002, -1.31597398e-002, -9.09362105e-004, + 2.41378229e-002, 1.40088433e-002, 8.55990220e-003, + 3.03837401e-003, 1.06725758e-002, 6.73867576e-003, + 1.23549532e-002, -1.66065842e-002, 2.52263062e-002, + 3.04246284e-002, 1.26531813e-003, -1.67009942e-002, + 1.80753656e-002, 2.46483125e-002, -7.43108802e-004, + -1.14959292e-003, 3.40870325e-003, 2.78511131e-003, + -1.20196017e-002, 7.09106505e-004, 1.55769689e-002, + 3.61757400e-003, -2.02922337e-002, -1.75283290e-002, + 5.56593947e-002, 2.75833197e-002, 5.55415452e-002, + -2.23492272e-002, 7.68521801e-002, 4.16082516e-002, + -3.75773432e-003, -1.33777596e-003, 8.45014304e-003, + 6.47046557e-003, -1.16903171e-001, 1.83656544e-003, + 1.39058560e-001, 2.46354584e-002, -2.19363511e-001, + -5.09362333e-002, 3.15806031e-001, 1.19500808e-001, + 1.52521774e-001, -2.46123865e-001, 2.44895488e-001, + 2.93502003e-001, 1.06246825e-002, -4.09191884e-002, + 4.06643450e-002, 5.83126694e-002, -1.22074686e-001, + -7.05565279e-003, 1.43628597e-001, 2.36293469e-002, + -1.87875211e-001, 4.37108390e-002, 2.98975080e-001, + 1.28931478e-001, 1.21572815e-001, 2.52035767e-001, + 2.05595836e-001, 2.99814969e-001, 1.52703160e-002, + 3.44310477e-002, 3.86621840e-002, 5.03433906e-002, + -1.36506017e-002, -1.48443028e-003, 1.77174639e-002, + 4.03770199e-003, -9.73554153e-004, 2.13259123e-002, + 5.56404144e-002, 3.25966366e-002, 4.23436351e-002, + 3.34243253e-002, 6.77175745e-002, 5.27229011e-002, + -2.77487841e-003, 2.19498016e-003, 7.15140114e-003, + 6.56306837e-003, 1.34410671e-004, 1.64499655e-002, + 4.19090781e-003, 2.52091475e-002, -5.82545623e-003, + 1.28788054e-001, 2.63748039e-002, 2.11293176e-001, + -8.56187136e-004, 1.04743332e-001, 2.61282455e-002, + 2.04690963e-001, -5.17555862e-004, 8.49393476e-003, + 4.25663078e-003, 2.52183937e-002, 2.34050043e-002, + 5.48164593e-003, 3.74192148e-002, 3.44791822e-002, + 1.71896555e-002, 8.92477557e-002, 9.66668278e-002, + 1.53380707e-001, -4.73476723e-002, 1.16194233e-001, + 9.77584794e-002, 1.91202804e-001, -2.57597659e-002, + 1.70368161e-002, 3.84038165e-002, 4.86507602e-002, + 8.47215764e-003, -5.93791790e-002, 5.41112721e-002, + 7.15952814e-002, 1.85095578e-001, -2.33301654e-001, + 2.48316050e-001, 2.94120222e-001, -2.76739508e-001, + -2.60231614e-001, 3.18681389e-001, 3.42605919e-001, + -1.95328463e-002, -7.79805556e-002, 5.33857271e-002, + 1.02474548e-001, -3.94486636e-003, -7.54225708e-004, + 9.31040011e-003, 7.80457119e-003, 4.56442423e-002, + -5.54100312e-002, 6.90153688e-002, 7.96524212e-002, + -3.61261331e-002, -2.68852711e-002, 6.55465126e-002, + 6.89273924e-002, -1.84021576e-003, 6.40186336e-005, + 6.35614293e-003, 6.61389204e-003, -1.30143133e-003, + 2.54510925e-003, 6.53148303e-003, 1.62102953e-002, + 1.64551176e-002, 6.81603253e-002, 4.49332222e-002, + 1.27745166e-001, 2.91505773e-002, 1.18380323e-001, + 4.21140492e-002, 1.66006714e-001, 7.55410176e-004, + 1.69656649e-002, 4.71303798e-003, 2.35054623e-002, + 3.44817787e-002, 6.22400343e-002, 4.57683802e-002, + 8.40884447e-002, 8.72064531e-002, 3.85684788e-001, + 1.57220483e-001, 4.60705459e-001, 3.80550846e-002, + 1.66860238e-001, 1.03713565e-001, 2.78680146e-001, + -1.05876802e-002, 1.28242616e-002, 2.04849448e-002, + 3.32116745e-002, 3.26590501e-002, -2.29069516e-002, + 4.59408388e-002, 5.41775562e-002, 4.77909446e-002, + -1.14343747e-001, 1.54609799e-001, 2.40499184e-001, + -7.60955503e-003, -8.20948184e-002, 1.03122599e-001, + 2.01560125e-001, -7.65755353e-003, -1.21942777e-002, + 1.85018014e-002, 3.42913121e-002, 9.78266122e-004, + -8.29388760e-003, 5.47792856e-003, 1.61848478e-002, + -1.08153541e-002, -1.37865961e-001, 5.35918102e-002, + 1.76562533e-001, 1.49060460e-002, -1.39977723e-001, + 4.95108403e-002, 1.75210208e-001, 1.46125501e-003, + -1.11821545e-002, 5.82258264e-003, 1.73453838e-002, + -2.33155722e-003, -7.78986374e-004, 7.19777588e-003, + 3.72230634e-003, 2.64774878e-002, -1.47577785e-002, + 6.42494932e-002, 3.57873403e-002, -3.30119557e-003, + -2.15085186e-002, 6.29343390e-002, 4.13894802e-002, + 2.06761621e-003, 6.28487498e-004, 4.93334560e-003, + 2.63890321e-003, -2.79782899e-002, -5.59677184e-003, + 5.25603183e-002, 2.30937190e-002, 1.75126433e-001, + -1.05714209e-001, 4.13554192e-001, 1.87306449e-001, + -3.33481580e-002, -9.25442725e-002, 5.77470183e-001, + 2.03202561e-001, 2.42739096e-002, -1.21376850e-002, + 4.35453132e-002, 2.55699810e-002, -1.48941763e-002, + 7.21396739e-003, 4.03475389e-002, 2.43883934e-002, + -7.56554585e-003, 1.04525834e-001, 1.97373107e-001, + 1.99026510e-001, 6.57298416e-002, 5.98370470e-002, + 2.36653239e-001, 2.04023927e-001, 2.12874152e-002, + -1.38284573e-002, 3.73149440e-002, 3.43601257e-002, + -9.68146720e-004, 3.98598699e-004, 4.80315601e-003, + 4.13468899e-003, 2.84541748e-003, 1.78378355e-002, + 3.30709368e-002, 3.85954268e-002, 4.02964652e-004, + 1.97904669e-002, 2.90558562e-002, 3.93125601e-002, + 7.26587023e-004, 1.23271043e-003, 4.01500659e-003, + 4.48359828e-003, 7.50464329e-004, 2.24117818e-003, + 3.87913687e-003, 6.39902242e-003, 2.38473574e-003, + 3.04043088e-002, 2.36730929e-002, 5.89518324e-002, + -4.64486470e-003, 2.54923571e-002, 2.46210955e-002, + 5.40269502e-002, -2.62174784e-004, 1.67913688e-003, + 3.16990702e-003, 5.50161954e-003, 2.25601140e-002, + -7.32300291e-003, 3.86476144e-002, 5.30682504e-002, + 2.27644369e-002, -3.54614519e-002, 1.82337567e-001, + 4.81197089e-001, -5.21164425e-002, 1.79409590e-002, + 1.60479322e-001, 3.88937771e-001, -1.62275583e-002, + 1.58993481e-003, 3.03340964e-002, 3.95686254e-002, + 1.19002173e-002, -1.92012824e-002, 3.60896103e-002, + 4.26079556e-002, 2.07371935e-001, -5.89284264e-002, + 2.75929600e-001, 3.52559924e-001, -1.16519578e-001, + 8.41485150e-003, 2.00968325e-001, 2.77339220e-001, + -1.48386983e-002, -7.79278111e-003, 3.02750077e-002, + 3.21614482e-002, -6.76233380e-004, 6.08983333e-004, + 3.98165826e-003, 4.51160502e-003, 1.81819089e-002, + -2.05755215e-002, 3.54565457e-002, 4.71466146e-002, + -1.50235859e-003, -2.91556753e-002, 2.99692899e-002, + 5.09882905e-002, -6.54059229e-004, -7.10124965e-004, + 3.81427421e-003, 4.20979504e-003, -4.91841184e-003, + -1.87745795e-003, 8.27672426e-003, 7.84526300e-003, + 2.23014341e-003, -7.83179849e-002, 3.77381630e-002, + 1.03750519e-001, -1.83309789e-003, -1.14446744e-001, + 2.83743180e-002, 1.41243830e-001, 2.69964570e-004, + -8.98812152e-003, 5.96565334e-003, 1.34852314e-002, + -7.79604316e-002, 1.87837631e-002, 9.16943848e-002, + 5.01100346e-002, -7.72255138e-002, 1.50209069e-001, + 1.94900200e-001, 3.31805259e-001, -3.41008157e-002, + 2.25346610e-001, 1.51692361e-001, 3.97963077e-001, + 2.09391322e-002, 1.67266261e-002, 4.18518521e-002, + 4.83844876e-002, -6.61831051e-002, 2.22105216e-002, + 8.76504555e-002, 5.37437312e-002, -6.06683418e-002, + 1.29410252e-001, 2.62842596e-001, 3.02639097e-001, + 2.01667808e-002, 9.97784808e-002, 2.20158055e-001, + 2.81862915e-001, 6.11494249e-003, 2.53867898e-002, + 3.72144915e-002, 4.68049608e-002, -1.97293819e-003, + -2.17387523e-003, 5.72506851e-003, 6.72116596e-003, + -2.01470889e-002, 3.30827311e-002, 5.26809730e-002, + 5.74348308e-002, -6.07565918e-004, 2.56680865e-002, + 3.06153167e-002, 4.94007207e-002, 1.41718413e-003, + 3.36669036e-003, 5.08494396e-003, 7.16210948e-003, + -3.64865898e-003, 1.79135372e-004, 7.84783158e-003, + 5.36978524e-003, -3.67412083e-002, -2.00653989e-002, + 4.99652289e-002, 4.16210368e-002, 1.75459404e-002, + -2.02116575e-002, 3.98996621e-002, 4.56640162e-002, + 6.28005993e-003, 5.12273109e-004, 9.98723228e-003, + 5.74387377e-003, -3.62507477e-002, -1.37023702e-002, + 5.84010892e-002, 3.94610427e-002, -2.61781603e-001, + -2.38020148e-004, 3.24246317e-001, 2.21755341e-001, + 1.77355602e-001, 6.44726604e-002, 2.43660152e-001, + 2.24946827e-001, 6.16523325e-002, 1.15570314e-004, + 8.70910063e-002, 3.64226140e-002, -3.59684043e-002, + 8.02152557e-004, 5.27877919e-002, 4.63989452e-002, + -1.21221818e-001, 1.47993371e-001, 2.36466378e-001, + 3.30398828e-001, 4.60396372e-002, 2.93641891e-002, + 1.89813390e-001, 2.62610137e-001, 4.81880046e-002, + -1.72771886e-002, 6.93210512e-002, 4.67685722e-002, + 1.33569085e-003, 8.60678870e-003, 8.26859847e-003, + 1.33798495e-002, 3.68200964e-003, 1.50160953e-001, + 5.63060939e-002, 1.79446533e-001, -5.15271612e-002, + 1.30464643e-001, 7.34591261e-002, 1.51276082e-001, + 2.13181064e-003, 7.70314783e-003, 8.92657321e-003, + 1.22100404e-002, 1.18732045e-003, 7.65733246e-004, + 5.85186575e-003, 4.65716328e-003, -4.18909453e-003, + 3.67063135e-002, 4.87794429e-002, 4.79075797e-002, + -2.78437417e-002, 2.07162760e-002, 4.26824614e-002, + 3.70518267e-002, -1.86808596e-004, -4.26368992e-004, + 3.89638194e-003, 3.45254852e-003, 3.16888541e-002, + 3.88002372e-003, 4.97809798e-002, 2.99168807e-002, + 6.21309578e-002, 6.12473078e-002, 3.64365995e-001, + 2.51158267e-001, -2.89238751e-001, 1.89972445e-001, + 3.59742641e-001, 2.71179944e-001, -2.26549767e-002, + 1.28677357e-002, 3.78450304e-002, 2.69357041e-002, + 2.92257704e-002, -7.51869893e-003, 4.39788997e-002, + 2.85392031e-002, 8.92219767e-002, -1.80165276e-001, + 2.21313193e-001, 2.42788374e-001, -1.51268423e-001, + -9.76980180e-002, 2.76334614e-001, 2.26032734e-001, + -3.51525359e-002, 4.20892262e-004, 4.59612794e-002, + 2.77766977e-002, 8.50461714e-004, -8.99970008e-004, + 4.57809819e-003, 4.03703889e-003, 5.96846221e-003, + -2.32962091e-002, 2.90357694e-002, 3.66356224e-002, + -8.82886350e-003, -2.57492978e-002, 3.20549682e-002, + 3.83790992e-002, -2.06946558e-003, -3.50945891e-004, + 4.83447500e-003, 4.07188106e-003, 3.94025585e-003, + -3.74669413e-004, 6.04484323e-003, 6.38121460e-003, + -3.97757962e-002, -3.15726735e-002, 5.85243627e-002, + 5.75922355e-002, -1.65693127e-002, -5.29180095e-002, + 5.38002588e-002, 6.34381101e-002, 3.68952076e-003, + -1.88516779e-003, 6.81232801e-003, 5.75521355e-003, + -1.69188827e-002, -6.85228184e-002, 3.94022875e-002, + 7.85503462e-002, -1.61301389e-001, -4.36454833e-001, + 2.34471262e-001, 4.94691163e-001, 1.57601133e-001, + -1.22095808e-001, 2.57962555e-001, 2.11394370e-001, + 4.86678891e-002, -6.46237191e-003, 6.08368926e-002, + 3.39575633e-002, -1.65934246e-002, 4.04428411e-003, + 2.81268917e-002, 2.89993789e-002, -2.33427039e-003, + 9.31551084e-002, 1.18815623e-001, 1.48872882e-001, + 1.98359951e-001, 7.65042827e-002, 2.33333409e-001, + 1.48453608e-001, 4.26839031e-002, 2.83619459e-003, + 5.74660040e-002, 3.17276604e-002, 1.33595109e-004, + 1.39951368e-003, 3.65513354e-003, 4.18334967e-003, + -2.88504711e-003, 1.77955404e-002, 2.54990105e-002, + 3.01294066e-002, 2.55902577e-002, 1.27715040e-002, + 3.81816663e-002, 2.90862806e-002, 3.26051842e-003, + -2.99101113e-004, 6.59214705e-003, 4.84864274e-003, + 1.41978753e-003, 1.97510730e-004, 4.44359658e-003, + 3.48245515e-003, 1.55904572e-002, 2.15105973e-002, + 3.70825194e-002, 3.63282040e-002, -4.31499770e-003, + 2.32386570e-002, 3.31078395e-002, 4.26009260e-002, + -1.44442078e-003, 7.10593245e-004, 5.19512454e-003, + 5.03425254e-003, 1.88857149e-002, -1.77745533e-003, + 3.88019271e-002, 2.40922496e-002, 1.79174826e-001, + 4.48936187e-002, 2.81453371e-001, 1.89224228e-001, + -8.21173489e-002, 1.29935099e-002, 2.46366337e-001, + 2.51994729e-001, -2.54593212e-002, -5.62938675e-003, + 4.60904539e-002, 3.55283841e-002, 1.70826670e-002, + -4.90109576e-003, 3.77143659e-002, 2.06562188e-002, + 2.49546841e-001, -4.54383716e-002, 3.47839683e-001, + 1.78325504e-001, -1.85107350e-001, -1.88971404e-002, + 4.53343660e-001, 2.99562395e-001, -1.49822915e-002, + -9.49839782e-003, 4.39223163e-002, 3.48730013e-002, + 1.30940462e-003, 2.52760598e-004, 4.74944664e-003, + 3.13538429e-003, 2.39964500e-002, -2.13064197e-002, + 4.46394049e-002, 3.59850451e-002, -1.87703148e-002, + -2.45611519e-002, 5.61842397e-002, 4.43073995e-002, + -5.17950393e-004, 2.83795147e-004, 5.32535138e-003, + 4.46322514e-003, -3.67312157e-003, -7.60574403e-005, + 7.17477407e-003, 2.49817967e-003, 1.89000014e-002, + -1.81849138e-003, 6.04680479e-002, 2.47969721e-002, + -1.17674908e-002, -7.63860065e-004, 4.27823700e-002, + 2.29421351e-002, 7.79252878e-005, 9.31390514e-006, + 5.09184971e-003, 3.04434216e-003, -3.25278305e-002, + 2.90132104e-003, 5.71906567e-002, 1.63739044e-002, + 1.51719898e-001, -1.06997211e-002, 5.15663266e-001, + 1.30116165e-001, -9.20621008e-002, -9.89184808e-003, + 3.25444251e-001, 1.18067190e-001, 4.17985301e-003, + 1.25314202e-003, 4.07654457e-002, 1.89517234e-002, + -2.13459712e-002, 6.67384919e-003, 5.60940206e-002, + 2.03114655e-002, 3.69206183e-002, 6.13168515e-002, + 5.12996614e-001, 1.73896343e-001, -3.68402340e-002, + -2.72160955e-003, 2.73212016e-001, 1.37997478e-001, + 3.97117017e-003, 3.62511753e-004, 3.90600562e-002, + 1.96656603e-002, -2.16359505e-004, -8.19059569e-005, + 6.32023206e-003, 3.45024653e-003, -8.06626212e-003, + 3.88182956e-003, 5.39551564e-002, 3.31015699e-002, + -3.74492910e-003, 2.81699654e-003, 3.50402333e-002, + 2.86348239e-002, 1.73209948e-004, -6.52550341e-007, + 4.55450267e-003, 3.24259163e-003, 2.49434891e-003, + -5.39243629e-004, 4.23545344e-003, 3.20127443e-003, + 1.06027396e-002, 6.10917108e-003, 3.65208648e-002, + 3.21512520e-002, -6.96552079e-003, 1.00239227e-002, + 3.09807695e-002, 3.35780084e-002, -2.89249525e-004, + 2.62062851e-004, 3.34707927e-003, 3.35824327e-003, + 2.17627976e-002, -1.04032857e-002, 3.14080007e-002, + 2.45893579e-002, 1.29577801e-001, -4.64301147e-002, + 2.78756529e-001, 1.88164815e-001, -9.95825827e-002, + -5.29473908e-002, 2.07312852e-001, 2.47182950e-001, + -8.55040736e-003, -9.24579613e-003, 3.05026844e-002, + 3.61233652e-002, 1.18430480e-002, 2.08588038e-003, + 2.89704334e-002, 2.14896705e-002, 2.54777074e-001, + 1.28250523e-002, 3.35876048e-001, 2.30023563e-001, + -7.69679919e-002, 8.83805379e-002, 1.95021868e-001, + 5.71902990e-001, -1.74674895e-002, 1.64946746e-002, + 3.53997797e-002, 6.62132427e-002, 6.89282140e-004, + 5.18717337e-004, 3.89178982e-003, 3.28795495e-003, + 2.01269519e-002, -1.59732122e-002, 4.34812978e-002, + 4.05005999e-002, -9.25200339e-003, -1.49755124e-002, + 3.53490300e-002, 4.61958535e-002, -6.88211119e-004, + -7.20071897e-004, 4.84027481e-003, 4.48046206e-003, + -1.11179112e-003, 2.45237653e-003, 6.88879332e-003, + 6.75582839e-003, -2.67655924e-002, 5.45321740e-002, + 6.38809204e-002, 7.02608451e-002, 2.41633430e-002, + 5.64922281e-002, 5.89427911e-002, 6.89941049e-002, + -7.35645602e-003, 7.70294864e-004, 1.25134587e-002, + 6.38121367e-003, 3.29120047e-002, 1.04398141e-002, + 5.09554744e-002, 3.95521410e-002, -2.79386081e-002, + 1.89436436e-001, 2.24758282e-001, 2.44640231e-001, + -3.86997312e-002, 1.57701761e-001, 2.84486920e-001, + 2.52663702e-001, -1.16993845e-001, -2.48841457e-002, + 1.32301673e-001, 4.57080752e-002, 3.11600398e-002, + 5.97739452e-003, 4.48898710e-002, 2.65854970e-002, + 5.42008057e-002, -7.63810880e-004, 1.55541927e-001, + 1.14749521e-001, -3.64028752e-001, -1.51221111e-001, + 4.33298796e-001, 2.25674912e-001, -7.93955922e-002, + -2.47079674e-002, 1.04524061e-001, 4.35902737e-002, + 2.00248626e-003, -6.58654782e-004, 4.58886940e-003, + 3.80632561e-003, 1.10130385e-003, -1.83117576e-002, + 3.06155737e-002, 2.95897163e-002, -7.72265419e-002, + -3.21330689e-002, 8.81182477e-002, 5.05396649e-002, + -3.13322945e-003, 1.83617545e-003, 9.61852726e-003, + 5.56910783e-003, 9.13706725e-004, -6.40166458e-003, + 4.71822545e-003, 1.06743798e-002, 3.00959242e-003, + -9.22912955e-002, 3.13251354e-002, 1.17893785e-001, + 2.45489795e-002, -8.13205242e-002, 4.90741022e-002, + 1.07957527e-001, 2.80404952e-003, 6.75891526e-004, + 7.58469757e-003, 6.39112433e-003, -1.83694866e-002, + -6.35738252e-003, 2.98497677e-002, 2.25333404e-002, + -3.00698448e-002, -2.60253474e-002, 1.05011530e-001, + 1.53355971e-001, 3.43222588e-001, -4.66869324e-002, + 4.82977659e-001, 1.45535275e-001, 3.84837091e-002, + 5.39036002e-003, 7.14373514e-002, 1.84410457e-002, + -1.79088041e-002, 4.93185828e-004, 2.91469041e-002, + 1.24418149e-002, -3.48930359e-002, -6.44662371e-003, + 1.02807812e-001, 7.66315609e-002, 3.58466148e-001, + 2.38946988e-003, 5.19783258e-001, 8.11385512e-002, + 3.37305889e-002, -1.59230793e-003, 6.95184544e-002, + 1.44266486e-002, -2.24622153e-003, 1.23444624e-004, + 4.21982678e-003, 2.32033944e-003, -4.87080729e-003, + 7.30465213e-003, 1.70273967e-002, 1.65178198e-002, + 5.18320389e-002, 8.97702016e-003, 7.34046474e-002, + 1.87111273e-002, 3.51888919e-003, -9.92342480e-004, + 9.59439576e-003, 2.89425650e-003, -5.63216442e-003, + 2.04323488e-003, 9.32397693e-003, 4.98143397e-003, + -3.05779241e-002, -2.91098356e-002, 4.93045710e-002, + 5.42449914e-002, 8.13977234e-003, -3.77751999e-002, + 3.24760340e-002, 6.03877604e-002, 7.92237988e-004, + -2.19364627e-003, 5.38194785e-003, 6.65593473e-003, + -7.27171972e-002, -5.08275721e-003, 8.79726186e-002, + 2.92562488e-002, -2.93569624e-001, 6.67999834e-002, + 3.51181269e-001, 3.56117606e-001, 1.27660111e-001, + 1.32147044e-001, 1.85326770e-001, 4.03047025e-001, + 2.81682238e-002, 1.22856619e-002, 4.32753786e-002, + 4.63096760e-002, -7.33460560e-002, -3.65217961e-003, + 8.45019445e-002, 2.86105387e-002, -1.62914157e-001, + 6.85278550e-002, 2.41208047e-001, 2.03275785e-001, + 8.66145715e-002, 5.74209951e-002, 1.64388686e-001, + 2.12089241e-001, 2.65413038e-002, 1.04090488e-002, + 4.13337126e-002, 3.72841358e-002, -5.85025130e-003, + 7.38210510e-004, 8.45078845e-003, 4.81624017e-003, + -1.24461334e-002, 4.29833792e-002, 3.72547396e-002, + 5.43817766e-002, 8.11573956e-003, 4.80955392e-002, + 3.25077809e-002, 6.03934526e-002, 3.76726639e-005, + 3.31738894e-003, 4.57146065e-003, 6.40926883e-003, + -5.60983364e-003, 2.00925744e-003, 1.35249272e-002, + 5.06134098e-003, -5.12224287e-002, -2.84946933e-002, + 1.00729778e-001, 5.91160841e-002, -1.98118910e-002, + -2.47577317e-002, 4.10197340e-002, 3.96770723e-002, + 5.21428185e-003, -3.28109745e-004, 1.05997864e-002, + 4.92375204e-003, -1.12461805e-001, -1.92105956e-002, + 1.33365899e-001, 4.06322591e-002, -2.15012789e-001, + -2.80148387e-001, 3.36258054e-001, 3.30601305e-001, + 2.15863530e-003, -5.62064014e-002, 1.46962285e-001, + 1.36582762e-001, 7.10860044e-002, 4.82389983e-003, + 9.35010836e-002, 3.07120122e-002, -1.26802862e-001, + -4.09821374e-003, 1.40749678e-001, 3.92769501e-002, + -4.81321178e-002, 2.03805014e-001, 2.16493070e-001, + 2.68000394e-001, 1.49956914e-002, 2.36668155e-001, + 1.63454309e-001, 2.78078109e-001, 6.71037436e-002, + 1.47500047e-002, 9.39728916e-002, 3.98815796e-002, + -8.43151659e-003, 2.97998544e-003, 1.35957813e-002, + 7.24974321e-003, 2.37959940e-002, 6.24877624e-002, + 6.64726719e-002, 7.91979656e-002, -1.77796260e-002, + 6.59509301e-002, 5.32273464e-002, 8.55309516e-002, + 1.52676855e-003, 3.86949279e-003, 8.77636671e-003, + 8.96560680e-003, 9.87497717e-003, -1.36469386e-003, + 1.78284440e-002, 5.57726854e-003, 2.71405987e-002, + 1.20574143e-002, 4.30051833e-002, 2.39298549e-002, + -1.45808095e-002, 2.03608088e-002, 3.38823199e-002, + 3.25157009e-002, 3.81857069e-004, 3.75626027e-004, + 8.93296208e-003, 5.19145094e-003, 1.04800865e-001, + -1.29784560e-002, 1.46145731e-001, 5.19228689e-002, + 1.78097934e-001, -1.14730664e-001, 2.69070506e-001, + 2.40138188e-001, -1.86336376e-002, -6.75824210e-002, + 1.41526356e-001, 2.31261462e-001, -2.01206524e-002, + 8.09950009e-003, 5.81396893e-002, 4.05617096e-002, + 7.84139410e-002, -3.67731787e-003, 1.22782163e-001, + 7.99466521e-002, 1.90023661e-001, -7.82767013e-002, + 3.57923836e-001, 3.52104306e-001, 7.87331760e-002, + -2.03682184e-002, 1.73083290e-001, 2.59228766e-001, + -1.70512255e-002, -4.67852876e-003, 4.01559807e-002, + 3.52006629e-002, 2.56402767e-003, -1.96489948e-003, + 9.32824239e-003, 1.64788552e-002, 1.43030146e-002, + -1.33963764e-001, 5.71478233e-002, 1.74329102e-001, + 1.85824335e-002, -1.48412690e-001, 4.14357968e-002, + 1.89350545e-001, 3.94192338e-003, -1.30676208e-002, + 7.32711377e-003, 1.93268806e-002, 2.76556442e-004, + -3.61341168e-003, 5.24652703e-003, 6.49969419e-003, + 1.18461074e-002, -3.94580252e-002, 3.36980447e-002, + 5.43810390e-002, 8.84901918e-003, -2.37374082e-002, + 2.82761827e-002, 4.23306562e-002, -5.24826115e-004, + -6.02129847e-004, 3.98259750e-003, 4.50738100e-003, + -4.08308059e-002, -1.56698108e-003, 5.31217717e-002, + 4.55582067e-002, 2.26500835e-002, -2.09255084e-001, + 2.17852175e-001, 3.39945525e-001, 1.63975760e-001, + -3.13885599e-001, 2.44544938e-001, 3.73071432e-001, + 2.59307008e-002, -3.12532261e-002, 4.18095700e-002, + 4.53325398e-002, -3.09141409e-002, 2.16293503e-002, + 4.92426157e-002, 4.16162051e-002, -1.92524523e-001, + 1.42888919e-001, 2.74732023e-001, 2.45920479e-001, + 7.74121657e-002, -1.49978325e-003, 1.94003105e-001, + 2.36758336e-001, 3.47569324e-002, -1.61381569e-002, + 4.58805449e-002, 4.14186157e-002, -5.65634517e-004, + -9.89682274e-004, 5.38604939e-003, 5.07680094e-003, + -2.39894222e-002, 2.22063847e-002, 4.29083928e-002, + 4.26381528e-002, -2.47296854e-003, 2.86274236e-002, + 3.36477049e-002, 4.29444388e-002, 1.35519681e-003, + 1.11392571e-003, 5.12818201e-003, 5.19749383e-003, + 1.64629088e-003, -9.38480534e-003, 6.96147699e-003, + 2.11874284e-002, -4.82031930e-004, -1.48007974e-001, + 4.18348014e-002, 2.33757541e-001, 1.54557563e-002, + -1.54307097e-001, 4.91860807e-002, 2.37028360e-001, + 3.00411484e-003, -7.03976629e-003, 8.91109463e-003, + 1.86351296e-002, -2.59815510e-002, -1.51742585e-002, + 4.92141619e-002, 4.51194569e-002, -1.68787569e-001, + -8.86592120e-002, 2.40848869e-001, 2.42227659e-001, + 2.75793850e-001, -9.69375819e-002, 3.37410390e-001, + 2.51982093e-001, 8.01013410e-002, -1.85150187e-002, + 1.01309888e-001, 5.40461242e-002, -2.15440392e-002, + 5.59841683e-005, 4.26494926e-002, 3.44100222e-002, + -1.16521433e-001, 6.35871142e-002, 2.04155624e-001, + 1.74970314e-001, 1.77401111e-001, 5.63835949e-002, + 2.47169197e-001, 1.68072507e-001, 6.85527176e-002, + -1.80316027e-002, 8.76215100e-002, 4.87841591e-002, + -1.28958863e-003, 2.77076266e-003, 6.09808601e-003, + 7.20193004e-003, -1.01684229e-002, 3.64678279e-002, + 2.97533572e-002, 5.36860526e-002, 1.52088031e-002, + 3.38656232e-002, 3.80792990e-002, 5.33976071e-002, + 4.86477651e-003, 1.26327225e-003, 8.92824307e-003, + 8.30965489e-003, -2.67459516e-004, 3.04392586e-003, + 5.54976519e-003, 1.16706574e-002, 2.18802486e-002, + 7.77656436e-002, 3.99984829e-002, 1.25773087e-001, + 1.35464827e-002, 9.29378942e-002, 3.31023671e-002, + 1.43704772e-001, -3.15261190e-004, 7.19192950e-003, + 5.14673255e-003, 1.48228770e-002, 3.55780311e-002, + 1.71085652e-002, 6.70908689e-002, 3.47563289e-002, + 2.19991535e-001, 1.25479624e-001, 2.81764030e-001, + 2.29247048e-001, 1.95646286e-003, -8.09937157e-003, + 1.67915002e-001, 1.91572815e-001, -2.74912938e-002, + -4.96994983e-003, 4.36998717e-002, 3.19761783e-002, + 5.40900119e-002, 2.42775725e-003, 7.08587170e-002, + 4.06177901e-002, 4.77029532e-002, -3.74409109e-002, + 2.66276121e-001, 1.83872461e-001, -1.33353308e-001, + -2.29954824e-001, 4.60932285e-001, 2.94707596e-001, + -8.06838926e-003, -3.59890573e-002, 6.01086877e-002, + 5.17259464e-002, 3.37483734e-003, -1.71671354e-003, + 7.14890799e-003, 7.34532764e-003, -1.87521824e-003, + -5.62387332e-002, 4.43892404e-002, 7.66281486e-002, + -2.75735259e-002, -3.80121581e-002, 5.95967695e-002, + 6.58756718e-002, 2.68907868e-003, -1.88308093e-003, + 7.27972854e-003, 8.73624720e-003, -1.55560247e-005, + -6.02673274e-004, 3.80799104e-003, 2.80174450e-003, + 3.84754501e-003, -1.46354707e-002, 2.40768790e-002, + 2.42457390e-002, 4.61907722e-002, -1.94696859e-002, + 5.71537055e-002, 3.22498567e-002, 3.36638046e-003, + 1.91552180e-003, 5.84996492e-003, 4.09778347e-003, + -6.10712776e-003, -1.51165237e-003, 2.67117061e-002, + 2.22498812e-002, -3.78498025e-002, -2.32646298e-002, + 1.34806335e-001, 1.19225785e-001, 3.92681926e-001, + -2.83958986e-002, 4.59770590e-001, 1.74532324e-001, + 2.43820418e-002, -7.16004847e-003, 3.49517949e-002, + 2.99156085e-002, -4.05543949e-003, 7.76756927e-003, + 2.54307352e-002, 3.15017216e-002, -2.40201429e-002, + 9.42004323e-002, 1.29108056e-001, 2.23287836e-001, + 2.06024483e-001, 6.71485290e-002, 2.74864703e-001, + 4.62534368e-001, 2.97666751e-002, -2.53698826e-002, + 4.17665951e-002, 1.06264114e-001, 1.22228160e-003, + 1.47006882e-003, 4.31830576e-003, 4.29997360e-003, + 8.15567002e-003, 2.40041167e-002, 3.59472185e-002, + 3.69494669e-002, 4.24004681e-002, 2.75447443e-002, + 5.46981245e-002, 4.51332591e-002, 3.68535315e-004, + 2.48218770e-003, 3.75940907e-003, 5.19724842e-003, + -1.97575577e-002, 4.71365114e-004, 2.22432055e-002, + 6.20893249e-003, -8.69370531e-003, -3.87955569e-002, + 3.93117964e-002, 6.34621084e-002, 1.08491637e-004, + -3.11224945e-002, 2.05930006e-002, 5.95620647e-002, + -4.11981127e-005, -1.13327336e-003, 4.51683020e-003, + 6.99322624e-003, -1.89599156e-001, 2.35819421e-003, + 2.07561940e-001, 3.01356670e-002, -1.07692182e-001, + -1.50575101e-001, 2.73875773e-001, 2.29183361e-001, + 4.97470647e-002, -2.04314813e-001, 1.03261992e-001, + 2.70723462e-001, 8.38981010e-003, -3.21825705e-002, + 2.36299131e-002, 4.18924987e-002, -1.57712758e-001, + 3.82768293e-003, 1.78719774e-001, 2.80579906e-002, + -3.31345111e-001, -1.59385744e-002, 4.10287559e-001, + 1.90761074e-001, 1.26150576e-002, -1.49381578e-001, + 1.17368244e-001, 2.62421340e-001, 1.60489213e-002, + -1.78551488e-002, 2.18375381e-002, 3.52173224e-002, + -1.32445535e-002, -2.00858735e-003, 1.85183007e-002, + 6.88977540e-003, -4.86274250e-002, 3.28524262e-002, + 5.95686212e-002, 4.92536463e-002, -8.81417841e-003, + 3.83048356e-002, 2.29568407e-002, 4.90171760e-002, + 1.53296266e-003, 2.35276157e-003, 3.24593973e-003, + 4.97597177e-003, 1.21036638e-003, 1.32715970e-003, + 4.37564822e-003, 4.47577750e-003, -1.29883019e-002, + 2.37159133e-002, 2.98142284e-002, 4.52913754e-002, + -4.14641760e-002, 2.05905363e-002, 5.73123433e-002, + 5.85190132e-002, -9.52254329e-003, -1.33363798e-003, + 1.88626964e-002, 7.46837817e-003, 2.31908411e-002, + -2.92773475e-004, 3.34734656e-002, 2.76542921e-002, + -2.87888590e-002, 5.30468561e-002, 1.19824603e-001, + 1.60027117e-001, -2.47763127e-001, 1.54644668e-001, + 2.95068771e-001, 3.13712656e-001, -1.15557894e-001, + 2.53871959e-002, 1.60822809e-001, 5.22234216e-002, + 4.52227481e-002, -3.59008498e-002, 5.84801100e-002, + 5.20862266e-002, 1.13174058e-002, -1.52560472e-001, + 1.37810737e-001, 2.40272909e-001, -8.31650421e-002, + -7.53733814e-002, 1.91386670e-001, 2.43082926e-001, + -1.40539691e-001, 6.20485051e-003, 1.77751958e-001, + 5.82804941e-002, 2.66808667e-004, -1.82325840e-002, + 6.39393739e-003, 2.47308221e-002, -5.54268598e-004, + -2.06186265e-001, 3.85860428e-002, 2.57171154e-001, + 4.45586909e-003, -2.09759891e-001, 3.26697119e-002, + 2.48302609e-001, -5.86076407e-003, -1.62559114e-002, + 1.14833778e-002, 2.10228972e-002, -1.85006112e-003, + -3.49195930e-003, 9.83188394e-003, 1.60573721e-002, + 4.12996598e-002, -1.54115647e-001, 5.94082996e-002, + 2.33852386e-001, 1.45626208e-002, -1.13559894e-001, + 5.44555709e-002, 2.41132677e-001, 6.53220690e-004, + 3.86031158e-003, 1.18156439e-002, 8.33884533e-003, + -5.97242415e-002, 3.80253233e-003, 7.48976320e-002, + 2.60607898e-002, -1.05924033e-001, 9.74281132e-002, + 2.44428024e-001, 2.57793903e-001, 1.16617512e-002, + -1.19952232e-001, 2.32935220e-001, 4.12375778e-001, + 1.73777148e-001, -1.72849875e-002, 2.35744998e-001, + 4.61671613e-002, -5.61849549e-002, 1.48297288e-003, + 6.28127605e-002, 2.17173286e-002, -1.05700754e-001, + 5.86438179e-002, 1.75349057e-001, 1.17919289e-001, + -7.46212304e-002, 4.46269326e-002, 2.14300558e-001, + 9.76358503e-002, 1.82804942e-001, 1.76521093e-002, + 2.68599838e-001, 2.95187682e-002, -9.25229304e-003, + 2.18150765e-003, 1.23895733e-002, 6.61695283e-003, + -5.59147028e-003, 1.16646867e-002, 1.49396006e-002, + 3.21556330e-002, 2.30985315e-004, 1.75419115e-002, + 4.50544581e-002, 3.08282133e-002, 2.26812568e-002, + 3.22245969e-003, 3.61762904e-002, 5.48109319e-003, + -1.22680306e-003, -8.05731979e-004, 6.13426417e-003, + 4.54399083e-003, 7.14737875e-003, -1.71991829e-002, + 3.84208784e-002, 3.59234139e-002, 3.21548583e-007, + -2.19737105e-002, 4.61683311e-002, 4.22518440e-002, + 3.67381936e-003, -7.29486463e-004, 8.52717180e-003, + 5.59642771e-003, -3.13352235e-002, -4.04901523e-003, + 4.71002124e-002, 3.09353191e-002, 1.11786854e-002, + -1.21590078e-001, 1.87465727e-001, 2.00737998e-001, + -1.23808058e-002, -1.39255315e-001, 2.78137624e-001, + 2.33854160e-001, 7.55087584e-002, 1.59720201e-002, + 8.83130357e-002, 4.48287949e-002, -3.13055702e-002, + 4.50677332e-003, 4.74375226e-002, 2.99801398e-002, + -3.40944789e-002, 6.25776574e-002, 1.86852247e-001, + 1.83158159e-001, 2.82909274e-001, 3.36237103e-001, + 3.73888105e-001, 3.90415609e-001, 5.32277040e-002, + 4.06903923e-002, 7.19588622e-002, 5.48201092e-002, + -1.61132799e-003, 1.14827522e-003, 5.92047302e-003, + 4.80761239e-003, 2.19225511e-002, 4.20638695e-002, + 4.64040264e-002, 5.33538982e-002, 4.81040142e-002, + 3.04667577e-002, 6.05837144e-002, 5.03945388e-002, + -6.97566429e-004, -1.60690350e-003, 5.54053206e-003, + 4.79159784e-003, -4.14587063e-004, -4.98476380e-004, + 4.31435928e-003, 3.00756446e-003, -2.12289020e-003, + -7.61172175e-003, 1.89601071e-002, 2.09380109e-002, + 2.31580194e-002, -1.01184165e-002, 4.40785140e-002, + 2.56014802e-002, 2.05420833e-002, 2.81646475e-003, + 2.86088511e-002, 7.27974018e-003, -1.16830161e-002, + 1.16944488e-003, 2.94711757e-002, 2.42323931e-002, + -2.45547593e-002, -3.13934498e-003, 1.20942473e-001, + 1.16529688e-001, 1.56813741e-001, -8.29500891e-003, + 2.74374872e-001, 1.33286133e-001, 1.86954394e-001, + -1.06799081e-002, 2.23466843e-001, 4.10143360e-002, + -1.88702792e-002, 6.25096783e-002, 5.53989410e-002, + 7.71982893e-002, -1.57670125e-001, 3.32175255e-001, + 2.36318529e-001, 4.41060901e-001, 1.10645212e-001, + 6.85563013e-002, 2.57616401e-001, 1.94070101e-001, + 1.41578823e-001, -2.60049161e-002, 1.72226518e-001, + 4.23270464e-002, 4.93208924e-003, 1.80520152e-003, + 1.04170237e-002, 1.34608196e-002, -4.00916114e-002, + 7.78833181e-002, 9.10698622e-002, 1.41085654e-001, + -4.07957025e-002, 7.10447580e-002, 7.65799433e-002, + 1.01033308e-001, 1.12377163e-002, -1.52755156e-003, + 1.80319902e-002, 6.41471287e-003, -2.61260360e-003, + -2.73568067e-003, 4.38343221e-003, 4.42126254e-003, + -2.07072706e-003, -3.85009758e-002, 2.97011565e-002, + 5.03676794e-002, 1.09645901e-002, -2.87856963e-002, + 3.62139679e-002, 5.62905557e-002, 1.76754256e-003, + -6.48950180e-003, 3.51893948e-003, 1.30040050e-002, + -3.97187881e-002, 1.53097427e-002, 4.34479825e-002, + 2.96350904e-002, 1.41670285e-002, -2.83488929e-002, + 1.29340455e-001, 1.23240523e-001, -1.91467404e-002, + -7.29033202e-002, 7.71474689e-002, 1.46291777e-001, + 4.12590010e-003, -2.11242232e-002, 1.57635584e-002, + 2.71109231e-002, -7.23597035e-002, 5.43392859e-002, + 8.11565146e-002, 7.31130615e-002, -3.93732600e-002, + 2.20686793e-001, 2.28788331e-001, 3.39271039e-001, + -6.36478662e-002, 1.62812099e-001, 1.33742154e-001, + 2.62644619e-001, -1.15736504e-003, 1.18553713e-002, + 1.39079243e-002, 2.31874604e-002, 2.47825775e-003, + 2.31213626e-002, 1.33404927e-002, 3.49339433e-002, + -2.34416258e-002, 3.25424910e-001, 7.40770772e-002, + 3.59021991e-001, -3.78945284e-002, 3.14933628e-001, + 6.43301755e-002, 3.38412106e-001, -1.41039295e-002, + 2.31596380e-002, 1.42404186e-002, 2.55701076e-002, + 1.85776502e-003, -4.90245270e-003, 5.08431438e-003, + 1.06273023e-002, 7.27141649e-003, -6.09149002e-002, + 3.11368685e-002, 9.28095430e-002, -4.30432474e-003, + -7.03934431e-002, 3.61965522e-002, 1.00825183e-001, + 5.92045020e-003, -2.41314573e-003, 9.20187589e-003, + 9.17347055e-003, -6.83627417e-003, -3.17858830e-002, + 2.30071303e-002, 4.06759121e-002, -2.19295211e-002, + -2.48425707e-001, 1.02617204e-001, 2.80588210e-001, + 1.79319739e-001, -1.38932392e-001, 2.49961853e-001, + 2.42518097e-001, 9.82038751e-002, 2.18479168e-002, + 1.15200460e-001, 4.75657322e-002, -8.48654192e-003, + -2.54593394e-003, 1.87503621e-002, 2.13948097e-002, + 1.67926382e-002, 1.80545282e-002, 9.75752473e-002, + 1.32544339e-001, 4.05628026e-001, 1.40651226e-001, + 4.34829682e-001, 2.08779573e-001, 8.15311000e-002, + 2.10091826e-002, 1.06021576e-001, 4.25153784e-002, + 6.70394569e-004, 5.17478213e-003, 3.70954792e-003, + 8.11660569e-003, 1.73965041e-002, 6.09829836e-002, + 3.30628343e-002, 8.06211457e-002, 5.43179475e-002, + 5.65731041e-002, 7.17372522e-002, 8.33689868e-002, + 3.93370539e-003, -1.68131478e-003, 8.98726285e-003, + 6.75608171e-003, -1.55918460e-004, -1.06471414e-002, + 3.73842148e-003, 1.74788386e-002, 4.94505465e-003, + -9.88337025e-002, 2.23641898e-002, 1.41826600e-001, + -4.69428068e-003, -9.70657766e-002, 2.91280970e-002, + 1.41187534e-001, 2.19296757e-003, -8.02977383e-003, + 6.32687565e-003, 1.51379257e-002, -1.70481633e-002, + -2.43295589e-003, 2.81641372e-002, 2.74696965e-002, + -5.25707612e-003, -6.31552264e-002, 8.91146734e-002, + 1.58184677e-001, 9.84647274e-002, -1.07897194e-002, + 1.57481790e-001, 1.75205961e-001, 4.59649339e-002, + 4.58684601e-002, 6.28862083e-002, 7.38186613e-002, + -1.32223982e-002, 2.31330078e-002, 2.92539131e-002, + 4.34949063e-002, -9.91055928e-003, 2.23511681e-001, + 1.11768857e-001, 2.93547601e-001, 3.48678499e-001, + 3.02428812e-001, 3.96567762e-001, 3.57936263e-001, + 5.24925925e-002, 5.52886277e-002, 8.52566287e-002, + 7.27374703e-002, 3.63473519e-004, 1.81082787e-003, + 4.68523521e-003, 9.59894247e-003, 1.82636688e-003, + 1.67077389e-002, 2.87277326e-002, 7.01795444e-002, + 4.00258601e-002, 1.91664919e-002, 5.81940152e-002, + 7.67548159e-002, 1.88615895e-003, -5.00176474e-003, + 9.14293434e-003, 9.28911287e-003, 1.64793839e-003, + -6.83686789e-003, 4.43674065e-003, 1.30447205e-002, + 5.94475539e-003, -8.94137397e-002, 4.06418815e-002, + 1.27449036e-001, -1.47921452e-002, -7.19128698e-002, + 4.19099256e-002, 1.03668198e-001, 5.16306097e-003, + -3.04284133e-003, 9.14845709e-003, 8.18577688e-003, + -1.23305004e-002, -1.83213353e-002, 2.26889085e-002, + 2.97473930e-002, 3.88922007e-003, -1.24401510e-001, + 9.16897282e-002, 1.59540147e-001, 8.64675641e-002, + -6.29156455e-002, 1.57033324e-001, 1.82902828e-001, + 5.32115884e-002, 1.20660001e-002, 7.89698735e-002, + 6.28747940e-002, -9.44260694e-003, 4.20896569e-003, + 2.11651009e-002, 1.98920611e-002, 5.18904161e-003, + 9.91752651e-003, 9.31693986e-002, 7.87807181e-002, + 4.90468174e-001, 2.17577964e-001, 5.45350850e-001, + 2.75885016e-001, 8.84943735e-003, 9.10193026e-002, + 8.90576690e-002, 1.07712269e-001, -1.03838416e-003, + 1.51333888e-003, 4.70098061e-003, 6.29985193e-003, + 1.96184643e-004, 1.81059074e-002, 2.67090704e-002, + 3.25354189e-002, 9.63269547e-002, 1.45191457e-002, + 1.06395759e-001, 5.31108640e-002, -4.39680211e-004, + -5.71597787e-003, 1.04749408e-002, 9.61002428e-003, + -4.53245034e-003, -2.76415114e-004, 7.25037651e-003, + 3.36920843e-003, -4.75484692e-003, -4.11361046e-002, + 5.36602847e-002, 4.87151146e-002, 5.49023487e-002, + -2.95732245e-002, 6.59300610e-002, 4.69772518e-002, + -2.52083666e-003, 4.86107368e-004, 5.45300916e-003, + 4.37150383e-003, -4.36708033e-002, 2.90680397e-003, + 5.83577342e-002, 2.05718484e-002, -2.30826154e-001, + -4.68047708e-002, 3.19910914e-001, 1.36913270e-001, + 2.85634011e-001, -3.31178188e-001, 3.28024715e-001, + 3.57540637e-001, 1.72746796e-002, -5.60589209e-002, + 4.27742191e-002, 6.37066811e-002, -3.85528356e-002, + -3.84222338e-004, 5.48451468e-002, 1.86159890e-002, + -2.85029203e-001, 4.27347496e-002, 3.26245695e-001, + 1.09884106e-001, 4.06613052e-002, 1.23494538e-002, + 1.25545472e-001, 1.13271035e-001, 3.31956111e-002, + -1.73727199e-002, 4.19846773e-002, 3.25110853e-002, + -4.23404342e-003, -9.38369078e-004, 7.21762842e-003, + 2.76287855e-003, -3.58625576e-002, 8.96021165e-003, + 4.81635742e-002, 2.01505441e-002, 9.23817628e-004, + 1.09186154e-002, 2.24567726e-002, 2.07947567e-002, + 1.81765889e-003, 3.11570548e-005, 4.35752003e-003, + 3.22273909e-003, 5.81747619e-003, -5.53563237e-003, + 1.88940112e-002, 1.55906091e-002, 2.61265617e-002, + 8.47341865e-002, 7.57700503e-002, 1.24947555e-001, + -4.25030999e-002, 1.29227936e-001, 7.18067884e-002, + 1.69766426e-001, 6.19246066e-003, -1.05162691e-002, + 2.07324214e-002, 1.74350943e-002, 1.52545020e-001, + 5.43566458e-002, 2.27144822e-001, 7.53707215e-002, + 1.21577464e-001, 1.21937953e-001, 1.88997954e-001, + 2.14897662e-001, -1.28845423e-001, 9.09518600e-002, + 2.33302131e-001, 2.07678407e-001, -1.43306747e-001, + 7.93517083e-002, 1.98554590e-001, 1.03344396e-001, + 1.59512475e-001, -2.02734433e-002, 2.35052437e-001, + 6.20498769e-002, 6.37435839e-002, -3.80065143e-002, + 1.71268031e-001, 1.73839688e-001, -3.96836065e-002, + -1.43778790e-002, 1.73222780e-001, 1.77476823e-001, + -1.17345296e-001, -4.31922339e-002, 1.68449432e-001, + 9.60156545e-002, 8.29045102e-003, -9.40925442e-004, + 1.78689528e-002, 2.05856822e-002, -3.74606834e-003, + -1.47416770e-001, 9.65892151e-002, 1.75010920e-001, + -1.69417616e-002, -1.51340827e-001, 8.46059248e-002, + 1.97709963e-001, 7.01084547e-003, 1.09726274e-002, + 2.06279699e-002, 1.66942384e-002, -8.09909892e-004, + -4.13636037e-004, 3.08730826e-003, 2.92872405e-003, + -3.48492875e-003, -1.10118166e-002, 1.90993361e-002, + 2.19671186e-002, 3.37822805e-003, -1.18426206e-002, + 2.99333297e-002, 2.29363907e-002, 4.99552349e-003, + 2.13136082e-004, 8.11321195e-003, 3.69334058e-003, + -1.26943002e-002, -8.47622752e-004, 2.23078225e-002, + 2.05670204e-002, -2.16618869e-002, -3.16213584e-003, + 1.06712900e-001, 1.13275304e-001, 1.12441061e-002, + -1.44501710e-002, 2.32958853e-001, 1.21269137e-001, + 5.17598875e-002, 5.61430492e-003, 6.72229379e-002, + 2.89292596e-002, -1.21139707e-002, 4.05479334e-002, + 2.50230599e-002, 5.14201559e-002, 5.54307888e-004, + 3.38965803e-001, 1.14934072e-001, 3.94614369e-001, + 6.58179820e-002, 4.35957968e-001, 2.16978967e-001, + 4.74527657e-001, 3.54448482e-002, 4.00975980e-002, + 5.70700429e-002, 5.37699759e-002, 2.15455820e-003, + 5.88562712e-003, 4.26468253e-003, 8.22618697e-003, + 7.66275125e-003, 4.89755794e-002, 2.19315104e-002, + 6.10697307e-002, 3.83311138e-003, 3.81830037e-002, + 2.27178708e-002, 5.28702177e-002, -2.92234239e-003, + 2.32034642e-003, 5.21214120e-003, 5.66072948e-003, + -2.10081879e-003, 9.52562876e-003, 6.42348826e-003, + 1.26076909e-002, -1.10063432e-002, 1.04100026e-001, + 4.32166047e-002, 1.16329998e-001, 2.12082323e-002, + 7.00489059e-002, 6.86474442e-002, 8.45467746e-002, + -6.98681595e-003, 2.33312696e-003, 1.15801599e-002, + 7.26387138e-003, 1.71104800e-002, 1.31501835e-002, + 3.21898758e-002, 2.87185777e-002, -2.48556733e-002, + 1.40013054e-001, 1.18989691e-001, 2.14553535e-001, + -1.74905092e-001, 1.01975724e-001, 3.06733131e-001, + 1.81361273e-001, -9.55056325e-002, -3.35094752e-003, + 1.22204207e-001, 3.03580668e-002, 5.06291632e-003, + -3.81192081e-002, 3.58180180e-002, 5.19198515e-002, + -3.68979829e-003, -3.38967472e-001, 2.12744847e-001, + 3.72689992e-001, -6.89838827e-002, -1.28922343e-001, + 3.69126022e-001, 1.76719517e-001, -1.00249469e-001, + 3.35551472e-003, 1.32480949e-001, 2.46820208e-002, + -5.34613850e-003, -2.67402292e-003, 9.45194624e-003, + 8.05305410e-003, 8.62057973e-003, -4.46014106e-002, + 6.46252409e-002, 7.93935359e-002, 3.41464654e-002, + -5.18113114e-002, 8.16631988e-002, 6.71057850e-002, + -1.00116320e-002, -1.60061521e-004, 1.40995458e-002, + 5.89588843e-003, -1.22028571e-002, 1.66258903e-003, + 1.55804632e-002, 3.65617243e-003, -3.36562023e-002, + -1.08805383e-002, 4.48960960e-002, 2.22829916e-002, + -7.29304156e-004, -1.22606177e-002, 1.53470067e-002, + 2.27847882e-002, 6.91336099e-005, -5.32791833e-004, + 2.24458799e-003, 2.55364925e-003, -9.76068005e-002, + 5.80297364e-003, 1.18709251e-001, 2.15333309e-002, + -2.76746064e-001, 2.91627739e-003, 3.11177105e-001, + 9.04835910e-002, 6.34432212e-003, -3.23233218e-003, + 7.68961310e-002, 8.06895941e-002, 6.13378501e-003, + 1.10184366e-003, 1.54637108e-002, 1.38862506e-002, + -8.63348842e-002, 5.77811850e-003, 1.06660858e-001, + 2.83078700e-002, -2.52873927e-001, 3.03821951e-001, + 2.96730191e-001, 3.53919029e-001, 4.20081802e-003, + 3.37979525e-001, 8.78435299e-002, 3.82222205e-001, + 8.48846603e-003, 4.50656265e-002, 1.97842065e-002, + 5.31141944e-002, -4.84244898e-003, -2.67968193e-004, + 8.35486688e-003, 6.54239440e-003, -5.95733896e-003, + 1.61615890e-002, 2.88567431e-002, 9.21257883e-002, + 2.03969874e-004, 2.23711580e-002, 2.05021016e-002, + 1.05263531e-001, -7.34490575e-004, 3.80427623e-003, + 3.73281143e-003, 1.44311665e-002, 4.39427281e-003, + -1.34923747e-002, 1.12893675e-002, 1.84994601e-002, + 3.74269381e-004, -2.15129554e-001, 5.85843623e-002, + 2.24945515e-001, 2.62635071e-002, -1.85676545e-001, + 4.98662665e-002, 1.93976685e-001, 6.28474692e-004, + -7.71223987e-003, 8.08763225e-003, 1.07709877e-002, + -5.76881282e-002, -5.20279147e-002, 8.27928409e-002, + 7.09721744e-002, -3.85704413e-002, -1.61802858e-001, + 2.32809335e-001, 3.06498975e-001, 2.62223840e-001, + -2.76443839e-001, 3.03370744e-001, 3.65231246e-001, + 6.00255169e-002, -9.03257951e-002, 8.42350572e-002, + 1.02681682e-001, -2.22484954e-002, -1.03433570e-002, + 4.01387662e-002, 3.71562168e-002, -7.40546081e-003, + -2.94038579e-002, 1.18899643e-001, 1.43523961e-001, + 1.05747975e-001, -2.50554625e-002, 1.55688986e-001, + 1.40099391e-001, 3.23507227e-002, -1.24276076e-002, + 4.69393432e-002, 3.37979011e-002, -3.15851276e-003, + -2.52488871e-006, 5.93248289e-003, 3.59337195e-003, + -3.10008088e-003, 3.41321342e-003, 1.58813111e-002, + 2.14652307e-002, 1.31223043e-002, 1.19486346e-003, + 1.99467428e-002, 2.07926407e-002, 2.41305353e-003, + -1.15330284e-003, 4.92620608e-003, 4.20467323e-003, + 7.00262748e-003, -1.51262700e-003, 1.35379005e-002, + 5.33547997e-003, -1.50159234e-002, 3.48147824e-002, + 7.20562860e-002, 4.93696965e-002, -6.42433688e-002, + 5.84984273e-002, 1.00281917e-001, 8.29437971e-002, + 1.25214411e-003, 1.64666027e-003, 8.76513030e-003, + 1.02677401e-002, 6.36182278e-002, -5.43290982e-003, + 1.13197178e-001, 2.81273834e-002, 1.65960714e-001, + 3.45886499e-002, 3.13121498e-001, 1.44054636e-001, + -1.87220812e-001, 3.04067403e-001, 3.28451484e-001, + 3.57821316e-001, -1.03000268e-001, 2.93903705e-002, + 1.39741942e-001, 6.83136284e-002, 5.99155128e-002, + 1.73235184e-003, 1.12490259e-001, 2.39729676e-002, + 2.31913865e-001, -3.12884636e-002, 2.98036277e-001, + 1.00917928e-001, -3.88592966e-002, -1.87512599e-002, + 1.80931583e-001, 1.02243274e-001, -1.26258403e-001, + 2.11516190e-002, 1.46120608e-001, 4.33994569e-002, + 6.18442148e-003, 1.17891002e-003, 1.39128957e-002, + 4.11897432e-003, 3.37341689e-002, -6.54919492e-003, + 4.42831665e-002, 1.99233945e-002, -7.09044142e-003, + -8.59060045e-003, 2.65660454e-002, 1.93172898e-002, + -9.16751940e-003, 2.01052870e-003, 1.23599274e-002, + 4.63829190e-003, 5.06103924e-003, 4.57719807e-003, + 1.38534093e-002, 9.92608350e-003, -8.95958673e-003, + 8.66820067e-002, 5.25001660e-002, 1.16698973e-001, + 1.30443536e-002, 9.09856707e-002, 4.44005728e-002, + 1.16035327e-001, -4.75651678e-003, 5.02193859e-003, + 1.23336865e-002, 1.04276426e-002, 9.92574617e-002, + 1.93956625e-002, 1.45672739e-001, 4.43809740e-002, + 9.98246484e-003, 1.77656710e-001, 2.89932221e-001, + 2.87646383e-001, -1.76726580e-002, 1.21804662e-001, + 2.66783506e-001, 2.77214527e-001, -1.07206844e-001, + 5.55674313e-003, 1.46244705e-001, 4.25599068e-002, + 9.11556855e-002, 7.31728133e-003, 1.33413255e-001, + 4.55310903e-002, -4.97774631e-002, -1.08147055e-001, + 2.62937963e-001, 2.32274830e-001, -3.01729292e-002, + -9.41922590e-002, 2.40458742e-001, 2.11945474e-001, + -1.05220526e-001, -1.06087066e-002, 1.44157082e-001, + 3.93645875e-002, 2.64797593e-003, -1.21190806e-003, + 1.15150074e-002, 9.08006914e-003, -6.37178123e-003, + -6.82668909e-002, 5.03222160e-002, 1.00352563e-001, + -3.88272339e-003, -6.78803176e-002, 4.21344936e-002, + 9.90557373e-002, -6.19287509e-003, -1.85709656e-003, + 1.24629997e-002, 9.60523635e-003, -1.36622333e-003, + -1.23033498e-003, 4.14337637e-003, 5.68396412e-003, + 2.00600307e-002, 2.57541556e-002, 3.86269279e-002, + 5.72149195e-002, 2.15829629e-002, 5.45605123e-002, + 3.94870490e-002, 6.60258383e-002, -1.83183409e-003, + 2.82449904e-003, 5.07107191e-003, 6.03607995e-003, + 2.79293768e-002, 4.59653847e-002, 4.23458479e-002, + 6.17416054e-002, 1.70571685e-001, 2.49539748e-001, + 2.38043770e-001, 4.10917491e-001, -8.01144540e-002, + -6.99708099e-003, 1.85695902e-001, 2.56539404e-001, + -3.75351682e-002, -1.44372117e-002, 4.55080979e-002, + 3.85646038e-002, 2.62856372e-002, -7.13040540e-003, + 3.63787264e-002, 3.59216817e-002, -4.19188626e-002, + -1.70188531e-001, 1.67571664e-001, 2.40926892e-001, + -1.92219526e-001, -2.79223084e-001, 2.41965979e-001, + 3.30489159e-001, -2.69453526e-002, -3.10549941e-002, + 3.88574786e-002, 4.40163538e-002, -6.96206334e-005, + -4.24308563e-003, 4.14147787e-003, 6.85347570e-003, + -1.74545329e-002, -4.46877703e-002, 3.27633396e-002, + 5.82632236e-002, -1.63063388e-002, -2.34762225e-002, + 2.97389925e-002, 4.29826677e-002, 5.58075553e-004, + -5.69442091e-005, 3.47106624e-003, 4.02146019e-003, + 2.24379729e-003, 1.47196725e-002, 8.71003419e-003, + 2.72806343e-002, 7.22607225e-003, 1.65550575e-001, + 2.79460885e-002, 2.91683853e-001, -7.62722408e-003, + 1.67753443e-001, 2.32925490e-002, 3.07089299e-001, + -2.52659429e-005, 1.68864708e-002, 9.01035964e-003, + 3.35740037e-002, 6.18946664e-002, 1.37281511e-002, + 9.30509493e-002, 4.42898199e-002, 8.46037641e-003, + 7.64548481e-002, 1.28456652e-001, 1.62858590e-001, + -1.30335987e-002, 3.87448817e-002, 1.04606345e-001, + 1.56527668e-001, -4.19250391e-002, 3.82222841e-003, + 6.71359822e-002, 3.89254317e-002, 4.82605994e-002, + -2.93998071e-003, 9.56867784e-002, 4.12237421e-002, + -1.20963890e-003, -4.79025207e-002, 1.56138688e-001, + 1.50027990e-001, -1.78641364e-001, -2.09245786e-001, + 2.25507528e-001, 2.87724674e-001, -7.11345673e-002, + -8.46889168e-002, 1.11328617e-001, 1.11888051e-001, + 1.11969573e-004, -1.93208531e-002, 8.75106361e-003, + 2.46620532e-002, -1.53327137e-002, -1.96167096e-001, + 5.03820069e-002, 2.43347570e-001, -3.27558517e-002, + -1.61860749e-001, 6.26685545e-002, 2.44140789e-001, + 3.73927737e-003, 4.59208124e-004, 1.10650817e-002, + 1.86626110e-002, 7.61220232e-004, -1.44610060e-002, + 5.28764725e-003, 3.57624255e-002, 2.22971570e-002, + -1.99268490e-001, 5.64659610e-002, 3.24017853e-001, + -3.72787900e-002, -2.99042046e-001, 7.26571754e-002, + 4.02101487e-001, -9.10983142e-003, -2.10894644e-002, + 1.03285825e-002, 2.84378584e-002, -6.45861356e-003, + -2.55130380e-002, 1.20718917e-002, 4.83404100e-002, + -3.64058465e-002, -1.46747097e-001, 9.02608335e-002, + 2.69847840e-001, -3.99865210e-003, -7.21030757e-002, + 9.92402285e-002, 1.64861590e-001, 2.14197971e-002, + 2.24410314e-002, 4.23695631e-002, 4.10634689e-002, + 1.79228475e-004, -3.86670610e-004, 9.54726338e-003, + 2.90323794e-002, -3.57874669e-002, 7.71570131e-002, + 9.90983844e-002, 2.02203795e-001, 1.78622582e-003, + 9.85516831e-002, 1.30019590e-001, 2.55097985e-001, + 1.42334672e-002, -1.74580831e-002, 2.48222891e-002, + 4.34826314e-002, 2.22473661e-003, 1.48785012e-002, + 4.86173807e-003, 1.84554793e-002, 5.56745492e-002, + 1.65849879e-001, 8.18048120e-002, 1.90983340e-001, + -5.06180935e-002, 1.92048505e-001, 8.92649144e-002, + 2.40593344e-001, -2.81847315e-004, 1.34121152e-002, + 5.38507802e-003, 1.94257684e-002, -2.53511779e-003, + -1.87167991e-003, 9.39314812e-003, 1.76298805e-002, + 2.44198050e-002, 9.92514268e-002, 5.53391874e-002, + 1.77844942e-001, 2.77391430e-002, 1.68157786e-001, + 5.21966927e-002, 2.06580490e-001, 1.87820673e-003, + 1.61271375e-002, 5.59474761e-003, 2.13157088e-002, + 4.79842164e-002, 8.16401169e-002, 6.93023354e-002, + 9.59987789e-002, 1.39966920e-001, 2.92439789e-001, + 1.95783034e-001, 3.53520006e-001, -4.31462675e-002, + 5.92719652e-002, 1.18294060e-001, 1.75542757e-001, + -2.46926099e-002, -4.51147510e-003, 3.48235890e-002, + 3.90887856e-002, 1.79128349e-002, -2.24077012e-002, + 3.18942703e-002, 5.29178455e-002, 8.16246786e-004, + -2.40099996e-001, 1.15737192e-001, 2.77979225e-001, + -8.47764686e-002, -2.71941960e-001, 1.43167451e-001, + 3.31070900e-001, -2.81248298e-002, -3.64504643e-002, + 4.57100868e-002, 6.20351546e-002, -7.41330325e-004, + -1.15322424e-002, 6.11557905e-003, 1.64024942e-002, + -4.90107853e-003, -1.00676194e-001, 4.05861177e-002, + 1.28760725e-001, -9.80801135e-003, -8.14794749e-002, + 3.51655595e-002, 1.15923129e-001, 2.46347394e-003, + -7.77256442e-003, 7.05783768e-003, 1.27796223e-002, + -5.54262754e-003, -1.75778440e-003, 1.33497911e-002, + 7.03146588e-003, -4.52580908e-003, -4.45129946e-002, + 4.78074998e-002, 8.25360119e-002, 1.64643824e-002, + -4.17351983e-002, 4.41454537e-002, 8.82919729e-002, + 4.07131901e-003, 1.41470949e-003, 1.39201134e-002, + 8.84434674e-003, -9.38056484e-002, -2.08039116e-002, + 1.13339886e-001, 3.79471295e-002, -1.00779831e-001, + -2.43223503e-001, 2.13953793e-001, 3.11732709e-001, + 4.21374477e-002, -2.97459841e-001, 2.39999473e-001, + 3.66988122e-001, 1.77595526e-001, -2.03074012e-002, + 2.22555608e-001, 4.65260185e-002, -1.00033656e-001, + -7.25942338e-003, 1.19283274e-001, 2.11886168e-002, + -8.06131363e-002, 5.27100544e-003, 1.73036337e-001, + 1.02851622e-001, -6.93270378e-003, 1.68878622e-002, + 2.07953885e-001, 1.25182346e-001, 1.84842780e-001, + -1.72524229e-002, 2.38714412e-001, 3.05736866e-002, + -1.14301126e-002, -5.31551312e-004, 1.54930428e-002, + 4.15565819e-003, -4.35662130e-003, 1.64635666e-002, + 2.92106476e-002, 3.15201804e-002, -1.95261289e-003, + 2.02018358e-002, 3.12557593e-002, 3.25492620e-002, + 1.91445593e-002, -6.15759753e-004, 2.60124523e-002, + 4.02618339e-003, -3.62793775e-003, -1.88346763e-004, + 5.62443025e-003, 2.85091484e-003, 5.04172547e-003, + -1.19298184e-002, 2.27659550e-002, 2.52695512e-002, + 5.94801176e-003, -1.96608510e-002, 3.02870348e-002, + 3.00440006e-002, 1.79764070e-002, 1.39723241e-003, + 2.86098123e-002, 5.31167304e-003, -4.87314239e-002, + 8.60863831e-003, 5.74382320e-002, 2.91539803e-002, + 7.61206262e-003, -4.90169972e-003, 1.16425365e-001, + 1.02615558e-001, 2.69128624e-002, -1.35601265e-002, + 1.46090373e-001, 9.72044691e-002, 1.70148700e-001, + 6.20021205e-003, 2.20734060e-001, 2.98856292e-002, + -6.36804029e-002, 8.37154463e-002, 6.97877407e-002, + 9.11362693e-002, -1.02061845e-001, 3.88053477e-001, + 1.95926920e-001, 4.48968709e-001, 4.54390934e-003, + 1.76725402e-001, 1.71595857e-001, 2.39962280e-001, + 1.73737630e-001, 8.99113435e-003, 2.16489568e-001, + 4.47811522e-002, -8.64268921e-004, 3.10077542e-003, + 5.82239730e-003, 1.15659116e-002, -1.61019936e-002, + 1.14252508e-001, 4.13555205e-002, 1.52059078e-001, + -3.46456654e-002, 1.69237897e-001, 5.52174896e-002, + 1.89092413e-001, 4.90377704e-003, 7.44469557e-003, + 1.53493956e-002, 1.09524289e-002, 4.33953898e-003, + 1.55449277e-004, 9.81401093e-003, 4.80439747e-003, + 2.63554207e-003, 2.64467858e-002, 4.17594723e-002, + 4.24640253e-002, -1.36710871e-002, 3.58879231e-002, + 5.14536947e-002, 5.74514046e-002, -4.22218582e-003, + 2.21319191e-004, 8.69288761e-003, 5.69426315e-003, + 6.02068342e-002, 1.34274526e-003, 9.30348188e-002, + 2.49307361e-002, 6.32244870e-002, 3.03695165e-002, + 2.25322291e-001, 1.32796481e-001, -1.35363236e-001, + -1.09324791e-001, 3.64196837e-001, 3.08465511e-001, + -5.04478924e-002, -1.20183271e-004, 7.30055124e-002, + 4.67708781e-002, 6.63449988e-002, 5.03359130e-003, + 8.80245566e-002, 2.10517682e-002, 3.58726494e-002, + -7.37824803e-003, 2.04302803e-001, 1.37039423e-001, + -2.54635066e-001, 5.31075336e-002, 4.89409238e-001, + 2.95535803e-001, -2.64205001e-002, -1.14346240e-002, + 5.57546616e-002, 4.10876386e-002, 4.96127596e-003, + 5.12153201e-004, 8.74224212e-003, 4.02371679e-003, + -5.90661584e-005, -2.33890545e-002, 3.45673822e-002, + 3.60449590e-002, -2.69707907e-002, -2.54809596e-002, + 6.22320883e-002, 5.35255261e-002, -1.49507867e-003, + 3.20149557e-004, 6.66130381e-003, 7.52661610e-003, + 9.75552131e-004, -8.90539028e-003, 5.89061016e-003, + 1.18177505e-002, 2.90643238e-002, -9.91650596e-002, + 4.72457036e-002, 1.15205370e-001, 2.22075451e-002, + -5.91444820e-002, 4.60259430e-002, 9.10050198e-002, + -2.24469788e-003, -2.09692353e-003, 5.86894620e-003, + 8.75913724e-003, -2.76828818e-002, 1.32472506e-002, + 3.98835801e-002, 4.16413508e-002, -2.42399704e-002, + -9.49432775e-002, 1.62148342e-001, 2.36022845e-001, + 1.67443708e-001, -3.63246471e-001, 2.19231576e-001, + 4.12130594e-001, 2.47723311e-002, -5.49264662e-002, + 4.33420986e-002, 6.99300244e-002, -2.41134167e-002, + 2.32923459e-002, 4.26836833e-002, 4.59465943e-002, + -2.07575634e-001, 1.32055596e-001, 2.48290241e-001, + 2.16157719e-001, 1.41033307e-001, 1.70660362e-001, + 1.97638676e-001, 2.44241953e-001, 2.29847357e-002, + 2.64914073e-002, 4.05835584e-002, 4.79005575e-002, + -5.71614946e-004, 1.68837467e-003, 5.51099516e-003, + 7.01800920e-003, -1.79012436e-002, 4.83867526e-002, + 4.31310199e-002, 6.43281490e-002, 1.85527634e-002, + 4.63168100e-002, 4.50736210e-002, 6.59679398e-002, + -3.28322669e-004, 2.37414963e-003, 5.51500265e-003, + 7.48978881e-003, -1.13122608e-003, -1.59911544e-003, + 5.15985256e-003, 5.90146193e-003, -9.74682625e-003, + -3.46526764e-002, 3.23192589e-002, 5.33674248e-002, + -3.70967551e-003, -3.25897373e-002, 2.84731314e-002, + 5.36606200e-002, 5.06607001e-004, -2.74912897e-003, + 4.88145556e-003, 7.21981050e-003, -2.50673443e-002, + 1.10549098e-002, 4.48444337e-002, 3.87453139e-002, + -9.50505659e-002, 3.64706293e-002, 2.09245935e-001, + 2.59839475e-001, -3.15295742e-003, 2.93734241e-002, + 1.56220660e-001, 2.33845100e-001, 2.14202441e-002, + 5.75616583e-003, 4.09482904e-002, 3.77559774e-002, + -2.27497313e-002, 1.47756673e-002, 4.85600829e-002, + 3.53253335e-002, -1.87664092e-001, -1.15620256e-004, + 3.47034156e-001, 3.20692241e-001, 1.19390339e-001, + 9.77379605e-002, 2.68479854e-001, 4.91407037e-001, + 1.72696672e-002, 2.93582659e-002, 4.28602137e-002, + 5.83193526e-002, -1.13582693e-003, 5.60694549e-004, + 6.25597034e-003, 4.81882691e-003, -7.68804550e-003, + 4.71744277e-002, 4.85571697e-002, 6.24863915e-002, + 1.80463940e-002, 3.36503424e-002, 4.09602113e-002, + 6.01952896e-002, -1.37766474e-003, 3.07371374e-004, + 5.57053834e-003, 5.95340226e-003, -3.23188072e-003, + -4.60453797e-003, 9.42326058e-003, 1.06439041e-002, + 6.16172515e-003, -9.28222314e-002, 4.73512746e-002, + 1.27958328e-001, 3.07338405e-002, -6.23625852e-002, + 4.97863777e-002, 1.13385387e-001, -5.96807280e-004, + 1.41286419e-003, 7.00194202e-003, 1.03857536e-002, + -9.32527781e-002, -1.54472174e-004, 1.11272775e-001, + 4.40242477e-002, -8.00707191e-002, -8.30981284e-002, + 1.99194193e-001, 2.51533985e-001, 3.06384206e-001, + -2.77822554e-001, 3.43120307e-001, 3.57510000e-001, + 3.16575803e-002, -6.11487553e-002, 5.71254790e-002, + 7.57751688e-002, -9.10836607e-002, 1.36194378e-002, + 1.13430284e-001, 3.66913266e-002, -1.07445017e-001, + 1.90828979e-001, 1.99616417e-001, 2.33710185e-001, + 4.33604009e-002, 1.22935690e-001, 1.36940032e-001, + 1.96233600e-001, 3.50361802e-002, -7.48341950e-003, + 4.62701395e-002, 3.75838317e-002, -6.48028543e-003, + 5.88972645e-004, 1.20590851e-002, 5.60918218e-003, + -1.27907628e-002, 2.71686818e-002, 3.51582244e-002, + 4.22004014e-002, -1.89794227e-003, 3.30020860e-002, + 2.33328491e-002, 4.32423204e-002, 1.47878518e-003, + 3.39246728e-003, 4.69856011e-003, 5.94115118e-003, + 9.55132581e-003, 2.15499708e-003, 1.49380341e-002, + 7.03370944e-003, -3.16139162e-002, 5.31317443e-002, + 6.51054829e-002, 7.41591603e-002, -1.83096752e-002, + 4.18510325e-002, 4.03063260e-002, 8.19547847e-002, + 2.75286217e-003, 3.78870079e-003, 5.92775783e-003, + 1.02996733e-002, 1.44980550e-001, -5.44255367e-003, + 1.72327906e-001, 3.74251604e-002, 1.13354847e-002, + 2.03917816e-001, 2.64879614e-001, 2.64799118e-001, + -5.75669855e-002, 3.98982853e-001, 1.51757866e-001, + 4.33211207e-001, -1.79364346e-002, 5.26980460e-002, + 3.78777087e-002, 6.18029125e-002, 1.51882887e-001, + -5.33180870e-003, 1.82432368e-001, 3.20830904e-002, + 1.10796846e-001, -6.76282123e-002, 2.50506938e-001, + 1.43943563e-001, -2.57883891e-002, -8.06501657e-002, + 1.18651308e-001, 1.52939022e-001, -1.82865579e-002, + -2.96240323e-003, 2.99782939e-002, 2.48595700e-002, + 1.56129431e-002, 1.06136920e-003, 2.14185007e-002, + 5.01225749e-003, 9.19520669e-003, -1.99501496e-002, + 4.90558110e-002, 3.44220363e-002, 1.40875287e-003, + -2.09451839e-002, 2.46716887e-002, 3.27798091e-002, + -8.95869569e-004, -1.65809214e-003, 4.01698193e-003, + 4.13006777e-003, -1.01093133e-003, 2.75056879e-003, + 3.80560663e-003, 5.68798371e-003, 1.02286576e-003, + 2.42391564e-002, 2.43934002e-002, 4.08867113e-002, + 2.52700225e-002, 2.95370743e-002, 3.89812626e-002, + 4.32503857e-002, -7.34390167e-004, 2.62236292e-003, + 5.18507138e-003, 5.45468600e-003, 2.49237753e-002, + 3.59755009e-002, 3.57055366e-002, 4.80251238e-002, + -9.28272586e-003, 3.73590291e-001, 1.52778789e-001, + 3.95874709e-001, 5.60876578e-002, 2.41749346e-001, + 1.79572180e-001, 2.80102879e-001, -3.42387855e-002, + 1.19087165e-002, 4.52542379e-002, 3.33844349e-002, + 2.72192582e-002, -4.73960936e-002, 3.80094461e-002, + 5.58599532e-002, 9.14752334e-002, -3.30771327e-001, + 1.70150340e-001, 3.62137914e-001, 2.46107369e-003, + -1.33768618e-001, 1.63554952e-001, 1.94718644e-001, + -3.82096432e-002, -1.05312290e-002, 4.95080389e-002, + 2.77470127e-002, -7.09535554e-004, -4.57331305e-004, + 3.75698856e-003, 5.12724183e-003, 1.76548380e-002, + -2.42766943e-002, 3.08282375e-002, 4.51764241e-002, + 2.33527198e-002, -3.71615663e-002, 4.17157039e-002, + 4.92761694e-002, -2.30138307e-003, -2.26810621e-003, + 5.71692083e-003, 5.31189749e-003, 2.67166062e-003, + -3.73991061e-004, 3.75068234e-003, 2.93837790e-003, + 3.64309773e-002, -2.74607986e-002, 4.46797200e-002, + 3.41875367e-002, 1.08133569e-001, -8.13693553e-002, + 1.16576463e-001, 9.11385864e-002, 3.33198230e-004, + -1.08414644e-003, 1.14685437e-002, 6.63078111e-003, + 6.17290940e-003, 7.96602014e-003, 1.89287458e-002, + 1.55329155e-002, 6.77400678e-002, 1.74569786e-002, + 1.23158120e-001, 1.09403059e-001, 1.81371406e-001, + -2.65786201e-001, 3.29789102e-001, 3.01108032e-001, + 2.10208803e-001, -3.27741131e-002, 2.34483868e-001, + 4.69385460e-002, 9.92077496e-003, 2.31616627e-002, + 1.96031667e-002, 2.53477786e-002, 2.83630528e-002, + 1.67934045e-001, 1.23776816e-001, 1.86014876e-001, + -1.07217468e-001, 4.78840508e-002, 3.01611781e-001, + 1.10303268e-001, 2.78605163e-001, -5.62937697e-003, + 2.91855454e-001, 2.76518017e-002, 4.02141502e-003, + -4.32653585e-004, 4.96540451e-003, 8.63949955e-003, + 2.09528394e-002, 4.57991995e-002, 3.84368896e-002, + 8.32659304e-002, -2.29912791e-002, 1.16028056e-001, + 7.08428472e-002, 1.46314681e-001, 2.76465919e-002, + 4.18593688e-003, 3.03247031e-002, 1.05717015e-002, + 4.10556931e-005, 5.47782065e-006, 3.95056186e-003, + 4.04823059e-003, 2.48663709e-003, -1.10447546e-003, + 2.28779204e-002, 3.75634134e-002, 8.55020527e-003, + 5.35290572e-004, 2.30089277e-002, 4.16131169e-002, + 1.51798292e-003, 1.40665704e-003, 4.17345529e-003, + 5.93227707e-003, 1.25975460e-002, 2.09615082e-002, + 3.68420705e-002, 4.22667563e-002, -1.37527718e-003, + 2.35657588e-001, 1.55803815e-001, 3.57747465e-001, + 1.34922080e-002, 1.36216670e-001, 1.85031071e-001, + 3.30672264e-001, 9.84616298e-003, 1.38099836e-002, + 4.47650515e-002, 4.60116789e-002, 1.10337585e-002, + -2.76449379e-002, 3.56586464e-002, 4.48397137e-002, + 7.04698712e-002, -2.11448580e-001, 2.04768091e-001, + 3.42265189e-001, 1.70449346e-001, 1.27650738e-001, + 2.87436396e-001, 3.21916699e-001, 2.67925818e-004, + 2.74900999e-002, 4.16759774e-002, 4.19275425e-002, + 3.73615156e-004, 2.42786948e-003, 4.27396083e-003, + 5.30246366e-003, 2.51244120e-002, 2.84993127e-002, + 4.11799513e-002, 5.78130744e-002, 2.83711068e-002, + -2.42636236e-003, 4.47621085e-002, 5.29692881e-002, + 2.65599636e-004, -1.80040416e-003, 3.82724754e-003, + 4.17712703e-003, 2.34807003e-003, 2.77095212e-004, + 4.62996820e-003, 5.12624998e-003, -7.19377119e-003, + 1.87041815e-002, 3.97229008e-002, 5.26629277e-002, + -2.02921834e-002, 8.60368425e-004, 4.04450782e-002, + 5.12271263e-002, 1.35356234e-003, -4.30489366e-004, + 4.87988582e-003, 5.14057418e-003, 8.22671968e-003, + -1.35106025e-002, 4.54730168e-002, 3.81248146e-002, + 9.81493071e-002, -1.79034114e-001, 2.66553134e-001, + 3.09897155e-001, -1.42210439e-001, 1.31674901e-001, + 2.73030788e-001, 2.80651361e-001, 6.77522318e-003, + 1.20072579e-002, 4.40188348e-002, 4.16769423e-002, + -6.40941411e-003, 4.61748755e-003, 4.04526778e-002, + 3.11206914e-002, 2.52262622e-001, 1.15549415e-001, + 3.84186387e-001, 2.34998673e-001, -2.13781055e-002, + 1.14923038e-001, 2.41579622e-001, 2.27980331e-001, + -1.16300052e-002, 1.63994469e-002, 4.59515490e-002, + 3.72152030e-002, 1.52303849e-003, 1.45126821e-003, + 4.63301130e-003, 4.15345561e-003, 2.44043134e-002, + 8.68704449e-003, 4.41613607e-002, 3.91413718e-002, + 3.54443304e-003, 8.01682705e-004, 3.27797346e-002, + 3.50313410e-002, -1.84986612e-003, 1.71697733e-003, + 4.99306992e-003, 4.68960544e-003, 5.10395411e-003, + 1.12266594e-003, 7.95055367e-003, 5.27536031e-003, + -7.57039478e-003, 7.03711286e-002, 5.17709889e-002, + 8.50789919e-002, -1.31171839e-002, 9.27046090e-002, + 2.70829275e-002, 1.16086178e-001, -1.10728643e-003, + 6.78000087e-003, 4.10181563e-003, 1.25275850e-002, + 3.92752513e-002, -1.00238752e-002, 4.91716564e-002, + 3.16047184e-002, 2.03195602e-001, -1.82169795e-001, + 2.97130466e-001, 3.77565503e-001, -6.67669177e-002, + -1.93542019e-001, 1.79359004e-001, 4.75757062e-001, + -2.66502462e-002, -1.14176208e-002, 4.43411395e-002, + 6.14481196e-002, 3.81181203e-002, -3.26797381e-005, + 4.80438136e-002, 2.36879606e-002, 1.11288942e-001, + 3.48286494e-003, 2.27431878e-001, 1.90528676e-001, + -1.25602216e-001, -6.69063702e-002, 1.85061336e-001, + 1.95893630e-001, -7.42678856e-003, -1.60704926e-002, + 3.37194391e-002, 2.70600822e-002, 4.18965518e-003, + 1.48338091e-004, 5.02062310e-003, 3.64479865e-003, + 8.28680862e-003, -2.68084295e-002, 2.90694311e-002, + 3.60291637e-002, -1.97898000e-002, -2.73845606e-002, + 3.01895179e-002, 3.74379307e-002, 1.65482739e-003, + -1.21066475e-003, 5.50704496e-003, 4.84648440e-003, + -4.33636684e-004, -7.44459277e-004, 3.94829642e-003, + 3.67998611e-003, -3.16428253e-003, -1.23588275e-002, + 1.90968644e-002, 2.38851346e-002, 1.92771647e-002, + -1.09582916e-002, 3.41539122e-002, 2.25507524e-002, + 4.60080989e-003, 7.52920401e-004, 7.39393430e-003, + 2.97898776e-003, -1.51508469e-002, -1.17048062e-003, + 3.19115780e-002, 2.38144509e-002, -2.15194542e-002, + -2.44621597e-002, 1.19461842e-001, 1.27884537e-001, + 1.78868875e-001, -7.44976755e-003, 2.60074824e-001, + 1.28004327e-001, 3.83862257e-002, 6.32318482e-003, + 5.79544380e-002, 2.40111127e-002, -1.79503746e-002, + 2.28224285e-002, 4.06474508e-002, 6.12009056e-002, + -5.06392270e-002, 1.53149456e-001, 1.54557079e-001, + 5.09295106e-001, 2.45041743e-001, 1.43610314e-001, + 3.16570759e-001, 4.40626770e-001, 2.78763995e-002, + 5.32171829e-003, 4.93583493e-002, 4.13649194e-002, + 1.57954777e-003, 1.07760029e-003, 4.96343384e-003, + 7.55449291e-003, 4.80425690e-004, 2.32400596e-002, + 3.19367796e-002, 5.81250563e-002, 9.73290019e-003, + 2.85761934e-002, 3.31349038e-002, 5.40119149e-002, + 1.33447276e-004, 8.12836806e-004, 3.99384694e-003, + 4.21616202e-003, -1.47391688e-002, 1.72297133e-003, + 3.12173609e-002, 7.07013858e-003, -5.82329109e-002, + -2.15702318e-002, 9.08551663e-002, 4.00014073e-002, + 4.33203857e-003, -1.08790891e-002, 2.37658843e-002, + 2.57260334e-002, 7.98967609e-004, -1.14245142e-003, + 3.94765334e-003, 3.69218644e-003, -1.98778823e-001, + -4.41241488e-002, 2.98409015e-001, 6.40694946e-002, + -1.89635694e-001, -6.78242370e-002, 3.78329486e-001, + 1.87878832e-001, 5.97293489e-003, -2.32063439e-002, + 1.27965108e-001, 1.47664696e-001, 1.17157875e-002, + -6.07482763e-003, 2.62415819e-002, 2.16520187e-002, + -1.71669662e-001, -4.47521992e-002, 2.20215708e-001, + 7.38954842e-002, -3.48993428e-002, 1.42397076e-001, + 1.92921251e-001, 3.21413517e-001, -6.03389181e-003, + 1.38844386e-001, 1.21871471e-001, 2.69907624e-001, + 6.37554144e-003, 1.15966899e-002, 2.02802774e-002, + 3.54737565e-002, -6.04110071e-003, 9.51711647e-003, + 1.43136196e-002, 1.62586197e-002, 4.49610502e-003, + 1.11716680e-001, 3.22493948e-002, 1.58570990e-001, + -9.68908984e-003, 1.13486364e-001, 2.82335114e-002, + 1.54994935e-001, -3.18851415e-003, 1.28238723e-002, + 5.30577404e-003, 1.79843754e-002, 7.11071771e-003, + -3.52058606e-003, 2.03536265e-002, 7.72427395e-003, + 2.15592887e-002, 1.68594569e-002, 4.18753251e-002, + 2.86639072e-002, -3.02520711e-002, 1.98839288e-002, + 4.53059636e-002, 4.42835055e-002, -9.13450401e-003, + 4.76457935e-004, 1.69408992e-002, 9.97602846e-003, + 1.41764104e-001, 5.15141478e-003, 1.94425419e-001, + 6.22507446e-002, 1.15205258e-001, 3.59149948e-002, + 2.08755672e-001, 1.02138795e-001, -1.71665028e-001, + -8.46340973e-003, 2.51106799e-001, 1.65522709e-001, + -9.96977165e-002, -5.35712503e-002, 1.15049332e-001, + 9.14267823e-002, 1.39870718e-001, 2.86286697e-002, + 1.72552884e-001, 4.75914739e-002, 5.77459335e-002, + 5.26575372e-003, 1.35833159e-001, 7.42807910e-002, + -4.46265727e-001, -8.77772942e-002, 4.99511510e-001, + 1.59517944e-001, -5.88605963e-002, -1.48461219e-002, + 8.89199302e-002, 3.88230830e-002, 1.14193568e-002, + 1.38791231e-003, 1.51903238e-002, 4.59819380e-003, + 7.25835888e-003, -6.32820046e-003, 2.52129119e-002, + 1.46629997e-002, -8.27691182e-002, -1.75622460e-002, + 9.11385641e-002, 2.96891686e-002, -2.45597749e-003, + 1.00927777e-003, 8.76131468e-003, 4.57453355e-003, + -4.93178749e-003, -7.31408290e-005, 9.66112595e-003, + 4.68234764e-003, 1.61515512e-002, -5.03954897e-003, + 3.99988331e-002, 3.58376093e-002, -6.63255900e-003, + 4.89252619e-003, 3.74410823e-002, 2.93498393e-002, + 8.28131195e-003, 1.51007471e-003, 1.21374186e-002, + 4.97961044e-003, -6.65398017e-002, 1.59550458e-002, + 1.13623343e-001, 3.46256085e-002, 2.14014709e-001, + 1.61933750e-001, 3.55306000e-001, 2.51409173e-001, + -8.11822191e-002, 7.68863708e-002, 3.21733654e-001, + 1.67033285e-001, 4.53073718e-002, 5.10452082e-003, + 1.00489639e-001, 2.74773519e-002, -4.37942632e-002, + -3.40804062e-003, 8.89402777e-002, 3.37117650e-002, + 4.47437763e-002, -2.81216726e-002, 2.58164406e-001, + 3.49774599e-001, -6.39286637e-002, -1.23526208e-001, + 2.74275333e-001, 2.62451440e-001, 4.95370030e-002, + -5.71349263e-003, 9.66437012e-002, 3.21820118e-002, + 9.23754415e-004, 1.82924920e-003, 6.48164749e-003, + 6.67320564e-003, -6.10130373e-004, 3.79292890e-002, + 2.63262782e-002, 9.11339521e-002, -1.61599293e-002, + 4.68499735e-002, 4.48870510e-002, 9.57465619e-002, + 1.15937192e-003, -8.37466447e-004, 8.09020270e-003, + 7.40146637e-003, -2.62043846e-004, 1.00936498e-002, + 5.11721009e-003, 1.35020781e-002, -2.92811450e-002, + 1.01758987e-001, 3.77682410e-002, 1.11194298e-001, + -1.13735469e-002, 6.41069934e-002, 2.58408673e-002, + 7.99148679e-002, 7.27974519e-004, 2.39935541e-003, + 3.63809220e-003, 7.04846019e-003, 2.07270309e-002, + -1.25295352e-002, 2.95236260e-002, 4.57613282e-002, + -2.07316922e-003, -2.93783378e-002, 1.31984964e-001, + 3.91419083e-001, -9.77345705e-002, 1.66298375e-001, + 1.79805458e-001, 5.54704130e-001, -3.15360092e-002, + 3.90634015e-002, 3.94621342e-002, 6.86925277e-002, + 1.09174149e-002, -2.15613022e-002, 2.34835073e-002, + 3.38322632e-002, 3.81164961e-002, -1.94510162e-001, + 1.09637350e-001, 2.57138491e-001, -1.36892227e-002, + -2.16829911e-001, 1.17310353e-001, 2.88594693e-001, + -2.49721631e-002, -2.77375318e-002, 3.44741754e-002, + 4.24770452e-002, -5.48975717e-004, -3.81111004e-003, + 3.38943605e-003, 5.85174467e-003, 2.41730642e-003, + -3.17363441e-002, 2.04946380e-002, 4.54392880e-002, + -4.35311580e-003, -3.56048420e-002, 2.22886987e-002, + 4.47486006e-002, -7.32227229e-004, -4.32862714e-003, + 3.51722399e-003, 6.16371445e-003, 2.97816121e-003, + 1.49872969e-003, 7.14136194e-003, 4.74884920e-003, + -2.45376732e-002, 2.87135486e-002, 4.19487022e-002, + 3.96280251e-002, -1.65858455e-002, 1.65805407e-002, + 3.48681137e-002, 3.43850926e-002, -2.08284915e-003, + 2.34739578e-004, 6.07172726e-003, 4.10529925e-003, + 5.35812639e-002, -7.81466160e-003, 6.65266737e-002, + 3.10774390e-002, -1.11255817e-001, 1.07682750e-001, + 2.56251693e-001, 1.86541095e-001, -1.38894022e-001, + 2.09005207e-001, 2.19032422e-001, 2.56047845e-001, + -4.34675775e-002, 1.31105436e-002, 5.83447777e-002, + 3.14093567e-002, 3.78959365e-002, -3.46550904e-002, + 5.54147437e-002, 4.74134497e-002, 1.34141728e-001, + -3.22357714e-001, 2.24988431e-001, 3.87486458e-001, + -1.34002790e-001, -1.53068766e-001, 2.38351449e-001, + 3.32072198e-001, -5.05038798e-002, -9.94181726e-003, + 6.60036951e-002, 3.84027623e-002, -8.47181189e-004, + 3.59772122e-004, 4.80589224e-003, 5.27808676e-003, + 8.12687539e-003, -2.05225106e-002, 3.02825719e-002, + 4.68006879e-002, 1.68419885e-003, -3.36409286e-002, + 3.16737518e-002, 5.48659228e-002, -1.54406461e-003, + -8.36964638e-004, 5.65440999e-003, 5.47827827e-003, + 3.00389202e-003, -3.06106318e-004, 5.14835073e-003, + 3.02027981e-003, 1.08462451e-002, 7.43671134e-003, + 2.71571334e-002, 1.74016990e-002, -2.43979711e-002, + 8.50206241e-003, 7.44743273e-002, 1.83573831e-002, + -8.00927542e-003, -6.14359917e-004, 1.11945905e-002, + 2.86742463e-003, 3.28906700e-002, -1.61029063e-002, + 4.35687043e-002, 2.74938829e-002, 9.10242498e-002, + -1.10601801e-002, 1.68122098e-001, 9.89660993e-002, + -1.29666388e-001, 2.39968225e-002, 4.92402226e-001, + 1.00435413e-001, -8.03612247e-002, 1.31913612e-003, + 1.00387573e-001, 2.01334953e-002, 2.37573069e-002, + -3.17599438e-002, 4.23502102e-002, 3.98889296e-002, + 2.23776594e-001, -2.20729858e-001, 2.73362547e-001, + 2.54373699e-001, -5.18934689e-002, -6.52114153e-002, + 4.68709916e-001, 1.45166174e-001, -9.58235189e-002, + 7.99281523e-003, 1.11666873e-001, 2.11845301e-002, + -1.39860599e-003, -2.96385551e-005, 4.89919307e-003, + 4.07125708e-003, 3.74374166e-002, -3.08716018e-002, + 4.93756905e-002, 4.39082533e-002, 1.43590383e-002, + -4.02882919e-002, 6.35192096e-002, 4.96096760e-002, + -1.03798257e-002, 6.58471254e-004, 1.26773585e-002, + 4.19083657e-003, 1.97935943e-003, -3.44666303e-003, + 6.54494623e-003, 7.27041019e-003, 1.13139413e-002, + -8.11877325e-002, 4.89027761e-002, 9.53832939e-002, + 5.05181216e-002, -7.91750625e-002, 6.72292486e-002, + 9.49235186e-002, 3.99956596e-004, 6.22697757e-004, + 5.42188901e-003, 5.40932221e-003, -1.96601469e-002, + -1.16167329e-002, 3.91390398e-002, 2.99727656e-002, + -5.87646589e-002, -9.81272236e-002, 1.56825334e-001, + 1.80357799e-001, 4.74902958e-001, -1.99814215e-001, + 4.99063253e-001, 2.82205552e-001, 3.64755429e-002, + -3.81739102e-002, 6.49431571e-002, 5.22781722e-002, + -2.28802413e-002, -7.20346812e-004, 3.82376574e-002, + 2.37834360e-002, -3.97987962e-002, 9.55879129e-003, + 1.24405347e-001, 1.10679835e-001, 1.28395125e-001, + -1.15691483e-001, 2.02092052e-001, 2.04338461e-001, + 6.84544817e-002, -5.39530963e-002, 8.23058784e-002, + 6.97960779e-002, -1.53873605e-003, -2.94656144e-004, + 4.20436403e-003, 3.45851947e-003, -5.08013275e-003, + 1.07644657e-002, 2.08901092e-002, 2.44327486e-002, + 7.64348172e-003, 1.45210959e-002, 2.41600592e-002, + 2.71458272e-002, 5.41709270e-003, -6.15599449e-004, + 7.94671569e-003, 5.98494662e-003, 4.65579651e-004, + -4.41344164e-004, 4.85925190e-003, 4.49044490e-003, + -1.43764904e-002, -3.29540707e-002, 3.48185636e-002, + 4.77364026e-002, 1.36153838e-002, -3.15263122e-002, + 3.32035907e-002, 4.66542169e-002, 2.46289768e-004, + -3.09562049e-004, 4.26112721e-003, 4.29023243e-003, + -3.63339745e-002, -3.41698453e-002, 5.31568117e-002, + 4.65337932e-002, -1.70916304e-001, -2.85818875e-001, + 2.51899332e-001, 3.40039730e-001, 1.82642981e-001, + -2.67032534e-001, 2.41203398e-001, 3.23687077e-001, + 3.51611078e-002, -3.36484201e-002, 4.85713854e-002, + 4.57657948e-002, -4.70421165e-002, -2.58738827e-003, + 5.88250794e-002, 3.73075008e-002, 2.67620571e-002, + 1.86962336e-001, 1.94747463e-001, 2.49060169e-001, + 2.20354274e-002, 2.06460759e-001, 1.73167154e-001, + 2.60169595e-001, 4.17118333e-002, 3.83001473e-003, + 5.19390628e-002, 3.56087275e-002, -1.66220951e-003, + 1.55541569e-003, 6.27521239e-003, 5.39341057e-003, + 1.44354226e-002, 2.59734448e-002, 3.86290587e-002, + 4.35895063e-002, -5.58670470e-003, 2.35421956e-002, + 3.47469486e-002, 4.16458435e-002, 1.27607642e-003, + 1.25204143e-003, 5.58253936e-003, 5.11964597e-003, + -8.79896805e-003, 1.32707029e-003, 1.58960950e-002, + 6.95422990e-003, -8.09610821e-003, -1.52166253e-002, + 4.37026769e-002, 6.16802536e-002, 1.29686494e-003, + -1.02687422e-002, 4.49863002e-002, 6.10742122e-002, + -7.77885201e-004, 2.18779128e-003, 5.62580070e-003, + 7.27037154e-003, -1.16848961e-001, -3.62931471e-003, + 1.82427138e-001, 4.29307297e-002, -2.06548311e-002, + 5.08054718e-002, 2.59953439e-001, 4.73318636e-001, + 5.84108531e-002, -5.12373745e-002, 2.48354018e-001, + 2.62310624e-001, 1.96785182e-002, -2.14768834e-002, + 4.71662357e-002, 4.73994240e-002, -1.12921819e-001, + -7.33608287e-003, 1.82605147e-001, 4.41734903e-002, + 6.26856983e-002, -2.98760533e-002, 2.77407527e-001, + 3.34598958e-001, -4.76339906e-002, 4.63109314e-002, + 2.02058733e-001, 2.07075343e-001, 9.82822292e-003, + 6.93875831e-003, 3.57035361e-002, 3.84088606e-002, + -5.53745404e-003, 2.68868520e-003, 1.64885707e-002, + 9.69096273e-003, 1.54967129e-003, 5.56757748e-002, + 4.89524864e-002, 7.89220929e-002, 1.04932196e-003, + 5.74533790e-002, 3.26015465e-002, 8.21767896e-002, + 1.67489704e-003, 7.95653462e-003, 4.17469302e-003, + 1.08131645e-002, -2.78737396e-003, 1.87240040e-003, + 6.72812341e-003, 3.79101816e-003, -2.39625107e-002, + -9.98353958e-003, 4.42876220e-002, 2.60762703e-002, + 4.79949219e-003, -1.28846345e-002, 2.97820233e-002, + 2.79311668e-002, 3.31939384e-003, 5.44925046e-004, + 6.80438196e-003, 4.41580685e-003, -2.87333485e-002, + 2.51034624e-003, 5.40246814e-002, 2.17476021e-002, + -2.03958690e-001, 1.50280371e-002, 3.31114501e-001, + 1.56416982e-001, 6.33608848e-002, 4.85296808e-002, + 2.15028211e-001, 1.53501630e-001, 4.10871096e-002, + 2.13674530e-002, 6.18381985e-002, 3.58793773e-002, + -3.77763584e-002, -8.23731709e-004, 5.85008599e-002, + 2.22142860e-002, -6.24908246e-002, 3.08758672e-002, + 3.90569985e-001, 1.64647862e-001, 9.42505449e-002, + 1.39041662e-001, 5.43623686e-001, 2.21617579e-001, + 3.05598676e-002, 2.31016688e-002, 6.78352788e-002, + 3.71151343e-002, -4.70380578e-003, -6.42093364e-004, + 7.52448570e-003, 3.37966997e-003, -1.29945902e-003, + 1.84150226e-002, 5.70950843e-002, 3.54518704e-002, + 2.25953553e-002, 1.83126777e-002, 7.86346644e-002, + 3.78185399e-002, 1.10629352e-003, -1.16096344e-003, + 7.71018956e-003, 4.49743588e-003, -8.45809642e-004, + -4.56593325e-003, 6.13682158e-003, 9.68991034e-003, + -3.31893377e-003, -5.80651648e-002, 3.85785662e-002, + 8.72055590e-002, -3.07695544e-003, -6.47175014e-002, + 3.73481028e-002, 9.16496739e-002, 1.93981477e-003, + -4.58307983e-003, 8.82959273e-003, 9.92925558e-003, + -3.08368262e-002, -2.25585233e-002, 4.86216135e-002, + 4.17394117e-002, -1.15440533e-001, -2.36366421e-001, + 2.02344060e-001, 2.92098999e-001, 4.87179607e-002, + -2.28496403e-001, 1.85947210e-001, 2.93665767e-001, + 6.05125651e-002, -1.30459424e-002, 8.14412534e-002, + 4.30663303e-002, -3.56248729e-002, 2.13223509e-002, + 5.39118722e-002, 5.02406061e-002, -1.71931773e-001, + 1.28153414e-001, 2.40247846e-001, 3.11559170e-001, + 7.53823817e-002, 5.04223369e-002, 2.24586472e-001, + 2.67523140e-001, 6.48993030e-002, 1.22191280e-003, + 8.47725943e-002, 4.28443365e-002, 2.42244045e-004, + 6.35466911e-003, 6.81659766e-003, 1.19800055e-002, + -1.48605043e-002, 1.03433132e-001, 4.57069650e-002, + 1.38330221e-001, -1.17139947e-002, 1.18388183e-001, + 4.55854647e-002, 1.46206930e-001, 2.53734039e-003, + 7.75874546e-003, 9.19829775e-003, 1.30278040e-002, + -4.60278883e-004, 1.80898991e-004, 4.59211180e-003, + 3.18889972e-003, -2.51087565e-002, -2.82430407e-002, + 4.62506078e-002, 4.46346812e-002, 2.67560012e-003, + -3.89389060e-002, 3.45505066e-002, 5.71106039e-002, + 5.85017515e-005, -1.72228087e-003, 5.07401209e-003, + 6.05732249e-003, -2.02398822e-002, -6.66680094e-003, + 4.46861386e-002, 2.40154602e-002, -2.76327342e-001, + -1.28294885e-001, 3.82719606e-001, 2.57636011e-001, + 1.24548286e-001, 3.85902897e-002, 2.17263803e-001, + 3.23281407e-001, 1.62646864e-002, -8.28004035e-004, + 3.73357981e-002, 4.15418074e-002, -2.80726869e-002, + -1.35913130e-003, 5.04260696e-002, 2.30060630e-002, + -2.22478181e-001, 1.40157342e-002, 3.78087491e-001, + 1.80817455e-001, 1.00551195e-001, -1.10080399e-001, + 2.00790122e-001, 2.49718189e-001, 1.75035521e-002, + -1.10985646e-002, 3.73217836e-002, 3.72580178e-002, + -3.62777687e-003, -1.46768708e-003, 7.27092242e-003, + 3.68944323e-003, -2.66007371e-002, 1.41701773e-002, + 4.92532589e-002, 3.30297463e-002, 4.54383111e-003, + 1.69439558e-002, 2.94590667e-002, 3.35752517e-002, + 1.24395418e-003, -1.09734072e-004, 4.71779518e-003, + 4.46122373e-003, -3.63622396e-003, -7.52761168e-003, + 1.32953888e-002, 1.62517913e-002, -1.77829847e-004, + -1.03208624e-001, 5.05455844e-002, 1.55822262e-001, + -2.33560093e-002, -8.16735104e-002, 3.86324599e-002, + 1.33025229e-001, 1.96353602e-003, -7.72255100e-003, + 5.17343637e-003, 1.46187674e-002, -1.23140708e-001, + 5.71334325e-002, 1.73660502e-001, 1.00092813e-001, + -3.02082151e-002, -1.17621869e-001, 1.72237575e-001, + 2.59130329e-001, -4.09268215e-002, -1.38341516e-001, + 1.43492833e-001, 2.44333208e-001, 1.83457993e-002, + -1.26208737e-002, 3.36469449e-002, 3.47530544e-002, + -1.63730621e-001, -2.72463076e-002, 2.09712967e-001, + 1.08281694e-001, -9.21715349e-002, -4.68866229e-002, + 2.51610160e-001, 3.55649918e-001, 1.08303331e-001, + 9.22282934e-002, 2.11930439e-001, 2.23428234e-001, + 2.09839568e-002, 3.68121713e-002, 3.69850770e-002, + 4.60800603e-002, -9.07868263e-004, 4.14665509e-003, + 1.68643482e-002, 2.57156193e-002, -6.55339211e-002, + 1.42212629e-001, 1.11357175e-001, 1.93707287e-001, + 1.46038085e-002, 4.46341895e-002, 4.82161902e-002, + 7.85841569e-002, 3.05223628e-004, 7.60014169e-004, + 5.78378653e-003, 8.15208256e-003, 6.32282638e-004, + -3.44030734e-004, 9.84863006e-003, 1.87262408e-002, + -2.75156777e-002, -1.26734376e-001, 4.86639589e-002, + 2.79387534e-001, 7.24973343e-003, -2.03455016e-001, + 4.54863906e-002, 3.56008738e-001, -1.53053214e-003, + -2.75175553e-002, 1.18604740e-002, 3.73181142e-002, + -3.94964330e-002, -8.31912160e-002, 7.03688562e-002, + 9.80356187e-002, -1.74284831e-001, -1.71088547e-001, + 2.55501658e-001, 3.21338028e-001, 8.52759257e-002, + -3.30499373e-002, 1.42558530e-001, 1.63774282e-001, + 5.24554700e-002, -9.10147559e-004, 5.95341288e-002, + 3.71854715e-002, -3.75895202e-002, 6.56894967e-002, + 6.55314103e-002, 8.60054046e-002, -1.65891096e-001, + 1.77704766e-001, 2.29466915e-001, 2.80774266e-001, + 4.49911058e-002, 4.60568666e-002, 1.15966320e-001, + 1.50826842e-001, 4.19541188e-002, -3.75478342e-003, + 4.75504361e-002, 2.83611864e-002, -3.25990841e-003, + 3.73824936e-004, 1.09981820e-002, 1.00738900e-002, + -3.31190787e-002, 5.39920293e-002, 5.08198254e-002, + 8.26826915e-002, -1.38692455e-002, 5.84070422e-002, + 3.48113067e-002, 7.19625130e-002, 1.70690566e-003, + 2.95558549e-003, 5.47475135e-003, 7.00620236e-003, + -9.51632333e-004, 3.05814971e-003, 5.85853728e-003, + 5.11475746e-003, -5.50816162e-003, -8.52752104e-003, + 1.59340706e-002, 1.71644893e-002, 1.12753420e-004, + -3.23723978e-003, 8.75148084e-003, 1.10054966e-002, + 1.75363198e-003, 1.20790594e-003, 2.39717588e-003, + 2.14242726e-003, -1.43323511e-001, 1.19436577e-001, + 1.59776643e-001, 1.30729213e-001, -4.92475443e-002, + 4.53563593e-002, 1.57589376e-001, 1.47728160e-001, + -1.91188534e-003, -5.71616401e-004, 9.34194252e-002, + 6.31112084e-002, 3.25649343e-002, 1.60832461e-002, + 3.69622968e-002, 2.19526701e-002, -1.61799163e-001, + -4.02335599e-002, 2.26066187e-001, 2.18820453e-001, + -1.72192425e-001, 2.04100296e-001, 3.30163896e-001, + 3.93756688e-001, 3.21903005e-002, 7.30957761e-002, + 1.82238325e-001, 1.34330928e-001, 3.82908694e-002, + 9.32848919e-003, 4.91716638e-002, 2.21791100e-002, + 4.29221475e-003, -4.56765527e-003, 2.28333622e-002, + 2.67047789e-002, -4.95903008e-002, 1.68924138e-001, + 1.72732159e-001, 2.93685883e-001, -6.38587922e-002, + 7.84180388e-002, 8.69291052e-002, 8.73902738e-002, + 6.70213427e-004, 3.07535799e-003, 6.63654599e-003, + 6.47347420e-003, -9.48659703e-003, 9.88898100e-004, + 1.32084386e-002, 3.91233806e-003, -1.40818479e-002, + -2.14675106e-002, 5.78392819e-002, 3.53172645e-002, + 1.07272081e-002, -2.82468945e-002, 4.32438776e-002, + 4.67266887e-002, -1.50360318e-003, -1.69740862e-003, + 4.84234188e-003, 5.32143703e-003, -6.73240125e-002, + 6.91981940e-003, 9.06102061e-002, 2.34094430e-002, + -2.98551291e-001, -2.12404225e-002, 3.80563617e-001, + 1.45018995e-001, 3.96468900e-002, -1.59373194e-001, + 1.47702768e-001, 2.05682978e-001, 1.31122768e-002, + -1.63738541e-002, 3.09394542e-002, 3.01608834e-002, + -4.98071164e-002, -1.83456088e-003, 7.41054788e-002, + 2.53728852e-002, -3.73858899e-001, 9.49815661e-002, + 4.13251460e-001, 1.80096403e-001, 2.50923224e-002, + 1.29744306e-001, 1.29008472e-001, 1.99848905e-001, + 1.78568680e-002, 1.29578104e-002, 3.15309241e-002, + 3.12272720e-002, -3.26213473e-003, 1.08027412e-003, + 7.54996808e-003, 6.60314271e-003, -1.61480177e-002, + 7.69173801e-002, 5.69744408e-002, 1.18018620e-001, + 1.23269472e-003, 1.07515253e-001, 4.60283570e-002, + 1.68176785e-001, -1.58447679e-003, 1.06169870e-002, + 5.39008435e-003, 1.80412848e-002, -1.06958745e-004, + -4.11127367e-005, 4.06554854e-003, 1.82961824e-003, + 8.81348923e-003, -4.89858771e-003, 2.28288323e-002, + 1.52036641e-002, 2.55309846e-002, -9.27345920e-003, + 4.85627577e-002, 2.43004002e-002, 1.61810834e-002, + 4.42358991e-003, 1.97329596e-002, 7.65402196e-003, + -4.18204902e-004, -4.22479026e-003, 2.10555270e-002, + 1.82035323e-002, 9.65647176e-002, 1.89343709e-002, + 1.82346329e-001, 1.11893706e-001, 1.84631243e-001, + 6.99327663e-002, 3.05250973e-001, 1.49323389e-001, + 1.56915814e-001, 1.31559940e-002, 1.98027343e-001, + 3.95078622e-002, -6.95450325e-003, 9.53957718e-003, + 2.42782980e-002, 2.48330068e-002, 1.90998331e-001, + 1.06283598e-001, 2.35000759e-001, 1.87965244e-001, + 1.26191929e-001, 2.97340062e-002, 4.18037474e-001, + 2.05303028e-001, 1.63620293e-001, 1.70715712e-003, + 2.29321048e-001, 4.06452529e-002, 1.76643569e-003, + 1.78027451e-002, 4.84835310e-003, 2.88087036e-002, + 1.69785470e-002, 1.34138286e-001, 4.27183062e-002, + 2.11746648e-001, -9.80927516e-003, 1.30767912e-001, + 5.76723814e-002, 2.09538862e-001, 1.36687253e-002, + 2.11192737e-003, 2.09472682e-002, 1.79477092e-002, + 1.16040872e-003, 1.33494462e-003, 3.40848137e-003, + 5.87707665e-003, 1.56783048e-004, 3.25802751e-002, + 2.33185012e-002, 5.16500138e-002, -6.36090199e-003, + 4.40624692e-002, 2.45456100e-002, 5.94937578e-002, + -1.95751223e-003, 3.00365197e-003, 5.17215207e-003, + 7.09456950e-003, 2.69283298e-002, 8.73602228e-004, + 3.44321206e-002, 3.50231789e-002, 5.07614650e-002, + -1.81544945e-002, 1.47568047e-001, 2.80271441e-001, + -1.42789811e-001, -1.95928171e-001, 2.12737724e-001, + 4.36290294e-001, -4.45560515e-002, -3.83493379e-002, + 5.28454743e-002, 6.23363219e-002, 1.65820550e-002, + -3.30091082e-002, 3.59518602e-002, 4.25840542e-002, + 4.33693640e-002, -2.42866516e-001, 1.69373989e-001, + 3.13166112e-001, -2.42014423e-001, -1.36343166e-001, + 2.88455635e-001, 2.84032106e-001, -2.90495828e-002, + -1.52056571e-002, 4.09855284e-002, 3.99911366e-002, + -1.56023225e-003, -2.32894463e-003, 4.48975572e-003, + 6.01907400e-003, 9.52217029e-004, -4.06646319e-002, + 2.70428304e-002, 5.42452075e-002, -1.28469290e-002, + -4.41030674e-002, 2.49584615e-002, 5.30830398e-002, + -3.95661802e-004, -1.05626381e-003, 3.63892363e-003, + 4.24063392e-003, 2.75456434e-004, 3.86284199e-003, + 4.10470366e-003, 6.67211926e-003, -9.24688578e-003, + 4.05570604e-002, 2.79692803e-002, 5.46062849e-002, + -6.54421654e-003, 2.77421921e-002, 2.60822419e-002, + 4.71791066e-002, 7.45561614e-004, 1.25583669e-003, + 3.56624555e-003, 5.48089854e-003, 3.37802581e-002, + 4.16765781e-003, 4.13915142e-002, 3.93010825e-002, + 2.17163060e-002, 2.04369068e-001, 1.45332158e-001, + 2.61830032e-001, -1.17930442e-001, 2.90553868e-001, + 1.68974444e-001, 3.18677038e-001, -2.00734455e-002, + 3.46109308e-002, 3.17750350e-002, 4.54578027e-002, + 2.72881258e-002, -5.08222543e-002, 4.13771085e-002, + 5.98933809e-002, 2.42593899e-001, -3.66635174e-001, + 2.73789495e-001, 3.90594572e-001, -7.15945894e-003, + -1.10689305e-001, 1.46518320e-001, 1.88646600e-001, + -2.23192014e-002, 1.47561997e-003, 3.07221301e-002, + 2.90843453e-002, -1.05089345e-003, 9.17182188e-004, + 3.88170639e-003, 4.30825539e-003, 2.90645473e-002, + -2.05615740e-002, 4.14606556e-002, 4.12905551e-002, + 2.58888584e-002, -4.18852568e-002, 4.05224375e-002, + 5.06710149e-002, -2.28926598e-004, -2.99873250e-003, + 3.97398276e-003, 5.16920770e-003, -2.04847296e-004, + -2.66932114e-003, 3.87112726e-003, 6.25491701e-003, + -2.76621291e-003, -3.54945995e-002, 2.97561195e-002, + 5.48025593e-002, -1.07928633e-003, -4.07627076e-002, + 2.51836181e-002, 6.01492897e-002, 1.38693152e-003, + -1.85922929e-003, 4.80087195e-003, 5.71877509e-003, + -1.59829780e-002, -4.58126655e-004, 3.46194059e-002, + 3.39114964e-002, -2.65541635e-002, 2.26086956e-002, + 1.70555204e-001, 2.29228571e-001, 8.93885717e-002, + 1.99362725e-001, 1.75448924e-001, 3.54962736e-001, + 2.09707916e-002, 3.17102820e-002, 4.00461033e-002, + 5.75318821e-002, -1.97488442e-002, 1.90699585e-002, + 4.20336463e-002, 5.27260341e-002, -6.35360777e-002, + 4.43950407e-002, 2.10707441e-001, 4.52969730e-001, + 1.76394910e-001, -1.44012138e-001, 2.54477084e-001, + 3.82407904e-001, 2.05584206e-002, -1.20654069e-002, + 4.26462516e-002, 4.69137914e-002, -4.01910074e-004, + -9.86050218e-005, 4.51852940e-003, 6.91884430e-003, + -1.43256122e-002, 2.37194020e-002, 3.34734395e-002, + 5.86244650e-002, -9.00373212e-004, 3.16223614e-002, + 3.23653519e-002, 5.76433130e-002, 2.21734215e-003, + 1.22592074e-003, 5.35870716e-003, 5.83042251e-003, + -4.24872991e-003, 5.70317090e-004, 7.07844272e-003, + 4.30849101e-003, 2.74533909e-002, -2.79171765e-002, + 6.61220625e-002, 3.73843834e-002, 2.06158403e-002, + -2.14061905e-002, 4.67597395e-002, 3.42280865e-002, + -6.52693037e-004, -6.55997312e-004, 4.60550468e-003, + 3.93938133e-003, -4.97170016e-002, 9.26639419e-003, + 6.36371076e-002, 2.87748408e-002, 8.48205090e-002, + -7.67726079e-002, 4.56829935e-001, 1.85688138e-001, + 9.50200036e-002, -2.20760435e-001, 2.75151849e-001, + 2.80119240e-001, 2.45736111e-002, -2.13910826e-002, + 3.96631472e-002, 3.66083160e-002, -2.75792684e-002, + 1.12015940e-002, 4.88307737e-002, 2.92126294e-002, + -2.15318501e-001, 1.40586361e-001, 3.73289734e-001, + 2.20551118e-001, 1.22988999e-001, -4.44618464e-002, + 2.18036503e-001, 1.81989387e-001, 2.96242628e-002, + -8.22033547e-003, 4.09173518e-002, 3.17489132e-002, + -3.82822298e-004, -8.47593124e-004, 5.05193509e-003, + 3.50557314e-003, -3.61695364e-002, 1.91900209e-002, + 5.30442968e-002, 3.41191106e-002, 4.03171685e-003, + 1.94641501e-002, 3.74366827e-002, 3.30065340e-002, + 2.28554662e-003, -7.84028307e-005, 5.19632269e-003, + 4.47154604e-003, 1.46820012e-003, -1.59915781e-003, + 6.48016855e-003, 5.93817700e-003, 2.59448085e-002, + -3.83874029e-002, 5.86754754e-002, 5.94361387e-002, + 6.41462440e-003, -6.83029965e-002, 4.67450358e-002, + 7.83665255e-002, 1.94308360e-003, -1.65849912e-003, + 5.17800963e-003, 5.37444139e-003, -1.94522180e-002, + -7.78504508e-003, 4.29268293e-002, 3.77309732e-002, + 5.46585657e-002, -2.56222606e-001, 2.75912046e-001, + 3.13981175e-001, 1.76513165e-001, -1.50953904e-001, + 3.24262947e-001, 2.27317512e-001, 4.29966077e-002, + -1.86384842e-002, 5.92762828e-002, 3.58936451e-002, + -1.97716132e-002, 1.08652152e-002, 4.50229049e-002, + 3.55333202e-002, 4.25924314e-003, 8.82187635e-002, + 2.74907351e-001, 1.89079121e-001, 2.63736755e-001, + 1.42668441e-001, 3.17199260e-001, 2.47643560e-001, + 3.48071977e-002, 1.24665508e-002, 5.46741001e-002, + 3.91902700e-002, 2.00515162e-004, -1.65050988e-005, + 6.19086344e-003, 4.78535797e-003, 5.68040647e-003, + 2.27136165e-002, 4.80661169e-002, 4.08665389e-002, + 4.17510942e-002, 1.86616536e-002, 5.43286987e-002, + 4.55168299e-002, 1.39400433e-003, -1.36151619e-004, + 5.92752779e-003, 6.04055636e-003, 3.95962968e-004, + 7.51584477e-004, 3.93527932e-003, 5.30162267e-003, + -2.98725395e-003, 1.32810129e-002, 2.70998608e-002, + 5.53422756e-002, -7.21727684e-003, 1.30236102e-002, + 2.74868831e-002, 5.39796352e-002, -4.23419027e-004, + 2.10318700e-004, 4.23532166e-003, 5.23283612e-003, + 4.69921436e-003, -2.96816137e-003, 3.59262861e-002, + 3.56009007e-002, 8.17939406e-004, -5.16731925e-002, + 1.72580257e-001, 3.36938232e-001, -6.30593076e-002, + -9.36082304e-002, 1.81982428e-001, 5.17933965e-001, + -8.49689357e-003, -7.64974300e-003, 3.51192914e-002, + 5.29414229e-002, 5.78917470e-003, 1.12878270e-002, + 3.80113721e-002, 3.09340116e-002, 4.46310416e-002, + 1.70171499e-001, 2.03360379e-001, 2.77898997e-001, + -1.67313397e-001, 1.75547093e-001, 2.36085281e-001, + 3.13985020e-001, -4.91442764e-003, 5.16349589e-003, + 3.24448012e-002, 3.32316868e-002, 6.30123541e-004, + 4.90393395e-005, 4.38194862e-003, 3.91706685e-003, + 5.83796715e-003, -9.49508045e-003, 2.83928420e-002, + 3.89802046e-002, -2.02545617e-002, -6.37643086e-003, + 3.75449955e-002, 4.33449708e-002, -1.27945025e-003, + 1.35534687e-003, 4.34910739e-003, 4.56487993e-003, + 3.72425467e-003, -4.43414273e-003, 7.77760334e-003, + 1.07558127e-002, -1.82005931e-002, -6.13081194e-002, + 3.94846126e-002, 8.79138112e-002, -2.08626762e-002, + -6.45509437e-002, 5.21939807e-002, 8.24112222e-002, + 8.10296088e-003, -4.81933035e-004, 1.89025626e-002, + 7.75385462e-003, -7.67646683e-003, -4.85253483e-002, + 2.96577998e-002, 5.68284728e-002, -7.13000298e-002, + -3.11135083e-001, 1.34485409e-001, 3.73482376e-001, + 3.81336175e-002, -2.04295799e-001, 2.05763236e-001, + 2.66556442e-001, 1.59922034e-001, 3.66240530e-003, + 2.31272280e-001, 4.55969088e-002, -9.49852820e-003, + 1.19118951e-002, 2.40164045e-002, 3.16817872e-002, + -5.41711925e-003, 1.08325019e-001, 9.09401178e-002, + 1.98508725e-001, 1.36691242e-001, 1.83469325e-001, + 2.49760211e-001, 2.40791962e-001, 1.20359629e-001, + -4.00019437e-003, 1.95433423e-001, 4.42303084e-002, + 3.90562724e-004, 1.09927654e-002, 6.21494930e-003, + 1.33439349e-002, 5.27119264e-003, 9.07220021e-002, + 4.08466831e-002, 1.07175283e-001, 4.92540095e-003, + 6.36320412e-002, 5.17148711e-002, 8.50694478e-002, + 3.17349378e-003, -1.89534866e-003, 1.66676659e-002, + 8.16792902e-003, 1.03956796e-002, -1.35210517e-003, + 2.09612623e-002, 7.23763136e-003, 3.38469632e-002, + 1.56964045e-002, 5.03984243e-002, 2.91587450e-002, + -1.22667123e-002, 1.47512099e-002, 2.78307274e-002, + 3.14304978e-002, -1.59350522e-002, -2.68975203e-003, + 2.05153208e-002, 8.40161089e-003, 1.38985097e-001, + -3.03798951e-002, 1.82761014e-001, 6.30058572e-002, + 2.65795857e-001, -8.44465010e-003, 3.33757192e-001, + 1.05665118e-001, -1.20891549e-001, -5.41507499e-003, + 2.09117219e-001, 9.76893380e-002, -1.74074695e-001, + -2.95424853e-002, 2.01780483e-001, 5.94180450e-002, + 1.53584644e-001, 3.18393894e-002, 1.93329602e-001, + 5.73856421e-002, 2.40615651e-001, 1.17450003e-002, + 3.19325447e-001, 1.11526959e-001, -2.18351483e-001, + -3.37283909e-002, 3.17335993e-001, 1.06643900e-001, + -1.47603452e-001, -4.70431615e-003, 1.97119623e-001, + 4.27883230e-002, 1.67372692e-002, 3.81291588e-003, + 2.22299714e-002, 8.45205877e-003, 2.33051665e-002, + -5.77816973e-003, 4.65625226e-002, 2.28337385e-002, + -4.55655046e-002, -1.52117638e-002, 6.62005544e-002, + 2.89952420e-002, -7.22252904e-003, 5.27536729e-003, + 1.93973426e-002, 7.76726613e-003, -5.78009337e-003, + 2.01173898e-004, 7.99467135e-003, 3.86811537e-003, + -1.36355858e-003, -1.64525565e-002, 3.59169059e-002, + 3.22358645e-002, 1.88792087e-002, -1.30560389e-002, + 3.61784101e-002, 3.32219824e-002, 7.51598086e-003, + 7.53957953e-004, 1.00500016e-002, 4.58367495e-003, + -9.04834494e-002, 1.19813522e-002, 1.02172814e-001, + 3.19397449e-002, 8.92588049e-002, 2.98850201e-002, + 2.38249913e-001, 1.61262110e-001, 7.17349946e-002, + 5.21193519e-002, 3.15499365e-001, 1.83947906e-001, + 8.01235586e-002, 2.29765922e-002, 1.00068919e-001, + 3.87772545e-002, -1.10929698e-001, 6.90261554e-003, + 1.26438722e-001, 2.68867239e-002, 1.73499852e-001, + 1.19525110e-002, 3.52442265e-001, 1.50942683e-001, + 1.27283096e-001, 1.12200290e-001, 5.10628939e-001, + 2.26510704e-001, 6.03162423e-002, 1.54473502e-002, + 9.15090889e-002, 3.00240312e-002, -8.90333764e-003, + -4.89351223e-004, 1.31063517e-002, 5.74123021e-003, + 1.73923522e-002, 2.85008829e-002, 5.85607402e-002, + 4.89346087e-002, 4.25645821e-002, 3.60783786e-002, + 7.88349807e-002, 5.39999679e-002, 1.31129415e-003, + -2.05039838e-003, 8.49770103e-003, 5.08160191e-003, + 1.68967396e-002, -1.86649314e-003, 2.51586866e-002, + 5.12996502e-003, 4.26695272e-002, 7.53701199e-003, + 5.29758669e-002, 1.70898326e-002, 2.13146466e-003, + 2.43817829e-003, 1.52253043e-002, 1.01721995e-002, + -3.20324954e-003, -3.57783487e-004, 5.03244856e-003, + 2.40695663e-003, 1.69839576e-001, -7.95013562e-004, + 2.18068823e-001, 2.53918488e-002, 2.41887301e-001, + 4.04369598e-003, 3.16819757e-001, 8.58440325e-002, + -1.79993967e-003, -2.51091365e-002, 1.29746065e-001, + 8.31235498e-002, -3.81218903e-002, -1.40201217e-002, + 5.11188209e-002, 2.51677204e-002, 1.64095685e-001, + 1.57723036e-002, 2.07330078e-001, 4.07269336e-002, + 1.81588039e-001, -5.41595295e-002, 3.55763316e-001, + 1.38410226e-001, -1.07141204e-001, -2.79901326e-001, + 3.44485909e-001, 3.17845017e-001, -3.51869985e-002, + -3.34844887e-002, 6.06423318e-002, 4.68460582e-002, + 1.61979739e-002, 2.99819658e-004, 2.21219566e-002, + 7.43346382e-003, -1.14767384e-002, -3.66641581e-002, + 7.54754767e-002, 5.30073568e-002, -2.96219345e-002, + -3.74110937e-002, 1.10603034e-001, 7.44454339e-002, + -1.29279186e-004, -2.14673649e-003, 7.89303333e-003, + 8.00702162e-003, -3.55816708e-004, -1.50433439e-003, + 4.59379423e-003, 5.23783499e-003, -2.33323826e-003, + -3.27579677e-002, 3.06847580e-002, 4.67499457e-002, + 5.33228973e-003, -3.54385898e-002, 2.90634800e-002, + 5.18598855e-002, 8.63337365e-004, -1.70802569e-003, + 4.40308126e-003, 6.62777852e-003, -2.27029156e-002, + -5.08074416e-003, 3.62944938e-002, 3.26981880e-002, + -4.36918363e-002, -4.22718301e-002, 1.41438663e-001, + 1.77678466e-001, 6.29486367e-002, -1.12537127e-002, + 1.38767585e-001, 1.90983772e-001, 3.17224599e-002, + 2.28672405e-003, 4.05708551e-002, 3.84939462e-002, + -2.91046239e-002, 2.24299207e-002, 4.36065793e-002, + 3.98995355e-002, 1.18336238e-001, 2.41921604e-001, + 2.73072749e-001, 2.95843273e-001, 9.26279128e-002, + 4.51798916e-001, 1.98908940e-001, 4.80067849e-001, + 2.61726547e-002, 5.50267398e-002, 4.07138467e-002, + 6.33226782e-002, 3.50724353e-004, 3.58919124e-003, + 6.19273540e-003, 6.34760922e-003, 3.42590399e-002, + 4.78516221e-002, 5.61500676e-002, 5.90546578e-002, + 1.17663024e-002, 2.06441898e-002, 2.99468134e-002, + 3.94999124e-002, -1.55315665e-003, 6.88949309e-004, + 3.93471401e-003, 4.64997813e-003, 1.63442467e-003, + 2.95321170e-005, 6.29084883e-003, 3.40910489e-003, + -5.54669369e-003, 1.87315997e-002, 6.59035891e-002, + 3.43432948e-002, -9.63128451e-003, 8.10372457e-003, + 4.81005348e-002, 3.40096280e-002, -1.26962186e-005, + 3.40588391e-004, 5.89704653e-003, 3.25475330e-003, + 1.30542722e-002, -5.74512733e-003, 4.47737053e-002, + 2.15008724e-002, 9.82614756e-002, 3.99350040e-002, + 4.76026267e-001, 1.80224180e-001, -7.09339753e-002, + 2.27731615e-001, 3.15481544e-001, 2.87112623e-001, + -4.55164770e-003, 2.24314667e-002, 5.43553233e-002, + 4.02581692e-002, 1.60799157e-002, 5.35508245e-003, + 4.33185212e-002, 2.18553450e-002, 2.01845080e-001, + -3.38387340e-002, 3.35197806e-001, 1.38259128e-001, + -8.52973387e-002, -1.15432523e-001, 3.26655835e-001, + 2.27457777e-001, 2.19760004e-005, -2.09443271e-003, + 5.60991839e-002, 3.98828313e-002, 1.33511249e-003, + 1.60573551e-003, 5.02931420e-003, 4.22474789e-003, + 1.51154287e-002, -1.82561893e-002, 3.63222770e-002, + 2.97271889e-002, -1.09784286e-002, -5.50341979e-003, + 4.59549427e-002, 3.57262753e-002, 1.35616574e-003, + 1.80393326e-005, 6.85231434e-003, 4.29489464e-003, + -3.87540698e-004, -1.21334707e-003, 3.56191816e-003, + 4.04055510e-003, -6.94740005e-003, -1.33861471e-002, + 2.18328107e-002, 2.47714855e-002, 5.88611932e-003, + -1.71522051e-002, 2.78736912e-002, 2.90805176e-002, + 1.07136380e-004, -6.36112643e-004, 5.72867785e-003, + 4.87936987e-003, -2.05542725e-002, 4.85821441e-003, + 3.24027464e-002, 2.47700382e-002, -4.43100706e-002, + -2.35706754e-002, 1.21578172e-001, 1.33094594e-001, + -1.56875211e-003, -1.83015224e-002, 1.43429279e-001, + 1.42815530e-001, 2.61236038e-002, 6.18480891e-003, + 4.20159139e-002, 3.25707905e-002, -1.96352396e-002, + 2.93479096e-002, 3.91125008e-002, 5.11396080e-002, + -4.19350490e-002, 2.80603319e-001, 1.76231831e-001, + 3.54079664e-001, 6.90405890e-002, 3.80391985e-001, + 2.66267151e-001, 4.48893487e-001, 4.19376865e-002, + 6.58913404e-002, 7.14671984e-002, 8.02744478e-002, + 7.14503322e-003, 1.44220646e-002, 1.09569039e-002, + 1.86987333e-002, 1.19617330e-002, 1.69201970e-001, + 5.19076325e-002, 1.88433617e-001, -1.20836608e-002, + 1.15993723e-001, 7.76311830e-002, 1.48149401e-001, + 4.60873616e-006, 7.80100469e-003, 1.08162640e-002, + 1.35300197e-002, -1.65956952e-002, -1.05176208e-004, + 2.37145033e-002, 1.06512429e-002, 6.42464822e-003, + -1.09732293e-001, 6.18760176e-002, 1.36166126e-001, + 1.60135124e-002, -1.15996115e-001, 5.19592650e-002, + 1.47797063e-001, -2.21228879e-003, -8.40728730e-003, + 7.64017273e-003, 1.57120451e-002, -2.08527610e-001, + 1.02868769e-003, 2.57042944e-001, 3.63462567e-002, + -1.47033274e-001, -9.35699120e-002, 3.18281353e-001, + 1.99234828e-001, 1.66236445e-001, -1.41909987e-001, + 2.32330620e-001, 2.45344937e-001, 2.01718528e-002, + -1.82803795e-002, 4.53983620e-002, 4.28916886e-002, + -1.96952820e-001, -4.51093633e-003, 2.43210554e-001, + 3.12291924e-002, -1.82069749e-001, 3.60700116e-002, + 2.99091697e-001, 1.33812740e-001, 1.25085369e-001, + 3.07240733e-003, 1.94483534e-001, 1.30060270e-001, + 2.47059409e-002, -6.26065861e-003, 4.07871008e-002, + 2.76664756e-002, -2.16882396e-002, -1.12653791e-003, + 2.76190583e-002, 5.61413821e-003, -2.69233901e-002, + 2.07597148e-002, 4.90357503e-002, 3.55397351e-002, + 9.21619777e-003, 1.61829293e-002, 2.86486205e-002, + 3.26148681e-002, 2.12422176e-003, 2.99327658e-004, + 5.10174176e-003, 4.58301185e-003, -1.21163540e-002, + 1.33775186e-003, 1.90636329e-002, 9.47875530e-003, + 1.19037256e-002, -1.11554854e-001, 6.74166679e-002, + 1.61656603e-001, -1.58893708e-002, -1.45345420e-001, + 2.55185310e-002, 1.84868887e-001, -1.87297573e-003, + -1.49160735e-002, 4.37914394e-003, 2.04330329e-002, + -1.49251938e-001, -2.41759187e-003, 1.85905248e-001, + 2.36241166e-002, -1.57711819e-001, 6.78215921e-002, + 2.96772271e-001, 2.21132755e-001, -7.96178728e-002, + 2.60447524e-002, 1.60538003e-001, 1.96851432e-001, + 5.75255556e-003, -4.81809489e-003, 1.58622488e-002, + 2.48918477e-002, -1.55509591e-001, -3.12824431e-003, + 1.89418837e-001, 2.23425534e-002, -5.51562831e-002, + 1.96764506e-002, 3.97690088e-001, 2.21783236e-001, + -2.13397771e-001, -1.61662400e-002, 2.81198800e-001, + 1.39237493e-001, 2.37127906e-003, -5.62586309e-003, + 1.77115314e-002, 1.65733397e-002, -1.79207493e-002, + -2.10354148e-004, 2.17294190e-002, 6.76144427e-003, + -1.47840362e-002, 3.64527255e-002, 5.39730266e-002, + 8.92421007e-002, -2.46494580e-002, 4.56240401e-002, + 4.06830870e-002, 8.87427926e-002, -1.11297111e-003, + 5.02921594e-003, 4.13622102e-003, 7.69458339e-003, + 6.03095919e-004, -1.64646807e-003, 5.50510548e-003, + 5.77050261e-003, -2.37975991e-003, -2.25906521e-002, + 3.99322845e-002, 4.37904671e-002, -1.11798802e-002, + -2.70714797e-002, 3.85185927e-002, 4.25030962e-002, + 2.36566062e-003, -1.29049714e-003, 5.65338461e-003, + 5.56803821e-003, -2.41542011e-002, -2.13644654e-003, + 4.40126546e-002, 4.14218046e-002, 3.57227633e-003, + -1.63788661e-001, 2.03056350e-001, 2.45629057e-001, + -1.52587462e-002, -7.81229064e-002, 1.83228180e-001, + 1.83430910e-001, 3.77829373e-002, 4.84122476e-003, + 4.78067808e-002, 3.46608013e-002, -2.55100932e-002, + 4.25828546e-002, 5.26129119e-002, 5.81378974e-002, + -1.06171280e-001, 2.03854904e-001, 3.36379170e-001, + 3.21810961e-001, 1.98300734e-001, 2.96181023e-001, + 2.80671179e-001, 3.65335971e-001, 3.01200524e-002, + 4.74735387e-002, 4.73317206e-002, 5.81393503e-002, + 4.97959147e-004, 9.25677246e-004, 6.12848951e-003, + 5.52322203e-003, -6.98977010e-003, 5.05447388e-002, + 5.19849211e-002, 6.31082058e-002, 2.44418308e-002, + 3.74043286e-002, 4.41478118e-002, 5.20016588e-002, + -9.15296841e-004, 3.32925963e-004, 4.63333167e-003, + 4.71677538e-003, 5.03763848e-004, -1.98037736e-003, + 3.89940687e-003, 4.55256272e-003, -4.74891439e-003, + -3.37945446e-002, 2.23623011e-002, 4.41325083e-002, + -1.02991343e-003, -3.29208039e-002, 2.03422830e-002, + 4.48409244e-002, -5.42168214e-004, -2.88935774e-003, + 2.96523725e-003, 5.25953015e-003, -2.25743614e-002, + -2.00079326e-002, 3.75576131e-002, 3.59028988e-002, + -9.04465988e-002, -2.42162660e-001, 1.78084910e-001, + 3.04124355e-001, 3.02551836e-002, -2.46823534e-001, + 1.30629212e-001, 3.04035693e-001, 9.65639018e-003, + -3.23390178e-002, 2.18496658e-002, 4.57231142e-002, + -2.91546639e-002, 8.89243092e-003, 4.73579057e-002, + 4.03394438e-002, -1.55873299e-001, 3.40573164e-003, + 2.83408970e-001, 3.65057826e-001, 8.14642608e-002, + 6.87353611e-002, 1.58431977e-001, 4.33598638e-001, + 1.31028593e-002, 1.53033426e-002, 2.70468947e-002, + 5.51502816e-002, -1.72201777e-003, 9.69781773e-004, + 5.64512191e-003, 5.11924876e-003, 1.50232029e-003, + 4.48125750e-002, 4.31459099e-002, 5.96158206e-002, + 1.10494606e-002, 4.08019386e-002, 3.12549621e-002, + 5.84650859e-002, -8.80992156e-004, 3.41142761e-003, + 3.92990513e-003, 6.76693860e-003, -1.77282825e-004, + 2.11524288e-003, 5.02387993e-003, 4.27929033e-003, + 1.21628735e-002, 4.76827957e-002, 3.08492519e-002, + 5.84773906e-002, 1.09726505e-003, 4.36249934e-002, + 3.13689150e-002, 5.67705780e-002, -1.40541885e-003, + 1.83197716e-003, 5.84754301e-003, 5.19265467e-003, + 2.82555595e-002, 1.82185192e-002, 5.05466759e-002, + 2.70346794e-002, 2.21898168e-001, 1.89916298e-001, + 2.88308471e-001, 2.60601372e-001, -1.10854115e-002, + 2.88052410e-001, 3.06724578e-001, 3.36208403e-001, + -7.00653866e-002, 1.68290436e-002, 8.52186680e-002, + 3.73817757e-002, 3.85530554e-002, 7.85385072e-003, + 5.89552782e-002, 2.03490499e-002, 1.62852913e-001, + -1.38437254e-002, 2.40799472e-001, 1.20453589e-001, + 7.16571659e-002, -3.60217653e-002, 3.90250564e-001, + 1.39951289e-001, -8.85554403e-002, -3.47383873e-004, + 1.06367908e-001, 2.59297565e-002, 4.34431061e-003, + 9.67808417e-004, 7.29547394e-003, 3.41833103e-003, + 1.71017591e-002, -5.56934625e-003, 3.18434015e-002, + 2.17110403e-002, 2.61576683e-003, -1.68814231e-002, + 5.22397645e-002, 2.86835730e-002, -8.42118077e-003, + 5.20810660e-004, 1.21328514e-002, 3.78960138e-003, + 1.71909895e-004, 3.86715183e-005, 3.93724116e-003, + 2.61972775e-003, 3.39045934e-002, 2.03350149e-002, + 4.36919928e-002, 2.94427928e-002, 1.26175079e-002, + 3.28411683e-002, 5.44092506e-002, 3.84182893e-002, + -4.37767524e-003, 2.12742554e-004, 7.31271366e-003, + 3.37915961e-003, 1.78026576e-002, 1.50541468e-002, + 3.37259807e-002, 2.48233993e-002, 3.17163497e-001, + 1.95933238e-001, 3.65726113e-001, 2.33875200e-001, + -4.01799493e-002, 6.19501770e-002, 3.72328758e-001, + 1.47367761e-001, -4.44300584e-002, -9.96230752e-004, + 6.02653846e-002, 2.18826942e-002, 3.97152603e-002, + 2.25214195e-002, 4.93190698e-002, 3.50312665e-002, + 2.05640063e-001, 1.37335777e-001, 2.66468793e-001, + 2.28158310e-001, -2.07307637e-001, -5.19851744e-002, + 3.11397880e-001, 1.43373057e-001, -3.31479870e-002, + -1.03028084e-003, 5.23997843e-002, 2.36013234e-002, + 4.38164128e-003, 9.46603192e-004, 6.41561113e-003, + 4.46594507e-003, 8.69522151e-003, -2.30209772e-002, + 3.15758474e-002, 3.55651937e-002, -2.76942756e-002, + -2.30062995e-002, 4.22632955e-002, 3.45785022e-002, + -1.67984248e-003, 1.02275889e-003, 5.86266210e-003, + 3.83741548e-003, 1.06833398e-003, 8.31702142e-004, + 4.46159812e-003, 5.47010731e-003, 5.84147265e-003, + 2.32155938e-002, 2.79954877e-002, 5.29279970e-002, + -7.92615116e-003, 2.13255994e-002, 2.81974301e-002, + 4.80505899e-002, -6.78965880e-004, -1.71891457e-004, + 3.70869739e-003, 4.53552464e-003, 1.74840093e-002, + 1.48181280e-003, 3.73642482e-002, 4.35668826e-002, + 1.10922463e-001, -5.16277067e-002, 2.11941466e-001, + 3.69832605e-001, -8.03550109e-002, 8.04162025e-002, + 2.35196128e-001, 2.54111171e-001, -1.99878439e-002, + 1.01381959e-002, 4.04158384e-002, 3.01622953e-002, + 1.68773178e-002, 4.53998102e-003, 3.82013060e-002, + 5.40724397e-002, 6.11022338e-002, 3.93857658e-002, + 1.99431419e-001, 4.96222377e-001, -3.54067632e-003, + -4.67355512e-002, 3.25032413e-001, 3.08213621e-001, + -2.72595100e-002, -5.85700013e-003, 4.61108647e-002, + 3.43926884e-002, 6.01105276e-004, -1.05728942e-003, + 4.60903952e-003, 6.36796979e-003, 3.05198715e-003, + -2.53695697e-002, 3.06176562e-002, 6.04950376e-002, + 3.16481735e-003, -2.21901201e-002, 3.95245142e-002, + 5.49951717e-002, -9.73760267e-004, -4.29980253e-004, + 4.83027287e-003, 5.27476426e-003, 5.04804682e-003, + 6.47991954e-004, 1.07677486e-002, 4.26651724e-003, + -7.55437277e-003, 1.62067972e-002, 2.97986399e-002, + 2.23787092e-002, -1.61217190e-002, 1.06618404e-002, + 3.94266807e-002, 1.82856806e-002, -6.76109083e-003, + -3.69132613e-004, 8.87269620e-003, 2.48449296e-003, + 8.18506628e-002, -1.73311532e-002, 1.05233200e-001, + 3.76114473e-002, -1.22961245e-001, 7.18732104e-002, + 2.98008978e-001, 1.58466205e-001, -1.45222247e-001, + -3.37675889e-003, 2.55448133e-001, 1.03757843e-001, + -5.30952103e-002, -3.58974445e-003, 6.56032115e-002, + 1.77445952e-002, 5.06028868e-002, -1.59144606e-002, + 8.43386054e-002, 3.63386869e-002, -2.65045511e-003, + -2.86469907e-002, 5.60987830e-001, 2.87762076e-001, + -2.21051499e-001, -1.10654160e-002, 3.03568840e-001, + 1.22553244e-001, -4.68913652e-002, -2.01055710e-003, + 6.24820217e-002, 1.68039557e-002, -9.47138178e-004, + 1.63554843e-003, 9.31480713e-003, 4.58995253e-003, + 4.04534228e-002, -3.71799693e-002, 8.47432986e-002, + 5.47914840e-002, -4.47790213e-002, -8.22508708e-003, + 6.29075766e-002, 3.35442983e-002, -4.23039263e-003, + 5.45016192e-005, 7.50059122e-003, 3.43044568e-003, + 7.25447608e-004, 8.74210309e-005, 3.77529557e-003, + 3.87979066e-003, 3.71844098e-002, 2.55364291e-002, + 4.76887785e-002, 4.29058783e-002, 2.09468380e-002, + 3.02380361e-002, 3.67543139e-002, 4.18252982e-002, + 1.60014592e-004, 1.41307514e-003, 3.57161369e-003, + 4.07247525e-003, 2.12622937e-002, 1.95101406e-002, + 3.80740166e-002, 3.53576466e-002, 3.38091195e-001, + 1.32450700e-001, 3.74272048e-001, 2.87900686e-001, + 3.99416313e-002, 6.15144670e-002, 1.55863822e-001, + 1.70051992e-001, -1.36197377e-002, 5.69877727e-003, + 2.42585130e-002, 2.35735998e-002, 4.33196947e-002, + 1.83566697e-002, 5.20903841e-002, 6.29108325e-002, + 1.36462674e-001, 3.05237118e-002, 2.09854364e-001, + 4.79015440e-001, -2.34015957e-002, -1.15609109e-001, + 1.29263312e-001, 2.78856277e-001, -1.09239360e-002, + -1.39875803e-002, 2.47610994e-002, 3.40635553e-002, + 1.39705651e-003, -4.14768001e-003, 4.44820290e-003, + 8.05130880e-003, 8.42157938e-003, -5.25054634e-002, + 2.69808453e-002, 7.81298131e-002, 1.00707803e-002, + -4.98191491e-002, 2.59159803e-002, 7.51152560e-002, + 1.21403753e-003, -4.37847758e-003, 3.48692713e-003, + 8.14371835e-003, -7.45446980e-003, 7.53172091e-004, + 1.18006170e-002, 8.19007587e-003, -1.77534427e-002, + -7.69834369e-002, 4.90998589e-002, 1.36281639e-001, + 7.77797401e-003, -8.84587541e-002, 4.09714356e-002, + 1.63971245e-001, 1.31307112e-003, -5.07162558e-003, + 8.65323003e-003, 1.59333348e-002, -1.10161684e-001, + -1.61198480e-003, 1.25741154e-001, 2.98139434e-002, + -2.73430794e-001, -2.39487900e-003, 3.60573500e-001, + 2.69833118e-001, 3.79244015e-002, -1.67110432e-002, + 2.30266839e-001, 3.36761743e-001, 4.32565659e-002, + -4.95251827e-003, 7.51781911e-002, 4.67584208e-002, + -1.22001179e-001, -8.53351410e-003, 1.36428341e-001, + 2.39765216e-002, -1.80863574e-001, -4.57492564e-003, + 2.90991604e-001, 1.27592847e-001, 3.28647159e-002, + 3.23180817e-002, 2.84825146e-001, 1.32859722e-001, + 3.13459411e-002, 6.57503167e-003, 6.93409666e-002, + 2.90808715e-002, -1.56216063e-002, -1.90001994e-003, + 1.85412411e-002, 4.06023208e-003, -2.13752631e-002, + 5.39143942e-003, 4.14301828e-002, 2.55589038e-002, + 1.10799680e-002, 8.94335005e-003, 4.04287949e-002, + 2.81401016e-002, 2.23116414e-003, 2.98713094e-005, + 8.90087802e-003, 4.23161499e-003, 1.19911958e-004, + -1.41971430e-003, 4.19651624e-003, 4.80509549e-003, + 1.81745645e-003, -1.32776275e-002, 3.03254724e-002, + 5.08002676e-002, -5.40358620e-003, -1.63513105e-002, + 2.57856399e-002, 5.61693460e-002, -8.77005572e-004, + -2.21490324e-003, 3.97921726e-003, 5.51851699e-003, + -3.47679034e-002, -1.91733632e-002, 5.38248941e-002, + 5.49081750e-002, 1.07857876e-001, -2.09192529e-001, + 2.96756804e-001, 5.43811262e-001, -2.06370000e-002, + -1.48320481e-001, 1.75880060e-001, 3.45002979e-001, + 1.27882073e-002, -1.93475112e-002, 3.53497006e-002, + 3.96275632e-002, -2.39074137e-002, 4.35530581e-003, + 4.47298475e-002, 3.97503935e-002, 2.58627045e-003, + 8.13347548e-002, 2.01185912e-001, 2.56234080e-001, + 3.29468981e-003, -5.47402073e-003, 1.76366404e-001, + 2.68243164e-001, 1.66999660e-002, 5.98109793e-003, + 3.66247967e-002, 3.96916717e-002, -1.31595100e-003, + 2.03858232e-004, 4.66672145e-003, 4.47571604e-003, + 1.39705918e-003, 1.01884278e-002, 3.23548652e-002, + 3.76112275e-002, 2.37986399e-003, 1.39465192e-002, + 2.96727233e-002, 3.70467156e-002, 6.93258655e-004, + -6.71735761e-005, 3.84703744e-003, 5.20185195e-003, + 4.61869733e-003, -6.95251161e-004, 1.07208714e-002, + 5.85935498e-003, 3.84886935e-002, 1.70633234e-002, + 4.92920578e-002, 3.34134325e-002, 3.20927211e-004, + 1.13022663e-002, 1.81721486e-002, 2.01777611e-002, + -9.45114938e-004, 9.54437273e-005, 3.65193584e-003, + 2.93838815e-003, 5.91344833e-002, 2.21813247e-002, + 9.01662260e-002, 4.60916683e-002, 1.76128671e-001, + 7.54697770e-002, 2.34983593e-001, 1.54930055e-001, + -2.37480868e-002, 4.89273574e-003, 8.33520293e-002, + 8.48859921e-002, -1.66363306e-002, -3.28867027e-004, + 3.11390627e-002, 1.66322887e-002, 6.09279722e-002, + -2.72116736e-002, 8.13502297e-002, 7.55993277e-002, + 7.93766379e-002, -3.39807868e-001, 1.55834064e-001, + 4.42745358e-001, -4.67118574e-003, -2.91789830e-001, + 9.86690968e-002, 3.82649601e-001, -2.04385575e-002, + -3.64860743e-002, 3.62087414e-002, 5.38093261e-002, + 1.24119909e-003, -6.23045536e-003, 5.45891374e-003, + 2.23511606e-002, 4.61798813e-003, -7.58453906e-002, + 2.50383951e-002, 2.03459457e-001, 5.22784889e-003, + -9.50815901e-002, 2.34812573e-002, 2.15370387e-001, + 7.41192896e-004, -1.29826888e-002, 4.83357906e-003, + 2.80836020e-002, 6.44448213e-004, -1.76497304e-003, + 7.68008409e-003, 6.84937509e-003, -2.46213432e-002, + -7.37072527e-002, 6.05081730e-002, 8.60706121e-002, + 6.87361956e-002, -8.94910321e-002, 8.09561014e-002, + 1.06553979e-001, -2.86013680e-003, -4.04404430e-003, + 1.04707703e-002, 9.17548407e-003, -2.71323696e-002, + -5.18851429e-002, 5.74124977e-002, 6.39104769e-002, + -1.46437660e-001, -1.79545283e-001, 2.65271634e-001, + 2.53487021e-001, 1.58597514e-001, -2.51928270e-001, + 2.83516318e-001, 3.49722326e-001, 4.55268286e-002, + -9.33844820e-002, 7.29614943e-002, 1.08234249e-001, + -1.82391386e-002, 1.27363503e-002, 4.30315025e-002, + 5.11444882e-002, -8.09251219e-002, 5.44424318e-002, + 1.93828300e-001, 2.12206200e-001, 3.56442779e-002, + 1.13769427e-001, 1.87795296e-001, 3.37368309e-001, + 1.66967753e-002, 1.94460656e-002, 4.22576591e-002, + 6.56719506e-002, -1.23184186e-003, 3.62553913e-003, + 7.92597141e-003, 7.67818606e-003, -1.31269181e-002, + 4.74211127e-002, 6.14628829e-002, 7.34005868e-002, + 4.81148846e-002, 6.46985918e-002, 7.94393867e-002, + 9.02144760e-002, -3.80965136e-003, 6.40054699e-003, + 8.04995280e-003, 1.20394947e-002 ] diff --git a/samples/cpp/fabmap_sample.cpp b/samples/cpp/fabmap_sample.cpp new file mode 100644 index 000000000..a75a076d4 --- /dev/null +++ b/samples/cpp/fabmap_sample.cpp @@ -0,0 +1,197 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// This file originates from the openFABMAP project: +// [http://code.google.com/p/openfabmap/] +// +// For published work which uses all or part of OpenFABMAP, please cite: +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6224843] +// +// Original Algorithm by Mark Cummins and Paul Newman: +// [http://ijr.sagepub.com/content/27/6/647.short] +// [http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=5613942] +// [http://ijr.sagepub.com/content/30/9/1100.abstract] +// +// License Agreement +// +// Copyright (C) 2012 Arren Glover [aj.glover@qut.edu.au] and +// Will Maddern [w.maddern@qut.edu.au], all rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not 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 Intel Corporation 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. +// +//M*/ + + +#include "opencv2/opencv.hpp" +#include "opencv2/nonfree/nonfree.hpp" + +using namespace cv; +using namespace std; + +int main(int argc, char * argv[]) { + + cout << "This sample program demonstrates the FAB-MAP image matching " + "algorithm" << endl << endl; + + string dataDir; + if (argc == 1) { + dataDir = "fabmap/"; + } else if (argc == 2) { + dataDir = string(argv[1]); + dataDir += "/"; + } else { + //incorrect arguments + cout << "Usage: fabmap_sample " << + endl; + return -1; + } + + FileStorage fs; + + //load/generate vocab + cout << "Loading Vocabulary: " << + dataDir + string("vocab_small.yml") << endl << endl; + fs.open(dataDir + string("vocab_small.yml"), FileStorage::READ); + Mat vocab; + fs["Vocabulary"] >> vocab; + if (vocab.empty()) { + cerr << "Vocabulary not found" << endl; + return -1; + } + fs.release(); + + //load/generate training data + + cout << "Loading Training Data: " << + dataDir + string("train_data_small.yml") << endl << endl; + fs.open(dataDir + string("train_data_small.yml"), FileStorage::READ); + Mat trainData; + fs["BOWImageDescs"] >> trainData; + if (trainData.empty()) { + cerr << "Training Data not found" << endl; + return -1; + } + fs.release(); + + //create Chow-liu tree + cout << "Making Chow-Liu Tree from training data" << endl << + endl; + of2::ChowLiuTree treeBuilder; + treeBuilder.add(trainData); + Mat tree = treeBuilder.make(); + + //generate test data + cout << "Extracting Test Data from images" << endl << + endl; + Ptr detector = + new DynamicAdaptedFeatureDetector( + AdjusterAdapter::create("STAR"), 130, 150, 5); + Ptr extractor = + new SurfDescriptorExtractor(1000, 4, 2, false, true); + Ptr matcher = + DescriptorMatcher::create("FlannBased"); + + BOWImgDescriptorExtractor bide(extractor, matcher); + bide.setVocabulary(vocab); + + vector imageNames; + imageNames.push_back(string("stlucia_test_small0000.jpeg")); + imageNames.push_back(string("stlucia_test_small0001.jpeg")); + imageNames.push_back(string("stlucia_test_small0002.jpeg")); + imageNames.push_back(string("stlucia_test_small0003.jpeg")); + imageNames.push_back(string("stlucia_test_small0004.jpeg")); + imageNames.push_back(string("stlucia_test_small0005.jpeg")); + imageNames.push_back(string("stlucia_test_small0006.jpeg")); + imageNames.push_back(string("stlucia_test_small0007.jpeg")); + imageNames.push_back(string("stlucia_test_small0008.jpeg")); + imageNames.push_back(string("stlucia_test_small0009.jpeg")); + + Mat testData; + Mat frame; + Mat bow; + vector kpts; + + for(size_t i = 0; i < imageNames.size(); i++) { + cout << dataDir + imageNames[i] << endl; + frame = imread(dataDir + imageNames[i]); + if(frame.empty()) { + cerr << "Test images not found" << endl; + return -1; + } + + detector->detect(frame, kpts); + + bide.compute(frame, kpts, bow); + + testData.push_back(bow); + + drawKeypoints(frame, kpts, frame); + imshow(imageNames[i], frame); + waitKey(10); + } + + //run fabmap + cout << "Running FAB-MAP algorithm" << endl << + endl; + Ptr fabmap; + + fabmap = new of2::FabMap2(tree, 0.39, 0, of2::FabMap::SAMPLED | + of2::FabMap::CHOW_LIU); + fabmap->addTraining(trainData); + + vector matches; + fabmap->compare(testData, matches, true); + + //display output + Mat result_small = Mat::zeros(10, 10, CV_8UC1); + vector::iterator l; + + for(l = matches.begin(); l != matches.end(); l++) { + if(l->imgIdx < 0) { + result_small.at(l->queryIdx, l->queryIdx) = + (char)(l->match*255); + + } else { + result_small.at(l->queryIdx, l->imgIdx) = + (char)(l->match*255); + } + } + + Mat result_large(100, 100, CV_8UC1); + resize(result_small, result_large, Size(500, 500), 0, 0, CV_INTER_NN); + + imshow("Confusion Matrix", result_large); + waitKey(); + + cout << endl << "Press any key to exit" << endl; + + return 0; +} From 778c31a1c8d205ef959be9963ee5a45ad75126a1 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 3 Sep 2012 17:31:20 +0400 Subject: [PATCH 084/103] added SSE2-optimized boxfilter by Grigoriy Frolov --- modules/imgproc/src/smooth.cpp | 414 +++++++++++++++++++++++++++++++++ 1 file changed, 414 insertions(+) diff --git a/modules/imgproc/src/smooth.cpp b/modules/imgproc/src/smooth.cpp index 7b3fd6ea8..836f3ddbf 100644 --- a/modules/imgproc/src/smooth.cpp +++ b/modules/imgproc/src/smooth.cpp @@ -197,6 +197,420 @@ template struct ColumnSum : public BaseColumnFilter }; +template<> struct ColumnSum : public BaseColumnFilter +{ + ColumnSum( int _ksize, int _anchor, double _scale ) + { + ksize = _ksize; + anchor = _anchor; + scale = _scale; + sumCount = 0; + } + + void reset() { sumCount = 0; } + + void operator()(const uchar** src, uchar* dst, int dststep, int count, int width) + { + int i; + int* SUM; + bool haveScale = scale != 1; + double _scale = scale; + + #if CV_SSE2 + bool haveSSE2 = checkHardwareSupport(CV_CPU_SSE2); + #endif + + if( width != (int)sum.size() ) + { + sum.resize(width); + sumCount = 0; + } + + SUM = &sum[0]; + if( sumCount == 0 ) + { + memset((void*)SUM, 0, width*sizeof(int)); + for( ; sumCount < ksize - 1; sumCount++, src++ ) + { + const int* Sp = (const int*)src[0]; + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + for( ; i < width-4; i+=4 ) + { + __m128i _sum = _mm_loadu_si128((const __m128i*)(SUM+i)); + __m128i _sp = _mm_loadu_si128((const __m128i*)(Sp+i)); + _mm_storeu_si128((__m128i*)(SUM+i),_mm_add_epi32(_sum, _sp)); + } + } + #endif + for( ; i < width; i++ ) + SUM[i] += Sp[i]; + } + } + else + { + CV_Assert( sumCount == ksize-1 ); + src += ksize-1; + } + + for( ; count--; src++ ) + { + const int* Sp = (const int*)src[0]; + const int* Sm = (const int*)src[1-ksize]; + uchar* D = (uchar*)dst; + if( haveScale ) + { + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + const __m128 scale4 = _mm_set1_ps((float)_scale); + for( ; i < width-8; i+=8 ) + { + __m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i)); + __m128i _sm1 = _mm_loadu_si128((const __m128i*)(Sm+i+4)); + + __m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)), + _mm_loadu_si128((const __m128i*)(Sp+i))); + __m128i _s01 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i+4)), + _mm_loadu_si128((const __m128i*)(Sp+i+4))); + + __m128i _s0T = _mm_cvtps_epi32(_mm_mul_ps(scale4, _mm_cvtepi32_ps(_s0))); + __m128i _s0T1 = _mm_cvtps_epi32(_mm_mul_ps(scale4, _mm_cvtepi32_ps(_s01))); + + _s0T = _mm_packs_epi32(_s0T, _s0T1); + + _mm_storel_epi64((__m128i*)(D+i), _mm_packus_epi16(_s0T, _s0T)); + + _mm_storeu_si128((__m128i*)(SUM+i), _mm_sub_epi32(_s0,_sm)); + _mm_storeu_si128((__m128i*)(SUM+i+4),_mm_sub_epi32(_s01,_sm1)); + } + } + #endif + for( ; i < width; i++ ) + { + int s0 = SUM[i] + Sp[i]; + D[i] = saturate_cast(s0*_scale); + SUM[i] = s0 - Sm[i]; + } + } + else + { + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + for( ; i < width-8; i+=8 ) + { + __m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i)); + __m128i _sm1 = _mm_loadu_si128((const __m128i*)(Sm+i+4)); + + __m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)), + _mm_loadu_si128((const __m128i*)(Sp+i))); + __m128i _s01 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i+4)), + _mm_loadu_si128((const __m128i*)(Sp+i+4))); + + __m128i _s0T = _mm_packs_epi32(_s0, _s01); + + _mm_storel_epi64((__m128i*)(D+i), _mm_packus_epi16(_s0T, _s0T)); + + _mm_storeu_si128((__m128i*)(SUM+i), _mm_sub_epi32(_s0,_sm)); + _mm_storeu_si128((__m128i*)(SUM+i+4),_mm_sub_epi32(_s01,_sm1)); + } + } + #endif + + for( ; i < width; i++ ) + { + int s0 = SUM[i] + Sp[i]; + D[i] = saturate_cast(s0); + SUM[i] = s0 - Sm[i]; + } + } + dst += dststep; + } + } + + double scale; + int sumCount; + vector sum; +}; + +template<> struct ColumnSum : public BaseColumnFilter +{ + ColumnSum( int _ksize, int _anchor, double _scale ) + { + ksize = _ksize; + anchor = _anchor; + scale = _scale; + sumCount = 0; + } + + void reset() { sumCount = 0; } + + void operator()(const uchar** src, uchar* dst, int dststep, int count, int width) + { + int i; + int* SUM; + bool haveScale = scale != 1; + double _scale = scale; + + #if CV_SSE2 + bool haveSSE2 = checkHardwareSupport(CV_CPU_SSE2); + #endif + + if( width != (int)sum.size() ) + { + sum.resize(width); + sumCount = 0; + } + SUM = &sum[0]; + if( sumCount == 0 ) + { + memset((void*)SUM, 0, width*sizeof(int)); + for( ; sumCount < ksize - 1; sumCount++, src++ ) + { + const int* Sp = (const int*)src[0]; + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + for( ; i < width-4; i+=4 ) + { + __m128i _sum = _mm_loadu_si128((const __m128i*)(SUM+i)); + __m128i _sp = _mm_loadu_si128((const __m128i*)(Sp+i)); + _mm_storeu_si128((__m128i*)(SUM+i),_mm_add_epi32(_sum, _sp)); + } + } + #endif + for( ; i < width; i++ ) + SUM[i] += Sp[i]; + } + } + else + { + CV_Assert( sumCount == ksize-1 ); + src += ksize-1; + } + + for( ; count--; src++ ) + { + const int* Sp = (const int*)src[0]; + const int* Sm = (const int*)src[1-ksize]; + short* D = (short*)dst; + if( haveScale ) + { + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + const __m128 scale4 = _mm_set1_ps((float)_scale); + for( ; i < width-8; i+=8 ) + { + __m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i)); + __m128i _sm1 = _mm_loadu_si128((const __m128i*)(Sm+i+4)); + + __m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)), + _mm_loadu_si128((const __m128i*)(Sp+i))); + __m128i _s01 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i+4)), + _mm_loadu_si128((const __m128i*)(Sp+i+4))); + + __m128i _s0T = _mm_cvtps_epi32(_mm_mul_ps(scale4, _mm_cvtepi32_ps(_s0))); + __m128i _s0T1 = _mm_cvtps_epi32(_mm_mul_ps(scale4, _mm_cvtepi32_ps(_s01))); + + _mm_storeu_si128((__m128i*)(D+i), _mm_packs_epi32(_s0T, _s0T1)); + + _mm_storeu_si128((__m128i*)(SUM+i),_mm_sub_epi32(_s0,_sm)); + _mm_storeu_si128((__m128i*)(SUM+i+4), _mm_sub_epi32(_s01,_sm1)); + } + } + #endif + for( ; i < width; i++ ) + { + int s0 = SUM[i] + Sp[i]; + D[i] = saturate_cast(s0*_scale); + SUM[i] = s0 - Sm[i]; + } + } + else + { + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + for( ; i < width-8; i+=8 ) + { + + __m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i)); + __m128i _sm1 = _mm_loadu_si128((const __m128i*)(Sm+i+4)); + + __m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)), + _mm_loadu_si128((const __m128i*)(Sp+i))); + __m128i _s01 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i+4)), + _mm_loadu_si128((const __m128i*)(Sp+i+4))); + + _mm_storeu_si128((__m128i*)(D+i), _mm_packs_epi32(_s0, _s01)); + + _mm_storeu_si128((__m128i*)(SUM+i), _mm_sub_epi32(_s0,_sm)); + _mm_storeu_si128((__m128i*)(SUM+i+4),_mm_sub_epi32(_s01,_sm1)); + } + } + #endif + + for( ; i < width; i++ ) + { + int s0 = SUM[i] + Sp[i]; + D[i] = saturate_cast(s0); + SUM[i] = s0 - Sm[i]; + } + } + dst += dststep; + } + } + + double scale; + int sumCount; + vector sum; +}; + + +template<> struct ColumnSum : public BaseColumnFilter +{ + ColumnSum( int _ksize, int _anchor, double _scale ) + { + ksize = _ksize; + anchor = _anchor; + scale = _scale; + sumCount = 0; + } + + void reset() { sumCount = 0; } + + void operator()(const uchar** src, uchar* dst, int dststep, int count, int width) + { + int i; + int* SUM; + bool haveScale = scale != 1; + double _scale = scale; + #if CV_SSE2 + bool haveSSE2 = checkHardwareSupport(CV_CPU_SSE2); + #endif + + if( width != (int)sum.size() ) + { + sum.resize(width); + sumCount = 0; + } + SUM = &sum[0]; + if( sumCount == 0 ) + { + memset((void*)SUM, 0, width*sizeof(int)); + for( ; sumCount < ksize - 1; sumCount++, src++ ) + { + const int* Sp = (const int*)src[0]; + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + for( ; i < width-4; i+=4 ) + { + __m128i _sum = _mm_loadu_si128((const __m128i*)(SUM+i)); + __m128i _sp = _mm_loadu_si128((const __m128i*)(Sp+i)); + _mm_storeu_si128((__m128i*)(SUM+i), _mm_add_epi32(_sum, _sp)); + } + } + #endif + for( ; i < width; i++ ) + SUM[i] += Sp[i]; + } + } + else + { + CV_Assert( sumCount == ksize-1 ); + src += ksize-1; + } + + for( ; count--; src++ ) + { + const int* Sp = (const int*)src[0]; + const int* Sm = (const int*)src[1-ksize]; + ushort* D = (ushort*)dst; + if( haveScale ) + { + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + const __m128 scale4 = _mm_set1_ps((float)_scale); + const __m128i delta0 = _mm_set1_epi32(0x8000); + const __m128i delta1 = _mm_set1_epi32(0x80008000); + + for( ; i < width-4; i+=4) + { + __m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i)); + __m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)), + _mm_loadu_si128((const __m128i*)(Sp+i))); + + __m128i _res = _mm_cvtps_epi32(_mm_mul_ps(scale4, _mm_cvtepi32_ps(_s0))); + + _res = _mm_sub_epi32(_res, delta0); + _res = _mm_add_epi16(_mm_packs_epi16(_res, _res), delta1); + + _mm_storel_epi64((__m128i*)(D+i), _res); + _mm_storeu_si128((__m128i*)(SUM+i), _mm_sub_epi32(_s0,_sm)); + } + } + #endif + for( ; i < width; i++ ) + { + int s0 = SUM[i] + Sp[i]; + D[i] = saturate_cast(s0*_scale); + SUM[i] = s0 - Sm[i]; + } + } + else + { + i = 0; + #if CV_SSE2 + if(haveSSE2) + { + const __m128i delta0 = _mm_set1_epi32(0x8000); + const __m128i delta1 = _mm_set1_epi32(0x80008000); + + for( ; i < width-4; i+=4 ) + { + __m128i _sm = _mm_loadu_si128((const __m128i*)(Sm+i)); + __m128i _s0 = _mm_add_epi32(_mm_loadu_si128((const __m128i*)(SUM+i)), + _mm_loadu_si128((const __m128i*)(Sp+i))); + + __m128i _res = _mm_sub_epi32(_s0, delta0); + _res = _mm_add_epi16(_mm_packs_epi16(_res, _res), delta1); + + _mm_storel_epi64((__m128i*)(D+i), _res); + _mm_storeu_si128((__m128i*)(SUM+i), _mm_sub_epi32(_s0,_sm)); + } + } + #endif + + for( ; i < width; i++ ) + { + int s0 = SUM[i] + Sp[i]; + D[i] = saturate_cast(s0); + SUM[i] = s0 - Sm[i]; + } + } + dst += dststep; + } + } + + double scale; + int sumCount; + vector sum; +}; + + } cv::Ptr cv::getRowSumFilter(int srcType, int sumType, int ksize, int anchor) From c91850ec2ec8a3d2c22a7f71a171288909a2159d Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 3 Sep 2012 18:42:13 +0400 Subject: [PATCH 085/103] Fix executable and C objects linking --- android/android.toolchain.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index ece2c9dc6..35900b3de 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -989,13 +989,23 @@ endif() if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" ) set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o ") set( CMAKE_CXX_CREATE_SHARED_MODULE " -o ") + set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) if( EXISTS "${__libstl}" ) set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"") set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"") + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"") endif() if( EXISTS "${__libsupcxx}" ) set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"") set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"") + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"") + # C objects: + set( CMAKE_C_CREATE_SHARED_LIBRARY = " -o " ) + set( CMAKE_C_CREATE_SHARED_MODULE = " -o " ) + set( CMAKE_C_LINK_EXECUTABLE = " -o " ) + set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"") + set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"") + set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"") endif() endif() From ac808b51a5dcac5b91e129c11a56ac771b023795 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 3 Sep 2012 19:13:51 +0400 Subject: [PATCH 086/103] Fixing STL support in case of standalone toolchain --- android/android.toolchain.cmake | 46 ++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index 35900b3de..822a6df95 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -88,25 +88,32 @@ # none -> Do not configure the runtime. # system -> Use the default minimal system C++ runtime library. # Implies -fno-rtti -fno-exceptions. +# Is not available for standalone toolchain. # system_re -> Use the default minimal system C++ runtime library. # Implies -frtti -fexceptions. +# Is not available for standalone toolchain. # gabi++_static -> Use the GAbi++ runtime as a static library. # Implies -frtti -fno-exceptions. # Available for NDK r7 and newer. +# Is not available for standalone toolchain. # gabi++_shared -> Use the GAbi++ runtime as a shared library. # Implies -frtti -fno-exceptions. # Available for NDK r7 and newer. +# Is not available for standalone toolchain. # stlport_static -> Use the STLport runtime as a static library. # Implies -fno-rtti -fno-exceptions for NDK before r7. # Implies -frtti -fno-exceptions for NDK r7 and newer. +# Is not available for standalone toolchain. # stlport_shared -> Use the STLport runtime as a shared library. # Implies -fno-rtti -fno-exceptions for NDK before r7. # Implies -frtti -fno-exceptions for NDK r7 and newer. +# Is not available for standalone toolchain. # gnustl_static -> Use the GNU STL as a static library. # Implies -frtti -fexceptions. # gnustl_shared -> Use the GNU STL as a shared library. # Implies -frtti -fno-exceptions. # Available for NDK r7b and newer. +# Silently degrades to gnustl_static if not available. # # ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on # chosen runtime. If disabled, then the user is responsible for settings @@ -222,6 +229,8 @@ # [~] fixed mips linker flags for NDK r8b # - modified September 2012 # [+] added NDK release name detection (see ANDROID_NDK_RELEASE) +# [+] added support for all C++ runtimes from NDK +# (system, gabi++, stlport, gnustl) # ------------------------------------------------------------------------------ cmake_minimum_required( VERSION 2.6.3 ) @@ -494,7 +503,7 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN ) else() execute_process( COMMAND "${ANDROID_STANDALONE_TOOLCHAIN}/bin/${__availableToolchainMachines}-gcc${TOOL_OS_SUFFIX}" --version OUTPUT_VARIABLE __availableToolchainCompilerVersions OUTPUT_STRIP_TRAILING_WHITESPACE ) - string( REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" __availableToolchainCompilerVersions "${__availableToolchainCompilerVersions}" ) + string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?" __availableToolchainCompilerVersions "${__availableToolchainCompilerVersions}" ) endif() endif() @@ -510,7 +519,7 @@ if( BUILD_WITH_ANDROID_NDK ) foreach( __toolchain ${__availableToolchains} ) __DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK}/toolchains/${__toolchain}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" ) if( __machine ) - string( REGEX MATCH "[0-9]+[.][0-9]+[.]*[0-9]*$" __version "${__toolchain}" ) + string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?$" __version "${__toolchain}" ) string( REGEX MATCH "^[^-]+" __arch "${__toolchain}" ) list( APPEND __availableToolchainMachines "${__machine}" ) list( APPEND __availableToolchainArchs "${__arch}" ) @@ -708,6 +717,7 @@ endif() # runtime choice (STL, rtti, exceptions) if( NOT ANDROID_STL ) + # honor legacy ANDROID_USE_STLPORT if( DEFINED ANDROID_USE_STLPORT ) if( ANDROID_USE_STLPORT ) set( ANDROID_STL stlport_static ) @@ -722,8 +732,9 @@ set( ANDROID_STL "${ANDROID_STL}" CACHE STRING "C++ runtime" ) set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and exceptions support based on C++ runtime" ) mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES ) -if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$") - message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\". +if( BUILD_WITH_ANDROID_NDK ) + if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$") + message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\". The possible values are: none -> Do not configure the runtime. system -> Use the default minimal system C++ runtime library. @@ -734,7 +745,17 @@ The possible values are: stlport_shared -> Use the STLport runtime as a shared library. gnustl_static -> (default) Use the GNU STL as a static library. gnustl_shared -> Use the GNU STL as a shared library. - " ) +" ) + endif() +elseif( BUILD_WITH_STANDALONE_TOOLCHAIN ) + if( NOT "${ANDROID_STL}" MATCHES "^(none|gnustl_static|gnustl_shared)$") + message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\". +The possible values are: + none -> Do not configure the runtime. + gnustl_static -> (default) Use the GNU STL as a static library. + gnustl_shared -> Use the GNU STL as a shared library. +" ) + endif() endif() unset( ANDROID_RTTI ) @@ -822,11 +843,22 @@ endif() if( BUILD_WITH_STANDALONE_TOOLCHAIN ) set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" ) set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" ) + + if( NOT ANDROID_STL STREQUAL "none" ) + set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}" ) + if( ARMEABI_V7A AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" ) + list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" ) + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" ) + list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" ) + else() + list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" ) + endif() + endif() #set( __stlLibPath "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" ) #TODO: configure stl endif() - +# case of shared STL version if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl ) string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" ) get_filename_component( __libstlname "${__libstl}" NAME ) @@ -1067,7 +1099,7 @@ set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "linker flags" ) set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "linker flags" ) set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "linker flags" ) -include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} ) +include_directories( SYSTEM ${ANDROID_STL_INCLUDE_DIRS} ) #"${ANDROID_SYSROOT}/usr/include" link_directories( "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) # finish flags From a3125c0b8de20b00bfded81a2eb87a92851ec3d6 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 3 Sep 2012 20:58:14 +0400 Subject: [PATCH 087/103] Added C++ runtime search for standalone toolchain --- android/android.toolchain.cmake | 86 ++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index 822a6df95..82adbe9b7 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -813,9 +813,8 @@ if( BUILD_WITH_ANDROID_NDK ) else() message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" ) endif() - + # find libsupc++.a - rtti & exceptions if( ANDROID_STL STREQUAL "system_re" OR ANDROID_STL MATCHES "gnustl" ) - # find libsupc++.a if( ANDROID_NDK_RELEASE STRGREATER "r8" ) # r8b set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) elseif( NOT ANDROID_NDK_RELEASE STRLESS "r7" AND ANDROID_NDK_RELEASE STRLESS "r8b") @@ -853,21 +852,47 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN ) else() list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" ) endif() + # always search static GNU STL to get the location of libsupc++.a + if( ARMEABI_V7A AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb" ) + elseif( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}" ) + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb" ) + elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libstdc++.a" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" ) + endif() + if( __libstl ) + set( __libsupcxx "${__libstl}/libsupc++.a" ) + set( __libstl "${__libstl}/libstdc++.a" ) + endif() + if( NOT EXISTS "${__libsupcxx}" ) + message( FATAL_ERROR "TODO: missing stdsupc++ in NDK r7 error" ) + endif() + if( ANDROID_STL STREQUAL "gnustl_shared" ) + if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" ) + elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" ) + elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" ) + set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" ) + endif() + endif() endif() - #set( __stlLibPath "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" ) - #TODO: configure stl endif() -# case of shared STL version +# case of shared STL linkage if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl ) string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" ) - get_filename_component( __libstlname "${__libstl}" NAME ) - execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess ) - if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}") - message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" ) + if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" ) + get_filename_component( __libstlname "${__libstl}" NAME ) + execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess ) + if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}") + message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" ) + endif() + unset( __fileCopyProcess ) + unset( __libstlname ) endif() - unset( __fileCopyProcess ) - unset( __libstlname ) endif() # ccache support @@ -889,7 +914,7 @@ else() set( CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "gcc" ) set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "g++" ) endif() -set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "Assembler" ) +set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "assembler" ) if( CMAKE_VERSION VERSION_LESS 2.8.5 ) set( CMAKE_ASM_COMPILER_ARG1 "-c" ) endif() @@ -911,6 +936,9 @@ if( APPLE ) endif() # flags and definitions +remove_definitions( -DANDROID ) +add_definitions( -DANDROID ) + if(ANDROID_SYSROOT MATCHES "[ ;\"]") set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" ) if( NOT _CMAKE_IN_TRY_COMPILE ) @@ -921,9 +949,6 @@ else() set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" ) endif() -remove_definitions( -DANDROID ) -add_definitions( -DANDROID ) - # Force set compilers because standard identification works badly for us include( CMakeForceCompiler ) CMAKE_FORCE_C_COMPILER( "${CMAKE_C_COMPILER}" GNU ) @@ -1018,26 +1043,27 @@ elseif( X86 ) endif() # STL -if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" ) - set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o ") - set( CMAKE_CXX_CREATE_SHARED_MODULE " -o ") - set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) +if( 0 AND EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" ) + # use gcc as a C++ linker to avoid automatic picking of libsdtc++ + set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o ") + set( CMAKE_CXX_CREATE_SHARED_MODULE " -o ") + set( CMAKE_CXX_LINK_EXECUTABLE " -o " ) if( EXISTS "${__libstl}" ) set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"") set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"") - set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"") + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"") endif() if( EXISTS "${__libsupcxx}" ) set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"") set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"") - set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"") + set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"") # C objects: - set( CMAKE_C_CREATE_SHARED_LIBRARY = " -o " ) - set( CMAKE_C_CREATE_SHARED_MODULE = " -o " ) - set( CMAKE_C_LINK_EXECUTABLE = " -o " ) + set( CMAKE_C_CREATE_SHARED_LIBRARY " -o " ) + set( CMAKE_C_CREATE_SHARED_MODULE " -o " ) + set( CMAKE_C_LINK_EXECUTABLE " -o " ) set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"") set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"") - set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"") + set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"") endif() endif() @@ -1099,9 +1125,6 @@ set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "linker flags" ) set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "linker flags" ) set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "linker flags" ) -include_directories( SYSTEM ${ANDROID_STL_INCLUDE_DIRS} ) #"${ANDROID_SYSROOT}/usr/include" -link_directories( "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) - # finish flags set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Extra Android compiler flags" ) set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Extra Android linker flags" ) @@ -1137,6 +1160,13 @@ if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES ) endif() endif() +# global includes and link directories +if( ANDROID_STL_INCLUDE_DIRS ) + include_directories( SYSTEM ${ANDROID_STL_INCLUDE_DIRS} ) +endif() +link_directories( "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ) + + # set these global flags for cmake client scripts to change behavior set( ANDROID True ) set( BUILD_ANDROID True ) From 8f8a69d6f5f7b9a17f313dcb9d9ef6f3fe56a0be Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 4 Sep 2012 08:51:08 +0800 Subject: [PATCH 088/103] fix bug of ocl::canny --- modules/ocl/src/kernels/imgproc_canny.cl | 40 +++++++++++++----------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/modules/ocl/src/kernels/imgproc_canny.cl b/modules/ocl/src/kernels/imgproc_canny.cl index e32e92835..65df50858 100644 --- a/modules/ocl/src/kernels/imgproc_canny.cl +++ b/modules/ocl/src/kernels/imgproc_canny.cl @@ -100,15 +100,17 @@ __kernel __local int smem[16][18]; + smem[lidy][lidx + 1] = src[gidx + gidy * src_step + src_offset]; + if(lidx == 0) + { + smem[lidy][0] = src[max(gidx - 1, 0) + gidy * src_step + src_offset]; + smem[lidy][17] = src[min(gidx + 16, cols - 1) + gidy * src_step + src_offset]; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(gidy < rows) { - smem[lidy][lidx + 1] = src[gidx + gidy * src_step + src_offset]; - if(lidx == 0) - { - smem[lidy][0] = src[max(gidx - 1, 0) + gidy * src_step + src_offset]; - smem[lidy][17] = src[min(gidx + 16, cols - 1) + gidy * src_step + src_offset]; - } - barrier(CLK_LOCAL_MEM_FENCE); + if(gidx < cols) { dx_buf[gidx + gidy * dx_buf_step + dx_buf_offset] = @@ -168,21 +170,21 @@ __kernel __local int sdx[18][16]; __local int sdy[18][16]; + + sdx[lidy + 1][lidx] = dx_buf[gidx + gidy * dx_buf_step + dx_buf_offset]; + sdy[lidy + 1][lidx] = dy_buf[gidx + gidy * dy_buf_step + dy_buf_offset]; + if(lidy == 0) + { + sdx[0][lidx] = dx_buf[gidx + max(gidy - 1, 0) * dx_buf_step + dx_buf_offset]; + sdx[17][lidx] = dx_buf[gidx + min(gidy + 16, rows - 1) * dx_buf_step + dx_buf_offset]; + + sdy[0][lidx] = dy_buf[gidx + max(gidy - 1, 0) * dy_buf_step + dy_buf_offset]; + sdy[17][lidx] = dy_buf[gidx + min(gidy + 16, rows - 1) * dy_buf_step + dy_buf_offset]; + } + barrier(CLK_LOCAL_MEM_FENCE); if(gidx < cols) { - sdx[lidy + 1][lidx] = dx_buf[gidx + gidy * dx_buf_step + dx_buf_offset]; - sdy[lidy + 1][lidx] = dy_buf[gidx + gidy * dy_buf_step + dy_buf_offset]; - if(lidy == 0) - { - sdx[0][lidx] = dx_buf[gidx + max(gidy - 1, 0) * dx_buf_step + dx_buf_offset]; - sdx[17][lidx] = dx_buf[gidx + min(gidy + 16, rows - 1) * dx_buf_step + dx_buf_offset]; - - sdy[0][lidx] = dy_buf[gidx + max(gidy - 1, 0) * dy_buf_step + dy_buf_offset]; - sdy[17][lidx] = dy_buf[gidx + min(gidy + 16, rows - 1) * dy_buf_step + dy_buf_offset]; - } - barrier(CLK_LOCAL_MEM_FENCE); - if(gidy < rows) { int x = sdx[lidy][lidx] + 2 * sdx[lidy + 1][lidx] + sdx[lidy + 2][lidx]; From 457c8785383c89c766f613d8b581ec00ddd2a4d7 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Tue, 4 Sep 2012 10:39:44 +0400 Subject: [PATCH 089/103] Issue #2270 OpenCV Manager fails with JNI error fixed. Local reference table overflow in JNI code fixed. --- .../engine/jni/JNIWrapper/JavaBasedPackageManager.cpp | 11 +++++++++-- android/service/engine/jni/Tests/Tests.mk | 2 +- android/service/push_native.py | 0 android/service/test_native.py | 0 4 files changed, 10 insertions(+), 3 deletions(-) mode change 100644 => 100755 android/service/push_native.py mode change 100644 => 100755 android/service/test_native.py diff --git a/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp b/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp index 26b073a0a..a146b29bb 100644 --- a/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp +++ b/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp @@ -46,6 +46,7 @@ bool JavaBasedPackageManager::InstallPackage(const PackageInfo& package) LOGD("Calling java package manager with package name %s\n", package.GetFullName().c_str()); jobject jpkgname = jenv->NewStringUTF(package.GetFullName().c_str()); bool result = jenv->CallNonvirtualBooleanMethod(JavaPackageManager, jclazz, jmethod, jpkgname); + jenv->DeleteLocalRef(jpkgname); if (self_attached) { @@ -99,10 +100,14 @@ vector JavaBasedPackageManager::GetInstalledPackages() { jobject jtmp = jenv->GetObjectArrayElement(jpkgs, i); PackageInfo tmp = ConvertPackageFromJava(jtmp, jenv); + jenv->DeleteLocalRef(jtmp); + if (tmp.IsValid()) result.push_back(tmp); } + jenv->DeleteLocalRef(jpkgs); + if (self_attached) { JavaContext->DetachCurrentThread(); @@ -113,6 +118,7 @@ vector JavaBasedPackageManager::GetInstalledPackages() return result; } +// IMPORTANT: This method can be called only if thread is attached to Dalvik PackageInfo JavaBasedPackageManager::ConvertPackageFromJava(jobject package, JNIEnv* jenv) { jclass jclazz = jenv->GetObjectClass(package); @@ -120,11 +126,13 @@ PackageInfo JavaBasedPackageManager::ConvertPackageFromJava(jobject package, JNI jstring jnameobj = static_cast(jenv->GetObjectField(package, jfield)); const char* jnamestr = jenv->GetStringUTFChars(jnameobj, NULL); string name(jnamestr); + jenv->DeleteLocalRef(jnameobj); jfield = jenv->GetFieldID(jclazz, "versionName", "Ljava/lang/String;"); jstring jversionobj = static_cast(jenv->GetObjectField(package, jfield)); const char* jversionstr = jenv->GetStringUTFChars(jversionobj, NULL); string verison(jversionstr); + jenv->DeleteLocalRef(jversionobj); string path; jclazz = jenv->FindClass("android/os/Build$VERSION"); @@ -134,15 +142,14 @@ PackageInfo JavaBasedPackageManager::ConvertPackageFromJava(jobject package, JNI { jclazz = jenv->GetObjectClass(package); jfield = jenv->GetFieldID(jclazz, "applicationInfo", "Landroid/content/pm/ApplicationInfo;"); - jobject japp_info = jenv->GetObjectField(package, jfield); jclazz = jenv->GetObjectClass(japp_info); jfield = jenv->GetFieldID(jclazz, "nativeLibraryDir", "Ljava/lang/String;"); jstring jpathobj = static_cast(jenv->GetObjectField(japp_info, jfield)); - const char* jpathstr = jenv->GetStringUTFChars(jpathobj, NULL); path = string(jpathstr); jenv->ReleaseStringUTFChars(jpathobj, jpathstr); + jenv->DeleteLocalRef(jpathobj); } else { diff --git a/android/service/engine/jni/Tests/Tests.mk b/android/service/engine/jni/Tests/Tests.mk index 9027e15fb..935feb323 100644 --- a/android/service/engine/jni/Tests/Tests.mk +++ b/android/service/engine/jni/Tests/Tests.mk @@ -39,7 +39,7 @@ LOCAL_LDFLAGS = -Wl,-allow-shlib-undefined LOCAL_MODULE := OpenCVEngineTestApp -LOCAL_LDLIBS += -lz -lbinder -llog +LOCAL_LDLIBS += -lz -lbinder -llog -lutils LOCAL_SHARED_LIBRARIES += libOpenCVEngine diff --git a/android/service/push_native.py b/android/service/push_native.py old mode 100644 new mode 100755 diff --git a/android/service/test_native.py b/android/service/test_native.py old mode 100644 new mode 100755 From a74a2302aa875ef6da02a37b7d7fccfd25781cba Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 4 Sep 2012 13:34:52 +0400 Subject: [PATCH 090/103] fixed bug #2331 --- modules/core/src/copy.cpp | 1 + modules/core/test/test_operations.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/modules/core/src/copy.cpp b/modules/core/src/copy.cpp index 84bc22476..84732e37a 100644 --- a/modules/core/src/copy.cpp +++ b/modules/core/src/copy.cpp @@ -209,6 +209,7 @@ void Mat::copyTo( OutputArray _dst ) const int dtype = _dst.type(); if( _dst.fixedType() && dtype != type() ) { + CV_Assert( channels() == CV_MAT_CN(dtype) ); convertTo( _dst, dtype ); return; } diff --git a/modules/core/test/test_operations.cpp b/modules/core/test/test_operations.cpp index 86a90c8dc..6b5f6e0cc 100644 --- a/modules/core/test/test_operations.cpp +++ b/modules/core/test/test_operations.cpp @@ -766,6 +766,19 @@ bool CV_OperationsTest::TestTemplateMat() Mat c = (a*b.t()).t(); CV_Assert( norm(c, CV_L1) == 4. ); } + + bool badarg_catched = false; + try + { + Mat m1 = Mat::zeros(1, 10, CV_8UC1); + Mat m2 = Mat::zeros(10, 10, CV_8UC3); + m1.copyTo(m2.row(1)); + } + catch(const Exception& e) + { + badarg_catched = true; + } + CV_Assert( badarg_catched ); } catch (const test_excep& e) { From 93155c6ae049bc3d8f5b99b0f1606ba88ef53ed8 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 22 Aug 2012 23:21:49 -0400 Subject: [PATCH 091/103] Overloaded PCA constructor and ( ) operator to implement Feature#2287 - PCA that retains a specified amount of variance from the data. A sample was added to samples/cpp to demonstrate the new functionality. Docs and Tests were also updated --- modules/core/include/opencv2/core/core.hpp | 5 + modules/core/src/matmul.cpp | 117 +++++++++++++ modules/core/test/test_mat.cpp | 33 +++- samples/cpp/pca.cpp | 184 +++++++++++++++++++++ 4 files changed, 335 insertions(+), 4 deletions(-) create mode 100644 samples/cpp/pca.cpp diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 5fd927213..f03f21b74 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -2359,8 +2359,10 @@ public: PCA(); //! the constructor that performs PCA PCA(InputArray data, InputArray mean, int flags, int maxComponents=0); + PCA(InputArray data, InputArray mean, int flags, double retainedVariance); //! operator that performs PCA. The previously stored data, if any, is released PCA& operator()(InputArray data, InputArray mean, int flags, int maxComponents=0); + PCA& operator()(InputArray data, InputArray mean, int flags, double retainedVariance); //! projects vector from the original space to the principal components subspace Mat project(InputArray vec) const; //! projects vector from the original space to the principal components subspace @@ -2378,6 +2380,9 @@ public: CV_EXPORTS_W void PCACompute(InputArray data, CV_OUT InputOutputArray mean, OutputArray eigenvectors, int maxComponents=0); +CV_EXPORTS_W void PCACompute(InputArray data, CV_OUT InputOutputArray mean, + OutputArray eigenvectors, double retainedVariance); + CV_EXPORTS_W void PCAProject(InputArray data, InputArray mean, InputArray eigenvectors, OutputArray result); diff --git a/modules/core/src/matmul.cpp b/modules/core/src/matmul.cpp index fe138f029..b71aead53 100644 --- a/modules/core/src/matmul.cpp +++ b/modules/core/src/matmul.cpp @@ -2811,6 +2811,11 @@ PCA::PCA(InputArray data, InputArray _mean, int flags, int maxComponents) operator()(data, _mean, flags, maxComponents); } +PCA::PCA(InputArray data, InputArray _mean, int flags, double retainedVariance) +{ + operator()(data, _mean, flags, retainedVariance); +} + PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, int maxComponents) { Mat data = _data.getMat(), _mean = __mean.getMat(); @@ -2895,6 +2900,109 @@ PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, int maxComp return *this; } +PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, double retainedVariance) +{ + Mat data = _data.getMat(), _mean = __mean.getMat(); + int covar_flags = CV_COVAR_SCALE; + int i, len, in_count; + Size mean_sz; + + CV_Assert( data.channels() == 1 ); + if( flags & CV_PCA_DATA_AS_COL ) + { + len = data.rows; + in_count = data.cols; + covar_flags |= CV_COVAR_COLS; + mean_sz = Size(1, len); + } + else + { + len = data.cols; + in_count = data.rows; + covar_flags |= CV_COVAR_ROWS; + mean_sz = Size(len, 1); + } + + CV_Assert( retainedVariance > 0 && retainedVariance <= 1 ); + + int count = std::min(len, in_count); + + // "scrambled" way to compute PCA (when cols(A)>rows(A)): + // B = A'A; B*x=b*x; C = AA'; C*y=c*y -> AA'*y=c*y -> A'A*(A'*y)=c*(A'*y) -> c = b, x=A'*y + if( len <= in_count ) + covar_flags |= CV_COVAR_NORMAL; + + int ctype = std::max(CV_32F, data.depth()); + mean.create( mean_sz, ctype ); + + Mat covar( count, count, ctype ); + + if( _mean.data ) + { + CV_Assert( _mean.size() == mean_sz ); + _mean.convertTo(mean, ctype); + } + + calcCovarMatrix( data, covar, mean, covar_flags, ctype ); + eigen( covar, eigenvalues, eigenvectors ); + + if( !(covar_flags & CV_COVAR_NORMAL) ) + { + // CV_PCA_DATA_AS_ROW: cols(A)>rows(A). x=A'*y -> x'=y'*A + // CV_PCA_DATA_AS_COL: rows(A)>cols(A). x=A''*y -> x'=y'*A' + Mat tmp_data, tmp_mean = repeat(mean, data.rows/mean.rows, data.cols/mean.cols); + if( data.type() != ctype || tmp_mean.data == mean.data ) + { + data.convertTo( tmp_data, ctype ); + subtract( tmp_data, tmp_mean, tmp_data ); + } + else + { + subtract( data, tmp_mean, tmp_mean ); + tmp_data = tmp_mean; + } + + Mat evects1(count, len, ctype); + gemm( eigenvectors, tmp_data, 1, Mat(), 0, evects1, + (flags & CV_PCA_DATA_AS_COL) ? CV_GEMM_B_T : 0); + eigenvectors = evects1; + + // normalize all eigenvectors + for( i = 0; i < eigenvectors.rows; i++ ) + { + Mat vec = eigenvectors.row(i); + normalize(vec, vec); + } + } + + // compute the cumulative energy content for each eigenvector + Mat g(eigenvalues.size(), ctype); + + for(int ig = 0; ig < g.rows; ig++) + { + g.at(ig,0) = 0; + for(int im = 0; im <= ig; im++) + { + g.at(ig,0) += eigenvalues.at(im,0); + } + } + + int L; + for(L = 0; L < eigenvalues.rows; L++) + { + double energy = g.at(L, 0) / g.at(g.rows - 1, 0); + if(energy > retainedVariance) + break; + } + + L = std::max(2, L); + + // use clone() to physically copy the data and thus deallocate the original matrices + eigenvalues = eigenvalues.rowRange(0,L).clone(); + eigenvectors = eigenvectors.rowRange(0,L).clone(); + + return *this; +} void PCA::project(InputArray _data, OutputArray result) const { @@ -2965,6 +3073,15 @@ void cv::PCACompute(InputArray data, InputOutputArray mean, pca.eigenvectors.copyTo(eigenvectors); } +void cv::PCACompute(InputArray data, InputOutputArray mean, + OutputArray eigenvectors, double retainedVariance) +{ + PCA pca; + pca(data, mean, 0, retainedVariance); + pca.mean.copyTo(mean); + pca.eigenvectors.copyTo(eigenvectors); +} + void cv::PCAProject(InputArray data, InputArray mean, InputArray eigenvectors, OutputArray result) { diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index 6b5d09f15..44ab9a906 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -297,6 +297,7 @@ protected: prjEps, backPrjEps, evalEps, evecEps; int maxComponents = 100; + double retainedVariance = 0.95; Mat rPoints(sz, CV_32FC1), rTestPoints(sz, CV_32FC1); RNG& rng = ts->get_rng(); @@ -423,9 +424,33 @@ protected: ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY ); return; } - + + // 3. check C++ PCA w/retainedVariance + cPCA( rPoints.t(), Mat(), CV_PCA_DATA_AS_COL, retainedVariance ); + diffPrjEps = 1, diffBackPrjEps = 1; + Mat rvPrjTestPoints = cPCA.project(rTestPoints.t()); + + if( cPCA.eigenvectors.rows > maxComponents) + err = norm(cv::abs(rvPrjTestPoints.rowRange(0,maxComponents)), cv::abs(rPrjTestPoints.t()), CV_RELATIVE_L2 ); + else + err = norm(cv::abs(rvPrjTestPoints), cv::abs(rPrjTestPoints.colRange(0,cPCA.eigenvectors.rows).t()), CV_RELATIVE_L2 ); + + if( err > diffPrjEps ) + { + ts->printf( cvtest::TS::LOG, "bad accuracy of project() (CV_PCA_DATA_AS_COL); retainedVariance=0.95; err = %f\n", err ); + ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY ); + return; + } + err = norm(cPCA.backProject(rvPrjTestPoints), rBackPrjTestPoints.t(), CV_RELATIVE_L2 ); + if( err > diffBackPrjEps ) + { + ts->printf( cvtest::TS::LOG, "bad accuracy of backProject() (CV_PCA_DATA_AS_COL); retainedVariance=0.95; err = %f\n", err ); + ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY ); + return; + } + #ifdef CHECK_C - // 3. check C PCA & ROW + // 4. check C PCA & ROW _points = rPoints; _testPoints = rTestPoints; _avg = avg; @@ -455,7 +480,7 @@ protected: return; } - // 3. check C PCA & COL + // 5. check C PCA & COL _points = cPoints; _testPoints = cTestPoints; avg = avg.t(); _avg = avg; @@ -871,4 +896,4 @@ TEST(Core_Mat, reshape_1942) cn = M.channels(); ); ASSERT_EQ(1, cn); -} \ No newline at end of file +} diff --git a/samples/cpp/pca.cpp b/samples/cpp/pca.cpp new file mode 100644 index 000000000..b489a5e2b --- /dev/null +++ b/samples/cpp/pca.cpp @@ -0,0 +1,184 @@ +/* +* pca.cpp +* +* Author: +* Kevin Hughes +* +* Special Thanks to: +* Philipp Wagner +* +* This program demonstrates how to use OpenCV PCA with a +* specified amount of variance to retain. The effect +* is illustrated further by using a trackbar to +* change the value for retained varaince. +* +* The program takes as input a text file with each line +* begin the full path to an image. PCA will be performed +* on this list of images. The author recommends using +* the first 15 faces of the AT&T face data set: +* http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html +* +* so for example your input text file would look like this: +* +* /orl_faces/s1/1.pgm +* /orl_faces/s2/1.pgm +* /orl_faces/s3/1.pgm +* /orl_faces/s4/1.pgm +* /orl_faces/s5/1.pgm +* /orl_faces/s6/1.pgm +* /orl_faces/s7/1.pgm +* /orl_faces/s8/1.pgm +* /orl_faces/s9/1.pgm +* /orl_faces/s10/1.pgm +* /orl_faces/s11/1.pgm +* /orl_faces/s12/1.pgm +* /orl_faces/s13/1.pgm +* /orl_faces/s14/1.pgm +* /orl_faces/s15/1.pgm +* +*/ + +#include +#include +#include + +#include +#include + +using namespace cv; +using namespace std; + +/////////////////////// +// Functions +void read_imgList(const string& filename, vector& images) { + std::ifstream file(filename.c_str(), ifstream::in); + if (!file) { + string error_message = "No valid input file was given, please check the given filename."; + CV_Error(CV_StsBadArg, error_message); + } + string line; + while (getline(file, line)) { + images.push_back(imread(line, 0)); + } +} + +Mat formatImagesForPCA(const vector &data) +{ + Mat dst(data.size(), data[0].rows*data[0].cols, CV_32F); + for(unsigned int i = 0; i < data.size(); i++) + { + Mat image_row = data[i].clone().reshape(1,1); + Mat row_i = dst.row(i); + image_row.convertTo(row_i,CV_32F); + } + return dst; +} + +Mat toGrayscale(InputArray _src) { + Mat src = _src.getMat(); + // only allow one channel + if(src.channels() != 1) { + CV_Error(CV_StsBadArg, "Only Matrices with one channel are supported"); + } + // create and return normalized image + Mat dst; + cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1); + return dst; +} + +struct params +{ + Mat data; + int ch; + int rows; + PCA pca; + string winName; +}; + +void onTrackbar(int pos, void* ptr) +{ + cout << "Retained Variance = " << pos << "% "; + cout << "re-calculating PCA..." << std::flush; + + double var = pos / 100.0; + + struct params *p = (struct params *)ptr; + + p->pca = PCA(p->data, cv::Mat(), CV_PCA_DATA_AS_ROW, var); + + Mat point = p->pca.project(p->data.row(0)); + Mat reconstruction = p->pca.backProject(point); + reconstruction = reconstruction.reshape(p->ch, p->rows); + reconstruction = toGrayscale(reconstruction); + + imshow(p->winName, reconstruction); + cout << "done! # of principal components: " << p->pca.eigenvectors.rows << endl; +} + + +/////////////////////// +// Main +int main(int argc, char** argv) +{ + if (argc != 2) { + cout << "usage: " << argv[0] << " " << endl; + exit(1); + } + + // Get the path to your CSV. + string imgList = string(argv[1]); + + // vector to hold the images + vector images; + + // Read in the data. This can fail if not valid + try { + read_imgList(imgList, images); + } catch (cv::Exception& e) { + cerr << "Error opening file \"" << imgList << "\". Reason: " << e.msg << endl; + exit(1); + } + + // Quit if there are not enough images for this demo. + if(images.size() <= 1) { + string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!"; + CV_Error(CV_StsError, error_message); + } + + // Reshape and stack images into a rowMatrix + Mat data = formatImagesForPCA(images); + + // perform PCA + PCA pca(data, cv::Mat(), CV_PCA_DATA_AS_ROW, 0.95); // trackbar is initially set here, also this is a common value for retainedVariance + + // Demonstration of the effect of retainedVariance on the first image + Mat point = pca.project(data.row(0)); // project into the eigenspace, thus the image becomes a "point" + Mat reconstruction = pca.backProject(point); // re-create the image from the "point" + reconstruction = reconstruction.reshape(images[0].channels(), images[0].rows); // reshape from a row vector into image shape + reconstruction = toGrayscale(reconstruction); // re-scale for displaying purposes + + // init highgui window + string winName = "Reconstruction | press 'q' to quit"; + namedWindow(winName, CV_WINDOW_NORMAL); + + // params struct to pass to the trackbar handler + params p; + p.data = data; + p.ch = images[0].channels(); + p.rows = images[0].rows; + p.pca = pca; + p.winName = winName; + + // create the tracbar + int pos = 95; + createTrackbar("Retained Variance (%)", winName, &pos, 100, onTrackbar, (void*)&p); + + // display until user presses q + imshow(winName, reconstruction); + + char key = 0; + while(key != 'q') + key = waitKey(); + + return 0; +} From e17b70e533fc1edb4d8bf40c307b5bb0c1474b6a Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 4 Sep 2012 14:14:24 +0400 Subject: [PATCH 092/103] updated documentation with the new PCA functionality --- modules/core/doc/operations_on_arrays.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/core/doc/operations_on_arrays.rst b/modules/core/doc/operations_on_arrays.rst index 52aa86c0a..c4aed91f1 100644 --- a/modules/core/doc/operations_on_arrays.rst +++ b/modules/core/doc/operations_on_arrays.rst @@ -2240,6 +2240,8 @@ PCA constructors .. ocv:function:: PCA::PCA(InputArray data, InputArray mean, int flags, int maxComponents=0) +.. ocv:function:: PCA::PCA(InputArray data, InputArray mean, int flags, double retainedVariance) + :param data: input samples stored as matrix rows or matrix columns. :param mean: optional mean value; if the matrix is empty (``noArray()``), the mean is computed from the data. @@ -2251,8 +2253,10 @@ PCA constructors * **CV_PCA_DATA_AS_COL** indicates that the input samples are stored as matrix columns. :param maxComponents: maximum number of components that PCA should retain; by default, all the components are retained. + + :param retainedVariance: Percentage of variance that PCA should retain. Using this parameter will let the PCA decided how many components to retain but it will always keep at least 2. -The default constructor initializes an empty PCA structure. The second constructor initializes the structure and calls +The default constructor initializes an empty PCA structure. The other constructors initialize the structure and call :ocv:funcx:`PCA::operator()` . @@ -2263,6 +2267,8 @@ Performs Principal Component Analysis of the supplied dataset. .. ocv:function:: PCA& PCA::operator()(InputArray data, InputArray mean, int flags, int maxComponents=0) +.. ocv:function:: PCA& PCA::operator()(InputArray data, InputArray mean, int flags, double retainedVariance) + .. ocv:pyfunction:: cv2.PCACompute(data[, mean[, eigenvectors[, maxComponents]]]) -> mean, eigenvectors :param data: input samples stored as the matrix rows or as the matrix columns. @@ -2276,6 +2282,8 @@ Performs Principal Component Analysis of the supplied dataset. * **CV_PCA_DATA_AS_COL** indicates that the input samples are stored as matrix columns. :param maxComponents: maximum number of components that PCA should retain; by default, all the components are retained. + + :param retainedVariance: Percentage of variance that PCA should retain. Using this parameter will let the PCA decided how many components to retain but it will always keep at least 2. The operator performs PCA of the supplied dataset. It is safe to reuse the same PCA structure for multiple datasets. That is, if the structure has been previously used with another dataset, the existing internal data is reclaimed and the new ``eigenvalues``, ``eigenvectors`` , and ``mean`` are allocated and computed. From bf7295f584ea1a5c90c4476db76c3032c7fb465c Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 4 Sep 2012 14:15:00 +0400 Subject: [PATCH 093/103] fixed multiple build warnings --- 3rdparty/openexr/IlmImf/ImfAcesFile.h | 2 +- 3rdparty/openexr/IlmImf/ImfAttribute.h | 4 ++-- 3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp | 8 +++---- .../IlmImf/ImfChannelListAttribute.cpp | 4 ++-- .../IlmImf/ImfChromaticitiesAttribute.cpp | 4 ++-- .../IlmImf/ImfCompressionAttribute.cpp | 4 ++-- .../openexr/IlmImf/ImfEnvmapAttribute.cpp | 4 ++-- 3rdparty/openexr/IlmImf/ImfIO.cpp | 2 +- .../openexr/IlmImf/ImfKeyCodeAttribute.cpp | 4 ++-- .../openexr/IlmImf/ImfLineOrderAttribute.cpp | 4 ++-- .../openexr/IlmImf/ImfMatrixAttribute.cpp | 16 ++++++------- .../openexr/IlmImf/ImfOpaqueAttribute.cpp | 4 ++-- 3rdparty/openexr/IlmImf/ImfOutputFile.cpp | 2 +- .../IlmImf/ImfPreviewImageAttribute.cpp | 4 ++-- 3rdparty/openexr/IlmImf/ImfRational.h | 2 +- .../openexr/IlmImf/ImfRationalAttribute.cpp | 4 ++-- 3rdparty/openexr/IlmImf/ImfRleCompressor.cpp | 4 ++-- .../openexr/IlmImf/ImfStringAttribute.cpp | 4 ++-- .../IlmImf/ImfStringVectorAttribute.cpp | 4 ++-- 3rdparty/openexr/IlmImf/ImfThreading.cpp | 1 + .../IlmImf/ImfTileDescriptionAttribute.cpp | 6 ++--- .../openexr/IlmImf/ImfTimeCodeAttribute.cpp | 4 ++-- 3rdparty/openexr/IlmImf/ImfVecAttribute.cpp | 24 +++++++++---------- 3rdparty/openexr/IlmImf/ImfZipCompressor.cpp | 4 ++-- 24 files changed, 62 insertions(+), 61 deletions(-) diff --git a/3rdparty/openexr/IlmImf/ImfAcesFile.h b/3rdparty/openexr/IlmImf/ImfAcesFile.h index 2ab731476..49d0a09db 100644 --- a/3rdparty/openexr/IlmImf/ImfAcesFile.h +++ b/3rdparty/openexr/IlmImf/ImfAcesFile.h @@ -90,7 +90,7 @@ namespace Imf { class RgbaOutputFile; class RgbaInputFile; struct PreviewRgba; -class Chromaticities; +struct Chromaticities; // // ACES red, green, blue and white-point chromaticities. diff --git a/3rdparty/openexr/IlmImf/ImfAttribute.h b/3rdparty/openexr/IlmImf/ImfAttribute.h index 520c20c1f..5e3e87fc0 100644 --- a/3rdparty/openexr/IlmImf/ImfAttribute.h +++ b/3rdparty/openexr/IlmImf/ImfAttribute.h @@ -316,7 +316,7 @@ TypedAttribute::copy () const template void -TypedAttribute::writeValueTo (OStream &os, int version) const +TypedAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value); } @@ -324,7 +324,7 @@ TypedAttribute::writeValueTo (OStream &os, int version) const template void -TypedAttribute::readValueFrom (IStream &is, int size, int version) +TypedAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value); } diff --git a/3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp b/3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp index d275d1124..ca97f7578 100644 --- a/3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfBoxAttribute.cpp @@ -57,7 +57,7 @@ Box2iAttribute::staticTypeName () template <> void -Box2iAttribute::writeValueTo (OStream &os, int version) const +Box2iAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.min.x); Xdr::write (os, _value.min.y); @@ -68,7 +68,7 @@ Box2iAttribute::writeValueTo (OStream &os, int version) const template <> void -Box2iAttribute::readValueFrom (IStream &is, int size, int version) +Box2iAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.min.x); Xdr::read (is, _value.min.y); @@ -87,7 +87,7 @@ Box2fAttribute::staticTypeName () template <> void -Box2fAttribute::writeValueTo (OStream &os, int version) const +Box2fAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.min.x); Xdr::write (os, _value.min.y); @@ -98,7 +98,7 @@ Box2fAttribute::writeValueTo (OStream &os, int version) const template <> void -Box2fAttribute::readValueFrom (IStream &is, int size, int version) +Box2fAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.min.x); Xdr::read (is, _value.min.y); diff --git a/3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp b/3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp index df2790be1..4af47d1b3 100644 --- a/3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfChannelListAttribute.cpp @@ -72,7 +72,7 @@ ChannelListAttribute::staticTypeName () template <> void -ChannelListAttribute::writeValueTo (OStream &os, int version) const +ChannelListAttribute::writeValueTo (OStream &os, int) const { for (ChannelList::ConstIterator i = _value.begin(); i != _value.end(); @@ -105,7 +105,7 @@ ChannelListAttribute::writeValueTo (OStream &os, int version) const template <> void -ChannelListAttribute::readValueFrom (IStream &is, int size, int version) +ChannelListAttribute::readValueFrom (IStream &is, int, int) { while (true) { diff --git a/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp b/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp index 03f3a8d66..a1a024427 100644 --- a/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfChromaticitiesAttribute.cpp @@ -55,7 +55,7 @@ ChromaticitiesAttribute::staticTypeName () template <> void -ChromaticitiesAttribute::writeValueTo (OStream &os, int version) const +ChromaticitiesAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.red.x); Xdr::write (os, _value.red.y); @@ -70,7 +70,7 @@ ChromaticitiesAttribute::writeValueTo (OStream &os, int version) const template <> void -ChromaticitiesAttribute::readValueFrom (IStream &is, int size, int version) +ChromaticitiesAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.red.x); Xdr::read (is, _value.red.y); diff --git a/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp b/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp index 0c28d166e..404046267 100644 --- a/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfCompressionAttribute.cpp @@ -56,7 +56,7 @@ CompressionAttribute::staticTypeName () template <> void -CompressionAttribute::writeValueTo (OStream &os, int version) const +CompressionAttribute::writeValueTo (OStream &os, int) const { unsigned char tmp = _value; Xdr::write (os, tmp); @@ -65,7 +65,7 @@ CompressionAttribute::writeValueTo (OStream &os, int version) const template <> void -CompressionAttribute::readValueFrom (IStream &is, int size, int version) +CompressionAttribute::readValueFrom (IStream &is, int, int) { unsigned char tmp; Xdr::read (is, tmp); diff --git a/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp b/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp index 03a792874..c0c43e846 100644 --- a/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfEnvmapAttribute.cpp @@ -55,7 +55,7 @@ EnvmapAttribute::staticTypeName () template <> void -EnvmapAttribute::writeValueTo (OStream &os, int version) const +EnvmapAttribute::writeValueTo (OStream &os, int) const { unsigned char tmp = _value; Xdr::write (os, tmp); @@ -64,7 +64,7 @@ EnvmapAttribute::writeValueTo (OStream &os, int version) const template <> void -EnvmapAttribute::readValueFrom (IStream &is, int size, int version) +EnvmapAttribute::readValueFrom (IStream &is, int, int) { unsigned char tmp; Xdr::read (is, tmp); diff --git a/3rdparty/openexr/IlmImf/ImfIO.cpp b/3rdparty/openexr/IlmImf/ImfIO.cpp index 711cdbb5f..aae058894 100644 --- a/3rdparty/openexr/IlmImf/ImfIO.cpp +++ b/3rdparty/openexr/IlmImf/ImfIO.cpp @@ -65,7 +65,7 @@ IStream::isMemoryMapped () const char * -IStream::readMemoryMapped (int n) +IStream::readMemoryMapped (int) { throw Iex::InputExc ("Attempt to perform a memory-mapped read " "on a file that is not memory mapped."); diff --git a/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp b/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp index 00156bd24..50e61cff9 100644 --- a/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfKeyCodeAttribute.cpp @@ -54,7 +54,7 @@ KeyCodeAttribute::staticTypeName () template <> void -KeyCodeAttribute::writeValueTo (OStream &os, int version) const +KeyCodeAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.filmMfcCode()); Xdr::write (os, _value.filmType()); @@ -68,7 +68,7 @@ KeyCodeAttribute::writeValueTo (OStream &os, int version) const template <> void -KeyCodeAttribute::readValueFrom (IStream &is, int size, int version) +KeyCodeAttribute::readValueFrom (IStream &is, int, int) { int tmp; diff --git a/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp b/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp index 6b9c0f9a6..bd8bd3f98 100644 --- a/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfLineOrderAttribute.cpp @@ -57,7 +57,7 @@ LineOrderAttribute::staticTypeName () template <> void -LineOrderAttribute::writeValueTo (OStream &os, int version) const +LineOrderAttribute::writeValueTo (OStream &os, int) const { unsigned char tmp = _value; Xdr::write (os, tmp); @@ -66,7 +66,7 @@ LineOrderAttribute::writeValueTo (OStream &os, int version) const template <> void -LineOrderAttribute::readValueFrom (IStream &is, int size, int version) +LineOrderAttribute::readValueFrom (IStream &is, int, int) { unsigned char tmp; Xdr::read (is, tmp); diff --git a/3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp b/3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp index f4e447a4b..105f721c8 100644 --- a/3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfMatrixAttribute.cpp @@ -59,7 +59,7 @@ M33fAttribute::staticTypeName () template <> void -M33fAttribute::writeValueTo (OStream &os, int version) const +M33fAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); @@ -77,7 +77,7 @@ M33fAttribute::writeValueTo (OStream &os, int version) const template <> void -M33fAttribute::readValueFrom (IStream &is, int size, int version) +M33fAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); @@ -103,7 +103,7 @@ M33dAttribute::staticTypeName () template <> void -M33dAttribute::writeValueTo (OStream &os, int version) const +M33dAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); @@ -121,7 +121,7 @@ M33dAttribute::writeValueTo (OStream &os, int version) const template <> void -M33dAttribute::readValueFrom (IStream &is, int size, int version) +M33dAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); @@ -147,7 +147,7 @@ M44fAttribute::staticTypeName () template <> void -M44fAttribute::writeValueTo (OStream &os, int version) const +M44fAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); @@ -173,7 +173,7 @@ M44fAttribute::writeValueTo (OStream &os, int version) const template <> void -M44fAttribute::readValueFrom (IStream &is, int size, int version) +M44fAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); @@ -207,7 +207,7 @@ M44dAttribute::staticTypeName () template <> void -M44dAttribute::writeValueTo (OStream &os, int version) const +M44dAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value[0][0]); Xdr::write (os, _value[0][1]); @@ -233,7 +233,7 @@ M44dAttribute::writeValueTo (OStream &os, int version) const template <> void -M44dAttribute::readValueFrom (IStream &is, int size, int version) +M44dAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value[0][0]); Xdr::read (is, _value[0][1]); diff --git a/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp b/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp index 0abaa862d..e084c67cc 100644 --- a/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfOpaqueAttribute.cpp @@ -87,14 +87,14 @@ OpaqueAttribute::copy () const void -OpaqueAttribute::writeValueTo (OStream &os, int version) const +OpaqueAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _data, _dataSize); } void -OpaqueAttribute::readValueFrom (IStream &is, int size, int version) +OpaqueAttribute::readValueFrom (IStream &is, int size, int) { _data.resizeErase (size); _dataSize = size; diff --git a/3rdparty/openexr/IlmImf/ImfOutputFile.cpp b/3rdparty/openexr/IlmImf/ImfOutputFile.cpp index 31a339e03..dd779c4e0 100644 --- a/3rdparty/openexr/IlmImf/ImfOutputFile.cpp +++ b/3rdparty/openexr/IlmImf/ImfOutputFile.cpp @@ -310,7 +310,7 @@ convertToXdr (OutputFile::Data *ofd, Array &lineBuffer, int lineBufferMinY, int lineBufferMaxY, - int inSize) + int /*inSize*/) { // // Convert the contents of a lineBuffer from the machine's native diff --git a/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp b/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp index 476c75678..744784f96 100644 --- a/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfPreviewImageAttribute.cpp @@ -55,7 +55,7 @@ PreviewImageAttribute::staticTypeName () template <> void -PreviewImageAttribute::writeValueTo (OStream &os, int version) const +PreviewImageAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.width()); Xdr::write (os, _value.height()); @@ -75,7 +75,7 @@ PreviewImageAttribute::writeValueTo (OStream &os, int version) const template <> void -PreviewImageAttribute::readValueFrom (IStream &is, int size, int version) +PreviewImageAttribute::readValueFrom (IStream &is, int, int) { int width, height; diff --git a/3rdparty/openexr/IlmImf/ImfRational.h b/3rdparty/openexr/IlmImf/ImfRational.h index 4bad7b847..1320d7c8a 100644 --- a/3rdparty/openexr/IlmImf/ImfRational.h +++ b/3rdparty/openexr/IlmImf/ImfRational.h @@ -71,7 +71,7 @@ class Rational // Constructor, explicitly sets n and d //------------------------------------- - Rational (int n, int d): n (n), d (d) {} + Rational (int _n, int _d): n (_n), d (_d) {} //---------------------------- diff --git a/3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp b/3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp index 757ca273f..9546fb9d4 100644 --- a/3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfRationalAttribute.cpp @@ -54,7 +54,7 @@ RationalAttribute::staticTypeName () template <> void -RationalAttribute::writeValueTo (OStream &os, int version) const +RationalAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.n); Xdr::write (os, _value.d); @@ -63,7 +63,7 @@ RationalAttribute::writeValueTo (OStream &os, int version) const template <> void -RationalAttribute::readValueFrom (IStream &is, int size, int version) +RationalAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.n); Xdr::read (is, _value.d); diff --git a/3rdparty/openexr/IlmImf/ImfRleCompressor.cpp b/3rdparty/openexr/IlmImf/ImfRleCompressor.cpp index 90619b4ca..a6d26ef18 100644 --- a/3rdparty/openexr/IlmImf/ImfRleCompressor.cpp +++ b/3rdparty/openexr/IlmImf/ImfRleCompressor.cpp @@ -191,7 +191,7 @@ RleCompressor::numScanLines () const int RleCompressor::compress (const char *inPtr, int inSize, - int minY, + int /*minY*/, const char *&outPtr) { // @@ -257,7 +257,7 @@ RleCompressor::compress (const char *inPtr, int RleCompressor::uncompress (const char *inPtr, int inSize, - int minY, + int /*minY*/, const char *&outPtr) { // diff --git a/3rdparty/openexr/IlmImf/ImfStringAttribute.cpp b/3rdparty/openexr/IlmImf/ImfStringAttribute.cpp index 6f6ca9499..615f57191 100644 --- a/3rdparty/openexr/IlmImf/ImfStringAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfStringAttribute.cpp @@ -56,7 +56,7 @@ StringAttribute::staticTypeName () template <> void -StringAttribute::writeValueTo (OStream &os, int version) const +StringAttribute::writeValueTo (OStream &os, int) const { int size = _value.size(); @@ -67,7 +67,7 @@ StringAttribute::writeValueTo (OStream &os, int version) const template <> void -StringAttribute::readValueFrom (IStream &is, int size, int version) +StringAttribute::readValueFrom (IStream &is, int size, int) { _value.resize (size); diff --git a/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp b/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp index 76b21be12..dc41b6ad2 100644 --- a/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfStringVectorAttribute.cpp @@ -55,7 +55,7 @@ StringVectorAttribute::staticTypeName () template <> void -StringVectorAttribute::writeValueTo (OStream &os, int version) const +StringVectorAttribute::writeValueTo (OStream &os, int) const { int size = _value.size(); @@ -70,7 +70,7 @@ StringVectorAttribute::writeValueTo (OStream &os, int version) const template <> void -StringVectorAttribute::readValueFrom (IStream &is, int size, int version) +StringVectorAttribute::readValueFrom (IStream &is, int size, int) { int read = 0; diff --git a/3rdparty/openexr/IlmImf/ImfThreading.cpp b/3rdparty/openexr/IlmImf/ImfThreading.cpp index 80f569c2c..2a185e4cf 100644 --- a/3rdparty/openexr/IlmImf/ImfThreading.cpp +++ b/3rdparty/openexr/IlmImf/ImfThreading.cpp @@ -39,6 +39,7 @@ //----------------------------------------------------------------------------- #include "IlmThreadPool.h" +#include "ImfThreading.h" namespace Imf { diff --git a/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp b/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp index e15f10f80..678d9f68f 100644 --- a/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfTileDescriptionAttribute.cpp @@ -55,7 +55,7 @@ TileDescriptionAttribute::staticTypeName () template <> void -TileDescriptionAttribute::writeValueTo (OStream &os, int version) const +TileDescriptionAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.xSize); Xdr::write (os, _value.ySize); @@ -68,8 +68,8 @@ TileDescriptionAttribute::writeValueTo (OStream &os, int version) const template <> void TileDescriptionAttribute::readValueFrom (IStream &is, - int size, - int version) + int, + int) { Xdr::read (is, _value.xSize); Xdr::read (is, _value.ySize); diff --git a/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp b/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp index 2c2088bae..640243d2a 100644 --- a/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfTimeCodeAttribute.cpp @@ -54,7 +54,7 @@ TimeCodeAttribute::staticTypeName () template <> void -TimeCodeAttribute::writeValueTo (OStream &os, int version) const +TimeCodeAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.timeAndFlags()); Xdr::write (os, _value.userData()); @@ -63,7 +63,7 @@ TimeCodeAttribute::writeValueTo (OStream &os, int version) const template <> void -TimeCodeAttribute::readValueFrom (IStream &is, int size, int version) +TimeCodeAttribute::readValueFrom (IStream &is, int, int) { unsigned int tmp; diff --git a/3rdparty/openexr/IlmImf/ImfVecAttribute.cpp b/3rdparty/openexr/IlmImf/ImfVecAttribute.cpp index 7527bfdfb..505651d0b 100644 --- a/3rdparty/openexr/IlmImf/ImfVecAttribute.cpp +++ b/3rdparty/openexr/IlmImf/ImfVecAttribute.cpp @@ -61,7 +61,7 @@ V2iAttribute::staticTypeName () template <> void -V2iAttribute::writeValueTo (OStream &os, int version) const +V2iAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); @@ -70,7 +70,7 @@ V2iAttribute::writeValueTo (OStream &os, int version) const template <> void -V2iAttribute::readValueFrom (IStream &is, int size, int version) +V2iAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); @@ -87,7 +87,7 @@ V2fAttribute::staticTypeName () template <> void -V2fAttribute::writeValueTo (OStream &os, int version) const +V2fAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); @@ -96,7 +96,7 @@ V2fAttribute::writeValueTo (OStream &os, int version) const template <> void -V2fAttribute::readValueFrom (IStream &is, int size, int version) +V2fAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); @@ -113,7 +113,7 @@ V2dAttribute::staticTypeName () template <> void -V2dAttribute::writeValueTo (OStream &os, int version) const +V2dAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); @@ -122,7 +122,7 @@ V2dAttribute::writeValueTo (OStream &os, int version) const template <> void -V2dAttribute::readValueFrom (IStream &is, int size, int version) +V2dAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); @@ -139,7 +139,7 @@ V3iAttribute::staticTypeName () template <> void -V3iAttribute::writeValueTo (OStream &os, int version) const +V3iAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); @@ -149,7 +149,7 @@ V3iAttribute::writeValueTo (OStream &os, int version) const template <> void -V3iAttribute::readValueFrom (IStream &is, int size, int version) +V3iAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); @@ -167,7 +167,7 @@ V3fAttribute::staticTypeName () template <> void -V3fAttribute::writeValueTo (OStream &os, int version) const +V3fAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); @@ -177,7 +177,7 @@ V3fAttribute::writeValueTo (OStream &os, int version) const template <> void -V3fAttribute::readValueFrom (IStream &is, int size, int version) +V3fAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); @@ -195,7 +195,7 @@ V3dAttribute::staticTypeName () template <> void -V3dAttribute::writeValueTo (OStream &os, int version) const +V3dAttribute::writeValueTo (OStream &os, int) const { Xdr::write (os, _value.x); Xdr::write (os, _value.y); @@ -205,7 +205,7 @@ V3dAttribute::writeValueTo (OStream &os, int version) const template <> void -V3dAttribute::readValueFrom (IStream &is, int size, int version) +V3dAttribute::readValueFrom (IStream &is, int, int) { Xdr::read (is, _value.x); Xdr::read (is, _value.y); diff --git a/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp b/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp index 1a56adf71..99d9059f9 100644 --- a/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp +++ b/3rdparty/openexr/IlmImf/ImfZipCompressor.cpp @@ -93,7 +93,7 @@ ZipCompressor::numScanLines () const int ZipCompressor::compress (const char *inPtr, int inSize, - int minY, + int /*minY*/, const char *&outPtr) { // @@ -167,7 +167,7 @@ ZipCompressor::compress (const char *inPtr, int ZipCompressor::uncompress (const char *inPtr, int inSize, - int minY, + int /*minY*/, const char *&outPtr) { // From dea52eb730b4c221c89c7f87bbd6bb26ad111481 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 4 Sep 2012 14:51:31 +0400 Subject: [PATCH 094/103] fixed 4-channel resizeAreaFast x2 decimation case --- modules/imgproc/src/imgwarp.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index cbe9e29b1..a3e118311 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -1271,10 +1271,10 @@ struct ResizeAreaFast_2x2_8u for( ; dx < w; dx += 4 ) { int index = dx*2; - D[dx] = (S[index] + S[index+3] + nextS[index] + nextS[index+3] + 2) >> 2; - D[dx+1] = (S[index+1] + S[index+4] + nextS[index+1] + nextS[index+4] + 2) >> 2; - D[dx+2] = (S[index+2] + S[index+5] + nextS[index+2] + nextS[index+5] + 2) >> 2; - D[dx+3] = (S[index+3] + S[index+6] + nextS[index+3] + nextS[index+6] + 2) >> 2; + D[dx] = (S[index] + S[index+4] + nextS[index] + nextS[index+4] + 2) >> 2; + D[dx+1] = (S[index+1] + S[index+5] + nextS[index+1] + nextS[index+5] + 2) >> 2; + D[dx+2] = (S[index+2] + S[index+6] + nextS[index+2] + nextS[index+6] + 2) >> 2; + D[dx+3] = (S[index+3] + S[index+7] + nextS[index+3] + nextS[index+7] + 2) >> 2; } } From 959674618f29cbf1ed26d6d43d4ecf0fd4d66eb8 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 4 Sep 2012 14:59:38 +0400 Subject: [PATCH 095/103] restored SSE2 and added AVX optimization of the old haar face detector --- modules/core/src/system.cpp | 2 +- modules/objdetect/src/haar.cpp | 516 +++++++++++++++++++++++++++------ 2 files changed, 421 insertions(+), 97 deletions(-) diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index 253d84024..f85f78a19 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -178,7 +178,7 @@ struct HWFeatures f.have[CV_CPU_SSE4_1] = (cpuid_data[2] & (1<<19)) != 0; f.have[CV_CPU_SSE4_2] = (cpuid_data[2] & (1<<20)) != 0; f.have[CV_CPU_POPCNT] = (cpuid_data[2] & (1<<23)) != 0; - f.have[CV_CPU_AVX] = (cpuid_data[2] & (1<<28)) != 0; + f.have[CV_CPU_AVX] = (((cpuid_data[2] & (1<<28)) != 0)&&((cpuid_data[2] & (1<<27)) != 0));//OS uses XSAVE_XRSTORE and CPU support AVX } return f; diff --git a/modules/objdetect/src/haar.cpp b/modules/objdetect/src/haar.cpp index 983fdcf39..3dd032fb9 100644 --- a/modules/objdetect/src/haar.cpp +++ b/modules/objdetect/src/haar.cpp @@ -43,26 +43,23 @@ #include "precomp.hpp" #include -/* -#if CV_SSE2 + + +#if CV_SSE2 || CV_SSE3 # if !CV_SSE4_1 && !CV_SSE4_2 # define _mm_blendv_pd(a, b, m) _mm_xor_pd(a, _mm_and_pd(_mm_xor_pd(b, a), m)) # define _mm_blendv_ps(a, b, m) _mm_xor_ps(a, _mm_and_ps(_mm_xor_ps(b, a), m)) # endif #endif -#if defined CV_ICC -# if defined CV_AVX +# if CV_AVX # define CV_HAAR_USE_AVX 1 # else -# if defined CV_SSE2 || defined CV_SSE4_1 || defined CV_SSE4_2 +# if CV_SSE2 || CV_SSE3 # define CV_HAAR_USE_SSE 1 -# else -# define CV_HAAR_NO_SIMD 1 # endif # endif -#endif -*/ + /* these settings affect the quality of detection: change with care */ #define CV_ADJUST_FEATURES 1 #define CV_ADJUST_WEIGHTS 0 @@ -636,34 +633,163 @@ cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* _cascade, } +//AVX version icvEvalHidHaarClassifier. Process 8 CvHidHaarClassifiers per call. Check AVX support before invocation!! +#ifdef CV_HAAR_USE_AVX +CV_INLINE +double icvEvalHidHaarClassifierAVX( CvHidHaarClassifier* classifier, + double variance_norm_factor, size_t p_offset ) +{ + int CV_DECL_ALIGNED(32) idxV[8] = {0,0,0,0,0,0,0,0}; + char flags[8] = {0,0,0,0,0,0,0,0}; + CvHidHaarTreeNode* nodes[8]; + double res = 0; + char exitConditionFlag = 0; + for(;;) + { + float CV_DECL_ALIGNED(32) tmp[8] = {0,0,0,0,0,0,0,0}; + nodes[0] = classifier ->node + idxV[0]; + nodes[1] = (classifier+1)->node + idxV[1]; + nodes[2] = (classifier+2)->node + idxV[2]; + nodes[3] = (classifier+3)->node + idxV[3]; + nodes[4] = (classifier+4)->node + idxV[4]; + nodes[5] = (classifier+5)->node + idxV[5]; + nodes[6] = (classifier+6)->node + idxV[6]; + nodes[7] = (classifier+7)->node + idxV[7]; + + __m256 t = _mm256_set1_ps(variance_norm_factor); + t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); + + __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), + calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], + p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); + __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, + nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); + __m256 sum = _mm256_mul_ps(offset, weight); + + offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), + calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), + calc_sum(nodes[0]->feature.rect[1],p_offset)); + weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, + nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); + + sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); + + if( nodes[0]->feature.rect[2].p0 ) + tmp[0] = calc_sum(nodes[0]->feature.rect[2],p_offset) * nodes[0]->feature.rect[2].weight; + if( nodes[1]->feature.rect[2].p0 ) + tmp[1] = calc_sum(nodes[1]->feature.rect[2],p_offset) * nodes[1]->feature.rect[2].weight; + if( nodes[2]->feature.rect[2].p0 ) + tmp[2] = calc_sum(nodes[2]->feature.rect[2],p_offset) * nodes[2]->feature.rect[2].weight; + if( nodes[3]->feature.rect[2].p0 ) + tmp[3] = calc_sum(nodes[3]->feature.rect[2],p_offset) * nodes[3]->feature.rect[2].weight; + if( nodes[4]->feature.rect[2].p0 ) + tmp[4] = calc_sum(nodes[4]->feature.rect[2],p_offset) * nodes[4]->feature.rect[2].weight; + if( nodes[5]->feature.rect[2].p0 ) + tmp[5] = calc_sum(nodes[5]->feature.rect[2],p_offset) * nodes[5]->feature.rect[2].weight; + if( nodes[6]->feature.rect[2].p0 ) + tmp[6] = calc_sum(nodes[6]->feature.rect[2],p_offset) * nodes[6]->feature.rect[2].weight; + if( nodes[7]->feature.rect[2].p0 ) + tmp[7] = calc_sum(nodes[7]->feature.rect[2],p_offset) * nodes[7]->feature.rect[2].weight; + + sum = _mm256_add_ps(sum,_mm256_load_ps(tmp)); + + __m256 left = _mm256_set_ps(nodes[7]->left,nodes[6]->left,nodes[5]->left,nodes[4]->left,nodes[3]->left,nodes[2]->left,nodes[1]->left,nodes[0]->left); + __m256 right = _mm256_set_ps(nodes[7]->right,nodes[6]->right,nodes[5]->right,nodes[4]->right,nodes[3]->right,nodes[2]->right,nodes[1]->right,nodes[0]->right); + + _mm256_store_si256((__m256i*)idxV,_mm256_cvttps_epi32(_mm256_blendv_ps(right, left,_mm256_cmp_ps(sum, t, _CMP_LT_OQ )))); + + for(int i = 0; i < 8; i++) + { + if(idxV[i]<=0) + { + if(!flags[i]) + { + exitConditionFlag++; + flags[i]=1; + res+=((classifier+i)->alpha[-idxV[i]]); + } + idxV[i]=0; + } + } + if(exitConditionFlag==8) + return res; + } +} +#endif + CV_INLINE double icvEvalHidHaarClassifier( CvHidHaarClassifier* classifier, double variance_norm_factor, size_t p_offset ) { int idx = 0; - do + /*#if CV_HAAR_USE_SSE && !CV_HAAR_USE_AVX + if(cv::checkHardwareSupport(CV_CPU_SSE2))//based on old SSE variant. Works slow + { + double CV_DECL_ALIGNED(16) temp[2]; + __m128d zero = _mm_setzero_pd(); + do + { + CvHidHaarTreeNode* node = classifier->node + idx; + __m128d t = _mm_set1_pd((node->threshold)*variance_norm_factor); + __m128d left = _mm_set1_pd(node->left); + __m128d right = _mm_set1_pd(node->right); + + double _sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + _sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + _sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + + __m128d sum = _mm_set1_pd(_sum); + t = _mm_cmplt_sd(sum, t); + sum = _mm_blendv_pd(right, left, t); + + _mm_store_pd(temp, sum); + idx = (int)temp[0]; + } + while(idx > 0 ); + + } + else + #endif*/ { - CvHidHaarTreeNode* node = classifier->node + idx; - double t = node->threshold * variance_norm_factor; + do + { + CvHidHaarTreeNode* node = classifier->node + idx; + double t = node->threshold * variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + if( node->feature.rect[2].p0 ) + sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; - idx = sum < t ? node->left : node->right; + idx = sum < t ? node->left : node->right; + } + while( idx > 0 ); } - while( idx > 0 ); return classifier->alpha[-idx]; } + static int cvRunHaarClassifierCascadeSum( const CvHaarClassifierCascade* _cascade, CvPoint pt, double& stage_sum, int start_stage ) { + #ifdef CV_HAAR_USE_AVX + bool haveAVX = false; + if(cv::checkHardwareSupport(CV_CPU_AVX)) + if(_xgetbv(_XCR_XFEATURE_ENABLED_MASK)&0x6)// Check if the OS will save the YMM registers + { + haveAVX = true; + } + #else + #ifdef CV_HAAR_USE_SSE + bool haveSSE2 = cv::checkHardwareSupport(CV_CPU_SSE2); + #endif + #endif + int p_offset, pq_offset; int i, j; double mean, variance_norm_factor; @@ -702,10 +828,20 @@ cvRunHaarClassifierCascadeSum( const CvHaarClassifierCascade* _cascade, { stage_sum = 0.0; + #ifdef CV_HAAR_USE_AVX + if(haveAVX) + { + for( ; j < cascade->stage_classifier[i].count-8; j+=8 ) + { + stage_sum += icvEvalHidHaarClassifierAVX( + cascade->stage_classifier[i].classifier+j, + variance_norm_factor, p_offset ); + } + } + #endif for( j = 0; j < ptr->count; j++ ) { - stage_sum += icvEvalHidHaarClassifier( ptr->classifier + j, - variance_norm_factor, p_offset ); + stage_sum += icvEvalHidHaarClassifier( ptr->classifier + j, variance_norm_factor, p_offset ); } if( stage_sum >= ptr->threshold ) @@ -723,99 +859,287 @@ cvRunHaarClassifierCascadeSum( const CvHaarClassifierCascade* _cascade, } else if( cascade->isStumpBased ) { - for( i = start_stage; i < cascade->count; i++ ) - { -#ifndef CV_HAAR_USE_SSE - stage_sum = 0.0; -#else - __m128d stage_sum = _mm_setzero_pd(); -#endif + #ifdef CV_HAAR_USE_AVX + if(haveAVX) + { + CvHidHaarClassifier* classifiers[8]; + CvHidHaarTreeNode* nodes[8]; + for( i = start_stage; i < cascade->count; i++ ) + { + stage_sum = 0.0; + int j = 0; + float CV_DECL_ALIGNED(32) buf[8]; + if( cascade->stage_classifier[i].two_rects ) + { + for( ; j <= cascade->stage_classifier[i].count-8; j+=8 ) + { + //__m256 stage_sumPart = _mm256_setzero_ps(); + classifiers[0] = cascade->stage_classifier[i].classifier + j; + nodes[0] = classifiers[0]->node; + classifiers[1] = cascade->stage_classifier[i].classifier + j + 1; + nodes[1] = classifiers[1]->node; + classifiers[2] = cascade->stage_classifier[i].classifier + j + 2; + nodes[2]= classifiers[2]->node; + classifiers[3] = cascade->stage_classifier[i].classifier + j + 3; + nodes[3] = classifiers[3]->node; + classifiers[4] = cascade->stage_classifier[i].classifier + j + 4; + nodes[4] = classifiers[4]->node; + classifiers[5] = cascade->stage_classifier[i].classifier + j + 5; + nodes[5] = classifiers[5]->node; + classifiers[6] = cascade->stage_classifier[i].classifier + j + 6; + nodes[6] = classifiers[6]->node; + classifiers[7] = cascade->stage_classifier[i].classifier + j + 7; + nodes[7] = classifiers[7]->node; - if( cascade->stage_classifier[i].two_rects ) - { - for( j = 0; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; + __m256 t = _mm256_set1_ps(variance_norm_factor); + t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); -#ifndef CV_HAAR_USE_SSE - double t = node->threshold*variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - stage_sum += classifier->alpha[sum >= t]; -#else - // ayasin - NHM perf optim. Avoid use of costly flaky jcc - __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); - __m128d a = _mm_set_sd(classifier->alpha[0]); - __m128d b = _mm_set_sd(classifier->alpha[1]); - __m128d sum = _mm_set_sd(calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight + - calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight); - t = _mm_cmpgt_sd(t, sum); - stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); -#endif + __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), + calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], + p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); + __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, + nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); + __m256 sum = _mm256_mul_ps(offset, weight); - } - } - else - { - for( j = 0; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; -#ifndef CV_HAAR_USE_SSE - double t = node->threshold*variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), + calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), + calc_sum(nodes[0]->feature.rect[1],p_offset)); + weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, + nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); + sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); + + __m256 alpha0 = _mm256_set_ps(classifiers[7]->alpha[0],classifiers[6]->alpha[0],classifiers[5]->alpha[0],classifiers[4]->alpha[0],classifiers[3]->alpha[0], + classifiers[2]->alpha[0],classifiers[1]->alpha[0],classifiers[0]->alpha[0]); + __m256 alpha1 = _mm256_set_ps(classifiers[7]->alpha[1],classifiers[6]->alpha[1],classifiers[5]->alpha[1],classifiers[4]->alpha[1],classifiers[3]->alpha[1], + classifiers[2]->alpha[1],classifiers[1]->alpha[1],classifiers[0]->alpha[1]); - stage_sum += classifier->alpha[sum >= t]; -#else - // ayasin - NHM perf optim. Avoid use of costly flaky jcc - __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); - __m128d a = _mm_set_sd(classifier->alpha[0]); - __m128d b = _mm_set_sd(classifier->alpha[1]); - double _sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - _sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - _sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; - __m128d sum = _mm_set_sd(_sum); + _mm256_store_ps(buf, _mm256_blendv_ps(alpha0, alpha1, _mm256_cmp_ps(t, sum, _CMP_LE_OQ ))); + stage_sum+=(buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6]+buf[7]); + + } + + for( ; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; - t = _mm_cmpgt_sd(t, sum); - stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); -#endif - } - } + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + else + { + for( ; j <= (cascade->stage_classifier[i].count)-8; j+=8 ) + { + float CV_DECL_ALIGNED(32) tmp[8] = {0,0,0,0,0,0,0,0}; -#ifndef CV_HAAR_USE_SSE - if( stage_sum < cascade->stage_classifier[i].threshold ) -#else - __m128d i_threshold = _mm_set_sd(cascade->stage_classifier[i].threshold); - if( _mm_comilt_sd(stage_sum, i_threshold) ) -#endif - return -i; - } - } - else + classifiers[0] = cascade->stage_classifier[i].classifier + j; + nodes[0] = classifiers[0]->node; + classifiers[1] = cascade->stage_classifier[i].classifier + j + 1; + nodes[1] = classifiers[1]->node; + classifiers[2] = cascade->stage_classifier[i].classifier + j + 2; + nodes[2]= classifiers[2]->node; + classifiers[3] = cascade->stage_classifier[i].classifier + j + 3; + nodes[3] = classifiers[3]->node; + classifiers[4] = cascade->stage_classifier[i].classifier + j + 4; + nodes[4] = classifiers[4]->node; + classifiers[5] = cascade->stage_classifier[i].classifier + j + 5; + nodes[5] = classifiers[5]->node; + classifiers[6] = cascade->stage_classifier[i].classifier + j + 6; + nodes[6] = classifiers[6]->node; + classifiers[7] = cascade->stage_classifier[i].classifier + j + 7; + nodes[7] = classifiers[7]->node; + + __m256 t = _mm256_set1_ps(variance_norm_factor); + t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); + + __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), + calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], + p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); + __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, + nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); + __m256 sum = _mm256_mul_ps(offset, weight); + + offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), + calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), + calc_sum(nodes[0]->feature.rect[1],p_offset)); + weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, + nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); + + sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); + + if( nodes[0]->feature.rect[2].p0 ) + tmp[0] = calc_sum(nodes[0]->feature.rect[2],p_offset) * nodes[0]->feature.rect[2].weight; + if( nodes[1]->feature.rect[2].p0 ) + tmp[1] = calc_sum(nodes[1]->feature.rect[2],p_offset) * nodes[1]->feature.rect[2].weight; + if( nodes[2]->feature.rect[2].p0 ) + tmp[2] = calc_sum(nodes[2]->feature.rect[2],p_offset) * nodes[2]->feature.rect[2].weight; + if( nodes[3]->feature.rect[2].p0 ) + tmp[3] = calc_sum(nodes[3]->feature.rect[2],p_offset) * nodes[3]->feature.rect[2].weight; + if( nodes[4]->feature.rect[2].p0 ) + tmp[4] = calc_sum(nodes[4]->feature.rect[2],p_offset) * nodes[4]->feature.rect[2].weight; + if( nodes[5]->feature.rect[2].p0 ) + tmp[5] = calc_sum(nodes[5]->feature.rect[2],p_offset) * nodes[5]->feature.rect[2].weight; + if( nodes[6]->feature.rect[2].p0 ) + tmp[6] = calc_sum(nodes[6]->feature.rect[2],p_offset) * nodes[6]->feature.rect[2].weight; + if( nodes[7]->feature.rect[2].p0 ) + tmp[7] = calc_sum(nodes[7]->feature.rect[2],p_offset) * nodes[7]->feature.rect[2].weight; + + sum = _mm256_add_ps(sum, _mm256_load_ps(tmp)); + + __m256 alpha0 = _mm256_set_ps(classifiers[7]->alpha[0],classifiers[6]->alpha[0],classifiers[5]->alpha[0],classifiers[4]->alpha[0],classifiers[3]->alpha[0], + classifiers[2]->alpha[0],classifiers[1]->alpha[0],classifiers[0]->alpha[0]); + __m256 alpha1 = _mm256_set_ps(classifiers[7]->alpha[1],classifiers[6]->alpha[1],classifiers[5]->alpha[1],classifiers[4]->alpha[1],classifiers[3]->alpha[1], + classifiers[2]->alpha[1],classifiers[1]->alpha[1],classifiers[0]->alpha[1]); + + __m256 outBuf = _mm256_blendv_ps(alpha0, alpha1, _mm256_cmp_ps(t, sum, _CMP_LE_OQ )); + outBuf = _mm256_hadd_ps(outBuf, outBuf); + outBuf = _mm256_hadd_ps(outBuf, outBuf); + _mm256_store_ps(buf, outBuf); + stage_sum+=(buf[0]+buf[4]);//(buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6]+buf[7]); + } + + for( ; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + if( stage_sum < cascade->stage_classifier[i].threshold ) + return -i; + } + } + else + #endif + #ifdef CV_HAAR_USE_SSE && !CV_HAAR_USE_AVX //old SSE optimization + if(haveSSE2) + { + for( i = start_stage; i < cascade->count; i++ ) + { + __m128d stage_sum = _mm_setzero_pd(); + if( cascade->stage_classifier[i].two_rects ) + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + + // ayasin - NHM perf optim. Avoid use of costly flaky jcc + __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); + __m128d a = _mm_set_sd(classifier->alpha[0]); + __m128d b = _mm_set_sd(classifier->alpha[1]); + __m128d sum = _mm_set_sd(calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight + + calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight); + t = _mm_cmpgt_sd(t, sum); + stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); + } + } + else + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + // ayasin - NHM perf optim. Avoid use of costly flaky jcc + __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); + __m128d a = _mm_set_sd(classifier->alpha[0]); + __m128d b = _mm_set_sd(classifier->alpha[1]); + double _sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + _sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + _sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + __m128d sum = _mm_set_sd(_sum); + + t = _mm_cmpgt_sd(t, sum); + stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); + } + } + __m128d i_threshold = _mm_set1_pd(cascade->stage_classifier[i].threshold); + if( _mm_comilt_sd(stage_sum, i_threshold) ) + return -i; + } + } + else + #endif + { + for( i = start_stage; i < cascade->count; i++ ) + { + stage_sum = 0.0; + if( cascade->stage_classifier[i].two_rects ) + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + else + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + if( stage_sum < cascade->stage_classifier[i].threshold ) + return -i; + } + } + } + + else { for( i = start_stage; i < cascade->count; i++ ) { stage_sum = 0.0; - - for( j = 0; j < cascade->stage_classifier[i].count; j++ ) - { - stage_sum += icvEvalHidHaarClassifier( - cascade->stage_classifier[i].classifier + j, - variance_norm_factor, p_offset ); - } - + int j = 0; + #ifdef CV_HAAR_USE_AVX + if(haveAVX) + { + for( ; j < cascade->stage_classifier[i].count-8; j+=8 ) + { + stage_sum += icvEvalHidHaarClassifierAVX( + cascade->stage_classifier[i].classifier+j, + variance_norm_factor, p_offset ); + } + } + #endif + for(; j < cascade->stage_classifier[i].count; j++ ) + { + + stage_sum += icvEvalHidHaarClassifier( + cascade->stage_classifier[i].classifier + j, + variance_norm_factor, p_offset ); + } + if( stage_sum < cascade->stage_classifier[i].threshold ) return -i; } } + //_mm256_zeroupper(); return 1; } + CV_IMPL int cvRunHaarClassifierCascade( const CvHaarClassifierCascade* _cascade, CvPoint pt, int start_stage ) From 16717a8641eff4a7177277e579ac4d6b12fa422a Mon Sep 17 00:00:00 2001 From: Vsevolod Glumov Date: Tue, 4 Sep 2012 15:43:59 +0400 Subject: [PATCH 096/103] Partially cleaned 'operations_on_arrays' section of undocumented parameters. --- modules/core/doc/operations_on_arrays.rst | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/modules/core/doc/operations_on_arrays.rst b/modules/core/doc/operations_on_arrays.rst index c4aed91f1..9e9ecaf1e 100644 --- a/modules/core/doc/operations_on_arrays.rst +++ b/modules/core/doc/operations_on_arrays.rst @@ -43,6 +43,10 @@ Calculates the per-element absolute difference between two arrays or between an :param src2: second input array or a scalar. + :param src: single input array. + + :param value: scalar value. + :param dst: output array that has the same size and type as input arrays. The function ``absdiff`` calculates: @@ -93,6 +97,10 @@ Calculates the per-element sum of two arrays or an array and a scalar. :param src2: second input array or a scalar. + :param src: single input array. + + :param value: scalar value. + :param dst: output array that has the same size and number of channels as the input array(s); the depth is defined by ``dtype`` or ``src1``/``src2``. :param mask: optional operation mask – 8-bit single channel array, that specifies elements of the output array to be changed. @@ -209,6 +217,10 @@ Calculates the per-element bit-wise conjunction of two arrays or an array and a :param src2: second input array or a scalar. + :param src: single input array. + + :param value: scalar value. + :param dst: output array that has the same size and type as the input arrays. :param mask: optional operation mask, 8-bit single channel array, that specifies elements of the output array to be changed. @@ -285,6 +297,10 @@ Calculates the per-element bit-wise disjunction of two arrays or an array and a :param src2: second input array or a scalar. + :param src: single input array. + + :param value: scalar value. + :param dst: output array that has the same size and type as the input arrays. :param mask: optional operation mask, 8-bit single channel array, that specifies elements of the output array to be changed. @@ -333,6 +349,10 @@ Calculates the per-element bit-wise "exclusive or" operation on two arrays or an :param src2: second input array or a scalar. + :param src: single input array. + + :param value: scalar value. + :param dst: output array that has the same size and type as the input arrays. :param mask: optional operation mask, 8-bit single channel array, that specifies elements of the output array to be changed. @@ -384,8 +404,14 @@ Calculates the covariance matrix of a set of vectors. :param covar: output covariance matrix of the type ``ctype`` and square size. + :param ctype: type of the matrixl; it equals 'CV_64F' by default. + + :param cov_mat: output covariance matrix (specific to C syntax). + :param mean: input or output (depending on the flags) array as the average value of the input vectors. + :param vects: a set of vectors. + :param flags: operation flags as a combination of the following values: * **CV_COVAR_SCRAMBLED** The output covariance matrix is calculated as: @@ -444,6 +470,8 @@ Calculates the magnitude and angle of 2D vectors. :param angleInDegrees: a flag, indicating whether the angles are measured in radians (which is by default), or in degrees. + :param angle_in_degrees: a flag, indicating whether the angles are measured in radians, or in degrees (specific to C syntax). + The function ``cartToPolar`` calculates either the magnitude, angle, or both for every 2D vector (x(I),y(I)): .. math:: @@ -502,6 +530,10 @@ Performs the per-element comparison of two arrays or an array and scalar value. :param src2: second input array or a scalar (in the case of ``cvCmp`` and ``cv.Cmp`` it is always an array; in the case of ``cvCmpS``, ``cv.CmpS`` it is always a scalar); when it is an array, it must have a single channel. + :param src: single input array. + + :param value: scalar value. + :param dst: output array that has the same size as the input arrays and type= ``CV_8UC1`` . :param cmpop: a flag, that specifies correspondence between the arrays: @@ -513,6 +545,8 @@ Performs the per-element comparison of two arrays or an array and scalar value. * **CMP_LE** ``src1`` is less than or equal to ``src2``. * **CMP_NE** ``src1`` is unequal to ``src2``. + :param cmp_op: a flag, that specifies correspondence between the arrays (specific to C syntax; for possible values see 'cmpop above). + The function compares: From 53d219c857cb1020345aa7851b5d3e36a70ae11b Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 4 Sep 2012 14:59:26 +0400 Subject: [PATCH 097/103] Improved CMake warnings about known problems of Android NDKs --- android/android.toolchain.cmake | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index 82adbe9b7..f48f188ea 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -722,7 +722,7 @@ if( NOT ANDROID_STL ) if( ANDROID_USE_STLPORT ) set( ANDROID_STL stlport_static ) endif() - message( WARNING "You are using an obsolete variable ANDROID_USE_STLPORT to select the STL. Use -DANDROID_STL=stlport_static instead." ) + message( WARNING "You are using an obsolete variable ANDROID_USE_STLPORT to select the STL variant. Use -DANDROID_STL=stlport_static instead." ) endif() if( NOT ANDROID_STL ) set( ANDROID_STL gnustl_static ) @@ -764,6 +764,12 @@ unset( ANDROID_STL_INCLUDE_DIRS ) unset( __libstl ) unset( __libsupcxx ) +if( NOT _CMAKE_IN_TRY_COMPILE AND ANDROID_NDK_RELEASE STREQUAL "r7b" AND ARMEABI_V7A AND NOT VFPV3 AND ANDROID_STL MATCHES "gnustl" ) + message( WARNING "The GNU STL armeabi-v7a binaries from NDK r7b can crash non-NEON devices. The files provided with NDK r7b were not configured properly, resulting in crashes on Tegra2-based devices and others when trying to use certain floating-point functions (e.g., cosf, sinf, expf). +You are strongly recommended to switch to another NDK release. +" ) +endif() + # setup paths and STL for NDK if( BUILD_WITH_ANDROID_NDK ) set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK}/toolchains/${ANDROID_TOOLCHAIN_NAME}/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" ) @@ -867,7 +873,13 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN ) set( __libstl "${__libstl}/libstdc++.a" ) endif() if( NOT EXISTS "${__libsupcxx}" ) - message( FATAL_ERROR "TODO: missing stdsupc++ in NDK r7 error" ) + message( FATAL_ERROR "The required libstdsupc++.a is missing in your standalone toolchain. + Usually it happens because of bug in make-standalone-toolchain.sh script from NDK r7, r7b and r7c. + You need to either upgrade to newer NDK or manually copy + $ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a + to + ${__libsupcxx} + " ) endif() if( ANDROID_STL STREQUAL "gnustl_shared" ) if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" ) From af415085d891781072b017f63c67c9d1a8ea875b Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 4 Sep 2012 13:26:08 +0400 Subject: [PATCH 098/103] Fix Android build with CMake 2.6.3-2.8.3 --- cmake/OpenCVDetectAndroidSDK.cmake | 10 +++++++--- modules/java/CMakeLists.txt | 2 +- modules/java/android_test/CMakeLists.txt | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/cmake/OpenCVDetectAndroidSDK.cmake b/cmake/OpenCVDetectAndroidSDK.cmake index 7d69cc295..5c2761fb5 100644 --- a/cmake/OpenCVDetectAndroidSDK.cmake +++ b/cmake/OpenCVDetectAndroidSDK.cmake @@ -290,7 +290,7 @@ macro(add_android_project target path) COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk WORKING_DIRECTORY "${android_proj_bin_dir}" MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}" - DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME} ${__android_project_chain}) + DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME}) else() add_custom_command( OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk" @@ -299,9 +299,8 @@ macro(add_android_project target path) WORKING_DIRECTORY "${android_proj_bin_dir}" MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}" DEPENDS "${OpenCV_BINARY_DIR}/bin/.classes.jar.dephelper" opencv_java # as we are part of OpenCV we can just force this dependency - DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME} ${__android_project_chain}) + DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME}) endif() - set(__android_project_chain ${target} CACHE INTERNAL "auxiliary variable used for Android progects chaining") unset(JNI_LIB_NAME) @@ -313,6 +312,11 @@ macro(add_android_project target path) add_dependencies(${target} ${android_proj_native_deps}) endif() + if(__android_project_chain) + add_dependencies(${target} ${__android_project_chain}) + endif() + set(__android_project_chain ${target} CACHE INTERNAL "auxiliary variable used for Android progects chaining") + # put the final .apk to the OpenCV's bin folder add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${android_proj_bin_dir}/bin/${target}-debug.apk" "${OpenCV_BINARY_DIR}/bin/${target}.apk") if(INSTALL_ANDROID_EXAMPLES AND "${target}" MATCHES "^example-") diff --git a/modules/java/CMakeLists.txt b/modules/java/CMakeLists.txt index 39c90d354..50592ea22 100644 --- a/modules/java/CMakeLists.txt +++ b/modules/java/CMakeLists.txt @@ -182,7 +182,7 @@ if(ANDROID) # because samples and tests will make a copy of the library before install get_target_property(__opencv_java_location ${the_module} LOCATION) # Turn off stripping in debug build - if ( NOT (CMAKE_BUILD_TYPE MATCHES "debug")) + if ( NOT (CMAKE_BUILD_TYPE MATCHES "Debug")) add_custom_command(TARGET ${the_module} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${__opencv_java_location}") endif() diff --git a/modules/java/android_test/CMakeLists.txt b/modules/java/android_test/CMakeLists.txt index fcbb3b3ec..f6e5a7be9 100644 --- a/modules/java/android_test/CMakeLists.txt +++ b/modules/java/android_test/CMakeLists.txt @@ -48,11 +48,11 @@ add_custom_command( WORKING_DIRECTORY "${opencv_test_java_bin_dir}" MAIN_DEPENDENCY "${opencv_test_java_bin_dir}/${ANDROID_MANIFEST_FILE}" DEPENDS "${OpenCV_BINARY_DIR}/bin/.classes.jar.dephelper" opencv_java - DEPENDS ${opencv_test_java_file_deps} ${__android_project_chain}) -set(__android_project_chain ${PROJECT_NAME} CACHE INTERNAL "auxiliary variable used for Android progects chaining") + DEPENDS ${opencv_test_java_file_deps}) add_custom_target(${PROJECT_NAME} ALL SOURCES "${opencv_test_java_bin_dir}/bin/OpenCVTest-debug.apk" ) -add_dependencies(${PROJECT_NAME} opencv_java) +add_dependencies(${PROJECT_NAME} opencv_java ${__android_project_chain}) +set(__android_project_chain ${PROJECT_NAME} CACHE INTERNAL "auxiliary variable used for Android progects chaining" FORCE) # put the final .apk to the OpenCV's bin folder add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${opencv_test_java_bin_dir}/bin/OpenCVTest-debug.apk" "${OpenCV_BINARY_DIR}/bin/${PROJECT_NAME}.apk") From b0c72809788f03d49b1e311fb502858a74b2de0c Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 4 Sep 2012 16:33:24 +0400 Subject: [PATCH 099/103] Android toolchain: protect from changes of NDK_CCACHE on subsequent cmake --- android/android.toolchain.cmake | 42 +++++++++++++++++---------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/android/android.toolchain.cmake b/android/android.toolchain.cmake index f48f188ea..b8dd429e2 100644 --- a/android/android.toolchain.cmake +++ b/android/android.toolchain.cmake @@ -446,7 +446,7 @@ if( ANDROID_NDK ) string( LENGTH "${ANDROID_NDK}" __length ) string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidNdkPreviousPath ) if( NOT __androidNdkPreviousPath STREQUAL ANDROID_NDK ) - message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all files from your build folder first. + message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all generated files from your build folder first. " ) endif() unset( __androidNdkPreviousPath ) @@ -916,29 +916,31 @@ else() endif() unset( _ndk_ccache ) -# specify the cross compiler -if( NDK_CCACHE ) - set( CMAKE_C_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C compiler" ) - set( CMAKE_CXX_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C++ compiler" ) - set( CMAKE_C_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "gcc") - set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "g++") -else() - set( CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "gcc" ) - set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "g++" ) +# setup the cross-compiler +if( NOT CMAKE_C_COMPILER ) + if( NDK_CCACHE ) + set( CMAKE_C_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C compiler" ) + set( CMAKE_CXX_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C++ compiler" ) + set( CMAKE_C_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "gcc") + set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "g++") + else() + set( CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "gcc" ) + set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "g++" ) + endif() + set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "assembler" ) + set( CMAKE_STRIP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" ) + set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" ) + set( CMAKE_LINKER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ld${TOOL_OS_SUFFIX}" CACHE PATH "linker" ) + set( CMAKE_NM "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-nm${TOOL_OS_SUFFIX}" CACHE PATH "nm" ) + set( CMAKE_OBJCOPY "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" ) + set( CMAKE_OBJDUMP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" ) + set( CMAKE_RANLIB "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ranlib${TOOL_OS_SUFFIX}" CACHE PATH "ranlib" ) endif() -set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "assembler" ) + +set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" ) if( CMAKE_VERSION VERSION_LESS 2.8.5 ) set( CMAKE_ASM_COMPILER_ARG1 "-c" ) endif() -# there may be a way to make cmake deduce these TODO deduce the rest of the tools -set( CMAKE_STRIP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" ) -set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" ) -set( CMAKE_LINKER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ld${TOOL_OS_SUFFIX}" CACHE PATH "linker" ) -set( CMAKE_NM "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-nm${TOOL_OS_SUFFIX}" CACHE PATH "nm" ) -set( CMAKE_OBJCOPY "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" ) -set( CMAKE_OBJDUMP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" ) -set( CMAKE_RANLIB "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ranlib${TOOL_OS_SUFFIX}" CACHE PATH "ranlib" ) -set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" ) if( APPLE ) find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool ) if( NOT CMAKE_INSTALL_NAME_TOOL ) From 02b33792cbffe47974a85ce0f33323caa3932a16 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 4 Sep 2012 16:50:55 +0400 Subject: [PATCH 100/103] Fix precompiled headers support detection for gcc-4.6 toolchain from Android NDK r8b The version reported by toolchain is 4.6.x-google so regex needs an adjustment. --- cmake/OpenCVPCHSupport.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/OpenCVPCHSupport.cmake b/cmake/OpenCVPCHSupport.cmake index 16dbb06a9..290dbd8f6 100644 --- a/cmake/OpenCVPCHSupport.cmake +++ b/cmake/OpenCVPCHSupport.cmake @@ -19,7 +19,7 @@ IF(CMAKE_COMPILER_IS_GNUCXX) ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE gcc_compiler_version) #MESSAGE("GCC Version: ${gcc_compiler_version}") - IF(gcc_compiler_version MATCHES "4\\.[0,2-9]\\.[0-9]") + IF(gcc_compiler_version MATCHES "4\\.[0,2-9]\\.[0-9x]") SET(PCHSupport_FOUND TRUE) ENDIF() From 07d92d9e5a4f3250231c3cddbd51911ebd00c666 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 4 Sep 2012 17:44:23 +0400 Subject: [PATCH 101/103] Fix android build warnings --- modules/contrib/src/bowmsctrainer.cpp | 22 +- modules/contrib/src/openfabmap.cpp | 28 +- modules/objdetect/src/haar.cpp | 776 +++++++++++++------------- samples/cpp/pca.cpp | 64 +-- 4 files changed, 445 insertions(+), 445 deletions(-) diff --git a/modules/contrib/src/bowmsctrainer.cpp b/modules/contrib/src/bowmsctrainer.cpp index c9522825c..448505c5b 100644 --- a/modules/contrib/src/bowmsctrainer.cpp +++ b/modules/contrib/src/bowmsctrainer.cpp @@ -81,46 +81,46 @@ Mat BOWMSCTrainer::cluster() const { return cluster(mergedDescriptors); } -Mat BOWMSCTrainer::cluster(const Mat& descriptors) const { +Mat BOWMSCTrainer::cluster(const Mat& _descriptors) const { - CV_Assert(!descriptors.empty()); + CV_Assert(!_descriptors.empty()); // TODO: sort the descriptors before clustering. - Mat icovar = Mat::eye(descriptors.cols,descriptors.cols,descriptors.type()); + Mat icovar = Mat::eye(_descriptors.cols,_descriptors.cols,_descriptors.type()); vector initialCentres; - initialCentres.push_back(descriptors.row(0)); - for (int i = 1; i < descriptors.rows; i++) { + initialCentres.push_back(_descriptors.row(0)); + for (int i = 1; i < _descriptors.rows; i++) { double minDist = DBL_MAX; for (size_t j = 0; j < initialCentres.size(); j++) { minDist = std::min(minDist, - cv::Mahalanobis(descriptors.row(i),initialCentres[j], + cv::Mahalanobis(_descriptors.row(i),initialCentres[j], icovar)); } if (minDist > clusterSize) - initialCentres.push_back(descriptors.row(i)); + initialCentres.push_back(_descriptors.row(i)); } std::vector > clusters; clusters.resize(initialCentres.size()); - for (int i = 0; i < descriptors.rows; i++) { + for (int i = 0; i < _descriptors.rows; i++) { int index = 0; double dist = 0, minDist = DBL_MAX; for (size_t j = 0; j < initialCentres.size(); j++) { - dist = cv::Mahalanobis(descriptors.row(i),initialCentres[j],icovar); + dist = cv::Mahalanobis(_descriptors.row(i),initialCentres[j],icovar); if (dist < minDist) { minDist = dist; index = (int)j; } } - clusters[index].push_back(descriptors.row(i)); + clusters[index].push_back(_descriptors.row(i)); } // TODO: throw away small clusters. Mat vocabulary; - Mat centre = Mat::zeros(1,descriptors.cols,descriptors.type()); + Mat centre = Mat::zeros(1,_descriptors.cols,_descriptors.type()); for (size_t i = 0; i < clusters.size(); i++) { centre.setTo(0); for (std::list::iterator Ci = clusters[i].begin(); Ci != clusters[i].end(); Ci++) { diff --git a/modules/contrib/src/openfabmap.cpp b/modules/contrib/src/openfabmap.cpp index 99795c9e7..a6b4ac177 100644 --- a/modules/contrib/src/openfabmap.cpp +++ b/modules/contrib/src/openfabmap.cpp @@ -63,7 +63,7 @@ namespace of2 { static double logsumexp(double a, double b) { return a > b ? log(1 + exp(b - a)) + a : log(1 + exp(a - b)) + b; } - + FabMap::FabMap(const Mat& _clTree, double _PzGe, double _PzGNe, int _flags, int _numSamples) : clTree(_clTree), PzGe(_PzGe), PzGNe(_PzGNe), flags( @@ -445,16 +445,16 @@ FabMap1::~FabMap1() { } void FabMap1::getLikelihoods(const Mat& queryImgDescriptor, - const vector& testImgDescriptors, vector& matches) { + const vector& testImageDescriptors, vector& matches) { - for (size_t i = 0; i < testImgDescriptors.size(); i++) { + for (size_t i = 0; i < testImageDescriptors.size(); i++) { bool zq, zpq, Lzq; double logP = 0; for (int q = 0; q < clTree.cols; q++) { zq = queryImgDescriptor.at(0,q) > 0; zpq = queryImgDescriptor.at(0,pq(q)) > 0; - Lzq = testImgDescriptors[i].at(0,q) > 0; + Lzq = testImageDescriptors[i].at(0,q) > 0; logP += log((this->*PzGL)(q, zq, zpq, Lzq)); @@ -490,16 +490,16 @@ FabMapLUT::~FabMapLUT() { } void FabMapLUT::getLikelihoods(const Mat& queryImgDescriptor, - const vector& testImgDescriptors, vector& matches) { + const vector& testImageDescriptors, vector& matches) { double precFactor = (double)pow(10.0, -precision); - for (size_t i = 0; i < testImgDescriptors.size(); i++) { + for (size_t i = 0; i < testImageDescriptors.size(); i++) { unsigned long long int logP = 0; for (int q = 0; q < clTree.cols; q++) { logP += table[q][(queryImgDescriptor.at(0,pq(q)) > 0) + ((queryImgDescriptor.at(0, q) > 0) << 1) + - ((testImgDescriptors[i].at(0,q) > 0) << 2)]; + ((testImageDescriptors[i].at(0,q) > 0) << 2)]; } matches.push_back(IMatch(0,(int)i,-precFactor*(double)logP,0)); } @@ -518,7 +518,7 @@ FabMapFBO::~FabMapFBO() { } void FabMapFBO::getLikelihoods(const Mat& queryImgDescriptor, - const vector& testImgDescriptors, vector& matches) { + const vector& testImageDescriptors, vector& matches) { std::multiset wordData; setWordStatistics(queryImgDescriptor, wordData); @@ -526,7 +526,7 @@ void FabMapFBO::getLikelihoods(const Mat& queryImgDescriptor, vector matchIndices; vector queryMatches; - for (size_t i = 0; i < testImgDescriptors.size(); i++) { + for (size_t i = 0; i < testImageDescriptors.size(); i++) { queryMatches.push_back(IMatch(0,(int)i,0,0)); matchIndices.push_back((int)i); } @@ -543,7 +543,7 @@ void FabMapFBO::getLikelihoods(const Mat& queryImgDescriptor, for (size_t i = 0; i < matchIndices.size(); i++) { bool Lzq = - testImgDescriptors[matchIndices[i]].at(0,wordIter->q) > 0; + testImageDescriptors[matchIndices[i]].at(0,wordIter->q) > 0; queryMatches[matchIndices[i]].likelihood += log((this->*PzGL)(wordIter->q,zq,zpq,Lzq)); currBest = @@ -689,17 +689,17 @@ void FabMap2::add(const vector& queryImgDescriptors) { } void FabMap2::getLikelihoods(const Mat& queryImgDescriptor, - const vector& testImgDescriptors, vector& matches) { + const vector& testImageDescriptors, vector& matches) { - if (&testImgDescriptors== &(this->testImgDescriptors)) { + if (&testImageDescriptors == &testImgDescriptors) { getIndexLikelihoods(queryImgDescriptor, testDefaults, testInvertedMap, matches); } else { CV_Assert(!(flags & MOTION_MODEL)); vector defaults; std::map > invertedMap; - for (size_t i = 0; i < testImgDescriptors.size(); i++) { - addToIndex(testImgDescriptors[i],defaults,invertedMap); + for (size_t i = 0; i < testImageDescriptors.size(); i++) { + addToIndex(testImageDescriptors[i],defaults,invertedMap); } getIndexLikelihoods(queryImgDescriptor, defaults, invertedMap, matches); } diff --git a/modules/objdetect/src/haar.cpp b/modules/objdetect/src/haar.cpp index 3dd032fb9..4ba4e7f69 100644 --- a/modules/objdetect/src/haar.cpp +++ b/modules/objdetect/src/haar.cpp @@ -47,18 +47,18 @@ #if CV_SSE2 || CV_SSE3 # if !CV_SSE4_1 && !CV_SSE4_2 -# define _mm_blendv_pd(a, b, m) _mm_xor_pd(a, _mm_and_pd(_mm_xor_pd(b, a), m)) -# define _mm_blendv_ps(a, b, m) _mm_xor_ps(a, _mm_and_ps(_mm_xor_ps(b, a), m)) +# define _mm_blendv_pd(a, b, m) _mm_xor_pd(a, _mm_and_pd(_mm_xor_pd(b, a), m)) +# define _mm_blendv_ps(a, b, m) _mm_xor_ps(a, _mm_and_ps(_mm_xor_ps(b, a), m)) # endif #endif -# if CV_AVX -# define CV_HAAR_USE_AVX 1 -# else -# if CV_SSE2 || CV_SSE3 -# define CV_HAAR_USE_SSE 1 -# endif -# endif +# if CV_AVX +# define CV_HAAR_USE_AVX 1 +# else +# if CV_SSE2 || CV_SSE3 +# define CV_HAAR_USE_SSE 1 +# endif +# endif /* these settings affect the quality of detection: change with care */ #define CV_ADJUST_FEATURES 1 @@ -634,86 +634,86 @@ cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* _cascade, //AVX version icvEvalHidHaarClassifier. Process 8 CvHidHaarClassifiers per call. Check AVX support before invocation!! -#ifdef CV_HAAR_USE_AVX +#ifdef CV_HAAR_USE_AVX CV_INLINE double icvEvalHidHaarClassifierAVX( CvHidHaarClassifier* classifier, - double variance_norm_factor, size_t p_offset ) + double variance_norm_factor, size_t p_offset ) { - int CV_DECL_ALIGNED(32) idxV[8] = {0,0,0,0,0,0,0,0}; - char flags[8] = {0,0,0,0,0,0,0,0}; - CvHidHaarTreeNode* nodes[8]; - double res = 0; - char exitConditionFlag = 0; - for(;;) - { - float CV_DECL_ALIGNED(32) tmp[8] = {0,0,0,0,0,0,0,0}; - nodes[0] = classifier ->node + idxV[0]; - nodes[1] = (classifier+1)->node + idxV[1]; - nodes[2] = (classifier+2)->node + idxV[2]; - nodes[3] = (classifier+3)->node + idxV[3]; - nodes[4] = (classifier+4)->node + idxV[4]; - nodes[5] = (classifier+5)->node + idxV[5]; - nodes[6] = (classifier+6)->node + idxV[6]; - nodes[7] = (classifier+7)->node + idxV[7]; + int CV_DECL_ALIGNED(32) idxV[8] = {0,0,0,0,0,0,0,0}; + char flags[8] = {0,0,0,0,0,0,0,0}; + CvHidHaarTreeNode* nodes[8]; + double res = 0; + char exitConditionFlag = 0; + for(;;) + { + float CV_DECL_ALIGNED(32) tmp[8] = {0,0,0,0,0,0,0,0}; + nodes[0] = classifier ->node + idxV[0]; + nodes[1] = (classifier+1)->node + idxV[1]; + nodes[2] = (classifier+2)->node + idxV[2]; + nodes[3] = (classifier+3)->node + idxV[3]; + nodes[4] = (classifier+4)->node + idxV[4]; + nodes[5] = (classifier+5)->node + idxV[5]; + nodes[6] = (classifier+6)->node + idxV[6]; + nodes[7] = (classifier+7)->node + idxV[7]; - __m256 t = _mm256_set1_ps(variance_norm_factor); - t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); + __m256 t = _mm256_set1_ps(variance_norm_factor); + t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); - __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), - calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], - p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); - __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, - nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); - __m256 sum = _mm256_mul_ps(offset, weight); - - offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), - calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), - calc_sum(nodes[0]->feature.rect[1],p_offset)); - weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, - nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); - - sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); - - if( nodes[0]->feature.rect[2].p0 ) - tmp[0] = calc_sum(nodes[0]->feature.rect[2],p_offset) * nodes[0]->feature.rect[2].weight; - if( nodes[1]->feature.rect[2].p0 ) + __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), + calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], + p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); + __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, + nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); + __m256 sum = _mm256_mul_ps(offset, weight); + + offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), + calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), + calc_sum(nodes[0]->feature.rect[1],p_offset)); + weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, + nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); + + sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); + + if( nodes[0]->feature.rect[2].p0 ) + tmp[0] = calc_sum(nodes[0]->feature.rect[2],p_offset) * nodes[0]->feature.rect[2].weight; + if( nodes[1]->feature.rect[2].p0 ) tmp[1] = calc_sum(nodes[1]->feature.rect[2],p_offset) * nodes[1]->feature.rect[2].weight; - if( nodes[2]->feature.rect[2].p0 ) + if( nodes[2]->feature.rect[2].p0 ) tmp[2] = calc_sum(nodes[2]->feature.rect[2],p_offset) * nodes[2]->feature.rect[2].weight; - if( nodes[3]->feature.rect[2].p0 ) + if( nodes[3]->feature.rect[2].p0 ) tmp[3] = calc_sum(nodes[3]->feature.rect[2],p_offset) * nodes[3]->feature.rect[2].weight; - if( nodes[4]->feature.rect[2].p0 ) - tmp[4] = calc_sum(nodes[4]->feature.rect[2],p_offset) * nodes[4]->feature.rect[2].weight; - if( nodes[5]->feature.rect[2].p0 ) + if( nodes[4]->feature.rect[2].p0 ) + tmp[4] = calc_sum(nodes[4]->feature.rect[2],p_offset) * nodes[4]->feature.rect[2].weight; + if( nodes[5]->feature.rect[2].p0 ) tmp[5] = calc_sum(nodes[5]->feature.rect[2],p_offset) * nodes[5]->feature.rect[2].weight; - if( nodes[6]->feature.rect[2].p0 ) + if( nodes[6]->feature.rect[2].p0 ) tmp[6] = calc_sum(nodes[6]->feature.rect[2],p_offset) * nodes[6]->feature.rect[2].weight; - if( nodes[7]->feature.rect[2].p0 ) + if( nodes[7]->feature.rect[2].p0 ) tmp[7] = calc_sum(nodes[7]->feature.rect[2],p_offset) * nodes[7]->feature.rect[2].weight; - - sum = _mm256_add_ps(sum,_mm256_load_ps(tmp)); - __m256 left = _mm256_set_ps(nodes[7]->left,nodes[6]->left,nodes[5]->left,nodes[4]->left,nodes[3]->left,nodes[2]->left,nodes[1]->left,nodes[0]->left); - __m256 right = _mm256_set_ps(nodes[7]->right,nodes[6]->right,nodes[5]->right,nodes[4]->right,nodes[3]->right,nodes[2]->right,nodes[1]->right,nodes[0]->right); + sum = _mm256_add_ps(sum,_mm256_load_ps(tmp)); - _mm256_store_si256((__m256i*)idxV,_mm256_cvttps_epi32(_mm256_blendv_ps(right, left,_mm256_cmp_ps(sum, t, _CMP_LT_OQ )))); + __m256 left = _mm256_set_ps(nodes[7]->left,nodes[6]->left,nodes[5]->left,nodes[4]->left,nodes[3]->left,nodes[2]->left,nodes[1]->left,nodes[0]->left); + __m256 right = _mm256_set_ps(nodes[7]->right,nodes[6]->right,nodes[5]->right,nodes[4]->right,nodes[3]->right,nodes[2]->right,nodes[1]->right,nodes[0]->right); - for(int i = 0; i < 8; i++) - { - if(idxV[i]<=0) - { - if(!flags[i]) - { - exitConditionFlag++; - flags[i]=1; - res+=((classifier+i)->alpha[-idxV[i]]); - } - idxV[i]=0; - } - } - if(exitConditionFlag==8) - return res; - } + _mm256_store_si256((__m256i*)idxV,_mm256_cvttps_epi32(_mm256_blendv_ps(right, left,_mm256_cmp_ps(sum, t, _CMP_LT_OQ )))); + + for(int i = 0; i < 8; i++) + { + if(idxV[i]<=0) + { + if(!flags[i]) + { + exitConditionFlag++; + flags[i]=1; + res+=((classifier+i)->alpha[-idxV[i]]); + } + idxV[i]=0; + } + } + if(exitConditionFlag==8) + return res; + } } #endif @@ -723,50 +723,50 @@ double icvEvalHidHaarClassifier( CvHidHaarClassifier* classifier, size_t p_offset ) { int idx = 0; - /*#if CV_HAAR_USE_SSE && !CV_HAAR_USE_AVX - if(cv::checkHardwareSupport(CV_CPU_SSE2))//based on old SSE variant. Works slow - { - double CV_DECL_ALIGNED(16) temp[2]; - __m128d zero = _mm_setzero_pd(); - do - { - CvHidHaarTreeNode* node = classifier->node + idx; - __m128d t = _mm_set1_pd((node->threshold)*variance_norm_factor); - __m128d left = _mm_set1_pd(node->left); - __m128d right = _mm_set1_pd(node->right); + /*#if CV_HAAR_USE_SSE && !CV_HAAR_USE_AVX + if(cv::checkHardwareSupport(CV_CPU_SSE2))//based on old SSE variant. Works slow + { + double CV_DECL_ALIGNED(16) temp[2]; + __m128d zero = _mm_setzero_pd(); + do + { + CvHidHaarTreeNode* node = classifier->node + idx; + __m128d t = _mm_set1_pd((node->threshold)*variance_norm_factor); + __m128d left = _mm_set1_pd(node->left); + __m128d right = _mm_set1_pd(node->right); - double _sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - _sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - _sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + double _sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + _sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + _sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; - __m128d sum = _mm_set1_pd(_sum); - t = _mm_cmplt_sd(sum, t); - sum = _mm_blendv_pd(right, left, t); + __m128d sum = _mm_set1_pd(_sum); + t = _mm_cmplt_sd(sum, t); + sum = _mm_blendv_pd(right, left, t); - _mm_store_pd(temp, sum); - idx = (int)temp[0]; - } - while(idx > 0 ); - - } - else - #endif*/ + _mm_store_pd(temp, sum); + idx = (int)temp[0]; + } + while(idx > 0 ); + + } + else + #endif*/ { - do - { + do + { CvHidHaarTreeNode* node = classifier->node + idx; double t = node->threshold * variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + if( node->feature.rect[2].p0 ) + sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; - idx = sum < t ? node->left : node->right; - } - while( idx > 0 ); + idx = sum < t ? node->left : node->right; + } + while( idx > 0 ); } return classifier->alpha[-idx]; } @@ -777,18 +777,18 @@ static int cvRunHaarClassifierCascadeSum( const CvHaarClassifierCascade* _cascade, CvPoint pt, double& stage_sum, int start_stage ) { - #ifdef CV_HAAR_USE_AVX - bool haveAVX = false; - if(cv::checkHardwareSupport(CV_CPU_AVX)) - if(_xgetbv(_XCR_XFEATURE_ENABLED_MASK)&0x6)// Check if the OS will save the YMM registers - { - haveAVX = true; - } - #else - #ifdef CV_HAAR_USE_SSE - bool haveSSE2 = cv::checkHardwareSupport(CV_CPU_SSE2); - #endif - #endif + #ifdef CV_HAAR_USE_AVX + bool haveAVX = false; + if(cv::checkHardwareSupport(CV_CPU_AVX)) + if(_xgetbv(_XCR_XFEATURE_ENABLED_MASK)&0x6)// Check if the OS will save the YMM registers + { + haveAVX = true; + } + #else + #ifdef CV_HAAR_USE_SSE + bool haveSSE2 = cv::checkHardwareSupport(CV_CPU_SSE2); + #endif + #endif int p_offset, pq_offset; int i, j; @@ -828,17 +828,17 @@ cvRunHaarClassifierCascadeSum( const CvHaarClassifierCascade* _cascade, { stage_sum = 0.0; - #ifdef CV_HAAR_USE_AVX - if(haveAVX) - { - for( ; j < cascade->stage_classifier[i].count-8; j+=8 ) - { - stage_sum += icvEvalHidHaarClassifierAVX( - cascade->stage_classifier[i].classifier+j, - variance_norm_factor, p_offset ); - } - } - #endif + #ifdef CV_HAAR_USE_AVX + if(haveAVX) + { + for( ; j < cascade->stage_classifier[i].count-8; j+=8 ) + { + stage_sum += icvEvalHidHaarClassifierAVX( + cascade->stage_classifier[i].classifier+j, + variance_norm_factor, p_offset ); + } + } + #endif for( j = 0; j < ptr->count; j++ ) { stage_sum += icvEvalHidHaarClassifier( ptr->classifier + j, variance_norm_factor, p_offset ); @@ -859,283 +859,283 @@ cvRunHaarClassifierCascadeSum( const CvHaarClassifierCascade* _cascade, } else if( cascade->isStumpBased ) { - #ifdef CV_HAAR_USE_AVX - if(haveAVX) - { - CvHidHaarClassifier* classifiers[8]; - CvHidHaarTreeNode* nodes[8]; - for( i = start_stage; i < cascade->count; i++ ) - { - stage_sum = 0.0; - int j = 0; - float CV_DECL_ALIGNED(32) buf[8]; - if( cascade->stage_classifier[i].two_rects ) - { - for( ; j <= cascade->stage_classifier[i].count-8; j+=8 ) - { - //__m256 stage_sumPart = _mm256_setzero_ps(); - classifiers[0] = cascade->stage_classifier[i].classifier + j; - nodes[0] = classifiers[0]->node; - classifiers[1] = cascade->stage_classifier[i].classifier + j + 1; - nodes[1] = classifiers[1]->node; - classifiers[2] = cascade->stage_classifier[i].classifier + j + 2; - nodes[2]= classifiers[2]->node; - classifiers[3] = cascade->stage_classifier[i].classifier + j + 3; - nodes[3] = classifiers[3]->node; - classifiers[4] = cascade->stage_classifier[i].classifier + j + 4; - nodes[4] = classifiers[4]->node; - classifiers[5] = cascade->stage_classifier[i].classifier + j + 5; - nodes[5] = classifiers[5]->node; - classifiers[6] = cascade->stage_classifier[i].classifier + j + 6; - nodes[6] = classifiers[6]->node; - classifiers[7] = cascade->stage_classifier[i].classifier + j + 7; - nodes[7] = classifiers[7]->node; + #ifdef CV_HAAR_USE_AVX + if(haveAVX) + { + CvHidHaarClassifier* classifiers[8]; + CvHidHaarTreeNode* nodes[8]; + for( i = start_stage; i < cascade->count; i++ ) + { + stage_sum = 0.0; + int j = 0; + float CV_DECL_ALIGNED(32) buf[8]; + if( cascade->stage_classifier[i].two_rects ) + { + for( ; j <= cascade->stage_classifier[i].count-8; j+=8 ) + { + //__m256 stage_sumPart = _mm256_setzero_ps(); + classifiers[0] = cascade->stage_classifier[i].classifier + j; + nodes[0] = classifiers[0]->node; + classifiers[1] = cascade->stage_classifier[i].classifier + j + 1; + nodes[1] = classifiers[1]->node; + classifiers[2] = cascade->stage_classifier[i].classifier + j + 2; + nodes[2]= classifiers[2]->node; + classifiers[3] = cascade->stage_classifier[i].classifier + j + 3; + nodes[3] = classifiers[3]->node; + classifiers[4] = cascade->stage_classifier[i].classifier + j + 4; + nodes[4] = classifiers[4]->node; + classifiers[5] = cascade->stage_classifier[i].classifier + j + 5; + nodes[5] = classifiers[5]->node; + classifiers[6] = cascade->stage_classifier[i].classifier + j + 6; + nodes[6] = classifiers[6]->node; + classifiers[7] = cascade->stage_classifier[i].classifier + j + 7; + nodes[7] = classifiers[7]->node; - __m256 t = _mm256_set1_ps(variance_norm_factor); - t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); + __m256 t = _mm256_set1_ps(variance_norm_factor); + t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); - __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), - calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], - p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); - __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, - nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); - __m256 sum = _mm256_mul_ps(offset, weight); + __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), + calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], + p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); + __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, + nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); + __m256 sum = _mm256_mul_ps(offset, weight); - offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), - calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), - calc_sum(nodes[0]->feature.rect[1],p_offset)); - weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, - nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); - sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); - - __m256 alpha0 = _mm256_set_ps(classifiers[7]->alpha[0],classifiers[6]->alpha[0],classifiers[5]->alpha[0],classifiers[4]->alpha[0],classifiers[3]->alpha[0], - classifiers[2]->alpha[0],classifiers[1]->alpha[0],classifiers[0]->alpha[0]); - __m256 alpha1 = _mm256_set_ps(classifiers[7]->alpha[1],classifiers[6]->alpha[1],classifiers[5]->alpha[1],classifiers[4]->alpha[1],classifiers[3]->alpha[1], - classifiers[2]->alpha[1],classifiers[1]->alpha[1],classifiers[0]->alpha[1]); + offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), + calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), + calc_sum(nodes[0]->feature.rect[1],p_offset)); + weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, + nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); + sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); - _mm256_store_ps(buf, _mm256_blendv_ps(alpha0, alpha1, _mm256_cmp_ps(t, sum, _CMP_LE_OQ ))); - stage_sum+=(buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6]+buf[7]); - - } - - for( ; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; + __m256 alpha0 = _mm256_set_ps(classifiers[7]->alpha[0],classifiers[6]->alpha[0],classifiers[5]->alpha[0],classifiers[4]->alpha[0],classifiers[3]->alpha[0], + classifiers[2]->alpha[0],classifiers[1]->alpha[0],classifiers[0]->alpha[0]); + __m256 alpha1 = _mm256_set_ps(classifiers[7]->alpha[1],classifiers[6]->alpha[1],classifiers[5]->alpha[1],classifiers[4]->alpha[1],classifiers[3]->alpha[1], + classifiers[2]->alpha[1],classifiers[1]->alpha[1],classifiers[0]->alpha[1]); - double t = node->threshold*variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - stage_sum += classifier->alpha[sum >= t]; - } - } - else - { - for( ; j <= (cascade->stage_classifier[i].count)-8; j+=8 ) - { - float CV_DECL_ALIGNED(32) tmp[8] = {0,0,0,0,0,0,0,0}; + _mm256_store_ps(buf, _mm256_blendv_ps(alpha0, alpha1, _mm256_cmp_ps(t, sum, _CMP_LE_OQ ))); + stage_sum+=(buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6]+buf[7]); - classifiers[0] = cascade->stage_classifier[i].classifier + j; - nodes[0] = classifiers[0]->node; - classifiers[1] = cascade->stage_classifier[i].classifier + j + 1; - nodes[1] = classifiers[1]->node; - classifiers[2] = cascade->stage_classifier[i].classifier + j + 2; - nodes[2]= classifiers[2]->node; - classifiers[3] = cascade->stage_classifier[i].classifier + j + 3; - nodes[3] = classifiers[3]->node; - classifiers[4] = cascade->stage_classifier[i].classifier + j + 4; - nodes[4] = classifiers[4]->node; - classifiers[5] = cascade->stage_classifier[i].classifier + j + 5; - nodes[5] = classifiers[5]->node; - classifiers[6] = cascade->stage_classifier[i].classifier + j + 6; - nodes[6] = classifiers[6]->node; - classifiers[7] = cascade->stage_classifier[i].classifier + j + 7; - nodes[7] = classifiers[7]->node; + } - __m256 t = _mm256_set1_ps(variance_norm_factor); - t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); - - __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), - calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], - p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); - __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, - nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); - __m256 sum = _mm256_mul_ps(offset, weight); + for( ; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; - offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), - calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), - calc_sum(nodes[0]->feature.rect[1],p_offset)); - weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, - nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); - - sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + else + { + for( ; j <= (cascade->stage_classifier[i].count)-8; j+=8 ) + { + float CV_DECL_ALIGNED(32) tmp[8] = {0,0,0,0,0,0,0,0}; - if( nodes[0]->feature.rect[2].p0 ) - tmp[0] = calc_sum(nodes[0]->feature.rect[2],p_offset) * nodes[0]->feature.rect[2].weight; - if( nodes[1]->feature.rect[2].p0 ) - tmp[1] = calc_sum(nodes[1]->feature.rect[2],p_offset) * nodes[1]->feature.rect[2].weight; - if( nodes[2]->feature.rect[2].p0 ) - tmp[2] = calc_sum(nodes[2]->feature.rect[2],p_offset) * nodes[2]->feature.rect[2].weight; - if( nodes[3]->feature.rect[2].p0 ) - tmp[3] = calc_sum(nodes[3]->feature.rect[2],p_offset) * nodes[3]->feature.rect[2].weight; - if( nodes[4]->feature.rect[2].p0 ) - tmp[4] = calc_sum(nodes[4]->feature.rect[2],p_offset) * nodes[4]->feature.rect[2].weight; - if( nodes[5]->feature.rect[2].p0 ) - tmp[5] = calc_sum(nodes[5]->feature.rect[2],p_offset) * nodes[5]->feature.rect[2].weight; - if( nodes[6]->feature.rect[2].p0 ) - tmp[6] = calc_sum(nodes[6]->feature.rect[2],p_offset) * nodes[6]->feature.rect[2].weight; - if( nodes[7]->feature.rect[2].p0 ) - tmp[7] = calc_sum(nodes[7]->feature.rect[2],p_offset) * nodes[7]->feature.rect[2].weight; - - sum = _mm256_add_ps(sum, _mm256_load_ps(tmp)); + classifiers[0] = cascade->stage_classifier[i].classifier + j; + nodes[0] = classifiers[0]->node; + classifiers[1] = cascade->stage_classifier[i].classifier + j + 1; + nodes[1] = classifiers[1]->node; + classifiers[2] = cascade->stage_classifier[i].classifier + j + 2; + nodes[2]= classifiers[2]->node; + classifiers[3] = cascade->stage_classifier[i].classifier + j + 3; + nodes[3] = classifiers[3]->node; + classifiers[4] = cascade->stage_classifier[i].classifier + j + 4; + nodes[4] = classifiers[4]->node; + classifiers[5] = cascade->stage_classifier[i].classifier + j + 5; + nodes[5] = classifiers[5]->node; + classifiers[6] = cascade->stage_classifier[i].classifier + j + 6; + nodes[6] = classifiers[6]->node; + classifiers[7] = cascade->stage_classifier[i].classifier + j + 7; + nodes[7] = classifiers[7]->node; - __m256 alpha0 = _mm256_set_ps(classifiers[7]->alpha[0],classifiers[6]->alpha[0],classifiers[5]->alpha[0],classifiers[4]->alpha[0],classifiers[3]->alpha[0], - classifiers[2]->alpha[0],classifiers[1]->alpha[0],classifiers[0]->alpha[0]); - __m256 alpha1 = _mm256_set_ps(classifiers[7]->alpha[1],classifiers[6]->alpha[1],classifiers[5]->alpha[1],classifiers[4]->alpha[1],classifiers[3]->alpha[1], - classifiers[2]->alpha[1],classifiers[1]->alpha[1],classifiers[0]->alpha[1]); + __m256 t = _mm256_set1_ps(variance_norm_factor); + t = _mm256_mul_ps(t, _mm256_set_ps(nodes[7]->threshold,nodes[6]->threshold,nodes[5]->threshold,nodes[4]->threshold,nodes[3]->threshold,nodes[2]->threshold,nodes[1]->threshold,nodes[0]->threshold)); - __m256 outBuf = _mm256_blendv_ps(alpha0, alpha1, _mm256_cmp_ps(t, sum, _CMP_LE_OQ )); - outBuf = _mm256_hadd_ps(outBuf, outBuf); - outBuf = _mm256_hadd_ps(outBuf, outBuf); - _mm256_store_ps(buf, outBuf); - stage_sum+=(buf[0]+buf[4]);//(buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6]+buf[7]); - } - - for( ; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; + __m256 offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[0],p_offset), calc_sum(nodes[6]->feature.rect[0],p_offset), calc_sum(nodes[5]->feature.rect[0],p_offset), + calc_sum(nodes[4]->feature.rect[0],p_offset), calc_sum(nodes[3]->feature.rect[0],p_offset), calc_sum(nodes[2]->feature.rect[0],p_offset), calc_sum(nodes[1]->feature.rect[0], + p_offset),calc_sum(nodes[0]->feature.rect[0],p_offset)); + __m256 weight = _mm256_set_ps(nodes[7]->feature.rect[0].weight, nodes[6]->feature.rect[0].weight, nodes[5]->feature.rect[0].weight, + nodes[4]->feature.rect[0].weight, nodes[3]->feature.rect[0].weight, nodes[2]->feature.rect[0].weight, nodes[1]->feature.rect[0].weight, nodes[0]->feature.rect[0].weight); + __m256 sum = _mm256_mul_ps(offset, weight); - double t = node->threshold*variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; - stage_sum += classifier->alpha[sum >= t]; - } - } - if( stage_sum < cascade->stage_classifier[i].threshold ) - return -i; - } - } - else - #endif - #ifdef CV_HAAR_USE_SSE && !CV_HAAR_USE_AVX //old SSE optimization - if(haveSSE2) - { - for( i = start_stage; i < cascade->count; i++ ) - { - __m128d stage_sum = _mm_setzero_pd(); - if( cascade->stage_classifier[i].two_rects ) - { - for( j = 0; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; + offset = _mm256_set_ps(calc_sum(nodes[7]->feature.rect[1],p_offset),calc_sum(nodes[6]->feature.rect[1],p_offset),calc_sum(nodes[5]->feature.rect[1],p_offset), + calc_sum(nodes[4]->feature.rect[1],p_offset),calc_sum(nodes[3]->feature.rect[1],p_offset),calc_sum(nodes[2]->feature.rect[1],p_offset),calc_sum(nodes[1]->feature.rect[1],p_offset), + calc_sum(nodes[0]->feature.rect[1],p_offset)); + weight = _mm256_set_ps(nodes[7]->feature.rect[1].weight, nodes[6]->feature.rect[1].weight, nodes[5]->feature.rect[1].weight, nodes[4]->feature.rect[1].weight, + nodes[3]->feature.rect[1].weight, nodes[2]->feature.rect[1].weight, nodes[1]->feature.rect[1].weight, nodes[0]->feature.rect[1].weight); - // ayasin - NHM perf optim. Avoid use of costly flaky jcc - __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); - __m128d a = _mm_set_sd(classifier->alpha[0]); - __m128d b = _mm_set_sd(classifier->alpha[1]); - __m128d sum = _mm_set_sd(calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight + - calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight); - t = _mm_cmpgt_sd(t, sum); - stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); - } - } - else - { - for( j = 0; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; - // ayasin - NHM perf optim. Avoid use of costly flaky jcc - __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); - __m128d a = _mm_set_sd(classifier->alpha[0]); - __m128d b = _mm_set_sd(classifier->alpha[1]); - double _sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - _sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - _sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; - __m128d sum = _mm_set_sd(_sum); + sum = _mm256_add_ps(sum, _mm256_mul_ps(offset,weight)); - t = _mm_cmpgt_sd(t, sum); - stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); - } - } - __m128d i_threshold = _mm_set1_pd(cascade->stage_classifier[i].threshold); - if( _mm_comilt_sd(stage_sum, i_threshold) ) - return -i; - } - } - else - #endif - { - for( i = start_stage; i < cascade->count; i++ ) - { - stage_sum = 0.0; - if( cascade->stage_classifier[i].two_rects ) - { - for( j = 0; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; - double t = node->threshold*variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - stage_sum += classifier->alpha[sum >= t]; - } - } - else - { - for( j = 0; j < cascade->stage_classifier[i].count; j++ ) - { - CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; - CvHidHaarTreeNode* node = classifier->node; - double t = node->threshold*variance_norm_factor; - double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; - sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; - if( node->feature.rect[2].p0 ) - sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; - stage_sum += classifier->alpha[sum >= t]; - } - } - if( stage_sum < cascade->stage_classifier[i].threshold ) - return -i; - } - } - } - - else + if( nodes[0]->feature.rect[2].p0 ) + tmp[0] = calc_sum(nodes[0]->feature.rect[2],p_offset) * nodes[0]->feature.rect[2].weight; + if( nodes[1]->feature.rect[2].p0 ) + tmp[1] = calc_sum(nodes[1]->feature.rect[2],p_offset) * nodes[1]->feature.rect[2].weight; + if( nodes[2]->feature.rect[2].p0 ) + tmp[2] = calc_sum(nodes[2]->feature.rect[2],p_offset) * nodes[2]->feature.rect[2].weight; + if( nodes[3]->feature.rect[2].p0 ) + tmp[3] = calc_sum(nodes[3]->feature.rect[2],p_offset) * nodes[3]->feature.rect[2].weight; + if( nodes[4]->feature.rect[2].p0 ) + tmp[4] = calc_sum(nodes[4]->feature.rect[2],p_offset) * nodes[4]->feature.rect[2].weight; + if( nodes[5]->feature.rect[2].p0 ) + tmp[5] = calc_sum(nodes[5]->feature.rect[2],p_offset) * nodes[5]->feature.rect[2].weight; + if( nodes[6]->feature.rect[2].p0 ) + tmp[6] = calc_sum(nodes[6]->feature.rect[2],p_offset) * nodes[6]->feature.rect[2].weight; + if( nodes[7]->feature.rect[2].p0 ) + tmp[7] = calc_sum(nodes[7]->feature.rect[2],p_offset) * nodes[7]->feature.rect[2].weight; + + sum = _mm256_add_ps(sum, _mm256_load_ps(tmp)); + + __m256 alpha0 = _mm256_set_ps(classifiers[7]->alpha[0],classifiers[6]->alpha[0],classifiers[5]->alpha[0],classifiers[4]->alpha[0],classifiers[3]->alpha[0], + classifiers[2]->alpha[0],classifiers[1]->alpha[0],classifiers[0]->alpha[0]); + __m256 alpha1 = _mm256_set_ps(classifiers[7]->alpha[1],classifiers[6]->alpha[1],classifiers[5]->alpha[1],classifiers[4]->alpha[1],classifiers[3]->alpha[1], + classifiers[2]->alpha[1],classifiers[1]->alpha[1],classifiers[0]->alpha[1]); + + __m256 outBuf = _mm256_blendv_ps(alpha0, alpha1, _mm256_cmp_ps(t, sum, _CMP_LE_OQ )); + outBuf = _mm256_hadd_ps(outBuf, outBuf); + outBuf = _mm256_hadd_ps(outBuf, outBuf); + _mm256_store_ps(buf, outBuf); + stage_sum+=(buf[0]+buf[4]);//(buf[0]+buf[1]+buf[2]+buf[3]+buf[4]+buf[5]+buf[6]+buf[7]); + } + + for( ; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + if( stage_sum < cascade->stage_classifier[i].threshold ) + return -i; + } + } + else + #endif + #if defined CV_HAAR_USE_SSE && CV_HAAR_USE_SSE && !CV_HAAR_USE_AVX //old SSE optimization + if(haveSSE2) + { + for( i = start_stage; i < cascade->count; i++ ) + { + __m128d stage_sum = _mm_setzero_pd(); + if( cascade->stage_classifier[i].two_rects ) + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + + // ayasin - NHM perf optim. Avoid use of costly flaky jcc + __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); + __m128d a = _mm_set_sd(classifier->alpha[0]); + __m128d b = _mm_set_sd(classifier->alpha[1]); + __m128d sum = _mm_set_sd(calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight + + calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight); + t = _mm_cmpgt_sd(t, sum); + stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); + } + } + else + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + // ayasin - NHM perf optim. Avoid use of costly flaky jcc + __m128d t = _mm_set_sd(node->threshold*variance_norm_factor); + __m128d a = _mm_set_sd(classifier->alpha[0]); + __m128d b = _mm_set_sd(classifier->alpha[1]); + double _sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + _sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + _sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + __m128d sum = _mm_set_sd(_sum); + + t = _mm_cmpgt_sd(t, sum); + stage_sum = _mm_add_sd(stage_sum, _mm_blendv_pd(b, a, t)); + } + } + __m128d i_threshold = _mm_set1_pd(cascade->stage_classifier[i].threshold); + if( _mm_comilt_sd(stage_sum, i_threshold) ) + return -i; + } + } + else + #endif + { + for( i = start_stage; i < cascade->count; i++ ) + { + stage_sum = 0.0; + if( cascade->stage_classifier[i].two_rects ) + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + else + { + for( j = 0; j < cascade->stage_classifier[i].count; j++ ) + { + CvHidHaarClassifier* classifier = cascade->stage_classifier[i].classifier + j; + CvHidHaarTreeNode* node = classifier->node; + double t = node->threshold*variance_norm_factor; + double sum = calc_sum(node->feature.rect[0],p_offset) * node->feature.rect[0].weight; + sum += calc_sum(node->feature.rect[1],p_offset) * node->feature.rect[1].weight; + if( node->feature.rect[2].p0 ) + sum += calc_sum(node->feature.rect[2],p_offset) * node->feature.rect[2].weight; + stage_sum += classifier->alpha[sum >= t]; + } + } + if( stage_sum < cascade->stage_classifier[i].threshold ) + return -i; + } + } + } + + else { for( i = start_stage; i < cascade->count; i++ ) { stage_sum = 0.0; - int j = 0; - #ifdef CV_HAAR_USE_AVX - if(haveAVX) - { - for( ; j < cascade->stage_classifier[i].count-8; j+=8 ) - { - stage_sum += icvEvalHidHaarClassifierAVX( - cascade->stage_classifier[i].classifier+j, - variance_norm_factor, p_offset ); - } - } - #endif - for(; j < cascade->stage_classifier[i].count; j++ ) - { - - stage_sum += icvEvalHidHaarClassifier( - cascade->stage_classifier[i].classifier + j, - variance_norm_factor, p_offset ); - } - + int k = 0; + #ifdef CV_HAAR_USE_AVX + if(haveAVX) + { + for( ; k < cascade->stage_classifier[i].count-8; k+=8 ) + { + stage_sum += icvEvalHidHaarClassifierAVX( + cascade->stage_classifier[i].classifier+k, + variance_norm_factor, p_offset ); + } + } + #endif + for(; k < cascade->stage_classifier[i].count; k++ ) + { + + stage_sum += icvEvalHidHaarClassifier( + cascade->stage_classifier[i].classifier + k, + variance_norm_factor, p_offset ); + } + if( stage_sum < cascade->stage_classifier[i].threshold ) return -i; } } - //_mm256_zeroupper(); + //_mm256_zeroupper(); return 1; } diff --git a/samples/cpp/pca.cpp b/samples/cpp/pca.cpp index b489a5e2b..7ab86eaf0 100644 --- a/samples/cpp/pca.cpp +++ b/samples/cpp/pca.cpp @@ -1,13 +1,13 @@ /* * pca.cpp * -* Author: +* Author: * Kevin Hughes * * Special Thanks to: * Philipp Wagner * -* This program demonstrates how to use OpenCV PCA with a +* This program demonstrates how to use OpenCV PCA with a * specified amount of variance to retain. The effect * is illustrated further by using a trackbar to * change the value for retained varaince. @@ -17,9 +17,9 @@ * on this list of images. The author recommends using * the first 15 faces of the AT&T face data set: * http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html -* +* * so for example your input text file would look like this: -* +* * /orl_faces/s1/1.pgm * /orl_faces/s2/1.pgm * /orl_faces/s3/1.pgm @@ -50,7 +50,7 @@ using namespace std; /////////////////////// // Functions -void read_imgList(const string& filename, vector& images) { +static void read_imgList(const string& filename, vector& images) { std::ifstream file(filename.c_str(), ifstream::in); if (!file) { string error_message = "No valid input file was given, please check the given filename."; @@ -62,19 +62,19 @@ void read_imgList(const string& filename, vector& images) { } } -Mat formatImagesForPCA(const vector &data) +static Mat formatImagesForPCA(const vector &data) { Mat dst(data.size(), data[0].rows*data[0].cols, CV_32F); for(unsigned int i = 0; i < data.size(); i++) { Mat image_row = data[i].clone().reshape(1,1); Mat row_i = dst.row(i); - image_row.convertTo(row_i,CV_32F); + image_row.convertTo(row_i,CV_32F); } return dst; } -Mat toGrayscale(InputArray _src) { +static Mat toGrayscale(InputArray _src) { Mat src = _src.getMat(); // only allow one channel if(src.channels() != 1) { @@ -95,22 +95,22 @@ struct params string winName; }; -void onTrackbar(int pos, void* ptr) -{ +static void onTrackbar(int pos, void* ptr) +{ cout << "Retained Variance = " << pos << "% "; cout << "re-calculating PCA..." << std::flush; - + double var = pos / 100.0; - + struct params *p = (struct params *)ptr; - + p->pca = PCA(p->data, cv::Mat(), CV_PCA_DATA_AS_ROW, var); - + Mat point = p->pca.project(p->data.row(0)); Mat reconstruction = p->pca.backProject(point); reconstruction = reconstruction.reshape(p->ch, p->rows); reconstruction = toGrayscale(reconstruction); - + imshow(p->winName, reconstruction); cout << "done! # of principal components: " << p->pca.eigenvectors.rows << endl; } @@ -118,19 +118,19 @@ void onTrackbar(int pos, void* ptr) /////////////////////// // Main -int main(int argc, char** argv) +int main(int argc, char** argv) { if (argc != 2) { cout << "usage: " << argv[0] << " " << endl; exit(1); } - + // Get the path to your CSV. string imgList = string(argv[1]); - + // vector to hold the images vector images; - + // Read in the data. This can fail if not valid try { read_imgList(imgList, images); @@ -138,29 +138,29 @@ int main(int argc, char** argv) cerr << "Error opening file \"" << imgList << "\". Reason: " << e.msg << endl; exit(1); } - + // Quit if there are not enough images for this demo. if(images.size() <= 1) { string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!"; CV_Error(CV_StsError, error_message); } - + // Reshape and stack images into a rowMatrix Mat data = formatImagesForPCA(images); - + // perform PCA PCA pca(data, cv::Mat(), CV_PCA_DATA_AS_ROW, 0.95); // trackbar is initially set here, also this is a common value for retainedVariance - - // Demonstration of the effect of retainedVariance on the first image + + // Demonstration of the effect of retainedVariance on the first image Mat point = pca.project(data.row(0)); // project into the eigenspace, thus the image becomes a "point" Mat reconstruction = pca.backProject(point); // re-create the image from the "point" reconstruction = reconstruction.reshape(images[0].channels(), images[0].rows); // reshape from a row vector into image shape reconstruction = toGrayscale(reconstruction); // re-scale for displaying purposes - + // init highgui window string winName = "Reconstruction | press 'q' to quit"; namedWindow(winName, CV_WINDOW_NORMAL); - + // params struct to pass to the trackbar handler params p; p.data = data; @@ -168,17 +168,17 @@ int main(int argc, char** argv) p.rows = images[0].rows; p.pca = pca; p.winName = winName; - + // create the tracbar int pos = 95; - createTrackbar("Retained Variance (%)", winName, &pos, 100, onTrackbar, (void*)&p); - + createTrackbar("Retained Variance (%)", winName, &pos, 100, onTrackbar, (void*)&p); + // display until user presses q imshow(winName, reconstruction); - + char key = 0; while(key != 'q') key = waitKey(); - - return 0; + + return 0; } From be51e5d1b15ec44a333bdec344cbdfd177150f0c Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 4 Sep 2012 21:52:40 +0400 Subject: [PATCH 102/103] More strict tests for image waring algorithms --- modules/imgproc/test/test_imgwarp_strict.cpp | 1339 ++++++++++++++++++ 1 file changed, 1339 insertions(+) create mode 100644 modules/imgproc/test/test_imgwarp_strict.cpp diff --git a/modules/imgproc/test/test_imgwarp_strict.cpp b/modules/imgproc/test/test_imgwarp_strict.cpp new file mode 100644 index 000000000..535f0c459 --- /dev/null +++ b/modules/imgproc/test/test_imgwarp_strict.cpp @@ -0,0 +1,1339 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of Intel Corporation may not 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 Intel Corporation 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. +// +//M*/ + +#include "test_precomp.hpp" + +#include +#include +#include + +using namespace cv; +using namespace std; + +void __wrap_printf_func(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + char buffer[256]; + vsprintf (buffer, fmt, args); + cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, buffer); + va_end(args); +} + +#define PRINT_TO_LOG __wrap_printf_func +#define SHOW_IMAGE +#undef SHOW_IMAGE + +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// ImageWarpBaseTest +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +class CV_ImageWarpBaseTest : + public cvtest::BaseTest +{ +public: + enum + { + cell_size = 10 + }; + + CV_ImageWarpBaseTest(); + + virtual void run(int); + + virtual ~CV_ImageWarpBaseTest(); + +protected: + virtual void generate_test_data(); + + virtual void run_func() = 0; + virtual void run_reference_func() = 0; + virtual void validate_results() const = 0; + + Size randSize(RNG& rng) const; + + const char* interpolation_to_string(int inter_type) const; + + int interpolation; + Mat src; + Mat dst; +}; + +CV_ImageWarpBaseTest::CV_ImageWarpBaseTest() : + BaseTest(), interpolation(-1), + src(), dst() +{ + test_case_count = 40; + ts->set_failed_test_info(cvtest::TS::OK); +} + +CV_ImageWarpBaseTest::~CV_ImageWarpBaseTest() +{ +} + +const char* CV_ImageWarpBaseTest::interpolation_to_string(int inter) const +{ + if (inter == INTER_NEAREST) + return "INTER_NEAREST"; + if (inter == INTER_LINEAR) + return "INTER_LINEAR"; + if (inter == INTER_AREA) + return "INTER_AREA"; + if (inter == INTER_CUBIC) + return "INTER_CUBIC"; + if (inter == INTER_LANCZOS4) + return "INTER_LANCZOS4"; + if (inter == INTER_LANCZOS4 + 1) + return "INTER_AREA_FAST"; + return "Unsupported/Unkown interpolation type"; +} + +void interpolateLinear(float x, float* coeffs) +{ + coeffs[0] = 1.f - x; + coeffs[1] = x; +} + +void interpolateCubic(float x, float* coeffs) +{ + const float A = -0.75f; + + coeffs[0] = ((A*(x + 1) - 5*A)*(x + 1) + 8*A)*(x + 1) - 4*A; + coeffs[1] = ((A + 2)*x - (A + 3))*x*x + 1; + coeffs[2] = ((A + 2)*(1 - x) - (A + 3))*(1 - x)*(1 - x) + 1; + coeffs[3] = 1.f - coeffs[0] - coeffs[1] - coeffs[2]; +} + +void interpolateLanczos4(float x, float* coeffs) +{ + static const double s45 = 0.70710678118654752440084436210485; + static const double cs[][2]= + {{1, 0}, {-s45, -s45}, {0, 1}, {s45, -s45}, {-1, 0}, {s45, s45}, {0, -1}, {-s45, s45}}; + + if( x < FLT_EPSILON ) + { + for( int i = 0; i < 8; i++ ) + coeffs[i] = 0; + coeffs[3] = 1; + return; + } + + float sum = 0; + double y0=-(x+3)*CV_PI*0.25, s0 = sin(y0), c0=cos(y0); + for(int i = 0; i < 8; i++ ) + { + double y = -(x+3-i)*CV_PI*0.25; + coeffs[i] = (float)((cs[i][0]*s0 + cs[i][1]*c0)/(y*y)); + sum += coeffs[i]; + } + + sum = 1.f/sum; + for(int i = 0; i < 8; i++ ) + coeffs[i] *= sum; +} + +typedef void (*interpolate_method)(float x, float* coeffs); +interpolate_method inter_array[] = { &interpolateLinear, &interpolateCubic, &interpolateLanczos4 }; + +Size CV_ImageWarpBaseTest::randSize(RNG& rng) const +{ + Size size; + size.width = saturate_cast(std::exp(rng.uniform(0.0f, 7.0f))); + size.height = saturate_cast(std::exp(rng.uniform(0.0f, 7.0f))); + + return size; +} + +void CV_ImageWarpBaseTest::generate_test_data() +{ + RNG& rng = ts->get_rng(); + + Size ssize = randSize(rng); + + int depth = CV_8S; + while (depth == CV_8S || depth == CV_32S) + depth = rng.uniform(0, CV_64F); + + int cn = rng.uniform(1, 4); + while (cn == 2) + cn = rng.uniform(1, 4); + interpolation = rng.uniform(0, CV_INTER_LANCZOS4 + 1); + interpolation = INTER_NEAREST; + + src.create(ssize, CV_MAKE_TYPE(depth, cn)); + + // generating the src matrix + int x, y; + if (cvtest::randInt(rng) % 2) + { + for (y = 0; y < ssize.height; y += cell_size) + for (x = 0; x < ssize.width; x += cell_size) + rectangle(src, Point(x, y), Point(x + std::min(cell_size, ssize.width - x), y + + std::min(cell_size, ssize.height - y)), Scalar::all((x + y) % 2 ? 255: 0), CV_FILLED); + } + else + { + src = Scalar::all(255); + for (y = cell_size; y < src.rows; y += cell_size) + line(src, Point2i(0, y), Point2i(src.cols, y), Scalar::all(0), 1); + for (x = cell_size; x < src.cols; x += cell_size) + line(src, Point2i(x, 0), Point2i(x, src.rows), Scalar::all(0), 1); + } +} + +void CV_ImageWarpBaseTest::run(int) +{ + for (int i = 0; i < test_case_count; ++i) + { + generate_test_data(); + run_func(); + run_reference_func(); + if (ts->get_err_code() < 0) + break; + validate_results(); + if (ts->get_err_code() < 0) + break; + ts->update_context(this, i, true); + } + ts->set_gtest_status(); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// Resize +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +class CV_Resize_Test : + public CV_ImageWarpBaseTest +{ +public: + CV_Resize_Test(); + virtual ~CV_Resize_Test(); + +protected: + virtual void generate_test_data(); + + virtual void run_func(); + virtual void run_reference_func(); + virtual void validate_results() const; + +private: + double scale_x; + double scale_y; + bool area_fast; + Mat reference_dst; + + void resize_generic(); + void resize_area(); + double getWeight(double a, double b, int x); + + typedef std::vector > dim; + void generate_buffer(double scale, dim& _dim); + void resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _dim); +}; + +CV_Resize_Test::CV_Resize_Test() : + CV_ImageWarpBaseTest(), scale_x(), scale_y(), + area_fast(false), reference_dst() +{ +} + +CV_Resize_Test::~CV_Resize_Test() +{ +} + +void CV_Resize_Test::generate_test_data() +{ + CV_ImageWarpBaseTest::generate_test_data(); + RNG& rng = ts->get_rng(); + Size dsize, ssize = src.size(); + + if (interpolation == INTER_AREA) + { + area_fast = rng.uniform(0., 1.) > 0.5; + if (area_fast) + { + scale_x = rng.uniform(2, 5); + scale_y = rng.uniform(2, 5); + } + else + { + scale_x = rng.uniform(1.0, 3.0); + scale_y = rng.uniform(1.0, 3.0); + } + } + else + { + scale_x = rng.uniform(0.4, 4.0); + scale_y = rng.uniform(0.4, 4.0); + } + dsize.width = saturate_cast((ssize.width + scale_x - 1) / scale_x); + dsize.height = saturate_cast((ssize.height + scale_y - 1) / scale_y); + + dst = Mat::zeros(dsize, src.type()); + reference_dst = Mat::zeros(dst.size(), CV_MAKE_TYPE(CV_32F, dst.channels())); + + scale_x = src.cols / static_cast(dst.cols); + scale_y = src.rows / static_cast(dst.rows); + + if (interpolation == INTER_AREA && (scale_x < 1.0 || scale_y < 1.0)) + interpolation = INTER_LINEAR; + + area_fast = interpolation == INTER_AREA && + fabs(scale_x - cvRound(scale_x)) < FLT_EPSILON && + fabs(scale_y - cvRound(scale_y)) < FLT_EPSILON; + if (area_fast) + { + scale_x = cvRound(scale_x); + scale_y = cvRound(scale_y); + } +} + +void CV_Resize_Test::run_func() +{ + cv::resize(src, dst, dst.size(), 0, 0, interpolation); +} + +void CV_Resize_Test::run_reference_func() +{ + if (src.depth() != CV_32F) + { + Mat tmp; + src.convertTo(tmp, CV_32F); + src = tmp; + } + if (interpolation == INTER_AREA) + resize_area(); + else + resize_generic(); +} + +double CV_Resize_Test::getWeight(double a, double b, int x) +{ + float w = std::min(x + 1, b) - std::max(x, a); + CV_Assert(w >= 0); + return w; +} + +void CV_Resize_Test::resize_area() +{ + Size ssize = src.size(), dsize = reference_dst.size(); + CV_Assert(ssize.area() > 0 && dsize.area() > 0); + int cn = src.channels(); + + CV_Assert(scale_x >= 1.0 && scale_y >= 1.0); + + double fsy0 = 0, fsy1 = scale_y; + for (int dy = 0; dy < dsize.height; ++dy) + { + float* yD = reference_dst.ptr(dy); + int isy0 = cvFloor(fsy0), isy1 = std::min(cvFloor(fsy1), ssize.height - 1); + CV_Assert(isy1 <= ssize.height && isy0 < ssize.height); + + float fsx0 = 0, fsx1 = scale_x; + + for (int dx = 0; dx < dsize.width; ++dx) + { + float* xyD = yD + cn * dx; + int isx0 = cvFloor(fsx0), isx1 = std::min(ssize.width - 1, cvFloor(fsx1)); + + CV_Assert(isx1 <= ssize.width); + CV_Assert(isx0 < ssize.width); + + // for each pixel of dst + for (int r = 0; r < cn; ++r) + { + xyD[r] = 0.0f; + double area = 0.0; + for (int sy = isy0; sy <= isy1; ++sy) + { + const float* yS = src.ptr(sy); + for (int sx = isx0; sx <= isx1; ++sx) + { + double wy = getWeight(fsy0, fsy1, sy); + double wx = getWeight(fsx0, fsx1, sx); + double w = wx * wy; + xyD[r] += yS[sx * cn + r] * w; + area += w; + } + } + + CV_Assert(area != 0); + // norming pixel + xyD[r] /= area; + } + fsx1 = std::min((fsx0 = fsx1) + scale_x, ssize.width); + } + fsy1 = std::min((fsy0 = fsy1) + scale_y, ssize.height); + } +} + +// for interpolation type : INTER_LINEAR, INTER_LINEAR, INTER_CUBIC, INTER_LANCZOS4 +void CV_Resize_Test::resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _dim) +{ + Size dsize = _dst.size(); + int cn = _dst.channels(); + float* yD = _dst.ptr(dy); + + if (interpolation == INTER_NEAREST) + { + const float* yS = _src.ptr(dy); + for (int dx = 0; dx < dsize.width; ++dx) + { + int isx = _dim[dx].first; + const float* xyS = yS + isx * cn; + float* xyD = yD + dx * cn; + + for (int r = 0; r < cn; ++r) + xyD[r] = xyS[r]; + } + } + else if (interpolation == INTER_LINEAR || interpolation == INTER_CUBIC || interpolation == INTER_LANCZOS4) + { + interpolate_method inter_func = inter_array[interpolation - (interpolation == INTER_LANCZOS4 ? 2 : 1)]; + int elemsize = _src.elemSize(); + + int ofs = 0, ksize = 2; + if (interpolation == INTER_CUBIC) + ofs = 1, ksize = 4; + else if (interpolation == INTER_LANCZOS4) + ofs = 3, ksize = 8; + + Mat _extended_src_row(1, _src.cols + ksize * 2, _src.type()); + uchar* srow = _src.data + dy * _src.step; + memcpy(_extended_src_row.data + elemsize * ksize, srow, _src.step); + for (int k = 0; k < ksize; ++k) + { + memcpy(_extended_src_row.data + k * elemsize, srow, elemsize); + memcpy(_extended_src_row.data + (ksize + k) * elemsize + _src.step, srow + _src.step - elemsize, elemsize); + } + + for (int dx = 0; dx < dsize.width; ++dx) + { + int isx = _dim[dx].first; + double fsx = _dim[dx].second; + + float *xyD = yD + dx * cn; + const float* xyS = _extended_src_row.ptr(0) + (isx + ksize - ofs) * cn; + + float w[ksize]; + inter_func(fsx, w); + + for (int r = 0; r < cn; ++r) + { + xyD[r] = 0; + for (int k = 0; k < ksize; ++k) + xyD[r] += w[k] * xyS[k * cn + r]; + xyD[r] = xyD[r]; + } + } + } + else + CV_Assert(0); +} + +void CV_Resize_Test::generate_buffer(double scale, dim& _dim) +{ + int length = _dim.size(); + for (int dx = 0; dx < length; ++dx) + { + double fsx = scale * (dx + 0.5f) - 0.5f; + int isx = cvFloor(fsx); + _dim[dx] = std::make_pair(isx, fsx - isx); + } +} + +void CV_Resize_Test::resize_generic() +{ + Size dsize = reference_dst.size(), ssize = src.size(); + CV_Assert(dsize.area() > 0 && ssize.area() > 0); + + dim dims[] = { dim(dsize.width), dim(dsize.height) }; + if (interpolation == INTER_NEAREST) + { + for (int dx = 0; dx < dsize.width; ++dx) + dims[0][dx].first = std::min(cvFloor(dx * scale_x), ssize.width - 1); + for (int dy = 0; dy < dsize.height; ++dy) + dims[1][dy].first = std::min(cvFloor(dy * scale_y), ssize.height - 1); + } + else + { + generate_buffer(scale_x, dims[0]); + generate_buffer(scale_y, dims[1]); + } + + Mat tmp(ssize.height, dsize.width, reference_dst.type()); + for (int dy = 0; dy < tmp.rows; ++dy) + resize_1d(src, tmp, dy, dims[0]); + + transpose(tmp, tmp); + transpose(reference_dst, reference_dst); + + for (int dy = 0; dy < tmp.rows; ++dy) + resize_1d(tmp, reference_dst, dy, dims[1]); + transpose(reference_dst, reference_dst); +} + +void CV_Resize_Test::validate_results() const +{ + Mat _dst = dst; + if (dst.depth() != reference_dst.depth()) + { + Mat tmp; + dst.convertTo(tmp, reference_dst.depth()); + _dst = tmp; + } + + Size dsize = dst.size(); + int cn = _dst.channels(); + dsize.width *= cn; + float t = 1.0f; + if (interpolation == INTER_CUBIC) + t = 1.0f; + else if (interpolation == INTER_LANCZOS4) + t = 1.0f; + else if (interpolation == INTER_NEAREST) + t = 1.0f; + else if (interpolation == INTER_AREA) + t = 2.0f; + + for (int dy = 0; dy < dsize.height; ++dy) + { + const float* rD = reference_dst.ptr(dy); + const float* D = _dst.ptr(dy); + + for (int dx = 0; dx < dsize.width; ++dx) + if (fabs(rD[dx] - D[dx]) > t /* && D[dx] <= 255.0f && rD[dx] <= 255.f */) + { + PRINT_TO_LOG("\nNorm of the difference: %lf\n", norm(reference_dst, _dst, NORM_INF)); + PRINT_TO_LOG("Error in (dx, dy): (%d, %d)\n", dx / cn + 1, dy + 1); + PRINT_TO_LOG("Tuple (rD, D): (%f, %f)\n", rD[dx], D[dx]); + PRINT_TO_LOG("Dsize: (%d, %d)\n", dsize.width / cn, dsize.height); + PRINT_TO_LOG("Ssize: (%d, %d)\n", src.cols, src.rows); + PRINT_TO_LOG("Interpolation: %s\n", + interpolation_to_string(area_fast ? INTER_LANCZOS4 + 1 : interpolation)); + PRINT_TO_LOG("Scale (x, y): (%lf, %lf)\n", scale_x, scale_y); + PRINT_TO_LOG("Elemsize: %d\n", src.elemSize()); + PRINT_TO_LOG("Channels: %d\n", cn); + +#ifdef SHOW_IMAGE + const std::string w1("Resize (run func)"), w2("Reference Resize"), w3("Src image"), w4("Diff"); + namedWindow(w1, CV_WINDOW_KEEPRATIO); + namedWindow(w2, CV_WINDOW_KEEPRATIO); + namedWindow(w3, CV_WINDOW_KEEPRATIO); + namedWindow(w4, CV_WINDOW_KEEPRATIO); + + Mat diff; + absdiff(reference_dst, _dst, diff); + + imshow(w1, dst); + imshow(w2, reference_dst); + imshow(w3, src); + imshow(w4, diff); + + waitKey(); +#endif + /* + const int radius = 3; + int rmin = MAX(dy - radius, 0), rmax = MIN(dy + radius, dsize.height); + int cmin = MAX(dx - radius, 0), cmax = MIN(dx + radius, dsize.width); + + cout << "opencv result:\n" << dst(Range(rmin, rmax), Range(cmin, cmax)) << endl; + cout << "reference result:\n" << reference_dst(Range(rmin, rmax), Range(cmin, cmax)) << endl; + */ + + ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); + return; + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// remap +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +class CV_Remap_Test : + public CV_ImageWarpBaseTest +{ +public: + CV_Remap_Test(); + + virtual ~CV_Remap_Test(); + +private: + typedef void (CV_Remap_Test::*remap_func)(const Mat&, Mat&); + +protected: + virtual void generate_test_data(); + virtual void prepare_test_data_for_reference_func(); + + virtual void run_func(); + virtual void run_reference_func(); + virtual void validate_results() const; + + Mat mapx, mapy; + int borderType; + Scalar borderValue; + + remap_func funcs[2]; + + Mat dilate_src; + Mat erode_src; + Mat dilate_dst; + Mat erode_dst; + +private: + void remap_nearest(const Mat&, Mat&); + void remap_generic(const Mat&, Mat&); + + void convert_maps(); + const char* borderType_to_string() const; +}; + +CV_Remap_Test::CV_Remap_Test() : + CV_ImageWarpBaseTest(), mapx(), mapy(), + borderType(), borderValue(), dilate_src(), erode_src(), + dilate_dst(), erode_dst() +{ + funcs[0] = &CV_Remap_Test::remap_nearest; + funcs[1] = &CV_Remap_Test::remap_generic; +} + +CV_Remap_Test::~CV_Remap_Test() +{ +} + +const char* CV_Remap_Test::borderType_to_string() const +{ + if (borderType == BORDER_CONSTANT) + return "BORDER_CONSTANT"; + if (borderType == BORDER_REPLICATE) + return "BORDER_REPLICATE"; + if (borderType == BORDER_REFLECT) + return "BORDER_REFLECT"; + return "Unsupported/Unkown border type"; +} + +void CV_Remap_Test::generate_test_data() +{ + CV_ImageWarpBaseTest::generate_test_data(); + + RNG& rng = ts->get_rng(); + borderType = rng.uniform(1, BORDER_WRAP); + borderValue = Scalar::all(rng.uniform(0, 255)); + + Size dsize = randSize(rng); + dst.create(dsize, src.type()); + + // generating the mapx, mapy matrix + static const int mapx_types[] = { CV_16SC2, CV_32FC1, CV_32FC2 }; + mapx.create(dst.size(), mapx_types[rng.uniform(0, sizeof(mapx_types) / sizeof(int))]); + mapy.release(); + + const int n = std::min(std::min(src.cols, src.rows) / 10 + 1, 2); + float _n = 0; //static_cast(-n); + +// mapy.release(); +// mapx.create(dst.size(), CV_32FC2); +// for (int y = 0; y < dsize.height; ++y) +// { +// float* yM = mapx.ptr(y); +// for (int x = 0; x < dsize.width; ++x) +// { +// float* xyM = yM + (x << 1); +// xyM[0] = x; +// xyM[1] = y; +// } +// } +// return; + + switch (mapx.type()) + { + case CV_16SC2: + { + MatIterator_ begin_x = mapx.begin(), end_x = mapx.end(); + for ( ; begin_x != end_x; ++begin_x) + { + begin_x[0] = rng.uniform(static_cast(_n), std::max(src.cols + n - 1, 0)); + begin_x[1] = rng.uniform(static_cast(_n), std::max(src.rows + n - 1, 0)); + } + + if (interpolation != INTER_NEAREST) + { + static const int mapy_types[] = { CV_16UC1, CV_16SC1 }; + mapy.create(dst.size(), mapy_types[rng.uniform(0, sizeof(mapy_types) / sizeof(int))]); + + switch (mapy.type()) + { + case CV_16UC1: + { + MatIterator_ begin_y = mapy.begin(), end_y = mapy.end(); + for ( ; begin_y != end_y; ++begin_y) + begin_y[0] = rng.uniform(0, 1024); + } + break; + + case CV_16SC1: + { + MatIterator_ begin_y = mapy.begin(), end_y = mapy.end(); + for ( ; begin_y != end_y; ++begin_y) + begin_y[0] = rng.uniform(0, 1024); + } + break; + } + } + } + break; + + case CV_32FC1: + { + mapy.create(dst.size(), CV_32FC1); + float fscols = static_cast(std::max(src.cols - 1 + n, 0)), + fsrows = static_cast(std::max(src.rows - 1 + n, 0)); + MatIterator_ begin_x = mapx.begin(), end_x = mapx.end(); + MatIterator_ begin_y = mapy.begin(); + for ( ; begin_x != end_x; ++begin_x, ++begin_y) + { + begin_x[0] = rng.uniform(_n, fscols); + begin_y[0] = rng.uniform(_n, fsrows); + } + } + break; + + case CV_32FC2: + { + MatIterator_ begin_x = mapx.begin(), end_x = mapx.end(); + float fscols = static_cast(std::max(src.cols - 1 + n, 0)), + fsrows = static_cast(std::max(src.rows - 1 + n, 0)); + for ( ; begin_x != end_x; ++begin_x) + { + begin_x[0] = rng.uniform(_n, fscols); + begin_x[1] = rng.uniform(_n, fsrows); + } + } + break; + } +} + +void CV_Remap_Test::run_func() +{ + remap(src, dst, mapx, mapy, interpolation, borderType, borderValue); +} + +void CV_Remap_Test::convert_maps() +{ + if (mapx.type() == mapy.type() && mapx.type() == CV_32FC1) + { + Mat maps[] = { mapx, mapy }; + Mat dst_map; + merge(maps, sizeof(maps) / sizeof(Mat), dst_map); + mapx = dst_map; + } + else if (interpolation == INTER_NEAREST && mapx.type() == CV_16SC2) + { + Mat tmp_mapx; + mapx.convertTo(tmp_mapx, CV_32F); + mapx = tmp_mapx; + mapy.release(); + return; + } + else if (mapx.type() != CV_32FC2) + { + Mat out_mapy; + convertMaps(mapx.clone(), mapy, mapx, out_mapy, CV_32FC2, interpolation == INTER_NEAREST); + } + + mapy.release(); +} + +void CV_Remap_Test::prepare_test_data_for_reference_func() +{ + convert_maps(); + + if (src.depth() != CV_32F) + { + Mat _src; + src.convertTo(_src, CV_32F); + src = _src; + } + +/* + const int ksize = 3; + Mat kernel = getStructuringElement(CV_MOP_ERODE, Size(ksize, ksize)); + Mat mask(src.size(), CV_8UC1, Scalar::all(255)), dst_mask; + cv::erode(src, erode_src, kernel); + cv::erode(mask, dst_mask, kernel, Point(-1, -1), 1, BORDER_CONSTANT, Scalar::all(0)); + bitwise_not(dst_mask, mask); + src.copyTo(erode_src, mask); + dst_mask.release(); + + mask = Scalar::all(0); + kernel = getStructuringElement(CV_MOP_DILATE, kernel.size()); + cv::dilate(src, dilate_src, kernel); + cv::dilate(mask, dst_mask, kernel, Point(-1, -1), 1, BORDER_CONSTANT, Scalar::all(255)); + src.copyTo(dilate_src, dst_mask); + dst_mask.release(); +*/ + + dilate_src = src; + erode_src = src; + + dilate_dst = Mat::zeros(dst.size(), dilate_src.type()); + erode_dst = Mat::zeros(dst.size(), erode_src.type()); +} + +void CV_Remap_Test::run_reference_func() +{ + prepare_test_data_for_reference_func(); + + if (interpolation == INTER_AREA) + interpolation = INTER_LINEAR; + CV_Assert(interpolation != INTER_AREA); + + int index = interpolation == INTER_NEAREST ? 0 : 1; + (this->*funcs[index])(erode_src, erode_dst); + (this->*funcs[index])(dilate_src, dilate_dst); +} + +void CV_Remap_Test::remap_nearest(const Mat& _src, Mat& _dst) +{ + CV_Assert(_src.depth() == CV_32F && _dst.type() == _src.type()); + CV_Assert(mapx.type() == CV_32FC2); + + Size ssize = _src.size(), dsize = _dst.size(); + CV_Assert(ssize.area() > 0 && dsize.area() > 0); + int cn = _src.channels(); + + for (int dy = 0; dy < dsize.height; ++dy) + { + const float* yM = mapx.ptr(dy); + float* yD = _dst.ptr(dy); + + for (int dx = 0; dx < dsize.width; ++dx) + { + float* xyD = yD + cn * dx; + int sx = cvRound(yM[dx * 2]), sy = cvRound(yM[dx * 2 + 1]); + + if (sx >= 0 && sx < ssize.width && sy >= 0 && sy < ssize.height) + { + const float *S = _src.ptr(sy) + sx * cn; + + for (int r = 0; r < cn; ++r) + xyD[r] = S[r]; + } + else if (borderType != BORDER_TRANSPARENT) + { + if (borderType == BORDER_CONSTANT) + for (int r = 0; r < cn; ++r) + xyD[r] = borderValue[r]; + else + { + sx = borderInterpolate(sx, ssize.width, borderType); + sy = borderInterpolate(sy, ssize.height, borderType); + CV_Assert(sx >= 0 && sy >= 0 && sx < ssize.width && sy < ssize.height); + + const float *S = _src.ptr(sy) + sx * cn; + + for (int r = 0; r < cn; ++r) + xyD[r] = S[r]; + } + } + } + } +} + +void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst) +{ + int ksize = 2; + if (interpolation == INTER_CUBIC) + ksize = 4; + else if (interpolation == INTER_LANCZOS4) + ksize = 8; + int ofs = (ksize / 2) - 1; + + CV_Assert(_src.depth() == CV_32F && _dst.type() == _src.type()); + CV_Assert(mapx.type() == CV_32FC2); + + Size ssize = _src.size(), dsize = _dst.size(); + int cn = _src.channels(), width1 = std::max(ssize.width - ksize / 2, 0), height1 = std::max(ssize.height - ksize / 2, 0); + + float ix[8], w[16]; + interpolate_method inter_func = inter_array[interpolation - (interpolation == INTER_LANCZOS4 ? 2 : 1)]; + + for (int dy = 0; dy < dsize.height; ++dy) + { + const float* yM = mapx.ptr(dy); + float* yD = _dst.ptr(dy); + + for (int dx = 0; dx < dsize.width; ++dx) + { + float* xyD = yD + dx * cn; + float sx = yM[dx * 2], sy = yM[dx * 2 + 1]; + int isx = cvFloor(sx), isy = cvFloor(sy); + + float fsx = sx - isx, fsy = sy - isy; + inter_func(fsx, w); + inter_func(fsy, w + ksize); + + if (isx >= ofs && isx < width1 && isy >= ofs && isy < height1) + { + for (int r = 0; r < cn; ++r) + { + for (int y = 0; y < ksize; ++y) + { + const float* xyS = _src.ptr(isy + y - ofs) + isx * cn; + + ix[y] = 0; + for (int i = 0; i < ksize; ++i) + ix[y] += w[i] * xyS[i * cn + r]; + } + + xyD[r] = 0; + for (int i = 0; i < ksize; ++i) + xyD[r] += w[ksize + i] * ix[i]; + } + } + else if (borderType != BORDER_TRANSPARENT) + { + if (borderType == BORDER_CONSTANT && + (isx >= ssize.width || isx + ksize <= 0 || + isy >= ssize.height || isy + ksize <= 0)) + for (int r = 0; r < cn; ++r) + xyD[r] = borderValue[r]; + else + { + int ar_x[8], ar_y[8]; + + for(int k = 0; k < ksize; k++ ) + { + ar_x[k] = borderInterpolate(isx + k - ofs, ssize.width, borderType) * cn; + ar_y[k] = borderInterpolate(isy + k - ofs, ssize.height, borderType); + + CV_Assert(ar_x[k] < ssize.width * cn && ar_y[k] < ssize.height); + } + + for (int r = 0; r < cn; r++) + { +// if (interpolation == INTER_LINEAR) + { + xyD[r] = 0; + for (int i = 0; i < ksize; ++i) + { + ix[i] = 0; + if (ar_y[i] >= 0) + { + const float* yS = _src.ptr(ar_y[i]); + for (int j = 0; j < ksize; ++j) + if (ar_x[j] >= 0) + { + CV_Assert(ar_x[j] < ssize.width * cn); + ix[i] += yS[ar_x[j] + r] * w[j]; + } + else + ix[i] += borderValue[r] * w[j]; + } + else + for (int j = 0; j < ksize; ++j) + ix[i] += borderValue[r] * w[j]; + } + for (int i = 0; i < ksize; ++i) + xyD[r] += w[ksize + i] * ix[i]; + } +// else +// { +// int ONE = 1; +// if (src.elemSize() == 4) +// ONE <<= 15; +// +// float cv = borderValue[r], sum = cv * ONE; +// for (int i = 0; i < ksize; ++i) +// { +// int yi = ar_y[i]; +// if (yi < 0) +// continue; +// const float* S1 = _src.ptr(ar_y[i]); +// for (int j = 0; j < ksize; ++j) +// if( ar_x[j] >= 0 ) +// sum += (S1[ar_x[j] + r] - cv) * w[j]; +// } +// xyD[r] = sum; +// } + } + } + } + } + } +} + +void CV_Remap_Test::validate_results() const +{ + Mat _dst; + dst.convertTo(_dst, CV_32F); + + Size dsize = _dst.size(), ssize = src.size(); + dsize.width *= _dst.channels(); + + CV_Assert(_dst.size() == erode_dst.size() && dilate_dst.size() == _dst.size()); + CV_Assert(dilate_dst.type() == _dst.type() && _dst.type() == erode_dst.type()); + + for (int y = 0; y < dsize.height; ++y) + { + const float* D = _dst.ptr(y); + const float* dD = dilate_dst.ptr(y); + const float* eD = erode_dst.ptr(y); + dD = eD; + + float t = 6.2f; + for (int x = 0; x < dsize.width; ++x) + if ( !((eD[x] - t <= D[x] || (eD[x] >= 255.0f && D[x] >= 255.0f)) && (D[x] <= dD[x] + t || (eD[x] >= 255.0f && D[x] >= 255.0f))) ) + { + PRINT_TO_LOG("\nnorm(erode_dst, dst): %lf\n", norm(erode_dst, _dst, NORM_INF)); + PRINT_TO_LOG("norm(dst, dilate_dst): %lf\n", norm(_dst, dilate_dst, NORM_INF)); + PRINT_TO_LOG("(dx, dy): (%d, %d)\n", x / _dst.channels() + 1, 1 + y); + PRINT_TO_LOG("Values = (%f, %f, %f)\n", eD[x], D[x], dD[x]); + PRINT_TO_LOG("Interpolation: %s\n", + interpolation_to_string((interpolation | CV_WARP_INVERSE_MAP) ^ CV_WARP_INVERSE_MAP)); + PRINT_TO_LOG("Ssize: (%d, %d)\n", ssize.width, ssize.height); + PRINT_TO_LOG("Dsize: (%d, %d)\n", _dst.cols, dsize.height); + PRINT_TO_LOG("BorderType: %s\n", borderType_to_string()); + PRINT_TO_LOG("BorderValue: (%f, %f, %f, %f)\n", + borderValue[0], borderValue[1], borderValue[2], borderValue[3]); + +#ifdef _SHOW_IMAGE + + std::string w1("Dst"), w2("Erode dst"), w3("Dilate dst"), w4("Diff erode"), w5("Diff dilate"); + + cv::namedWindow(w1, CV_WINDOW_AUTOSIZE); + cv::namedWindow(w2, CV_WINDOW_AUTOSIZE); + cv::namedWindow(w3, CV_WINDOW_AUTOSIZE); + cv::namedWindow(w4, CV_WINDOW_AUTOSIZE); + cv::namedWindow(w5, CV_WINDOW_AUTOSIZE); + + Mat diff_dilate, diff_erode; + absdiff(_dst, erode_dst, diff_erode); + absdiff(_dst, dilate_dst, diff_dilate); + + cv::imshow(w1, dst / 255.); + cv::imshow(w2, erode_dst / 255.); + cv::imshow(w3, dilate_dst / 255.); + cv::imshow(w4, erode_dst / 255.); + cv::imshow(w5, dilate_dst / 255.); + + cv::waitKey(); + +#endif + + /* + const int radius = 3; + int rmin = MAX(y - radius, 0), rmax = MIN(y + radius, dsize.height); + int cmin = MAX(x - radius, 0), cmax = MIN(x + radius, dsize.width); + + cout << "src:\n" << src(Range(rmin, rmax), Range(cmin, cmax)) << endl; + cout << "opencv result:\n" << dst(Range(rmin, rmax), Range(cmin, cmax)) << endl << std::endl; + cout << "erode src:\n" << erode_src(Range(rmin, rmax), Range(cmin, cmax)) << endl; + cout << "erode result:\n" << dilate_dst(Range(rmin, rmax), Range(cmin, cmax)) << endl << std::endl; + cout << "dilate src:\n" << dilate_src(Range(rmin, rmax), Range(cmin, cmax)) << endl; + cout << "dilate result:\n" << dilate_dst(Range(rmin, rmax), Range(cmin, cmax)) << endl << std::endl; + */ + + ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); + return; + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// warpAffine +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +class CV_WarpAffine_Test : + public CV_Remap_Test +{ +public: + CV_WarpAffine_Test(); + + virtual ~CV_WarpAffine_Test(); + +protected: + virtual void generate_test_data(); + + virtual void run_func(); + virtual void run_reference_func(); + + Mat M; +private: + void warpAffine(const Mat&, Mat&); +}; + +CV_WarpAffine_Test::CV_WarpAffine_Test() : + CV_Remap_Test() +{ +} + +CV_WarpAffine_Test::~CV_WarpAffine_Test() +{ +} + +void CV_WarpAffine_Test::generate_test_data() +{ + CV_Remap_Test::generate_test_data(); + CV_Remap_Test::prepare_test_data_for_reference_func(); + + if (src.depth() != CV_32F) + { + Mat tmp; + src.convertTo(tmp, CV_32F); + src = tmp; + } + + RNG& rng = ts->get_rng(); + + // generating the M 2x3 matrix + static const int depths[] = { CV_32FC1, CV_64FC1 }; + + // generating 2d matrix + M = getRotationMatrix2D(Point2f(src.cols / 2.f, src.rows / 2.f), + rng.uniform(-180.f, 180.f), rng.uniform(0.4f, 2.0f)); + int depth = depths[rng.uniform(0, sizeof(depths) / sizeof(depths[0]))]; + if (M.depth() != depth) + { + Mat tmp; + M.convertTo(tmp, depth); + M = tmp; + } + + // warp_matrix is inverse + if (rng.uniform(0., 1.) > 0) + interpolation |= CV_WARP_INVERSE_MAP; +} + +void CV_WarpAffine_Test::run_func() +{ + cv::warpAffine(src, dst, M, dst.size(), interpolation, borderType, borderValue); +} + +void CV_WarpAffine_Test::run_reference_func() +{ + CV_Remap_Test::prepare_test_data_for_reference_func(); + + warpAffine(erode_src, erode_dst); + warpAffine(dilate_src, dilate_dst); +} + +void CV_WarpAffine_Test::warpAffine(const Mat& _src, Mat& _dst) +{ + Size dsize = _dst.size(); + + CV_Assert(_src.size().area() > 0 && dsize.area() > 0); + CV_Assert(_src.type() == _dst.type()); + + Mat tM; + M.convertTo(tM, CV_64F); + + int inter = interpolation & INTER_MAX; + if (inter == INTER_AREA) + inter = INTER_LINEAR; + + mapx.create(dsize, CV_16SC2); + if (inter != INTER_NEAREST) + mapy.create(dsize, CV_16SC1); + + if (!(interpolation & CV_WARP_INVERSE_MAP)) + invertAffineTransform(tM.clone(), tM); + + const int AB_BITS = MAX(10, (int)INTER_BITS); + const int AB_SCALE = 1 << AB_BITS; + int round_delta = (inter == INTER_NEAREST) ? AB_SCALE / 2 : (AB_SCALE / INTER_TAB_SIZE / 2); + + const double* data_tM = tM.ptr(0); + for (int dy = 0; dy < dsize.height; ++dy) + { + short* yM = mapx.ptr(dy); + for (int dx = 0; dx < dsize.width; ++dx, yM += 2) + { + int v1 = saturate_cast(saturate_cast(data_tM[0] * dx * AB_SCALE) + + saturate_cast((data_tM[1] * dy + data_tM[2]) * AB_SCALE) + round_delta), + v2 = saturate_cast(saturate_cast(data_tM[3] * dx * AB_SCALE) + + saturate_cast((data_tM[4] * dy + data_tM[5]) * AB_SCALE) + round_delta); + v1 >>= AB_BITS - INTER_BITS; + v2 >>= AB_BITS - INTER_BITS; + + yM[0] = saturate_cast(v1 >> INTER_BITS); + yM[1] = saturate_cast(v2 >> INTER_BITS); + + if (inter != INTER_NEAREST) + mapy.ptr(dy)[dx] = ((v2 & (INTER_TAB_SIZE - 1)) * INTER_TAB_SIZE + (v1 & (INTER_TAB_SIZE - 1))); + } + } + + cv::remap(_src, _dst, mapx, mapy, inter, borderType, borderValue); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// warpPerspective +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +class CV_WarpPerspective_Test : + public CV_WarpAffine_Test +{ +public: + CV_WarpPerspective_Test(); + + virtual ~CV_WarpPerspective_Test(); + +protected: + virtual void generate_test_data(); + + virtual void run_func(); + virtual void run_reference_func(); + +private: + void warpPerspective(const Mat&, Mat&); +}; + +CV_WarpPerspective_Test::CV_WarpPerspective_Test() : + CV_WarpAffine_Test() +{ +} + +CV_WarpPerspective_Test::~CV_WarpPerspective_Test() +{ +} + +void CV_WarpPerspective_Test::generate_test_data() +{ + CV_Remap_Test::generate_test_data(); + + // generating the M 3x3 matrix + RNG& rng = ts->get_rng(); + + Point2f sp[] = { Point2f(0, 0), Point2f(src.cols, 0), Point2f(0, src.rows), Point2f(src.cols, src.rows) }; + Point2f dp[] = { Point2f(rng.uniform(0, src.cols), rng.uniform(0, src.rows)), + Point2f(rng.uniform(0, src.cols), rng.uniform(0, src.rows)), + Point2f(rng.uniform(0, src.cols), rng.uniform(0, src.rows)), + Point2f(rng.uniform(0, src.cols), rng.uniform(0, src.rows)) }; + M = getPerspectiveTransform(sp, dp); + + static const int depths[] = { CV_32F, CV_64F }; + int depth = depths[rng.uniform(0, 2)]; + M.clone().convertTo(M, depth); +} + +void CV_WarpPerspective_Test::run_func() +{ + cv::warpPerspective(src, dst, M, dst.size(), interpolation, borderType, borderValue); +} + +void CV_WarpPerspective_Test::run_reference_func() +{ + CV_Remap_Test::prepare_test_data_for_reference_func(); + + warpPerspective(erode_src, erode_dst); + warpPerspective(dilate_src, dilate_dst); +} + +void CV_WarpPerspective_Test::warpPerspective(const Mat& _src, Mat& _dst) +{ + Size ssize = _src.size(), dsize = _dst.size(); + + CV_Assert(ssize.area() > 0 && dsize.area() > 0); + CV_Assert(_src.type() == _dst.type()); + + if (M.depth() != CV_64F) + { + Mat tmp; + M.convertTo(tmp, CV_64F); + M = tmp; + } + + if (!(interpolation & CV_WARP_INVERSE_MAP)) + { + Mat tmp; + invert(M, tmp); + M = tmp; + } + + int inter = interpolation & INTER_MAX; + if (inter == INTER_AREA) + inter = INTER_LINEAR; + + mapx.create(dsize, CV_16SC2); + if (inter != INTER_NEAREST) + mapy.create(dsize, CV_16SC1); + + double* tM = M.ptr(0); + for (int dy = 0; dy < dsize.height; ++dy) + { + short* yMx = mapx.ptr(dy); + + for (int dx = 0; dx < dsize.width; ++dx, yMx += 2) + { + double den = tM[6] * dx + tM[7] * dy + tM[8]; + den = den ? 1.0 / den : 0.0; + + if (inter == INTER_NEAREST) + { + yMx[0] = saturate_cast((tM[0] * dx + tM[1] * dy + tM[2]) * den); + yMx[1] = saturate_cast((tM[3] * dx + tM[4] * dy + tM[5]) * den); + continue; + } + + den *= INTER_TAB_SIZE; + int v0 = saturate_cast((tM[0] * dx + tM[1] * dy + tM[2]) * den); + int v1 = saturate_cast((tM[3] * dx + tM[4] * dy + tM[5]) * den); + + yMx[0] = saturate_cast(v0 >> INTER_BITS); + yMx[1] = saturate_cast(v1 >> INTER_BITS); + mapy.ptr(dy)[dx] = saturate_cast((v1 & (INTER_TAB_SIZE - 1)) * + INTER_TAB_SIZE + (v0 & (INTER_TAB_SIZE - 1))); + } + } + + cv::remap(_src, _dst, mapx, mapy, inter, borderType, borderValue); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////// +// Tests +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +TEST(Imgproc_Resize_Test, accuracy) { CV_Resize_Test test; test.safe_run(); } +// TEST(Imgproc_Remap_Test, accuracy) { CV_Remap_Test test; test.safe_run(); } +TEST(Imgproc_WarpAffine_Test, accuracy) { CV_WarpAffine_Test test; test.safe_run(); } +TEST(Imgproc_WarpPerspective_Test, accuracy) { CV_WarpPerspective_Test test; test.safe_run(); } From 5eac0419b2b6e34b1606c1a601074aeaa87f6f4f Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Tue, 4 Sep 2012 22:22:07 +0400 Subject: [PATCH 103/103] changed eps in validate_result function --- modules/imgproc/test/test_imgwarp_strict.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/imgproc/test/test_imgwarp_strict.cpp b/modules/imgproc/test/test_imgwarp_strict.cpp index 535f0c459..22c1eff61 100644 --- a/modules/imgproc/test/test_imgwarp_strict.cpp +++ b/modules/imgproc/test/test_imgwarp_strict.cpp @@ -540,7 +540,7 @@ void CV_Resize_Test::validate_results() const const float* D = _dst.ptr(dy); for (int dx = 0; dx < dsize.width; ++dx) - if (fabs(rD[dx] - D[dx]) > t /* && D[dx] <= 255.0f && rD[dx] <= 255.f */) + if (fabs(rD[dx] - D[dx]) > t) { PRINT_TO_LOG("\nNorm of the difference: %lf\n", norm(reference_dst, _dst, NORM_INF)); PRINT_TO_LOG("Error in (dx, dy): (%d, %d)\n", dx / cn + 1, dy + 1); @@ -1020,9 +1020,9 @@ void CV_Remap_Test::validate_results() const const float* eD = erode_dst.ptr(y); dD = eD; - float t = 6.2f; + float t = 1.0f; for (int x = 0; x < dsize.width; ++x) - if ( !((eD[x] - t <= D[x] || (eD[x] >= 255.0f && D[x] >= 255.0f)) && (D[x] <= dD[x] + t || (eD[x] >= 255.0f && D[x] >= 255.0f))) ) + if ( !(eD[x] - t <= D[x] && D[x] <= dD[x] + t) ) { PRINT_TO_LOG("\nnorm(erode_dst, dst): %lf\n", norm(erode_dst, _dst, NORM_INF)); PRINT_TO_LOG("norm(dst, dilate_dst): %lf\n", norm(_dst, dilate_dst, NORM_INF));